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/
/*    /cmds/player/body.c
 *    from the Dead Souls LPC Library
 *    gives player a report based on limb damage
 *    created by Blitz@Dead Souls
 */



#include <lib.h>
#include <rounds.h>

inherit LIB_VERB;

varargs void eventCheckBody(object ob, object receiver);

static void create() {
    verb::create();
    SetVerb("body");
    SetRules("", "LIV");
}

static string *DamageDegree = ({
  "is in critical condition!",
  "is battered beyond recognition.",
  "is severely wounded",
  "is terribly damaged.",
  "is in bad shape.",
  "is hurting.",
  "has a few bruises.",
  "is in decent shape.",
  "is in very good shape.",
  "is in excellent shape.",
});

int livings_are_remote() { return 1; }

mixed can_body() {
    return 1;
}

mixed can_body_liv() {
    if( !creatorp(this_player()) )
	return "Body does not require any arguments.";
    return 1;
}

mixed do_body() {
    message("other_action", (string)this_player()->GetName()+" checks "+
      reflexive(this_player())+" for injuries.",
      environment(this_player()), this_player() );
    eventCheckBody(this_player());
    return 1;
}

mixed do_body_liv(object ob) {
    eventCheckBody(ob, this_player());
    return 1;
}

varargs void eventCheckBody(object ob, object receiver) {
    string ret, name;
    string *limbs;
    mapping mp;
    int i, damage;
    int *key;

    mp = ([ ]);
    if( !ob ) return;
    if( !receiver ) receiver = ob;
    i = sizeof(limbs = (string *)ob->GetLimbs());
    while(i--) {
	damage = to_int( percent( (int)ob->GetHealthPoints(limbs[i]),
	    (int)ob->GetMaxHealthPoints(limbs[i]) ));
	if( !mp[damage] ) mp[damage] = ({ limbs[i] });
	else mp[damage] += ({ limbs[i] });
    }
    i = sizeof(key = sort_array(keys(mp), 1));
    name = (ob == receiver ? "Your" : capitalize(possessive(ob)));
    ret = possessive_noun((string)ob->GetCapName()) + " bodily damage "
    "report:\n\n";
    foreach(damage in key) {
	string str;
	string color;
	int x;
	i = sizeof(limbs = mp[damage]);
	while(i--) {
	    switch(damage) {
	    case 0..3: color = "%^BOLD%^%^RED%^"; break;
	    case 4..10: color = "%^RED%^";        break;
	    case 11..20: color = "%^YELLOW%^";    break;
	    default: color = "";
	    }
	    if( damage > 97 )
		str = name +" "+ limbs[i] + " is in perfect condition.";
	    else if( damage < 4 )
		str = name+" "+ limbs[i] +" is about to fall off!";
	    else {
		x = damage / 10;
		if(x>9) x = 9;
		str = name +" "+ limbs[i] +" "+ DamageDegree[x];
	    }
	    if( creatorp(receiver) )
		ret += sprintf("%s%-45s %s(%d / 100%%)%s\n", color, str, 
		  "", damage,"%^RESET%^");
	    else ret += (color + str + "%^RESET%^\n");
	}
    }
    if( i = sizeof(limbs = (string *)ob->GetMissingLimbs()) ) {
	ret += "\n"+(ob == receiver ?
	  "You are missing " : (string)ob->GetName()+" is missing ");
	switch(i) {
	case 0: break;
	case 1: ret += "a "+limbs[0]+"."; break;
	case 2: ret += "a "+limbs[0]+" and a "+limbs[1]+"."; break;
	default:  ret += "a "+implode(limbs[0..(i-2)], ", ")+" and "
	    "a "+limbs[i-1]+".";
	}
    }
    receiver->eventPage(explode(ret, "\n"), "info");
    return;
}

string GetHelp(string str) {
    if( creatorp(this_player()) )
	return "Syntax: body LIVING\n\n"
	"This command will display the current limb damage "
	"statistics of the living object named.";
    else
	return "Syntax: body\n\n"
	"This command will display your current limb damage "
	"statistics.  The limbs will be displayed in order "
	"of the most damaged to the least.";
}