Fixed Incandescent Champion not getting Essentia & Thrallherd getting the wrong bonus powers. (thanks @barmlot)
1560 lines
73 KiB
Plaintext
1560 lines
73 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Meldshaping/Incarnum main include: Miscellaneous
|
|
//:: moi_inc_moifunc
|
|
//::///////////////////////////////////////////////
|
|
/** @file
|
|
Defines various functions and other stuff that
|
|
do something related to Meldshaping.
|
|
|
|
Also acts as inclusion nexus for the general
|
|
meldshaping includes. In other words, don't include
|
|
them directly in your scripts, instead include this.
|
|
|
|
@author Stratovarius
|
|
@date Created - 2019.12.28
|
|
|
|
Updated for .35 by Jaysyn 2023/03/10
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
//:: Test Void
|
|
//void main () {}
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function prototypes */
|
|
//////////////////////////////////////////////////
|
|
|
|
/**
|
|
* Determines the given creature's Meldshaper level.
|
|
*
|
|
* @param oMeldshaper The creature whose Meldshaper level to determine
|
|
* @param nSpecificClass The class to determine the creature's Meldshaper
|
|
* level in.
|
|
* @param nMeld The meld to test, since Incarnum does level by meld
|
|
*
|
|
* @return The Meldshaper level
|
|
*/
|
|
int GetMeldshaperLevel(object oMeldshaper, int nSpecificClass, int nMeld);
|
|
|
|
/**
|
|
* Determines the given creature's highest unmodified Meldshaper level among its
|
|
* Meldshaping classes.
|
|
*
|
|
* @param oMeldshaper Creature whose highest Meldshaper level to determine
|
|
* @return The highest unmodified Meldshaper level the creature can have
|
|
*/
|
|
int GetHighestMeldshaperLevel(object oMeldshaper);
|
|
|
|
/**
|
|
* Determines whether a given class is a Incarnum-related class or not.
|
|
*
|
|
* @param nClass CLASS_TYPE_* of the class to test
|
|
* @return TRUE if the class is a Incarnum-related class, FALSE otherwise
|
|
*/
|
|
int GetIsIncarnumClass(int nClass);
|
|
|
|
/**
|
|
* Calculates how many Meldshaper levels are gained by a given creature from
|
|
* it's levels in prestige classes.
|
|
*
|
|
* @param oMeldshaper Creature to calculate added Meldshaper levels for
|
|
* @return The number of Meldshaper levels gained
|
|
*/
|
|
int GetIncarnumPRCLevels(object oMeldshaper);
|
|
|
|
/**
|
|
* Determines which of the character's classes is their highest or first
|
|
* Meldshaping class, if any. This is the one which gains Meldshaper
|
|
* level raise benefits from prestige classes.
|
|
*
|
|
* @param oMeldshaper Creature whose classes to test
|
|
* @return CLASS_TYPE_* of the first Meldshaping class,
|
|
* CLASS_TYPE_INVALID if the creature does not possess any.
|
|
*/
|
|
int GetPrimaryIncarnumClass(object oMeldshaper = OBJECT_SELF);
|
|
|
|
/**
|
|
* Determines the position of a creature's first Meldshaping class, if any.
|
|
*
|
|
* @param oMeldshaper Creature whose classes to test
|
|
* @return The position of the first Meldshaping class {1, 2, 3} or 0 if
|
|
* the creature possesses no levels in Meldshaping classes.
|
|
*/
|
|
int GetFirstIncarnumClassPosition(object oMeldshaper = OBJECT_SELF);
|
|
|
|
/**
|
|
* Checks every second to see if temporary essentia has been lost
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
*/
|
|
void SpawnTempEssentiaChecker(object oMeldshaper);
|
|
|
|
/**
|
|
* Returns total value of temporary essentia for the meldshaper
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
*
|
|
* @return Total value of temporary essentia
|
|
*/
|
|
int GetTemporaryEssentia(object oMeldshaper);
|
|
|
|
/**
|
|
* Essentia put into feats is locked away for 24 hours/until next rest
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
*
|
|
* @return Total value of locked essentia
|
|
*/
|
|
int GetFeatLockedEssentia(object oMeldshaper);
|
|
|
|
/**
|
|
* Total essentia a character has access to
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
*
|
|
* @return Total value of essentia available
|
|
*/
|
|
int GetTotalEssentia(object oMeldshaper);
|
|
|
|
/**
|
|
* Total essentia a character has access to, minus feat locked essentia
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
*
|
|
* @return Total value of essentia available, minus feat locked essentia
|
|
*/
|
|
int GetTotalUsableEssentia(object oMeldshaper);
|
|
|
|
/**
|
|
* Returns the slot associated to a given chakra
|
|
*
|
|
* @param nChakra Chakra constant
|
|
*
|
|
* @return Slot constant
|
|
*/
|
|
int ChakraToSlot(int nChakra);
|
|
|
|
/**
|
|
* Returns the total binds the character can have for that class and level
|
|
*
|
|
* @param oMeldshaper The meldshaper
|
|
* @param nClass The class to check
|
|
*
|
|
* @return Slot constant
|
|
*/
|
|
int GetMaxBindCount(object oMeldshaper, int nClass);
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Includes */
|
|
//////////////////////////////////////////////////
|
|
|
|
#include "prc_inc_natweap"
|
|
#include "prc_inc_function"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function definitions */
|
|
//////////////////////////////////////////////////
|
|
|
|
int GetMeldshaperLevel(object oMeldshaper, int nSpecificClass, int nMeld)
|
|
{
|
|
int nLevel;
|
|
|
|
if (DEBUG) DoDebug("GetMeldshaperLevel: "+GetName(oMeldshaper)+" is a "+IntToString(nSpecificClass));
|
|
|
|
if(GetIsIncarnumClass(nSpecificClass))
|
|
{
|
|
// Meldshaper level is class level + prestige
|
|
nLevel = GetLevelByClass(nSpecificClass, oMeldshaper);
|
|
if(nLevel)
|
|
{
|
|
// Prevents people double-dipping prestige levels
|
|
if (nSpecificClass == GetPrimaryIncarnumClass(oMeldshaper))
|
|
{
|
|
nLevel += GetIncarnumPRCLevels(oMeldshaper);
|
|
nLevel += GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper); // Necrocarnate is here because it doesn't add to anything other than meldshaper level
|
|
}
|
|
if (nSpecificClass == CLASS_TYPE_SOULBORN) nLevel /= 2;
|
|
}
|
|
}
|
|
|
|
if(DEBUG) DoDebug("Meldshaper Level: " + IntToString(nLevel));
|
|
// Being bound to the Totem Chakra increases the level by one.
|
|
if (GetIsMeldBound(oMeldshaper, nMeld) == CHAKRA_TOTEM) nLevel++;
|
|
return nLevel;
|
|
}
|
|
|
|
int GetIncarnumLevelForClass(int nSpecificClass, object oMeldshaper)
|
|
{
|
|
int nLevel;
|
|
|
|
if (DEBUG) DoDebug("GetMeldshaperLevel: "+GetName(oMeldshaper)+" is a "+IntToString(nSpecificClass));
|
|
|
|
if(GetIsIncarnumClass(nSpecificClass))
|
|
{
|
|
// Meldshaper level is class level + prestige
|
|
nLevel = GetLevelByClass(nSpecificClass, oMeldshaper);
|
|
if(nLevel)
|
|
{
|
|
// Prevents people double-dipping prestige levels
|
|
if (nSpecificClass == GetPrimaryIncarnumClass(oMeldshaper)) nLevel += GetIncarnumPRCLevels(oMeldshaper);
|
|
}
|
|
}
|
|
if(nSpecificClass == CLASS_TYPE_UMBRAL_DISCIPLE || nSpecificClass == CLASS_TYPE_INCANDESCENT_CHAMPION || nSpecificClass == CLASS_TYPE_NECROCARNATE)
|
|
nLevel = GetLevelByClass(nSpecificClass, oMeldshaper);
|
|
|
|
if(DEBUG) DoDebug("GetIncarnumLevelForClass: " + IntToString(nLevel));
|
|
return nLevel;
|
|
}
|
|
|
|
int GetHighestMeldshaperLevel(object oMeldshaper)
|
|
{
|
|
int n = 0;
|
|
int nHighest;
|
|
int nTemp;
|
|
|
|
while(n <= 8)
|
|
{
|
|
if(GetClassByPosition(n, oMeldshaper) != CLASS_TYPE_INVALID)
|
|
{
|
|
nTemp = GetMeldshaperLevel(oMeldshaper, GetClassByPosition(n, oMeldshaper),-1);
|
|
|
|
if(nTemp > nHighest)
|
|
nHighest = nTemp;
|
|
}
|
|
n++;
|
|
|
|
}
|
|
|
|
return nHighest;
|
|
}
|
|
|
|
/* int GetHighestMeldshaperLevel(object oMeldshaper)
|
|
{
|
|
return max(max(GetClassByPosition(1, oMeldshaper) != CLASS_TYPE_INVALID ? GetMeldshaperLevel(oMeldshaper, GetClassByPosition(1, oMeldshaper), -1) : 0,
|
|
GetClassByPosition(2, oMeldshaper) != CLASS_TYPE_INVALID ? GetMeldshaperLevel(oMeldshaper, GetClassByPosition(2, oMeldshaper), -1) : 0
|
|
),
|
|
GetClassByPosition(3, oMeldshaper) != CLASS_TYPE_INVALID ? GetMeldshaperLevel(oMeldshaper, GetClassByPosition(3, oMeldshaper), -1) : 0
|
|
);
|
|
} */
|
|
|
|
int GetIsIncarnumClass(int nClass)
|
|
{
|
|
return nClass == CLASS_TYPE_INCARNATE
|
|
|| nClass == CLASS_TYPE_SOULBORN
|
|
|| nClass == CLASS_TYPE_TOTEMIST
|
|
|| nClass == CLASS_TYPE_SPINEMELD_WARRIOR;
|
|
}
|
|
|
|
int GetIncarnumPRCLevels(object oMeldshaper)
|
|
{
|
|
int nLevel = GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oMeldshaper);
|
|
nLevel += GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper);
|
|
|
|
// These two don't add at 1st level
|
|
if (GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper))
|
|
nLevel += GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper) - 1;
|
|
// Totem Rager
|
|
if (GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >= 6)
|
|
nLevel += (GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper)) -2;
|
|
else if (GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper))
|
|
nLevel += (GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper)) -1;
|
|
//This is an odd one
|
|
if (GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper))
|
|
{
|
|
nLevel += (GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper)+1)/2;
|
|
|
|
if (GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper) >= 10) nLevel += 1;
|
|
}
|
|
|
|
/*if (GetLevelByClass(CLASS_TYPE_MASTER_OF_SHADOW, oMeldshaper))
|
|
nLevel += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHADOW, oMeldshaper) - 1;
|
|
*/
|
|
return nLevel;
|
|
}
|
|
|
|
int GetPrimaryIncarnumClass(object oMeldshaper = OBJECT_SELF)
|
|
{
|
|
int nClass = CLASS_TYPE_INVALID;
|
|
|
|
if(GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE))
|
|
{
|
|
int nIncarnumPos = GetFirstIncarnumClassPosition(oMeldshaper);
|
|
if (!nIncarnumPos) return CLASS_TYPE_INVALID; // no Blade Magic Meldshaping class
|
|
|
|
nClass = GetClassByPosition(nIncarnumPos, oMeldshaper);
|
|
}
|
|
else
|
|
{
|
|
int nClassLvl;
|
|
int nClass1, nClass2, nClass3, nClass4, nClass5, nClass6, nClass7, nClass8;
|
|
int nClass1Lvl, nClass2Lvl, nClass3Lvl, nClass4Lvl, nClass5Lvl, nClass6Lvl, nClass7Lvl, nClass8Lvl;
|
|
|
|
nClass1 = GetClassByPosition(1, oMeldshaper);
|
|
nClass2 = GetClassByPosition(2, oMeldshaper);
|
|
nClass3 = GetClassByPosition(3, oMeldshaper);
|
|
nClass4 = GetClassByPosition(4, oMeldshaper);
|
|
nClass5 = GetClassByPosition(5, oMeldshaper);
|
|
nClass6 = GetClassByPosition(6, oMeldshaper);
|
|
nClass7 = GetClassByPosition(7, oMeldshaper);
|
|
nClass8 = GetClassByPosition(8, oMeldshaper);
|
|
|
|
if(GetIsIncarnumClass(nClass1)) nClass1Lvl = GetLevelByClass(nClass1, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass2)) nClass2Lvl = GetLevelByClass(nClass2, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass3)) nClass3Lvl = GetLevelByClass(nClass3, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass4)) nClass4Lvl = GetLevelByClass(nClass4, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass5)) nClass5Lvl = GetLevelByClass(nClass5, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass6)) nClass6Lvl = GetLevelByClass(nClass6, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass7)) nClass7Lvl = GetLevelByClass(nClass7, oMeldshaper);
|
|
if(GetIsIncarnumClass(nClass8)) nClass8Lvl = GetLevelByClass(nClass8, oMeldshaper);
|
|
|
|
nClass = nClass1;
|
|
nClassLvl = nClass1Lvl;
|
|
|
|
if(nClass2Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass2;
|
|
nClassLvl = nClass2Lvl;
|
|
}
|
|
if(nClass3Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass3;
|
|
nClassLvl = nClass3Lvl;
|
|
}
|
|
if(nClass4Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass4;
|
|
nClassLvl = nClass4Lvl;
|
|
}
|
|
if(nClass5Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass5;
|
|
nClassLvl = nClass5Lvl;
|
|
}
|
|
if(nClass6Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass6;
|
|
nClassLvl = nClass6Lvl;
|
|
}
|
|
if(nClass7Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass7;
|
|
nClassLvl = nClass7Lvl;
|
|
}
|
|
if(nClass8Lvl > nClassLvl)
|
|
{
|
|
nClass = nClass8;
|
|
nClassLvl = nClass8Lvl;
|
|
}
|
|
|
|
if(nClassLvl == 0)
|
|
nClass = CLASS_TYPE_INVALID;
|
|
}
|
|
|
|
return nClass;
|
|
}
|
|
|
|
int GetFirstIncarnumClassPosition(object oMeldshaper = OBJECT_SELF)
|
|
{
|
|
if (GetIsIncarnumClass(GetClassByPosition(1, oMeldshaper)))
|
|
return 1;
|
|
if (GetIsIncarnumClass(GetClassByPosition(2, oMeldshaper)))
|
|
return 2;
|
|
if (GetIsIncarnumClass(GetClassByPosition(3, oMeldshaper)))
|
|
return 3;
|
|
if (GetIsIncarnumClass(GetClassByPosition(4, oMeldshaper)))
|
|
return 4;
|
|
if (GetIsIncarnumClass(GetClassByPosition(5, oMeldshaper)))
|
|
return 5;
|
|
if (GetIsIncarnumClass(GetClassByPosition(6, oMeldshaper)))
|
|
return 6;
|
|
if (GetIsIncarnumClass(GetClassByPosition(7, oMeldshaper)))
|
|
return 7;
|
|
if (GetIsIncarnumClass(GetClassByPosition(8, oMeldshaper)))
|
|
return 8;
|
|
|
|
return 0;
|
|
}
|
|
|
|
string GetMeldFile(int nClass = -1)
|
|
{
|
|
//string sFile;
|
|
//if (nClass == CLASS_TYPE_INCARNATE) sFile = "cls_meld_incarn";
|
|
|
|
return "soulmelds";
|
|
}
|
|
|
|
string GetMeldshapingClassFile(int nClass)
|
|
{
|
|
string sFile;
|
|
if (nClass == CLASS_TYPE_INCARNATE) sFile = "cls_mlkn_incarn";
|
|
else if (nClass == CLASS_TYPE_SOULBORN) sFile = "cls_mlkn_soulbn";
|
|
else if (nClass == CLASS_TYPE_TOTEMIST) sFile = "cls_mlkn_totem";
|
|
else if (nClass == CLASS_TYPE_SPINEMELD_WARRIOR) sFile = "cls_mlkn_spnmld";
|
|
else if (nClass == CLASS_TYPE_UMBRAL_DISCIPLE) sFile = "cls_mlkn_umbral";
|
|
else if (nClass == CLASS_TYPE_INCANDESCENT_CHAMPION) sFile = "cls_mlkn_incand";
|
|
else if (nClass == CLASS_TYPE_NECROCARNATE) sFile = "cls_mlkn_necrnm";
|
|
|
|
return sFile;
|
|
}
|
|
|
|
int GetMeldshapingClass(object oMeldshaper)
|
|
{
|
|
int nClass = -1;
|
|
// If there's levels in the class and haven't already done it
|
|
if (GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) && !GetLocalInt(oMeldshaper, "FirstMeldDone")) nClass = CLASS_TYPE_INCARNATE;
|
|
else if (GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) && !GetLocalInt(oMeldshaper, "SecondMeldDone")) nClass = CLASS_TYPE_SOULBORN;
|
|
else if (GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) && !GetLocalInt(oMeldshaper, "ThirdMeldDone")) nClass = CLASS_TYPE_TOTEMIST;
|
|
else if (GetLevelByClass(CLASS_TYPE_SPINEMELD_WARRIOR, oMeldshaper) && !GetLocalInt(oMeldshaper, "FourthMeldDone")) nClass = CLASS_TYPE_SPINEMELD_WARRIOR;
|
|
if (DEBUG) DoDebug("GetMeldshapingClass is "+IntToString(nClass));
|
|
return nClass;
|
|
}
|
|
|
|
int GetMaxShapeSoulmeldCount(object oMeldshaper, int nClass)
|
|
{
|
|
int nMax = StringToInt(Get2DACache(GetMeldshapingClassFile(nClass), "Soulmelds", GetIncarnumLevelForClass(nClass, oMeldshaper)-1));
|
|
if (nClass == GetPrimaryIncarnumClass(oMeldshaper))
|
|
{
|
|
nMax += StringToInt(Get2DACache(GetMeldshapingClassFile(CLASS_TYPE_NECROCARNATE), "Soulmelds", GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper)));
|
|
int i;
|
|
for(i = FEAT_BONUS_SOULMELD_1; i <= FEAT_BONUS_SOULMELD_10; i++)
|
|
if(GetHasFeat(i, oMeldshaper)) nMax++;
|
|
}
|
|
|
|
int nCon = GetAbilityScore(oMeldshaper, ABILITY_CONSTITUTION, TRUE)-10;
|
|
if (GetHasFeat(FEAT_UNDEAD_MELDSHAPER, oMeldshaper)) nCon = GetAbilityScore(oMeldshaper, ABILITY_WISDOM, TRUE)-10;
|
|
//Limited to Con score - 10 or class limit, whichever is less
|
|
nMax = min(nMax, nCon);
|
|
|
|
if (DEBUG) DoDebug("GetMaxShapeSoulmeldCount is "+IntToString(nMax));
|
|
return nMax;
|
|
}
|
|
|
|
int GetTotalSoulmeldCount(object oMeldshaper)
|
|
{
|
|
int nMax = GetMaxShapeSoulmeldCount(oMeldshaper, CLASS_TYPE_INCARNATE);
|
|
nMax += GetMaxShapeSoulmeldCount(oMeldshaper, CLASS_TYPE_SOULBORN);
|
|
nMax += GetMaxShapeSoulmeldCount(oMeldshaper, CLASS_TYPE_TOTEMIST);
|
|
nMax += GetMaxShapeSoulmeldCount(oMeldshaper, CLASS_TYPE_SPINEMELD_WARRIOR);
|
|
nMax += GetMaxShapeSoulmeldCount(oMeldshaper, CLASS_TYPE_NECROCARNATE);
|
|
|
|
if (DEBUG) DoDebug("GetTotalSoulmeldCount is "+IntToString(nMax));
|
|
return nMax;
|
|
}
|
|
|
|
int GetMaxBindCount(object oMeldshaper, int nClass)
|
|
{
|
|
int nMax = StringToInt(Get2DACache(GetMeldshapingClassFile(nClass), "ChakraBinds", GetIncarnumLevelForClass(nClass, oMeldshaper)-1));
|
|
if (nClass == GetPrimaryIncarnumClass(oMeldshaper))
|
|
{
|
|
nMax += StringToInt(Get2DACache(GetMeldshapingClassFile(CLASS_TYPE_NECROCARNATE), "ChakraBinds", GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper)));
|
|
int i;
|
|
for(i = FEAT_EXTRA_CHAKRA_BIND_1; i <= FEAT_EXTRA_CHAKRA_BIND_10; i++)
|
|
if(GetHasFeat(i, oMeldshaper)) nMax += 1;
|
|
}
|
|
if (DEBUG) DoDebug("GetMaxBindCount is "+IntToString(nMax));
|
|
return nMax;
|
|
}
|
|
|
|
void ShapeSoulmeld(object oMeldshaper, int nMeld)
|
|
{
|
|
PRCRemoveSpellEffects(nMeld, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(nMeld, oMeldshaper, FALSE);
|
|
ActionCastSpellOnSelf(nMeld);
|
|
if (DEBUG) DoDebug("Shaping Soulmeld "+IntToString(nMeld)+" on "+GetName(oMeldshaper));
|
|
}
|
|
|
|
void MarkMeldShaped(object oMeldshaper, int nMeld, int nClass)
|
|
{
|
|
if (DEBUG) DoDebug("MarkMeldShaped nMeld is "+IntToString(nMeld));
|
|
int nCont = TRUE;
|
|
int nTest, i;
|
|
while (nCont)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(nClass)+IntToString(i));
|
|
if (DEBUG) DoDebug("MarkMeldShaped nTest is "+IntToString(nTest));
|
|
if (!nTest) // If it's blank
|
|
{
|
|
SetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(nClass)+IntToString(i), nMeld);
|
|
if (DEBUG) DoDebug("MarkMeldShaped SetLocal");
|
|
nCont = FALSE; // Break the loop
|
|
}
|
|
else
|
|
i++; // Increment the counter to check
|
|
}
|
|
}
|
|
|
|
void ClearMeldShapes(object oMeldshaper)
|
|
{
|
|
object oSkin = GetPCSkin(oMeldshaper);
|
|
ScrubPCSkin(oMeldshaper, oSkin);
|
|
int i;
|
|
for (i = 0; i <= 22; i++)
|
|
{
|
|
DeleteLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_INCARNATE)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SOULBORN)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_TOTEMIST)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SPINEMELD_WARRIOR)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "UsedMeld"+IntToString(CLASS_TYPE_SPINEMELD_WARRIOR)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "UsedMeld"+IntToString(CLASS_TYPE_INCARNATE)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "UsedMeld"+IntToString(CLASS_TYPE_SOULBORN)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "UsedMeld"+IntToString(CLASS_TYPE_TOTEMIST)+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "BoundMeld"+IntToString(i));
|
|
int nTest = GetLocalInt(oMeldshaper, "SpellInvestCheck"+IntToString(i));
|
|
if (nTest)
|
|
DeleteLocalInt(oMeldshaper, "SpellEssentia"+IntToString(nTest));
|
|
DeleteLocalInt(oMeldshaper, "SpellInvestCheck"+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "ExpandedSoulmeld"+IntToString(i));
|
|
DeleteLocalInt(oMeldshaper, "UsedBladeMeld"+IntToString(i));
|
|
}
|
|
for (i = 18700; i < 18799; i++)
|
|
{
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(i));
|
|
}
|
|
for (i = 8869; i < 8889; i++)
|
|
{
|
|
DeleteLocalInt(oMeldshaper, "FeatEssentia"+IntToString(i));
|
|
}
|
|
DeleteLocalInt(oMeldshaper, "ArcaneFocusBound");
|
|
if (GetLocalInt(oMeldshaper, "DiademPurelight"))
|
|
{
|
|
SetLocalInt(oMeldshaper, "PRCInLight", GetLocalInt(oMeldshaper, "PRCInLight")-1);
|
|
DeleteLocalInt(oMeldshaper, "DiademPurelight");
|
|
}
|
|
|
|
if (GetLocalInt(oMeldshaper, "PlanarChasubleLimit") > 7)
|
|
DeleteLocalInt(oMeldshaper, "PlanarChasubleLimit");
|
|
else
|
|
SetLocalInt(oMeldshaper, "PlanarChasubleLimit", GetLocalInt(oMeldshaper, "PlanarChasubleLimit")+1);
|
|
|
|
DeleteLocalInt(oMeldshaper, "GorgonMaskLimit");
|
|
DeleteLocalInt(oMeldshaper, "IncarnateAvatarSpeed");
|
|
DeleteLocalInt(oMeldshaper, "LamiaBeltSpeed");
|
|
DeleteLocalInt(oMeldshaper, "LifebondVestmentsTimer");
|
|
DeleteLocalInt(oMeldshaper, "MidnightAugPower");
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18973"); // MELD_DUSKLING_SPEED
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18691"); // MELD_SPINE_ENHANCEMENT
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18687"); // MELD_IRONSOUL_SHIELD
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18685"); // MELD_IRONSOUL_ARMOR
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18683"); // MELD_IRONSOUL_WEAPON
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18681"); // MELD_UMBRAL_STEP
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18679"); // MELD_UMBRAL_SHADOW
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18677"); // MELD_UMBRAL_SIGHT
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18675"); // MELD_UMBRAL_SOUL
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18673"); // MELD_UMBRAL_KISS
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18670"); // MELD_INCANDESCENT_STRIKE
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18668"); // MELD_INCANDESCENT_HEAL
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18666"); // MELD_INCANDESCENT_COUNTENANCE
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18663"); // MELD_INCANDESCENT_RAY
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18659"); // MELD_INCANDESCENT_AURA
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18634"); // MELD_WITCH_MELDSHIELD
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18636"); // MELD_WITCH_DISPEL
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18638"); // MELD_WITCH_SHACKLES
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18640"); // MELD_WITCH_ABROGATION
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18642"); // MELD_WITCH_SPIRITFLAY
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia18644"); // MELD_WITCH_INTEGUMENT
|
|
DeleteLocalInt(oMeldshaper, "NecrocarnumCircletPen");
|
|
DeleteLocalInt(oMeldshaper, "AstralVambraces");
|
|
DeleteLocalInt(oMeldshaper, "TemporaryEssentia");
|
|
DestroyObject(GetItemPossessedBy(oMeldshaper, "moi_incarnatewpn")); // Remove any weapons created by Incarnate Weapon
|
|
|
|
// Clean up any the natural weapons that are lying around
|
|
ClearNaturalWeapons(oMeldshaper);
|
|
// Nuke the creature weapons. If the normal form is supposed to have natural weapons, they'll get re-constructed
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMeldshaper))) MyDestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMeldshaper));
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMeldshaper))) MyDestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMeldshaper));
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMeldshaper))) MyDestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMeldshaper));
|
|
|
|
if (GetLocalInt(oMeldshaper, "ClearEventTotem")) ClearEventScriptList(oMeldshaper, EVENT_ITEM_ONHIT, TRUE, TRUE);
|
|
}
|
|
|
|
int GetShapedMeldsCount(object oMeldshaper)
|
|
{
|
|
int i, nCount, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_INCARNATE)+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SOULBORN)+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_TOTEMIST)+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SPINEMELD_WARRIOR)+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
}
|
|
if (DEBUG) DoDebug("GetTotalShapedMelds is "+IntToString(nCount));
|
|
return nCount;
|
|
}
|
|
|
|
int GetTotalShapedMelds(object oMeldshaper, int nClass)
|
|
{
|
|
int i, nCount, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(nClass)+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
}
|
|
if (DEBUG) DoDebug("GetTotalShapedMelds is "+IntToString(nCount));
|
|
return nCount;
|
|
}
|
|
|
|
int CheckSplitChakra(object oMeldshaper, int nSlot)
|
|
{
|
|
if (nSlot == INVENTORY_SLOT_HEAD && GetHasFeat(FEAT_SPLIT_CHAKRA_CROWN , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_BOOTS && GetHasFeat(FEAT_SPLIT_CHAKRA_FEET , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_ARMS && GetHasFeat(FEAT_SPLIT_CHAKRA_HANDS , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_ARMS && GetHasFeat(FEAT_SPLIT_CHAKRA_ARMS , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_HEAD && GetHasFeat(FEAT_SPLIT_CHAKRA_BROW , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_CLOAK && GetHasFeat(FEAT_SPLIT_CHAKRA_SHOULDERS, oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_NECK && GetHasFeat(FEAT_SPLIT_CHAKRA_THROAT , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_BELT && GetHasFeat(FEAT_SPLIT_CHAKRA_WAIST , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_CHEST && GetHasFeat(FEAT_SPLIT_CHAKRA_HEART , oMeldshaper)) return TRUE;
|
|
if (nSlot == INVENTORY_SLOT_CHEST && GetHasFeat(FEAT_SPLIT_CHAKRA_SOUL , oMeldshaper)) return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void BindMeldToChakra(object oMeldshaper, int nMeld, int nChakra, int nClass)
|
|
{
|
|
// Make sure it's not in use already, and that you have any binds to make
|
|
if (!GetIsChakraBound(oMeldshaper, nChakra) && GetMaxBindCount(oMeldshaper, nClass))
|
|
{
|
|
//FloatingTextStringOnCreature("BindMeldToChakra: nMeld "+IntToString(nMeld)+" nChakra "+IntToString(nChakra), oMeldshaper);
|
|
SetLocalInt(oMeldshaper, "BoundMeld"+IntToString(nChakra), nMeld);
|
|
ShapeSoulmeld(oMeldshaper, nMeld);
|
|
int nSlot = ChakraToSlot(DoubleChakraToChakra(nChakra)); // Can't have an item in a bound slot, unless Split Chakra
|
|
if (!CheckSplitChakra(oMeldshaper, nSlot)) ForceUnequip(oMeldshaper, GetItemInSlot(nSlot, oMeldshaper), nSlot);
|
|
}
|
|
}
|
|
|
|
int GetTotalBoundMelds(object oMeldshaper)
|
|
{
|
|
int i, nCount, nTest;
|
|
for (i = 0; i <= 22; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "BoundMeld"+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount++;
|
|
}
|
|
if (DEBUG) DoDebug("GetTotalBoundMelds is "+IntToString(nCount));
|
|
return nCount;
|
|
}
|
|
|
|
int GetIsChakraUsed(object oMeldshaper, int nChakra, int nClass)
|
|
{
|
|
int nTest = GetLocalInt(oMeldshaper, "UsedMeld"+IntToString(nClass)+IntToString(nChakra));
|
|
|
|
if (DEBUG) DoDebug("GetIsChakraUsed is "+IntToString(nTest));
|
|
return nTest;
|
|
}
|
|
|
|
void SetChakraUsed(object oMeldshaper, int nMeld, int nChakra, int nClass)
|
|
{
|
|
// This isn't the same as binding, but can only have one soulmeld in each chakra
|
|
// Each class has its own limit on this, as per p20 of MoI
|
|
if (!GetIsChakraUsed(oMeldshaper, nChakra, nClass))
|
|
{
|
|
SetLocalInt(oMeldshaper, "UsedMeld"+IntToString(nClass)+IntToString(nChakra), nMeld);
|
|
}
|
|
}
|
|
|
|
int ChakraToSlot(int nChakra)
|
|
{
|
|
if (nChakra == CHAKRA_CROWN ) return INVENTORY_SLOT_HEAD;
|
|
if (nChakra == CHAKRA_FEET ) return INVENTORY_SLOT_BOOTS;
|
|
if (nChakra == CHAKRA_HANDS ) return INVENTORY_SLOT_ARMS;
|
|
if (nChakra == CHAKRA_ARMS ) return INVENTORY_SLOT_ARMS;
|
|
if (nChakra == CHAKRA_BROW ) return INVENTORY_SLOT_HEAD;
|
|
if (nChakra == CHAKRA_SHOULDERS) return INVENTORY_SLOT_CLOAK;
|
|
if (nChakra == CHAKRA_THROAT ) return INVENTORY_SLOT_NECK;
|
|
if (nChakra == CHAKRA_WAIST ) return INVENTORY_SLOT_BELT;
|
|
if (nChakra == CHAKRA_HEART ) return INVENTORY_SLOT_CHEST;
|
|
if (nChakra == CHAKRA_SOUL ) return INVENTORY_SLOT_CHEST;
|
|
if (nChakra == CHAKRA_TOTEM ) return -1; // no slot associated
|
|
|
|
return -1;
|
|
}
|
|
|
|
void ChakraBindUnequip(object oMeldshaper, object oItem)
|
|
{
|
|
int nTest = FALSE;
|
|
if (GetItemInSlot(INVENTORY_SLOT_HEAD, oMeldshaper) == oItem && (GetIsChakraBound(oMeldshaper, CHAKRA_CROWN) || GetIsChakraBound(oMeldshaper, CHAKRA_BROW))) nTest = INVENTORY_SLOT_HEAD + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_BOOTS, oMeldshaper) == oItem && GetIsChakraBound(oMeldshaper, CHAKRA_FEET)) nTest = INVENTORY_SLOT_BOOTS + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_ARMS, oMeldshaper) == oItem && (GetIsChakraBound(oMeldshaper, CHAKRA_ARMS) || GetIsChakraBound(oMeldshaper, CHAKRA_HANDS))) nTest = INVENTORY_SLOT_ARMS + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_CLOAK, oMeldshaper) == oItem && GetIsChakraBound(oMeldshaper, CHAKRA_SHOULDERS)) nTest = INVENTORY_SLOT_CLOAK + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_NECK, oMeldshaper) == oItem && GetIsChakraBound(oMeldshaper, CHAKRA_THROAT)) nTest = INVENTORY_SLOT_NECK + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_BELT, oMeldshaper) == oItem && GetIsChakraBound(oMeldshaper, CHAKRA_WAIST)) nTest = INVENTORY_SLOT_BELT + 1;
|
|
else if (GetItemInSlot(INVENTORY_SLOT_CHEST, oMeldshaper) == oItem && (GetIsChakraBound(oMeldshaper, CHAKRA_SOUL) || GetIsChakraBound(oMeldshaper, CHAKRA_HEART))) nTest = INVENTORY_SLOT_CHEST + 1;
|
|
if (DEBUG) DoDebug("ChakraBindUnequip is "+IntToString(nTest-1));
|
|
if (nTest && !CheckSplitChakra(oMeldshaper, nTest-1) && GetIsItemPropertyValid(GetFirstItemProperty(oItem)) && oItem != GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMeldshaper) && oItem != GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMeldshaper) &&
|
|
oItem != GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMeldshaper) && oItem != GetItemInSlot(INVENTORY_SLOT_CARMOUR, oMeldshaper)) // If it's bound you can't equip in that slot
|
|
{
|
|
nTest = nTest - 1;
|
|
ForceUnequip(oMeldshaper, GetItemInSlot(nTest, oMeldshaper), nTest);
|
|
FloatingTextStringOnCreature("You cannot equip a magical item when you have bound a meld to the same chakra!", oMeldshaper, FALSE);
|
|
}
|
|
}
|
|
|
|
string ChakraToString(int nChakra)
|
|
{
|
|
string sReturn = "";
|
|
if (nChakra == CHAKRA_CROWN || nChakra == CHAKRA_DOUBLE_CROWN ) sReturn = "Crown";
|
|
if (nChakra == CHAKRA_FEET || nChakra == CHAKRA_DOUBLE_FEET ) sReturn = "Feet";
|
|
if (nChakra == CHAKRA_HANDS || nChakra == CHAKRA_DOUBLE_HANDS ) sReturn = "Hands";
|
|
if (nChakra == CHAKRA_ARMS || nChakra == CHAKRA_DOUBLE_ARMS ) sReturn = "Arms";
|
|
if (nChakra == CHAKRA_BROW || nChakra == CHAKRA_DOUBLE_BROW ) sReturn = "Brow";
|
|
if (nChakra == CHAKRA_SHOULDERS || nChakra == CHAKRA_DOUBLE_SHOULDERS) sReturn = "Shoulders";
|
|
if (nChakra == CHAKRA_THROAT || nChakra == CHAKRA_DOUBLE_THROAT ) sReturn = "Throat";
|
|
if (nChakra == CHAKRA_WAIST || nChakra == CHAKRA_DOUBLE_WAIST ) sReturn = "Waist";
|
|
if (nChakra == CHAKRA_HEART || nChakra == CHAKRA_DOUBLE_HEART ) sReturn = "Heart";
|
|
if (nChakra == CHAKRA_SOUL || nChakra == CHAKRA_DOUBLE_SOUL ) sReturn = "Soul";
|
|
if (nChakra == CHAKRA_TOTEM || nChakra == CHAKRA_DOUBLE_TOTEM ) sReturn = "Totem";
|
|
|
|
if (DEBUG) DoDebug("ChakraToString is "+IntToString(nChakra)+", Return is "+sReturn);
|
|
return sReturn;
|
|
}
|
|
|
|
int GetCanBindChakra(object oMeldshaper, int nChakra)
|
|
{
|
|
if (nChakra == CHAKRA_CROWN &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 2)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 4)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 4)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_THROAT &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_HEART &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 16)) return TRUE;
|
|
else if (nChakra == CHAKRA_SOUL &&
|
|
(GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper) >= 19)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_CROWN &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_THROAT &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 18)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper) >= 18)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_CROWN &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 5)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 5)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 5)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 9)) return TRUE;
|
|
else if (nChakra == CHAKRA_THROAT &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 14)) return TRUE;
|
|
else if (nChakra == CHAKRA_HEART &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 17)) return TRUE;
|
|
else if (nChakra == CHAKRA_TOTEM &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper) >= 2)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_SPINEMELD_WARRIOR, oMeldshaper) >= 7)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_CROWN &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_SOULCASTER, oMeldshaper) >= 8)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper) >= 4)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST &&
|
|
(GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper) >= 6)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_HEART &&
|
|
(GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper) >= 10)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_CROWN &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=4)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=4)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=4)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=9)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=9)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper) >=9)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_ARMS &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 3)) return TRUE;
|
|
else if (nChakra == CHAKRA_THROAT &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 8)) return TRUE;
|
|
else if (nChakra == CHAKRA_HEART &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 11)) return TRUE;
|
|
else if (nChakra == CHAKRA_SOUL &&
|
|
(GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper) >= 13)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_CROWN && GetHasFeat(FEAT_OPEN_LEAST_CHAKRA_CROWN, oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_FEET && GetHasFeat(FEAT_OPEN_LEAST_CHAKRA_FEET , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_HANDS && GetHasFeat(FEAT_OPEN_LEAST_CHAKRA_HANDS , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_ARMS && GetHasFeat(FEAT_OPEN_LESSER_CHAKRA_ARMS , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_BROW && GetHasFeat(FEAT_OPEN_LESSER_CHAKRA_BROW , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_SHOULDERS && GetHasFeat(FEAT_OPEN_LESSER_CHAKRA_SHOULDERS, oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_THROAT && GetHasFeat(FEAT_OPEN_GREATER_CHAKRA_THROAT , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_WAIST && GetHasFeat(FEAT_OPEN_GREATER_CHAKRA_WAIST , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_HEART && GetHasFeat(FEAT_OPEN_HEART_CHAKRA , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_SOUL && GetHasFeat(FEAT_OPEN_SOUL_CHAKRA , oMeldshaper)) return TRUE;
|
|
|
|
if (nChakra == CHAKRA_DOUBLE_CROWN && GetHasFeat(FEAT_DOUBLE_CHAKRA_CROWN, oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_FEET && GetHasFeat(FEAT_DOUBLE_CHAKRA_FEET , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_HANDS && GetHasFeat(FEAT_DOUBLE_CHAKRA_HANDS , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_ARMS && GetHasFeat(FEAT_DOUBLE_CHAKRA_ARMS , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_BROW && GetHasFeat(FEAT_DOUBLE_CHAKRA_BROW , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_SHOULDERS && GetHasFeat(FEAT_DOUBLE_CHAKRA_SHOULDERS, oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_THROAT && GetHasFeat(FEAT_DOUBLE_CHAKRA_THROAT , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_WAIST && GetHasFeat(FEAT_DOUBLE_CHAKRA_WAIST , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_HEART && GetHasFeat(FEAT_DOUBLE_CHAKRA_HEART , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_SOUL && GetHasFeat(FEAT_DOUBLE_CHAKRA_SOUL , oMeldshaper)) return TRUE;
|
|
else if (nChakra == CHAKRA_DOUBLE_TOTEM && GetHasFeat(FEAT_DOUBLE_CHAKRA_TOTEM , oMeldshaper)) return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
int GetMaxEssentiaCount(object oMeldshaper, int nClass)
|
|
{
|
|
int nMax = StringToInt(Get2DACache(GetMeldshapingClassFile(nClass), "Essentia", GetIncarnumLevelForClass(nClass, oMeldshaper)-1));
|
|
if (DEBUG) DoDebug("GetMaxEssentiaCount is "+IntToString(nMax));
|
|
return nMax;
|
|
}
|
|
|
|
void SpawnTempEssentiaChecker(object oMeldshaper)
|
|
{
|
|
int nCur = GetTemporaryEssentia(oMeldshaper);
|
|
int nPrv = GetLocalInt(oMeldshaper, "TempEssTest");
|
|
int nRed = nPrv - nCur;
|
|
// If we've lost some
|
|
if (nPrv > nCur)
|
|
{
|
|
int i, nCount, nTest;
|
|
for (i = 18700; i < 18799; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "TempEssentiaAmount"+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
{
|
|
if (DEBUG) DoDebug("Found "+IntToString(nTest)+" Temp Essentia in Meld "+IntToString(i));
|
|
// There's still some temp essentia left in the meld
|
|
if (nTest > nRed)
|
|
{
|
|
int nChange = nTest-nRed;
|
|
SetLocalInt(oMeldshaper, "TempEssentiaAmount"+IntToString(i), nChange);
|
|
SetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(i), GetEssentiaInvested(oMeldshaper, i)-nChange);
|
|
ShapeSoulmeld(oMeldshaper, i);
|
|
if (DEBUG) DoDebug("Reducing Essentia in Meld "+IntToString(i)+" by "+IntToString(nChange));
|
|
}
|
|
else // Means the reduction is higher than the temp essentia ammount
|
|
{
|
|
// No more temp essentia here
|
|
DeleteLocalInt(oMeldshaper, "TempEssentiaAmount"+IntToString(i));
|
|
SetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(i), GetEssentiaInvested(oMeldshaper, i)-nTest);
|
|
ShapeSoulmeld(oMeldshaper, i);
|
|
if (DEBUG) DoDebug("Deleted Temp Essentia in Meld "+IntToString(i)+", total "+IntToString(nTest));
|
|
}
|
|
|
|
// Reduce the remaining amount of reduction by the amount we just used up
|
|
nRed = nRed - nTest;
|
|
if (DEBUG) DoDebug("Remaining Temp Essentia to reduce "+IntToString(nRed));
|
|
if (0 >= nRed) break; // End the loop if we're done
|
|
}
|
|
}
|
|
}
|
|
// If we still have some left
|
|
if (nCur > 0)
|
|
{
|
|
SetLocalInt(oMeldshaper, "TempEssTest", nCur);
|
|
DelayCommand(1.0, SpawnTempEssentiaChecker(oMeldshaper));
|
|
}
|
|
else
|
|
DeleteLocalInt(oMeldshaper, "TempEssTest");
|
|
}
|
|
|
|
void InvestEssentia(object oMeldshaper, int nMeld, int nEssentia)
|
|
{
|
|
// Use up expanded soulmeld capacity
|
|
if (nEssentia > 1000)
|
|
{
|
|
nEssentia -= 1000;
|
|
SetIsSoulmeldCapacityUsed(oMeldshaper, nMeld);
|
|
}
|
|
int nClass = GetMeldShapedClass(oMeldshaper, nMeld);
|
|
// Special capacity of 1/2 class level
|
|
if (nMeld == MELD_SPINE_ENHANCEMENT) nEssentia = min(nEssentia, (GetLevelByClass(CLASS_TYPE_SPINEMELD_WARRIOR, oMeldshaper)/2));
|
|
else if (nEssentia > GetMaxEssentiaCapacity(oMeldshaper, nClass, nMeld)) nEssentia = GetMaxEssentiaCapacity(oMeldshaper, nClass, nMeld);
|
|
// Can't invest more than you have
|
|
if (nEssentia > GetTotalUsableEssentia(oMeldshaper)) nEssentia = GetTotalUsableEssentia(oMeldshaper);
|
|
|
|
// All of this garbage to handle temporary essentia
|
|
if (GetLocalInt(oMeldshaper, "InvestingTempEssentia"))
|
|
{
|
|
SetLocalInt(oMeldshaper, "TempEssentiaAmount"+IntToString(nMeld), nEssentia);
|
|
SpawnTempEssentiaChecker(oMeldshaper);
|
|
DeleteLocalInt(oMeldshaper, "InvestingTempEssentia");
|
|
}
|
|
|
|
FloatingTextStringOnCreature("Investing "+IntToString(nEssentia)+" essentia into "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nMeld))), oMeldshaper, FALSE);
|
|
SetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(nMeld), nEssentia);
|
|
SetLocalInt(oMeldshaper, "EssentiaRound"+IntToString(nMeld), TRUE); // This is used by Melds that only trigger on the round that essentia is invested into it
|
|
DelayCommand(6.0, DeleteLocalInt(oMeldshaper, "EssentiaRound"+IntToString(nMeld)));
|
|
}
|
|
|
|
int GetTotalEssentiaInvested(object oMeldshaper)
|
|
{
|
|
int i, nCount, nTest;
|
|
for (i = 18700; i < 18799; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nCount += nTest;
|
|
}
|
|
nCount += GetFeatLockedEssentia(oMeldshaper);
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_SPINE_ENHANCEMENT)); // MELD_SPINE_ENHANCEMENT
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_SHIELD)); // MELD_IRONSOUL_SHIELD
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_ARMOR)); // MELD_IRONSOUL_ARMOR
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_WEAPON)); // MELD_IRONSOUL_WEAPON
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_STEP )); // MELD_UMBRAL_STEP
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SHADOW)); // MELD_UMBRAL_SHADOW
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SIGHT )); // MELD_UMBRAL_SIGHT
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SOUL )); // MELD_UMBRAL_SOUL
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_KISS )); // MELD_UMBRAL_KISS
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_DUSKLING_SPEED)); // MELD_DUSKLING_SPEED
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_STRIKE)); // MELD_INCANDESCENT_STRIKE
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_HEAL )); // MELD_INCANDESCENT_HEAL
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_COUNTENANCE)); // MELD_INCANDESCENT_COUNTENANCE
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_RAY )); // MELD_INCANDESCENT_RAY
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_AURA )); // MELD_INCANDESCENT_AURA
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_MELDSHIELD)); // MELD_WITCH_MELDSHIELD
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_DISPEL )); // MELD_WITCH_DISPEL
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_SHACKLES )); // MELD_WITCH_SHACKLES
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_ABROGATION)); // MELD_WITCH_ABROGATION
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_SPIRITFLAY)); // MELD_WITCH_SPIRITFLAY
|
|
nCount += GetLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_INTEGUMENT)); // MELD_WITCH_INTEGUMENT
|
|
if (DEBUG) DoDebug("GetTotalEssentiaInvested is "+IntToString(nCount));
|
|
return nCount;
|
|
}
|
|
|
|
int EssentiaIDToRealID(int nEssentiaID)
|
|
{
|
|
int i, nReal, nTest;
|
|
for (i = 1; i < 100; i++)
|
|
{
|
|
nTest = StringToInt(Get2DACache("soulmelds", "EssentiaID", i));
|
|
if (nTest == nEssentiaID) // If it's been found
|
|
{
|
|
nReal = StringToInt(Get2DACache("soulmelds", "SpellID", i));
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (nEssentiaID == 18690) nReal = MELD_SPINE_ENHANCEMENT;
|
|
else if (nEssentiaID == 18686) nReal = MELD_IRONSOUL_SHIELD;
|
|
else if (nEssentiaID == 18684) nReal = MELD_IRONSOUL_ARMOR;
|
|
else if (nEssentiaID == 18682) nReal = MELD_IRONSOUL_WEAPON;
|
|
else if (nEssentiaID == 18680) nReal = MELD_UMBRAL_STEP;
|
|
else if (nEssentiaID == 18678) nReal = MELD_UMBRAL_SHADOW;
|
|
else if (nEssentiaID == 18676) nReal = MELD_UMBRAL_SIGHT;
|
|
else if (nEssentiaID == 18674) nReal = MELD_UMBRAL_SOUL;
|
|
else if (nEssentiaID == 18672) nReal = MELD_UMBRAL_KISS;
|
|
else if (nEssentiaID == 18669) nReal = MELD_INCANDESCENT_STRIKE;
|
|
else if (nEssentiaID == 18667) nReal = MELD_INCANDESCENT_HEAL ;
|
|
else if (nEssentiaID == 18665) nReal = MELD_INCANDESCENT_COUNTENANCE;
|
|
else if (nEssentiaID == 18662) nReal = MELD_INCANDESCENT_RAY ;
|
|
else if (nEssentiaID == 18661) nReal = MELD_INCANDESCENT_AURA ;
|
|
else if (nEssentiaID == 18633) nReal = MELD_WITCH_MELDSHIELD;
|
|
else if (nEssentiaID == 18635) nReal = MELD_WITCH_DISPEL;
|
|
else if (nEssentiaID == 18637) nReal = MELD_WITCH_SHACKLES;
|
|
else if (nEssentiaID == 18639) nReal = MELD_WITCH_ABROGATION;
|
|
else if (nEssentiaID == 18641) nReal = MELD_WITCH_SPIRITFLAY;
|
|
else if (nEssentiaID == 18643) nReal = MELD_WITCH_INTEGUMENT;
|
|
|
|
if (DEBUG) DoDebug("EssentiaToRealID: nEssentiaID "+IntToString(nEssentiaID)+" nReal "+IntToString(nReal));
|
|
return nReal; // Return the real spellID
|
|
}
|
|
|
|
void DrainEssentia(object oMeldshaper)
|
|
{
|
|
//FloatingTextStringOnCreature("DrainEssentia", oMeldshaper);
|
|
int i;
|
|
for (i = 18700; i < 18799; i++)
|
|
{
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(i));
|
|
}
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_DUSKLING_SPEED));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_SPINE_ENHANCEMENT));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_SHIELD));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_ARMOR));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_IRONSOUL_WEAPON));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_STEP ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SHADOW));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SIGHT ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_SOUL ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_UMBRAL_KISS ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_STRIKE));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_HEAL ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_COUNTENANCE));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_RAY ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_INCANDESCENT_AURA ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_MELDSHIELD));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_DISPEL ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_SHACKLES ));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_ABROGATION));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_SPIRITFLAY));
|
|
DeleteLocalInt(oMeldshaper, "MeldEssentia"+IntToString(MELD_WITCH_INTEGUMENT));
|
|
}
|
|
|
|
void WipeMelds(object oMeldshaper)
|
|
{
|
|
//FloatingTextStringOnCreature("WipeMelds", oMeldshaper);
|
|
int i;
|
|
for (i = 18700; i < 18799; i++)
|
|
{
|
|
PRCRemoveSpellEffects(i, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(i, oMeldshaper, FALSE);
|
|
}
|
|
PRCRemoveSpellEffects(MELD_DUSKLING_SPEED, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_DUSKLING_SPEED, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_SPINE_ENHANCEMENT, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_SPINE_ENHANCEMENT, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_IRONSOUL_SHIELD, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_IRONSOUL_SHIELD, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_IRONSOUL_ARMOR, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_IRONSOUL_ARMOR, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_IRONSOUL_WEAPON, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_IRONSOUL_WEAPON, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_UMBRAL_STEP, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_UMBRAL_STEP, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_UMBRAL_SHADOW, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_UMBRAL_SHADOW, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_UMBRAL_SIGHT, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_UMBRAL_SIGHT, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_UMBRAL_SOUL, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_UMBRAL_SOUL, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_UMBRAL_KISS, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_UMBRAL_KISS, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_INCANDESCENT_STRIKE, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_INCANDESCENT_STRIKE, oMeldshaper, FALSE);
|
|
PRCRemoveSpellEffects(MELD_WITCH_MELDSHIELD, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(MELD_WITCH_MELDSHIELD, oMeldshaper, FALSE);
|
|
for (i = 18647; i < 18657; i++)
|
|
{
|
|
PRCRemoveSpellEffects(i, oMeldshaper, oMeldshaper);
|
|
GZPRCRemoveSpellEffects(i, oMeldshaper, FALSE);
|
|
}
|
|
}
|
|
|
|
void ReshapeMelds(object oMeldshaper)
|
|
{
|
|
// Check each class and run the loop
|
|
if (GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper))
|
|
{
|
|
int i, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_INCARNATE)+IntToString(i));
|
|
if (nTest) // If it's not blank, recast it
|
|
{
|
|
//FloatingTextStringOnCreature("ReshapeMelds: CLASS_TYPE_INCARNATE nTest "+IntToString(nTest), oMeldshaper);
|
|
ActionCastSpellOnSelf(nTest);
|
|
}
|
|
}
|
|
}
|
|
if (GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper))
|
|
{
|
|
int i, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SOULBORN)+IntToString(i));
|
|
if (nTest) // If it's not blank, recast it
|
|
{
|
|
//FloatingTextStringOnCreature("ReshapeMelds: CLASS_TYPE_SOULBORN nTest "+IntToString(nTest), oMeldshaper);
|
|
ActionCastSpellOnSelf(nTest);
|
|
}
|
|
}
|
|
}
|
|
if (GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper))
|
|
{
|
|
int i, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_TOTEMIST)+IntToString(i));
|
|
if (nTest) // If it's not blank, recast it
|
|
{
|
|
//FloatingTextStringOnCreature("ReshapeMelds: CLASS_TYPE_TOTEMIST nTest "+IntToString(nTest), oMeldshaper);
|
|
ActionCastSpellOnSelf(nTest);
|
|
}
|
|
}
|
|
}
|
|
if (GetLevelByClass(CLASS_TYPE_SPINEMELD_WARRIOR, oMeldshaper))
|
|
{
|
|
ActionCastSpellOnSelf(MELD_SPINE_ENHANCEMENT);
|
|
int i, nTest;
|
|
for (i = 0; i <= 20; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "ShapedMeld"+IntToString(CLASS_TYPE_SPINEMELD_WARRIOR)+IntToString(i));
|
|
if (nTest) // If it's not blank, recast it
|
|
{
|
|
//FloatingTextStringOnCreature("ReshapeMelds: CLASS_TYPE_TOTEMIST nTest "+IntToString(nTest), oMeldshaper);
|
|
ActionCastSpellOnSelf(nTest);
|
|
}
|
|
}
|
|
}
|
|
int nIron = GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER, oMeldshaper);
|
|
if (nIron)
|
|
{
|
|
ActionCastSpellOnSelf(MELD_IRONSOUL_SHIELD);
|
|
if (nIron >= 5) ActionCastSpellOnSelf(MELD_IRONSOUL_ARMOR);
|
|
if (nIron >= 9) ActionCastSpellOnSelf(MELD_IRONSOUL_WEAPON);
|
|
}
|
|
int nUmbral = GetLevelByClass(CLASS_TYPE_UMBRAL_DISCIPLE, oMeldshaper);
|
|
if (nUmbral)
|
|
{
|
|
ActionCastSpellOnSelf(MELD_UMBRAL_STEP);
|
|
if (nUmbral >= 3) ActionCastSpellOnSelf(MELD_UMBRAL_SHADOW);
|
|
if (nUmbral >= 7) ActionCastSpellOnSelf(MELD_UMBRAL_SIGHT);
|
|
if (nUmbral >= 9) ActionCastSpellOnSelf(MELD_UMBRAL_SOUL);
|
|
if (nUmbral >= 10) ActionCastSpellOnSelf(MELD_UMBRAL_KISS);
|
|
}
|
|
int nIncand = GetLevelByClass(CLASS_TYPE_INCANDESCENT_CHAMPION, oMeldshaper);
|
|
if (nIncand)
|
|
{
|
|
ActionCastSpellOnSelf(MELD_INCANDESCENT_STRIKE);
|
|
}
|
|
if(GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper)) ActionCastSpellOnSelf(MELD_WITCH_MELDSHIELD);
|
|
if (GetRacialType(oMeldshaper) == RACIAL_TYPE_DUSKLING) ActionCastSpellOnSelf(MELD_DUSKLING_SPEED);
|
|
}
|
|
|
|
int EssentiaToD4(int nEssentia)
|
|
{
|
|
if (nEssentia == 1 ) return IP_CONST_DAMAGEBONUS_1d4;
|
|
else if (nEssentia == 2) return IP_CONST_DAMAGEBONUS_2d4;
|
|
else if (nEssentia == 3) return IP_CONST_DAMAGEBONUS_3d4;
|
|
else if (nEssentia == 4) return IP_CONST_DAMAGEBONUS_4d4;
|
|
else if (nEssentia == 5) return IP_CONST_DAMAGEBONUS_5d4;
|
|
else if (nEssentia == 6) return IP_CONST_DAMAGEBONUS_6d4;
|
|
else if (nEssentia == 7) return IP_CONST_DAMAGEBONUS_7d4;
|
|
else if (nEssentia == 8) return IP_CONST_DAMAGEBONUS_8d4;
|
|
else if (nEssentia == 9) return IP_CONST_DAMAGEBONUS_9d4;
|
|
else if (nEssentia >= 10) return IP_CONST_DAMAGEBONUS_10d4;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int IncarnateAlignment(object oMeldshaper)
|
|
{
|
|
int nReturn = FALSE;
|
|
|
|
if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_LAWFUL && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_NEUTRAL)
|
|
{
|
|
nReturn = TRUE;
|
|
}
|
|
else if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_CHAOTIC && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_NEUTRAL)
|
|
{
|
|
nReturn = TRUE;
|
|
}
|
|
else if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_NEUTRAL && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_GOOD)
|
|
{
|
|
nReturn = TRUE;
|
|
}
|
|
else if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_NEUTRAL && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_EVIL)
|
|
{
|
|
nReturn = TRUE;
|
|
}
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
int GetOpposition(object oMeldshaper, object oTarget)
|
|
{
|
|
int nReturn = FALSE;
|
|
if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_LAWFUL && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_GOOD && (GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL || GetAlignmentLawChaos(oTarget) == ALIGNMENT_CHAOTIC))
|
|
nReturn = TRUE;
|
|
if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_LAWFUL && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_EVIL && (GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD || GetAlignmentLawChaos(oTarget) == ALIGNMENT_CHAOTIC))
|
|
nReturn = TRUE;
|
|
if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_CHAOTIC && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_GOOD && (GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL || GetAlignmentLawChaos(oTarget) == ALIGNMENT_LAWFUL))
|
|
nReturn = TRUE;
|
|
if (GetAlignmentLawChaos(oMeldshaper) == ALIGNMENT_CHAOTIC && GetAlignmentGoodEvil(oMeldshaper) == ALIGNMENT_EVIL && (GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD || GetAlignmentLawChaos(oTarget) == ALIGNMENT_LAWFUL))
|
|
nReturn = TRUE;
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
void SetTemporaryEssentia(object oMeldshaper, int nEssentia)
|
|
{
|
|
if (DEBUG) DoDebug("Set Temporary Essentia from "+IntToString(GetLocalInt(oMeldshaper, "TemporaryEssentia"))+" to "+IntToString(GetLocalInt(oMeldshaper, "TemporaryEssentia")+nEssentia));
|
|
SetLocalInt(oMeldshaper, "TemporaryEssentia", GetLocalInt(oMeldshaper, "TemporaryEssentia")+nEssentia);
|
|
}
|
|
|
|
int GetTemporaryEssentia(object oMeldshaper)
|
|
{
|
|
return GetLocalInt(oMeldshaper, "TemporaryEssentia");
|
|
}
|
|
|
|
int GetMaxEssentiaCapacityFeat(object oMeldshaper)
|
|
{
|
|
int nMax = 1; // Always can invest one
|
|
int nHD = GetHitDice(oMeldshaper);
|
|
if (nHD >= 31) nMax = 5;
|
|
else if (nHD >= 18) nMax = 4;
|
|
else if (nHD >= 12) nMax = 3;
|
|
else if (nHD >= 6) nMax = 2;
|
|
|
|
if (GetLocalInt(oMeldshaper, "DivineSoultouch")) nMax += 1;
|
|
if (GetLocalInt(oMeldshaper, "IncandescentOverload")) nMax += max(GetAbilityModifier(ABILITY_CHARISMA, oMeldshaper), 1);
|
|
if (GetHasFeat(FEAT_IMPROVED_ESSENTIA_CAPACITY, oMeldshaper)) nMax += 1;
|
|
|
|
// Don't allow more than they have
|
|
if (nMax > GetTotalUsableEssentia(oMeldshaper)) nMax = GetTotalUsableEssentia(oMeldshaper);
|
|
|
|
if (DEBUG) DoDebug("GetMaxEssentiaCapacityFeat: nHD "+IntToString(nHD)+" nMax "+IntToString(nMax));
|
|
return nMax;
|
|
}
|
|
|
|
void SapphireSmiteUses(object oMeldshaper, int nEssentia)
|
|
{
|
|
int i;
|
|
|
|
for (i = 1; i <= nEssentia; i++)
|
|
{
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SMITE_GOOD_ALIGN); // Fist of Raziel
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SMITE_EVIL); // Paladin
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SMITE_GOOD); // Blackguard
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_KIAI_SMITE); // CW Samurai
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_CRUSADER_SMITE); // Crusader
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SMITE_UNDEAD); // Soldier of Light
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SHADOWBANE_SMITE); // Shadowbane
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_KILLOREN_ASPECT_D); // Killoren
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_SMITE_OPPOSITION); // Soulborn
|
|
IncrementRemainingFeatUses(oMeldshaper, FEAT_CULTIST_SMITE_MAGE); // Cultist of the Shattered Peak
|
|
}
|
|
}
|
|
|
|
void AzureEnmity(object oMeldshaper, int nEssentia)
|
|
{
|
|
effect eLink = EffectLinkEffects(EffectSkillIncrease(SKILL_BLUFF, nEssentia), EffectSkillIncrease(SKILL_LISTEN, nEssentia));
|
|
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SENSE_MOTIVE, nEssentia));
|
|
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SPOT, nEssentia));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nEssentia), DAMAGE_TYPE_BASE_WEAPON));
|
|
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_ABERRATION, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_ABERRATION)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_ANIMAL, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_ANIMAL)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_BEAST, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_BEAST)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_CONSTRUCT, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_CONSTRUCT)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_DRAGON, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_DRAGON)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_DWARF, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_DWARF)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_ELEMENTAL, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_ELEMENTAL)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_ELF, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_ELF)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_FEY, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_FEY)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_GIANT, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_GIANT)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_GNOME, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_GNOME)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_GOBLINOID, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HUMANOID_GOBLINOID)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_HALFELF, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HALFELF)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_HALFLING, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HALFLING)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_HALFORC, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HALFORC)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_HUMAN, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HUMAN)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_MAGICAL_BEAST, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_MAGICAL_BEAST)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_MONSTROUS, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HUMANOID_MONSTROUS)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(RACIAL_TYPE_HUMANOID_ORC, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HUMANOID_ORC)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_OUTSIDER, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_OUTSIDER)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_REPTILIAN, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_HUMANOID_REPTILIAN)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_SHAPECHANGER, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_SHAPECHANGER)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_UNDEAD, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_UNDEAD)), oMeldshaper, 9999.0);
|
|
if(GetHasFeat(FEAT_FAVORED_ENEMY_VERMIN, oMeldshaper))
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(VersusRacialTypeEffect(eLink, RACIAL_TYPE_VERMIN)), oMeldshaper, 9999.0);
|
|
}
|
|
|
|
void DoFeatBonus(object oMeldshaper, int nFeat, int nEssentia)
|
|
{
|
|
effect eLink;
|
|
if (nFeat == FEAT_CERULEAN_FORTITUDE) eLink = EffectSavingThrowIncrease(SAVING_THROW_FORT, nEssentia);
|
|
else if (nFeat == FEAT_CERULEAN_REFLEXES) eLink = EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nEssentia);
|
|
else if (nFeat == FEAT_CERULEAN_WILL) eLink = EffectSavingThrowIncrease(SAVING_THROW_WILL, nEssentia);
|
|
else if (nFeat == FEAT_AZURE_TALENT) ExecuteScript("moi_ft_aztalent", oMeldshaper);
|
|
else if (nFeat == FEAT_AZURE_TOUGHNESS) eLink = EffectTemporaryHitpoints(3*nEssentia);
|
|
else if (nFeat == FEAT_HEALING_SOUL) FeatUsePerDay(oMeldshaper, FEAT_HEALING_SOUL, -1, 0, nEssentia);
|
|
else if (nFeat == FEAT_SAPPHIRE_SMITE) SapphireSmiteUses(oMeldshaper, nEssentia);
|
|
else if (nFeat == FEAT_AZURE_ENMITY) AzureEnmity(oMeldshaper, nEssentia);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oMeldshaper, 9999.0);
|
|
}
|
|
|
|
void InvestEssentiaFeat(object oMeldshaper, int nFeat, int nEssentia)
|
|
{
|
|
// Jump out if there's no feat
|
|
if (!GetHasFeat(nFeat, oMeldshaper)) return;
|
|
|
|
int nMax = GetMaxEssentiaCapacityFeat(oMeldshaper);
|
|
|
|
// Bonuses to specific feat caps
|
|
if (nFeat == FEAT_COBALT_RAGE && GetLevelByClass(CLASS_TYPE_TOTEM_RAGER, oMeldshaper)) nMax++;
|
|
|
|
// No breaking the rules
|
|
if (nEssentia > nMax) nEssentia = nMax;
|
|
// Can't invest more than you have
|
|
if (nEssentia > GetTotalUsableEssentia(oMeldshaper)) nEssentia = GetTotalUsableEssentia(oMeldshaper);
|
|
|
|
FloatingTextStringOnCreature("Investing "+IntToString(nEssentia)+" essentia into "+GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat))), oMeldshaper);
|
|
DoFeatBonus(oMeldshaper, nFeat, nEssentia);
|
|
SetLocalInt(oMeldshaper, "FeatEssentia"+IntToString(nFeat), nEssentia);
|
|
}
|
|
|
|
void DoClassBonus(object oMeldshaper, int nFeat, int nEssentia)
|
|
{
|
|
|
|
}
|
|
|
|
void InvestEssentiaClass(object oMeldshaper, int nFeat, int nEssentia)
|
|
{
|
|
// Jump out if there's no feat
|
|
if (!GetHasFeat(nFeat, oMeldshaper)) return;
|
|
|
|
// No breaking the rules
|
|
if (nEssentia > GetMaxEssentiaCapacityFeat(oMeldshaper)) nEssentia = GetMaxEssentiaCapacityFeat(oMeldshaper);
|
|
// Can't invest more than you have
|
|
if (nEssentia > GetTotalUsableEssentia(oMeldshaper)) nEssentia = GetTotalUsableEssentia(oMeldshaper);
|
|
|
|
FloatingTextStringOnCreature("Investing "+IntToString(nEssentia)+" essentia into "+GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat))), oMeldshaper);
|
|
DoClassBonus(oMeldshaper, nFeat, nEssentia);
|
|
SetLocalInt(oMeldshaper, "ClassEssentia"+IntToString(nFeat), nEssentia);
|
|
}
|
|
|
|
void InvestEssentiaSpell(object oMeldshaper, int nFeat, int nEssentia)
|
|
{
|
|
FloatingTextStringOnCreature("Investing "+IntToString(nEssentia)+" essentia into "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nFeat))), oMeldshaper);
|
|
SetLocalInt(oMeldshaper, "SpellEssentia"+IntToString(nFeat), nEssentia);
|
|
if (!GetLocalInt(oMeldshaper, "SpellInvestCheck1")) SetLocalInt(oMeldshaper, "SpellInvestCheck1", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck2")) SetLocalInt(oMeldshaper, "SpellInvestCheck2", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck3")) SetLocalInt(oMeldshaper, "SpellInvestCheck3", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck4")) SetLocalInt(oMeldshaper, "SpellInvestCheck4", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck5")) SetLocalInt(oMeldshaper, "SpellInvestCheck5", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck6")) SetLocalInt(oMeldshaper, "SpellInvestCheck6", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck7")) SetLocalInt(oMeldshaper, "SpellInvestCheck7", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck8")) SetLocalInt(oMeldshaper, "SpellInvestCheck8", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck9")) SetLocalInt(oMeldshaper, "SpellInvestCheck9", nFeat);
|
|
else if (!GetLocalInt(oMeldshaper, "SpellInvestCheck10")) SetLocalInt(oMeldshaper, "SpellInvestCheck10", nFeat);
|
|
}
|
|
|
|
int GetFeatLockedEssentia(object oMeldshaper)
|
|
{
|
|
int nTotal, i, nTest;
|
|
for (i = 8869; i < 8889; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "FeatEssentia"+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nTotal += nTest;
|
|
}
|
|
for (i = 0; i < 11; i++)
|
|
{
|
|
nTest = GetLocalInt(oMeldshaper, "SpellInvestCheck"+IntToString(i));
|
|
if (nTest) // If it's not blank
|
|
nTotal += GetLocalInt(oMeldshaper, "SpellEssentia"+IntToString(nTest));
|
|
}
|
|
if (DEBUG) DoDebug("GetFeatLockedEssentia return value "+IntToString(nTotal));
|
|
return nTotal;
|
|
}
|
|
|
|
int IncarnumFeats(object oMeldshaper)
|
|
{
|
|
int nEssentia;
|
|
|
|
if (GetHasFeat(FEAT_AZURE_ENMITY, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_CERULEAN_FORTITUDE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_CERULEAN_REFLEXES, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_CERULEAN_WILL, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_AZURE_TALENT, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_AZURE_TOUCH, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_AZURE_TOUGHNESS, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_AZURE_TURNING, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_AZURE_WILD_SHAPE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_COBALT_CHARGE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_COBALT_EXPERTISE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_COBALT_POWER, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_COBALT_RAGE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_HEALING_SOUL, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_INCARNUM_SPELLSHAPING, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_INDIGO_STRIKE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_MIDNIGHT_AUGMENTATION, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_MIDNIGHT_DODGE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_MIDNIGHT_METAMAGIC, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_PSYCARNUM_BLADE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_SAPPHIRE_SMITE, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_SOULTOUCHED_SPELLCASTING, oMeldshaper)) nEssentia += 1;
|
|
if (GetHasFeat(FEAT_BONUS_ESSENTIA, oMeldshaper))
|
|
{
|
|
nEssentia += 1;
|
|
if(GetIsIncarnumUser(oMeldshaper))
|
|
nEssentia += 1; // Yes, this is correct
|
|
}
|
|
if (GetRacialType(oMeldshaper) == RACIAL_TYPE_DUSKLING) nEssentia += 1;
|
|
if (GetRacialType(oMeldshaper) == RACIAL_TYPE_AZURIN) nEssentia += 1;
|
|
|
|
int i;
|
|
for(i = FEAT_EPIC_ESSENTIA_1; i <= FEAT_EPIC_ESSENTIA_6; i++)
|
|
if(GetHasFeat(i, oMeldshaper)) nEssentia += 3;
|
|
|
|
if (DEBUG) DoDebug("IncarnumFeats return value "+IntToString(nEssentia));
|
|
return nEssentia;
|
|
}
|
|
|
|
void AddNecrocarnumEssentia(object oMeldshaper, int nEssentia)
|
|
{
|
|
int nNecrocarnum = GetLocalInt(oMeldshaper, "NecrocarnumEssentia");
|
|
SetLocalInt(oMeldshaper, "NecrocarnumEssentia", nNecrocarnum+nEssentia);
|
|
// It lasts for 24 hours, then remove it back out
|
|
DelayCommand(HoursToSeconds(24), SetLocalInt(oMeldshaper, "NecrocarnumEssentia", GetLocalInt(oMeldshaper, "NecrocarnumEssentia")-nEssentia));
|
|
}
|
|
|
|
int GetTotalEssentia(object oMeldshaper)
|
|
{
|
|
int nEssentia;
|
|
|
|
if (GetLevelByClass(CLASS_TYPE_INCARNATE, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_INCARNATE);
|
|
if (GetLevelByClass(CLASS_TYPE_SOULBORN, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_SOULBORN);
|
|
if (GetLevelByClass(CLASS_TYPE_TOTEMIST, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_TOTEMIST);
|
|
if (GetLevelByClass(CLASS_TYPE_SPINEMELD_WARRIOR, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_SPINEMELD_WARRIOR);
|
|
if (GetLevelByClass(CLASS_TYPE_UMBRAL_DISCIPLE, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_UMBRAL_DISCIPLE);
|
|
if (GetLevelByClass(CLASS_TYPE_NECROCARNATE, oMeldshaper)) nEssentia += GetLocalInt(oMeldshaper, "NecrocarnumEssentia");
|
|
if (GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper) >= 2) nEssentia += 1;
|
|
if (GetLevelByClass(CLASS_TYPE_WITCHBORN_BINDER, oMeldshaper) >= 6) nEssentia += 1;
|
|
if (GetLevelByClass(CLASS_TYPE_INCANDESCENT_CHAMPION, oMeldshaper)) nEssentia += GetMaxEssentiaCount(oMeldshaper, CLASS_TYPE_INCANDESCENT_CHAMPION);
|
|
|
|
nEssentia += IncarnumFeats(oMeldshaper);
|
|
if (DEBUG) DoDebug("GetTotalEssentia return value "+IntToString(nEssentia));
|
|
return nEssentia;
|
|
}
|
|
|
|
int GetTotalUsableEssentia(object oMeldshaper)
|
|
{
|
|
return GetTotalEssentia(oMeldshaper) - GetFeatLockedEssentia(oMeldshaper);
|
|
}
|
|
|
|
int GetIncarnumFeats(object oMeldshaper)
|
|
{
|
|
int nTotal, i;
|
|
for (i = 8868; i < 8910; i++)
|
|
{
|
|
if (GetHasFeat(i, oMeldshaper))
|
|
nTotal += 1;
|
|
}
|
|
if (DEBUG) DoDebug("GetIncarnumFeats return value "+IntToString(nTotal));
|
|
return nTotal;
|
|
}
|
|
|
|
int GetIsBlademeldUsed(object oMeldshaper, int nChakra)
|
|
{
|
|
int nTest = GetLocalInt(oMeldshaper, "UsedBladeMeld"+IntToString(nChakra));
|
|
|
|
if (DEBUG) DoDebug("GetIsBlademeldUsed is "+IntToString(nTest));
|
|
return nTest;
|
|
}
|
|
|
|
void SetBlademeldUsed(object oMeldshaper, int nChakra)
|
|
{
|
|
if (!GetIsBlademeldUsed(oMeldshaper, nChakra))
|
|
{
|
|
SetLocalInt(oMeldshaper, "UsedBladeMeld"+IntToString(nChakra), nChakra);
|
|
}
|
|
}
|
|
|
|
string GetBlademeldDesc(int nChakra)
|
|
{
|
|
string sString;
|
|
if (nChakra == CHAKRA_CROWN ) sString = "You gain a +4 bonus on disarm checks and on Sense Motive";
|
|
if (nChakra == CHAKRA_FEET ) sString = "You gain a +2 bonus on Initiative";
|
|
if (nChakra == CHAKRA_HANDS ) sString = "You gain a +1 bonus on damage";
|
|
if (nChakra == CHAKRA_ARMS ) sString = "You gain a +2 bonus on attack rolls";
|
|
if (nChakra == CHAKRA_BROW ) sString = "You gain the Blind-Fight feat";
|
|
if (nChakra == CHAKRA_SHOULDERS) sString = "You gain immunity to criticals but not sneak attacks";
|
|
if (nChakra == CHAKRA_THROAT ) sString = "At will as a standard action, each enemy within 60 feet who can hear you shout must save or become shaken for 1 round (Will DC 10 + incarnum blade level + Con modifier).";
|
|
if (nChakra == CHAKRA_WAIST ) sString = "You gain a +10 bonus on checks made to avoid being bull rushed, grappled, tripped, or overrun. You also gain Uncanny Dodge";
|
|
if (nChakra == CHAKRA_HEART ) sString = "You gain temporary hit points equal to twice your character level (maximum +40)";
|
|
if (nChakra == CHAKRA_SOUL ) sString = "You break DR up to +3, and deal 1d6 damage to creatures of one opposed alignment";
|
|
|
|
return sString;
|
|
}
|
|
|
|
int ChakraToBlademeld(int nChakra)
|
|
{
|
|
int nMeld;
|
|
if (nChakra == CHAKRA_CROWN ) nMeld = MELD_BLADEMELD_CROWN;
|
|
if (nChakra == CHAKRA_FEET ) nMeld = MELD_BLADEMELD_FEET;
|
|
if (nChakra == CHAKRA_HANDS ) nMeld = MELD_BLADEMELD_HANDS;
|
|
if (nChakra == CHAKRA_ARMS ) nMeld = MELD_BLADEMELD_ARMS;
|
|
if (nChakra == CHAKRA_BROW ) nMeld = MELD_BLADEMELD_BROW;
|
|
if (nChakra == CHAKRA_SHOULDERS) nMeld = MELD_BLADEMELD_SHOULDERS;
|
|
if (nChakra == CHAKRA_THROAT ) nMeld = MELD_BLADEMELD_THROAT;
|
|
if (nChakra == CHAKRA_WAIST ) nMeld = MELD_BLADEMELD_WAIST;
|
|
if (nChakra == CHAKRA_HEART ) nMeld = MELD_BLADEMELD_HEART;
|
|
if (nChakra == CHAKRA_SOUL ) nMeld = MELD_BLADEMELD_SOUL;
|
|
|
|
return nMeld;
|
|
} |