/*
* Team object. It is inside the leader. Every player can make a team.
*/
#define INIT_SIZE 2
object *members, *pot_members, leader_ob;
string leader_name, mout;
/*
* Add a member to the member array or the potential member array.
* The arrays is extended if needed. The leader adds to the potential
* members array.
*/
object * add(object item) {
int i;
object * vec2;
if (members == 0) {
pot_members = allocate(INIT_SIZE);
members = allocate(INIT_SIZE);
}
i = 0;
while(i<sizeof(members)) {
if (members[i] == 0) {
members[i] = item;
return members;
}
i += 1;
}
vec2 = allocate(sizeof(members) + INIT_SIZE);
i = 0;
while(i<sizeof(members)) {
vec2[i] = members[i];
i += 1;
}
vec2[i] = item;
return vec2;
}
void long() {
int i;
write("Leader " + leader_name + ": ");
if (!pointerp(members)) {
write("No members.\n");
return;
}
while(i<sizeof(members)) {
if (members[i])
write(members[i]->query_name() + " ");
i += 1;
}
write("\n");
}
int id(string str) {
return str == "team object";
}
void init() {
if (leader_ob == 0) {
leader_ob = this_player();
leader_name = environment()->query_name();
mout = environment()->query_msgout();
}
add_action("join", "join");
add_action("disband", "disband");
}
int join(string str) {
object ob;
if (!str)
return 0;
ob = present(str, environment(environment()));
if (!ob) {
write("No such player here.\n");
return 1;
}
say(leader_name + " joined " +
ob->query_name() + " to his team.\n", ob);
tell_object(ob, "You are joined to the team of " +
leader_name + ".\n");
members = add(ob); /* takes members implicitely */
write("Ok.\n");
enable_commands();
return 1;
}
int drop() { return 1; }
int get() { return 1; }
string direction;
object last_room;
void catch_tell(string str) {
string dir;
if (sscanf(str, leader_name + " " + mout + " %s.", dir) != 1)
return;
if (direction)
return;
direction = dir;
last_room = environment(this_player());
call_out("move", 0);
}
void msg(string str) {
tell_object(environment(), str);
}
void move() {
int i;
if (!pointerp(members)){
msg("Bad members list.\n");
return;
}
if (last_room == environment(environment())) {
direction = 0;
return;
}
i = 0;
while(i < sizeof(members)) {
if (members[i] && environment(members[i]) == last_room) {
tell_object(members[i], "You follow " + leader_name + " '" +
direction + "'.\n");
members[i]->force_us(direction);
} else if (members[i]) {
tell_object(members[i], "Your leader moves without you!\n");
}
i += 1;
}
direction = 0;
last_room = 0;
}
int disband(string str) {
object ob;
int i;
if (!str)
return 0;
ob = present(str, environment(this_player()));
if (!ob) {
write("No such player.\n");
return 0;
}
i = 0;
while(i<sizeof(members)) {
if (members[i] == ob) {
members[i] = 0;
write("Ok.\n");
say(ob->query_name() +
" is removed from the team of " + leader_name + ".\n", ob);
tell_object(ob, "You are removed from the team of " +
leader_name + ".\n");
return 1;
}
i += 1;
}
write("That person is not in your team.\n");
return 1;
}