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

看板mud (網路地下城/文字遊戲)作者 (小太保)時間10年前 (2014/08/14 10:40), 10年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
[編輯中......] 編輯歷程(對 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"); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53 ※ 文章網址: http://www.ptt.cc/bbs/mud/M.1407984004.A.E3F.html ※ 編輯: laechan (210.61.157.53), 08/15/2014 11:33:04 ※ 編輯: laechan (210.61.157.53), 08/15/2014 11:40:58 ※ 編輯: laechan (210.61.157.53), 08/18/2014 13:33:27
文章代碼(AID): #1Jx264u_ (mud)
文章代碼(AID): #1Jx264u_ (mud)