dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/* remote control by Cratylus @ Frontiers
 * Sep 21 2005
 */

#include <lib.h>
#include <vendor_types.h>
inherit LIB_ITEM;
int controlling;
string remote, control_code;
object owner;

void create(){
    ::create();
    SetKeyName("remote control");
    SetId(({"device","controller","remote","control"}));
    SetAdjectives(({"small","electronic"}));
    SetShort("a remote control");
    SetLong("This is a small electronic "+
      "device with various labeled buttons on it. "+
      "It seems you can \"control something\" with "+
      "it, and also \"release\" it. To command your "+
      "remote servant, you evidently have to preface the command "+
      "with the ] character (example: ] look at menu).");
    SetProperties(([
	"no steal" : 1,
      ]));
    SetMass(20);
    SetValue(10);
    SetVendorType(VT_TREASURE);
    control_code = alpha_crypt(16);
}

void init(){
    ::init();
    if(living(environment())) owner = environment();
    else owner = 0;
    add_action("control","control");
    add_action("release","release");
    add_action("do_control","]");
}

int control(string str){
    object ob;
    string *eyedees;
    if(!str){
	return 0;
    }
    ob=present(str, environment(this_player()));
    if(!ob){
	write("There is no such thing to be controlled here.");
	return 1;
    }
    if(!creatorp(this_player()) && !present("visitor pass",this_player())){
	write("Your puny mortal mind can't wrap itself around the use "
	  "of this powerful instrument.");
	log_file("adm/control",capitalize(this_player()->GetKeyName())+
	  " attempted to use the remote control on "+str+": "+timestamp()+"\n");
	tell_creators("SECURITY: "+capitalize(this_player()->GetKeyName())+
	  " attempted to use the remote control on "+str+".");
	return 1;
    }
    if(!living(ob)){
	write(capitalize(ob->GetKeyName())+" is not a living thing.");
	return 1;
    }
    if(!strsrch(base_name(ob),"/secure") ){
	write(ob->GetName()+" is not controllable with this device.");
	say(this_player()->GetName()+" tries to establish control over "+ob->GetName()+" and fails.\n");
	return 1;
    }
    if(controlling){
	write("Your remote control is busy controlling some other creature.");
	return 1;
    }
    if(ob->GetOwner() && ob->GetOwner() != "NONE"){
	write("That creature is already in someone's thrall.");
	return 1;
    }
    if(!(ob->GetOwner())) new("/shadows/drone")->eventShadow(ob);
    remote=file_name(ob);
    ob->SetOwner(this_player()->GetKeyName());
    ob->SetListen(1);
    ob->SetControlCode(control_code);
    eyedees = ob->GetId();
    eyedees += ({"servant","drone","thrall"});
    ob->SetId(eyedees);
    write("You establish a remote control connection with "+capitalize(str)+".");
    say(this_player()->GetName()+" establishes a control link with "+capitalize(str)+".");
    controlling=1;
    return 1;
}

int do_control(string str){
    object obj;
    if(!controlling){
	write("You are not currently linked to any living thing.");
	return 1;
    }
    if(!str || str == ""){
	write("Nothing happens.");
	return 1;
    }
    if(environment() != owner){
	write("You don't seem to be in possession of the remote control.");
	tell_object(environment(),"Possible security violation on remote control.");
	error("Illegal access of remote control: "+get_stack()+" "+identify(previous_object(-1)));
	return 1;
    }
    obj=find_object(remote);
    if(obj) obj->eventReceiveCommand(str);
    else { 
	write("There seems to be a problem.");
	this_object()->release();
    }
    return 1;
}

int release(){
    object dingus;
    if(remote && dingus=find_object(remote) ){
	dingus->SetOwner("NONE");
	remove_shadow(dingus);
    }
    controlling=0;
    write("You release your remote link.");
    return 1;
}

string GetControlCode(){
    if(base_name(previous_object()) != "/shadows/drone") return alpha_crypt(16);
    else return control_code;
}