/* wiz.c */
#include <sys.h>
#include <secure.h>
#include <flags.h>
#include <armor.h>
string name;
string low_name;
string password;
string path;
int doing_ls;
int is_invis;
int flags,programmer,special;
object possessing;
force_disconnect() {
if (!priv(caller_object())) return 0;
disconnect_device();
disconnect();
return 1;
}
stat() {
if (priv(this_object())) tell_player(this_player(),"Object Type: WIZARD\n");
else if (programmer)
tell_player(this_player(),"Object Type: PROGRAMMER\n");
else tell_player(this_player(),"Object Type: BUILDER\n");
if (flags) tell_player(this_player(),"Flags:"+make_flags(flags)+"\n");
if (special) tell_player(this_player(),"Special: "+itoa(special)+"\n");
tell_player(this_player(),"Name: "+name+"\n");
if (priv(this_player()) && possessing)
tell_player(this_player(),"Possessing: "+make_num(possessing)+"\n");
return 1;
}
static do_stat(arg) {
if (!arg) {
write("usage: @stat object\n");
return 1;
}
arg=resolve_object(arg);
if (!arg) {
write("@stat: couldn't find object\n");
return 1;
}
if (!call_other(arg,"stat"))
write("@stat: no stats reported\n");
return 1;
}
static command_possessed(arg) {
if (possessing)
call_other(possessing,"force",arg);
else
write("$: You aren't currently possessing anything.\n");
return 1;
}
static do_possess(arg) {
if (!arg) {
if (possessing)
write("@possess: you are currently possessing "+make_num(possessing)+
"\n");
else
write("@possess: you are not currently possessing anything.\n");
return 1;
}
if (arg=="off") {
if (possessing) {
call_other(possessing,"set_possessor",0);
write("@possess: you are no longer possessing "+make_num(possessing)+
"\n");
possessing=0;
} else
write("@possess: you are not currently possessing anything.\n");
return 1;
}
if (possessing) {
write("@possess: you are already possessing "+make_num(possessing)+"\n");
return 1;
}
arg=resolve_object(arg);
if (!arg) {
write("@possess: couldn't find object\n");
return 1;
}
if (!programmer && !priv(this_object()) && call_other(arg,"get_owner")!=
this_object()) {
write("@possess: you don't own that object\n");
return 1;
}
if (call_other(arg,"set_possessor",this_object())) {
write("@possess: you are now possessing "+make_num(arg)+"\n");
possessing=arg;
} else
write("@possess: failed\n");
return 1;
}
possession_report(arg) {
return listen("%"+arg);
}
get_flags() { return flags; }
get_special() { return special; }
set_special(s) { special=s; return 1; }
set_flags(f) { flags=f; return 1; }
do_create(arg) {
string arg_type,name;
int pos;
object o,dest;
pos=instr(arg,1," ");
arg_type=leftstr(arg,pos-1);
name=rightstr(arg,strlen(arg)-pos);
if (!arg || !name) {
write("usage: @create monster|room|exit|weapon|armor|coins|object|shop "+
" name [destination (for exits)]\n");
return 1;
}
if (arg_type=="room") {
o=clone_object("/obj/room");
call_other(o,"set_owner",this_object());
call_other(o,"set_short",name);
} else if (arg_type=="armor") {
o=clone_object("/obj/armor");
call_other(o,"set_owner",this_object());
call_other(o,"set_name",name);
move_object(o,this_object());
} else if (arg_type=="shop") {
o=clone_object("/obj/shop");
call_other(o,"set_short",name);
call_other(o,"set_owner",this_object());
} else if (arg_type=="object") {
o=clone_object("/obj/object");
call_other(o,"set_owner",this_object());
call_other(o,"set_name",name);
move_object(o,this_object());
} else if (arg_type=="coins") {
o=clone_object("/obj/coins");
call_other(o,"set_owner",this_object());
call_other(o,"set_value",atoi(name));
move_object(o,this_object());
} else if (arg_type=="exit") {
pos=instr(name,1," ");
if (pos) {
dest=rightstr(name,strlen(name)-pos);
name=leftstr(name,pos-1);
dest=resolve_object(dest);
if (!dest) {
write("@create: couldn't find destination\n");
return 1;
}
}
o=clone_object("/obj/exit");
call_other(o,"set_owner",this_object());
call_other(o,"set_name",name);
move_object(o,location(this_object()));
if (dest) call_other(o,"set_dest",dest);
} else if (arg_type=="weapon") {
o=clone_object("/obj/weapon");
call_other(o,"set_owner",this_object());
call_other(o,"set_name",name);
move_object(o,this_object());
} else if (arg_type=="monster") {
o=clone_object("/obj/monster");
call_other(o,"set_owner",this_object());
call_other(o,"set_name",name);
move_object(o,location(this_object()));
} else {
write("@create: unknown object type\n");
return 1;
}
write("@create: created "+make_num(o)+"\n");
return 1;
}
static do_set(arg) {
string o,field,value,m1,m2,m3,m4,m5,part1,part2;
int pos,is_anti,success,f,a,b,c;
pos=instr(arg,1," ");
o=leftstr(arg,pos-1);
field=rightstr(arg,strlen(arg)-pos);
pos=instr(field,1," ");
if (pos) {
value=rightstr(field,strlen(field)-pos);
field=leftstr(field,pos-1);
}
if (leftstr(field,1)=="!") {
is_anti=1;
field=rightstr(field,strlen(field)-1);
}
if (!field || !o) {
write("usage: @set object [!]field [value]\n");
return 1;
}
o=resolve_object(o);
if (!o) {
write("@set: couldn't find object\n");
return 1;
}
if (!priv(this_object()) && !programmer && call_other(o,"get_owner")!=
this_object()) {
write("@set: you don't own that object\n");
return 1;
}
if (field=="protection") f=make_prot_num(value);
if (field=="owner" || field=="dropto" || field=="dest" ||
field=="destination" || field=="storeroom" || field=="shopkeeper") {
if (value) {
value=resolve_object(value);
if (!value) {
write("@set: couldn't find object in value field\n");
return 1;
}
}
}
if (field=="programmer" && !value) value=!is_anti;
if (field=="special" || field=="hitbonus" || field=="level" ||
field=="xp" || field=="hp" || field=="value" || field=="hitreduce" ||
field=="damreduce") {
if (value) {
f=atoi(value);
if (!f && value!="0") {
write("@set: expected integer in value field\n");
return 1;
}
}
}
if (field=="damage") {
if (value) {
pos=instr(value,1,"d");
if (pos) {
a=atoi(leftstr(value,pos-1));
b=rightstr(value,strlen(value)-pos);
pos=instr(b,1,"+");
if (pos) {
c=atoi(rightstr(b,strlen(b)-pos));
b=atoi(leftstr(b,pos-1));
} else
b=atoi(b);
} else
a=atoi(value);
}
}
if (field=="puny" || field=="weak" || field=="poor" || field=="average" ||
field=="good" || field=="verygood" || field=="massacre") {
pos=instr(value,1,";");
part1=leftstr(value,pos-1);
value=rightstr(value,strlen(value)-pos);
pos=instr(value,1,";");
m3=leftstr(value,pos-1);
part2=rightstr(value,strlen(value)-pos);
pos=instr(part1,1,"*");
m1=leftstr(part1,pos-1);
m2=rightstr(part1,strlen(part1)-pos);
if (!pos) { m1=part1; m2=0; }
pos=instr(part2,1,"*");
m4=leftstr(part2,pos-1);
m5=rightstr(part2,strlen(part2)-pos);
if (!pos) { m4=part1; m5=0; }
}
if (field=="name") success=(call_other(o,"set_name",value));
else if (field=="short") success=call_other(o,"set_short",value);
else if (field=="long") success=call_other(o,"set_long",value);
else if (field=="owner") success=call_other(o,"set_owner",value);
else if (field=="programmer") success=call_other(o,"set_programmer",value);
else if (field=="special") success=call_other(o,"set_special",f);
else if (field=="hitreduce") success=call_other(o,"set_hitreduce",f);
else if (field=="damreduce") success=call_other(o,"set_damreduce",f);
else if (field=="protection") success=call_other(o,"set_protection",f);
else if (field=="value") success=call_other(o,"set_value",f);
else if (field=="dropto") success=call_other(o,"set_dropto",value);
else if (field=="shopkeeper") success=call_other(o,"set_shopkeeper",value);
else if (field=="storeroom") success=call_other(o,"set_storeroom",value);
else if (field=="dest") success=call_other(o,"set_dest",value);
else if (field=="destination") success=call_other(o,"set_dest",value);
else if (field=="hitbonus") success=call_other(o,"set_hit_bonus",f);
else if (field=="damage") success=call_other(o,"set_damage_bonus",a,b,c);
else if (field=="hp") success=call_other(o,"set_hp",f);
else if (field=="xp") success=call_other(o,"set_xp",f);
else if (field=="level") success=call_other(o,"set_level",f);
else if (field=="puny") success=call_other(o,"set_hit_msg",0,m1,m2,m3,m4,m5);
else if (field=="weak") success=call_other(o,"set_hit_msg",1,m1,m2,m3,m4,m5);
else if (field=="poor") success=call_other(o,"set_hit_msg",2,m1,m2,m3,m4,m5);
else if (field=="average") success=call_other(o,"set_hit_msg",3,m1,m2,m3,m4,
m5);
else if (field=="good") success=call_other(o,"set_hit_msg",4,m1,m2,m3,m4,m5);
else if (field=="verygood") success=call_other(o,"set_hit_msg",5,m1,m2,m3,m4,
m5);
else if (field=="massacre") success=call_other(o,"set_hit_msg",6,m1,m2,m3,m4,
m5);
else {
if (field=="permanent") f=F_PERMANENT;
else if (field=="forsale") f=F_FORSALE;
else if (field=="hostile") f=F_HOSTILE;
else if (field=="temple") f=F_TEMPLE;
else if (field=="dark") f=F_DARK;
if (f) {
if (value) {
write("@set: flags do not take value fields\n");
return 1;
}
if (is_anti)
success=call_other(o,"set_flags",call_other(o,"get_flags") & ~f);
else
success=call_other(o,"set_flags",call_other(o,"get_flags") | f);
} else {
write("@set: field not recognized\n");
return 1;
}
}
if (success)
write("Set.\n");
else
write("@set: failed\n");
return 1;
}
get_type() {
if (priv(this_object())) return TYPE_WIZARD;
else if (programmer) return TYPE_PROGRAMMER;
return TYPE_BUILDER;
}
set_programmer(s) {
if (!priv(caller_object())) return 0;
programmer=s;
return 1;
}
static do_get(arg) {
arg=present(arg,location(this_object()));
if (!arg) {
write("You don't see that here.\n");
return 1;
}
if (!call_other(arg,"get")) {
write("You can't get "+call_other(arg,"get_short")+".\n");
return 1;
}
move_object(arg,this_object());
write("You get "+call_other(arg,"get_short")+".\n");
tell_room_except(location(this_object()),this_object(),
name+" gets "+call_other(arg,"get_short")+".\n");
return 1;
}
static do_drop(arg) {
arg=present(arg,this_object());
if (!arg) {
write("You don't have that.\n");
return 1;
}
if (call_other(arg,"drop")) {
write("You can't drop "+call_other(arg,"get_short")+".\n");
return 1;
}
write("You drop "+call_other(arg,"get_short")+".\n");
tell_room_except(location(this_object()),this_object(),
name+" drops "+call_other(arg,"get_short")+".\n");
move_object(arg,location(this_object()));
return 1;
}
static do_inventory(arg) {
int count;
object curr;
string oname;
count=0;
curr=contents(this_object());
while (curr) {
oname=call_other(curr,"get_short");
if (oname) {
if (!count)
write("You are carrying:\n");
count++;
write(oname+"\n");
}
curr=next_object(curr);
}
if (!count)
write("You are empty-handed.\n");
return 1;
}
static look(arg) {
int contents_printed,curr;
string oname,t;
contents_printed=0;
t=arg;
if (arg) {
arg=present(arg,location(this_object()));
if (!arg) arg=present(t,this_object());
if (!arg && t=="me") arg=this_object();
if (!arg && t=="here") arg=location(this_object());
} else
if (!location(this_object())) {
write("You are in the void.\n");
return 1;
} else
arg=location(this_object());
if (!arg) {
write("You don't see that here.\n");
return 1;
}
if (arg==location(this_object())) {
oname=call_other(arg,"get_short");
if (oname) write(oname+"\n");
}
oname=(call_other(arg,"get_long"));
if (oname) write(oname+"\n");
curr=contents(arg);
if (!(call_other(arg,"get_flags") & F_DARK))
while (curr) {
if (curr!=this_object()) {
oname=call_other(curr,"get_short");
if (oname) {
if (!contents_printed) {
write("Contents:\n");
contents_printed=1;
}
write(oname+"\n");
}
}
curr=next_object(curr);
}
return 1;
}
get_invis() { return is_invis; }
id(arg) { return arg==name || arg==low_name; }
move_player(dest,direction) {
if (location(this_object()) && !is_invis)
tell_room_except(location(this_object()),this_object(),
name+" goes "+direction+".\n");
move_object(this_object(),dest);
if (dest && !is_invis)
tell_room_except(dest,this_object(),name+" has arrived.\n");
look(0);
return 1;
}
static do_invis(arg) {
if (arg=="on") {
is_invis=1;
write("@invis: invis on\n");
} else if (arg=="off") {
is_invis=0;
write("@invis: invis off\n");
} else write("usage: @invis on|off\n");
return 1;
}
listen(arg) {
string owner,perms,filename,arg2;
int pos;
if (!doing_ls) {
send_device(arg);
return;
}
pos=instr(arg,1," ");
owner=atoi(leftstr(arg,pos-1));
arg2=rightstr(arg,strlen(arg)-pos);
pos=instr(arg2,1," ");
perms=atoi(leftstr(arg2,pos-1));
filename=rightstr(arg2,strlen(arg2)-pos);
arg2=itoo(owner);
if (!arg2) owner="NULL_OWNER #"+itoa(owner);
else {
arg2=call_other(arg2,"get_uid");
if (arg2) owner=arg2;
else owner=itoa(owner);
}
pos=strlen(owner);
while (pos++<16) owner+=" ";
if (perms & DIRECTORY) arg2="d";
else arg2="-";
if (perms & READ_OK) arg2+="r";
else arg2+="-";
if (perms & WRITE_OK) arg2+="w";
else arg2+="-";
send_device(arg2+" "+owner+" "+filename);
}
get_short() {
object viewer;
viewer=caller_object();
if (leftstr(otoa(viewer),9)!="/obj/wiz#" && is_invis &&
!priv(caller_object())) return NULL;
if (priv(this_object()))
if (is_invis)
return "The wizard "+name+" (invis)";
else
return "The wizard "+name;
else
if (programmer)
if (is_invis)
return "The programmer "+name+" (invis)";
else
return "The programmer "+name;
else
if (is_invis)
return "The builder "+name+" (invis)";
else
return "The builder "+name;
}
static do_exits(arg) {
object curr;
int count,pos;
string ename;
if (location(this_object())) curr=contents(location(this_object()));
while (curr) {
if (call_other(curr,"get_type")==TYPE_EXIT)
if (!(call_other(curr,"get_flags") & F_DARK)) {
if (!count) write("Obvious exits:");
ename=call_other(curr,"get_name");
pos=instr(ename,1,";");
if (pos)
write(" "+leftstr(ename,pos-1));
else
write(" "+ename);
count++;
}
curr=next_object(curr);
}
if (!count)
write("There are no obvious exits here.\n");
else
write("\n");
return 1;
}
static resolve_object(name) {
object result;
if (leftstr(name,1)=="/" || leftstr(name,1)=="#")
if (result=atoo(name))
return result;
if (leftstr(name,1)=="*")
if (result=find_player(rightstr(name,strlen(name)-1)))
return result;
if (leftstr(name,1)=="$")
if (result=find_wiz(rightstr(name,strlen(name)-1)))
return result;
if (result=present(name,this_player()))
return result;
if (result=present(name,location(this_player())))
return result;
if (name=="me") return this_player();
if (name=="here") return location(this_player());
if (name=="root") return atoo("/boot");
return NULL;
}
get_uid() {
return low_name;
}
get_name() {
return name;
}
set_name(arg) {
if (prototype(this_object())) return;
if (name) return;
name=arg;
low_name=downcase(arg);
return 1;
}
set_password(arg) {
if (!arg) return;
if (prototype(this_object())) return;
if (priv(caller_object()) && !priv(this_object())) password=arg;
if (password) return;
password=arg;
return 1;
}
check_password(arg) {
if (!priv(caller_object())) return 0;
return arg==password;
}
static disconnect() {
if (!is_invis)
tell_room_except(location(this_object()),this_object(),
name+" has disconnected.\n");
}
connect() {
string s;
if (!caller_object()) return;
s=otoa(caller_object());
if (leftstr(s,11)!="/sys/login#") return;
alarm(0,"welcome");
}
static do_replicate(arg) {
if (!arg) {
write("usage: @replicate object\n");
return 1;
}
arg=resolve_object(arg);
if (!arg) {
write("@replicate: couldn't find object\n");
return 1;
}
arg=call_other(arg,"replicate");
if (arg) {
call_other(arg,"set_owner",this_object());
write("@replicate: created "+make_num(arg)+"\n");
} else
write("@replicate: couldn't replicate "+call_other(arg,"get_short")+"\n");
return 1;
}
static do_destroy(arg) {
if (!arg) {
write("usage: @destroy object\n");
return 1;
}
arg=resolve_object(arg);
if (!arg) {
write("@destroy: couldn't find object\n");
return 1;
}
if (call_other(arg,"self_destruct"))
write("@destroy: object destroyed\n");
else
write("@destroy: failed\n");
return 1;
}
static do_boot(arg) {
if (!priv(this_object())) return 0;
if (!arg) {
write("usage: @boot player\n");
return 1;
}
arg=resolve_object(arg);
if (!arg) {
write("@boot: couldn't find object\n");
return 1;
}
if (call_other(arg,"force_disconnect"))
write("@boot: player disconnected\n");
else
write("@boot: failed\n");
return 1;
}
static do_force(arg) {
object o;
string cmd;
int pos;
pos=instr(arg,1," ");
o=leftstr(arg,pos-1);
cmd=rightstr(arg,strlen(arg)-pos);
if (!o) {
write("usage: @force object [command]\n");
return 1;
}
o=resolve_object(o);
if (!o) {
write("@force: couldn't find object\n");
return 1;
}
if (!programmer && !priv(this_object()) && call_other(o,"get_owner")!=
this_object()) {
write("@force: you don't own that object\n");
return 1;
}
if (call_other(o,"force",cmd))
write("Ok.\n");
else
write("@force: failed\n");
return 1;
}
static welcome() {
look(0);
if (possessing) write("NOTE: You are currently possessing "
+make_num(possessing)+"\n");
if (is_invis)
write("NOTE: You are currently invisible.\n");
else
tell_room_except(location(this_object()),this_object(),
name+" has connected.\n");
}
#define resolve(X) ((X)=resolve_path(X))
static resolve_path(upath) {
if (!upath) return path;
if (leftstr(upath,1)=="/") return upath;
if (path=="/") return path+upath;
return path+"/"+upath;
}
static do_huh(arg) {
write(HUH_STRING);
}
static do_pwd(arg) {
if (!programmer) return 0;
write("pwd: current path="+path+"\n");
return 1;
}
static do_cd(arg) {
if (!programmer) return 0;
if (!arg)
write("cd: current path="+path+"\n");
else {
resolve(arg);
path=arg;
}
write("Ok.\n");
return 1;
}
static do_quit(arg) {
write("Bye!\n");
disconnect_device();
disconnect();
return 1;
}
static do_who(arg) {
wiz_who_list();
return 1;
}
static do_compile(arg) {
object result;
if (!programmer) return 0;
resolve(arg);
if (arg=="/obj/wiz") {
call_other(atoo("/sys/wizcompile"),"wizcompile");
return 1;
}
result=compile_object(arg);
if (result)
write("@load: "+otoa(result)+" compiled\n");
else
write("@load: failed\n");
return 1;
}
static do_edit(arg) {
if (!programmer) return 0;
if (arg) resolve(arg);
edit(arg);
return 1;
}
static do_cat(arg) {
if (!programmer) return 0;
resolve(arg);
if (cat(arg))
write("cat: couldn't open "+arg+"\n");
return 1;
}
static do_ls(arg) {
if (!programmer) return 0;
resolve(arg);
write("ls: listing "+arg+"\n");
doing_ls=1;
if (ls(arg)) {
doing_ls=0;
write("ls: couldn't open "+arg+"\n");
return 1;
}
doing_ls=0;
write("ls: done\n");
return 1;
}
static do_rm(arg) {
if (!programmer) return 0;
if (!arg) {
write("usage: rm filename\n");
return 1;
}
resolve(arg);
if (rm(arg))
write("rm: couldn't remove "+arg+"\n");
else
write ("Ok.\n");
return 1;
}
static do_cp(arg) {
string src,dest;
int pos;
if (!programmer) return 0;
pos=instr(arg,1," ");
src=leftstr(arg,pos-1);
dest=rightstr(arg,strlen(arg)-pos);
if ((!src) || (!dest)) {
write("usage: cp source destination\n");
return 1;
}
resolve(src);
resolve(dest);
if (cp(src,dest))
write("cp: couldn't copy "+src+" to "+dest+"\n");
else
write("Ok.\n");
return 1;
}
static do_mv(arg) {
string src,dest;
int pos;
if (!programmer) return 0;
pos=insr(arg,1," ");
src=leftstr(arg,pos-1);
dest=rightstr(arg,strlen(arg)-pos);
if ((!src) || (!dest)) {
write("usage: mv source destination\n");
return 1;
}
resolve(src);
resolve(dest);
if (mv(src,dest))
write("mv: couldn't move "+src+" to "+dest+"\n");
else
write("Ok.\n");
return 1;
}
static do_mkdir(arg) {
if (!programmer) return 0;
if (!arg) {
write("usage: mkdir directory_name\n");
return 1;
}
resolve(arg);
if (mkdir(arg))
write("mkdir: couldn't make directory "+arg+"\n");
else
write("Ok.\n");
return 1;
}
static do_rmdir(arg) {
if (!programmer) return 0;
if (!arg) {
write("usage: rmdir directory_name\n");
return 1;
}
resolve(arg);
if (rmdir(arg))
write("rmdir: couldn't remove directory "+arg+"\n");
else
write("Ok.\n");
return 1;
}
static do_hide(arg) {
if (!programmer) return 0;
if (!priv(this_object())) return 0;
if (!arg) {
write("usage: hide filename\n");
return 1;
}
resolve(arg);
if (hide(arg))
write("hide: couldn't hide "+arg+"\n");
else
write("Ok.\n");
return 1;
}
static do_unhide(arg) {
if (!programmer) return 0;
if (!priv(this_object())) return 0;
if (!arg) {
write("usage: unhide filename\n");
return 1;
}
resolve(arg);
if (unhide(arg,this_object(),0))
write("unhide: couldn't unhide "+arg+"\n");
else
write("Ok.\n");
return 1;
}
static do_chown(arg) {
string file,owner;
int pos;
object o;
if (!programmer) return 0;
pos=instr(arg,1," ");
file=leftstr(arg,pos-1);
owner=rightstr(arg,strlen(arg)-pos);
if ((!file) || (!owner)) {
write("usage: chown filename owner\n");
return 1;
}
resolve(file);
if (!(o=atoo(owner)))
if (!(o=find_wiz(owner)))
if (!(o=find_player(owner)))
if (!(o=(owner=="root" ? atoo("/boot") : 0))) {
write("couldn't find owner \""+owner+"\"\n");
return 1;
}
if (chown(file,o))
write("chown: couldn't chown "+file+" to "+owner+"\n");
else
write("Ok.\n");
return 1;
}
static do_save(arg) {
if (!priv(this_object())) return 0;
if (sysctl(SYSCTL_SAVE))
write("@save: failed\n");
else
write("@save: completed\n");
return 1;
}
static do_shutdown(arg) {
if (!priv(this_object())) return 0;
if (sysctl(SYSCTL_SHUTDOWN))
write("@shutdown: failed\n");
return 1;
}
static do_panic(arg) {
if (!priv(this_object())) return 0;
if (sysctl(SYSCTL_PANIC))
write("@panic: failed\n");
return 1;
}
static do_priv(arg) {
object o;
if (!priv(this_object())) return 0;
if (!(o=resolve_object(arg))) {
write("@priv: couldn't find object \""+arg+"\"\n");
return 1;
}
set_priv(o);
write("Ok.\n");
return 1;
}
static do_chmod(arg) {
int pos;
string modestr,file;
int mode;
if (!programmer) return 0;
pos=instr(arg,1," ");
modestr=leftstr(arg,pos-1);
file=rightstr(arg,strlen(arg)-pos);
if ((!modestr) || (!file)) {
write("usage: chmod mode file\n");
return 1;
}
mode=atoi(modestr);
if (!mode && modestr!="0")
if (modestr=="r")
mode=READ_OK;
else if (modestr=="w")
mode=WRITE_OK;
else if (modestr=="rw" || modestr=="wr")
mode=WRITE_OK | READ_OK;
else {
write("chmod: illegal mode \""+modestr+"\"\n");
return 1;
}
resolve(file);
if (chmod(file,mode))
write("chmod: couldn't change "+file+" to mode "+modestr+"\n");
write("Ok\n");
return 1;
}
static do_call(arg) {
int has_arg,pos;
string o,func,tmp;
var pass,x;
object obj;
if (!programmer) return 0;
pos=instr(arg,1," ");
o=leftstr(arg,pos-1);
func=rightstr(arg,strlen(arg)-pos);
pos=instr(func,1,"=");
if (pos) {
tmp=func;
has_arg=1;
func=leftstr(tmp,pos-1);
x=rightstr(tmp,strlen(tmp)-pos);
}
if (!o || !func) {
write("usage: @call object func\n");
write(" @call object func=value\n");
return 1;
}
if (!(obj=resolve_object(o))) {
write("@call: couldn't find object \""+o+"\"\n");
return 1;
}
if (has_arg) {
if (strlen(x)>1 && leftstr(x,1)=="\"" && rightstr(x,1)=="\"")
pass=midstr(x,2,strlen(x)-2);
else
if (!(pass=resolve_object(x)))
if (!(pass=atoi(x)))
if (x!="0") {
write("@call: bad parameter \""+x+"\"\n");
return 1;
}
}
if (has_arg)
x=call_other(obj,func,pass);
else
x=call_other(obj,func);
write("@call: "+otoa(obj)+" "+func);
if (has_arg) {
write("(");
if (typeof(pass)==STRING)
write("\""+pass+"\"");
else if (typeof(pass)==OBJECT)
write(otoa(pass));
else write(itoa(pass));
write(")");
} else
write("()");
write(" returned ");
if (typeof(x)==STRING)
write("\""+x+"\"\n");
else if (typeof(x)==OBJECT)
write(otoa(x)+"\n");
else
write(itoa(x)+"\n");
return 1;
}
static do_clone(arg) {
object o;
if (!programmer) return 0;
resolve(arg);
o=clone_object(arg);
if (o)
write("@clone: cloned "+otoa(o)+"\n");
else
write("@clone: failed to clone \""+arg+"\"\n");
return 1;
}
static do_exam(arg) {
object o;
object curr;
string name;
if (!arg) {
o=location(this_player());
if (!o) {
write("You are in the void.\n");
return 1;
}
} else
o=resolve_object(arg);
if (!o) {
write("@exam: couldn't find object \""+arg+"\"\n");
return 1;
}
write(make_num(o)+"\n");
curr=call_other(o,"get_long");
if (curr) write(curr+"\n");
if (location(o))
write("Location: "+make_num(location(o))+"\n");
else
write("Location: void\n");
curr=contents(o);
if (curr)
write("Contents:\n");
while (curr) {
name=make_num(curr);
if (name)
write(name+"\n");
curr=next_object(curr);
}
return 1;
}
static do_move(arg) {
object src,dest;
int pos;
string ssrc,sdest;
pos=instr(arg,1," ");
ssrc=leftstr(arg,pos-1);
sdest=rightstr(arg,strlen(arg)-pos);
if (!sdest && ssrc) {
sdest=ssrc;
ssrc=NULL;
src=this_player();
dest=resolve_object(sdest);
} else {
src=resolve_object(ssrc);
dest=resolve_object(sdest);
}
if (!dest && sdest=="void") dest="void";
if ((!src) || (!dest)) {
write("usage: @move [item] dest\n");
return 1;
}
if (dest=="void") dest=NULL;
if (!call_other(src,"move_player",dest,"in a puff of smoke"))
if (move_object(src,dest)) {
write("@move: failed\n");
return 1;
}
write("Ok.\n");
return 1;
}
static do_say(arg) {
tell_room_except(location(this_player()),this_object(),
name+" says \""+arg+"\"\n");
write("You say \""+arg+"\"\n");
return 1;
}
static do_pose(arg) {
tell_room_except(location(this_player()),this_object(),name+" "+arg+"\n");
write(name+" "+arg+"\n");
return 1;
}
static do_loadhelp(arg) {
string o,topic,text,file;
object curr;
int pos;
if (!priv(this_object()) && !prototype(this_object())) return 0;
if (!arg) {
write("usage: @loadhelp player|builder|programmer|wizard|manual\n");
return 1;
}
if (arg=="player") { o="/sys/help1"; file="/help/player"; }
else if (arg=="builder") { o="/sys/help2"; file="/help/builder"; }
else if (arg=="programmer") { o="/sys/help3"; file="/help/programmer"; }
else if (arg=="wizard") { o="/sys/help4"; file="/help/wizard"; }
else if (arg=="manual") { o="/sys/help5"; file="/help/manual"; }
else {
write("@loadhelp: help file not recognized\n");
return 1;
}
curr=next_child(atoo(o));
while (curr) {
call_other(curr,"self_destruct");
curr=next_child(curr);
}
pos=0;
text=0;
topic=0;
curr=atoo(o);
while (topic=fread(file,pos)) {
if (leftstr(topic,1)=="*") {
call_other(curr,"set_text",text);
curr=clone_object(o);
call_other(curr,"set_topic",midstr(topic,2,strlen(topic)-2));
text=0;
} else
text+=topic;
}
call_other(curr,"set_text",text);
write("@loadhelp: new help text loaded\n");
return 1;
}
static do_man(arg) {
object curr,found;
string s;
if (!programmer) return 0;
if (arg) {
curr=next_child(atoo("/sys/help5"));
while (!found && curr) {
if (call_other(curr,"get_topic")==arg)
found=curr;
curr=next_child(curr);
}
if (!found) {
write("man: couldn't find topic "+arg+"\n");
return 1;
}
s=(call_other(found,"get_text"));
if (s) write("\n"+s+"\n");
else write("man: no help entered for that topic\n");
return 1;
}
write("\n");
write("System Calls:\n");
write("-------------\n");
curr=next_child(atoo("/sys/help5"));
while (curr) {
write(call_other(curr,"get_topic")+" ");
curr=next_child(curr);
}
write("\n\n");
return 1;
}
static do_help(arg) {
object curr,loop,found;
string s;
if (arg) {
loop=2;
while (!found && loop<=4) {
if (!((loop==3 && !programmer) || (loop==4 && !priv(this_object())))) {
curr=next_child(atoo("/sys/help"+itoa(loop)));
while (curr && !found) {
if (call_other(curr,"get_topic")==arg) found=curr;
curr=next_child(curr);
}
}
loop++;
}
if (!found) {
write("help: no help for topic "+arg+" available\n");
return 1;
}
s=(call_other(found,"get_text"));
if (s) write("\n"+s+"\n");
else write("help: no help entered for that topic\n");
return 1;
}
write("\n");
write("Builder Commands:\n");
write("-----------------\n");
curr=next_child(atoo("/sys/help2"));
while (curr) {
write(call_other(curr,"get_topic")+" ");
curr=next_child(curr);
}
write("\n\n");
if (programmer) {
write("Programmer Commands:\n");
write("--------------------\n");
curr=next_child(atoo("/sys/help3"));
while (curr) {
write(call_other(curr,"get_topic")+" ");
curr=next_child(curr);
}
write("\n\n");
}
if (priv(this_object())) {
write("Wizard Commands:\n");
write("----------------\n");
curr=next_child(atoo("/sys/help4"));
while (curr) {
write(call_other(curr,"get_topic")+" ");
curr=next_child(curr);
}
write("\n\n");
}
return 1;
}
static do_password(arg) {
int pos;
string old,new;
pos=instr(arg,1," ");
old=leftstr(arg,pos-1);
new=rightstr(arg,strlen(arg)-pos);
if ((!old) || (!new)) {
write("usage: @password old new\n");
return 1;
}
if (old==password) {
password=new;
write("@password: password changed\n");
} else
write("@password: failed\n");
return 1;
}
static do_recon(arg) {
object o;
if (!priv(this_object())) return 0;
o=resolve_object(arg);
if (!o) {
write("@recon: couldn't find object \""+arg+"\"\n");
return 1;
}
if (reconnect_device(o))
write("@recon: couldn't reconnect to object "+otoa(o)+"\n");
return 1;
}
static do_date(arg) {
write(mktime(time()));
return 1;
}
static do_wizlist(arg) {
object curr,type;
write("List of Wizards\n");
write("---------------\n");
curr=atoo("/obj/wiz");
curr=next_child(curr);
if (!curr) write ("There are no wizards.\n");
while (curr) {
type=call_other(curr,"get_type");
if (type==TYPE_WIZARD)
write(call_other(curr,"get_name")+", a wizard\n");
else if (type==TYPE_PROGRAMMER)
write(call_other(curr,"get_name")+", a programmer\n");
else
write(call_other(curr,"get_name")+"\n");
curr=next_child(curr);
}
return 1;
}
static do_wizcreate(arg) {
string name, password;
int pos;
object wizobj;
if (!priv(this_object())) return 0;
pos=instr(arg,1," ");
name=leftstr(arg,pos-1);
password=rightstr(arg,strlen(arg)-pos);
if (!name || !password) {
write("usage: @wizcreate name password\n");
return 1;
}
if (find_wiz(name)) {
write("@wizcreate: wizard \""+name+"\" already exists\n");
return 1;
}
if (find_player(name)) {
write("@wizcreate: player \""+name+"\" already exists\n");
return 1;
}
wizobj=clone_object("/obj/wiz");
call_other(wizobj,"set_secure");
call_other(wizobj,"set_name",name);
call_other(wizobj,"set_password",password);
write("@wizcreate: created "+otoa(wizobj)+"\n");
return 1;
}
static do_pcreate(arg) {
string name, password;
int pos;
object pobj;
if (!priv(this_object())) return 0;
pos=instr(arg,1," ");
name=leftstr(arg,pos-1);
password=rightstr(arg,strlen(arg)-pos);
if (!name || !password) {
write("usage: @pcreate name password\n");
return 1;
}
if (find_wiz(name)) {
write("@pcreate: wizard \""+name+"\" already exists\n");
return 1;
}
if (find_player(name)) {
write("@pcreate: player \""+name+"\" already exists\n");
return 1;
}
pobj=clone_object("/obj/player");
call_other(pobj,"set_secure");
call_other(pobj,"set_name",name);
call_other(pobj,"set_password",password);
move_object(pobj,atoo("/obj/room"));
write("@pcreate: created "+otoa(pobj)+"\n");
return 1;
}
static do_fry(arg) {
object o;
if (!priv(this_object())) return 0;
if (!arg) {
write("usage: @fry <object>\n");
return 1;
}
o=resolve_object(arg);
if (!o) {
write("@fry: couldn't find "+arg+"\n");
return 1;
}
destruct(o);
write("Ok.\n");
return 1;
}
static init() {
check_secure(SECURE_PRIV,NULL);
set_interactive();
path="/";
if (!prototype(this_object())) {
move_object(this_object(),atoo("/obj/room"));
return;
}
add_xverb("","do_huh");
add_verb("look","look");
add_verb("l","look");
add_verb("get","do_get");
add_verb("drop","do_drop");
add_verb("take","do_get");
add_verb("inventory","do_inventory");
add_verb("i","do_inventory");
add_verb("@replicate","do_replicate");
add_verb("@create","do_create");
add_verb("@set","do_set");
add_verb("@destroy","do_destroy");
add_verb("@recon","do_recon");
add_verb("@invis","do_invis");
add_verb("date","do_date");
add_verb("time","do_date");
add_verb("quit","do_quit");
add_verb("who","do_who");
add_verb("QUIT","do_quit");
add_verb("WHO","do_who");
add_verb("@load","do_compile");
add_verb("@edit","do_edit");
add_verb("cat","do_cat");
add_verb("ls","do_ls");
add_verb("rm","do_rm");
add_verb("cp","do_cp");
add_verb("cd","do_cd");
add_verb("mv","do_mv");
add_verb("pwd","do_pwd");
add_verb("mkdir","do_mkdir");
add_verb("rmdir","do_rmdir");
add_verb("hide","do_hide");
add_verb("unhide","do_unhide");
add_verb("chown","do_chown");
add_verb("@save","do_save");
add_verb("@shutdown","do_shutdown");
add_verb("@panic","do_panic");
add_verb("@priv","do_priv");
add_verb("@call","do_call");
add_verb("@clone","do_clone");
add_verb("@exam","do_exam");
add_verb("@move","do_move");
add_verb("say","do_say");
add_xverb("\"","do_say");
add_xverb(":","do_pose");
add_verb("pose","do_pose");
add_verb("help","do_help");
add_verb("chmod","do_chmod");
add_verb("?","do_help");
add_verb("wizlist","do_wizlist");
add_verb("@password","do_password");
add_verb("@fry","do_fry");
add_verb("@wizcreate","do_wizcreate");
add_verb("@pcreate","do_pcreate");
add_verb("@boot","do_boot");
add_verb("@force","do_force");
add_verb("@possess","do_possess");
add_verb("@stat","do_stat");
add_xverb("$","command_possessed");
add_verb("exits","do_exits");
add_verb("@loadhelp","do_loadhelp");
add_verb("man","do_man");
command("@loadhelp player");
command("@loadhelp builder");
command("@loadhelp programmer");
command("@loadhelp wizard");
command("@loadhelp manual");
}