mud/lib/secure/obj/medtric.c
2020-09-06 05:43:07 -07:00

1351 lines
53 KiB
C

#include <lib.h>
#include <vendor_types.h>
inherit LIB_ITEM;
void analyze(string butt);
object scanner,tricorder,person;
object *gstuff,*ngstuff;
mixed *statlist,*skilllist;
mapping this_stat,this_skill;
int allowed,statpoints,statlevel,statclass,tempint,i;
int skilllevel,skillclass,skillpoints;
string name;
string *stumps;
string warning = "We remind you that the tricorder cannot speak. In the event "+
"that it does speak, you are instructed to disregard its advice.";
void create(){
item::create();
SetKeyName("creator tricorder");
SetId(({"tricorder","scanner","device","tool","medtric","tric"}));
SetAdjectives(({"electronic","admin","diagnostic"}));
SetShort("a medical tricorder");
SetLong("This is a palm-sized electronic device designed to run various "+
"medical tests and provide treatment of disease and injury. "+
"Written in bold red letters across its face are the words: \"%^BOLD%^RED%^FOR AUTHORIZED TEST CHARACTER "+
"USE ONLY%^RESET%^\".\n%^YELLOW%^NOTE: Some functions do not work "+
"with drones. This is due to safeguards in the master object security "+
"model, and it will not be \"fixed\".%^RESET%^\n"+
"There is a warning on the tricorder you can read.\n"+
"\n Labeled buttons on this device read:\n"+
//"* medscan: scan for disease, poison, etc\t%^RED%^offline%^RESET%^\n"+
"* fscan: readout of all files inherited\t\t%^GREEN%^ONLINE%^RESET%^\n"+
//"* enshadow: move a shadow to an object\t\t%^RED%^offline%^RESET%^\n"+
"* deshadow: remove all shadows from an object\t%^GREEN%^ONLINE%^RESET%^\n"+
//"* inject: insert substance into patient\t\t%^RED%^offline%^RESET%^\n"+
"* extract: remove a foreign body or substance\t%^GREEN%^ONLINE%^RESET%^ (slugs only)\n"+
"* modhealth: raise or lower health level\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modcaff: raise or lower caffeine level\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modalc: raise or lower alcohol level\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modfood: raise or lower food level\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* moddrink: raise or lower drink level\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modmag: raise or lower magic level\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modstam: raise or lower stamina\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* modtox: raise or lower poison\t\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* setskill: set skill level\t\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* setstat: set stat level\t\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* amputate: remove limb\t\t\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* regenerate: restore all amputated limbs\t%^GREEN%^ONLINE%^RESET%^\n"+
"* cure: eliminate known diseases\t\t%^GREEN%^ONLINE%^RESET%^\n"+
"* infect: introduce disease into patient\t%^GREEN%^ONLINE%^RESET%^\n"+
//"* inoculate: raise immunity to a disease\t%^RED%^offline%^RESET%^\n"+
//"* posture: change your own posture.\t\t%^RED%^offline%^RESET%^\n"+
"");
SetRead( "default" , warning);
SetRead( "warning", warning );
SetProperties(([
"no steal" : 1,
]));
SetMass(12);
SetVendorType(VT_TREASURE);
}
void init(){
::init();
add_action("fscan","fscan");
add_action("assess","assess");
add_action("assess","diagnose");
add_action("extract","extract");
add_action("addhp","addhp");
add_action("addhp","modhealth");
add_action("modcaff","modcaff");
add_action("modalc","modalc");
add_action("modfood","modfood");
add_action("moddrink","moddrink");
add_action("modmag","modmag");
add_action("modstam","modstam");
add_action("modtox","modtox");
add_action("setstat","setstat");
add_action("setskill","setskill");
add_action("regenerate","regenerate");
add_action("amputate","amputate");
add_action("infect","infect");
add_action("germ_scan","germscan");
add_action("germ_squash","cure");
add_action("medscan","medscan");
add_action("posture","posture");
add_action("enshadow","enshadow");
add_action("deshadow","deshadow");
add_action("TestFun","HEINEKEN");
}
int TestFun(){
write("WOOHOO");
return 1;
}
varargs int preAction(int restricted){
scanner=this_player();
tricorder=this_object();
if(!this_player()) return 0;
if(!present(tricorder, scanner)){
write("You are not holding the tricorder.");
return 2;
}
if(restricted && !creatorp(this_player())){
write("This function is not permitted to builders.");
return 2;
}
if(!builderp(this_player())){
write("Your puny mortal mind can't wrap itself around the use "
"of this powerful instrument.");
log_file("adm/tricorder",capitalize(this_player()->GetKeyName())+
" attempted to use the medical tricorder: "+timestamp()+"\n");
tell_creators("SECURITY: "+capitalize(this_player()->GetKeyName())+
" attempted to use the medical tricorder.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 2;
}
say(scanner->GetName()+" operates a medical tricorder.",scanner);
write("The tricorder makes a low, warbling sound.");
return 1;
}
int posture(int i){
allowed=preAction();
if(allowed == 2) return 1;
if(!i) {
write("Please include the position number desired.");
return 0;
}
this_player()->SetPosition(i);
return i;
}
int deshadow(string str){
object target;
allowed=preAction(1);
if(allowed == 2) return 1;
if(str == "me") str = this_player()->GetKeyName();
if(!target = present(str,this_player())){
target = present(str,environment(this_player()));
}
if(!target){
write("That's not here.");
return 1;
}
else {
if(shadow(target,0)){
remove_shadow(target);
write("You deshadow "+str);
}
else write("No shadows there.");
}
return 1;
}
int enshadow(string str){
object target;
string s1,s2,s3,file;
allowed=preAction(1);
if(allowed == 2) return 1;
if(sscanf(str,"%sshadow/%s %s",s1,s2,s3) > 0) file = s2;
else if(sscanf(str,"%sshadow/%s.c %s",s1,s2,s3) > 0) file = s2;
else if(sscanf(str,"%s %s",s1,s2) > 0) file = s1;
else {
write("You must specify a file within /shadows and a target.");
return 1;
}
if( s3 && s3 != "") target = present(s3,environment(this_player()));
else if(s3 == "me") target = this_player();
else target = present(s2,environment(this_player()));
if(!target) {
write("Please specify a file within /shadows and a target.");
return 1;
}
if(file_size("/shadow/"+file) < 1){
write("That is not a valid shadow.");
return 1;
}
new("/shadow/"+file)->eventShadow(target);
write("You enshadow "+target->GetName()+" with /shadow/"+file);
return 1;
}
int medscan(string str){
allowed=preAction();
if(allowed == 2) return 1;
if(!str || str == "") {
write("Please rephrase, including your target this time.");
return 1;
}
if(str == "me") str = this_player()->GetKeyName();
person=present(str,environment(scanner));
if(!person || !living(person)){
write("Disease check: No such being found");
return 1;
}
write("Scanning for germs...");
this_object()->germ_scan(str);
write("Germ scan complete.\n");
write("Wound scan currently offline.");
return 1;
}
int germ_scan(mixed strob ){
int i;
string a,b,c,str;
if(stringp(strob)) {
str = strob;
if(str == "me") str = this_player()->GetKeyName();
person=present(str,environment(scanner));
if(!person || !living(person)){
write("This being was not found.");
return 2;
}
}
if(objectp(strob)){
person = strob;
str = person->GetName();
}
if(!str || str == "") {
write("Please rephrase, including your target this time.");
return 1;
}
if(!living(person)){
write("This thing is not alive.");
return 2;
}
ngstuff=all_inventory(person);
gstuff = ({});
say(scanner->GetName()+" waves a tricorder at "+person->GetName()+".",({scanner,person}) );
tell_object(person,scanner->GetName()+" waves a tricorder at you.");
for(i=0;i<sizeof(ngstuff);i++){
if(ngstuff[i]->isGerm()== 1 && !sizeof(gstuff)) gstuff = ({ngstuff[i]});
if(ngstuff[i]->isGerm()== 1 && sizeof(gstuff) > 0 ) gstuff += ({ngstuff[i]});
}
if(!sizeof(gstuff)){
write(person->GetName()+" has no detectable diseases.");
return 2;
}
for(i=0;i<sizeof(gstuff);i++){
if(!a=gstuff[i]->GetKeyName() || a == "" ) a = "generic disease";
if(!b=gstuff[i]->GetType() || b == "" ) b = "unknown type";
if(intp(gstuff[i]->GetCure())) c=gstuff[i]->GetCure();
if(!c) c = 0;
write("Disease: "+a+", type: "+b+", severity: "+c);
return 1;
}
write("Please specify a living being that shares your current location.");
return 2;
}
int germ_squash(string str){
int i,bar,c;
object array whom;
allowed=preAction(1);
if(allowed == 2) return 1;
if(!str || str == "") {
write("Please specify a living thing, or \"all\" for everything in "+
"your environment.");
return 1;
}
if(str == "me") str = this_player()->GetKeyName();
person=present(str,environment(scanner));
whom = ({});
if(!person && str !="all"){
write("Disease check: No such being found");
return 1;
}
if( str !="all" && !living(person)){
write("Disease check: No such living being found");
return 1;
}
if(str =="all") whom = get_livings(environment(this_player()));
if(str !="all") whom = ({person});
foreach(object ingrate in whom){
i=germ_scan(ingrate);
if(i!=2 && intp(gstuff[i]->GetCure()) ) bar=gstuff[i]->GetCure();
if(i!=2 && !intp(gstuff[i]->GetCure()) ) write("GetCureType: "+typeof(gstuff[i]->GetCure()));
if(!i) { write("Extremely weird error here."); return 1; }
for(i=0;i<sizeof(gstuff);i++){
if(gstuff[i] && gstuff[i]->isGerm() ){
c=10;
gstuff[i]->SetCure(c);
if(intp(gstuff[i]->GetCure()) ){
gstuff[i]->eventCure(ingrate,c,gstuff[i]->GetType());
write("You cure "+ingrate->GetName()+"'s disease.");
say(ingrate->GetName()+" looks healthier.",ingrate);
tell_object(ingrate,"You feel less sick.");
}
if(gstuff[i] && gstuff[i]->isGerm() && !intp(gstuff[i]->GetCure())){
write("This disease uses a functional as its SetCure condition.");
write("It will not be cured by this device. You will have to "+
"manually review the germ's code to determine what will cure it.");
write("SetCure() data type: "+typeof(gstuff[i]->GetCure()));
write("Filename: "+base_name(gstuff[i])+"\n");
}
}
}
gstuff=({});
}
return 1;
}
int infect(string str){
string whom,what,disease;
object ob;
mixed foo;
allowed=preAction(1);
if(allowed == 2) return 1;
if(!str){
write("Please indicate whom to infect, and with what. Example:");
write("infect doofus cold");
write("Current valid diseases: cold, flu, fleas, lice, h1n1");
return 1;
}
if(sscanf(str,"%s %s",whom,what)) {
if(!whom || !what || whom == "" || what == ""){
write("Please indicate whom to infect, and with what. Example:");
write("infect doofus cold");
write("Current valid diseases: cold, flu, fleas, lice");
return 1;
}
}
if(!whom || !what || whom == "" || what == ""){
write("Please indicate whom to infect, and with what. Example:");
write("infect doofus cold");
write("Current valid diseases: cold, flu, fleas, lice");
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
person=present(whom,environment(scanner));
if(!person || !living(person)){
write("This being was not found.");
return 1;
}
if(what == "cold") disease = "/domains/town/obj/cold";
else if(what == "flu") disease = "/domains/town/obj/flu";
else if(what == "fleas") disease = "/domains/town/obj/fleas";
else if(what == "lice") disease = "/domains/town/obj/lice";
else if(what == "rage") disease = "/domains/town/obj/rage";
else if(what == "h1n1") disease = "/domains/town/obj/h1n1";
else if(what != "") {
write("That isn't a valid disease.");
return 1;
}
if(person){
write(person->GetName()+" located. Infecting...");
say(scanner->GetName()+" waves a tricorder at "+person->GetName()+".",person);
if(present(whom,environment(scanner))) {
tell_object(person,scanner->GetName()+" waves a tricorder at you.");
}
}
ob=new(disease);
if(ob) foo = ob->eventInfect(person);
else write("There's a problem with that parasite.");
return 1;
}
int amputate(string str){
string whom,which,limb,both;
allowed=preAction();
if(allowed == 2) return 1;
if(!str){
write("Please indicate whose limbs you wish to amputate, and which. Example:");
write("amputate joey left hand");
return 1;
}
if(sscanf(str,"%s %s %s",whom,which,limb)) {
if(!limb) sscanf(str,"%s %s",whom,limb);
}
if(whom && whom == "me") whom = this_player()->GetKeyName();
if(!whom || !limb){
write("Please indicate whose limbs you wish to amputate, and which. Example:");
write("amputate joey left hand");
return 1;
}
if(!person=present(whom,environment(scanner))){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
both = limb;
if(which && which !="") both = which+" "+limb;
//write("both: "+both);
if(!person->RemoveLimb(both, scanner)){
write("You wave your tricorder menacingly, but nothing happens.");
tell_room(environment(person),scanner->GetName()+" waves a tricorder at "+person->GetName()+" in a threatening manner.", ({ scanner,person }) );
tell_object(person,scanner->GetName()+" waves "+possessive(scanner)+" tricorder menacingly at you.");
return 1;
}
if(both == "head"){
tell_room(environment(person),scanner->GetName()+" waves a tricorder at "+person->GetName()+", and "+
person->GetName()+"'s head falls off!", ({ scanner,person }) );
write("You decapitate "+person->GetName()+".");
tell_object(person,scanner->GetName()+" decapitates you with a wave of "+possessive(scanner)+" tricorder!");
//person->RemoveLimb(both, scanner);
return 1;
}
stumps=person->GetLimbs();
if(!stumps) {
write(person->GetName()+" hasn't any limbs.");
say(scanner->GetName()+" waves a tricorder at "+person->GetName()+".",scanner,person);
tell_object(person,scanner->GetName()+" waves a tricorder at you.");
return 1;
}
if(member_array(both,stumps) != -1){
person->RemoveLimb(both, scanner);
write("You amputate "+person->GetName()+"'s "+both);
say(scanner->GetName()+" has amputated "+person->GetName()+"'s "+both+" "+
"with an energy beam from a medical tricorder.",scanner,person);
tell_object(person,scanner->GetName()+" waves a tricorder at you and "+
"your "+both+" is severed.");
return 1;
}
if(member_array(limb,stumps)!= -1){
//person->RemoveLimb(limb, scanner);
write("You amputate "+person->GetName()+"'s "+limb+".");
say(scanner->GetName()+" has amputated "+person->GetName()+"'s "+both+" "+
"with an energy beam from a medical tricorder.",scanner,person);
tell_object(person,scanner->GetName()+" waves a tricorder at you and"+
"your "+limb+" is severed.");
return 1;
}
//write("There is some sort of problem, it looks like. No "+
//"limbs are severed.");
return 1;
}
int regenerate(string str){
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Please indicate whose limbs you wish to regenerate.");
return 1;
}
if(str == "me") str = this_player()->GetKeyName();
if(!person=present(str,environment(scanner))){
write(capitalize(str)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
stumps=person->GetMissingLimbs();
if(!stumps) {
write(person->GetName()+" isn't missing any limbs.");
say(scanner->GetName()+" waves a tricorder at "+person->GetName()+".",scanner,person);
tell_object(person,scanner->GetName()+" waves a tricorder at you.");
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
for(i=0;i<sizeof(stumps);i++){
person->RestoreLimb(stumps[i]);
write("You regenerate "+person->GetName()+"'s "+stumps[i]+".");
say(scanner->GetName()+" regenerates "+person->GetName()+"'s "+stumps[i]+".",scanner,person);
tell_object(person,scanner->GetName()+" regenerates your "+stumps[i]+".");
}
return 1;
}
int DoSkillChange(string str, int i){
int more_or_less;
if(str == "me") str = this_player()->GetKeyName();
this_skill = person->GetSkill(str);
if(this_skill["level"] < i) more_or_less = 1;
skillclass=this_skill["class"];
person->SetSkill(str,i,skillclass);
say(scanner->GetName()+" waves a medical tricorder at "+person->GetName()+".",({person,scanner}));
tell_object(person,scanner->GetName()+" waves a medical tricorder at you.");
if(more_or_less == 1) tell_room(environment(person), person->GetName()+" looks somehow more experienced.",({person}) );
if(more_or_less != 1) tell_room(environment(person), person->GetName()+" looks somehow less experienced.",({person}) );
write("You've set "+person->GetName()+"'s "+str+" to level "+i+".");
return 1;
}
int DoAllSkills(int foo){
int i;
for(i=0;i<sizeof(skilllist);i++){
this_skill = person->GetSkill(skilllist[i]);
skillclass=this_skill["class"];
person->SetSkill(skilllist[i],foo,skillclass);
write("You've set "+person->GetName()+"'s "+skilllist[i]+" to level "+foo+".");
}
say(scanner->GetName()+" waves a medical tricorder at "+person->GetName()+".",({person,scanner}));
say(person->GetName()+" seems to undergo an almost undetectable, subtle transformation.",({person,scanner}));
tell_object(person,scanner->GetName()+" waves a medical tricorder at you.");
return 1;
}
int setskill(string str){
string whom,skill;
string skill1,skill2,rubbish;
int amt;
allowed=preAction();
if(allowed==2) return 1;
if(!str) {
write("Syntax: setskill <person> <skill> <amount>");
write("If there is a space in the skill name, replace it with "+
"an underscore. Example:\nsetskill schmucky blade_attack 5");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!sscanf(str,"%s %s %d",whom,skill,amt)) { sscanf(str,"%s %s",whom,skill); }
if(sscanf(str,"%s %s_%s ",rubbish,skill1,skill2) && skill1 && skill2){
whom = rubbish;
skill = skill1 + " " +skill2;
}
write("skill: "+skill);
if(!whom || whom == ""){
write("Syntax: setskill <person> <skill> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!person=present(whom,environment(scanner))){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
this_skill = ([]);
skilllist = ({});
skilllist = person->GetSkills();
if(amt < 0) amt = 0;
if(allowed==2) return 1;
if ( !whom || !skill || !amt || !intp(amt) ){
write("Syntax: setskill <person> <skill> <amount>");
write("If there is a space in the skill name, replace it with "+
"an underscore. Example:\nsetskill schmucky blade_attack 5");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(skill == "all") { DoAllSkills(amt); return 1; }
if(member_array(skill,skilllist) == -1) {
write(capitalize(whom)+" doesn't have that skill.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
DoSkillChange(skill, amt);
return 1;
}
int DoStatChange(string str, int i){
if(str == "me") str = this_player()->GetKeyName();
this_stat = person->GetStat(str);
statclass=this_stat["class"];
person->SetStat(str,i,statclass);
say(scanner->GetName()+" waves a medical tricorder at "+person->GetName()+".",({person,scanner}));
tell_object(person,scanner->GetName()+" waves a medical tricorder at you.");
write("You've set "+person->GetName()+"'s "+str+" to level "+i+".");
return 1;
}
int DoAllStats(int foo){
int i;
for(i=0;i<sizeof(statlist);i++){
this_stat = person->GetStat(statlist[i]);
statclass=this_stat["class"];
person->SetStat(statlist[i],foo,statclass);
write("You've set "+person->GetName()+"'s "+statlist[i]+" to level "+foo+".");
}
say(scanner->GetName()+" waves a medical tricorder at "+person->GetName()+".",({person,scanner}));
tell_object(person,scanner->GetName()+" waves a medical tricorder at you.");
return 1;
}
int setstat(string str){
string whom,stat;
int amt;
allowed=preAction();
if(allowed==2) return 1;
if(!str) {
write("Syntax: setstat <person> <stat> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!sscanf(str,"%s %s %d",whom,stat,amt)) { sscanf(str,"%s %s",whom,stat); }
if(!whom || whom == ""){
write("Syntax: setstat <person> <stat> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!person=present(whom,environment(scanner))){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
this_stat = ([]);
statlist = ({});
statlist = person->GetStats();
if(amt < 0) amt = 0;
if(allowed==2) return 1;
if ( !whom || !stat || !amt || !intp(amt) ){
write("Syntax: setstat <person> <stat> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(stat == "all") { DoAllStats(amt); return 1; }
if(member_array(stat,statlist) == -1) {
write(capitalize(whom)+" doesn't have that stat.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
DoStatChange(stat, amt);
return 1;
}
int modstam(string str, int stamina){
string whom;
int tempint,staminalevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modstam <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,stamina);
if (!whom || !stamina){
write("Syntax: modstam <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(stamina)){
write("Syntax: modstam <person> <amount>");
write("Where <amount> is an integer. For example:\nmodstam joe 3\nmodstam mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
staminalevel=person->GetStaminaPoints();
tempint = staminalevel + stamina;
if(tempint < 0) {
stamina = stamina + absolute_value(tempint);
}
person->AddStaminaPoints(stamina);
if(stamina > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks a bit more at ease.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel stronger.");
write("You've raised "+capitalize(whom)+"'s stamina level by "+stamina+" points.");
return 1;
}
if(stamina < 0){
stamina=absolute_value(stamina);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks uncomfortable.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel weaker.");
write("You've lowered "+capitalize(whom)+"'s stamina level by "+stamina+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int modtox(string str, int poison){
string whom;
int tempint,poisonlevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modtox <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,poison);
if (!whom || !poison){
write("Syntax: modtox <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(poison)){
write("Syntax: modtox <person> <amount>");
write("Where <amount> is an integer. For example:\nmodtox joe 3\nmodtox mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
poisonlevel=person->GetPoison();
tempint = poisonlevel + poison;
if(tempint < 0) {
poison = poison + absolute_value(tempint);
}
person->AddPoison(poison);
if(poison > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks paler and shaky.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel ill.");
write("You've raised "+capitalize(whom)+"'s poison level by "+poison+" points.");
return 1;
}
if(poison < 0){
poison=absolute_value(poison);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks less ill.", ({person,scanner})
);
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel better than before.");
write("You've lowered "+capitalize(whom)+"'s poison level by "+poison+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int modmag(string str, int magic){
string whom;
int tempint,magiclevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modmagic <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,magic);
if (!whom || !magic){
write("Syntax: modmagic <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(magic)){
write("Syntax: modmagic <person> <amount>");
write("Where <amount> is an integer. For example:\nmodmagic joe 3\nmodmagic mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
magiclevel=person->GetMagicPoints();
tempint = magiclevel + magic;
if(tempint < 0) {
magic = magic + absolute_value(tempint);
}
person->AddMagicPoints(magic);
if(magic > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" glows briefly.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel more magical.");
write("You've raised "+capitalize(whom)+"'s magic level by "+magic+" points.");
return 1;
}
if(magic < 0){
magic=absolute_value(magic);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks somehow more plain.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel less magical.");
write("You've lowered "+capitalize(whom)+"'s magic level by "+magic+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int moddrink(string str, int drink){
string whom;
int tempint,drinklevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: moddrink <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,drink);
if (!whom || !drink){
write("Syntax: moddrink <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(drink)){
write("Syntax: moddrink <person> <amount>");
write("Where <amount> is an integer. For example:\nmoddrink joe 3\nmoddrink mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
drinklevel=person->GetDrink();
tempint = drinklevel + drink;
if(tempint < 0) {
drink = drink + absolute_value(tempint);
}
person->AddDrink(drink);
if(drink > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks a bit more at ease.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel more hydrated.");
write("You've raised "+capitalize(whom)+"'s drink level by "+drink+" points.");
return 1;
}
if(drink < 0){
drink=absolute_value(drink);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks uncomfortable.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel thirstier.");
write("You've lowered "+capitalize(whom)+"'s drink level by "+drink+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int modfood(string str, int food){
string whom;
int tempint,foodlevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modfood <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,food);
if (!whom || !food){
write("Syntax: modfood <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(food)){
write("Syntax: modfood <person> <amount>");
write("Where <amount> is an integer. For example:\nmodfood joe 3\nmodfood mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
foodlevel=person->GetFood();
tempint = foodlevel + food;
if(tempint < 0) {
food = food + absolute_value(tempint);
}
person->AddFood(food);
if(food > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks a bit more at ease.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel more nourished.");
write("You've raised "+capitalize(whom)+"'s food level by "+food+" points.");
return 1;
}
if(food < 0){
food=absolute_value(food);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks uncomfortable.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel hungrier.");
write("You've lowered "+capitalize(whom)+"'s food level by "+food+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int modcaff(string str, int caff){
string whom;
int tempint,cafflevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modcaff <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,caff);
if (!whom || !caff){
write("Syntax: modcaff <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(caff)){
write("Syntax: modcaff <person> <amount>");
write("Where <amount> is an integer. For example:\nmodcaff joe 3\nmodcaff mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
cafflevel=person->GetCaffeine();
tempint = cafflevel + caff;
if(tempint < 0) {
caff = caff + absolute_value(tempint);
}
person->AddCaffeine(caff);
if(caff > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks a bit keener.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel tipsy.");
write("You've raised "+capitalize(whom)+"'s caffeine level by "+caff+" points.");
return 1;
}
if(caff < 0){
caff=absolute_value(caff);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks more focused and alert.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel more awake.");
write("You've lowered "+capitalize(whom)+"'s caffeine level by "+caff+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int modalc(string str, int alc){
string whom;
int tempint,alclevel;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: modalc <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,alc);
if (!whom || !alc){
write("Syntax: modalc <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(alc)){
write("Syntax: modalc <person> <amount>");
write("Where <amount> is an integer. For example:\nmodalc joe 3\nmodalc mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
alclevel=person->GetAlcohol();
tempint = alclevel + alc;
if(tempint < 0) {
alc = alc + absolute_value(tempint);
}
person->AddAlcohol(alc);
if(alc > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks dizzier and more disoriented.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel tipsy.");
write("You've raised "+capitalize(whom)+"'s alcohol level by "+alc+" points.");
return 1;
}
if(alc < 0){
alc=absolute_value(alc);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks more focused and alert.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel more sober.");
write("You've lowered "+capitalize(whom)+"'s alcohol level by "+alc+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int addhp(string str, int hp){
string whom;
object person;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Syntax: addhp <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s %d",whom,hp);
if (!whom || !hp){
write("Syntax: addhp <person> <amount>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
if(!intp(hp)){
write("Syntax: addhp <person> <amount>");
write("Where <amount> is an integer. For example:\naddhp joe 3\naddhp mike -10\n");
say(scanner->GetName()+" fumbles stupidly with a medical tricorder.",scanner);
return 1;
}
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
person->AddHP(hp);
if(hp > 0){
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks stronger and more refreshed.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel stronger and more refreshed.");
write("You've raised "+capitalize(whom)+"'s health by "+hp+" points.");
return 1;
}
if(hp < 0){
hp=absolute_value(hp);
say(scanner->GetName()+" points a medical tricorder at "+capitalize(whom)+", "+
"and "+nominative(person)+" looks weaker and duller.", ({person,scanner}) );
tell_object(person,scanner->GetName()+" points a medical tricorder at you and you "+
"suddenly feel weaker and more frail.");
write("You've lowered "+capitalize(whom)+"'s health by "+hp+" points.");
return 1;
}
write("Aucun effet.");
return 1;
}
int extract(string str){
string what,whom;
object person, slug;
int rifleshot_wounds,firearms_wounds,wounds;
allowed=preAction();
if(allowed==2) return 1;
if(!str){
write("Extract what from whom?");
write("Example: extract slug from <person>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
sscanf(str,"%s from %s",what,whom);
if (!what || ! whom){
write("Extract what from whom?");
write("Example: extract slug from <person>");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(whom == "me") whom = this_player()->GetKeyName();
person=present(whom,environment(scanner));
if(!person){
write(capitalize(whom)+" isn't here.");
say(scanner->GetName()+" fumbles with a medical tricorder.",scanner);
return 1;
}
if(!creatorp(this_player()) && strsrch(base_name(person), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
slug=present("firearms_wound",person);
wounds=0;
wounds=person->GetLead("gunshot_wounds");
wounds+=person->GetLead("rifleshot_wounds");
if(!slug && what=="slug"){
write(capitalize(whom)+" has no gunshot injury.");
say(scanner->GetName()+" looks a bit silly waving a medical tricorder at "+capitalize(whom)+".",({ scanner, person }) );
tell_object(person,scanner->GetName()+" looks a bit silly waving a medical tricorder at you.");
return 1;
}
if(slug && what=="slug" && wounds > 0 ){
write("You extract a lead slug from "+capitalize(whom)+"'s body.");
say(scanner->GetName()+" deftly extracts a lead slug from "+capitalize(whom)+" with a medical tricorder.",({ scanner, person }) );
tell_object(person,scanner->GetName()+" deftly extracts a lead slug from you with a medical tricorder.");
firearms_wounds=person->GetLead("firearms_wounds");
rifleshot_wounds=person->GetLead("rifleshot_wounds");
slug=new("/domains/town/obj/spent");
if(person->GetLead("gunshot_wounds") > 0) {
person->AddLead("gunshot_wounds", -1);
slug->SetShort("a spent pistol slug");
--wounds;
slug->eventMove(environment(scanner));
if(person->GetLead() < 1){
slug=present("firearms_wound",person);
if(slug) slug->eventDestruct();
return 1;
}
return 1;
}
if(person->GetLead("rifleshot_wounds") > 0) {
person->AddLead("rifleshot_wounds", -1);
slug->SetShort("a spent rifle slug");
--wounds;
slug->eventMove(environment(scanner));
if(person->GetLead() < 1){
if(slug) slug->eventDestruct();
slug=present("firearms_wound",person);
if(slug) slug->eventDestruct();
return 1;
}
}
slug->eventMove(environment(scanner));
slug=present("firearms_wound",person);
if(wounds < 1 && slug){
slug->eventDestruct();
return 1;
}
}
return 1;
}
int fscan(string str){
object ob;
object *stuffs;
mixed *stuff;
allowed=preAction();
if(allowed==2) return 1;
if(!str || str=="" || str=="here") {
ob = environment(this_player());
name = ob->GetShort();
str = base_name(ob);
}
if(str == "me") str = this_player()->GetKeyName();
if(present(str,this_player())) {
ob = present(str,this_player());
name = ob->GetName();
}
if(present(str,environment(this_player()))) {
ob=present(str,environment(this_player()));
name = ob->GetName();
}
if(!ob){
write("The tricorder fails to locate any such person, object, or environment.\n");
say(this_player()->GetName()+" scans around aimlessly with "+
" a medical tricorder.\n");
return 1;
}
write("You perform a file scan of "+name+".\n\n");
write("\n"+name+" is in posession of the following items:");
write("-------------------------------------------");
say(this_player()->GetName()+" performs a tricorder scan of "+name+".\n",ob);
tell_object(ob,this_player()->GetName()+" scans you with "+
"a medical tricorder.\n");
stuffs=deep_inventory(ob);
filter(stuffs, (: this_object()->analyze(file_name($1)) :), this_object());
filter(stuffs, (: this_object()->getname($1) :), this_object());
stuff=deep_inherit_list(ob);
write("\n"+name+" is composed of the following files:\n");
write("-------------------------------------------");
foreach(mixed gene in deep_inherit_list(ob)) {
if(!stringp(gene)) break;
if(!gene) gene="";
write(gene);
}
write("\nSCAN COMPLETE");
return 1;
}
void analyze(string str){
string temp, temp2;
sscanf(str,"%s#%s",temp,temp2);
if(temp=="/lib/corpse"){
write("Found a corpse. Absolute name:\n"+str);
return;
}
return;
}
string getname(object ob){
string temp, temp2;
if(!ob) return "No object found.";
else
sscanf(file_name(ob),"%s#%s",temp,temp2);
write(ob->GetName()+",\t\tfilename: "+temp+".c");
return ob->GetName();
}
mixed assess(string args) {
string *lines, *arr, *limbs;
object ob;
string tmp1, tmp2;
int i, x, y, cols;
if( args == "" || !args ) return 0;
if(args == "me") args = this_player()->GetKeyName();
if( !(ob = present(args, environment(this_player()))) )
if( !(ob = find_player(convert_name(args))) &&
!(ob = find_living(lower_case(args))) )
return capitalize(args) + " is nowhere to be found.";
if( creatorp(ob) ) return "You cannot get stat information on a creator.";
if(!creatorp(this_player()) && strsrch(base_name(ob), homedir(this_player()))){
write("Builders can only do this to NPC's that belong to them.");
return 1;
}
if(tmp1 = ob->GetGender()) {
cols = ((int *)this_player()->GetScreen())[0];
tmp1 = ob->GetCapName() + " aka " + ob->GetShort() +
", level " + ob->GetLevel() + " " + ob->GetGender();
if( !(tmp2 = ob->GetRace()) ) tmp2 = "blob";
tmp1 += " " + tmp2;
if( !(tmp2 = ob->GetClass()) ) tmp2 = "drifter";
tmp1 += " " + capitalize(tmp2);
if( tmp2 = ob->GetSpouse() )
tmp1 += " (spouse: " + tmp2 + ")";
lines = ({ center(tmp1, cols) });
if( ob->GetUndead() ) tmp1 = "Undead";
else tmp1 = "Alive";
if( ob->GetSleeping() ) tmp1 += " / Sleeping";
else tmp1 += " / Awake";
if( ob->GetParalyzed() ) tmp1 += " / Paralyzed";
lines += ({ center(tmp1, cols), "" });
lines += ({ center("Health: " +ob->GetHealthPoints() + "/"+
ob->GetMaxHealthPoints() + " Magic: " +
ob->GetMagicPoints() + "/" +
ob->GetMaxMagicPoints() + " Stamina: " +
ob->GetStaminaPoints() + "/" +
to_int((float)ob->GetMaxStaminaPoints()) + " Carry: " +
ob->GetCarriedMass() + "/" +
ob->GetMaxCarry(), cols) });
lines += ({ center("Food: " + ob->GetFood() + " " +
"Drink: " + ob->GetDrink() + " " +
"Alcohol: " + ob->GetAlcohol() + " " +
"Caffeine: " + ob->GetCaffeine() + " " +
"Poison: " + ob->GetPoison() + " ", cols) });
lines += ({ center("Training Points: " + ob->GetTrainingPoints()) });
lines += ({ "", "Limbs:" });
limbs = ob->GetWieldingLimbs();
arr = map(ob->GetLimbs(),
(: sprintf("%:-14s%s (%d) %d/%d", $1,
((member_array($1, $(limbs)) == -1) ? " " : "*"),
($(ob))->GetLimbClass($1),
($(ob))->GetHealthPoints($1),
($(ob))->GetMaxHealthPoints($1)) :));
i = sizeof(arr);
while(i--) if( (y = strlen(arr[i])) > x ) x = y;
x = cols/(x+2);
lines += explode(format_page(arr, x), "\n") + ({ "", "Skills:" });
arr = map(ob->GetSkills(),
function(string skill, object who) {
mapping mp = who->GetSkill(skill);
int x;
x = to_int(percent(mp["points"],
who->GetMaxSkillPoints(skill, mp["level"])));
return sprintf("%:-18s (%d) %:2d%% - %d/%d",
skill, mp["class"], x,
who->GetSkillLevel(skill), mp["level"] );
}, ob);
i = sizeof(arr);
while(i--) if( (y = strlen(arr[i])) > x ) x = y;
x = cols/(x+2);
lines += explode(format_page(arr, x), "\n") + ({ "", "Stats:" });
arr = map(ob->GetStats(),
(: sprintf("%:-12s (%d) %d/%d", $1,
($(ob))->GetStatClass($1),
($(ob))->GetStatLevel($1),
($(ob))->GetBaseStatLevel($1)) :));
i = sizeof(arr);
x = 0;
while(i--) if( (y = strlen(arr[i])) > x ) x = y;
x =cols/(x+2);
lines += explode(format_page(arr, x), "\n");
lines += ({ "", ob->GetName()+" has amassed a net worth of " +
( ob->GetNetWorth() * currency_rate("gold") ) + " gold."});
arr = filter( map(ob->GetCurrencies(),
(: ($(ob))->GetCurrency($1) &&
sprintf("%d %s", ($(ob))->GetCurrency($1), $1) :)),
(: $1 :));
lines += ({ "Money on hand: "+implode(arr, ", ") });
this_player()->eventPage(lines, "system");
return 1;
}
else {
write("You can't stat a non-living object!");
return 1;
}
}