// /std/party.c // party daemon for the Nightmare mudlib // created by Descartes of Borg 10 Nov 1992 #include <party.h> mapping party; mapping invited; string party_member(object ob); void manage_party(string group); void remove_party(string group); void remove_invitation(mixed *bing); int invited_now(object ob, string str); void create() { party = ([]); invited = ([]); call_out("manage_all_parties", 300); } int add_member(object ob, string group) { if(!party) party = ([]); if(party_member(ob)) return ALREADY_MEMBER; if(!party[group]) { tell_object(ob, "You are the leader of party "+group+".\n"); party[group] = ({}); } party[group] += ({ ob }); if(invited) if(invited[group]) if(member_array(ob, invited[group]) != -1) { remove_invitation( ({ ob, group, 1 }) ); } ob->set_party(group); manage_party(group); return OK; } int remove_member(object ob) { string group; if(!party) return NOT_MEMBER; group = party_member(ob); if(!group) return NOT_MEMBER; party[group] -= ({ ob }); tell_object(ob, "You are no longer in the party "+group+".\n"); ob->set_party(0); manage_party(group); return OK; } string party_member(object ob) { string *groups; int i; if(!party) return 0; groups = keys(party); for(i=0; i<sizeof(groups); i++) { if(member_array(ob, party[groups[i]]) != -1) return groups[i]; } return 0; } int change_leader(object ob) { string group; object *this_party; int x; if(!party) return NOT_MEMBER; group = party_member(ob); if(!group) return NOT_MEMBER; manage_party(group); this_party = party[group]; x = member_array(ob, this_party); if(!x) return ALREADY_LEADER; this_party[x] = this_party[0]; this_party[0] = ob; tell_object(ob, "You are now the leader of party "+group+".\n"); party[group] = this_party; manage_party(group); return OK; } void manage_party(string group) { object *tmp; object *who; object ob; int i, j; tmp = ({}); if(!party) return; if(!party[group]) return; if(!sizeof(party[group])) { remove_party(group); return; } ob = party[group][0]; who = party[group]; for(i=0; i<sizeof(who); i++) { if(!who[i]) continue; if(!living(who[i]) || !interactive(who[i])) { who[i]->set_party(0); continue; } tmp += ({ who[i] }); } if(!sizeof(tmp)) { remove_party(group); return; } if(tmp[0] != ob) tell_object(tmp[0], "You are now the leader of the party "+group+".\n"); party[group] = tmp; return; tmp = ({}); for(i=0; i<sizeof(party[group]); i++) { if((who = party[group][i]->query_attackers())) { for(j=0; j<sizeof(who); j++) { if(member_array(who[j], tmp) == -1) tmp += ({ who[j] }); } } } for(i=0; i < sizeof(party[group]); i++) party[group][i]->set_attackers(tmp); } void remove_party(string group) { if(!party) return; if(undefinedp(party[group])) return; map_delete(party, group); } void calculate_exp(string group, int exp, object tmp) { int tot, x, i; if(!party) { previous_object()->fix_exp(exp, tmp); return; } if(!party[group]) { previous_object()->fix_exp(exp, tmp); return; } if(sizeof(party[group]) == 1) { previous_object()->fix_exp(exp, tmp); return 0; } manage_party(group); for(i=0, tot=0; i<sizeof(party[group]); i++) { x = (int)party[group][i]->query_level(); tot += x; } for(i=0; i<sizeof(party[group]); i++) { x = (int)party[group][i]->query_level(); party[group][i]->fix_exp((x*exp)/tot+1, tmp); } } string *query_parties() { if(!party) return 0; return keys(party); } object *query_party_members(string group) { if(!party) return 0; if(!party[group]) return 0; manage_party(group); return party[group]; } object query_leader(string str) { if(!party) return 0; if(!party[str]) return 0; manage_party(str); return party[str][0]; } void notify_party(string str, string what) { int i, sz; if(!party) return; if(!party[str]) return; manage_party(str); sz = sizeof(party[str]); for(i=0; i<sz; i++) { tell_object(party[str][i], "<"+str+" info> "+what+"\n"); } } void add_invited(object ob, string str) { if(!invited) return; if(!invited[str]) invited[str] = ({}); invited[str] += ({ ob }); call_out("remove_invitation", 60, ({ ob, str, 0 })); } object *query_invited(string str) { if(!invited) return 0; if(!invited[str]) return 0; return invited[str]; } int invited_now(object ob, string str) { if(!invited) return 0; if(!invited[str]) return 0; if(member_array(ob, invited[str]) == -1) return 0; return 1; } void remove_invitation(mixed *bing) { if(!invited) return; if(!invited[bing[1]]) return; if(member_array(bing[0], invited[bing[1]]) == -1) return; invited[bing[1]] -= ({ bing[0] }); if(!bing[2]) tell_object(bing[0], "You are no longer invited to be a member of the party.\n"); } void manage_all_parties() { string *grps; int i; if(i = sizeof(grps = keys(party))) while(i--) manage_party(grps[i]); call_out("manage_all_parties", 300); }