/*    From the Dead Souls Object Library
 *    Provides follow/trail support for mobile objects.
 *    Works closely with LIB_LEAD.
 *    Created by Rush 951028
 */

#include <lib.h>
#include "include/follow.h"

private static object Leader;

static void create() { Leader = 0; }

mixed direct_follow_liv() {
    if( this_object() == this_player() )
	return "It doesn't quite work that way.";
    return this_player()->CanFollow(this_object());
}

object SetLeader(object leader) {
    if( leader == this_object() ) return 0;
    if( leader && Leader ) return 0;
    Leader = ( leader && leader->GetFollowers() ) ? leader : 0;
    return Leader;
}

object GetLeader() { return Leader; }

varargs mixed CanFollow(object ob) {
    if( ob ) {
	if( !ob->CanLead() )
	    return "You are not empowered to follow " + ob->GetName();
	if( IsFollowing(ob) )
	    return "You are already following " + ob->GetName();
	if( ob->IsFollowing(this_object()) )
	    return ob->GetName() + " is already following you.";
	if( ob == this_object() )
	    return "You cannot possibly do that.";
    }
    return 1;
}

int IsFollowing(object ob) {
    if( !Leader ) return 0;
    if( Leader == ob ) return 1;
    if( Leader->IsFollowing(ob) ) return 1;
    return 0;
}

// eventFollow() needs to be overriden by child classes to provide the
// actual move support.
int eventFollow(object dest, int fC) { return 0; }


