[编辑中......]
编辑历程(对 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");
}
}