/* A more thorough world mapping bot. */

#include <lib.h>
#include ROOMS_H
#include <position.h>
#include <medium.h>
#include <daemons.h>

inherit LIB_SENTIENT;

int spawned;
int hb = 10;

string ShortDesc(){
    return "drone "+file_name();
}

string LongDesc(){
    return "drone "+file_name();
}

static void create() {
    sentient::create();
    SetKeyName("drone");
    SetAdjectives( ({"small","metal"}) );
    SetId( ({"drone","bot","robot"}) );
    SetShort( (: ShortDesc :) );
    SetLong( (: LongDesc :) );
    SetLevel(1);
    SetInvis(1);
    SetRace("bot");
    SetGender("neuter");
    SetClass("explorer");
    SetMaxHealthPoints(50000);
    SetPermitLoad(1);
    SetEncounter(0);
    SetPosition(POSITION_FLYING);
    SetNoClean(1);
    SetPacifist(1);
    SetWimpy(99);
    set_heart_beat(hb);
}

int eventReceiveDamage(mixed args...){
    return 0;
}

int eventMove(mixed dest){
    int ret;
    object env = environment();     
    string location;

    if(!env) location = ROOM_START;     
    else if(clonep(env)) location = file_name(env);
    else location = base_name(env);

    if(location) this_object()->SetProperty("LastLocation", location); 
    ret = ::eventMove(dest);
    AddStaminaPoints(GetMaxStaminaPoints());
    if(env){
        if(env->GetMedium() != MEDIUM_LAND) spawned = 1;
        if(env->GetVirtual()){
            hb = 20;
            set_heart_beat(hb);
        }
        MAP_D->GetMap(env, 8, 1);
    }
    return ret;
}

void init(){
    ::init();
    set_heart_beat(hb);
}

void eventSpawn(){
    object env;
    string location;
    string *exits = ({});
    object newdrone;

    if(!env = environment()) return;
    spawned = 1;

    exits = values(env->GetExitMap());
    exits += values(env->GetEnterMap());
    exits = distinct_array(exits);

    foreach(string exit in exits){
        if(member_array(exit, ROOMS_D->DroneCache()) != -1) continue;
        newdrone = new("/domains/default/npc/drone3");
        newdrone->eventMove(env);
#if 0
        drones = objects( (: base_name($1) == base_name() &&
                    environment($1) && !strsrch(base_name(environment($1)),
                        path_prefix(base_name(environment()))) && $1 != this_object() :) );
        if(drones) drones->ReceiveNoGo(nogo + no_go + ({ base_name(env) })); 
#endif
        ROOMS_D->DroneCache( ({ exit }) );
        catch( newdrone->eventMove(exit) );
    }
    ROOMS_D->DroneCache(({ base_name(env) }));
} 

void heart_beat(){
    if(!clonep()) return;
    if(!spawned) eventSpawn();
    else {
        if(environment()) MAP_D->GetMap(environment(), 8, 1);
        eventDestruct();
    }
}
