// This function returns a string containing the formatted output
// of someones inventory. Neatly split up into wielded objects,
// held objects, worn objects and carried objects. And money.
// 'Someone' includes players, npc and corpses.
//
// A few extra lines here and we can have info like:
// - Which hand something is held/wielded in.
// - If the object is 1 handed, 2 handed, etc etc
//
//
// 'self' is true if someone is looking at himself. (Basically
// changes a few minor things like:
// - 'You' instead of 'Playername'
// - Show exact amount of money instead of the usual messages
// like 'His purse is fit to burst!'
//
string query_living_contents(int self)
{
string s, ret, *strs;
object *wpn, *worn, *carry, *conts, money, *held, *tmp_conts;
int coins, i, col;
s = "";
strs = conts = tmp_conts = ({ });
// Get all objects in inventory and filter out the hidden
// ones, i.e. the ones without a short() or short() == ""
tmp_conts = all_inventory(this_object());
for(i=0; i<sizeof(tmp_conts); i++)
if((ret = (string)tmp_conts[i]->short()) && (ret != ""))
conts += ({ tmp_conts[i] });
// Get held and worn objects, also get money.
// These are later subtracted from the 'full inventory' array
// resulting in all carried objects.
held = (object *)this_object()->query_held_ob();
worn = (object *)this_object()->query_worn_ob();
money = present("Some Money For Me", this_object());
// This is a bit messy innit? -A
if (!pointerp(worn))
worn = ({ });
else
worn -= ({ 0 });
// This is a bit messy as well, but we can't trust our input.
if (!pointerp(held))
held = ({ });
else
held -= ({ 0 });
// The quick and dirty way... -A
// Get wielded objects and subtract them from the 'held object' array
wpn = (object *)this_object()->query_weapons_wielded();
if (!wpn) wpn = ({ });
held -= wpn;
if (sizeof(wpn))
if(ret = query_multiple_short(wpn))
strs += ({ "Wielding : ", ret + ".\n"});
if (sizeof(held))
if(ret = query_multiple_short(held))
strs += ({ "Holding : ", ret + ".\n"});
if(sizeof(worn))
if(ret = query_multiple_short(worn))
strs += ({ "Wearing : ", ret + ".\n" });
// Could be done higher up (before the weapon array gets set) to
// save an array subtraction.
carry = conts - worn - ({ money }) - held - wpn;
if(sizeof(carry))
if(ret = (string)this_object()->query_contents(0, carry))
strs += ({ "Carrying: ", ret });
if(this_player())
col = (int)this_player()->query_cols()-11;
else col = 78;
for(i=0; i<sizeof(strs); i+=2) {
s += sprintf("%s%-=*s", strs[i], col, strs[i+1]);
}
// Display the money at the end, output depends on who's looking.
if(self) {
if(money) ret = (string)money->short(0);
else ret = 0;
if(!sizeof(strs)) s = "You are empty handed.\n";
s += "Your purse contains " + (ret?ret:"only moths") + ".\n";
} else if(money) {
coins = (int)money->query_number_coins();
s += capitalize((string)this_object()->query_possessive()) + " purse is ";
switch(coins) {
case 0..10: s += "home to only moths!\n"; break;
case 11..100: s += "tinkling with coins.\n"; break;
case 101..300: s += "bulging with coins.\n"; break;
default: s += "fit to burst!\n";
}
}
return s;
}