PRC8/nwn/nwnprc/trunk/include/prc_inc_domain.nss
Jaysyn904 4fb9f2783b Disabled Hidden Talent until it's actually finished
Disabled Hidden Talent until it's actually finished.  Fixed a few typos & some formatting.
2025-02-07 19:11:46 -05:00

586 lines
25 KiB
Plaintext

//::///////////////////////////////////////////////
//:: PRC Bonus Domains
//:: prc_inc_domain.nss
//:://////////////////////////////////////////////
//:: Handles all of the code for bonus domains.
//:://////////////////////////////////////////////
//:: Created By: Stratovarius.
//:: Created On: August 31st, 2005
//:://////////////////////////////////////////////
//:: Updated for .35 by Jaysyn 2023/03/10
// Function returns the domain in the input slot.
// A person can have a maximum of 5 bonus domains.
int GetBonusDomain(object oPC, int nSlot);
// Function will add a bonus domain to the stored list on the character.
void AddBonusDomain(object oPC, int nDomain);
// Uses the slot and level to find the appropriate spell, then casts it using ActionCastSpell
// It will also decrement a spell from that level
// If the domain does not have an appropriate spell for that level, an error message appears and nothing happens
void CastDomainSpell(object oPC, int nSlot, int nLevel);
// Takes the domain and spell level and uses it to find the appropriate spell.
// Right now it uses 2da reads on the domains.2da, although it could be scripted if desired.
int GetDomainSpell(int nDomain, int nLevel, object oPC);
// Takes the spell level, and returns the radial feat for that level.
// Used in case there is no spell of the appropriate level.
int SpellLevelToFeat(int nLevel);
// Will return the domain name as a string
// This is used to tell a PC what domains he has in what slot
string GetDomainName(int nDomain);
// This is the starter function, and fires from Enter and Levelup
// It checks all of the bonus domain feats, and gives the PC the correct domains
void CheckBonusDomains(object oPC);
// Returns the spell to be burned for CastDomainSpell
int GetBurnableSpell(object oPC, int nLevel);
// Returns the Domain Power feat
int GetDomainFeat(int nDomain);
// Returns the Uses per day of the feat entered
int GetDomainFeatUsesPerDay(int nFeat, object oPC);
// This counts down the number of times a domain has been used in a day
// Returns TRUE if the domain use is valid
// Returns FALSE if the player is out of uses per day
int DecrementDomainUses(int nDomain, object oPC);
// Used to determine which domain has cast the Turn Undead spell
// Returns the domain constant
int GetTurningDomain(int nSpell);
// Checks to see if the player has a domain.
// Looks for the domain power constants since every domain has those
int GetHasDomain(object oPC, int nDomain);
// Cleans the ints that limit the domain spells to being cast 1/day
void BonusDomainRest(object oPC);
//#include "prc_inc_clsfunc"
#include "prc_alterations"
#include "prc_getbest_inc"
#include "inc_dynconv"
int GetBonusDomain(object oPC, int nSlot)
{
/*string sName = "PRCBonusDomain" + IntToString(nSlot);
// Return value in case there is nothing in the slot
int nDomain = 0;
nDomain = GetPersistantLocalInt(oPC, sName);*/
return GetPersistantLocalInt(oPC, "PRCBonusDomain" + IntToString(nSlot));
}
void AddBonusDomain(object oPC, int nDomain)
{
//if(DEBUG) DoDebug("AddBonusDomain is running.");
// Loop through the domain slots to see if there is an open one.
int nSlot = 1;
int nTest = GetBonusDomain(oPC, nSlot);
while(nTest > 0 && 5 >= nSlot)
{
nSlot += 1;
// If the test domain and the domain to be added are the same
// shut down the function, since you don't want to add a domain twice.
if(nTest == nDomain)
{
//FloatingTextStringOnCreature("You already have this domain as a bonus domain.", oPC, FALSE);
return;
}
nTest = GetBonusDomain(oPC, nSlot);
}
// If you run out of slots, display message and end function
if (nSlot > 5)
{
FloatingTextStringOnCreature("You have more than 5 bonus domains, your last domain is lost.", oPC, FALSE);
return;
}
// If we're here, we know we have an open slot, so we add the domain into it.
string sName = "PRCBonusDomain" + IntToString(nSlot);
SetPersistantLocalInt(oPC, sName, nDomain);
FloatingTextStringOnCreature("You have " + GetStringByStrRef(StringToInt(Get2DACache("prc_domains", "Name", nDomain - 1))) + " as a bonus domain", oPC, FALSE);
}
int TestSpellTarget(object oPC, object oTarget, int nSpell)
{
int nTargetType = ~(HexToInt(Get2DACache("spells", "TargetType", nSpell)));
if(oTarget == oPC && nTargetType & 1)
{
SendMessageToPC(oPC, "You cannot target yourself!");
return FALSE;
}
else if(GetIsObjectValid(oTarget))
{
int nObjectType = GetObjectType(oTarget);
if(nObjectType == OBJECT_TYPE_CREATURE && nTargetType & 2)
{
SendMessageToPC(oPC, "You cannot target creatures");
return FALSE;
}
else if(nObjectType == OBJECT_TYPE_ITEM && nTargetType & 8)
{
SendMessageToPC(oPC, "You cannot target items");
return FALSE;
}
else if(nObjectType == OBJECT_TYPE_DOOR && nTargetType & 16)
{
SendMessageToPC(oPC, "You cannot target doors");
return FALSE;
}
else if(nObjectType == OBJECT_TYPE_PLACEABLE && nTargetType & 32)
{
SendMessageToPC(oPC, "You cannot target placeables");
return FALSE;
}
}
else if(nTargetType & 4)
{
SendMessageToPC(oPC, "You cannot target locations");
return FALSE;
}
return TRUE;
}
// Classes using new spellbook systems are handeled separately
int GetIsBioDivineClass(int nClass)
{
return nClass == CLASS_TYPE_CLERIC
|| nClass == CLASS_TYPE_DRUID
|| nClass == CLASS_TYPE_PALADIN
|| nClass == CLASS_TYPE_SHAMAN
|| nClass == CLASS_TYPE_UR_PRIEST
|| nClass == CLASS_TYPE_RANGER;
}
void CastDomainSpell(object oPC, int nSlot, int nLevel)
{
if(GetLocalInt(oPC, "DomainCastSpell" + IntToString(nLevel))) //Already cast a spell of this level?
{
FloatingTextStringOnCreature("You have already cast your domain spell for level " + IntToString(nLevel), oPC, FALSE);
return;
}
int nSpell = GetDomainSpell(GetBonusDomain(oPC, nSlot), nLevel, oPC);
// If there is no spell for that level, you cant cast it.
if(nSpell == -1)
return;
// Subradial spells are handled through conversation
int bSubRadial = Get2DACache("spells", "SubRadSpell1", nSpell) != "";
// Domain casting feats use generic targeting, so check if spell can be cast at selected target
object oTarget = GetSpellTargetObject();
if(!bSubRadial && !TestSpellTarget(oPC, oTarget, nSpell))
return;
int nClass, nCount, nMetamagic = METAMAGIC_NONE;
// Mystic is a special case - checked first
if(GetLevelByClass(CLASS_TYPE_MYSTIC, oPC) || GetLevelByClass(CLASS_TYPE_NIGHTSTALKER, oPC))
{
// Mystics can use metamagic with domain spells
nClass = GetLevelByClass(CLASS_TYPE_MYSTIC, oPC) ? CLASS_TYPE_MYSTIC : CLASS_TYPE_NIGHTSTALKER;
nMetamagic = GetLocalInt(oPC, "MetamagicFeatAdjust");
int nSpellLevel = nLevel;
if(nMetamagic)
{
//Need to check if metamagic can be applied to a spell
int nMetaTest;
int nMetaType = HexToInt(Get2DACache("spells", "MetaMagic", nSpell));
switch(nMetamagic)
{
case METAMAGIC_NONE: nMetaTest = 1; break; //no need to change anything
case METAMAGIC_EMPOWER: nMetaTest = nMetaType & 1; nSpellLevel += 2; break;
case METAMAGIC_EXTEND: nMetaTest = nMetaType & 2; nSpellLevel += 1; break;
case METAMAGIC_MAXIMIZE: nMetaTest = nMetaType & 4; nSpellLevel += 3; break;
case METAMAGIC_QUICKEN: nMetaTest = nMetaType & 8; nSpellLevel += 4; break;
case METAMAGIC_SILENT: nMetaTest = nMetaType & 16; nSpellLevel += 1; break;
case METAMAGIC_STILL: nMetaTest = nMetaType & 32; nSpellLevel += 1; break;
}
if(!nMetaTest)//can't use selected metamagic with this spell
{
nMetamagic = METAMAGIC_NONE;
ActionDoCommand(SendMessageToPC(oPC, "You can't use "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSpell)))+"with selected metamagic."));
nSpellLevel = nLevel;
}
else if(nLevel > 9)//now test the spell level
{
nMetamagic = METAMAGIC_NONE;
ActionDoCommand(SendMessageToPC(oPC, "Modified spell level is to high! Casting spell without metamagic"));
nSpellLevel = nLevel;
}
else if(GetLocalInt(oPC, "PRC_metamagic_state") == 1)
SetLocalInt(oPC, "MetamagicFeatAdjust", 0);
}
nCount = persistant_array_get_int(oPC, "NewSpellbookMem_" + IntToString(CLASS_TYPE_MYSTIC), nSpellLevel);
// we can't cast metamagiced version of the spell - assuming that player want to cast the spell anyway
if(!nCount)
nCount = persistant_array_get_int(oPC, "NewSpellbookMem_" + IntToString(CLASS_TYPE_MYSTIC), nLevel);
// Do we have slots available?
if(nCount)
{
// Prepare to cast the spell
nLevel = nSpellLevel;//correct the spell level if we're using metamagic
SetLocalInt(oPC, "NSB_Class", nClass);
SetLocalInt(oPC, "NSB_SpellLevel", nLevel);
}
}
// checking 'newspellbook' classes is much faster than checking bioware spellbooks
if(!nCount)
{
int n;
for(n = 1; n < 9; n++)
{
nClass = GetClassByPosition(n, oPC);
// Check to see if you can burn a spell of that slot or if the person has already
// cast all of their level X spells for the day
if(!GetIsBioDivineClass(nClass))
{
int nSpellbook = GetSpellbookTypeForClass(nClass);
if(nSpellbook == SPELLBOOK_TYPE_SPONTANEOUS)
{
nCount = persistant_array_get_int(oPC, "NewSpellbookMem_" + IntToString(nClass), nLevel);
if(nCount)
{// Prepare to cast the spell
SetLocalInt(oPC, "NSB_Class", nClass);
SetLocalInt(oPC, "NSB_SpellLevel", nLevel);
}
}
else if(nSpellbook == SPELLBOOK_TYPE_PREPARED)
{
string sArray = "NewSpellbookMem_"+IntToString(nClass);
string sIDX = "SpellbookIDX" + IntToString(nLevel) + "_" + IntToString(nClass);
int i, nSpellbookID, nMax = persistant_array_get_size(oPC, sIDX);
for(i = 0; i < nMax; i++)
{
nSpellbookID = persistant_array_get_int(oPC, sIDX, i);
nCount = persistant_array_get_int(oPC, sArray, nSpellbookID);
if(nCount)
{
SetLocalInt(oPC, "NSB_Class", nClass);
SetLocalInt(oPC, "NSB_SpellbookID", nSpellbookID);
break;
}
}
}
}
if(nCount)
//we have found valid spell slot, no point in running this loop again
break;
}
}
// test bioware spellbooks
if(!nCount)
{
nCount = GetBurnableSpell(oPC, nLevel) + 1;//fix for Acid Fog spell
if(nCount)
{
SetLocalInt(oPC, "Domain_BurnableSpell", nCount);
nClass = GetPrimaryDivineClass(oPC);
}
}
//No spell left to burn? Tell the player that.
if(!nCount)
{
FloatingTextStringOnCreature("You have no spells left to trade for a domain spell.", oPC, FALSE);
return;
}
SetLocalInt(oPC, "DomainCast", nLevel);
if(bSubRadial)
{
SetLocalInt(oPC, "DomainOrigSpell", nSpell);
SetLocalInt(oPC, "DomainCastClass", nClass);
SetLocalObject(oPC, "DomainTarget", oTarget);
SetLocalLocation(oPC, "DomainTarget", GetSpellTargetLocation());
StartDynamicConversation("prc_domain_conv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
else
{
if(nMetamagic & METAMAGIC_QUICKEN)
{
//Adding Auto-Quicken III for one round - deleted after casting is finished.
object oSkin = GetPCSkin(oPC);
int nCastDur = StringToInt(Get2DACache("spells", "ConjTime", nSpell)) + StringToInt(Get2DACache("spells", "CastTime", nSpell));
itemproperty ipAutoQuicken = ItemPropertyBonusFeat(IP_CONST_NSB_AUTO_QUICKEN);
ActionDoCommand(AddItemProperty(DURATION_TYPE_TEMPORARY, ipAutoQuicken, oSkin, nCastDur/1000.0f));
}
int nDC = 10 + nLevel + GetDCAbilityModForClass(nClass, oPC);
ActionCastSpell(nSpell, 0, nDC, 0, nMetamagic, nClass, FALSE, FALSE, OBJECT_INVALID, FALSE);
ActionDoCommand(DeleteLocalInt(oPC, "DomainCast"));
}
}
int GetDomainSpell(int nDomain, int nLevel, object oPC)
{
// The -1 on nDomains is to adjust from a base 1 to a base 0 system.
string sSpell = Get2DACache("prc_domains", "Level_" + IntToString(nLevel), (nDomain - 1));
if (DEBUG) DoDebug("Domain Spell: " + sSpell);
//if (DEBUG) DoDebug("GetDomainSpell has fired");
int nSpell = -1;
if(sSpell == "")
{
FloatingTextStringOnCreature("You do not have a domain spell of that level.", oPC, FALSE);
//int nFeat = SpellLevelToFeat(nLevel);
//IncrementRemainingFeatUses(oPC, nFeat);
}
else
{
nSpell = StringToInt(sSpell);
}
return nSpell;
}
int SpellLevelToFeat(int nLevel)
{
switch(nLevel)
{
case 1: return FEAT_CAST_DOMAIN_LEVEL_ONE;
case 2: return FEAT_CAST_DOMAIN_LEVEL_TWO;
case 3: return FEAT_CAST_DOMAIN_LEVEL_THREE;
case 4: return FEAT_CAST_DOMAIN_LEVEL_FOUR;
case 5: return FEAT_CAST_DOMAIN_LEVEL_FIVE;
case 6: return FEAT_CAST_DOMAIN_LEVEL_SIX;
case 7: return FEAT_CAST_DOMAIN_LEVEL_SEVEN;
case 8: return FEAT_CAST_DOMAIN_LEVEL_EIGHT;
case 9: return FEAT_CAST_DOMAIN_LEVEL_NINE;
}
return -1;
}
string GetDomainName(int nDomain)
{
string sName;
// Check that the domain slot is not empty
if(nDomain)
{
sName = Get2DACache("prc_domains", "Name", (nDomain - 1));
sName = GetStringByStrRef(StringToInt(sName));
}
else
sName = GetStringByStrRef(6497); // "Empty Slot"
return sName;
}
void CheckBonusDomains(object oPC)
{
int nBonusDomain, nDomainFeat;
int nSlot = 1;
while(nSlot < 6)
{
nBonusDomain = GetBonusDomain(oPC, nSlot);
nDomainFeat = GetDomainFeat(nBonusDomain);
if(!GetHasFeat(nDomainFeat, oPC)) SetPersistantLocalInt(oPC, "PRCBonusDomain" + IntToString(nSlot), 0);
//SendMessageToPC(oPC, "PRCBonusDomain"+IntToString(nSlot)" = "+IntToString(nBonusDomain));
//SendMessageToPC(oPC, "PRCBonusDomain"+IntToString(nSlot)" feat = "+IntToString(GetDomainFeat(nDomainFeat)));
nSlot += 1;
}
if (GetHasFeat(FEAT_BONUS_DOMAIN_AIR, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_AIR);
if (GetHasFeat(FEAT_BONUS_DOMAIN_ANIMAL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_ANIMAL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DEATH, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DEATH);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DESTRUCTION, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DESTRUCTION);
if (GetHasFeat(FEAT_BONUS_DOMAIN_EARTH, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_EARTH);
if (GetHasFeat(FEAT_BONUS_DOMAIN_EVIL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_EVIL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_FIRE, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_FIRE);
if (GetHasFeat(FEAT_BONUS_DOMAIN_GOOD, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_GOOD);
if (GetHasFeat(FEAT_BONUS_DOMAIN_HEALING, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_HEALING);
if (GetHasFeat(FEAT_BONUS_DOMAIN_KNOWLEDGE, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_KNOWLEDGE);
if (GetHasFeat(FEAT_BONUS_DOMAIN_MAGIC, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_MAGIC);
if (GetHasFeat(FEAT_BONUS_DOMAIN_PLANT, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_PLANT);
if (GetHasFeat(FEAT_BONUS_DOMAIN_PROTECTION, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_PROTECTION);
if (GetHasFeat(FEAT_BONUS_DOMAIN_STRENGTH, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_STRENGTH);
if (GetHasFeat(FEAT_BONUS_DOMAIN_SUN, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_SUN);
if (GetHasFeat(FEAT_BONUS_DOMAIN_TRAVEL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_TRAVEL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_TRICKERY, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_TRICKERY);
if (GetHasFeat(FEAT_BONUS_DOMAIN_WAR, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_WAR);
if (GetHasFeat(FEAT_BONUS_DOMAIN_WATER, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_WATER);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DARKNESS, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DARKNESS);
if (GetHasFeat(FEAT_BONUS_DOMAIN_STORM, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_STORM);
if (GetHasFeat(FEAT_BONUS_DOMAIN_METAL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_METAL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_PORTAL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_PORTAL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_FORCE, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_FORCE);
if (GetHasFeat(FEAT_BONUS_DOMAIN_SLIME, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_SLIME);
if (GetHasFeat(FEAT_BONUS_DOMAIN_TYRANNY, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_TYRANNY);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DOMINATION, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DOMINATION);
if (GetHasFeat(FEAT_BONUS_DOMAIN_SPIDER, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_SPIDER);
if (GetHasFeat(FEAT_BONUS_DOMAIN_UNDEATH, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_UNDEATH);
if (GetHasFeat(FEAT_BONUS_DOMAIN_TIME, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_TIME);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DWARF, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DWARF);
if (GetHasFeat(FEAT_BONUS_DOMAIN_CHARM, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_CHARM);
if (GetHasFeat(FEAT_BONUS_DOMAIN_ELF, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_ELF);
if (GetHasFeat(FEAT_BONUS_DOMAIN_FAMILY, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_FAMILY);
if (GetHasFeat(FEAT_BONUS_DOMAIN_FATE, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_FATE);
if (GetHasFeat(FEAT_BONUS_DOMAIN_GNOME, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_GNOME);
if (GetHasFeat(FEAT_BONUS_DOMAIN_ILLUSION, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_ILLUSION);
if (GetHasFeat(FEAT_BONUS_DOMAIN_HATRED, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_HATRED);
if (GetHasFeat(FEAT_BONUS_DOMAIN_HALFLING, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_HALFLING);
if (GetHasFeat(FEAT_BONUS_DOMAIN_NOBILITY, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_NOBILITY);
if (GetHasFeat(FEAT_BONUS_DOMAIN_OCEAN, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_OCEAN);
if (GetHasFeat(FEAT_BONUS_DOMAIN_ORC, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_ORC);
if (GetHasFeat(FEAT_BONUS_DOMAIN_RENEWAL, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_RENEWAL);
if (GetHasFeat(FEAT_BONUS_DOMAIN_RETRIBUTION, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_RETRIBUTION);
if (GetHasFeat(FEAT_BONUS_DOMAIN_RUNE, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_RUNE);
if (GetHasFeat(FEAT_BONUS_DOMAIN_SPELLS, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_SPELLS);
if (GetHasFeat(FEAT_BONUS_DOMAIN_SCALEYKIND, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_SCALEYKIND);
if (GetHasFeat(FEAT_BONUS_DOMAIN_BLIGHTBRINGER, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_BLIGHTBRINGER);
if (GetHasFeat(FEAT_BONUS_DOMAIN_DRAGON, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_DRAGON);
if (GetHasFeat(FEAT_BONUS_DOMAIN_COLD, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_COLD);
if (GetHasFeat(FEAT_BONUS_DOMAIN_WINTER, oPC)) AddBonusDomain(oPC, PRC_DOMAIN_WINTER);
//if (DEBUG) FloatingTextStringOnCreature("Check Bonus Domains is running", oPC, FALSE);
}
int GetBurnableSpell(object oPC, int nLevel)
{
int nBurnableSpell = -1;
if (nLevel == 1) nBurnableSpell = GetBestL1Spell(oPC, nBurnableSpell);
else if (nLevel == 2) nBurnableSpell = GetBestL2Spell(oPC, nBurnableSpell);
else if (nLevel == 3) nBurnableSpell = GetBestL3Spell(oPC, nBurnableSpell);
else if (nLevel == 4) nBurnableSpell = GetBestL4Spell(oPC, nBurnableSpell);
else if (nLevel == 5) nBurnableSpell = GetBestL5Spell(oPC, nBurnableSpell);
else if (nLevel == 6) nBurnableSpell = GetBestL6Spell(oPC, nBurnableSpell);
else if (nLevel == 7) nBurnableSpell = GetBestL7Spell(oPC, nBurnableSpell);
else if (nLevel == 8) nBurnableSpell = GetBestL8Spell(oPC, nBurnableSpell);
else if (nLevel == 9) nBurnableSpell = GetBestL9Spell(oPC, nBurnableSpell);
return nBurnableSpell;
}
int GetDomainFeat(int nDomain)
{
// The -1 on nDomain is to adjust from a base 1 to a base 0 system.
// Returns the domain power feat
return StringToInt(Get2DACache("domains", "GrantedFeat", nDomain - 1));
}
int GetDomainFeatUsesPerDay(int nFeat, object oPC)
{
int nUses = StringToInt(Get2DACache("feat", "USESPERDAY", nFeat));
// These are the domains that have ability based uses per day
if (nUses == 33)
{
// The Strength domain, which uses Strength when the Cleric has Kord levels
// Without Kord levels, its 1 use per day
if(nFeat == FEAT_STRENGTH_DOMAIN_POWER)
{
nUses = 1;
if(GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oPC)) nUses = GetAbilityModifier(ABILITY_STRENGTH, oPC);
// Catching exceptions
if(nUses < 1) nUses = 1;
}
if(nFeat == FEAT_SUN_DOMAIN_POWER)
{
if(GetHasFeat(FEAT_BONUS_DOMAIN_SUN, oPC) && GetLevelByClass(CLASS_TYPE_MYSTIC, oPC))
{
nUses = GetHasFeat(FEAT_EXTRA_TURNING, oPC) ? 7 : 3;
nUses += GetAbilityModifier(ABILITY_CHARISMA, oPC);
}
else
nUses = 1;
}
// All other ones so far are the Charisma based turning domains
nUses = 3 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
}
return nUses;
}
int DecrementDomainUses(int nDomain, object oPC)
{
int nReturn = TRUE;
int nUses = GetLocalInt(oPC, "BonusDomainUsesPerDay" + GetDomainName(nDomain));
// If there is still a valid use left, remove it
if (nUses >= 1) SetLocalInt(oPC, "BonusDomainUsesPerDay" + GetDomainName(nDomain), (nUses - 1));
// Tell the player how many uses he has left
else // He has no more uses for the day
{
nReturn = FALSE;
}
FloatingTextStringOnCreature("You have " + IntToString(nUses - 1) + " uses per day left of the " + GetDomainName(nDomain) + " power.", oPC, FALSE);
return nReturn;
}
int GetTurningDomain(int nSpell)
{
switch(nSpell)
{
case SPELL_TURN_REPTILE: return PRC_DOMAIN_SCALEYKIND;
case SPELL_TURN_OOZE: return PRC_DOMAIN_SLIME;
case SPELL_TURN_SPIDER: return PRC_DOMAIN_SPIDER;
case SPELL_TURN_PLANT: return PRC_DOMAIN_PLANT;
case SPELL_TURN_AIR: return PRC_DOMAIN_AIR;
case SPELL_TURN_EARTH: return PRC_DOMAIN_EARTH;
case SPELL_TURN_FIRE: return PRC_DOMAIN_FIRE;
case SPELL_TURN_WATER: return PRC_DOMAIN_WATER;
case SPELL_TURN_BLIGHTSPAWNED: return PRC_DOMAIN_BLIGHTBRINGER;
}
return -1;
}
int GetHasDomain(object oPC, int nDomain)
{
// Get the domain power feat for the appropriate domain
int nFeat = GetDomainFeat(nDomain);
return GetHasFeat(nFeat, oPC);
}
void BonusDomainRest(object oPC)
{
// Bonus Domain ints that limit you to casting 1/day per level
int i;
for (i = 1; i < 10; i++)
{
DeleteLocalInt(oPC, "DomainCastSpell" + IntToString(i));
}
// This is code to stop you from using the Domain per day abilities more than you should be able to
int i2;
// Highest domain constant is 62
for (i2 = 1; i2 < 63; i2++)
{
// This is to ensure they only get the ints set for the domains they do have
if (GetHasDomain(oPC, i2))
{
// Store the number of uses a day here
SetLocalInt(oPC, "BonusDomainUsesPerDay" + GetDomainName(i2), GetDomainFeatUsesPerDay(GetDomainFeat(i2), oPC));
}
}
}
int GetDomainCasterLevel(object oPC)
{
return GetLevelByClass(CLASS_TYPE_CLERIC, oPC)
+ GetLevelByClass(CLASS_TYPE_MYSTIC, oPC)
+ GetLevelByClass(CLASS_TYPE_SHAMAN, oPC)
+ GetLevelByClass(CLASS_TYPE_TEMPLAR, oPC)
+ GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oPC)
+ GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oPC)
+ GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oPC);
}