[摳頂] /cmds/std/_party.c

作者: laechan (揮淚斬馬雲)   2014-08-14 10:40:00
[編輯中......]
編輯歷程(對 coding 有興趣的人可參考)
01._party.c 的大致框架
02.party form 與 party_members 函數
03.party disband
04.把 party_members 從 mixed 改為 mapping
05.party invite
06.
// _party.c
// laechan@sanc add in 2014/08/14 for tmi2_v3_改
// 1.組隊系統不採系統式寫法
// 2.組隊系統由 times_check.c 負責資料的定時儲存
// 3.組隊相關的全域函數直接讀 _party.c 的資料
#define PARTY_MAX_FORM_NAME 24 // 色碼長度也納入
#define PARTY_MSG_TITLE HIY+"[組隊] "+NOR
#include <daemons.h>
inherit DAEMON;
mapping party_data;
// 暫存資料
static mapping party_ob;
static mapping party_members;
void create()
{
mixed tmps=({});
string tmp,tmp2;
object ob;
::create();
seteuid(getuid(this_object()));
if(file_exists("/data/party"))
restore_object("/data/party");
if(!party_data) party_data=([]);
if(!party_members) party_members=([]);
// 登錄 party_members 及 party_obs
tmps=keys(party_data);
foreach(tmp in tmps)
{
if(!tmps2=party_data["members"]) continue;
foreach(tmp2 in tmps2)
{
if(!party_members[tmp2])
party_members[tmp2]=tmp;
if(ob=find_player(tmp2))
party_obs[tmp2]=ob;
}
}
}
int save_room()
{
save_object("/data/party");
return 1;
}
varargs mixed party_members(string term,string ob_names,string leader_names,
object ob)
{
switch(term)
{
case "add":
party_members[ob_names]=leader_names;
if(!ob)
if(!ob=find_player(ob_names))
return 1;
party_obs[ob_names]=ob;
break;
case "del":
map_delete(party_members,ob_names);
map_delete(party_obs,ob_names);
break;
}
}
int cmd_party(string str)
{
string names,msg;
object me,tar;
if(!str || str=="")
return notify_fail(@LONG
語法
party form [隊伍名稱] 組成一個隊伍
party disband 解散隊伍
LONG
);
me=this_player();
names=me->query("name");
// 需要 sscanf 區
if(sscanf(str,"form %s",str)==1)
{
if(!undefinedp(party_members[names]))
return notify_fail("party: 你已經是某一組隊的隊長或隊員了喔.\n");
// 明明不是隊員卻有殘餘資料, 就消掉
if(party_data[names]) map_delete(party_data,names);
if(party_obs[names]) map_delete(party_obs,names);
// 這裡可放一些限制, 比方玩家等級要多少啦這類的
if(strlen(str)>PARTY_MAX_FORM_NAME)
return notify_fail("party: 你要建立的隊伍名稱太長了喔.\n");
if(strsrch(str,ESC)!=-1)
return notify_fail("party: 隊伍的名稱不能有控制碼喔.\n");
str=COLOR_D->get_ansi_color(str)+NOR;
// 通過這裡代表玩家可 form
party_data[names]=([]);
party_data[names]["name"]=str;
party_data[names]["members"]=({names});
party_members("add",names,names,me);
// save_room();
return notify_fail("party: 你組成了一支叫做["+str+"]的隊伍了.\n");
}
else if(sscanf(str,"invite %s",str)==1)
{
if(!party_data[names])
return notify_fail("party: 你沒有成立隊伍喔.\n");
// 明明是隊長或隊員卻無相關資料, 就補上
if(!party_obs[names]) party_obs[names]=me;
// 其它限制放在這, 例如隊員的等級, 目前隊伍是否已滿
// 通過這裡代表可 invite 對方
// wiz 不可被 invite 而且一定可 join
if(!wizardp(me) && wiz_lv(str)>0)
return notify_fail("party: "+str+" 是 wiz 你不能 invite 喔.\n");
if(!tar=find_player(str))
return notify_fail("party: "+str+" 必須在線上你才能 invite 他喔.\n");
// 這裡可再加上例如 tar 必須與 leader 同一房間才能 invite
if(!undefinedp(party_members[str]))
return notify_fail("party: "+str+" 已經是某一支隊伍的成員了喔.\n");
// 明明 str 不是隊長或隊員卻有相關資料, 就刪除
if(party_data[str]) map_delete(party_data,str);
if(party_obs[str]) map_delete(party_obs,str);
// 通過這裡代表對方可 join
// 對方已下 join, 則己方 invite 就等於入隊
if(tar->query_temp("records/party_join_"+names))
{
tar->delete_temp("records/party_join_"+names);
me->delete_temp("records/party_invite_"+str);
party_data[names]["members"]+=({str});
party_members("add",str,names,tar);
// save_room();
tell_object(tar,PARTY_MSG_TITLE+"你加入了 "+names+" 的隊伍。\n");
return notify_fail(PARTY_MSG_TITLE+str+" 加入了你的隊伍。\n");
}
// 對方未下 join, 等待對方下並只傳一訊息
if(!me->query_temp("records/party_invite_"+str))
{
me->set_temp("records/party_invite_"+str,1);
tell_object(tar,PARTY_TITLE_MSG+names+" 邀請你加入他的隊伍。\n"+
如果你要加入的話請下 party join "+names+"。\n");
}
return notify_fail("party: 你邀請 "+str+" 加入你的隊伍。\n");
}
else if(sscanf(str,"join %s",str)==1)
{
if(!undefinedp(party_members[names]))
return notify_fail("party: 你已經有成立或是加入一支隊伍了喔。\n");
// 其它限制放在這, 例如隊員的等級, 目前隊伍是否已滿
if(undefinedp(party_data[str]))
return notify_fail("party: "+str+" 不是隊長,你不能 join 他喔。\n");
if(!tar=find_player(str))
return notify_fail("party: "+str+" 必須在線上你才能 join 他喔.\n");
if(undefinedp(party_data[str]))
return notify_fail("party: "+str+" 不是隊長,你不能 join 他喔。\n");
// 這裡可再加上例如 tar 必須與 leader 同一房間才能 invite
// 通過這裡代表可 join 對方
}
// 不需 sscanf 區
else if(str=="disband")
{
if(!party_data[names])
return notify_fail("party: 你沒有成立隊伍喔.\n");
// 明明是隊長或隊員卻無相關資料, 就補上
if(!party_obs[names]) party_obs[names]=me;
// 通過上述就代表可以 disband
msg=PARTY_MSG_TITLE+"你的隊長將你所屬的隊伍解散了。\n";
foreach(str in party_data["members"])
{
if(tar=find_player(str))
tell_object(tar,msg);
party_members("del",str);
}
msg=party_data[names]["name"];
map_delete(party_data,names);
// save_room();
return notify_fail("party: 你的隊伍["+msg+"]解散了。\n");
}
// 語法msg區
else
{
if(str=="form")
return notify_fail("語法: party form [隊伍名稱].\n"+
" 隊伍名稱支援 $XXX$ 的顏色碼使用.\n");
else
return notify_fail("party: 沒有這樣的語法喔.\n");
}
}

Links booklink

Contact Us: admin [ a t ] ucptt.com