Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
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;
|
||
} |