Further file organization
Further file organization
This commit is contained in:
145
nwn/nwnprc/trunk/scripts/pnp_lich_level.nss
Normal file
145
nwn/nwnprc/trunk/scripts/pnp_lich_level.nss
Normal file
@@ -0,0 +1,145 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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));
|
||||
}
|
Reference in New Issue
Block a user