// File: /adm/daemons/party_d.c // written by Descartes of Borg 921110 // ported to TMI-2 by Zeus, about 932204 // It should be used with /cmds/std/_party.c #define NAME(x) (string)x->query("name") #define LEADER(x) (string)x->query("leader") #define CAPNAME(x) (string)x->query("cap_name") #define POSS(x) possessive((string)x->query("gender")) #define TIMEOUT 60 #define MAX 4 private mapping members, invited; void create() { members = ([]); invited = ([]); } void form_party(object le) { if(pointerp(members[NAME(le)])) return; members += ([ NAME(le) : ({}) ]); invited += ([ NAME(le) : ({}) ]); le->set("leader", NAME(le)); write("You form a new party.\n"); say(CAPNAME(le)+" forms a new party.\n"); } void invite_member(object le, object me) { if(!pointerp(invited[NAME(le)])) return; if(sizeof(members[NAME(le)]) == MAX) { write("You can't add anymore members.\n"); return; } if(member_array(me, members[NAME(le)]) != -1) { write("You have already invited "+CAPNAME(me)+".\n"); return; } invited[NAME(le)] += ({ me }); write("You invited "+CAPNAME(me)+" to join your party.\n"); tell_object(me, CAPNAME(le)+" invited you to join "+ POSS(le)+" party.\n"); say(CAPNAME(le)+" invited "+CAPNAME(me)+" to join "+ POSS(le)+" party.\n", ({ me }) ); call_out("remove_invitation", TIMEOUT, ({ le, me, 1 }) ); } void remove_invitation(mixed arg) { if(!pointerp(invited[NAME(arg[0])]) || member_array(arg[1], invited[NAME(arg[0])]) == -1) return; if(arg[2]) { tell_object(arg[1], "Your invitation to join "+ CAPNAME(arg[0])+"'s party has expired.\n"); tell_object(arg[0], CAPNAME(arg[1])+ "'s invitation to join your party has expired.\n"); } invited[NAME(arg[0])] -= ({ arg[1] }); } void add_member(object le, object me) { if(!pointerp(members[NAME(le)])) return; if(sizeof(members[NAME(le)]) == MAX) { write(CAPNAME(le)+" can't add you to "+POSS(le)+" party.\n"); return; } if(member_array(me, members[NAME(le)]) != -1) { write("You are already a member of "+CAPNAME(le)+"'s party.\n"); return; } if(member_array(me, invited[NAME(le)]) == -1) { write("You have not been invited by "+CAPNAME(le)+".\n"); return; } remove_invitation( ({ le, me, 0 }) ); members[NAME(le)] += ({ me }); me->set("leader", NAME(le)); write("You join "+CAPNAME(le)+"'s party.\n"); tell_object(le, CAPNAME(me)+" joins your party.\n"); say(CAPNAME(me)+" joins "+CAPNAME(le)+"'s party.\n", ({ le }) ); } void disband_party(object le) { int i, sz; if(!pointerp(members[NAME(le)])) return; sz = sizeof(members[NAME(le)]); for(i = 0; i < sz; i++) { if(!members[NAME(le)][i]) continue; members[NAME(le)][i]->set("leader", 0); tell_object(members[NAME(le)][i], "Your party has been disbanded.\n"); } members[NAME(le)] = 0; invited[NAME(le)] = 0; map_delete(members, NAME(le)); map_delete(invited, NAME(le)); le->set("leader", 0); tell_object(le, "Your party has been disbanded.\n"); } void disband_member(object le, object me, int flag) { if(!pointerp(members[NAME(le)]) || member_array(me, members[NAME(le)]) == -1) return; members[NAME(le)] -= ({ me }); me->set("leader", 0); if(flag) { tell_object(me, CAPNAME(le)+" removed you from "+POSS(le)+" party.\n"); tell_object(le, "You removed "+CAPNAME(me)+" from your party.\n"); } else { tell_object(me, "You leave "+CAPNAME(le)+"'s party.\n"); tell_object(le, CAPNAME(me)+" left your party.\n"); } } void check_party(object le) { object ob; if(!(LEADER(le))) return; if((LEADER(le)) == (NAME(le))) { disband_party(le); return; } ob = find_living(LEADER(le)); if(!ob) return; disband_member(ob, le, 0); } object *query_members(object le) { return members[NAME(le)]; } void change_leader(object le, object me) { int i, sz; if(!pointerp(members[NAME(le)]) || member_array(me, members[NAME(le)]) == -1) return; members[NAME(le)] -= ({ me }); members[NAME(le)] += ({ le }); sz = sizeof(members[NAME(le)]); for(i = 0; i < sz; i++) { if(!members[NAME(le)][i]) continue; members[NAME(le)][i]->set("leader", NAME(me)); tell_object(members[NAME(le)][i], CAPNAME(me)+ " becomes the new leader of your party.\n"); } members += ([ NAME(me) : members[NAME(le)] ]); invited += ([ NAME(me) : invited[NAME(le)] ]); members[NAME(le)] = 0; invited[NAME(le)] = 0; map_delete(members, NAME(le)); map_delete(invited, NAME(le)); me->set("leader", NAME(me)); tell_object(me, "You become the new leader of your party.\n"); } void party_list(object le) { int i, sz; if(!pointerp(members[NAME(le)])) return; sz = sizeof(members[NAME(le)]); write("Your party has "+(sz+1)+" "+((sz+1) > 1 ? "members" : "member")+ ".\n"); write(" "+CAPNAME(le)+" [Party Leader]\n"); for(i = 0; i < sz; i++) { if(!members[NAME(le)][i]) continue; write(" "+CAPNAME(members[NAME(le)][i])+"\n"); } }