#define SAVEFILE "/save/players" inherit "/std/living"; inherit "/inherit/interactive"; inherit "/inherit/find"; string password; void save(int nocount) { if(!nocount) { object o; int value; string *s; foreach(all_inventory(),o) value+=o->query_value(); set_property("lost_value",value); s=map_array(all_inventory(),"query_auto_load"); if(!sizeof(s)) s=0; set_property("auto_load",s); } if(!db_set(SAVEFILE,query_real_name(),save_object())) { write("Saving failed.\n"); } } void set_name(string s) { string tmp; name=s; set_short(capitalize(s+" the novice")); full_name=capitalize(name); full_name=replace(full_name," ","_"); tmp=db_get(SAVEFILE,s); if(tmp) restore_object(tmp); if(!query_long()) set_long(query_pronoun()+" looks like a tough person.\n"); move_object("/room/church"); clone_object("/obj/soul")->move(this_object()); } void out(string s) { write(sprintf("%-=78s\n",s)); } int take(object o,int mode) { int w; if(environment(o)==this_object()) { if(!mode) { write("You already have "+o->short()+"\n"); } return 1; } if(!o->query_get()) { write("You can't take "+o->short()+".\n"); return 1; } if(!add_weight(w=o->query_weight())) { write("You cannot carry more.\n"); return 0; } write("You take "+o->short()+".\n"); environment(o)->add_weight(-w); o->move(this_object()); tell_room(environment(), query_name()+" takes "+o->short()+".\n",({this_object()})); return 1; } int drop(object o,int mode) { if(environment()==environment(o) && mode) return 1; if(environment(o)!=this_object()) { write("You don't have "+o->short()+".\n"); return 0; } if(!unwield(o,1)) return 0; if(!o->query_drop(0)) return 0; add_weight(-o->query_weight()); o->move(environment()); write("You drop "+o->short()+".\n"); tell_room(environment(), query_name()+" drops "+o->short()+".\n",({this_object()})); return 1; } int give(object o,object to,int mode) { int w; if(environment(o)!=this_object()) { write("You don't have "+o->short()+".\n"); return 0; } if(!to->is_living()) { write(capitalize(to->short()+" can't take it.\n")); return 0; } if(environment(to)!=environment()) { write(to->query_name()+" isn't here.\n"); return 0; } if(!o->query_drop(0)) return 0; w=o->query_weight(); if(!o->add_weight(o)) { write(to->query_name()+" can't carry more.\n"); return 0; } add_weight(-o->query_weight()); o->move(to); to->given(o); write("You give "+o->short()+" to "+to->query_name()+".\n"); to->catch_tell(query_name()+" gives "+o->short()+" to you.\n"); tell_room(environment(), query_name()+" gives "+o->short()+" to "+to->query_name()+".\n", ({this_object(),to})); return 1; } int put(object o,object in,int mode) { int w; if(environment(o)!=this_object()) { write("You don't have "+o->short()+".\n"); return 0; } if(!in->query_prevent_insert()) { write("You can't put "+o->short()+" in "+in->short()+".\n"); return 0; } if(environment(in)!=environment() && environment(in)!=this_object()) { write(in->short()+" isn't here.\n"); return 0; } if(!o->query_drop(0)) return 0; w=o->query_weight(); if(!o->add_weight(o)) { write("You can't put more in "+in->query_name()+".\n"); return 0; } add_weight(-o->query_weight()); o->move(in); write("You put "+o->short()+" in "+in->query_short()+".\n"); tell_room(environment(), query_name()+" puts "+o->short()+" in "+in->query_name()+".\n", ({this_object()})); return 1; } void look(string s) { string tmp; object o; out(environment()->query_long()); foreach(all_inventory(environment()),o) { if(o==this_object()) continue; tmp=o->short(); if(tmp) write(" "+capitalize(tmp)+".\n"); } } mapping secure_cmds=([]); mapping cmds=([]); static string verb; string notify_fail; void set_notify_fail(string n) { notify_fail=n; } void query_notify_fail() { return notify_fail; } string query_verb() { return verb; } void catch_input(string str) { mixed tmp,tmp2; string arg; object o; int e; set_this_player(this_object()); if(str[0]=='\'') str="say "+str[1..1000000]; if(!sscanf(str,"%s %s",verb,arg)) verb=str; notify_fail="What?\n"; switch(verb) { case "wield": o=find_one_visible_object(arg,({environment(),this_object()})); if(take(o,1)) wield(o,0); break; case "unwield": o=find_one_visible_object(arg,({environment(),this_object()})); if(take(o,1)) unwield(o,0); break; case "shutdown": shutdown(); return; case "quit": save(); msg("\b1PRON left the game.\n",this_object()); selfdestruct(); return; case "i": case "inventory": notify_fail="You're not carrying anything.\n"; foreach(all_inventory(this_object()),o) { tmp=o->short(); if(tmp) { notify_fail=""; write(" "+capitalize(tmp)+".\n"); } } write(notify_fail); break; case "l": case "look": if(!arg) { look(); break; } if(!sscanf(arg,"at %s",arg)) { write("Look AT something, will you?\n"); break; } /* fall through */ case "x": case "exa": case "examine": if(!arg) { write("Examing what?\n"); break; } o=find_one_object(arg,({environment(),this_object()})); if(!o && environment()->id(arg)) o=environment(); if(!o) { write("There is no "+arg+" here.\n"); break; } notify_fail=o->query_long(); if(notify_fail) out(notify_fail); else write("You can't see it.\n"); break; case "take": case "get": if(!arg) { write("Take what?\n"); break; } tmp=get_visible_objects(arg,({environment(),this_object()}))-({this_object()}); if(!sizeof(tmp)) { write("There is no "+arg+" here.\n"); break; } map_array(tmp,take,0); break; case "drop": if(!arg) { write("Drop what?\n"); break; } tmp=get_visible_objects(arg,({this_object()})); if(!sizeof(tmp)) { write("There is no "+arg+" here.\n"); break; } foreach(tmp,o) drop(o,0); break; case "put": if(!arg) { write("Put what?\n"); break; } if(!sscanf(arg,"%s in %s",arg,tmp)) { write("Put what in what?\n"); break; } tmp2=get_visible_objects(arg,({environment(),this_object()}))-({this_object()}); if(!sizeof(tmp2)) { write("There is no "+arg+" here.\n"); break; } o=find_one_object(arg,({environment(),this_object()})); if(!o) { write("There is no "+arg+" here.\n"); break; } foreach(tmp2,tmp) if(take(tmp,1)) put(tmp,o,0); break; case "give": if(!arg) { write("Give what?\n"); break; } if(!sscanf(arg,"%s to %s",arg,tmp)) { write("Give what to whom?\n"); break; } tmp2=get_visible_objects(arg,({environment(),this_object()}))-({this_object()}); if(!sizeof(tmp2)) { write("There is no "+arg+" here.\n"); break; } o=present(tmp,environment()); if(!o || !living(o)) { write(capitalize(tmp)+" is not here.\n"); break; } foreach(tmp2,tmp) if(take(tmp,1)) give(tmp,o,0); break; case "say": if(!arg) { write("Say what?\n"); break; } write("You say: "+arg+"\n"); tell_room(environment(),query_name()+" says: "+arg+"\n",({this_object()})); break; case "who": tmp2=0; foreach(users(),o) { if(tmp=o->short()) { write(tmp+".\n"); tmp2++; } } write(tmp2+" player"+(tmp2==1?"":"s")+".\n"); break; case "help": if(!arg) arg="help"; tmp=read_bytes("/doc/help/"+replace(arg," ","_")); if(!tmp) if(o=find_one_object(arg,({environment(),this_object()}))) tmp=o->help(arg); if(!tmp) tmp=environment()->help(arg); if(tmp) { if(tmp[-1]!='\n') tmp+="\n"; write(tmp); }else{ write("No such help available.\n"); } break; case "bug": case "idea": case "typo": case "praise": /* theese needs to be improved */ if(!arg) { write("You must state what you like to "+verb+".\n"); }else{ tmp=hash_name(environment()); if(!tmp) tmp=file_name(environment()); log_file("REPORTS", sprintf("%s by %s %s in %s:\n %s\n", verb,query_real_name(),ctime(time()),tmp,arg)); write("Thank you.\n"); } break; case "score": write("You have "+cents_to_string(query_money())+".\n"); break; case "save": save(); write("Ok.\n"); break; case "finger": case "tell": case "converse": case "shout": write("Not yet implemented.\n"); break; default: /* the secure commands needs to be moved before the * switch if a 'filter' is added before the switch() */ if(tmp=secure_cmds[verb]) { if(file_name(previous_object())=="/secure/ip") { if(search_array(tmp,0,arg)!=-1) break; }else{ write("Security alert!!!\n"); return; } } if(tmp=cmds[verb]) if(search_array(tmp,0,arg)!=-1) break; if(!command(str)) write(notify_fail); case "": } write("> "); } /* this is only efficient when adding commands to the playerobject * more or less permanently (due to slow remove_cmd) */ mixed add_cmd(string verb,function f) { mixed tmp; if(tmp=cmds[verb]) { cmds[verb]=({f})+(tmp-({0})); }else{ cmds[verb]=({f}); } } mixed remove_cmd(mixed any) { if(objectp(any)) { if(any!=previous_object()) return; cmds=map_mapping(cmds,lambda(function *funs,object o) { return filter_array(funs,lambda(function f,object any) { return f && function_object(f)!=any; },o); },any); }else if(functionp(any)){ cmds=map_mapping(cmds,lambda(function *funs,function f) { return funs-({0,f}); },any); }else if(stringp(any)){ if(cmds[any]) { cmds[any]=filter_array(cmds[any],lambda(function f,object any) { return f && function_object(f)!=any; },previous_object()); } }else if(pointerp(any)){ map_array(any,remove_cmd); }else if(listp(any)){ map_array(indices(any),remove_cmd); }else{ write("Odd type to remove_cmd()\n"); } } void set_ld(int l) { if(l) { msg("\n1PRON suddenly turns into a stone statue.\n",this_object()); } }