PRC8/nwn/nwnprc/trunk/scripts/pnp_lich_level.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

146 lines
5.8 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name Lich
//:: FileName pnp_lich_level
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
*/
//:://////////////////////////////////////////////
//:: Created By: Shane Hennessy
//:: Created On:
//:://////////////////////////////////////////////
// Completes the level up process by checking the amulet level vs the hide level
// vs the lich level.
// Called by the EvalPRC function
#include "prc_alterations"
#include "pnp_lich_inc"
#include "NW_I0_GENERIC"
void LichLevelUpVFX(object oPC, int nPowerLevel)
{
// make some fancy fireworks for when the lich levels up
// VFX for the increase of powers
if (nPowerLevel < 10)
{
effect eFx = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_EVIL);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eFx,oPC);
eFx = EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eFx,oPC);
eFx = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eFx,oPC);
}
else
{
effect eFx = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eFx,oPC);
}
}
int GetSoulGemCount(object oPC)
{
int nNumSoulGems = 0;
object oItem = GetFirstItemInInventory(oPC);
while (GetIsObjectValid(oItem))
{
if (GetResRef(oItem) == "soul_gem") nNumSoulGems++;
oItem = GetNextItemInInventory(oPC);
}
return nNumSoulGems;
}
int DeterminePowerLevel(object oPC)
{
int nLichLevel = GetLevelByClass(CLASS_TYPE_LICH,oPC);
if (DEBUG) Assert(nLichLevel > 0, "nLichLevel > 0", "Creature has no levels in Lich class!", "pnp_lich_level", "DeterminePowerLevel()");
object oAmulet = GetItemPossessedBy(oPC,"lichamulet");
// The amulet's level represents the number of upgrades performed on it.
int nAmuletLevel = GetAmuletLevel(oAmulet);
if (DEBUG) DoDebug("lich amulet level = " + IntToString(nAmuletLevel));
// Maximum possible power level of the PC, capped at ten. Power level can never exceed the lich level.
int nMaxPowerLevel = nLichLevel < 10 ? nLichLevel : 10;
// Maximum power level allowed by the amulet level and soul gem count respectively.
int nAmuletPowerLevel = nMaxPowerLevel, nSoulGemPowerLevel = nMaxPowerLevel;
// Number of additional soul gems needed to reach a new power level.
int nRemainingSoulGems = 0;
// Note: A "new" power level as referred to in this function is a power level above that of what the player has.
// A level 6 lich that has a power level of 5 will have a "new" power level of 6 provided they meet the requirements.
// A level 6 lich that has a power level of 1 will have a "new" power level of 2-6 provided they meet the requirements.
// Power level can also never exceed the amulet level. Player is informed further down if it does.
if (nAmuletLevel < nMaxPowerLevel)
// Power level supported with the current amulet level.
nAmuletPowerLevel = nAmuletLevel;
// Soul gems are used to attain power levels beyond four.
if (nMaxPowerLevel > 4)
{
// Number of soul gems in the player's inventory.
int nNumSoulGems = GetSoulGemCount(oPC);
if (DEBUG) DoDebug("lich soul gem count = " + IntToString(nNumSoulGems));
// Maximum number of soul gems that can ever be required.
// Safer to use than nNumSoulGems. A player may have thirty gems when they only need eight and end up confusing the algorithm.
int nMaxRequiredSoulGems = nNumSoulGems < 5 ? nNumSoulGems + 1 : 8;
// Total number of soul gems required for a new power level.
int nRequiredSoulGems;
if (nLichLevel < 10) nRequiredSoulGems = nMaxPowerLevel - 4 < nMaxRequiredSoulGems ? nMaxPowerLevel - 4 : nMaxRequiredSoulGems;
else nRequiredSoulGems = nMaxRequiredSoulGems;
// Additional number of soul gems required for a new power level.
nRemainingSoulGems = nRequiredSoulGems - (nNumSoulGems < nRequiredSoulGems ? nNumSoulGems : nRequiredSoulGems);
if (nRemainingSoulGems > 0)
// Power level supported with the current number of soul gems.
nSoulGemPowerLevel = nRequiredSoulGems <= 5 ? 4 + nRequiredSoulGems - 1 : 9;
}
int nNewPowerLevel = nAmuletPowerLevel < nSoulGemPowerLevel ? nAmuletPowerLevel : nSoulGemPowerLevel;
// Inform the player of what he needs to do if his power level is being restricted.
if (nNewPowerLevel < nMaxPowerLevel)
{
string sMessage = "Power fills your senses... but first you must ";
if (nAmuletPowerLevel <= nSoulGemPowerLevel) sMessage += "improve your phylactery";
if (nAmuletPowerLevel == nSoulGemPowerLevel) sMessage += " and ";
if (nAmuletPowerLevel >= nSoulGemPowerLevel) sMessage += "obtain " + IntToString(nRemainingSoulGems) + " soul gem(s)";
FloatingTextStringOnCreature(sMessage += ".", oPC);
}
return nNewPowerLevel;
}
void TryLichLevelUp(object oPC)
{
// If they are polymorphed dont run this code
// this should fix the HOTU sensi amulet bug
if (PRCGetHasEffect(EFFECT_TYPE_POLYMORPH,oPC))
return;
int nPowerLevel = GetPowerLevel(oPC);
int nNewPowerLevel = DeterminePowerLevel(oPC);
if (DEBUG) DoDebug("lich power level = " + IntToString(nPowerLevel));
if (DEBUG) DoDebug("lich new power level = " + IntToString(nNewPowerLevel));
object oHide = GetPCSkin(oPC);
LevelUpHide(oPC, oHide, nNewPowerLevel);
// Only create a visual effect if a power level was gained.
if (nNewPowerLevel > nPowerLevel)
LichLevelUpVFX(oPC, nNewPowerLevel);
}
void main()
{
// being called by EvalPRCFeats
object oPC = OBJECT_SELF;
DelayCommand(0.0f, TryLichLevelUp(oPC));
}