[wizs] 船隻的新寫法
inherit ROOM;
static object times_check;
void create()
{
::create();
seteuid(getuid(this_object()));
set("short","== 星艦企業號 ==");
set("boat_name","_starcraft_boat");
// 航行計劃
set("plan",({ ({30,"/x/x/xxx1"}),
({330,"/x/x/xxx2"}),
({630,"/x/x/xxx3"}), }));
set("plan_time",900);
call_out("cancel_effect",2,this_object(),"start_plan");
}
int cancel_effect(object boat,string med_names)
{
string names,files;
mixed tmps;
int i,j,t,s1,s2;
object room;
if(!times_check)
if(catch(times_check=find_object_or_load("/open/cmds/times_check")))
return 1;
names=query("boat_name");
files=base_name(boat);
tmps=query("plan");
j=sizeof(tmps);
if(med_names=="start_plan")
{
// 將 times_check 裡與 boat_name 有關的航行計劃都移除
// 重新設定一個新的航行計劃
times_check->remove_names(names);
// 先讀取總航行時間
t=(int)query("plan_time");
// 設定該航行時間後重新執行
// 當 update 船隻時, 船隻會先清掉 times_check 的資料
// 當 update times_check 但是沒有 update 船隻時,起碼
// times_check 知道時間到了時要重啟該船的航行計劃
times_check->set_times_check(names,files,"start_plan",t);
// 然後開始設定航行計劃
for(i=0;i<j;i++)
{
times_check->set_times_no_save(names,files,"plan_"+i+"_1",tmps[i][0]);
times_check->set_times_no_save(names,files,"plan_"+i+"_2",30+tmps[i][0]);
times_check->set_times_no_save(names,files,"plan_"+i+"_3",60+tmps[i][0]);
}
return 1;
}
// 接下來就是針對各航行計劃做處理
sscanf(med_names,"plan_%d_%d",s1,s2);
// 停靠, 打開出口
if(s2==1)
{
room=find_object_or_load(tmps[s1][1];
set("exits/out",tmps[s1][1]);
tell_room(boat,"廣播: 已經抵達"+room->query("short")+"。\n");
room->set("exits/enter",files));
tell_room(room,"廣播: "+query("short")+"已經抵達這裡了。\n");
}
// 即將開走的廣播
if(s2==2)
{
room=find_object_or_load(tmps[s1][1];
// 已經開到最後一個港口
if(s1==j-1)
tell_room(boat,"廣播: 即將駛離"+room->query("short")+",開往"+
find_object_or_load(tmps[0][1])->query("short")+"。\n");
else
tell_room(boat,"廣播: 即將駛離"+room->query("short")+",開往"+
find_object_or_load(tmps[s1+1][1])->query("short")+"。\n");
tell_room(room,"廣播: "+query("short")+"即將駛離這裡。\n");
}
// 準備開走, 關閉出口
if(s2==3)
{
room=find_object_or_load(tmps[s1][1];
delete("exits/out",tmps[s1][1]);
// 已經開到最後一個港口
if(s1==j-1)
tell_room(boat,"廣播: 已經駛離"+room->query("short")+",開往"+
find_object_or_load(tmps[0][1])->query("short")+"。\n");
else
tell_room(boat,"廣播: 已經駛離"+room->query("short")+",開往"+
find_object_or_load(tmps[s1+1][1])->query("short")+"。\n");
room->delete("exits/enter",files));
tell_room(room,"廣播: "+query("short")+"已經駛離這裡了。\n");
}
return 1;
}
從上面可發現一些缺點,最明顯的缺點就是 times_check 被頻繁呼叫,
所以雖然船隻可以用 times_check 跑,但或許不用 times_check 比較
好,sanc 有 BOAT 樣本,應該已足夠支援,可參考菲里德軍艦寫法。
/d/tatak/room/boat.c
==菲里德軍艦==
一艘來自菲里德王國的軍艦. 菲里德王國位於亞雷克萊斯特大陸
的東側海灣國家, 是世界軍事強國之一, 擁有的砲艦數目也是數
一數二的. 如果你搭上軍艦, 可以跳下甲板(jumpdown).
明顯出口有: 無
> 老船長:西斯迪克港到了。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.157.53
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章