/* Do not remove the headers from this file! see /USAGE for more info. */
#include <hooks.h>
void simple_action(string, object);
int query_health(string);
varargs mixed call_hooks(string, mixed, mixed, array...);
private mapping weapons = ([ ]);
string array query_wielding_limbs();
string find_an_open_limb()
{
foreach(string limb in query_wielding_limbs())
if(!weapons[limb] && query_health(limb))
return limb;
return 0;
}
varargs void wield(object ob, string limb)
{
if(weapons[limb] == ob) return;
// if limb is zero, we use an open limb, or a random one if we are "full"
if(!limb)
limb = find_an_open_limb();
if(!limb)
{
array limbs = filter(query_wielding_limbs(), (: query_health($1) > 0 :));
if(!sizeof(limbs)) /* Houston, we have a problem. */
{
if(this_object()->query_link())
write("You have no way of wielding that!\n");
return;
}
limb = choice(limbs);
}
if(weapons[limb])
weapons[limb]->mark_wielded_by(0);
weapons[limb] = ob;
ob->mark_wielded_by(this_object(), limb);
call_hooks("on_wield", HOOK_IGNORE);
simple_action(ob->query_wield_message(), ob);
}
varargs void unwield(string limb)
{
if(!limb)
{
foreach (limb in query_wielding_limbs())
unwield(limb);
return;
}
if(weapons[limb])
weapons[limb]->mark_wielded_by(0);
map_delete(weapons, limb);
call_hooks("on_unwield", HOOK_IGNORE);
}
varargs object query_weapon(string limb)
{
if(!limb)
{
array limbs = filter(query_wielding_limbs(), (: weapons[$1] :));
if(!sizeof(limbs))
return this_object(); // return 0?
limb = choice(limbs);
}
return weapons[limb];
}
varargs int do_wield(object ob, string limb)
{
if(!(ob->valid_wield()))
return 0;
if(ob->query_wielded_by() == this_object())
return 0;
wield(ob, limb);
return 1;
}
int do_unwield(mixed limb)
{
if(objectp(limb))
{
array limbs = filter(query_wielding_limbs(),
(: weapons[$1] == $(limb) :));
if(!sizeof(limbs))
return 0;
limb = limbs[0];
}
if(!weapons[limb] || weapons[limb] == this_object())
return 0;
if(!(weapons[limb]->valid_unwield()))
return 0;
simple_action(weapons[limb]->query_unwield_message(), weapons[limb]);
unwield(limb);
return 1;
}
//### There's probably a better way to do this.. also, M_MESSAGES should
//### probably be used here soon. (Iizuka)
string get_wield_attributes()
{
string ret = " (wielded with ";
string array wielding_limbs = previous_object()->query_wielding();
if(sizeof(wielding_limbs) == 1)
return sprintf(" (wielded in %s)", wielding_limbs[0]);
if(sizeof(wielding_limbs) == 2)
{
if(wielding_limbs[0][<3..] == "arm" && wielding_limbs[1][<3..] == "arm")
{
ret += explode(wielding_limbs[0], " ")[0] + " and ";
ret += explode(wielding_limbs[1], " ")[0] + ")";
return ret;
}
else
{
ret += wielding_limbs[0] + " and " + wielding_limbs[1] + ")";
}
}
else
{
for(int x = sizeof(wielding_limbs) - 1; x > 1; x--)
ret += wielding_limbs[x] + ", ";
ret += wielding_limbs[1] + " and " + wielding_limbs[0] + ")";
}
return ret;
}