/* team.c  -  Zeus (13/01/1993)
// this is the team object inherited by living.c
// based on Lars's team object for mudlib 2.4.5
*/

static object *members;
static string leader_name;

int init_team ();
int add_member (object mem);
void move_team (object env);
void disband_team ();
int disband_member (object mem);
int list_members (string name);

int init_team() {
	if(leader_name) {
		notify_fail("You are already leader of a team.\n");
		return 0;
	}
	members = ({});
	leader_name = this_player()->query("cap_name");
	this_player()->set("leader", leader_name);
	tell_object(this_player(), "You start a new team.\n");
	shout(leader_name+" starts a new team.\n");
	return 1;
}

void check_team() {
	object ob;

	if(this_object()->query("leader") &&
	this_object()->query("leader") == this_object()->query("cap_name")) {
		disband_team();
		return;
	}

	if(this_object()->query("leader") &&
	this_object()->query("leader") != this_object()->query("cap_name")) {
		ob = find_living(lower_case((string)this_object()->query("leader")));
		ob->disband_member(this_object());
	}
}


int add_member(object mem) {
	int i;

	i = member_array(mem, members);
	if(i > -1) {
		notify_fail("You are already member of a team.\n");
		return 0;
	}
	members = ({ mem }) + members;
	mem->set("leader", leader_name);
	return 1;
}

void move_team(object env) {
	int i;

	if(!pointerp(members) || sizeof(members) == 0) return;

	for(i = 0; i < sizeof(members); i++) {
		if(environment(members[i]) != env) {
			tell_object(members[i], "Your team moves without you.\n");
		}
		else {
			members[i]->move_player(environment(this_object()), members[i]->query("cap_name")+
						" follows "+this_object()->query("cap_name"));
			tell_object(members[i], "You follow "+leader_name+".\n");
			tell_object(this_object(), members[i]->query("cap_name")+" arrives.\n");
		}
	}
}

void disband_team() {
	int i;

	if(!pointerp(members)) return;
	if(!leader_name) return;

	for(i = 0; i < sizeof(members); i++) {
		members[i]->set("leader", 0);
		tell_object(members[i], "Your team has been disbanded by "+leader_name+"\n");
	}
	this_object()->set("leader", 0);
	members = 0;
	leader_name = 0;
}

int disband_member(object mem) {
	int i;

	i = member_array(mem, members);
	if(i == -1) {
		notify_fail("This person is not a member of your team.\n");
		return 0;
	}
	members[i]->set("leader", 0);
	members = members - ({ members[i] });
	return 1;
}

int list_members(object ob) {
	int i;

	if(sizeof(members) > 0) {
		tell_object(ob, "Your team has "+(sizeof(members)+1)+" members.\n");
	}
	else {
		tell_object(ob, "Your team has "+(sizeof(members)+1)+" member.\n");
	}
	tell_object(ob, leader_name+" [Leader]\n");

	for(i = 0; i < sizeof(members); i++) {
		tell_object(ob, members[i]->query("cap_name")+"\n");
	}
	return 1;
}