Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
968 lines
45 KiB
Plaintext
968 lines
45 KiB
Plaintext
//::///////////////////////////////////////////////
|
||
//:: Binding/Vestiges main include: Miscellaneous
|
||
//:: bnd_inc_bndfunc
|
||
//::///////////////////////////////////////////////
|
||
/** @file
|
||
Defines various functions and other stuff that
|
||
do something related to Binding.
|
||
|
||
@author Stratovarius
|
||
@date Created - 2021.02.02
|
||
*/
|
||
//:://////////////////////////////////////////////
|
||
//:://////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////
|
||
/* Function prototypes */
|
||
//////////////////////////////////////////////////
|
||
|
||
/**
|
||
* Determines the given creature's Binder level.
|
||
* The vestige is used for Favored Vestige
|
||
*
|
||
* @param oBinder The creature whose Binder level to determine
|
||
* @param nVestige The rowid of the vestige in spells.2da
|
||
*
|
||
* @return The Binder level
|
||
*/
|
||
int GetBinderLevel(object oBinder, int nVestige = -1);
|
||
|
||
/**
|
||
* Determines whether a given class is a Binding-related class or not.
|
||
*
|
||
* @param nClass CLASS_TYPE_* of the class to test
|
||
* @return TRUE if the class is a Binding-related class, FALSE otherwise
|
||
*/
|
||
int GetIsBindingClass(int nClass);
|
||
|
||
/**
|
||
* Calculates how many Binder levels are gained by a given creature from
|
||
* it's levels in prestige classes.
|
||
*
|
||
* @param oBinder Creature to calculate added Binder levels for
|
||
* @return The number of Binder levels gained
|
||
*/
|
||
int GetBindingPRCLevels(object oBinder);
|
||
|
||
/**
|
||
* Returns the master 2da of all vestiges - "vestiges"
|
||
*/
|
||
string GetVestigeFile();
|
||
|
||
/**
|
||
* Returns the master 2da of binds and bind levels - "cls_bind_binder"
|
||
*/
|
||
string GetBindingClassFile(int nClass);
|
||
|
||
/**
|
||
* Casts a particular vestige on the binder
|
||
* Should only ever be called via Contact Vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige to attempt binding
|
||
*/
|
||
void ApplyVestige(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Removes a particular vestige from the binder
|
||
* Should only ever be called via Contact Vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige to expel
|
||
*/
|
||
void ExpelVestige(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Rolls the check to see whether it is a good or bad pact
|
||
* Sets a local int to mark pact quality
|
||
*
|
||
* @param oBinder The binder attempting the check
|
||
* @param nVestige The rowid of the vestige in vestiges.2da
|
||
*
|
||
* @return The rowid of the vestige in spells.2da
|
||
*/
|
||
int DoBindingCheck(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Does the animations and count down to bind a particular vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nTime Should always be 66 seconds
|
||
* @param nVestige The vestige to attempt binding
|
||
* @param nExpel Whether this is a usage of expel vestige or not
|
||
*/
|
||
void ContactVestige(object oBinder, int nTime, int nVestige, int nExpel = FALSE);
|
||
|
||
/**
|
||
* Does the animations and count down to bind a particular vestige
|
||
* Should only ever be called via Contact Vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nTime Should always be 60 seconds
|
||
* @param nVestige The vestige to attempt binding
|
||
* @param nExpel Whether this is a usage of expel vestige or not
|
||
*/
|
||
void BindVestige(object oBinder, int nTime, int nVestige, int nExpel = FALSE);
|
||
|
||
/**
|
||
* Checks to see whether an ability is off cooldown or not
|
||
* Sets the cooldown if the ability is usable
|
||
* Informs the player via floating text
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nAbil The vestige ability (such as Amon's Fire Breath SpellId)
|
||
* @param nVestige The vestige the ability comes from (such as VESTIGE_AMON)
|
||
*
|
||
* @return TRUE/FALSE for off cooldown or not
|
||
*/
|
||
int BindAbilCooldown(object oBinder, int nAbil, int nVestige);
|
||
|
||
/**
|
||
* How many vestiges can the binder have bound
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return A number between 1 and 4
|
||
*/
|
||
int GetMaxVestigeCount(object oBinder);
|
||
|
||
/**
|
||
* What is the highest level vestige the binder can bind?
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return A number between 1 and 8
|
||
*/
|
||
int GetMaxVestigeLevel(object oBinder);
|
||
|
||
/**
|
||
* What is the vestige's level?
|
||
*
|
||
* @param nVestige The vestige rowid in vestiges.2da
|
||
*
|
||
* @return A number between 1 and 8
|
||
*/
|
||
int GetVestigeLevel(int nVestige);
|
||
|
||
/**
|
||
* How many total binds are active on the binder?
|
||
* Checks via the spellid of the vestiges
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return 0 or higher
|
||
*/
|
||
int GetBindCount(object oBinder);
|
||
|
||
/**
|
||
* How many uses of pact augmentation does the
|
||
* binder get when he binds a vestige?
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return 0 to 5
|
||
*/
|
||
int GetPactAugmentCount(object oBinder);
|
||
|
||
/**
|
||
* Returns the penalty to be applied if the
|
||
* binder made a bad pact with the vestige
|
||
* Should never be called directly
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return Linked effect
|
||
*/
|
||
effect EffectPact(object oBinder);
|
||
|
||
/**
|
||
* Checks whether the binder has the rapid recovery
|
||
* feat for the named vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return TRUE/FALSE
|
||
*/
|
||
int RapidRecovery(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Checks whether the binder has the favored vestige
|
||
* feat for the named vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return TRUE/FALSE
|
||
*/
|
||
int FavoredVestige(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Checks whether the binder has the favored vestige
|
||
* focus feat for the named vestige
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return TRUE/FALSE
|
||
*/
|
||
int FavoredVestigeFocus(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Returns the DC for saving against a vestige's abilities
|
||
* 10 + 1/2 Binding level + Charisma Modifier + bonuses
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return A number
|
||
*/
|
||
int GetBinderDC(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Checks for the special requirements of each vestige
|
||
* or for the presence of the Ignore Special Requirements
|
||
* feat. True means passing requirements, False is a fail
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return TRUE/FALSE
|
||
*/
|
||
int DoSpecialRequirements(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Checks for the special requirements of each vestige
|
||
* or for the presence of the Ignore Special Requirements
|
||
* feat. True means passing requirements, False is a fail
|
||
*
|
||
* This is for requirements that apply during the summoning process
|
||
* due to having a cost that applies only after the user has selected
|
||
* which vestige they wish to bind
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige rowid in spells.2da
|
||
*
|
||
* @return TRUE/FALSE
|
||
*/
|
||
int DoSummonRequirements(object oBinder, int nVestige);
|
||
|
||
/**
|
||
* Checks for whether the vestige ability was exploited (meaning not
|
||
* granted) by the Anima Mage class feature.
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige ability rowid in vestigeabil.2da
|
||
*
|
||
* @return TRUE if exploited/FALSE otherwise
|
||
*/
|
||
int GetIsVestigeExploited(object oBinder, int nVestigeAbil);
|
||
|
||
/**
|
||
* Marks a vestige ability as exploited (meaning it will not be
|
||
* granted) by the Anima Mage class feature.
|
||
*
|
||
* @param oBinder The binder
|
||
* @param nVestige The vestige ability rowid in vestigeabil.2da
|
||
*/
|
||
void SetIsVestigeExploited(object oBinder, int nVestigeAbil);
|
||
|
||
/**
|
||
* Checks whether the patron vestige is bound to a Knight of the Sacred Seal
|
||
* If not, the class loses all class features
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return TRUE if bound, FALSE otherwise
|
||
*/
|
||
int GetIsPatronVestigeBound(object oBinder);
|
||
|
||
/**
|
||
* Checks who the patron vestige is for a Knight of the Sacred Seal
|
||
* Used to ensure they always have a good pact with their patron
|
||
*
|
||
* @param oBinder The binder
|
||
*
|
||
* @return The VESTIGE_* const if one exists, -1 otherwise
|
||
*/
|
||
int GetPatronVestige(object oBinder);
|
||
|
||
//////////////////////////////////////////////////
|
||
/* Includes */
|
||
//////////////////////////////////////////////////
|
||
|
||
#include "prc_inc_spells"
|
||
#include "inc_dynconv"
|
||
|
||
//////////////////////////////////////////////////
|
||
/* Constants */
|
||
//////////////////////////////////////////////////
|
||
|
||
const int VESTIGE_CONTACT_TIME = 66;
|
||
const int VESTIGE_BINDING_TIME = 60;
|
||
|
||
//////////////////////////////////////////////////
|
||
/* Function definitions */
|
||
//////////////////////////////////////////////////
|
||
|
||
int GetBinderLevel(object oBinder, int nVestige = -1)
|
||
{
|
||
int nLevel;
|
||
|
||
if(GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
|
||
{
|
||
// Binder level is class level + prestige
|
||
nLevel = GetLevelByClass(CLASS_TYPE_BINDER, oBinder);
|
||
nLevel += GetBindingPRCLevels(oBinder);
|
||
}
|
||
// If you have no levels in binder, but you have Bind Vestige feat
|
||
else if (GetHasFeat(FEAT_BIND_VESTIGE, oBinder))
|
||
{
|
||
nLevel = 1;
|
||
if (GetHasFeat(FEAT_BIND_VESTIGE_IMPROVED, oBinder)) nLevel += 4;
|
||
}
|
||
if (FavoredVestige(oBinder, nVestige)) nLevel += 1;
|
||
if (GetHasSpellEffect(VESTIGE_IPOS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_IPOS_INFLUENCE) && nVestige >= VESTIGE_AMON) nLevel += 1;
|
||
|
||
if(DEBUG) DoDebug("Binder Level: " + IntToString(nLevel));
|
||
|
||
return nLevel;
|
||
}
|
||
|
||
int GetIsBindingClass(int nClass)
|
||
{
|
||
return nClass == CLASS_TYPE_BINDER;
|
||
}
|
||
|
||
int GetBindingPRCLevels(object oBinder)
|
||
{
|
||
int nLevel = GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oBinder);
|
||
nLevel += GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder);
|
||
nLevel += GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder);
|
||
|
||
// These don't add at 1st level
|
||
if (GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder))
|
||
nLevel += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder) - 1;
|
||
|
||
return nLevel;
|
||
}
|
||
|
||
string GetVestigeFile()
|
||
{
|
||
return "vestiges";
|
||
}
|
||
|
||
string GetBindingClassFile(int nClass)
|
||
{
|
||
string sFile;
|
||
if (nClass == CLASS_TYPE_BINDER) sFile = "cls_bind_binder";
|
||
|
||
return sFile;
|
||
}
|
||
|
||
void ApplyVestige(object oBinder, int nVestige)
|
||
{
|
||
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
|
||
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
|
||
ActionCastSpellOnSelf(nVestige, METAMAGIC_NONE, oBinder);
|
||
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) >= 2)
|
||
{
|
||
PRCRemoveSpellEffects(VESTIGE_PACT_AUGMENTATION, oBinder, oBinder);
|
||
GZPRCRemoveSpellEffects(VESTIGE_PACT_AUGMENTATION, oBinder, FALSE);
|
||
ActionCastSpellOnSelf(VESTIGE_PACT_AUGMENTATION, METAMAGIC_NONE, oBinder);
|
||
}
|
||
if (DEBUG) DoDebug("Applying Vestige "+IntToString(nVestige)+" on "+GetName(oBinder));
|
||
|
||
// If you have hosted one of these spirits within the last 24 hours, Amon refuses to answer your call.
|
||
if (nVestige == VESTIGE_LERAJE ||
|
||
nVestige == VESTIGE_CHUPOCLOPS ||
|
||
nVestige == VESTIGE_KARSUS ||
|
||
nVestige == VESTIGE_EURYNOME)
|
||
{
|
||
SetLocalInt(oBinder, "AmonHater", TRUE);
|
||
DelayCommand(HoursToSeconds(48), DeleteLocalInt(oBinder, "AmonHater"));
|
||
}
|
||
|
||
// Only good quality pacts get the bonus spell
|
||
if (GetLocalInt(oBinder, "PactQuality"+IntToString(nVestige)) && GetLocalInt(oBinder, "ExploitVestigeConv"))
|
||
{
|
||
DelayCommand(0.5, StartDynamicConversation("bnd_exploitcnv", oBinder, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, FALSE, TRUE, oBinder));
|
||
DeleteLocalInt(oBinder, "ExploitVestigeConv");
|
||
}
|
||
}
|
||
|
||
void ExpelVestige(object oBinder, int nVestige)
|
||
{
|
||
SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
|
||
SetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nVestige), TRUE);
|
||
// Here, making a good pack means we can unbind it
|
||
if (GetLocalInt(oBinder, "PactQuality"+IntToString(nVestige)))
|
||
{
|
||
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
|
||
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
|
||
FloatingTextStringOnCreature("Expelled "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nVestige)))+" successfully!", oBinder, FALSE);
|
||
}
|
||
else
|
||
FloatingTextStringOnCreature("Failed to expel "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nVestige))), oBinder, FALSE);
|
||
}
|
||
|
||
int DoBindingCheck(object oBinder, int nVestige)
|
||
{
|
||
int nApply = StringToInt(Get2DACache("vestiges", "SpellID", nVestige));
|
||
|
||
// Knights of the Sacred Seal always have a good pact with their Patron
|
||
if (GetPatronVestige(oBinder) == nApply)
|
||
{
|
||
SetLocalInt(oBinder, "PactQuality"+IntToString(nApply), TRUE);
|
||
return nApply; //We don't need the rest of the function here.
|
||
}
|
||
// Scions of Dantalion always have a good pact with Dantalion
|
||
if (GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder) && VESTIGE_DANTALION == nApply)
|
||
{
|
||
SetLocalInt(oBinder, "PactQuality"+IntToString(nApply), TRUE);
|
||
return nApply; //We don't need the rest of the function here.
|
||
}
|
||
|
||
int nRoll = d20()+ GetBinderLevel(oBinder) + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
|
||
if (GetHasFeat(FEAT_SKILLED_PACT_MAKING, oBinder)) nRoll += 4;
|
||
// -10 penalty on the check
|
||
if (GetLocalInt(oBinder, "RushedBinding"))
|
||
{
|
||
DeleteLocalInt(oBinder, "RushedBinding");
|
||
nRoll -= 10;
|
||
}
|
||
// After expelling a vestige, take a -10 penalty on the check
|
||
if (GetPersistantLocalInt(oBinder, "ExpelledVestige"))
|
||
{
|
||
DeletePersistantLocalInt(oBinder, "ExpelledVestige");
|
||
nRoll -= 10;
|
||
}
|
||
// Next time you rebind an expelled vestige, take a penalty on the check
|
||
if (GetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nApply)))
|
||
{
|
||
DeletePersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nApply));
|
||
nRoll -= 10;
|
||
}
|
||
// Exploiting a vestige grants a -5 on the check
|
||
if (GetLocalInt(oBinder, "ExploitVestigeTemp"))
|
||
{
|
||
nRoll -= 5;
|
||
FloatingTextStringOnCreature("Exploiting vestige", oBinder);
|
||
// This int is only for this Binding check
|
||
DeleteLocalInt(oBinder, "ExploitVestigeTemp");
|
||
}
|
||
int nDC = StringToInt(Get2DACache("vestiges", "BindDC", nVestige));
|
||
SendMessageToPC(oBinder, "Binding Check: "+IntToString(nRoll)+" vs a DC of "+IntToString(nDC));
|
||
DeleteLocalInt(oBinder, "PactQuality"+IntToString(nApply));
|
||
// Mark a good pact
|
||
if (nRoll >= nDC) SetLocalInt(oBinder, "PactQuality"+IntToString(nApply), TRUE);
|
||
|
||
return nApply;
|
||
}
|
||
|
||
void BindVestige(object oBinder, int nTime, int nVestige, int nExpel = FALSE)
|
||
{
|
||
if (0 >= nTime)
|
||
{
|
||
SetCutsceneMode(oBinder, FALSE);
|
||
// We're expelling a vestige, not binding one
|
||
if (nExpel)
|
||
ExpelVestige(oBinder, DoBindingCheck(oBinder, nVestige));
|
||
// Make a check and apply the vestige
|
||
else
|
||
ApplyVestige(oBinder, DoBindingCheck(oBinder, nVestige));
|
||
}
|
||
else if (!GetIsInCombat(oBinder)) // Being in combat causes this to fail
|
||
{
|
||
FloatingTextStringOnCreature("You must spend " + IntToString(nTime) +" more seconds to complete the binding", oBinder, FALSE);
|
||
DelayCommand(6.0, BindVestige(oBinder, nTime - 6, nVestige, nExpel));
|
||
SetCutsceneMode(oBinder, TRUE);
|
||
AssignCommand(oBinder, ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 6.0));
|
||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_MAZE), GetLocation(oBinder), 6.0);
|
||
}
|
||
else
|
||
SetCutsceneMode(oBinder, FALSE);
|
||
}
|
||
|
||
void ContactVestige(object oBinder, int nTime, int nVestige, int nExpel = FALSE)
|
||
{
|
||
if (0 >= nTime)
|
||
{
|
||
SetCutsceneMode(oBinder, FALSE);
|
||
if (!DoSummonRequirements(oBinder, nVestige)) return;
|
||
int nBindTime = VESTIGE_BINDING_TIME;
|
||
if(GetPRCSwitch(PRC_BIND_VESTIGE_TIMER) >= 12) nBindTime = GetPRCSwitch(PRC_BIND_VESTIGE_TIMER);
|
||
if (GetLocalInt(oBinder, "RushedBinding") || GetLocalInt(oBinder, "RapidPactMaking")) nBindTime = 6;
|
||
BindVestige(oBinder, nBindTime, nVestige, nExpel);
|
||
}
|
||
else if (!GetIsInCombat(oBinder)) // Being in combat causes this to fail
|
||
{
|
||
FloatingTextStringOnCreature("You must draw the symbol for another " + IntToString(nTime) +" seconds", oBinder, FALSE);
|
||
DelayCommand(6.0, ContactVestige(oBinder, nTime - 6, nVestige, nExpel));
|
||
SetCutsceneMode(oBinder, TRUE);
|
||
AssignCommand(oBinder, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 6.0));
|
||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_SYMB_INSAN), GetLocation(oBinder), 6.0);
|
||
}
|
||
else
|
||
SetCutsceneMode(oBinder, FALSE);
|
||
}
|
||
|
||
int BindAbilCooldown(object oBinder, int nAbil, int nVestige)
|
||
{
|
||
int nCheck = GetLocalInt(oBinder, "Bind"+IntToString(nAbil));
|
||
// On Cooldown
|
||
if (nCheck)
|
||
{
|
||
// Free use
|
||
if (GetLocalInt(oBinder, "KotSSSurge"))
|
||
{
|
||
DeleteLocalInt(oBinder, "KotSSSurge");
|
||
FloatingTextStringOnCreature("Using Vestige's Surge on "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nAbil))), oBinder, FALSE);
|
||
return TRUE;
|
||
}
|
||
FloatingTextStringOnCreature(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nAbil)))+" is still on cooldown!", oBinder, FALSE);
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
SetLocalInt(oBinder, "Bind"+IntToString(nAbil), TRUE);
|
||
// Default number of rounds
|
||
int nDelay = 5;
|
||
// Makes it one round faster
|
||
if (RapidRecovery(oBinder, nVestige)) nDelay -= 1;
|
||
DelayCommand(RoundsToSeconds(nDelay), DeleteLocalInt(oBinder, "Bind"+IntToString(nAbil)));
|
||
DelayCommand(RoundsToSeconds(nDelay), FloatingTextStringOnCreature(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nAbil)))+" is off cooldown", oBinder, FALSE));
|
||
FloatingTextStringOnCreature("You must wait " + IntToString(nDelay) +" rounds before using "+GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nAbil)))+" again", oBinder, FALSE);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
int GetMaxVestigeCount(object oBinder)
|
||
{
|
||
int nMax = StringToInt(Get2DACache(GetBindingClassFile(CLASS_TYPE_BINDER), "Vestiges", GetBinderLevel(oBinder)));
|
||
|
||
if (DEBUG) DoDebug("GetMaxVestigeCount is "+IntToString(nMax));
|
||
return nMax;
|
||
}
|
||
|
||
int GetMaxVestigeLevel(object oBinder)
|
||
{
|
||
int nLevel = GetBinderLevel(oBinder);
|
||
if (GetHasFeat(FEAT_IMPROVED_BINDING, oBinder)) nLevel += 2;
|
||
// Due to the 2da starting at row 0
|
||
int nMax = StringToInt(Get2DACache(GetBindingClassFile(CLASS_TYPE_BINDER), "VestigeLvl", nLevel - 1));
|
||
|
||
if (DEBUG) DoDebug("GetMaxVestigeLevel is "+IntToString(nMax));
|
||
return nMax;
|
||
}
|
||
|
||
int GetVestigeLevel(int nVestige)
|
||
{
|
||
int nMax = StringToInt(Get2DACache("Vestiges", "Level", nVestige));
|
||
|
||
if (DEBUG) DoDebug("GetVestigeLevel is "+IntToString(nMax));
|
||
return nMax;
|
||
}
|
||
|
||
int GetBindCount(object oBinder)
|
||
{
|
||
int i, nCount;
|
||
for(i = VESTIGE_AMON; i <= VESTIGE_ABYSM; i++)
|
||
if(GetHasSpellEffect(i, oBinder)) nCount++;
|
||
|
||
if (DEBUG) DoDebug("GetBindCount is "+IntToString(nCount));
|
||
return nCount;
|
||
}
|
||
|
||
int GetPactAugmentCount(object oBinder)
|
||
{
|
||
int nClass = GetLevelByClass(CLASS_TYPE_BINDER, oBinder);
|
||
int nCount = 0;
|
||
|
||
if (nClass >= 20) nCount = 5;
|
||
else if (nClass >= 16) nCount = 4;
|
||
else if (nClass >= 10) nCount = 3;
|
||
else if (nClass >= 5) nCount = 2;
|
||
else if (nClass >= 2) nCount = 1;
|
||
|
||
if (DEBUG) DoDebug("GetPactAugmentCount is "+IntToString(nCount));
|
||
return nCount;
|
||
}
|
||
|
||
effect EffectPact(object oBinder)
|
||
{
|
||
effect eEffect;
|
||
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(GetSpellId())))
|
||
{
|
||
// <20>1 penalty on attack rolls, saving throws, and skill checks
|
||
eEffect = EffectLinkEffects(EffectSkillDecrease(SKILL_ALL_SKILLS, 1), EffectSavingThrowDecrease(SAVING_THROW_ALL, 1));
|
||
eEffect = EffectLinkEffects(eEffect, EffectAttackDecrease(1));
|
||
}
|
||
else // NWN hates having a blank effect
|
||
eEffect = EffectLinkEffects(EffectSkillDecrease(SKILL_DISCIPLINE, 1), EffectSkillIncrease(SKILL_DISCIPLINE, 1));
|
||
|
||
return eEffect;
|
||
}
|
||
|
||
int RapidRecovery(object oBinder, int nVestige)
|
||
{
|
||
int nFavored;
|
||
|
||
if (GetHasFeat(FEAT_RAPID_RECOVERY_AMON, oBinder) && nVestige == VESTIGE_AMON) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_AYM , oBinder) && nVestige == VESTIGE_AYM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_LERAJE , oBinder) && nVestige == VESTIGE_LERAJE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_NABERIUS , oBinder) && nVestige == VESTIGE_NABERIUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_RONOVE , oBinder) && nVestige == VESTIGE_RONOVE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_DAHLVERNAR , oBinder) && nVestige == VESTIGE_DAHLVERNAR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_HAAGENTI , oBinder) && nVestige == VESTIGE_HAAGENTI ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_MALPHAS , oBinder) && nVestige == VESTIGE_MALPHAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_SAVNOK , oBinder) && nVestige == VESTIGE_SAVNOK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ANDROMALIUS, oBinder) && nVestige == VESTIGE_ANDROMALIUS) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_FOCALOR , oBinder) && nVestige == VESTIGE_FOCALOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_KARSUS , oBinder) && nVestige == VESTIGE_KARSUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_PAIMON , oBinder) && nVestige == VESTIGE_PAIMON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_AGARES , oBinder) && nVestige == VESTIGE_AGARES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ANDRAS , oBinder) && nVestige == VESTIGE_ANDRAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_BUER , oBinder) && nVestige == VESTIGE_BUER ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_EURYNOME , oBinder) && nVestige == VESTIGE_EURYNOME ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_TENEBROUS , oBinder) && nVestige == VESTIGE_TENEBROUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ARETE , oBinder) && nVestige == VESTIGE_ARETE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ASTAROTH , oBinder) && nVestige == VESTIGE_ASTAROTH ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ACERERAK , oBinder) && nVestige == VESTIGE_ACERERAK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_BALAM , oBinder) && nVestige == VESTIGE_BALAM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_DANTALION , oBinder) && nVestige == VESTIGE_DANTALION ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_GERYON , oBinder) && nVestige == VESTIGE_GERYON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_OTIAX , oBinder) && nVestige == VESTIGE_OTIAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_CHUPOCLOPS , oBinder) && nVestige == VESTIGE_CHUPOCLOPS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_HAURES , oBinder) && nVestige == VESTIGE_HAURES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_IPOS , oBinder) && nVestige == VESTIGE_IPOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_SHAX , oBinder) && nVestige == VESTIGE_SHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ZAGAN , oBinder) && nVestige == VESTIGE_ZAGAN ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_VANUS , oBinder) && nVestige == VESTIGE_VANUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_THETRIAD , oBinder) && nVestige == VESTIGE_THETRIAD ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_DESHARIS , oBinder) && nVestige == VESTIGE_DESHARIS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ZCERYLL , oBinder) && nVestige == VESTIGE_ZCERYLL ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ELIGOR , oBinder) && nVestige == VESTIGE_ELIGOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_MARCHOSIAS , oBinder) && nVestige == VESTIGE_MARCHOSIAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ASHARDALON , oBinder) && nVestige == VESTIGE_ASHARDALON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_HALPHAX , oBinder) && nVestige == VESTIGE_HALPHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ORTHOS , oBinder) && nVestige == VESTIGE_ORTHOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_RAPID_RECOVERY_ABYSM , oBinder) && nVestige == VESTIGE_ABYSM ) nFavored = TRUE;
|
||
|
||
if (DEBUG) DoDebug("RapidRecovery return value "+IntToString(nFavored));
|
||
return nFavored;
|
||
}
|
||
|
||
int FavoredVestige(object oBinder, int nVestige)
|
||
{
|
||
int nFavored;
|
||
|
||
if (GetHasFeat(FEAT_FAVORED_VESTIGE_AMON, oBinder) && nVestige == VESTIGE_AMON) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_AYM , oBinder) && nVestige == VESTIGE_AYM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_LERAJE , oBinder) && nVestige == VESTIGE_LERAJE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_NABERIUS , oBinder) && nVestige == VESTIGE_NABERIUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_RONOVE , oBinder) && nVestige == VESTIGE_RONOVE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_DAHLVERNAR , oBinder) && nVestige == VESTIGE_DAHLVERNAR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_HAAGENTI , oBinder) && nVestige == VESTIGE_HAAGENTI ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_MALPHAS , oBinder) && nVestige == VESTIGE_MALPHAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_SAVNOK , oBinder) && nVestige == VESTIGE_SAVNOK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ANDROMALIUS, oBinder) && nVestige == VESTIGE_ANDROMALIUS) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCALOR , oBinder) && nVestige == VESTIGE_FOCALOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_KARSUS , oBinder) && nVestige == VESTIGE_KARSUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_PAIMON , oBinder) && nVestige == VESTIGE_PAIMON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_AGARES , oBinder) && nVestige == VESTIGE_AGARES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ANDRAS , oBinder) && nVestige == VESTIGE_ANDRAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_BUER , oBinder) && nVestige == VESTIGE_BUER ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_EURYNOME , oBinder) && nVestige == VESTIGE_EURYNOME ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_TENEBROUS , oBinder) && nVestige == VESTIGE_TENEBROUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ARETE , oBinder) && nVestige == VESTIGE_ARETE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ASTAROTH , oBinder) && nVestige == VESTIGE_ASTAROTH ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ACERERAK , oBinder) && nVestige == VESTIGE_ACERERAK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_BALAM , oBinder) && nVestige == VESTIGE_BALAM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_DANTALION , oBinder) && nVestige == VESTIGE_DANTALION ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_GERYON , oBinder) && nVestige == VESTIGE_GERYON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_OTIAX , oBinder) && nVestige == VESTIGE_OTIAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_CHUPOCLOPS , oBinder) && nVestige == VESTIGE_CHUPOCLOPS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_HAURES , oBinder) && nVestige == VESTIGE_HAURES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_IPOS , oBinder) && nVestige == VESTIGE_IPOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_SHAX , oBinder) && nVestige == VESTIGE_SHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ZAGAN , oBinder) && nVestige == VESTIGE_ZAGAN ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_VANUS , oBinder) && nVestige == VESTIGE_VANUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_THETRIAD , oBinder) && nVestige == VESTIGE_THETRIAD ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_DESHARIS , oBinder) && nVestige == VESTIGE_DESHARIS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ZCERYLL , oBinder) && nVestige == VESTIGE_ZCERYLL ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ELIGOR , oBinder) && nVestige == VESTIGE_ELIGOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_MARCHOSIAS , oBinder) && nVestige == VESTIGE_MARCHOSIAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ASHARDALON , oBinder) && nVestige == VESTIGE_ASHARDALON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_HALPHAX , oBinder) && nVestige == VESTIGE_HALPHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ORTHOS , oBinder) && nVestige == VESTIGE_ORTHOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_ABYSM , oBinder) && nVestige == VESTIGE_ABYSM ) nFavored = TRUE;
|
||
|
||
if (DEBUG) DoDebug("FavoredVestige return value "+IntToString(nFavored));
|
||
return nFavored;
|
||
}
|
||
|
||
int FavoredVestigeFocus(object oBinder, int nVestige)
|
||
{
|
||
int nFavored;
|
||
|
||
if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_AMON, oBinder) && nVestige == VESTIGE_AMON) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_AYM , oBinder) && nVestige == VESTIGE_AYM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_LERAJE , oBinder) && nVestige == VESTIGE_LERAJE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_NABERIUS , oBinder) && nVestige == VESTIGE_NABERIUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_RONOVE , oBinder) && nVestige == VESTIGE_RONOVE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_DAHLVERNAR , oBinder) && nVestige == VESTIGE_DAHLVERNAR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_HAAGENTI , oBinder) && nVestige == VESTIGE_HAAGENTI ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_MALPHAS , oBinder) && nVestige == VESTIGE_MALPHAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_SAVNOK , oBinder) && nVestige == VESTIGE_SAVNOK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ANDROMALIUS, oBinder) && nVestige == VESTIGE_ANDROMALIUS) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_FOCALOR , oBinder) && nVestige == VESTIGE_FOCALOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_KARSUS , oBinder) && nVestige == VESTIGE_KARSUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_PAIMON , oBinder) && nVestige == VESTIGE_PAIMON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_AGARES , oBinder) && nVestige == VESTIGE_AGARES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ANDRAS , oBinder) && nVestige == VESTIGE_ANDRAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_BUER , oBinder) && nVestige == VESTIGE_BUER ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_EURYNOME , oBinder) && nVestige == VESTIGE_EURYNOME ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_TENEBROUS , oBinder) && nVestige == VESTIGE_TENEBROUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ARETE , oBinder) && nVestige == VESTIGE_ARETE ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ASTAROTH , oBinder) && nVestige == VESTIGE_ASTAROTH ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ACERERAK , oBinder) && nVestige == VESTIGE_ACERERAK ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_BALAM , oBinder) && nVestige == VESTIGE_BALAM ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_DANTALION , oBinder) && nVestige == VESTIGE_DANTALION ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_GERYON , oBinder) && nVestige == VESTIGE_GERYON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_OTIAX , oBinder) && nVestige == VESTIGE_OTIAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_CHUPOCLOPS , oBinder) && nVestige == VESTIGE_CHUPOCLOPS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_HAURES , oBinder) && nVestige == VESTIGE_HAURES ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_IPOS , oBinder) && nVestige == VESTIGE_IPOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_SHAX , oBinder) && nVestige == VESTIGE_SHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ZAGAN , oBinder) && nVestige == VESTIGE_ZAGAN ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_VANUS , oBinder) && nVestige == VESTIGE_VANUS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_THETRIAD , oBinder) && nVestige == VESTIGE_THETRIAD ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_DESHARIS , oBinder) && nVestige == VESTIGE_DESHARIS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ZCERYLL , oBinder) && nVestige == VESTIGE_ZCERYLL ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ELIGOR , oBinder) && nVestige == VESTIGE_ELIGOR ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_MARCHOSIAS , oBinder) && nVestige == VESTIGE_MARCHOSIAS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ASHARDALON , oBinder) && nVestige == VESTIGE_ASHARDALON ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_HALPHAX , oBinder) && nVestige == VESTIGE_HALPHAX ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ORTHOS , oBinder) && nVestige == VESTIGE_ORTHOS ) nFavored = TRUE;
|
||
else if (GetHasFeat(FEAT_FAVORED_VESTIGE_FOCUS_ABYSM , oBinder) && nVestige == VESTIGE_ABYSM ) nFavored = TRUE;
|
||
|
||
if (DEBUG) DoDebug("FavoredVestigeFocus return value "+IntToString(nFavored));
|
||
return nFavored;
|
||
}
|
||
|
||
int GetBinderDC(object oBinder, int nVestige)
|
||
{
|
||
int nDC = 10 + GetBinderLevel(oBinder, nVestige)/2 + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
|
||
if (FavoredVestigeFocus(oBinder, nVestige)) nDC += 1;
|
||
if (GetHasSpellEffect(VESTIGE_IPOS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_IPOS_INFLUENCE)) nDC += 1;
|
||
|
||
return nDC;
|
||
}
|
||
|
||
int DoSpecialRequirements(object oBinder, int nVestige)
|
||
{
|
||
if (GetHasFeat(FEAT_IGNORE_SPECIAL_REQUIREMENTS, oBinder)) return TRUE;
|
||
|
||
if (nVestige == VESTIGE_AMON && (GetLocalInt(oBinder, "AmonHater") ||
|
||
GetHasSpellEffect(VESTIGE_LERAJE, oBinder) ||
|
||
GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) ||
|
||
GetHasSpellEffect(VESTIGE_KARSUS, oBinder) ||
|
||
GetHasSpellEffect(VESTIGE_CHUPOCLOPS, oBinder)))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_LERAJE && GetHasSpellEffect(VESTIGE_AMON, oBinder))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_NABERIUS && 4 > GetSkillRank(SKILL_LORE, oBinder, TRUE) && 4 > GetSkillRank(SKILL_BLUFF, oBinder, TRUE))
|
||
return FALSE;
|
||
// Ronove<76>s seal must be drawn in the soil under the sky.
|
||
if (nVestige == VESTIGE_RONOVE && (GetIsAreaNatural(GetArea(oBinder)) != AREA_NATURAL || GetIsAreaAboveGround(GetArea(oBinder)) != AREA_ABOVEGROUND))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_HAAGENTI && (CREATURE_SIZE_LARGE > PRCGetCreatureSize(oBinder) || (GetHasFeat(FEAT_RACE_POWERFUL_BUILD, oBinder) && CREATURE_SIZE_MEDIUM > PRCGetCreatureSize(oBinder))))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_KARSUS && GetHasSpellEffect(VESTIGE_AMON, oBinder))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_KARSUS && 5 > GetSkillRank(SKILL_LORE, oBinder, TRUE) && 5 > GetSkillRank(SKILL_SPELLCRAFT, oBinder, TRUE))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_KARSUS)
|
||
{
|
||
effect eTest = GetFirstEffect(oBinder);
|
||
while(GetIsEffectValid(eTest))
|
||
{
|
||
if(GetEffectType(eTest) == EFFECT_TYPE_AREA_OF_EFFECT)
|
||
return FALSE;
|
||
|
||
eTest = GetNextEffect(oBinder);
|
||
}
|
||
}
|
||
// Agagres<65>s seal must be drawn in the soil
|
||
if (nVestige == VESTIGE_AGARES && GetIsAreaNatural(GetArea(oBinder)) != AREA_NATURAL)
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_BUER && GetIsAreaInterior(GetArea(oBinder)))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_EURYNOME && GetHasSpellEffect(VESTIGE_AMON, oBinder))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_TENEBROUS && !GetIsNight())
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_BALAM)
|
||
{
|
||
int nCur = GetCurrentHitPoints(oBinder);
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1, DAMAGE_TYPE_SLASHING), oBinder);
|
||
if (nCur > GetCurrentHitPoints(oBinder))
|
||
return FALSE;
|
||
}
|
||
if (nVestige == VESTIGE_GERYON && 5 > GetSkillRank(SKILL_LORE, oBinder, TRUE))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_ARETE && (GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) || GetHasSpellEffect(VESTIGE_CHUPOCLOPS, oBinder)))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_CHUPOCLOPS && GetHasSpellEffect(VESTIGE_AMON, oBinder))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_IPOS && 5 > GetSkillRank(SKILL_LORE, oBinder, TRUE) && 5 > GetSkillRank(SKILL_SPELLCRAFT, oBinder, TRUE))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_VANUS && GetIsAreaNatural(GetArea(oBinder)) != AREA_NATURAL)
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_DESHARIS && GetIsAreaNatural(GetArea(oBinder)) == AREA_NATURAL)
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_HALPHAX && !GetIsAreaInterior(GetArea(oBinder)))
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_HALPHAX && GetIsAreaInterior(GetArea(oBinder)) && GetIsAreaAboveGround(GetArea(oBinder)) == AREA_UNDERGROUND)
|
||
return FALSE;
|
||
if (nVestige == VESTIGE_ORTHOS && GetTileMainLight1Color(GetLocation(oBinder)) != TILE_MAIN_LIGHT_COLOR_WHITE && GetTileMainLight1Color(GetLocation(oBinder)) != TILE_MAIN_LIGHT_COLOR_YELLOW)
|
||
return FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
int DoSummonRequirements(object oBinder, int nVestige)
|
||
{
|
||
if (GetHasFeat(FEAT_IGNORE_SPECIAL_REQUIREMENTS, oBinder)) return TRUE;
|
||
|
||
int nSpellId = StringToInt(Get2DACache(GetVestigeFile(), "SpellID", nVestige));
|
||
|
||
if (nSpellId == VESTIGE_LERAJE)
|
||
{
|
||
object oArrow = GetItemInSlot(INVENTORY_SLOT_ARROWS, oBinder);
|
||
int nStack = GetItemStackSize(oArrow);
|
||
if (nStack)
|
||
SetItemStackSize(oArrow, nStack-1);
|
||
else
|
||
{
|
||
FloatingTextStringOnCreature("You have failed to break an arrow for Leraje, and she refuses your call!", oBinder, FALSE);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
int GetIsVestigeExploited(object oBinder, int nVestigeAbil)
|
||
{
|
||
if (GetLocalInt(oBinder, "ExploitVestige") == nVestigeAbil) return TRUE;
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
void SetIsVestigeExploited(object oBinder, int nVestigeAbil)
|
||
{
|
||
SetLocalInt(oBinder, "ExploitVestige", nVestigeAbil);
|
||
SetLocalInt(oBinder, "ExploitVestigeTemp", TRUE);
|
||
SetLocalInt(oBinder, "ExploitVestigeConv", TRUE);
|
||
}
|
||
|
||
int GetIsPatronVestigeBound(object oBinder)
|
||
{
|
||
int nPatron;
|
||
|
||
if (GetHasFeat(FEAT_PATRON_VESTIGE_AMON , oBinder)) nPatron = VESTIGE_AMON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_AYM , oBinder)) nPatron = VESTIGE_AYM;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_LERAJE , oBinder)) nPatron = VESTIGE_LERAJE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_NABERIUS , oBinder)) nPatron = VESTIGE_NABERIUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_RONOVE , oBinder)) nPatron = VESTIGE_RONOVE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DAHLVERNAR , oBinder)) nPatron = VESTIGE_DAHLVERNAR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HAAGENTI , oBinder)) nPatron = VESTIGE_HAAGENTI;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_MALPHAS , oBinder)) nPatron = VESTIGE_MALPHAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_SAVNOK , oBinder)) nPatron = VESTIGE_SAVNOK;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ANDROMALIUS, oBinder)) nPatron = VESTIGE_ANDROMALIUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_FOCALOR , oBinder)) nPatron = VESTIGE_FOCALOR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_KARSUS , oBinder)) nPatron = VESTIGE_KARSUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_PAIMON , oBinder)) nPatron = VESTIGE_PAIMON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_AGARES , oBinder)) nPatron = VESTIGE_AGARES;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ANDRAS , oBinder)) nPatron = VESTIGE_ANDRAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_BUER , oBinder)) nPatron = VESTIGE_BUER;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_EURYNOME , oBinder)) nPatron = VESTIGE_EURYNOME;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_TENEBROUS , oBinder)) nPatron = VESTIGE_TENEBROUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ARETE , oBinder)) nPatron = VESTIGE_ARETE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ASTAROTH , oBinder)) nPatron = VESTIGE_ASTAROTH;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ACERERAK , oBinder)) nPatron = VESTIGE_ACERERAK;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_BALAM , oBinder)) nPatron = VESTIGE_BALAM;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DANTALION , oBinder)) nPatron = VESTIGE_DANTALION;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_GERYON , oBinder)) nPatron = VESTIGE_GERYON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_OTIAX , oBinder)) nPatron = VESTIGE_OTIAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_CHUPOCLOPS , oBinder)) nPatron = VESTIGE_CHUPOCLOPS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HAURES , oBinder)) nPatron = VESTIGE_HAURES;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_IPOS , oBinder)) nPatron = VESTIGE_IPOS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_SHAX , oBinder)) nPatron = VESTIGE_SHAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ZAGAN , oBinder)) nPatron = VESTIGE_ZAGAN;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_VANUS , oBinder)) nPatron = VESTIGE_VANUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_THETRIAD , oBinder)) nPatron = VESTIGE_THETRIAD;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DESHARIS , oBinder)) nPatron = VESTIGE_DESHARIS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ZCERYLL , oBinder)) nPatron = VESTIGE_ZCERYLL;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ELIGOR , oBinder)) nPatron = VESTIGE_ELIGOR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_MARCHOSIAS , oBinder)) nPatron = VESTIGE_MARCHOSIAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ASHARDALON , oBinder)) nPatron = VESTIGE_ASHARDALON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HALPHAX , oBinder)) nPatron = VESTIGE_HALPHAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ORTHOS , oBinder)) nPatron = VESTIGE_ORTHOS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ABYSM , oBinder)) nPatron = VESTIGE_ABYSM;
|
||
|
||
if(GetHasSpellEffect(nPatron, oBinder)) return TRUE;
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
int GetPatronVestige(object oBinder)
|
||
{
|
||
int nPatron = -1;
|
||
|
||
if (GetHasFeat(FEAT_PATRON_VESTIGE_AMON , oBinder)) nPatron = VESTIGE_AMON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_AYM , oBinder)) nPatron = VESTIGE_AYM;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_LERAJE , oBinder)) nPatron = VESTIGE_LERAJE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_NABERIUS , oBinder)) nPatron = VESTIGE_NABERIUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_RONOVE , oBinder)) nPatron = VESTIGE_RONOVE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DAHLVERNAR , oBinder)) nPatron = VESTIGE_DAHLVERNAR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HAAGENTI , oBinder)) nPatron = VESTIGE_HAAGENTI;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_MALPHAS , oBinder)) nPatron = VESTIGE_MALPHAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_SAVNOK , oBinder)) nPatron = VESTIGE_SAVNOK;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ANDROMALIUS, oBinder)) nPatron = VESTIGE_ANDROMALIUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_FOCALOR , oBinder)) nPatron = VESTIGE_FOCALOR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_KARSUS , oBinder)) nPatron = VESTIGE_KARSUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_PAIMON , oBinder)) nPatron = VESTIGE_PAIMON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_AGARES , oBinder)) nPatron = VESTIGE_AGARES;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ANDRAS , oBinder)) nPatron = VESTIGE_ANDRAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_BUER , oBinder)) nPatron = VESTIGE_BUER;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_EURYNOME , oBinder)) nPatron = VESTIGE_EURYNOME;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_TENEBROUS , oBinder)) nPatron = VESTIGE_TENEBROUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ARETE , oBinder)) nPatron = VESTIGE_ARETE;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ASTAROTH , oBinder)) nPatron = VESTIGE_ASTAROTH;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ACERERAK , oBinder)) nPatron = VESTIGE_ACERERAK;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_BALAM , oBinder)) nPatron = VESTIGE_BALAM;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DANTALION , oBinder)) nPatron = VESTIGE_DANTALION;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_GERYON , oBinder)) nPatron = VESTIGE_GERYON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_OTIAX , oBinder)) nPatron = VESTIGE_OTIAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_CHUPOCLOPS , oBinder)) nPatron = VESTIGE_CHUPOCLOPS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HAURES , oBinder)) nPatron = VESTIGE_HAURES;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_IPOS , oBinder)) nPatron = VESTIGE_IPOS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_SHAX , oBinder)) nPatron = VESTIGE_SHAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ZAGAN , oBinder)) nPatron = VESTIGE_ZAGAN;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_VANUS , oBinder)) nPatron = VESTIGE_VANUS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_THETRIAD , oBinder)) nPatron = VESTIGE_THETRIAD;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_DESHARIS , oBinder)) nPatron = VESTIGE_DESHARIS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ZCERYLL , oBinder)) nPatron = VESTIGE_ZCERYLL;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ELIGOR , oBinder)) nPatron = VESTIGE_ELIGOR;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_MARCHOSIAS , oBinder)) nPatron = VESTIGE_MARCHOSIAS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ASHARDALON , oBinder)) nPatron = VESTIGE_ASHARDALON;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_HALPHAX , oBinder)) nPatron = VESTIGE_HALPHAX;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ORTHOS , oBinder)) nPatron = VESTIGE_ORTHOS;
|
||
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ABYSM , oBinder)) nPatron = VESTIGE_ABYSM;
|
||
|
||
return nPatron;
|
||
} |