[wizs] 船隻的新寫法

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間12年前 (2013/08/21 15:14), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
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
文章代碼(AID): #1I56ZRH3 (mud_sanc)
文章代碼(AID): #1I56ZRH3 (mud_sanc)