/* /lib/item.c * from the Dead Souls LPC Library * inheritable object for all tangible game objects * created by Descartes of Borg 950207 * Version: @(#) item.c 1.30@(#) * Last Modified: 97/01/01 */ #include <lib.h> #include <dirs.h> #include <daemons.h> inherit LIB_BURY; inherit LIB_DETECT; inherit LIB_DETERIORATION; inherit LIB_DROP; inherit LIB_GET; inherit LIB_GIVE; inherit LIB_LOCK_WITH; inherit LIB_MASS; inherit LIB_MOVE; inherit LIB_OBJECT; inherit LIB_PERSIST; inherit LIB_PUT; inherit LIB_READ; inherit LIB_SELL; inherit LIB_SHOW; inherit LIB_STEAL; inherit LIB_UNIQUENESS; inherit LIB_VALUE; inherit LIB_WEAPON; inherit LIB_MONEY; inherit LIB_FALL; inherit LIB_SINK; private int RetainOnDeath, nocondition; private string QuestId = ""; /* ******************** item.c attributes ******************** */ string GetExternalDesc(object who){ string desc = object::GetExternalDesc(who); string tmp; if( desc == "" ){ return ""; } if( tmp = GetEquippedDescription(who) ){ desc += tmp + "\n"; } if( GetBroken() ){ desc += "It appears to be broken."; } else if( tmp = GetItemCondition() ){ desc += tmp; } return desc; } int SetNoCondition(int i){ nocondition = i; } string SetQuestId(string name){ QuestId = name; return QuestId; } string GetQuestId(){ return QuestId; } string GetItemCondition(){ if(nocondition) return ""; if( GetMaxClass() ){ float i = to_float(GetClass()) / GetMaxClass() * 100.0; if( i > 95.0 ){ return " It is as good as new."; } else if( i > 80.0 ){ return " It is in good condition."; } else if( i > 70.0 ){ return " It is in decent condition."; } else if( i > 50.0 ){ return " It is somewhat worn and battered."; } else if( i > 30.0 ){ return " It is worn down and dented."; } else if( i > 10.0 ){ return " It is very worn down and in bad shape."; } else { return " It has worn down completely."; } } else { return deterioration::GetItemCondition(); } } int GetRetainOnDeath(){ return RetainOnDeath; } int SetRetainOnDeath(int x){ return (RetainOnDeath = x); } static mixed array AddSave(mixed array vars){ if(!vars) vars = ({}); vars += ({ "Properties" }); return persist::AddSave(vars); } string array GetSave(){ return persist::GetSave(); } /* ************************ item.c modals *********************** */ mixed CanRepair(object who){ if( GetBroken() ) return 1; else if( !GetMaxClass() ) return "It doesn't need repairing."; else return 1; } mixed CanSteal(object who){ if( GetWorn() ){ return "You can't steal something equipped!"; } return steal::CanSteal(who); } varargs mixed CanThrow(object who, object target){ return 1; } /* ********************* item.c events ************************ */ static int Destruct(){ if( GetWorn() && environment() ){ eventUnequip(environment()); } return object::Destruct(); } int eventMove(mixed dest){ if(!this_object()) return 0; if( !environment() && GetWorn() ){ mixed array limbs = GetWorn(); SetWorn(0); call_out((: eventRestoreEquip :), 0, limbs); } if( GetWorn() && environment() ){ eventUnequip(environment()); } return move::eventMove(dest); } void eventDeteriorate(int type){ weapon::eventDeteriorate(); SetDestroyOnSell(1); SetValue(GetValue()/2); } void eventRemoveBlessing(){ SetProperty("blessed", 0); if( living(environment()) ){ environment()->eventPrint("%^YELLOW%^" + capitalize((string)GetDefiniteShort()) + " returns to its normal state."); } } int eventBless(int amount, int time){ if(!amount || !time) return 0; if(GetProperty("blessed")) return 0; SetProperty("blessed", amount); call_out( (: eventRemoveBlessing :), time); if(GetProperty("blessed") > 0){ SetProperty("magic item", "blessed"); } if(GetProperty("blessed") < 0){ SetProperty("magic item", "cursed"); } return 1; } mixed eventThrow(object who, object target){ if( target && living(target) ){ int skill; who->eventPrint("You throw " + GetShort() + " at " + target->GetName() + "."); target->eventPrint(who->GetName() + " throws " + GetShort() +" at you."); environment(who)->eventPrint(who->GetName() + " throws " + GetShort() + " at " + target->GetName() + ".", ({ who, target }) ); skill = (who->GetSkillLevel("projectile attack") + who->GetStatLevel("coordination")); skill -= (target->GetSkillLevel("projectile defense") + target->GetStatLevel("agility"))/2; if( GetWeaponType() != "projectile" ){ skill = skill/2; } if( skill > random(100) + 1 ){ who->AddSkillPoints("projectile attack", target->GetSkillLevel("projectile defense") * target->GetLevel() + 10); target->AddSkillPoints("projectile defense", 10); target->eventReceiveThrow(who, this_object()); } else { target->AddSkillPoints("projectile defense", who->GetSkillLevel("projectile attack") * who->GetLevel() + 10); who->AddSkillPoints("projectile attack", 10); environment(who)->eventPrint(capitalize(GetShort()) + " does not " "hit "+target->GetName() + ".",({ target, who })); write("Your throw misses its mark."); tell_object(target, capitalize(GetShort()) + " does not hit you."); eventMove(environment(who)); } return 1; } else if( target ){ who->eventPrint("You throw " + GetShort() + " at " + target->GetShort() + "."); environment(who)->eventPrint(who->GetName() + " throws " + GetShort() + " at " + target->GetShort() + ".", ({ who, target })); tell_object(target, capitalize(GetShort()) + " throws " + GetShort() + " at you."); return target->eventReceiveThrow(who, this_object()); } if( !eventMove(environment(who)) ){ who->eventPrint("You are not too good at throwing things."); return 1; } who->eventPrint("You throw " + GetShort() + "."); environment(who)->eventPrint(who->GetName() + " throws " + GetShort() + ".", who); return 1; } varargs mixed eventRepair(object who, int strength, int type){ if( !who || !strength ) return 0; if( !GetMaxClass() ) return 0; while(strength--){ if( GetClass() < GetMaxClass() ){ SetClass(GetClass() + 1); SetValue(GetValue() + (GetValue() / 3)); } else break; } return 1; } mixed eventShow(object who, string component){ mixed tmp = object::eventShow(who, component); if( component || tmp != 1 ){ return tmp; } if( GetPoison() ){ if( random(100) < who->GetSkillLevel("stealth") ){ who->eventPrint("You notice a strange substance on it."); } } return 1; } /* ***************** item.c driver applies ****************** */ static void create(){ AddSave(weapon::GetSave() + value::GetSave() + mass::GetSave() + deterioration::GetSave()); steal::create(); object::create(); } varargs mixed direct_get_obj_from_obj(object item, mixed gamma,mixed alfa, mixed beta, mixed epsilon){ if(answers_to(beta,environment(this_object()))) return 1; return 0; } mixed direct_cast_str_on_obj(){ return 1; } mixed direct_cast_str_on_str_of_obj(){ return 1; } mixed direct_balance_obj_to_obj(){ return 1; } mixed indirect_balance_obj_to_obj(){ return 1; } mixed direct_compare_obj_to_obj(){ return 1; } mixed indirect_compare_obj_to_obj(){ return 1; } mixed direct_judge_obj_to_obj(){ return 1; } mixed indirect_judge_obj_to_obj(){ return 1; } mixed direct_use_obj_to_str(){ if( environment() != this_player() ) return "#You need better access to it."; else return 1; } mixed direct_use_obj(){ return direct_use_obj_to_str(); } mixed direct_throw_obj_word_obj(){ if( environment() != this_player() ){ return "#Throw something you are not holding?"; } else return 1; } mixed indirect_throw_obj_into_obj(){ return 1; } int direct_sacrifice_obj_to_str(string deus){ mixed tmp; object env; if( !sizeof(deus) ) return 0; deus = lower_case(remove_article(deus)); if( !env = environment(this_player()) ) return 0; tmp = (mixed)env->CanSacrifice(this_player(), this_object(), deus); if( !tmp ){ this_player()->eventPrint("This is not the place for sacrifices."); return 0; } else return 1; } mixed direct_bless_obj(){ if( environment() != this_player() ){ return "#You don't have that!"; } return 1; } mixed direct_curse_obj(){ if( environment() != this_player() ){ return "#You don't have that!"; } return 1; } void init(){ }