//:://///////////////////////////////////////////// //:: Name corpse_save //:: FileName //:: //::////////////////////////////////////////////// /* Performs a test to know if OBJECT_SELF is destroyed or not. Used for items saving throws. */ //::////////////////////////////////////////////// //:: Created By: Alexandre Brunel //:: Created On: 21/04/2003 //::////////////////////////////////////////////// #include "corpse_lib" //int magic void main() { int baseItem = GetBaseItemType(OBJECT_SELF); int fireDamages = GetDamageTaken(1); int acidDamages = GetDamageTaken(2); if(fireDamages <0) { fireDamages = 0; } if(acidDamages <0) { acidDamages = 0; } int otherDamages = GetDamageTaken() - (fireDamages + acidDamages); int oldIdentified = GetIdentified(OBJECT_SELF); //WriteTimestampedLogEntry("Dammages: fire = " + IntToString(fireDamages)+" acid = " + IntToString(acidDamages) + " others = "+ IntToString(otherDamages));//Debug SetIdentified(OBJECT_SELF,TRUE); int itemPrice = GetGoldPieceValue(OBJECT_SELF); int ACModifier = 0; //int weight switch(baseItem) { //vulnerable acid //Armor liked items case BASE_ITEM_ARMOR: case BASE_ITEM_TOWERSHIELD: case BASE_ITEM_HELMET: ACModifier = GetItemACValue(OBJECT_SELF); acidDamages = acidDamages * 2; break; //Weapons case BASE_ITEM_BASTARDSWORD: case BASE_ITEM_BATTLEAXE: case BASE_ITEM_DIREMACE: case BASE_ITEM_DOUBLEAXE: case BASE_ITEM_DAGGER: case BASE_ITEM_GREATAXE: case BASE_ITEM_GREATSWORD: case BASE_ITEM_HALBERD: case BASE_ITEM_HANDAXE: case BASE_ITEM_HEAVYCROSSBOW: case BASE_ITEM_HEAVYFLAIL: case BASE_ITEM_KAMA: case BASE_ITEM_KATANA: case BASE_ITEM_CLUB: case BASE_ITEM_KUKRI: case BASE_ITEM_LARGESHIELD: case BASE_ITEM_LIGHTCROSSBOW: case BASE_ITEM_LIGHTFLAIL: case BASE_ITEM_LIGHTHAMMER: case BASE_ITEM_LIGHTMACE: case BASE_ITEM_LONGBOW: case BASE_ITEM_LONGSWORD: case BASE_ITEM_MORNINGSTAR: case BASE_ITEM_QUARTERSTAFF: case BASE_ITEM_RAPIER: case BASE_ITEM_SCIMITAR: case BASE_ITEM_SCYTHE: case BASE_ITEM_SHORTBOW: case BASE_ITEM_SHORTSPEAR: case BASE_ITEM_SHORTSWORD: case BASE_ITEM_SICKLE: case BASE_ITEM_SMALLSHIELD: case BASE_ITEM_THROWINGAXE: case BASE_ITEM_TWOBLADEDSWORD: case BASE_ITEM_WARHAMMER: ACModifier = 2; //Base weapons damage resistance. acidDamages = acidDamages * 2; break; //small items case BASE_ITEM_SHURIKEN: case BASE_ITEM_RING: case BASE_ITEM_AMULET: case BASE_ITEM_KEY: acidDamages = FloatToInt(IntToFloat(acidDamages) * 2.5); break; /*Creature items case BASE_ITEM_CBLUDGWEAPON: case BASE_ITEM_CPIERCWEAPON: case BASE_ITEM_CREATUREITEM: case BASE_ITEM_CSLASHWEAPON: case BASE_ITEM_CSLSHPRCWEAP:*/ //Vulnerable acid and fire //ammo case BASE_ITEM_DART: case BASE_ITEM_ARROW: case BASE_ITEM_BOLT: case BASE_ITEM_BULLET: fireDamages = fireDamages * 2; acidDamages = acidDamages * 2; break; //Clothes case BASE_ITEM_CLOAK: case BASE_ITEM_BOOTS: case BASE_ITEM_BRACER: case BASE_ITEM_GLOVES: case BASE_ITEM_BELT: acidDamages = FloatToInt(IntToFloat(acidDamages) * 1.5); fireDamages = fireDamages * 2; break; //Samll items. case BASE_ITEM_BOOK: case BASE_ITEM_POTIONS: case BASE_ITEM_SCROLL: fireDamages = fireDamages * 3; acidDamages = acidDamages * 3; break; //Magic scroll have better resistence case BASE_ITEM_SPELLSCROLL: acidDamages = FloatToInt(IntToFloat(acidDamages) * 2.5); fireDamages = FloatToInt(IntToFloat(fireDamages) * 2.5); break; //Magic items case BASE_ITEM_MAGICROD: case BASE_ITEM_MAGICSTAFF: case BASE_ITEM_MAGICWAND: //What the hell am I going to do with these. case BASE_ITEM_SLING: case BASE_ITEM_THIEVESTOOLS: case BASE_ITEM_TORCH: case BASE_ITEM_TRAPKIT: break; //Gold and gems must resist a bit more :-) case BASE_ITEM_GEM: case BASE_ITEM_GOLD: ACModifier = 8; break; case BASE_ITEM_HEALERSKIT: case BASE_ITEM_LARGEBOX: case BASE_ITEM_MISCLARGE: case BASE_ITEM_MISCMEDIUM: case BASE_ITEM_MISCSMALL: case BASE_ITEM_MISCTALL: case BASE_ITEM_MISCTHIN: case BASE_ITEM_MISCWIDE: default: break; } SetIdentified(OBJECT_SELF,oldIdentified); float ACFactor = 1.0; /*if(ACModifier > 0) { ACFactor = 1.0/IntToFloat(ACModifier); }*/ int total = FloatToInt(IntToFloat(otherDamages + acidDamages + fireDamages)); //WriteTimestampedLogEntry("Object "+GetTag(OBJECT_SELF)+" saving throw: "+IntToString(itemPrice/1000)+" damages: "+IntToString(total));//Debug if(total >0 && total >= (itemPrice/1000)+ACModifier+d20()) { object linked = GetLocalObject(OBJECT_SELF,CorpseOriginalObject); if(GetIsObjectValid(linked)) { DeleteLocalObject(OBJECT_SELF,CorpseOriginalObject); DestroyObject(linked); if(GetIsObjectValid(GetLocalObject(OBJECT_SELF,CorpsePCCorpse))) { DestroyObject(GetLocalObject(OBJECT_SELF,CorpsePCCorpse)); } } DestroyObject(OBJECT_SELF); //WriteTimestampedLogEntry("Object destroyed.");//Debug } }