/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** wieldable.c
**
** A funny name, but basically a modules that provides basic weapon
** functionality (wielding and the effects of being wielded).
**
** ??-Aug-94 Created. By Beek. Originally was /std/weapon.
** 12-Dec-94 Converted to modules approach. Deathblade.
** 22-Oct-95 Beek separated out the combat stuff into M_DAMAGE_SOURCE, since
** we don't want living objects to have the verb interaction
** 961216, Deathblade: added related skill for the weapon.
** ??-Apr-98 Iizuka updated to support the new adversary code. Limb
** wielding is now available, and inventory description code has
** been updated in respect to this.
*/
#include <flags.h>
void unwield_me();
void hook_state(string, mixed, int);
void assign_flag(int which, int state);
void clear_flag(int);
private nosave object wielded_by;
private nosave function move_hook = (: unwield_me :);
#if WIELD_STYLE != WIELD_SINGLE
private string array wielding_limbs;
#endif
int valid_wield()
{
// return 1 if they can wield this.
return 1;
}
int valid_unwield()
{
// return 1 if they can unwield this.
return 1;
}
string query_wield_message()
{
return "$N $vwield a $o.\n";
}
string query_unwield_message()
{
return "$N $vunwield a $o.\n";
}
mixed query_wielding()
{
#if WIELD_STYLE == WIELD_SINGLE
return 0;
#else
return wielding_limbs;
#endif
}
object query_wielded_by()
{
return wielded_by;
}
string wielded_attributes()
{
return this_body()->get_wield_attributes();
}
varargs void mark_wielded_by(object which, string array limbs...)
{
wielded_by = which;
#if WIELD_STYLE != WIELD_SINGLE
wielding_limbs = limbs;
if(which)
wielded_by->mark_wielding_limbs(limbs);
#endif
assign_flag(F_WIELDED, which && which != this_object());
hook_state("move", move_hook, which && which != this_object());
}
mixed ob_state()
{
return wielded_by ? wielded_attributes() : 0;
}
void unwield_me()
{
if(wielded_by)
{
wielded_by->do_unwield(this_object());
wielded_by = 0;
clear_flag(F_WIELDED);
}
}
void do_remove()
{
unwield_me();
}
void remove()
{
unwield_me();
}
mixed direct_wield_obj()
{
object who = owner(this_object());
if(who && who != this_body())
return 0;
if(wielded_by != 0)
return "You're already wielding that!\n";
return 1; /* Fall through */
}
mixed direct_wield_obj_in_str(object ob, string limb)
{
object who = owner(this_object());
if(who && who != this_body())
return 0;
if(member_array(limb, who->query_wielding_limbs()) == -1)
return 0;
if(!who->query_health(limb))
return sprintf("Your %s is in no condition to wield that!\n", limb);
return 1;
}
mixed direct_remove_obj()
{
object who = owner(this_object());
if(!query_wielded_by())
return "You are not wielding that.\n";
if(who && who != this_body())
return 0;
return 1;
}
void internal_setup()
{
#if WIELD_STYLE != WIELD_SINGLE
this_object()->add_save(({ "wielding_limbs" }));
#endif
}