138 lines
4.3 KiB
C
138 lines
4.3 KiB
C
/* 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);
|
|
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(!builderp(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(!creatorp(this_player()) && strsrch(base_name(ob), homedir(this_player()))){
|
|
write("Only creators can control NPC's that don't belong to them.");
|
|
say(this_player()->GetName()+" tries to establish control over "+ob->GetName()+" and fails.\n");
|
|
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(), this_player());
|
|
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;
|
|
}
|