Files
HeroesStone_PRC8/_module/nss/corpse_save.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

190 lines
6.4 KiB
Plaintext

//::///////////////////////////////////////////////
//:: 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
}
}