/* /lib/comp/weapon.c
* From the Dead Souls Object Library
* This object combines the ability to be wielded with damage doing
* Created by Descartes of Borg 960211
* Version: @(#) weapon.c 1.13@(#)
* Last modified: 97/01/01
*/
#include <lib.h>
#include <function.h>
inherit LIB_DAMAGE;
inherit LIB_EQUIP;
inherit LIB_POISON;
inherit LIB_WIELD;
private int Hands = 1;
int Wielded = 0;
private string WeaponType = "blunt";
private static mixed Wield = 0;
// abstract methods
string GetDefiniteShort();
string GetKeyName();
string GetShort();
// end abstract methods
int GetWielded(){
return Wielded;
}
varargs string GetEquippedDescription(object who) {
if( GetWorn() ) {
string tmp = " It is wielded in ";
if( !who ) {
who = this_player();
}
if( who == environment() ) {
tmp += "your";
}
else {
tmp += possessive_noun(environment());
}
tmp += " " + item_list(GetWorn()) + ".";
return tmp;
}
return 0;
}
string GetEquippedShort() {
object env = environment();
string ret = GetShort();
string array limbs;
if( !env || !living(env) ) {
return ret;
}
limbs = GetWorn();
if( sizeof(limbs) > 0 ) {
ret += " (%^RED%^wielded in " + item_list(limbs) + "%^RESET%^)";
}
return ret;
}
int GetHands() {
return Hands;
}
int SetHands(int x) {
return (Hands = x);
}
string array GetSave() {
string *d_save, *e_save, *p_save, *a_save;
d_save = damage::GetSave();
e_save = equip::GetSave();
p_save = poison::GetSave();
a_save = d_save + e_save + p_save + ({"Wielded"});
return a_save;
}
string GetWeaponType() {
return WeaponType;
}
string SetWeaponType(string str) {
if( !stringp(str) ) {
error("Bad argument 1 to SetWeaponType().\n\tExpected: string, Got: " +
typeof(str) + "\n");
}
return (WeaponType = str);
}
mixed GetWield() {
return Wield;
}
mixed SetWield(mixed val) {
return (Wield = val);
}
mixed CanEquip(object who, string array limbs) {
mixed tmp = equip::CanEquip(who, limbs);
if( tmp != 1 ) {
return tmp;
}
if( GetHands() != sizeof(limbs) ) {
return "#You must use " + cardinal(Hands) + " hands to wield " +
GetDefiniteShort() + ".";
}
if( Hands > sizeof(who->GetWieldingLimbs()) ) {
return "#You do not have enough limbs for that weapon!";
}
if( newbiep(who) && GetClass() > 30 ) {
return "You are not skilled enough to wield this weapon.";
}
return 1;
}
int eventDeteriorate(int type) {
int x = GetClass();
if( x ) {
object env = environment();
if( living(env) ) {
if( x > 1 ) {
env->eventPrint(capitalize(GetDefiniteShort()) +
" is wearing down.");
}
else {
env->eventPrint(capitalize(GetDefiniteShort()) +
" is completely worn.");
}
}
if( GetProperty("blessed") ) {
SetClass(x-2);
}
else {
SetClass(x-1);
}
}
return 1;
}
mixed eventEquip(object who, string array limbs) {
mixed tmp;
if( functionp(Wield) ) {
if( functionp(Wield) & FP_OWNER_DESTED ) {
return "Function pointer owner destructed.";
}
if( !evaluate(Wield, who, limbs) ) {
return 1;
}
else {
Wielded = 1;
return equip::eventEquip(who, limbs);
}
}
Wielded = 1;
tmp = equip::eventEquip(who, limbs);
if( tmp != 1 ) {
Wielded = 0;
return tmp;
}
if( stringp(Wield) ) {
who->eventPrint(Wield);
}
else {
who->eventPrint("You wield " + GetShort() + ".");
}
environment(who)->eventPrint(who->GetName() + " wields " + GetShort() +
".", who);
return 1;
}
int eventStrike(object target) {
int poison = GetPoison();
if( poison > 0 ) {
int x = random(poison) + 1;
if( x > 0 ) {
send_messages("", "$agent_possessive_noun " + GetKeyName() +
" poisons $target_name.", environment(), target,
environment(environment()));
target->AddPoison(x);
AddPoison(-x);
}
}
return damage::eventStrike(target);
}
mixed eventUnequip(object who) {
mixed tmp = equip::eventUnequip(who);
if( tmp != 1 ) {
Wielded = 1;
return tmp;
}
Wielded = 0;
send_messages("unwield", "$agent_name $agent_verb $target_name.",
who, this_object(), environment(who));
return 1;
}
// Some things to respond to provide friendly error messages
mixed direct_remove_obj() {
if( environment() != this_player() ) {
return "#You don't have that!";
}
return "#Do you mean to unwield it?";
}
mixed direct_wear_obj() {
if( environment() != this_player() ) {
return "#You don't have that!";
}
return "#Do you mean to wield it?";
}