/* PARTY DAEMON. (c)Angel, March 1993.
* This is the master file for the party system, which keeps
* track of all the parties on the mud, their cumulative exp,
* age, members, as well as the parties name and leader, the
* latter of which is usually the first member of the members
* array. This file, each time the exp array is re-written, a
* new file of Highest and Best parties, dependant upon exp
* gained per unit of time, is written. This way a little
* competition is encouranged between players 8)
*/
#define PARTY_OB "/obj/party/party_ob"
#define PARTY_FILE "/obj/party/party_d"
#define PARTY_SAVE "open/party/party_save"
#define PARTY_BEST "/open/party/party_best"
mixed *party_data;
string *query_all_members(string str);
void reset(status arg) {
if(arg) return;
restore_object(PARTY_SAVE);
if(!party_data || !sizeof(party_data)) {
party_data = ({
/* Order is as follows... *
* party name party members party exp *
* born rate */
});
}
}
void write_best_party();
status query_party(string str) {
int i;
string tmp;
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][0] == str)
return 1;
}
return 0;
}
status add_party(mixed *arr) {
int i;
if(query_party(arr[0])) return 1;
party_data += ({ arr, });
save_object(PARTY_SAVE);
return 1;
}
status remove_party(string str) {
int i;
if(!query_party(str)) return 1;
for(i=0; i<sizeof(party_data); i++) {
if(member_array(str, party_data[i]) != -1)
party_data = party_data[0..(i-1)] +
party_data[(i+1)..sizeof(party_data)-1];
}
save_object(PARTY_SAVE);
return 1;
}
mixed *query_party_data() { return party_data; }
string *query_members(string str) {
return query_all_members(str);
}
string *query_all_members(string party) {
int i;
string tmp;
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][0] == party)
return party_data[i][1];
}
}
string query_leader(string party) {
int i;
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][0] == party) {
if(stringp(party_data[i][1][0]))
return party_data[i][1][0];
else {
remove_party(party);
tell_object(this_player(), "Your party has no leader!\n");
}
}
}
}
int query_age(string party) {
int i;
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][0] == party)
return party_data[i][2];
}
}
int query_total_exp(string party) {
int i;
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][0] == party)
return party_data[i][3];
}
}
mixed *best_party() {
mixed *party;
string *temp;
string tmp;
int i, j;
party = ({});
for(i=0; i<sizeof(party_data); i++) {
if(party_data[i][2]-time()) {
j = time() - party_data[i][2];
party += ({
({ party_data[i][0],
((party_data[i][3]*60)/j),}), });
}
}
party = sort_array(party, "by_rate", this_object());
save_object(PARTY_SAVE);
return party;
}
status by_rate(mixed *a, mixed *b) {
return (a[1] < b[1]) ? 1 : 0;
}
void write_best_party() {
mixed *party;
string txt, tmp;
string *temp_party;
int i;
party = best_party();
txt = "_______________________________________________________________\n"+
"> Best Parties on Sands of Time <\n"+
"---------------------------------------------------------------\n"+
" | Party Name Members Rating | \n";
for(i=0; i<sizeof(party); i++) {
if(party[i][1] && sizeof(query_all_members(party[i][0]))) {
tmp = " | "+party[i][0]+" ";
tmp = extract(tmp,0,20);
temp_party = query_all_members(party[i][0]);
if(sizeof(temp_party)) tmp += capitalize(implode(temp_party, " "));
tmp+= " ";
tmp = extract(tmp,0,55);
tmp += party[i][1]+" ";
tmp = extract(tmp,0,60);
txt += tmp+"|\n";
}
}
txt += "_______________________________________________________________\n"+
"> <\n"+
"---------------------------------------------------------------\n";
if(this_player()->valid_write(PARTY_BEST)) {
rm(PARTY_BEST);
write_file(PARTY_BEST, txt);
}
}
status get_party_object(string party, object player) {
int i;
object party_ob;
if(!player) player = this_player();
if(!party) return 0;
if(member_array((string)player->query_name(1),
query_all_members(party)) == -1) return 0;
if(present("party_object", player)) {
party_ob = present("party_object", player);
destruct(party_ob);
}
party_ob = clone_object(PARTY_OB);
party_ob -> set_age(query_age(party));
party_ob -> set_total_exp(query_total_exp(party));
party_ob -> set_party(party);
party_ob -> set_members(query_all_members(party));
party_ob -> set_leader(query_leader(party));
party_ob -> add_members((string)this_player()->query_name(1));
move_object(party_ob, player);
tell_object(player, "\nRestoring '"+party+"' party object...\n\n");
return 1;
}