// /std/living/follow.c
// from the Nightmare mudlib
// code for allowing people to follow
// created by Descartes of Borg 15 february 1993
static private string allowed_to_follow;
static private object *followers;
static private object following;
object *query_followers() { return followers; }
object query_following() { return following; }
void set_following(object f) { following = f; }
int set_followers(object *f) {
int i;
if(!f) return 0;
if(member_array( this_object(), f ) != -1 ) return 0;
if(following && member_array(following, f) != -1) return 0;
followers = f;
for(i=0; i<sizeof(f); i++) {
if(!f[i]) followers -= ({ f[i] });
else f[i]->set_following(this_object());
}
return 1;
}
int add_follower(object f) {
if( f == this_object() ) return 0;
if( f == following ) return 0;
if(!followers) {
followers = ({ f });
f->set_following(this_object());
return 1;
}
f->set_following(this_object());
followers = followers + ({ f });
return 1;
}
void remove_follower(object ob) {
if(followers && member_array(ob, followers) == -1)
return;
followers -= ({ ob });
ob->set_following(0);
}
void clear_followers() {
int i;
if(!followers) return;
for(i=0; i<sizeof(followers); i++)
if(followers[i]) followers[i]->set_following(0);
followers = ({});
}
void move_followers(object prev) {
object *tmp;
int i;
tmp = ({});
for(i=0; i<sizeof(followers); i++) {
if(!objectp(followers[i])) continue;
if(!environment(followers[i])) continue;
if(environment(followers[i]) != prev) {
message("my_action","You have lost "+followers[i]->query_cap_name()+".",this_object());
message("other_action",this_object()->query_cap_name()+" has ditched you.",followers[i]);
followers[i]->set_following(0);
}
else {
if( followers[i]->follow(base_name(environment(this_object()))))
tmp += ({ followers[i] });
}
}
followers = tmp;
}
void follow_allow(string str) { allowed_to_follow = str; }
int can_follow(string str) { return str == allowed_to_follow; }
int follow(string exit) {
string cmd;
if(!environment(this_object())) return 0;
cmd = (string)environment(this_object())->query_direction(exit);
if (!cmd) cmd = (string)environment(this_object())->query_direction(exit+".c");
if(!cmd) return 0;
this_object()->force_me(cmd);
return 1;
}