[摳頂] 拔河報名及參賽系統
我以前寫過 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
02/26 16:01, 2F
推
02/26 16:04, , 3F
02/26 16:04, 3F
→
02/26 16:29, , 4F
02/26 16:29, 4F
推
02/26 16:37, , 5F
02/26 16:37, 5F
→
02/26 16:38, , 6F
02/26 16:38, 6F
→
02/26 16:45, , 7F
02/26 16:45, 7F
推
02/26 17:44, , 8F
02/26 17:44, 8F
→
02/28 01:10, , 9F
02/28 01:10, 9F
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
13
30