PRC8/nwn/nwnprc/trunk/include/bnd_inc_bndfunc.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

968 lines
45 KiB
Plaintext
Raw Blame History

//::///////////////////////////////////////////////
//:: 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;
}