#include <lib.h>
#include <daemons.h>
#include <vendor_types.h>
inherit LIB_ITEM;
mapping Tracked = ([]);
string LongDesc(){
    string ret;
    Tracked = ([]);
    if(creatorp(this_player())){
        ret = "This small electronic appliance is designed to "+
        "provide information, if available, regarding your location "+
        "in the world. Commands: coord, prox";
    }
    else {
        ret = "This is a device creators use to analyze their "+
        "position in relation to the mud.";
    }
    return ret;
}
void create(){
    ::create();
    SetKeyName("GPS device");
    SetAdjectives( ({"gps", "global positioning", "system", "small"}) );
    SetId( ({"gps", "device", "appliance"}) );
    SetShort("a GPS device");
    SetLong( (: LongDesc :) );
    SetNoCondition(1);
    SetMass(20);
    SetVendorType(VT_TREASURE);
}
void init(){
    ::init();
    add_action("GetCoord","coord");
    add_action("GetProx","prox");
    add_action("StartTrack","track");
    add_action("StopTrack","untrack");
}
int GetCoord(){
    string ret;
    if(!creatorp(this_player())) return 0;
    ret = ROOMS_D->GetCoordinates(environment(this_player()));
    if(!sizeof(ret) || ROOMS_D->GetGrid(ret)["room"] != 
      base_name(environment(this_player()))){
        ret = "It seems you are unable to receive positioning "+
        "data about your location at the moment.";
    }
    else{
        mixed foo = ROOMS_D->GetGridGridMap(ret);
        if(foo) ret += "\n"+identify((foo || ""));
    }
    write(ret);
    return 1;
}
int GetProx(int i){
    string ret = "";
    int x, y, z;
    string coords;
    if(!creatorp(this_player())) return 0;
    coords = ROOMS_D->GetCoordinates(environment(this_player()));
    if(!sizeof(coords) || ROOMS_D->GetGrid(coords)["room"] !=
      base_name(environment(this_player())) || 
      sscanf(coords,"%d,%d,%d",x,y,z) != 3){
        ret = "It seems you are unable to receive proximity "+
        "data about your location at the moment.";
    }
    else{
        if(ROOMS_D->GetGrid(x+","+(y+1)+","+z)["room"])
            ret += "North: "+ROOMS_D->GetGrid(x+","+(y+1)+","+z)["room"];
        if(ROOMS_D->GetGrid(x+","+(y-1)+","+z)["room"])
            ret += "\nSouth: "+ROOMS_D->GetGrid(x+","+(y-1)+","+z)["room"];
        if(ROOMS_D->GetGrid((x+1)+","+y+","+z)["room"])
            ret += "\nEast: "+ROOMS_D->GetGrid((x+1)+","+y+","+z)["room"];
        if(ROOMS_D->GetGrid((x-1)+","+y+","+z)["room"])
            ret += "\nWest: "+ROOMS_D->GetGrid((x-1)+","+y+","+z)["room"];
        if(ROOMS_D->GetGrid((x+1)+","+(y+1)+","+z)["room"])
            ret += "\nNortheast: "+ROOMS_D->GetGrid((x+1)+","+(y+1)+","+z)["room"];
        if(ROOMS_D->GetGrid((x-1)+","+(y+1)+","+z)["room"])
            ret += "\nNorthwest: "+ROOMS_D->GetGrid((x-1)+","+(y+1)+","+z)["room"];
        if(ROOMS_D->GetGrid((x+1)+","+(y-1)+","+z)["room"])
            ret += "\nSoutheast: "+ROOMS_D->GetGrid((x+1)+","+(y-1)+","+z)["room"];
        if(ROOMS_D->GetGrid((x-1)+","+(y-1)+","+z)["room"])
            ret += "\nSouthwest: "+ROOMS_D->GetGrid((x-1)+","+(y-1)+","+z)["room"];
        if(ROOMS_D->GetGrid(x+","+y+","+(z+1))["room"])
            ret += "\nUp: "+ROOMS_D->GetGrid(x+","+y+","+(z+1))["room"];
        if(ROOMS_D->GetGrid(x+","+y+","+(z-1))["room"])
            ret += "\nDown: "+ROOMS_D->GetGrid(x+","+y+","+(z-1))["room"];
    }
    write(ret);
    return 1;
}
int StartTrack(string str){
    object mark = to_object(str);
    if(!mark || !living(mark)){
        mark = find_player(str);
    }
    if(!mark){
        write("That living thing could not be found.");
        return 1;
    }
    write("Starting to track "+capitalize(mark->GetKeyName())+".");
    TRACKER_D->AddTrack(mark, this_object());
    Tracked[str] = mark;
    return 1;
}
int StopTrack(string str){
    object mark;
    if(!Tracked[str]){         
        write("This device wasn't tracking that living thing.");
        return 1;     
    }
    write("Stopping the track of "+
      capitalize(Tracked[str]->GetKeyName())+".");     
    TRACKER_D->RemoveTrack(mark, this_object());
    Tracked[str] = 0;
    return 1;
}
int ReceiveTrackingData(mapping data){
    object env = environment();
    if(!env) return 0;
    tell_object(env, "The GPS device chirps: Tracking data received for "+
      data["object"]->GetShort()+": "+identify(data));
    return 1;
}