[摳頂] 拔河報名及參賽系統

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間13年前 (2013/02/26 10:50), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串1/1
我以前寫過 kof 的報名系統,不過不好寫,這個簡單多了。 寫這個系統就是我今天的主要 coding 項目,今天的配菜音樂 The mass http://www.youtube.com/watch/?v=V96rMwfp5w4 // tugwar.c // 拔河比賽報名及比賽系統 // LAechan@Sanc add in 2013/02/26 #define MAX_MEMBERS 3 inherit ROOM; mapping tug_data=([]); mixed tug_members=({}); void create() { ::create(); seteuid(getuid(this_object())); if(file_exists(__DIR__+"tugwar.o")) restore_object(__DIR__+"tugwar"); else { set("short","= 拔河大賽報名處 ="); set("long","@@query_long"); set("light",1); set("item_desc/note",@LONG 指令說明: form 成立隊伍 disband 解散隊伍 invite 邀請加入隊伍 join 同意加入隊伍(需先受邀請) leave 離開隊伍 expel 驅逐隊員 LONG ); } } string query_long() { return @LONG 聖殿第一屆拔河大賽,即日起開始報名,欲參賽的隊伍,請 推派一人當隊長組成隊伍(form),隊員再加入(join)此隊伍   即可。其它指令可參看 look note。   預賽舉辦日期:2013/04/02~2013/04/04   決賽舉辦日期:2013/04/05 LONG ); } int save_room() { save_object(__DIR__+"tugwar"); return 1; } string find_leader(string names) { string tmp; mixed tmps; tmps=keys(tug_data); foreach(tmp in tmps) if(member_array(names,tug_data[tmp]["members"])!=-1) return tmp; return ""; } void init() { add_action("form_xxx","form"); add_action("disband_xxx","disband"); add_action("invite_xxx","invite"); add_action("join_xxx","join"); add_actiom("leave_xxx","leave"); add_action("expel_xxx","expel"); add_action("list_xxx","list"); } int form_xxx(string str) { object ppl=this_player(); string names=ppl->query("name"); if(!str || str=="") return notify_fail("語法: form 隊伍名稱.\n"); if(tug_data[names]) return notify_fail("form: 你已經有成立了一個隊伍了喔.\n"+ " 隊伍名稱:"+tug_data[names]["name"]+"。\n"); if(strlen(str)>20) return notify_fail("form: 你的隊伍名稱太長了喔.\n"); str=replace(str,ESC,""); str="/adm/daemons/color_d"->get_ansi_color(str); tug_data[names]=([]); tug_data[names]["name"]=str; tug_data[names]["time"]=time(); tug_data[names]["members"]=({}); tug_members+=({names}); save_room(); shout(HIG"【拔河大賽】"+names+" 的隊伍「"+str+"」參賽了!"NOR"\n"); return notify_fail("form: 你成立了一個叫做["+str+"]的隊伍。\n"); } int disband_xxx(string str) { object ppl=this_player(); string tmp,names=ppl->query("name"); mixed tmps=({}); int t=time(); if(!tug_data[names]) return notify_fail("disband: 你還沒有成立隊伍喔.\n"); if(tug_data[names]["time"]>t-180) return notify_fail("disband: 成立未滿三分鐘的隊伍不能解散喔.\n"); if(ppl->query_temp("time_record/tug_disband_times")<t) { ppl->set_temp("time_record/tug_disband_times",10+t); return notify_fail("隊伍名稱: "+tug_data[names]["name"]+"\n"+ "隊伍成員: "+implode(tug_data[names]["members"],",")+"\n"+ "disband: 確定要解散該隊伍的話請 10 秒內再下一次指令.\n"); } tmps=tug_data[names]["members"]; foreach(tmp in tmps) tug_members-=({tmp}); tug_members-=({names}); map_delete(tug_data,names); save_room(); shout(HIG"【拔河大賽】"+names+" 的隊伍解散了!"NOR"\n"); return notify_fail("disband: 你的隊伍解散了.\n"); } int invite_xxx(string str) { object ppl=this_player(); string tmp,names=ppl->query("name"); if(!str || str=="") return notify_fail("語法: invite 對象.\n"+ " invite -cancel 為取消你正進行的邀請.\n"); if(str=="-cancel") { ppl->delete_temp("time_record/tug_inviting"); return notify_fail("invite: 你取消了正在進行的邀請.\n"); } if(!tug_data[names]) return notify_fail("invite: 你要先成立隊伍才能邀請人加入喔.\n"); if(member_array(str,tug_data[names]["members"])!=-1) return notify_fail("invite: "+str+" 已經在你的隊伍裡了喔.\n"); if(member_array(str,tug_members)!=-1) return notify_fail("invite: "+str+" 已經在某一個隊伍裡了喔.\n"); if(tmp=ppl->query_temp("time_record/tug_inviting")) return notify_fail("invite: 你正在邀請 "+tmp+" 入隊喔.\n"+ " 如果要取消這項邀請,請下 invite -cancel.\n"); ppl->set_temp("time_record/tug_inviting",str); return notify_fail("invite: 你決定邀請 "+str+" 加入你的隊伍.\n"+ " 請告訴他這項訊息,並請他來 join "+names+".\n"); } int join_xxx(string str) { object ppl=this_player(),tar; string tmp,names=ppl->query("name"); if(!str || str=="") return notify_fail("語法: join 對象.\n"+ " 要 join 一支隊伍前需先獲得其隊長的邀請喔.\n"); if(member_array(names,tug_members)!=-1) return notify_fail("join: 你已經在某一支隊伍裡了喔.\n"); if(!tug_data[str]) return notify_fail("join: "+str+" 沒有成立隊伍喔.\n"); if(member_array(names,tug_data[str]["members"])!=-1) return notify_fail("join: 你已經在 "+str+" 的隊伍裡了喔.\n"); if(sizeof(tug_data[str]["members"])>=MAX_MEMBERS-1) return notify_fail("join: "+str+" 的隊伍已經滿 "+MAX_MEMBERS+" 人了喔.\n"); if(!tar=find_player(str)) return notify_fail("join: "+str+" 要在線上你才能 join 他喔.\n"); if(wizardp(tar) && !wizardp(ppl)) return notify_fail("join: "+str+" 要在線上你才能 join 他喔.\n"); if((string)tar->query_temp("time_record/tug_inviting")!=names) return notify_fail("join: "+str+" 必須先邀請你,你才可以 join 喔.\n"); tar->delete_temp("time_record/tug_inviting"); tug_members+=({names}); tug_data[str]["members"]+=({names}); save_room(); tell_object(tar,HIG"* "+names+" 加入了你的拔河隊伍."NOR"\n"); return notify_fail("join: 你加入了 "+names+" 的拔河隊伍.\n"); } int leave_xxx(string str) { object ppl=this_player(); string tmp,names=ppl->query("name"); int t=time(); mixed tmps=({}); if(member_array(names,tug_members)==-1) return notify_fail("leave: 你沒有成立或加入任何隊伍喔.\n"); if(tug_data[names]) return notify_fail("leave: 你是隊長,不能離隊喔.\n"); tmp=find_leader(names); if(ppl->query_temp("time_record/tug_leave_times")<t) { ppl->set_temp("time_record/tug_leave_times",10+t); return notify_fail("隊伍名稱: "+tug_data[tmp]["name"]+"\n"+ "隊長名字: "+tmp+"\n"+ "隊伍成員: "+implode(tug_data[tmp]["members"],",")+"\n"+ "leave: 確定要離開該隊伍的話請 10 秒內再下一次指令.\n"); } tug_data[tmp]["members"]-=({names}); tug_members-=({names}); save_room(); return notify_fail("disband: 你離開了 "+tmp+" 的隊伍.\n"); } int expel_xxx(string str) { object ppl=this_player(); string tmp,names=ppl->query("name"); if(!str || str=="") return notify_fail("語法: expel 對象.\n"); if(!tug_data[names]) return notify_fail("expel: 你沒有成立任何隊伍喔.\n"); if(member_array(str,tug_data[names]["members"])==-1) return notify_fail("expel: "+str+" 不在你的隊伍裡喔.\n"); tug_members-=({str}); member_array(str,tug_data[names]["members"])-=({str}); save_room(); return notify_fail("expel: 你將 "+str+" 自你的隊伍中移出.\n"); } int list_xxx(string str) { string tmp; mixed tmps; if(!str || str=="") return nofify_fail("語法: list 對象.\n"+ " list -all.\n"); if(str=="-all") { str="第一屆聖殿盃拔河比賽參賽隊伍:\n"+ "===================================\n"; tmps=keys(tug_data); foreach(tmp in tmps) str+=sprintf("%-11s %d %-s\n",tmp,sizeof(tug_data[tmp]["members"]), tug_data[tmp]["name"]); str+="===================================\n"; this_player()->more(explode(str,"\n"),1,1); return notify_fail(""); } if(member_array(str,tug_members)==-1) return notify_fail("list: "+str+" 不在任何一個隊伍裡.\n"); tmp=find_leader(str); return notify_fail("隊伍名稱: "+tug_data[tmp]["name"]+"\n"+ "隊伍隊長: "+tmp+"\n"+ "成立時間: "+tug_data[tmp]["time"]+"\n"+ "隊伍成員: "+implode(tug_data[tmp]["members"],", ")+"\n"); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.61.157.53 ※ 編輯: laechan 來自: 210.61.157.53 (02/26 11:48) ※ 編輯: laechan 來自: 210.61.157.53 (02/26 15:51)

02/26 16:00, , 1F
系統雛形已撰寫完畢.基本上跟寫家族差不多,就是很煩
02/26 16:00, 1F

02/26 16:01, , 2F
的一些指令(form,leave,...)必須要寫
02/26 16:01, 2F

02/26 16:04, , 3F
挺有趣的哦 幾個人參加啊
02/26 16:04, 3F

02/26 16:29, , 4F
3人成隊
02/26 16:29, 4F

02/26 16:37, , 5F
那請問是藝人多支可報名,還是一個ip一支才能攙家呢
02/26 16:37, 5F

02/26 16:38, , 6F
如果是藝人多汁的話,現在組隊會盪欸
02/26 16:38, 6F

02/26 16:45, , 7F
不會當啊, 不是 party 式的那種組隊
02/26 16:45, 7F

02/26 17:44, , 8F
02/26 17:44, 8F

02/28 01:10, , 9F
MUD拔河 真難想像
02/28 01:10, 9F
文章代碼(AID): #1HB2B_Fx (mud_sanc)
文章代碼(AID): #1HB2B_Fx (mud_sanc)