Further file organization

Further file organization
This commit is contained in:
Jaysyn904
2023-08-23 22:11:00 -04:00
parent 3062876237
commit d87fe14826
22364 changed files with 0 additions and 3253 deletions

View File

@@ -0,0 +1,23 @@
/*
04/03/21 by Stratovarius
Anima Mage Exploit Vestige Cast Spell
Cast a spell from an exploited vestige
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if (GetLocalInt(oBinder, "ExploitVestige"))
{
ActionCastSpell(GetLocalInt(oBinder, "ExploitVestigeSpell"), 0, 0, 0, METAMAGIC_NONE, GetPrimaryArcaneClass(oBinder), 0, 0, OBJECT_INVALID, FALSE);
}
else
{
IncrementRemainingFeatUses(oBinder, 9259);
FloatingTextStringOnCreature("You are not exploiting a vestige!", oBinder, FALSE);
}
}

View File

@@ -0,0 +1,13 @@
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if (GetBindCount(oBinder))
{
AssignCommand(oBinder, ClearAllActions(TRUE));
StartDynamicConversation("bnd_anim_metacnv", oBinder, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oBinder);
}
else
IncrementRemainingFeatUses(oBinder, FEAT_ANIMA_VESTIGE_METAMAGIC);
}

View File

@@ -0,0 +1,200 @@
//:://////////////////////////////////////////////
//:: Anima Mage Vestige Metamagic Conversation
//:: bnd_anim_metacnv
//:://////////////////////////////////////////////
/** @file
This allows you to choose which vestige to forgo
@author Stratovarius
@date Created - 04.03.2021
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "inc_dynconv"
#include "bnd_inc_bndfunc"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_SELECT_VESTIGE = 0;
const int STAGE_SELECT_METAMAGIC = 1;
const int CHOICE_BACK_TO_LSELECT = -1;
const int STRREF_BACK_TO_LSELECT = 16829723; // "Return to maneuver level selection."
const int STRREF_LEVELLIST_HEADER = 16829724; // "Select level of maneuver to gain.\n\nNOTE:\nThis may take a while when first browsing a particular level's maneuvers."
const int STRREF_MOVELIST_HEADER1 = 16829725; // "Select a maneuver to gain.\nYou can select"
const int STRREF_MOVELIST_HEADER2 = 16829726; // "more maneuvers"
const int STRREF_SELECTED_HEADER1 = 16824209; // "You have selected:"
const int STRREF_SELECTED_HEADER2 = 16824210; // "Is this correct?"
const int STRREF_END_HEADER = 16829727; // "You will be able to select more maneuvers after you gain another level in a blade magic initiator class."
const int STRREF_END_CONVO_SELECT = 16824212; // "Finish"
const int LEVEL_STRREF_START = 16824809;
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const int STRREF_MOVESTANCE_HEADER = 16829729; // "Choose Maneuver or Stances."
const int STRREF_STANCE = 16829730; // "Stances"
const int STRREF_MANEUVER = 16829731; // "Maneuvers"
//////////////////////////////////////////////////
/* Aid Functions */
//////////////////////////////////////////////////
int _GetLoopEnd(int nClass)
{
if (nClass == CLASS_TYPE_SWORDSAGE) return 141;
return -1;
}
void ReapplyVestige(object oBinder, int nVestige)
{
if (!GetLocalInt(oBinder, "BinderRested")) ActionCastSpellOnSelf(nVestige);
}
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void main()
{
object oBinder = GetPCSpeaker();
int nValue = GetLocalInt(oBinder, DYNCONV_VARIABLE);
int nStage = GetStage(oBinder);
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Aborting due to error.");
return;
}
if(nValue == DYNCONV_SETUP_STAGE)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Running setup stage for stage " + IntToString(nStage));
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oBinder))
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Stage was not set up already. nStage: " + IntToString(nStage));
// Maneuver selection stage
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Building vestige selection");
string sToken = "Select a vestige to suspend.";
SetHeader(sToken);
int i, nCount;
for(i = VESTIGE_AMON; i <= VESTIGE_ABYSM; i++)
{
if(GetHasSpellEffect(i, oBinder))
AddChoice(GetStringByStrRef(StringToInt(Get2DACache("Spells", "Name", i))), i, oBinder);
}
MarkStageSetUp(STAGE_SELECT_VESTIGE, oBinder);
}
else if(nStage == STAGE_SELECT_METAMAGIC)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Building vestige selection");
string sToken = "Select a metamagic to gain. You will have one round to cast a spell.";
SetHeader(sToken);
if (GetHasFeat(FEAT_EMPOWER_SPELL, oBinder)) AddChoice("Empower", 1, oBinder);
if (GetHasFeat(FEAT_EXTEND_SPELL, oBinder)) AddChoice("Extend", 2, oBinder);
if (GetHasFeat(FEAT_MAXIMIZE_SPELL, oBinder)) AddChoice("Maximize", 3, oBinder);
if (GetHasFeat(FEAT_QUICKEN_SPELL, oBinder)) AddChoice("Quicken", 4, oBinder);
if (GetHasFeat(FEAT_SILENCE_SPELL, oBinder)) AddChoice("Silent", 5, oBinder);
if (GetHasFeat(FEAT_STILL_SPELL, oBinder)) AddChoice("Still", 6, oBinder);
MarkStageSetUp(STAGE_SELECT_VESTIGE, oBinder);
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Running exit handler");
// End of conversation cleanup
DeleteLocalInt(oBinder, "nVestige");
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
if(DEBUG) DoDebug("bnd_anim_metacnv: ERROR: Conversation abort section run");
}
// Handle PC response
else
{
int nChoice = GetChoice(oBinder);
if(DEBUG) DoDebug("bnd_anim_metacnv: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " + IntToString(nChoice) + "; choice text = '" + GetChoiceText(oBinder) + "'");
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Vestige selected");
SetLocalInt(oBinder, "nVestige", nChoice);
nStage = STAGE_SELECT_METAMAGIC;
}
else if(nStage == STAGE_SELECT_METAMAGIC)
{
if(DEBUG) DoDebug("bnd_anim_metacnv: Metamagic selected");
int nVestige = GetLocalInt(oBinder, "nVestige");
object oSkin = GetPCSkin(oBinder);
// Remove the vestige for 5 rounds
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
DelayCommand(RoundsToSeconds(5), ReapplyVestige(oBinder, nVestige));
if (nChoice == 1)
{
int nMeta = GetLocalInt(oBinder, "SuddenMeta");
nMeta |= METAMAGIC_EMPOWER;
SetLocalInt(oBinder, "SuddenMeta", nMeta);
}
if (nChoice == 2)
{
int nMeta = GetLocalInt(oBinder, "SuddenMeta");
nMeta |= METAMAGIC_EXTEND;
SetLocalInt(oBinder, "SuddenMeta", nMeta);
}
if (nChoice == 3)
{
int nMeta = GetLocalInt(oBinder, "SuddenMeta");
nMeta |= METAMAGIC_MAXIMIZE;
SetLocalInt(oBinder, "SuddenMeta", nMeta);
}
if (nChoice == 4)
{
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_III), 6.0);
}
if (nChoice == 5)
{
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_III), 6.0);
}
if (nChoice == 6)
{
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_III), 6.0);
}
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
if(DEBUG) DoDebug("bnd_anim_metacnv: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oBinder);
}
}

View File

@@ -0,0 +1,25 @@
/*
04/03/21 by Stratovarius
Anima Mage Vestige Casting
Cast a spell with Quicken, Still, Silent
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
object oSkin = GetPCSkin(oBinder);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_QUICKEN_III), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_STILL_III), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_I), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_II), 6.0);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_EPIC_AUTO_SILENT_III), 6.0);
FloatingTextStringOnCreature("Vestige Casting activated!", oBinder, FALSE);
}

View File

@@ -0,0 +1,53 @@
/*
03/02/21 by Stratovarius
Pact Augmentation (Su): Beginning at 2nd level, you can draw additional power from the vestiges you bind. As long as you are bound to at least one vestige, you can choose
one ability from the following list. Each time you rebind a vestige, you also reselect your pact augmentation ability.
As you attain higher levels, you can make additional selections from the list. You gain one additional ability at 5th, 10th, 16th, and 20th level (to a maximum of five selections
at 20th level). You can choose a single ability multiple times, and their effects stack. For instance, at 16th level you could choose bonus hit points twice and damage reduction twice,
gaining +10 hit points and damage reduction 2/<2F>.
Pact Augmentation Abilities
+5 hit points
Energy resistance 5 (acid, cold, electricity, fire, or sonic)
+1 insight bonus on saving throws
Damage reduction 1/<2F>
+1 insight bonus to Armor Class
+1 insight bonus on attack rolls
+1 insight bonus on damage rolls
*/
#include "prc_inc_natweap"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
// Temp HP
if (GetLocalInt(oBinder, "PactAugment1")) eLink = EffectLinkEffects(eLink, EffectTemporaryHitpoints(GetLocalInt(oBinder, "PactAugment1")*5));
if (GetLocalInt(oBinder, "PactAugment2")) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ACID, GetLocalInt(oBinder, "PactAugment2")*5));
if (GetLocalInt(oBinder, "PactAugment3")) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_COLD, GetLocalInt(oBinder, "PactAugment3")*5));
if (GetLocalInt(oBinder, "PactAugment4")) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, GetLocalInt(oBinder, "PactAugment4")*5));
if (GetLocalInt(oBinder, "PactAugment5")) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_FIRE, GetLocalInt(oBinder, "PactAugment5")*5));
if (GetLocalInt(oBinder, "PactAugment6")) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_SONIC, GetLocalInt(oBinder, "PactAugment6")*5));
if (GetLocalInt(oBinder, "PactAugment7")) eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, GetLocalInt(oBinder, "PactAugment7")));
if (GetLocalInt(oBinder, "PactAugment8"))
{
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, GetLocalInt(oBinder, "PactAugment8")));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_PIERCING, GetLocalInt(oBinder, "PactAugment8")));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_SLASHING, GetLocalInt(oBinder, "PactAugment8")));
}
if (GetLocalInt(oBinder, "PactAugment9")) eLink = EffectLinkEffects(eLink, EffectACIncrease(GetLocalInt(oBinder, "PactAugment9")));
if (GetLocalInt(oBinder, "PactAugment10")) eLink = EffectLinkEffects(eLink, EffectAttackIncrease(GetLocalInt(oBinder, "PactAugment10")));
if (GetLocalInt(oBinder, "PactAugment11")) eLink = EffectLinkEffects(eLink, EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(GetLocalInt(oBinder, "PactAugment11"))));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
// Clean up time
int i;
for(i = 0; i <= 11; i++)
DeleteLocalInt(oBinder, "PactAugment"+IntToString(i));
}

View File

@@ -0,0 +1,12 @@
#include "prc_class_const"
void main()
{
object oBinder = OBJECT_SELF;
int nClass = GetLevelByClass(CLASS_TYPE_BINDER, oBinder);
if (nClass >= 13)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_NEGATIVE_LEVEL)), oBinder);
if (nClass >= 6)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_FEAR)), oBinder);
}

View File

@@ -0,0 +1,472 @@
//:://////////////////////////////////////////////
//:: Binder Bind Vestige choice script
//:: bnd_bindingcnv
//:://////////////////////////////////////////////
/*
@author Stratovarius - 2021.02.03
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "bnd_inc_bndfunc"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_SELECT_VESTIGE = 0;
const int STAGE_CONFIRM_SELECTION = 1;
const int STAGE_PACT_AUGMENT = 2;
const int STAGE_NABERIUS = 3;
const int STAGE_EXPLOIT_VESTIGE = 4;
const int STAGE_ASTAROTH = 5;
const int CHOICE_BACK_TO_LSELECT = -1;
const int STRREF_SELECTED_HEADER1 = 16824209; // "You have selected:"
const int STRREF_SELECTED_HEADER2 = 16824210; // "Is this correct?"
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const int SORT = TRUE; // If the sorting takes too much CPU, set to FALSE
const int DEBUG_LIST = FALSE;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void PrintList(object oBinder)
{
string tp = "Printing list:\n";
string s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
if(s == ""){
tp += "Empty\n";
}
else{
tp += s + "\n";
s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + s);
while(s != ""){
tp += "=> " + s + "\n";
s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + s);
}
}
DoDebug(tp);
}
/**
* Creates a linked list of entries that is sorted into alphabetical order
* as it is built.
* Assumption: mystery names are unique.
*
* @param oBinder The storage object aka whomever is gaining powers in this conversation
* @param sChoice The choice string
* @param nChoice The choice value
*/
void AddToTempList(object oBinder, string sChoice, int nChoice)
{
if(DEBUG_LIST) DoDebug("\nAdding to temp list: '" + sChoice + "' - " + IntToString(nChoice));
if(DEBUG_LIST) PrintList(oBinder);
// If there is nothing yet
if(!GetLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited"))
{
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head", sChoice);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_List_" + sChoice, nChoice);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited", TRUE);
}
else
{
// Find the location to instert into
string sPrev = "", sNext = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
while(sNext != "" && StringCompare(sChoice, sNext) >= 0)
{
if(DEBUG_LIST) DoDebug("Comparison between '" + sChoice + "' and '" + sNext + "' = " + IntToString(StringCompare(sChoice, sNext)));
sPrev = sNext;
sNext = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sNext);
}
// Insert the new entry
// Does it replace the head?
if(sPrev == "")
{
if(DEBUG_LIST) DoDebug("New head");
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head", sChoice);
}
else
{
if(DEBUG_LIST) DoDebug("Inserting into position between '" + sPrev + "' and '" + sNext + "'");
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sPrev, sChoice);
}
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sChoice, sNext);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_List_" + sChoice, nChoice);
}
}
/**
* Reads the linked list built with AddToTempList() to AddChoice() and
* deletes it.
*
* @param oBinder A PC gaining powers at the moment
*/
void TransferTempList(object oBinder)
{
string sChoice = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
int nChoice = GetLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sChoice);
DeleteLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
string sPrev;
if(DEBUG_LIST) DoDebug("Head is: '" + sChoice + "' - " + IntToString(nChoice));
while(sChoice != "")
{
// Add the choice
AddChoice(sChoice, nChoice, oBinder);
// Get next
sChoice = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + (sPrev = sChoice));
nChoice = GetLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sChoice);
if(DEBUG_LIST) DoDebug("Next is: '" + sChoice + "' - " + IntToString(nChoice) + "; previous = '" + sPrev + "'");
// Delete the already handled data
DeleteLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sPrev);
DeleteLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sPrev);
}
DeleteLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited");
}
void main()
{
object oBinder = GetPCSpeaker();
int nValue = GetLocalInt(oBinder, DYNCONV_VARIABLE);
int nStage = GetStage(oBinder);
string sVestigeFile = GetVestigeFile();
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Running setup stage for stage " + IntToString(nStage));
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oBinder))
{
if(DEBUG) DoDebug("bnd_bindingcnv: Stage was not set up already");
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Building vestige selection");
SetHeader("Choose the vestige to bind.");
string sVestige;
int i, nVestige;
for(i = 0; i < 50 ; i++)
{
sVestige = GetStringByStrRef(StringToInt(Get2DACache(sVestigeFile, "Name", i)));
nVestige = StringToInt(Get2DACache(sVestigeFile, "SpellID", i));
if (DEBUG) DoDebug("sVestige: "+sVestige);
// Non-blank row, can bind a vestige of that level, don't already have the vestige
if(nVestige && sVestige != "" && GetMaxVestigeLevel(oBinder) >= GetVestigeLevel(i) && !GetHasSpellEffect(nVestige, oBinder) && DoSpecialRequirements(oBinder, nVestige))
{
AddChoice(sVestige, i, oBinder);
}
}
// Set the next, previous and wait tokens to default values
SetDefaultTokens();
// Set the convo quit text to "Abort"
SetCustomToken(DYNCONV_TOKEN_EXIT, GetStringByStrRef(DYNCONV_STRREF_ABORT_CONVO));
}
// Selection confirmation stage
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Building selection confirmation");
// Build the confirmation query
string sToken = GetStringByStrRef(STRREF_SELECTED_HEADER1) + "\n\n"; // "You have selected:"
int nSpellId = GetLocalInt(oBinder, "nVestige");
sToken += GetStringByStrRef(StringToInt(Get2DACache(sVestigeFile, "Description", nSpellId)))+"\n\n";
sToken += GetStringByStrRef(STRREF_SELECTED_HEADER2); // "Is this correct?"
SetHeader(sToken);
AddChoice(GetStringByStrRef(STRREF_YES), TRUE, oBinder); // "Yes"
AddChoice("Rushed Bind (Bind in one round, but take a -10 penalty on your binding check)", 2, oBinder);
if (GetHasFeat(FEAT_RAPID_PACT_MAKING, oBinder) && !GetLocalInt(oBinder, "RapidPactMaking")) AddChoice("Rapid Pact Making (Bind in one round, no penalty on your binding check)", 3, oBinder);
AddChoice(GetStringByStrRef(STRREF_NO), FALSE, oBinder); // "No"
}
// Pact Augment stage
else if(nStage == STAGE_PACT_AUGMENT)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Building pact augment choices");
SetHeader("You may choose to gain an additional benefit when you bind a vestige. You can choose a single ability multiple times, and their effects stack.");
AddChoice("5 temporary hit points", 1, oBinder);
AddChoice("Resist Acid 5", 2, oBinder);
AddChoice("Resist Cold 5", 3, oBinder);
AddChoice("Resist Electrical 5", 4, oBinder);
AddChoice("Resist Fire 5", 5, oBinder);
AddChoice("Resist Sonic 5", 6, oBinder);
AddChoice("+1 All Saving Throws", 7, oBinder);
AddChoice("Damage Resistance 1/-", 8, oBinder);
AddChoice("+1 Armor Class", 9, oBinder);
AddChoice("+1 Attack", 10, oBinder);
AddChoice("+1 Damage", 11, oBinder);
}
else if(nStage == STAGE_NABERIUS)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Naberius skill selection");
SetHeader("Choose the unranked skill to gain a +4 bonus in.");
string sSkill;
int i;
for(i = 0; i < 40 ; i++)
{
sSkill = GetStringByStrRef(StringToInt(Get2DACache("skills", "Name", i)));
if (DEBUG) DoDebug("sSkill: "+sSkill);
// No ranks, can be used untrained, and hasn't already been picked
if(!GetSkillRank(i, oBinder, TRUE) && sSkill != "" && StringToInt(Get2DACache("skills", "Untrained", i)) && !GetLocalInt(oBinder, "NaberiusSkill"+IntToString(i)))
{
AddChoice(sSkill, i, oBinder);
}
}
// Set the next, previous and wait tokens to default values
SetDefaultTokens();
// Set the convo quit text to "Abort"
SetCustomToken(DYNCONV_TOKEN_EXIT, GetStringByStrRef(DYNCONV_STRREF_ABORT_CONVO));
}
else if(nStage == STAGE_EXPLOIT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Exploit Vestige selection");
SetHeader("With this ability, you can choose to forego gaining one of this vestige<67>s granted abilities in order to gain one additional arcane spell of the highest you can cast.");
int nVestige = GetLocalInt(oBinder, "nVestige");
int i, nEvoLevel;
string sAbil;
for(i = 0; i < 150 ; i++)
{
nEvoLevel = StringToInt(Get2DACache("vestigeabil", "VestigeNum", i));
// Skip any that don't belong to the right vestige
if(nEvoLevel < nVestige){
continue;
}
//Due to the way the 2das are structured, we know that once
//we've hit the end of a vestige, we're done
if(nEvoLevel > nVestige){
break;
}
sAbil = Get2DACache("vestigeabil", "Ability", i);
if(sAbil != "") // Non-blank row
{
AddChoice(sAbil, i, oBinder);
}
}
AddChoice("None", 0, oBinder);
// Set the next, previous and wait tokens to default values
SetDefaultTokens();
// Set the convo quit text to "Abort"
SetCustomToken(DYNCONV_TOKEN_EXIT, GetStringByStrRef(DYNCONV_STRREF_ABORT_CONVO));
}
else if(nStage == STAGE_ASTAROTH)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Astaroth feat selection");
SetHeader("Choose the crafting feat to gain.");
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ASTAROTH);
AddChoice("Scribe Scroll", FEAT_SCRIBE_SCROLL , oBinder);
AddChoice("Brew Potion", FEAT_BREW_POTION , oBinder);
AddChoice("Craft Wonderous", FEAT_CRAFT_WONDROUS , oBinder);
AddChoice("Craft Arms & Armor", FEAT_CRAFT_ARMS_ARMOR, oBinder);
AddChoice("Craft Wand", FEAT_CRAFT_WAND , oBinder);
if (nBinderLevel >= 9) AddChoice("Craft Rod", FEAT_CRAFT_ROD, oBinder);
if (nBinderLevel >= 12) AddChoice("Craft Staff", FEAT_CRAFT_STAFF, oBinder);
if (nBinderLevel >= 12) AddChoice("Forge Ring", FEAT_FORGE_RING, oBinder);
// Set the next, previous and wait tokens to default values
SetDefaultTokens();
// Set the convo quit text to "Abort"
SetCustomToken(DYNCONV_TOKEN_EXIT, GetStringByStrRef(DYNCONV_STRREF_ABORT_CONVO));
}
MarkStageSetUp(nStage, oBinder);
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Running exit handler");
// End of conversation cleanup
DeleteLocalInt(oBinder, "nVestige");
DeleteLocalInt(oBinder, "PactAugmentCount");
DeleteLocalInt(oBinder, "NaberiusSkillCount");
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
}
// Handle PC response
else
{
int nChoice = GetChoice(oBinder);
if(DEBUG) DoDebug("bnd_bindingcnv: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " + IntToString(nChoice) + "; choice text = '" + GetChoiceText(oBinder) + "'");
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_bindingcnv: Chakra selected");
SetLocalInt(oBinder, "nVestige", nChoice);
// Only once per day
if (GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oBinder) >= 2 && !GetLocalInt(oBinder, "ExploitVestige"))
{
nStage = STAGE_EXPLOIT_VESTIGE;
}
else
{
nStage = STAGE_CONFIRM_SELECTION;
}
//ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_SELECT_VESTIGE, oBinder);
}
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if (nChoice)
{
if (nChoice == 2)
SetLocalInt(oBinder, "RushedBinding", TRUE);
if (nChoice == 3)
SetLocalInt(oBinder, "RapidPactMaking", TRUE);
if (GetPactAugmentCount(oBinder))
{
nStage = STAGE_PACT_AUGMENT;
}
else if (GetLocalInt(oBinder, "nVestige") == 4 && GetAbilityModifier(ABILITY_CONSTITUTION, oBinder) >= 1)
{
nStage = STAGE_NABERIUS;
}
else if (GetLocalInt(oBinder, "nVestige") == 20)
{
nStage = STAGE_ASTAROTH;
}
else
{
int nContactTime = VESTIGE_CONTACT_TIME;
if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"));
DeleteLocalInt(oBinder, "nVestige");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
}
else
nStage = STAGE_SELECT_VESTIGE;
MarkStageNotSetUp(STAGE_CONFIRM_SELECTION, oBinder);
}
else if(nStage == STAGE_PACT_AUGMENT)
{
if (nChoice)
{
SetLocalInt(oBinder, "PactAugment"+IntToString(nChoice), GetLocalInt(oBinder, "PactAugment"+IntToString(nChoice))+1);
SetLocalInt(oBinder, "PactAugmentCount", GetLocalInt(oBinder, "PactAugmentCount")+1);
}
if (GetPactAugmentCount(oBinder) - GetLocalInt(oBinder, "PactAugmentCount"))
{
nStage = STAGE_PACT_AUGMENT;
}
else if (GetLocalInt(oBinder, "nVestige") == 4 && GetAbilityModifier(ABILITY_CONSTITUTION, oBinder) >= 1)
{
nStage = STAGE_NABERIUS;
}
else if (GetLocalInt(oBinder, "nVestige") == 20)
{
nStage = STAGE_ASTAROTH;
}
else
{
int nContactTime = VESTIGE_CONTACT_TIME;
if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"));
DeleteLocalInt(oBinder, "nVestige");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_PACT_AUGMENT, oBinder);
}
else if(nStage == STAGE_NABERIUS)
{
if (nChoice)
{
SetLocalInt(oBinder, "NaberiusSkill"+IntToString(nChoice), TRUE);
SetLocalInt(oBinder, "NaberiusSkillCount", GetLocalInt(oBinder, "NaberiusSkillCount")+1);
}
if (GetAbilityModifier(ABILITY_CONSTITUTION, oBinder) - GetLocalInt(oBinder, "NaberiusSkillCount"))
{
nStage = STAGE_NABERIUS;
}
else
{
int nContactTime = VESTIGE_CONTACT_TIME;
if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"));
DeleteLocalInt(oBinder, "nVestige");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_NABERIUS, oBinder);
}
else if(nStage == STAGE_EXPLOIT_VESTIGE)
{
if (nChoice)
{
SetIsVestigeExploited(oBinder, nChoice);
}
nStage = STAGE_CONFIRM_SELECTION;
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_EXPLOIT_VESTIGE, oBinder);
}
else if(nStage == STAGE_ASTAROTH)
{
if (nChoice == FEAT_SCRIBE_SCROLL ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_SCRIBE_SCROLL ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_BREW_POTION ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_BREW_POTION ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_CRAFT_WONDROUS ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_CRAFT_WONDROUS ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_CRAFT_ARMS_ARMOR) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_CRAFT_ARMS_ARMOR), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_CRAFT_WAND ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_CRAFT_WAND ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_CRAFT_ROD ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_CRAFT_ROD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_CRAFT_STAFF ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_CRAFT_STAFF ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_FORGE_RING ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_FORGE_RING ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
int nContactTime = VESTIGE_CONTACT_TIME;
if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"));
DeleteLocalInt(oBinder, "nVestige");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_ASTAROTH, oBinder);
}
if(DEBUG) DoDebug("bnd_bindingcnv: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oBinder);
}
}

View File

@@ -0,0 +1,15 @@
#include "bnd_inc_bndfunc"
#include "inc_dynconv"
void main()
{
object oBinder = OBJECT_SELF;
// If we have room to bind another vestige
if (GetMaxVestigeCount(oBinder) > GetBindCount(oBinder))
{
AssignCommand(oBinder, ClearAllActions(TRUE));
StartDynamicConversation("bnd_bindingcnv", oBinder, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, FALSE, TRUE, oBinder);
}
else
FloatingTextStringOnCreature("You have bound the maximum number of vestiges allowed", oBinder, FALSE);
}

View File

@@ -0,0 +1,39 @@
/*
Scion of Dantalion - Dantalion's Glare
From 4th level on, you can use
a standard action to intensify Dantalion<6F>s sign and glare
through its eyes. The starry voids in the eyes of Dantalion<6F>s
sign blaze forth with the brightness of an exploding star,
affecting all creatures in a 30-foot cone. Every creature within
this area must succeed on a Fortitude save (DC 10 + 1/2 your
effective binder level + your Cha modifi er) or be blinded for
1d4 rounds. Once you have used this ability, you cannot do so again
for 5 rounds.
Strat 10/03/21
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
location lTarget = PRCGetSpellTargetLocation();
float fRange = FeetToMeters(30.0);
int nDC = 10 + GetBinderLevel(oBinder, VESTIGE_DANTALION)/2 + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
if(!BindAbilCooldown(oBinder, GetSpellId(), -1)) return;
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && !PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BLIND_DEAF_M), oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, RoundsToSeconds(d4()));
}
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,59 @@
/*
10/03/21 by Stratovarius
Scion of Dantalion, the Star Emperor
As a standard action, you send your thoughts out to
a single creature whose thoughts you are reading (so it has
already failed its Will save against your read thoughts ability),
forcing it to succeed on a Will save (DC 10 + 1/2 your effective
binder level + your Cha modifier) or be dazed for 1d4 rounds.
A successful save allows the creature to break free
of your thought reading.
*/
#include "bnd_inc_bndfunc"
void DantalionOverwhelm(object oBinder, object oTarget, int nDC)
{
if (GetHasSpellEffect(VESTIGE_DANTALION_READ_THOUGHTS, oTarget))
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(PSI_IMP_CONCUSSION_BLAST), oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDazed(), oTarget, RoundsToSeconds(d4()));
}
else // Enemy succeeded on saving throw here
{
FloatingTextStringOnCreature(GetName(oTarget)+" breaks your Read Thoughts!", oBinder, FALSE);
PRCRemoveSpellEffects(VESTIGE_DANTALION_READ_THOUGHTS, oBinder, oTarget);
GZPRCRemoveSpellEffects(VESTIGE_DANTALION_READ_THOUGHTS, oTarget, FALSE);
}
}
}
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nDC = 10 + GetBinderLevel(oBinder, VESTIGE_DANTALION)/2 + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
DantalionOverwhelm(oBinder, oTarget, nDC);
if (GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder) >= 5)
{
location lTarget = GetLocation(oBinder);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_DEEP_SLUMBER), oBinder);
// Use the function to get the closest creature as a target
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(45.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(oAreaTarget != oBinder && oAreaTarget != oTarget && GetIsEnemy(oBinder, oAreaTarget)) // Enemies only
{
DantalionOverwhelm(oBinder, oAreaTarget, nDC);
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(45.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
}

View File

@@ -0,0 +1,4 @@
void main()
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSkillIncrease(SKILL_LORE, 8), OBJECT_SELF, 6.0);
}

View File

@@ -0,0 +1,765 @@
//::///////////////////////////////////////////////
//:: Binding events
//:: bnd_events
//::///////////////////////////////////////////////
/** @file
Does all Binding content that require event scripting.
@author Stratovarius
@date Created - 2021.02.03
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "bnd_inc_bndfunc"
#include "prc_inc_unarmed"
#include "prc_inc_fork"
//////////////////////////////////////////////////
/* Internal Functions */
//////////////////////////////////////////////////
void CheckIsDropped(object oBinder, object oItem)
{
if(DEBUG) DoDebug("bnd_events: CheckIsDropped()");
if(GetItemPossessor(oItem) == oBinder)
{
if(DEBUG) DoDebug("bnd_events:GetItemPosessor(oItem) == oBinder");
// No check for commandability here. Let's not break any cutscenes
// If cheating does occur, set the char to commandable first here.
//And remember to restore the setting.
AssignCommand(oBinder, ClearAllActions());
AssignCommand(oBinder, ActionPutDownItem(oItem));
DelayCommand(2.0, CheckIsDropped(oBinder, oItem));
}
}
//////////////////////////////////////////////////
/* Content Functions */
//////////////////////////////////////////////////
void AymHaloOfFire(object oBinder, object oTarget)
{
if (GetDistanceBetween(oBinder, oTarget) <= FeetToMeters(10.0f))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(1), DAMAGE_TYPE_FIRE), oTarget);
}
}
void NaberiusHeal(object oBinder)
{
int nCount = GetLocalInt(oBinder, "NaberiusCount");
//FloatingTextStringOnCreature("Naberius heal has spell effect, nCount: "+IntToString(nCount), oBinder, FALSE);
if (nCount == 20) // Default timer is 2 real world minutes to an hour
{
RecoverUnHealableAbilityDamage(oBinder, ABILITY_STRENGTH, 1);
RecoverUnHealableAbilityDamage(oBinder, ABILITY_DEXTERITY, 1);
RecoverUnHealableAbilityDamage(oBinder, ABILITY_CONSTITUTION, 1);
RecoverUnHealableAbilityDamage(oBinder, ABILITY_INTELLIGENCE, 1);
RecoverUnHealableAbilityDamage(oBinder, ABILITY_WISDOM, 1);
RecoverUnHealableAbilityDamage(oBinder, ABILITY_CHARISMA, 1);
// Reset the number
nCount -= 20;
}
effect eEffect = GetFirstEffect(oBinder);
while(GetIsEffectValid(eEffect) && !GetLocalInt(oBinder, "NaberiusHealLock"))
{
// Is it an ability decrease?
if(GetEffectType(eEffect) == EFFECT_TYPE_ABILITY_DECREASE)
{
string sTag = GetEffectTag(eEffect);
//FloatingTextStringOnCreature("Effect tag is "+sTag, oBinder, FALSE);
int nAbil = StringToInt(GetSubString(sTag, 0, 1));
//FloatingTextStringOnCreature("Effect ability is "+IntToString(nAbil), oBinder, FALSE);
int nAmount = StringToInt(GetSubString(sTag, 1, 2));
//FloatingTextStringOnCreature("Effect ability is "+IntToString(nAmount), oBinder, FALSE);
SetLocalInt(oBinder, "NaberiusHealLock", TRUE);
DelayCommand(nAmount * 6.0, RemoveEffect(oBinder, eEffect));
DelayCommand(nAmount * 6.0, DeleteLocalInt(oBinder, "NaberiusHealLock"));
//DelayCommand(nAmount * 6.0, FloatingTextStringOnCreature("Naberius heal removed nAmount: "+IntToString(nAmount), oBinder, FALSE));
}
eEffect = GetNextEffect(oBinder);
}
SetLocalInt(oBinder, "NaberiusCount", nCount+1);
}
void HaagentiTrans(object oBinder)
{
effect eEffect = GetFirstEffect(oBinder);
while(GetIsEffectValid(eEffect))
{
// Is it poly or petr
if(GetEffectType(eEffect) == EFFECT_TYPE_PETRIFY || GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH)
RemoveEffect(oBinder, eEffect);
eEffect = GetNextEffect(oBinder);
}
}
void AndrasInfluence(object oBinder)
{
int nCombat = GetIsInCombat(oBinder);
int nCount = GetLocalInt(oBinder, "AndrasCombat");
if (nCombat)
{
nCount += 1;
SetLocalInt(oBinder, "AndrasCombat", nCount);
if (nCount >= 10)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectExhausted()), oBinder, HoursToSeconds(1));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectFrightened()), oBinder, RoundsToSeconds(d4()));
}
}
else
DeleteLocalInt(oBinder, "AndrasCombat");
}
void EurynomePoisonBloodDelay(object oBinder, object oTarget, int nDC)
{
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
{
int nDice = min(5, GetBinderLevel(oBinder, VESTIGE_EURYNOME)/3);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_ACID_S), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(nDice), DAMAGE_TYPE_ACID), oTarget);
}
}
void EurynomePoisonBlood(object oBinder, object oTarget)
{
// Enemy in vaguely melee range, wolves and other long creatures can actually hit outside of 10.0
if (GetDistanceBetween(oBinder, oTarget) <= FeetToMeters(15.0f))
{
// No weapon equipped, and the target has a bite attack
if (!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)) && GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget)))
{
int nDC = GetBinderDC(oBinder, VESTIGE_EURYNOME);
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_ACID_S), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_ACID), oTarget);
}
DelayCommand(60.0, EurynomePoisonBloodDelay(oBinder, oTarget, nDC));
}
}
}
void TenebrousVoid(object oBinder, object oTarget)
{
if (!GetLocalInt(oBinder, "TenebrousVoidStrike"))
{
int nDice = 1 + (GetBinderLevel(oBinder, VESTIGE_TENEBROUS)-7)/4;
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d8(nDice), DAMAGE_TYPE_COLD), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FROST_L), oTarget);
SetLocalInt(oBinder, "TenebrousVoidStrike", TRUE);
DelayCommand(4.5, DeleteLocalInt(oBinder, "TenebrousVoidStrike"));
}
}
void ReapplyTenebrous(object oBinder)
{
SetLocalInt(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE, TRUE);
SetLocalObject(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE, oBinder);
DoBindingCheck(oBinder, 18);
DelayCommand(0.1, ApplyVestige(oBinder, VESTIGE_TENEBROUS)); // Tenebrous vestiges.2da rowid
DelayCommand(1.0, DeleteLocalInt(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE));
DelayCommand(1.0, DeleteLocalObject(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE));
}
void SavnokInfluence(object oBinder, object oItem)
{
if (GetItemACValue(oItem) && !GetLocalInt(oBinder, "SavnokDelay"))
{
int nBase = GetBaseItemType(oItem);
AssignCommand(oBinder, ClearAllActions());
if (nBase == BASE_ITEM_SMALLSHIELD || nBase == BASE_ITEM_LARGESHIELD || nBase == BASE_ITEM_TOWERSHIELD)
AssignCommand(oBinder, ActionEquipItem(oItem, INVENTORY_SLOT_LEFTHAND));
if (nBase == BASE_ITEM_ARMOR)
AssignCommand(oBinder, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
SetLocalInt(oBinder, "SavnokDelay", TRUE);
DelayCommand(0.5, DeleteLocalInt(oBinder, "SavnokDelay"));
DelayCommand(0.5, ExecuteScript("prc_speed", oBinder));
}
}
void ExpelledVestigeCleanup(object oBinder)
{
if (!GetHasSpellEffect(VESTIGE_ANDROMALIUS, oBinder))
{
DeleteLocalInt(oBinder, "AndroSneak");
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oBinder));
}
if (!GetHasSpellEffect(VESTIGE_MALPHAS, oBinder))
{
DeleteLocalInt(oBinder, "MalphasSneak");
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oBinder));
}
if (!GetHasSpellEffect(VESTIGE_FOCALOR, oBinder))
{
PRCRemoveSpellEffects(VESTIGE_FOCALOR_AURA_SADNESS, oBinder, oBinder);
PRCRemoveSpellEffects(VESTIGE_FOCALOR_AURA_SADNESS, oBinder, oBinder);
}
if (!GetHasSpellEffect(VESTIGE_RONOVE, oBinder))
{
DeleteLocalInt(oBinder, "RonovesFists");
}
if (!GetHasSpellEffect(VESTIGE_SAVNOK, oBinder) && GetIsObjectValid(GetItemPossessedBy(oBinder, "SavnokCallArmor")))
{
object oArmor = GetItemPossessedBy(oBinder, "SavnokCallArmor");
SetPlotFlag(oArmor, FALSE);
DestroyObject(oArmor);
}
if (!GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && GetIsObjectValid(GetItemPossessedBy(oBinder, "bnd_eury_hammer")))
{
object oHammer = GetItemPossessedBy(oBinder, "bnd_eury_hammer");
SetPlotFlag(oHammer, FALSE);
AssignCommand(oHammer, SetIsDestroyable(TRUE, TRUE, TRUE));
DestroyObject(oHammer);
}
// Using Disguise Self strips the hide of all the vestige feats, this reapplies them
// Checks for having naberius, but not the disguise self feat
if (GetHasSpellEffect(VESTIGE_NABERIUS, oBinder) && !GetHasFeat(9033, oBinder))
{
int i;
for(i = VESTIGE_AMON; i <= VESTIGE_ABYSM; i++)
{
if(GetHasSpellEffect(i, oBinder))
{
ApplyVestige(oBinder, i);
//FloatingTextStringOnCreature("Applying vestige "+IntToString(i), oBinder, FALSE);
}
}
}
if (!GetHasSpellEffect(VESTIGE_ACERERAK, oBinder)) DeleteLocalInt(oBinder, "AcererakHealing");
if (!GetHasSpellEffect(VESTIGE_ARETE, oBinder))
{
PRCRemoveSpellEffects(VESTIGE_ARETE_RESIST, oBinder, oBinder);
GZPRCRemoveSpellEffects(VESTIGE_ARETE_RESIST, oBinder, FALSE);
}
}
void ChupoclopsEth(object oBinder)
{
// Check to see if the WP is valid
string sWPTag = "bnd_eventsWP_" + GetName(oBinder);
object oTestWP = GetWaypointByTag(sWPTag);
if (!GetIsObjectValid(oTestWP))
{
// Create waypoint for the movement
CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(oBinder), FALSE, sWPTag);
if(DEBUG) DoDebug("bnd_events: Chupoclops WP for " + DebugObject2Str(oBinder) + " didn't exist, creating. Tag: " + sWPTag);
}
else // We have a test waypoint, now to check the distance
{
// Distance moved in the last round
float fDist = GetDistanceBetween(oBinder, oTestWP);
// Distance needed to move
float fCheck = FeetToMeters(10.0);
// Now clean up the WP and create a new one for next round's check
DestroyObject(oTestWP);
CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(oBinder), FALSE, sWPTag);
if(DEBUG) DoDebug("bnd_events: Moved enough: " + DebugBool2String(fDist >= fCheck));
// Moved too far or in combat
if (fDist >= fCheck || GetIsInCombat(oBinder))
{
PRCRemoveSpellEffects(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder, oBinder);
GZPRCRemoveSpellEffects(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder, FALSE);
BindAbilCooldown(oBinder, VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, VESTIGE_CHUPOCLOPS);
}
}
}
void ShaxStormStrike(object oBinder, object oTarget)
{
if (!GetLocalInt(oBinder, "ShaxStormStrike"))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_SONIC), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SONIC), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_ELECTRICAL), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
SetLocalInt(oBinder, "ShaxStormStrike", TRUE);
DelayCommand(4.5, DeleteLocalInt(oBinder, "ShaxStormStrike"));
}
}
void VanusDisdain(object oBinder, object oTarget)
{
if (GetHitDice(oBinder) > GetHitDice(oTarget))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_DIVINE), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
}
}
void VanusInfluence(object oBinder)
{
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_VANUS)))
{
int nCombat = GetLocalInt(oBinder, "VanusInfluence");
int nCurrent = GetIsInCombat(oBinder);
// We just left combat
if (nCurrent == FALSE && nCombat == TRUE)
{
SetCutsceneMode(oBinder, TRUE);
FloatingTextStringOnCreature("Victory over my enemies!", oBinder);
AssignCommand(oBinder, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 6.0));
DelayCommand(6.0, SetCutsceneMode(oBinder, FALSE));
}
//FloatingTextStringOnCreature("Vanus Combat State "+IntToString(nCurrent), oBinder);
SetLocalInt(oBinder, "VanusInfluence", nCurrent);
}
}
void CityDweller(object oBinder)
{
object oArea = GetArea(oBinder);
// Urban environment, so not natural and aboveground
if (GetIsAreaNatural(oArea) != AREA_NATURAL && GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
{
SetLocalInt(oBinder, "DesharisSpeed", TRUE);
ExecuteScript("prc_speed", oBinder);
}
else
{
DeleteLocalInt(oBinder, "DesharisSpeed");
ExecuteScript("prc_speed", oBinder);
}
}
void EligorChromatic(object oBinder, object oTarget)
{
if (!GetLocalInt(oBinder, "EligorStrikeTimer"))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), GetLocalInt(oBinder, "EligorStrike")), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FAERIE_FIRE), oTarget);
SetLocalInt(oBinder, "EligorStrikeTimer", TRUE);
DelayCommand(4.5, DeleteLocalInt(oBinder, "EligorStrikeTimer"));
}
}
void MarchosiasRetribution(object oBinder, object oTarget)
{
// Skirmish or sneak attack
if (GetLevelByClass(CLASS_TYPE_SCOUT, oTarget) || GetTotalSneakAttackDice(oTarget))
{
if (GetDistanceBetween(oBinder, oTarget) < FeetToMeters(30.0))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(3), DAMAGE_TYPE_FIRE), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
}
}
}
/*
All of this below here is for the Karsite suppress item ability
*/
void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats);
object GetChest(object oCreature)
{
object oChest = GetObjectByTag("npf_chest" + ObjectToString(oCreature));
if(oChest == OBJECT_INVALID)
{
object oWP = GetWaypointByTag("npf_wp_chest_sp");
oChest = CreateObject(OBJECT_TYPE_PLACEABLE, "npf_keep_chest", GetLocation(oWP), FALSE,
"npf_chest" + ObjectToString(oCreature));
}
return oChest;
}
void RemoveAllProperties(object oItem, object oPC)
{
if(DEBUG) DoDebug("ture_utr_supitem: About to remove properties from item: " + DebugObject2Str(oItem));
if(oItem == OBJECT_INVALID)
return;
int nType = GetBaseItemType(oItem);
if(nType == BASE_ITEM_TORCH
|| nType == BASE_ITEM_TRAPKIT
|| nType == BASE_ITEM_HEALERSKIT
|| nType == BASE_ITEM_GRENADE
|| nType == BASE_ITEM_THIEVESTOOLS
|| nType == BASE_ITEM_CRAFTMATERIALMED
|| nType == BASE_ITEM_CRAFTMATERIALSML
|| nType == 112)//craftbase
return;
object oWP = GetWaypointByTag("npf_wp_chest_sp");
// Generate UID
int nKey = GetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter") + 1;
SetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter", nKey);
string sKey = IntToString(nKey);
if(DEBUG) DoDebug("prc_pow_npfent: Removing itemproperties from item " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' of creature " + DebugObject2Str(oPC));
//object oChest = GetChest(oPC);
//object oCopy = CopyObject(oItem, GetLocation(oChest), oChest);
// copying original item to a secluded waypoint in the area
// and giving it a tag that contains the key string
object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "npf_item" + sKey);
//storing the key value on the original item (key value would point to the copy item)
SetLocalString(oItem, "PRC_NullPsionicsField_Item_UID", sKey);
//SetLocalObject(oItem, "ITEM_CHEST", oChest); // so the chest can be found
//SetLocalObject(oChest, sKey, oCopy); // and referenced in the chest
// Stripping original item from all properties
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
}
void RestoreAllProperties(object oItem, object oPC, int nSlot = -1)
{
if(DEBUG) DoDebug("psi_pow_npfext: Attempting to restore itemproperties to: " + DebugObject2Str(oItem));
if(oPC != OBJECT_INVALID) // this is a pc object that has an item in inventory slot or normal inventory
{
if(oItem == OBJECT_INVALID)
oItem = GetItemInSlot(nSlot, oPC);
if(oItem == OBJECT_INVALID)
return;
}
//object oChest = GetLocalObject(oItem, "ITEM_CHEST");
// getting the key value - this points to the tag of the copy item
string sKey = GetLocalString(oItem, "PRC_NullPsionicsField_Item_UID");
// retrieving the copy item that is in this area
object oOriginalItem = GetObjectByTag("npf_item" + sKey);
if(DEBUG) DoDebug("psi_pow_npfext: Restoring itemproperties to item: " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' for creature " + DebugObject2Str(oPC));
//object oOriginalItem = GetLocalObject(oChest, sKey);
object oNewItem;
if(oOriginalItem != OBJECT_INVALID) // item has not been restored yet
{
// replace current item with original
IPCopyItemProperties(oOriginalItem, oItem);
DestroyObject(oOriginalItem); // destroy dup item on player
//DeleteLocalObject(oChest, GetResRef(oItem)); // so it won't be restored again
DeleteLocalString(oItem, "PRC_NullPsionicsField_Item_UID");
}
}
void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats)
{
// Break if they fail concentration or it runs out
if (GetBreakConcentrationCheck(oTrueSpeaker) || nBeats == 0) return;
// Remove and restore the properties
RemoveAllProperties(oTarget, GetItemPossessor(oTarget));
// Has to run before RemoveAll is called again
DelayCommand(5.8, RestoreAllProperties(oTarget, GetItemPossessor(oTarget)));
// Apply VFX
effect eImp = EffectVisualEffect(VFX_IMP_PULSE_BOMB);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, GetItemPossessor(oTarget));
DelayCommand(6.0, SuppressItem(oTrueSpeaker, oTarget, nBeats - 1));
}
void KarsiteOnHit(object oBinder, object oTarget)
{
// If the target succeeds, bail
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, 10 + GetAbilityModifier(ABILITY_CHARISMA, oBinder), SAVING_THROW_TYPE_NONE)) return;
object oItem;
// If the right hand isn't suppressed, that gets priority
if (!GetLocalInt(oTarget, "KarsiteSuppressRight"))
{
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
SuppressItem(oBinder, oItem, 1);
SetLocalInt(oTarget, "KarsiteSuppressRight", TRUE);
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressRight"));
}
else if (!GetLocalInt(oTarget, "KarsiteSuppressChest"))
{
oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
SuppressItem(oBinder, oItem, 1);
SetLocalInt(oTarget, "KarsiteSuppressChest", TRUE);
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressChest"));
}
else if (!GetLocalInt(oTarget, "KarsiteSuppressLeft"))
{
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
SuppressItem(oBinder, oItem, 1);
SetLocalInt(oTarget, "KarsiteSuppressLeft", TRUE);
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressLeft"));
}
}
//////////////////////////////////////////////////
/* Void Main and Event Triggers */
//////////////////////////////////////////////////
void main()
{
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("bnd_events running, event: " + IntToString(nEvent));
// Get the PC. This is event-dependent
object oBinder;
switch(nEvent)
{
case EVENT_ITEM_ONHIT: oBinder = OBJECT_SELF; break;
case EVENT_ONPLAYEREQUIPITEM: oBinder = GetItemLastEquippedBy(); break;
case EVENT_ONPLAYERUNEQUIPITEM: oBinder = GetItemLastUnequippedBy(); break;
case EVENT_ONHEARTBEAT: oBinder = OBJECT_SELF; break;
case EVENT_ONPLAYERREST_FINISHED: oBinder = GetLastBeingRested(); break;
case EVENT_ONACQUIREITEM: oBinder = GetModuleItemAcquiredBy(); break;
default:
oBinder = OBJECT_SELF;
}
object oItem;
object oSkin = GetPCSkin(oBinder);
// We aren't being called from any event, instead from EvalPRCFeats
if(nEvent == FALSE)
{
// Hook in the events
if(DEBUG) DoDebug("bnd_events: Adding eventhooks");
AddEventScript(oBinder, EVENT_ONPLAYEREQUIPITEM, "bnd_events", TRUE, FALSE);
AddEventScript(oBinder, EVENT_ONPLAYERUNEQUIPITEM, "bnd_events", TRUE, FALSE);
AddEventScript(oBinder, EVENT_ONHEARTBEAT, "bnd_events", TRUE, FALSE);
AddEventScript(oBinder, EVENT_ONPLAYERREST_FINISHED, "bnd_events", TRUE, FALSE);
AddEventScript(oBinder, EVENT_ONACQUIREITEM , "bnd_events", TRUE, FALSE);
if (GetHasSpellEffect(VESTIGE_RONOVE, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_RONOVE_FISTS))
{
SetLocalInt(oBinder, CALL_UNARMED_FEATS, TRUE);
SetLocalInt(oBinder, CALL_UNARMED_FISTS, TRUE);
}
}
else if(nEvent == EVENT_ITEM_ONHIT)
{
oItem = GetSpellCastItem();
object oTarget = PRCGetSpellTargetObject();
if(DEBUG) DoDebug("bnd_events: OnHit:\n"
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
+ "oTarget = " + DebugObject2Str(oTarget) + "\n"
);
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
{
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_HALO_FIRE))
AymHaloOfFire(oBinder, oTarget);
if (GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_POISON))
EurynomePoisonBlood(oBinder, oTarget);
}
else // This is always a weapon
{
if (GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) VanusDisdain(oBinder, oTarget);
if (GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) MarchosiasRetribution(oBinder, oTarget);
}
// Melee weapon checks
if(IPGetIsMeleeWeapon(oItem))
{
if (GetHasSpellEffect(VESTIGE_TENEBROUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_TENEBROUS_TOUCH_VOID)) TenebrousVoid(oBinder, oTarget);
if (GetHasSpellEffect(VESTIGE_SHAX, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_SHAX_STORM_STRIKE)) ShaxStormStrike(oBinder, oTarget);
if (GetHasSpellEffect(VESTIGE_ELIGOR, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_STRIKE)) EligorChromatic(oBinder, oTarget);
if (GetRacialType(oBinder) == RACIAL_TYPE_KARSITE) KarsiteOnHit(oBinder, oTarget);
}
}// end if - Running OnHit event
else if(nEvent == EVENT_ONPLAYEREQUIPITEM)
{
oItem = GetItemLastEquipped();
if(DEBUG) DoDebug("bnd_events - OnEquip\n"
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
{
// Can't get Aym from Bind Vestige feat
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_HALO_FIRE) ||
(GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_POISON)) )
{
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
}
}
// Melee weapon checks
if(IPGetIsMeleeWeapon(oItem))
{
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && GetBinderLevel(oBinder, VESTIGE_AYM) >= 10 && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_RUINOUS_ATTACK))
{
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
if (GetHasSpellEffect(VESTIGE_RONOVE, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_RONOVE_COLD_IRON))
{
int nBonus = 1;
if (GetBinderLevel(oBinder, VESTIGE_RONOVE) >= 7) nBonus = 3;
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
if ((GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) ||
(GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) ||
(GetRacialType(oBinder) == RACIAL_TYPE_KARSITE))
{
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
}
// Any weapon
if (GetIsWeapon(oItem))
{
if (GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder))
{
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(3), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(3), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
}
if (GetWeaponRanged(oItem))
{
if ((GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) ||
(GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) )
{
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
object oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oBinder);
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oBinder);
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oBinder);
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
}
}
}
// We are called from the OnPlayerUnEquipItem eventhook. Remove OnHitCast: Unique Power from oBinder's weapon
else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
{
oItem = GetItemLastUnequipped();
if(DEBUG) DoDebug("bnd_events - OnUnEquip\n"
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
if (GetHasSpellEffect(VESTIGE_SAVNOK, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_SAVNOK)))
{
SavnokInfluence(oBinder, oItem);
}
// Only applies to armours
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
{
// Remove the temporary OnHitCastSpell: Unique
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", 1, DURATION_TYPE_TEMPORARY);
}
// Clean up weapons
if(GetIsWeapon(oItem))
{
// Remove the attack bonus
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem, ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
object oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oBinder);
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oBinder);
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oBinder);
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
}
}
else if(nEvent == EVENT_ONHEARTBEAT)
{
ExpelledVestigeCleanup(oBinder);
if (GetHasSpellEffect(VESTIGE_NABERIUS, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_NABERIUS_ABILITY_HEALING)) NaberiusHeal(oBinder);
if (GetHasSpellEffect(VESTIGE_HAAGENTI, oBinder)) HaagentiTrans(oBinder);
if (GetHasSpellEffect(VESTIGE_PAIMON, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_PAIMON_BLADES))
{
int nType = GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder));
if (nType == BASE_ITEM_RAPIER || nType == BASE_ITEM_SHORTSWORD)
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_FINESSE), 5.999, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
}
if (GetHasSpellEffect(VESTIGE_ANDRAS, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_ANDRAS))) AndrasInfluence(oBinder);
if (GetHasSpellEffect(VESTIGE_TENEBROUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_TENEBROUS_SEE_DARKNESS)) ActionCastSpellOnSelf(SPELL_DARKVISION);
if (GetHasSpellEffect(VESTIGE_GERYON, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_GERYON_DARKNESS)) ActionCastSpellOnSelf(SPELL_DARKVISION);
if (GetIsPatronVestigeBound(oBinder) && GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder) >= 5)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageReduction(10, DAMAGE_POWER_PLUS_ONE), oBinder, 6.0);
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_OUTSIDER_RACIAL_TYPE), 5.999, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (GetHasSpellEffect(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder)) ChupoclopsEth(oBinder);
if (GetHasSpellEffect(VESTIGE_VANUS, oBinder)) VanusInfluence(oBinder);
if (GetHasSpellEffect(VESTIGE_DESHARIS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_CITY_DWELLER)) CityDweller(oBinder);
}
else if(nEvent == EVENT_ONPLAYERREST_FINISHED)
{
if (GetHasFeat(FEAT_RAPID_PACT_MAKING, oBinder)) DeleteLocalInt(oBinder, "RapidPactMaking");
// Naberius's Skills
int i;
for(i = 0; i < 40 ; i++)
DeleteLocalInt(oBinder, "NaberiusSkill"+IntToString(i));
DeleteLocalInt(oBinder, "RonovesFists");
DeleteLocalInt(oBinder, "AndrasMount");
DeleteLocalInt(oBinder, "AmonRam");
DeleteLocalInt(oBinder, "ExploitVestige");
if (GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oBinder))
{
SetLocalInt(oBinder, "BinderRested", TRUE);
DelayCommand(30.0, DeleteLocalInt(oBinder, "BinderRested"));
}
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_KARSUS_DISPEL));
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_TENEBROUS_FLICKER));
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_DANTALION_TRAVEL_SPELL));
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_THE_TRIAD_SMITE));
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(19139));
DeleteLocalInt(oBinder, "ZceryllTS");
if (GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder)) ReapplyTenebrous(oBinder);
}
else if(nEvent == EVENT_ONACQUIREITEM)
{
oItem = GetModuleItemAcquired();
if(DEBUG) DoDebug("bnd_events - OnAcquire\n"
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
if (GetHasSpellEffect(VESTIGE_ANDROMALIUS, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_ANDROMALIUS)))
{
if (GetStolenFlag(oItem))
{
FloatingTextStringOnCreature("Andromalius prevents you from taking a stolen item!", oBinder, FALSE);
AssignCommand(oBinder, ActionPutDownItem(oItem));
DelayCommand(2.0, CheckIsDropped(oBinder, oItem));
}
}
if (GetHasSpellEffect(VESTIGE_KARSUS, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_KARSUS_WILL))
{
int nType = GetBaseItemType(oItem);
if(nType == BASE_ITEM_MAGICWAND || nType == BASE_ITEM_ENCHANTED_WAND || nType == BASE_ITEM_MAGICSTAFF || nType == BASE_ITEM_CRAFTED_STAFF || nType == BASE_ITEM_BLANK_WAND || nType == BASE_ITEM_MAGICROD || nType == BASE_ITEM_CRAFTED_ROD)
{
IPSafeAddItemProperty(oItem, ItemPropertyLimitUseByClass(CLASS_TYPE_BINDER), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
}
}
}

View File

@@ -0,0 +1,249 @@
//:://////////////////////////////////////////////
//:: Expel Vestige choice script
//:: bnd_expelcnv
//:://////////////////////////////////////////////
/*
@author Stratovarius - 2021.02.03
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "bnd_inc_bndfunc"
#include "inc_dynconv"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_SELECT_VESTIGE = 0;
const int STAGE_CONFIRM_SELECTION = 1;
const int CHOICE_BACK_TO_LSELECT = -1;
const int STRREF_SELECTED_HEADER1 = 16824209; // "You have selected:"
const int STRREF_SELECTED_HEADER2 = 16824210; // "Is this correct?"
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const int SORT = TRUE; // If the sorting takes too much CPU, set to FALSE
const int DEBUG_LIST = FALSE;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void PrintList(object oBinder)
{
string tp = "Printing list:\n";
string s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
if(s == ""){
tp += "Empty\n";
}
else{
tp += s + "\n";
s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + s);
while(s != ""){
tp += "=> " + s + "\n";
s = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + s);
}
}
DoDebug(tp);
}
/**
* Creates a linked list of entries that is sorted into alphabetical order
* as it is built.
* Assumption: mystery names are unique.
*
* @param oBinder The storage object aka whomever is gaining powers in this conversation
* @param sChoice The choice string
* @param nChoice The choice value
*/
void AddToTempList(object oBinder, string sChoice, int nChoice)
{
if(DEBUG_LIST) DoDebug("\nAdding to temp list: '" + sChoice + "' - " + IntToString(nChoice));
if(DEBUG_LIST) PrintList(oBinder);
// If there is nothing yet
if(!GetLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited"))
{
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head", sChoice);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_List_" + sChoice, nChoice);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited", TRUE);
}
else
{
// Find the location to instert into
string sPrev = "", sNext = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
while(sNext != "" && StringCompare(sChoice, sNext) >= 0)
{
if(DEBUG_LIST) DoDebug("Comparison between '" + sChoice + "' and '" + sNext + "' = " + IntToString(StringCompare(sChoice, sNext)));
sPrev = sNext;
sNext = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sNext);
}
// Insert the new entry
// Does it replace the head?
if(sPrev == "")
{
if(DEBUG_LIST) DoDebug("New head");
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head", sChoice);
}
else
{
if(DEBUG_LIST) DoDebug("Inserting into position between '" + sPrev + "' and '" + sNext + "'");
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sPrev, sChoice);
}
SetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sChoice, sNext);
SetLocalInt(oBinder, "PRC_MeldshapeConvo_List_" + sChoice, nChoice);
}
}
/**
* Reads the linked list built with AddToTempList() to AddChoice() and
* deletes it.
*
* @param oBinder A PC gaining powers at the moment
*/
void TransferTempList(object oBinder)
{
string sChoice = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
int nChoice = GetLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sChoice);
DeleteLocalString(oBinder, "PRC_MeldshapeConvo_List_Head");
string sPrev;
if(DEBUG_LIST) DoDebug("Head is: '" + sChoice + "' - " + IntToString(nChoice));
while(sChoice != "")
{
// Add the choice
AddChoice(sChoice, nChoice, oBinder);
// Get next
sChoice = GetLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + (sPrev = sChoice));
nChoice = GetLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sChoice);
if(DEBUG_LIST) DoDebug("Next is: '" + sChoice + "' - " + IntToString(nChoice) + "; previous = '" + sPrev + "'");
// Delete the already handled data
DeleteLocalString(oBinder, "PRC_MeldshapeConvo_List_Next_" + sPrev);
DeleteLocalInt (oBinder, "PRC_MeldshapeConvo_List_" + sPrev);
}
DeleteLocalInt(oBinder, "PRC_MeldshapeConvo_ListInited");
}
void main()
{
object oBinder = GetPCSpeaker();
int nValue = GetLocalInt(oBinder, DYNCONV_VARIABLE);
int nStage = GetStage(oBinder);
string sVestigeFile = GetVestigeFile();
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
if(DEBUG) DoDebug("bnd_expelcnv: Running setup stage for stage " + IntToString(nStage));
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oBinder))
{
if(DEBUG) DoDebug("bnd_expelcnv: Stage was not set up already");
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_expelcnv: Building vestige selection");
SetHeader("Choose the vestige to expel.");
string sVestige;
int i, nVestige;
for(i = 0; i < 50 ; i++)
{
sVestige = GetStringByStrRef(StringToInt(Get2DACache(sVestigeFile, "Name", i)));
nVestige = StringToInt(Get2DACache(sVestigeFile, "SpellID", i));
if (DEBUG) DoDebug("sVestige: "+sVestige);
// If we have the vestige bound
if(GetHasSpellEffect(nVestige, oBinder))
{
AddChoice(GetStringByStrRef(StringToInt(Get2DACache(sVestigeFile, "Name", i))), i, oBinder);
}
}
// Set the next, previous and wait tokens to default values
SetDefaultTokens();
// Set the convo quit text to "Abort"
SetCustomToken(DYNCONV_TOKEN_EXIT, GetStringByStrRef(DYNCONV_STRREF_ABORT_CONVO));
}
// Selection confirmation stage
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if(DEBUG) DoDebug("bnd_expelcnv: Building selection confirmation");
// Build the confirmation query
string sToken = GetStringByStrRef(STRREF_SELECTED_HEADER1) + "\n\n"; // "You have selected:"
int nSpellId = GetLocalInt(oBinder, "nVestige");
sToken += GetStringByStrRef(StringToInt(Get2DACache(sVestigeFile, "Description", nSpellId)))+"\n\n";
sToken += GetStringByStrRef(STRREF_SELECTED_HEADER2); // "Is this correct?"
SetHeader(sToken);
AddChoice(GetStringByStrRef(STRREF_YES), TRUE, oBinder); // "Yes"
AddChoice(GetStringByStrRef(STRREF_NO), FALSE, oBinder); // "No"
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("bnd_expelcnv: Running exit handler");
// End of conversation cleanup
DeleteLocalInt(oBinder, "nVestige");
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
}
// Handle PC response
else
{
int nChoice = GetChoice(oBinder);
if(DEBUG) DoDebug("bnd_expelcnv: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " + IntToString(nChoice) + "; choice text = '" + GetChoiceText(oBinder) + "'");
if(nStage == STAGE_SELECT_VESTIGE)
{
if(DEBUG) DoDebug("bnd_expelcnv: Chakra selected");
SetLocalInt(oBinder, "nVestige", nChoice);
nStage = STAGE_CONFIRM_SELECTION;
MarkStageNotSetUp(STAGE_SELECT_VESTIGE, oBinder);
}
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if (nChoice)
{
int nContactTime = VESTIGE_CONTACT_TIME;
if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"), TRUE);
DeleteLocalInt(oBinder, "nVestige");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
nStage = STAGE_SELECT_VESTIGE;
MarkStageNotSetUp(STAGE_CONFIRM_SELECTION, oBinder);
}
if(DEBUG) DoDebug("bnd_expelcnv: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oBinder);
}
}

View File

@@ -0,0 +1,305 @@
//:://////////////////////////////////////////////
//:: Anima Mage Exploit Vestige Spell choice script
//:: bnd_exploitcnv
//:://////////////////////////////////////////////
/** @file
@author Stratovarius - 2019.02.14
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_inc_function"
#include "bnd_inc_bndfunc"
#include "inc_dynconv"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_SELECT_EVOCATION = 0;
const int STAGE_CONFIRM_SELECTION = 1;
const int CHOICE_BACK_TO_LSELECT = -1;
const int STRREF_BACK_TO_LSELECT = 16836035; // "Return to level selection."
const int STRREF_MYSTLIST_HEADER2 = 16836038; // "more mysteries"
const int STRREF_SELECTED_HEADER1 = 16824209; // "You have selected:"
const int STRREF_SELECTED_HEADER2 = 16824210; // "Is this correct?"
const int STRREF_END_CONVO_SELECT = 16824212; // "Finish"
const int LEVEL_STRREF_START = 16824809;
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const int SORT = TRUE; // If the sorting takes too much CPU, set to FALSE
const int DEBUG_LIST = FALSE;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void PrintList(object oBinder)
{
string tp = "Printing list:\n";
string s = GetLocalString(oBinder, "PRC_MystConvo_List_Head");
if(s == ""){
tp += "Empty\n";
}
else{
tp += s + "\n";
s = GetLocalString(oBinder, "PRC_MystConvo_List_Next_" + s);
while(s != ""){
tp += "=> " + s + "\n";
s = GetLocalString(oBinder, "PRC_MystConvo_List_Next_" + s);
}
}
DoDebug(tp);
}
/**
* Creates a linked list of entries that is sorted into alphabetical order
* as it is built.
* Assumption: mystery names are unique.
*
* @param oBinder The storage object aka whomever is gaining powers in this conversation
* @param sChoice The choice string
* @param nChoice The choice value
*/
void AddToTempList(object oBinder, string sChoice, int nChoice)
{
if(DEBUG_LIST) DoDebug("\nAdding to temp list: '" + sChoice + "' - " + IntToString(nChoice));
if(DEBUG_LIST) PrintList(oBinder);
// If there is nothing yet
if(!GetLocalInt(oBinder, "PRC_MystConvo_ListInited"))
{
SetLocalString(oBinder, "PRC_MystConvo_List_Head", sChoice);
SetLocalInt(oBinder, "PRC_MystConvo_List_" + sChoice, nChoice);
SetLocalInt(oBinder, "PRC_MystConvo_ListInited", TRUE);
}
else
{
// Find the location to instert into
string sPrev = "", sNext = GetLocalString(oBinder, "PRC_MystConvo_List_Head");
while(sNext != "" && StringCompare(sChoice, sNext) >= 0)
{
if(DEBUG_LIST) DoDebug("Comparison between '" + sChoice + "' and '" + sNext + "' = " + IntToString(StringCompare(sChoice, sNext)));
sPrev = sNext;
sNext = GetLocalString(oBinder, "PRC_MystConvo_List_Next_" + sNext);
}
// Insert the new entry
// Does it replace the head?
if(sPrev == "")
{
if(DEBUG_LIST) DoDebug("New head");
SetLocalString(oBinder, "PRC_MystConvo_List_Head", sChoice);
}
else
{
if(DEBUG_LIST) DoDebug("Inserting into position between '" + sPrev + "' and '" + sNext + "'");
SetLocalString(oBinder, "PRC_MystConvo_List_Next_" + sPrev, sChoice);
}
SetLocalString(oBinder, "PRC_MystConvo_List_Next_" + sChoice, sNext);
SetLocalInt(oBinder, "PRC_MystConvo_List_" + sChoice, nChoice);
}
}
/**
* Reads the linked list built with AddToTempList() to AddChoice() and
* deletes it.
*
* @param oBinder A PC gaining powers at the moment
*/
void TransferTempList(object oBinder)
{
string sChoice = GetLocalString(oBinder, "PRC_MystConvo_List_Head");
int nChoice = GetLocalInt (oBinder, "PRC_MystConvo_List_" + sChoice);
DeleteLocalString(oBinder, "PRC_MystConvo_List_Head");
string sPrev;
if(DEBUG_LIST) DoDebug("Head is: '" + sChoice + "' - " + IntToString(nChoice));
while(sChoice != "")
{
// Add the choice
AddChoice(sChoice, nChoice, oBinder);
// Get next
sChoice = GetLocalString(oBinder, "PRC_MystConvo_List_Next_" + (sPrev = sChoice));
nChoice = GetLocalInt (oBinder, "PRC_MystConvo_List_" + sChoice);
if(DEBUG_LIST) DoDebug("Next is: '" + sChoice + "' - " + IntToString(nChoice) + "; previous = '" + sPrev + "'");
// Delete the already handled data
DeleteLocalString(oBinder, "PRC_MystConvo_List_Next_" + sPrev);
DeleteLocalInt (oBinder, "PRC_MystConvo_List_" + sPrev);
}
DeleteLocalInt(oBinder, "PRC_MystConvo_ListInited");
}
int GetHighestSpellLevel(object oBinder)
{
if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(9))) return 9;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(8))) return 8;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(7))) return 7;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(6))) return 6;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(5))) return 5;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(4))) return 4;
else if (!GetLocalInt(oBinder, "PRC_ArcSpell"+IntToString(3))) return 3;
// Need 2 to get into the class
return 2;
}
void main()
{
object oBinder = GetPCSpeaker();
int nValue = GetLocalInt(oBinder, DYNCONV_VARIABLE);
int nStage = GetStage(oBinder);
int nType = GetPrimaryArcaneClass(oBinder);
string sPowerFile = GetFileForClass(nType);
if (nType = CLASS_TYPE_WIZARD) sPowerFile = "cls_spell_sorc";
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
if(DEBUG) DoDebug("bnd_exploitcnv: Running setup stage for stage " + IntToString(nStage));
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oBinder))
{
if(DEBUG) DoDebug("bnd_exploitcnv: Stage was not set up already");
// mystery selection stage
if(nStage == STAGE_SELECT_EVOCATION)
{
if(DEBUG) DoDebug("bnd_exploitcnv: Building spell selection");
SetHeader("Select a spell to store for Exploit Vestige");
int nLevelToBrowse = GetHighestSpellLevel(oBinder);
if(DEBUG)
{
DoDebug("bnd_exploitcnv: Spell Level To Browse: " + IntToString(nLevelToBrowse));
}
int i, nSpellLevel;
string sFeatID;
for(i = 0; i < 600 ; i++)
{
nSpellLevel = StringToInt(Get2DACache(sPowerFile, "Level", i));
// Skip any powers of too low level
if(nSpellLevel < nLevelToBrowse){
continue;
}
//Due to the way the 2das are structured, we know that once
//the level of a read spell is greater than the maximum castable
//it'll never be lower again. Therefore, we can skip reading the
//spells that wouldn't be shown anyway.
if(nSpellLevel > nLevelToBrowse){
break;
}
sFeatID = Get2DACache(sPowerFile, "FeatID", i);
int nSpellId = StringToInt(Get2DACache(sPowerFile, "RealSpellID", i));
if(sFeatID != "") // Non-blank row
{
if(SORT) AddToTempList(oBinder, GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSpellId))), nSpellId);
else AddChoice(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSpellId))), nSpellId, oBinder);
}
}
if(SORT) TransferTempList(oBinder);
// Hack - In the mystery selection stage, on returning from
// confirmation dialog where the answer was "No", restore the
// offset to be the same as on entering the confirmation dialog.
if(GetLocalInt(oBinder, "MYSTLISTChoiceOffset"))
{
if(DEBUG) DoDebug("bnd_exploitcnv: Running offset restoration hack");
SetLocalInt(oBinder, DYNCONV_CHOICEOFFSET, GetLocalInt(oBinder, "MYSTLISTChoiceOffset") - 1);
DeleteLocalInt(oBinder, "MYSTLISTChoiceOffset");
}
MarkStageSetUp(STAGE_SELECT_EVOCATION, oBinder);
}
// Selection confirmation stage
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if(DEBUG) DoDebug("bnd_exploitcnv: Building selection confirmation");
// Build the confirmantion query
string sToken = GetStringByStrRef(STRREF_SELECTED_HEADER1) + "\n\n"; // "You have selected:"
int nSpellId = GetLocalInt(oBinder, "nEvo");
sToken += GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSpellId)))+"\n";
sToken += GetStringByStrRef(StringToInt(Get2DACache("spells", "SpellDesc", nSpellId)))+"\n\n";
sToken += GetStringByStrRef(STRREF_SELECTED_HEADER2); // "Is this correct?"
SetHeader(sToken);
AddChoice(GetStringByStrRef(STRREF_YES), TRUE, oBinder); // "Yes"
AddChoice(GetStringByStrRef(STRREF_NO), FALSE, oBinder); // "No"
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("bnd_exploitcnv: Running exit handler");
// End of conversation cleanup
DeleteLocalInt(oBinder, "nClass");
DeleteLocalInt(oBinder, "nEvo");
DeleteLocalInt(oBinder, "nLevelToBrowse");
DeleteLocalInt(oBinder, "MYSTLISTChoiceOffset");
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
}
// Handle PC response
else
{
int nChoice = GetChoice(oBinder);
if(DEBUG) DoDebug("bnd_exploitcnv: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " + IntToString(nChoice) + "; choice text = '" + GetChoiceText(oBinder) + "'");
if(nStage == STAGE_SELECT_EVOCATION)
{
if(DEBUG) DoDebug("bnd_exploitcnv: Entering mystery confirmation");
SetLocalInt(oBinder, "nEvo", nChoice);
// Store offset so that if the user decides not to take the mystery,
// we can return to the same page in the mystery list instead of resetting to the beginning
// Store the value +1 in order to be able to differentiate between offset 0 and undefined
SetLocalInt(oBinder, "MYSTLISTChoiceOffset", GetLocalInt(oBinder, DYNCONV_CHOICEOFFSET) + 1);
nStage = STAGE_CONFIRM_SELECTION;
MarkStageNotSetUp(STAGE_SELECT_EVOCATION, oBinder);
}
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if (nChoice)
{
SetLocalInt(oBinder, "ExploitVestigeSpell", GetLocalInt(oBinder, "nEvo"));
// And we're all done
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_SELECT_EVOCATION;
MarkStageNotSetUp(STAGE_SELECT_EVOCATION, oBinder);
}
}
if(DEBUG) DoDebug("bnd_exploitcnv: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oBinder);
}
}

View File

@@ -0,0 +1,8 @@
#include "inc_dynconv"
void main()
{
object oBinder = OBJECT_SELF;
AssignCommand(oBinder, ClearAllActions(TRUE));
StartDynamicConversation("bnd_expelcnv", oBinder, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, FALSE, TRUE, oBinder);
}

View File

@@ -0,0 +1,28 @@
/*
07/03/21 by Barmlot
Knight of the Sacred Seal Aligned strike
Aligned Strike (+3 to all weapons to overcome DR)
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_fork"
void main()
{
object oBinder = OBJECT_SELF;
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
//Aligned Strike (all weapons treated as +3 to overcome DR)
int nBonus = 3;
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oBinder);
if (GetIsWeapon(oItem))
{
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
}

View File

@@ -0,0 +1,27 @@
/*
07/03/21 by Barmlot
bnd_kss_pow.nss
Knight of the Sacred Vestige's Power
Vestige's Power (+2 STR, CON, +10 speed, +4 will saves for 1 round, 5 round cooldown)
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(GetIsPatronVestigeBound(oBinder))
{
if(!BindAbilCooldown(oBinder, GetSpellId(), -1)) return;
if(!TakeSwiftAction(oBinder)) return;
effect eLink = EffectAbilityIncrease(ABILITY_STRENGTH,2); //+2 STRENGTH
eLink = EffectLinkEffects(EffectAbilityIncrease(ABILITY_CONSTITUTION,2), eLink); //+2 CONSTITUTION
eLink = EffectLinkEffects(EffectMovementSpeedIncrease(33), eLink); // +10' land speed (assumes 30 base)
eLink = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_WILL, 4), eLink); // +4 Will saves
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, RoundsToSeconds(1));
}
}

View File

@@ -0,0 +1,51 @@
/*
07/03/21 by Barmlot
bnd_kss_prot.nss
Knight of the Sacred Vestige's Protection & Aura
Vestige's Protection (CHA to AC for 1 round, 5 round cooldown)
Vestige's Protection Aura (as above, but affects all adjacent friends)
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_combat"
void main()
{
object oBinder = OBJECT_SELF;
int nKSSLvl = GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder);
int nCHAmod = max(1, GetAbilityModifier(ABILITY_CHARISMA, oBinder));
int nSpellID = PRCGetSpellId();
if(GetIsPatronVestigeBound(oBinder))
{
if(!BindAbilCooldown(oBinder, GetSpellId(), -1)) return;
if(!TakeSwiftAction(oBinder)) return;
if (nKSSLvl >= 3)//Vestige Protection Aura
{
location lTarget = GetLocation(oBinder);
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(oAreaTarget != oBinder && // Not you
GetIsInMeleeRange(oBinder, oAreaTarget) && // They must be in melee range
GetIsFriend(oAreaTarget, oBinder)) // Only allies
{
//Apply bonuses to oAreaTarget
effect eLink = EffectACIncrease(nCHAmod, AC_DODGE_BONUS);
eLink = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nCHAmod), eLink);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oAreaTarget, RoundsToSeconds(1));
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
effect eLink = EffectACIncrease(nCHAmod, AC_DODGE_BONUS);
eLink = EffectLinkEffects(EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nCHAmod), eLink);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, RoundsToSeconds(1));
}
}

View File

@@ -0,0 +1,17 @@
/*
07/03/21 by Barmlot
bnd_kss_surge.nss
Knight of the Sacred Vestige's Surge
Vestige's Surge (Reset cooldown on patron vestige's abilities or KSS class features, 5 round cooldown)
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(GetIsPatronVestigeBound(oBinder))
SetLocalInt(oBinder, "KotSSSurge", TRUE);
}

View File

@@ -0,0 +1,16 @@
#include "prc_class_const"
#include "inc_item_props"
void main()
{
object oBinder = OBJECT_SELF;
object oSkin = GetPCSkin(oBinder);
if (GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder) >= 2)
{
SetCompositeBonus(oSkin, "TenebrousDodge", 1, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "TenebrousIntim", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE);
SetCompositeBonus(oSkin, "TenebrousBalnc", 1, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectAreaOfEffect(136, "bnd_tnb_visage", "", "")), oBinder, HoursToSeconds(24));
}
}

View File

@@ -0,0 +1,43 @@
/*
05/03/21 by Stratovarius
Visage of the Dead: Mindless undead believe you to be one of them and do not attack you except
in self-defense, or when ordered to do so by their creator.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = OBJECT_SELF;
//FloatingTextStringOnCreature(GetName(oBinder)+" created this AoE", GetFirstPC());
object oTarget = GetLocalObject(oBinder, "TenebrousCharm");
//FloatingTextStringOnCreature(GetName(oTarget)+" is the target", GetFirstPC());
object oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget);
int nRemove = FALSE;
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
if (GetItemPropertyType(ip) == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS && GetItemPropertySubType(ip) == IP_CONST_IMMUNITYMISC_MINDSPELLS)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
if (GetItemPropertyType(ip) == ITEM_PROPERTY_MIND_BLANK)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
ip = GetNextItemProperty(oItem);
}
AssignCommand(oTarget, ClearAllActions(TRUE));
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, HoursToSeconds(24)));
if (nRemove) DelayCommand(1.0, AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oItem));
}

View File

@@ -0,0 +1,88 @@
/*
Tenebrous Apostate - Destroy/Empower Undead
At 3rd level, you gain additional power over mindless undead. You can use two turn or rebuke attempts as a
single standard action, each dealing (or healing) damage as per the Tenebrous<75>s rebuke ability, except that
the damage applies only to mindless undead. Neutral characters use the turn effect, evil characters the rebuke.
Strat 05/03/21
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_turning"
void DestroyEmpower(object oBinder)
{
int nTurnLevel = GetTurningClassLevel(oBinder, SPELL_TURN_UNDEAD);
location lTarget = GetLocation(oBinder);
float fRange = FeetToMeters(30.0);
int nDC = 10 + nTurnLevel + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
if (GetAlignmentGoodEvil(oBinder) == ALIGNMENT_EVIL)
{
//ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HORRID_WILTING), lTarget);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_VAMPIRIC_DRAIN_PRC), lTarget);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD && 10 >= GetAbilityScore(oTarget, ABILITY_INTELLIGENCE, TRUE) && !GetIsPC(oTarget))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_NEGBLAST_ENERGY), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(d6(nTurnLevel*2)), oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}
else
{
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_VAMPIRIC_DRAIN_PRC), lTarget);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD && 10 >= GetAbilityScore(oTarget, ABILITY_INTELLIGENCE, TRUE) && !GetIsPC(oTarget))
{
int nDamage = d6(nTurnLevel*2);
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
nDamage /= 2;
if (GetHasMettle(oTarget, SAVING_THROW_WILL)) // Ignores partial effects
{
nDamage = 0;
}
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_REGENERATE_IMPACT), oTarget);
if (nDamage) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_DIVINE), oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}
}
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
//make sure there's TU uses left
if (!GetHasFeat(FEAT_TURN_UNDEAD, oBinder))
{
FloatingTextStringOnCreature("You are out of Turn Undead uses for the day.", oBinder, FALSE);
return;
}
DecrementRemainingFeatUses(oBinder, FEAT_TURN_UNDEAD); // Burn one
// Burn the tenebrous turn undead
if (BindAbilCooldown(oBinder, VESTIGE_TENEBROUS_TURN, VESTIGE_TENEBROUS))
DestroyEmpower(oBinder);
else if (GetHasFeat(FEAT_TURN_UNDEAD, oBinder))
{
DestroyEmpower(oBinder);
DecrementRemainingFeatUses(oBinder, FEAT_TURN_UNDEAD); // Burn two
}
else
{
FloatingTextStringOnCreature("You do not have enough Turn Undead uses.", oBinder, FALSE);
IncrementRemainingFeatUses(oBinder, FEAT_TURN_UNDEAD);
return;
}
}

View File

@@ -0,0 +1,64 @@
/*
Tenebrous Apostate - Tenebrous's Rebuke
When you use the turn or rebuke undead ability granted by Tenebrous, your connection to your dark master allows you to channel the
energy in a unique way. You can use a turn attempt to deal 1d6 points of damage per effective turning level you possess to every
undead creature within 30 feet. Each affected undead can attempt a Will save (DC 10 + your effective turning level + your Cha
modifier) for half damage. If you use a rebuke attempt, each undead within 30 feet is instead cured of 1d6 points of damage per
effective turning level. This effect occurs instead of the normal result. Neutral characters use the turn effect, evil characters the rebuke.
Strat 05/03/21
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_turning"
void main()
{
object oBinder = OBJECT_SELF;
int nTurnLevel = GetTurningClassLevel(oBinder, SPELL_TURN_UNDEAD);
location lTarget = GetLocation(oBinder);
float fRange = FeetToMeters(30.0);
int nDC = 10 + nTurnLevel + GetAbilityModifier(ABILITY_CHARISMA, oBinder);
if(!BindAbilCooldown(OBJECT_SELF, VESTIGE_TENEBROUS_TURN, VESTIGE_TENEBROUS)) return;
else if (GetAlignmentGoodEvil(oBinder) == ALIGNMENT_EVIL)
{
//ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HORRID_WILTING), lTarget);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_VAMPIRIC_DRAIN_PRC), lTarget);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_NEGBLAST_ENERGY), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(d6(nTurnLevel)), oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}
else
{
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_VAMPIRIC_DRAIN_PRC), lTarget);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
int nDamage = d6(nTurnLevel);
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
nDamage /= 2;
if (GetHasMettle(oTarget, SAVING_THROW_WILL)) // Ignores partial effects
{
nDamage = 0;
}
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_REGENERATE_IMPACT), oTarget);
if (nDamage) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_DIVINE), oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}
}

View File

@@ -0,0 +1,34 @@
/*
Tenebrous Apostate - Blast of the Void
When you attain 5th level, you can use a turn or rebuke attempt to deal 1d8 points of damage per effective
turning level to every living creature within a 30-foot cone. This ability is usable once per day.
Strat 05/03/21
*/
#include "bnd_inc_bndfunc"
void TenebrousUmbralLock(object oBinder, int nSpell);
void TenebrousUmbralLock(object oBinder, int nSpell)
{
if (!GetHasSpellEffect(nSpell, oBinder))
{
DeleteLocalInt(oBinder, "Bind"+IntToString(nSpell));
BindAbilCooldown(oBinder, nSpell, -1);
}
else
DelayCommand(1.0, TenebrousUmbralLock(oBinder, nSpell));
}
void main()
{
object oBinder = OBJECT_SELF;
float fDur = RoundsToSeconds(GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder)*2);
int nSpell = GetSpellId();
SetLocalInt(oBinder, "Bind"+IntToString(nSpell), TRUE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectVisualEffect(PSI_DUR_SHADOW_BODY)), oBinder, fDur);
SetIncorporeal(oBinder, fDur, 1);
TenebrousUmbralLock(oBinder, nSpell);
}

View File

@@ -0,0 +1,25 @@
/*
05/03/21 by Stratovarius
Visage of the Dead: Mindless undead believe you to be one of them and do not attack you except
in self-defense, or when ordered to do so by their creator.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = GetLocalObject(GetModule(), "TenebrousCharm");
//FloatingTextStringOnCreature(GetName(oBinder)+" created this AoE", GetFirstPC());
//Capture the first target object in the shape.
object oTarget = GetEnteringObject();
if (!GetIsFriend(oTarget, oBinder) && oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD && 10 >= GetAbilityScore(oTarget, ABILITY_INTELLIGENCE, TRUE) && !GetIsObjectValid(GetMaster(oTarget)))
{
SetLocalObject(oBinder, "TenebrousCharm", oTarget);
ExecuteScript("bnd_tnb_charm", oBinder);
}
}

View File

@@ -0,0 +1,53 @@
/*
Tenebrous Apostate - Blast of the Void
When you attain 5th level, you can use a turn or rebuke attempt to deal 1d8 points of damage per effective
turning level to every living creature within a 30-foot cone. This ability is usable once per day.
Strat 05/03/21
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_turning"
void BlastVoid(object oBinder)
{
int nTurnLevel = GetTurningClassLevel(oBinder, SPELL_TURN_UNDEAD);
location lTarget = PRCGetSpellTargetLocation();
float fRange = FeetToMeters(30.0);
vector vOrigin = GetPosition(oBinder);
vector vTarget = GetPositionFromLocation(lTarget);
float fAngle = acos((vTarget.x - vOrigin.x) / GetDistanceBetweenLocations(GetLocation(oBinder), lTarget));
DrawLinesInACone(nTurnLevel, fRange, GetLocation(oBinder), fAngle, DURATION_TYPE_INSTANT, VFX_IMP_NEGBLAST_ENERGY, 0.0f, 20, 1.5f);
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && PRCGetIsAliveCreature(oTarget))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_NEGBLAST_ENERGY), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d8(nTurnLevel), DAMAGE_TYPE_DIVINE), oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}
void main()
{
object oBinder = OBJECT_SELF;
if(BindAbilCooldown(oBinder, VESTIGE_TENEBROUS_TURN, VESTIGE_TENEBROUS))
BlastVoid(oBinder);
else if(GetHasFeat(FEAT_TURN_UNDEAD, oBinder))
{
DecrementRemainingFeatUses(oBinder, FEAT_TURN_UNDEAD);
BlastVoid(oBinder);
}
else
{
SpeakStringByStrRef(40550);
IncrementRemainingFeatUses(oBinder, FEAT_TENEBROUS_BLAST_VOID);
}
}

View File

@@ -0,0 +1,47 @@
/*
25/03/21 by Stratovarius
Abysm, the Schismed
Abysm, the Schismed, is a living vestige of a psionic mythal. As a vestige, Abysm gives its host access to several psionic effects.
Vestige Level: 8th
Binding DC: 34
Special Requirement: No
Influence: Your speech pattern becomes disconnected, as if many voices are trying to speak through you. Your mannerisms also change from moment to moment: masculine to feminine, regal to shy, and confident to passive. Abysm requires that the binder not use a psicrystal for the duration of the binding.
Granted Abilities:
While bound to Abysm, you gain powers that various city inhabitants had at some point in their lifetimes.
Psionic Boon: You gain 21 power points when you bind to Abysm. These are added to your pool of power if you already possess psionic power, or they create a pool and you become a psionic creature for the duration of this binding.
Overpower: You gain access to the psionic powers animal affinity, energy missile, clairvoyant sense, and astral construct for the duration of the binding. You may manifest each power as a psion.
*/
#include "bnd_inc_bndfunc"
#include "psi_inc_psifunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(PSI_DUR_TIMELESS_BODY), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ABYSM_PSIONIC_BOON))
{
GainPowerPoints(oBinder, 21, TRUE);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_PSIONIC_FOCUS), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ABYSM_OVERPOWER ))
{
// Psion animal affinity, energy missile, clairvoyant sense, and astral construct
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12098), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12119), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12105), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12051), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
SetLocalInt(oBinder, "AbysmPsion", GetBinderLevel(oBinder, VESTIGE_ABYSM));
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,60 @@
/*
08/03/21 by Stratovarius
Acererak, the Devourer
Acererak, a half-human lich, grasped at godlike power only to lose his grip on reality. As a vestige, he grants abilities that are similar to a lich<63>s powers.
Vestige Level: 5th
Binding DC: 25
Special Requirement: None
Influence: As a vestige, Acererak possesses the immortality he desired but none of the power that should accompany it. If you fall under his influence,
you evince a strong hunger for influence and primacy. If you are presented with an opportunity to fill a void in power over a group of creatures, Acererak
requires that you attempt to seize that power. You might impersonate a missing city offi cial, take command of a leaderless unit of soldiers, or even grab the reins of runaway horses to establish your supremacy.
Granted Abilities:
While bound to Acererak, you gain powers that the great lich held in his legendary unlife.
Paralyzing Touch: As a standard action, you can make a touch attack to paralyze a living foe. The touched creature must succeed on a Fortitude save or be
paralyzed for a number of rounds equal to one-half your effective binder level. Each round on its turn, the paralyzed creature can attempt a new saving
throw as a full-round action, with success ending the effect immediately. Once you have used this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_sp_tch"
void RecurringSave(object oTarget, int nSpell, int nDC, object oBinder);
void RecurringSave(object oTarget, int nSpell, int nDC, object oBinder)
{
if (GetHasSpellEffect(nSpell, oTarget))
{
if (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
PRCRemoveSpellEffects(nSpell, oBinder, oTarget);
GZPRCRemoveSpellEffects(nSpell, oTarget, FALSE);
}
DelayCommand(6.0, RecurringSave(oTarget, nSpell, nDC, oBinder));
}
}
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ACERERAK)) return;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ACERERAK);
int nDC = GetBinderDC(oBinder, VESTIGE_ACERERAK);
if (PRCGetIsAliveCreature(oTarget))
{
if (PRCDoMeleeTouchAttack(oTarget) && !PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
effect eHold = EffectLinkEffects(EffectParalyze(), EffectVisualEffect(VFX_DUR_STONEHOLD));
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eHold), oTarget, RoundsToSeconds(nBinderLevel/2));
DelayCommand(6.0, RecurringSave(oTarget, GetSpellId(), nDC, oBinder));
}
}
}

View File

@@ -0,0 +1,51 @@
/*
08/03/21 by Stratovarius
Acererak, the Devourer
Acererak, a half-human lich, grasped at godlike power only to lose his grip on reality. As a vestige, he grants abilities that are similar to a lich<63>s powers.
Vestige Level: 5th
Binding DC: 25
Special Requirement: None
Influence: As a vestige, Acererak possesses the immortality he desired but none of the power that should accompany it. If you fall under his influence,
you evince a strong hunger for influence and primacy. If you are presented with an opportunity to fill a void in power over a group of creatures, Acererak
requires that you attempt to seize that power. You might impersonate a missing city offi cial, take command of a leaderless unit of soldiers, or even grab the reins of runaway horses to establish your supremacy.
Granted Abilities:
While bound to Acererak, you gain powers that the great lich held in his legendary unlife.
Detect Undead: You can use detect undead as the spell at will (caster level equals your effective binder level).
Hide from Undead: At will as a standard action, you can cast hide from undead.
Lich<EFBFBD>s Energy Immunities: You gain immunity to cold and electricity damage.
Paralyzing Touch: As a standard action, you can make a touch attack to paralyze a living foe. The touched creature must succeed on a Fortitude save or be
paralyzed for a number of rounds equal to one-half your effective binder level. Each round on its turn, the paralyzed creature can attempt a new saving
throw as a full-round action, with success ending the effect immediately. Once you have used this ability, you cannot do so again for 5 rounds.
Undead Healing: Negative energy (such as that of an inflict spell) heals you rather than damaging you. If you are a living creature, positive energy (such as a cure spell) still heals you as well.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SYMB_DEATH), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ACERERAK_DETECT )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ACERERAK_DETECT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ACERERAK_HIDE )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ACERERAK_HIDE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ACERERAK_LICH ))
{
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ACERERAK_TOUCH )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ACERERAK_TOUCH ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ACERERAK_HEALING)) SetLocalInt(oBinder, "AcererakHealing", TRUE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,34 @@
/**
* @file
* Spellscript for Acererak Vestige
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
int nCasterLevel = GetBinderLevel(oBinder, VESTIGE_ACERERAK);
int nDC = GetBinderDC(oBinder, VESTIGE_ACERERAK);
int nSpell, nUses;
int nSLA = GetSpellId();
effect eNone;
int nInstant = FALSE;
switch(nSLA){
case 19113:
{
nSpell = SPELL_DETECT_UNDEAD;
break;
}
case 19114:
{
nSpell = SPELL_HIDE_FROM_UNDEAD;
break;
}
}
DoRacialSLA(nSpell, nCasterLevel, nDC, nInstant);
}

View File

@@ -0,0 +1,56 @@
/*
03/03/21 by Stratovarius
Agares, Truth Betrayed
Agares died at the hands of his allies for a wrong he did not commit. As a vestige, not only does he give binders the ability to weaken foes and knock them prone, but he also makes his summoner fearless.
Vestige Level: 4th
Binding DC: 22
Special Requirement: You must draw Agares<65>s seal upon either the earth or an expanse of unworked stone.
Influence: Agares<65>s loyalty in life and his anger at the betrayal perpetrated by his lieutenants has become a hatred of falsehood. When influenced
by Agares, you speak forthrightly and with confidence. You cannot use the Bluff skill, and when asked a direct question, you must answer truthfully and directly.
Granted Abilities:
Agares gives you the power to exalt yourself and your allies, to make the earth tremble beneath your feet, and to render foes weak.
Elemental Companion: You can summon an earth elemental to accompany you and fight for you. If you lose your elemental, you cannot summon it again for 1 hour.
The size of the earth elemental you can summon depends on your effective binder level. Below 11th, small. Below 15th, medium. Below 19th, large. 19th and above, huge.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if (GetLocalInt(oBinder, "AgaresDelay")) return;
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_AGARES);
string sSummon = "bnd_agares_small";
if (nBinderLevel >= 19) sSummon = "bnd_agares_huge";
else if (nBinderLevel >= 15) sSummon = "bnd_agares_large";
else if (nBinderLevel >= 11) sSummon = "bnd_agares_med";
int i = 1;
int nCheck;
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oBinder, i);
while(GetIsObjectValid(oSummon))
{
if (GetResRef(oSummon) == "bnd_agares_small" ||
GetResRef(oSummon) == "bnd_agares_med" ||
GetResRef(oSummon) == "bnd_agares_large" ||
GetResRef(oSummon) == "bnd_agares_huge")
return;
i++;
oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oBinder, i);
}
//Apply the VFX impact and summon effect
MultisummonPreSummon();
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectSummonCreature(sSummon, VFX_FNF_SUMMON_MONSTER_3), PRCGetSpellTargetLocation(), HoursToSeconds(24));
SetLocalInt(oBinder, "AgaresSummoned", TRUE);
}

View File

@@ -0,0 +1,29 @@
/*
03/03/21 by Stratovarius
Agares, Truth Betrayed
Agares died at the hands of his allies for a wrong he did not commit. As a vestige, not only does he give binders the ability to weaken foes and knock them prone, but he also makes his summoner fearless.
Vestige Level: 4th
Binding DC: 22
Special Requirement: You must draw Agares<65>s seal upon either the earth or an expanse of unworked stone.
Influence: Agares<65>s loyalty in life and his anger at the betrayal perpetrated by his lieutenants has become a hatred of falsehood. When influenced
by Agares, you speak forthrightly and with confidence. You cannot use the Bluff skill, and when asked a direct question, you must answer truthfully and directly.
Granted Abilities:
Agares gives you the power to exalt yourself and your allies, to make the earth tremble beneath your feet, and to render foes weak.
Elemental Companion: You can summon an earth elemental to accompany you and fight for you. If you lose your elemental, you cannot summon it again for 1 hour.
The size of the earth elemental you can summon depends on your effective binder level. Below 11th, small. Below 15th, medium. Below 19th, large. 19th and above, huge.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
DelayCommand(HoursToSeconds(1), DeleteLocalInt(oBinder, "AgaresDelay"));
DelayCommand(HoursToSeconds(1), FloatingTextStringOnCreature("You can now resummon your elemental companion!", oBinder, FALSE));
}

View File

@@ -0,0 +1,54 @@
/*
03/03/21 by Stratovarius
Agares, Truth Betrayed
Agares died at the hands of his allies for a wrong he did not commit. As a vestige, not only does he give binders the ability to weaken foes and knock them prone, but he also makes his summoner fearless.
Vestige Level: 4th
Binding DC: 22
Special Requirement: You must draw Agares<65>s seal upon either the earth or an expanse of unworked stone.
Influence: Agares<65>s loyalty in life and his anger at the betrayal perpetrated by his lieutenants has become a hatred of falsehood. When influenced
by Agares, you speak forthrightly and with confidence. You cannot use the Bluff skill, and when asked a direct question, you must answer truthfully and directly.
Granted Abilities:
Agares gives you the power to exalt yourself and your allies, to make the earth tremble beneath your feet, and to render foes weak.
Earth and Air Mastery: You gain a +1 bonus on attack rolls and weapon damage rolls.
Earthshaking Step: As a standard action, you can stomp on the ground, causing every creature within 10 feet of you to make a Reflex save or fall prone.
Once you have used this ability, you cannot do so again for 5 rounds. You and your summoned earth elemental (see below) are never knocked prone by the use of this ability.
Elemental Companion: You can summon an earth elemental to accompany you and fight for you. If you lose your elemental, you cannot summon it again for 1 hour.
The size of the earth elemental you can summon depends on your effective binder level. Below 11th, small. Below 15th, medium. Below 19th, large. 19th and above, huge.
Fear Immunity: You have immunity to fear.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_AOE_ZONE_OF_TRUTH), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_AGARES_FEAR)) eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_FEAR));
if (!GetIsVestigeExploited(oBinder, VESTIGE_AGARES_EARTH_MASTERY))
{
eLink = EffectLinkEffects(eLink, EffectAttackIncrease(1));
eLink = EffectLinkEffects(eLink, EffectDamageIncrease(DAMAGE_BONUS_1, DAMAGE_TYPE_MAGICAL));
}
// Can't lie or use bluff
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_AGARES)))
{
FloatingTextStringOnCreature("You have made a poor pact, and Agares enjoins you from being untruthful!", oBinder, FALSE);
eLink = EffectLinkEffects(eLink, EffectSkillDecrease(SKILL_BLUFF, 50));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_AGARES_EARTHSHAKING)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_AGARES_STEP), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_AGARES_COMPANION)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_AGARES_ELEMENTAL), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,56 @@
/*
03/03/21 by Stratovarius
Agares, Truth Betrayed
Agares died at the hands of his allies for a wrong he did not commit. As a vestige, not only does he give binders the ability to weaken foes and knock them prone, but he also makes his summoner fearless.
Vestige Level: 4th
Binding DC: 22
Special Requirement: You must draw Agares<65>s seal upon either the earth or an expanse of unworked stone.
Influence: Agares<65>s loyalty in life and his anger at the betrayal perpetrated by his lieutenants has become a hatred of falsehood. When influenced
by Agares, you speak forthrightly and with confidence. You cannot use the Bluff skill, and when asked a direct question, you must answer truthfully and directly.
Granted Abilities:
Agares gives you the power to exalt yourself and your allies, to make the earth tremble beneath your feet, and to render foes weak.
Earthshaking Step: As a standard action, you can stomp on the ground, causing every creature within 10 feet of you to make a Reflex save or fall prone.
Once you have used this ability, you cannot do so again for 5 rounds. You and your summoned earth elemental (see below) are never knocked prone by the use of this ability.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_AGARES)) return;
int nDC = GetBinderDC(oBinder, VESTIGE_AGARES);
effect eLink = EffectLinkEffects(EffectKnockdown(), EffectVisualEffect(VFX_IMP_SONIC));
float fRange = FeetToMeters(10.0f);
float fDelay;
object oTarget;
location lTarget = PRCGetSpellTargetLocation();
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && // Avoid the cone targeting bug
GetMaster(oTarget) != oBinder && // No hitting your summons
GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) != TRUE && // Incorporeal creatures are not affected
!GetIsImmune(oTarget, IMMUNITY_TYPE_KNOCKDOWN) // And the creature is not just generally immune to knockdown
)
{
// Save - Reflex negates
if(!PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
// Apply effects
fDelay = GetDistanceBetween(oBinder, oTarget) / 20.0f;
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0));
}// end if - Save
}// end if - Targeting check
// Get next target
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}// end while - Target loop
}

View File

@@ -0,0 +1,60 @@
/*
03/02/21 by Stratovarius
Amon, the Void Before the Altar
Special Requirement: Amon particularly despises four
other vestiges: Chupoclops, Eurynome, Karsus, and Leraje. If
you have hosted one of these spirits within the last 24 hours,
Amon refuses to answer your call. Similarly, these spirits will
not answer your call if you are already bound to Amon.
Granted Abilities: Amon grants you his sight and his
breath, as well as the deadly use of his horns.
Darkvision: You gain darkvision out to 60 feet.
Fire Breath: You can vomit forth a line of fi re as a standard
action. The line extends 10 feet per effective binder level
(maximum 50 feet) and deals 1d6 points of fi re damage per
binder level to every creature in its area. A successful Refl ex
save halves this damage. Once you have used this ability, you
cannot do so again for 5 rounds.
Ram Attack: You can use the ram<61>s horns that you gain
from Amon<6F>s sign as a natural weapon that deals 1d6 points
of damage (plus 1-1/2 times your Strength bonus). When
you charge a foe with your ram attack, you deal an extra 1d8
points of damage on a successful hit. You cannot use this
ability if you do not show Amon<6F>s sign.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_natweap"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CROWN_OF_GLORY), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_AMON_DARKVISION)) eLink = EffectLinkEffects(eLink, EffectUltravision());
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_AMON_RAMATTACK))
{
SetLocalInt(oBinder, "AmonRam", TRUE);
string sResRef = "prc_mino_gore_";
int nSize = PRCGetCreatureSize(oBinder);
sResRef += GetAffixForSize(nSize);
AddNaturalPrimaryWeapon(oBinder, sResRef);
DelayCommand(1.0, IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oBinder), ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_PIERCING, GetAbilityModifier(ABILITY_STRENGTH, oBinder)/2), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE));
}
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_AMON_FIREBREATH)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_AMON_BREATH), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}

View File

@@ -0,0 +1,66 @@
/*
03/02/21 by Stratovarius
Amon, the Void Before the Altar
Fire Breath: You can vomit forth a line of fire as a standard
action. The line extends 10 feet per effective binder level
(maximum 50 feet) and deals 1d6 points of fire damage per
binder level to every creature in its area. A successful Reflex
save halves this damage. Once you have used this ability, you
cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_AMON)) return;
//Set the lightning stream to start at the caster's hands
effect eLightning = EffectBeam(VFX_BEAM_FIRE, oBinder, BODY_NODE_CHEST);
effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S);
effect eDamage;
location lTarget = PRCGetSpellTargetLocation();
int nBinderLvl = GetBinderLevel(oBinder, VESTIGE_AMON);
int nDC = GetBinderDC(oBinder, VESTIGE_AMON);
float fDelay;
float fDist = 10.0 + (10.0 * nBinderLvl);
if (fDist > 50.0) fDist = 50.0;
int nDamage;
//Get first target in the area
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, FeetToMeters(fDist), lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, GetPosition(oBinder));
while (GetIsObjectValid(oTarget))
{
//Exclude the caster from the damage effects
if (oTarget != oBinder)
{
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oBinder))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(oBinder, SPELL_LIGHTNING_BOLT));
//Roll damage
nDamage = d6(nBinderLvl);
//Adjust damage based on Reflex Save, Evasion and Improved Evasion
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_FIRE);
if(nDamage > 0)
{
eDamage = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_FIRE);
fDelay = PRCGetSpellEffectDelay(GetLocation(oTarget), oTarget);
//Apply VFX impcat, damage effect and lightning effect
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
}
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLightning, oTarget, 1.0, FALSE);
}
}
//Get the next object in the lightning cylinder
oTarget = MyNextObjectInShape(SHAPE_SPELLCYLINDER, FeetToMeters(fDist), lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, GetPosition(oBinder));
}
}

View File

@@ -0,0 +1,54 @@
/*
03/03/21 by Stratovarius
Andras, the Gray Knight
A great warrior in life, Andras is an enigma as a vestige. He gives binders prowess in combat and skill in the saddle.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No.
Influence: Andras<61>s influence causes you to become listless and emotionally remote. Because Andras wearies of combat quickly, you become exhausted after only 10 rounds of battle, and flee from the fight for 1d4 rounds.
Granted Abilities:
Andras lends you some of the skills he had in life, making you a strong combatant with or without a mount.
Sow Discord: Andras grants you the ability to sow discord among your enemies. As a standard action, you can force an enemy to attack a randomly determined ally within reach on his next action.
Sow discord is a mind-affecting compulsion ability. Once you have used this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ANDRAS)) return;
object oTarget = PRCGetSpellTargetObject();
int nDC = GetBinderDC(oBinder, VESTIGE_ANDRAS);
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(oBinder, PRCGetSpellId()));
if (!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) && !PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
{
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SOUND_SYMBOL_PAIN), oTarget);
location lTarget = GetLocation(oTarget);
int bBreak = FALSE;
// Use the function to get the closest creature as a target
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget) && !bBreak)
{
if(oAreaTarget != oTarget && oAreaTarget != oBinder && GetIsFriend(oTarget, oAreaTarget))
{
//effect eNone;
AssignCommand(oTarget, ClearAllActions());
AssignCommand(oTarget, ActionAttack(oAreaTarget));
DelayCommand(4.5, AssignCommand(oTarget, ClearAllActions()));
bBreak = TRUE;
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
}

View File

@@ -0,0 +1,46 @@
/*
03/03/21 by Stratovarius
Andras, the Gray Knight
A great warrior in life, Andras is an enigma as a vestige. He gives binders prowess in combat and skill in the saddle.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No.
Influence: Andras<61>s influence causes you to become listless and emotionally remote. Because Andras wearies of combat quickly, you become exhausted after only 10 rounds of battle, and flee from the fight for 1d4 rounds.
Granted Abilities:
Andras lends you some of the skills he had in life, making you a strong combatant with or without a mount.
Mount: As a full-round action, you can summon a heavy warhorse. You can use this ability once per day.
*/
#include "bnd_inc_bndfunc"
#include "x3_inc_horse"
void main()
{
object oBinder = OBJECT_SELF;
if (GetLocalInt(oBinder, "AndrasMount"))
return;
object oMount = HorseGetPaladinMount(oBinder);
if (!GetIsObjectValid(oMount)) oMount = GetLocalObject(oBinder, "oX3PaladinMount");
// No duplicate mounts for sanity reasons
if (GetIsObjectValid(oMount))
{
if (GetIsPC(oBinder))
{
if (oMount == oBinder)
FloatingTextStrRefOnCreature(111987, oBinder, FALSE);
else
FloatingTextStrRefOnCreature(111988, oBinder, FALSE);
}
return;
}
HorseSummonPhantomSteed(1, 24);
SetLocalInt(oBinder, "AndrasMount", TRUE);
}

View File

@@ -0,0 +1,94 @@
/*
03/03/21 by Stratovarius
Andras, the Gray Knight
A great warrior in life, Andras is an enigma as a vestige. He gives binders prowess in combat and skill in the saddle.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No.
Influence: Andras<61>s influence causes you to become listless and emotionally remote. Because Andras wearies of combat quickly, you become exhausted after only 10 rounds of battle, and flee from the fight for 1d4 rounds.
Granted Abilities:
Andras lends you some of the skills he had in life, making you a strong combatant with or without a mount.
Weapon Proficiency: You are proficient with the greatsword, longsword, and rapier.
Mount: As a full-round action, you can summon a heavy warhorse. You can use this ability once per day.
Saddle Sure: You gain a +8 bonus on Ride checks.
Smite Good or Evil: You can attempt to smite an evil or good creature with a single melee attack. You add your Charisma bonus (if any) to the attack roll and deal 1 extra point of damage per effective binder level. Once you have used this ability, you cannot do so again for 5 rounds.
Sow Discord: Andras grants you the ability to sow discord among your enemies. As a standard action, you can force an enemy to attack a randomly determined ally within reach on his next action. Sow discord is a mind-affecting compulsion ability. Once you have used this ability, you cannot do so again for 5 rounds.
Sure Blows: You gain the benefit of the Improved Critical feat with any weapon you wield.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SHIELD_OF_LAW), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_SADDLE_SURE)) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_RIDE, 8));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_WEAPON_PROF))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_LONGSWORD), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_GREATSWORD), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_RAPIER), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_SURE_BLOWS))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_DAGGER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_DART ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_HEAVY_CROSSBOW ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LIGHT_CROSSBOW ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LIGHT_MACE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_MORNING_STAR ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_STAFF ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SPEAR ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SICKLE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SLING ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LONGBOW ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SHORTBOW ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SHORT_SWORD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_RAPIER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SCIMITAR ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LONG_SWORD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_GREAT_SWORD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_HAND_AXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_THROWING_AXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_BATTLE_AXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_GREAT_AXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_HALBERD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LIGHT_HAMMER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_LIGHT_FLAIL ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_WAR_HAMMER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_HEAVY_FLAIL ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_KAMA ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_KUKRI ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SHURIKEN ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_SCYTHE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_KATANA ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_BASTARD_SWORD ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_DIRE_MACE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_DOUBLE_AXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_TWO_BLADED_SWORD), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_CLUB ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_DWAXE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_WHIP ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_CRITICAL_MINDBLADE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_ANDRAS))) FloatingTextStringOnCreature("You have made a poor pact, and Andras tires of combat easily!", oBinder, FALSE);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_SMITE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRAS_SMITE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_DISCORD)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRAS_DISCORD), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDRAS_MOUNT)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRAS_MOUNT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,66 @@
/*
02/03/21 by Stratovarius
Andromalius, the Repentant Rogue
Once the favorite of the god Olidammara, Andromalius now exists as a vestige. His granted abilities help his summoners beat rogues and ne<6E>er-do-wells at their own game.
Vestige Level: 3rd
Binding DC: 20
Special Requirement: No
Influence: When influenced by Andromalius, you become a devious mischief-maker who delights in causing small calamities<65>especially misunderstandings between
friends and incidents of mistaken identity. However, Andromalius cannot now abide acts of theft, so he forbids you to steal from a creature, take an item
from a dead body, or remove someone else<73>s possession from a location without permission so long as you are under the jurisdiction of an authority whose
laws expressly forbid such activities. By the same logic, you cannot take possession of any object that you know to be stolen.
Granted Abilities:
The abilities that Andromalius grants help you catch thieves and return stolen goods, discover wickedness and underhanded dealings, and punish wrongdoers.
Jester<EFBFBD>s Mirth: As a standard action, you can cause an opponent to break into uncontrollable laughter. This ability functions like a Tasha<68>s hideous
laughter spell (caster level equals your effective binder level).
Locate Item: At will, you can cast locate object.
See the Unseen: At will, you can use see invisibility as the spell (caster level equals your effective binder level).
Sense Trickery: You gain a +4 bonus on Sense Motive checks, on Appraise checks, and on Spot checks.
Sneak Attack: You deal an extra 2d6 points of damage when flanking an opponent or at any time when the target would be denied its Dexterity bonus.
For every five effective binder levels you possess beyond 5th, your sneak attack damage increases by an additional 1d6 points.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ANDROMALIUS);
effect eLink = EffectLinkEffects(EffectVisualEffect(PSI_DUR_SYNESTHETE), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDROMALIUS_SENSE))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_APPRAISE, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SPOT, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SENSE_MOTIVE, 4));
}
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDROMALIUS_SEE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRO_SEE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDROMALIUS_LOCATE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRO_LOCATE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDROMALIUS_JESTER)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ANDRO_MIRTH), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ANDROMALIUS_SNEAK))
{
SetLocalInt(oBinder, "AndroSneak", 2+((nBinderLevel-5)/5));
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oBinder));
}
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,14 @@
/**
* @file
* Hideous Laughter for Malphas
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
DoRacialSLA(SPELL_SEE_INVISIBILITY, GetBinderLevel(oBinder, VESTIGE_ANDROMALIUS), GetBinderDC(oBinder, VESTIGE_ANDROMALIUS));
}

View File

@@ -0,0 +1,15 @@
/**
* @file
* Hideous Laughter for Malphas
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ANDROMALIUS)) return;
DoRacialSLA(SPELL_TASHAS_HIDEOUS_LAUGHTER, GetBinderLevel(oBinder, VESTIGE_ANDROMALIUS), GetBinderDC(oBinder, VESTIGE_ANDROMALIUS));
}

View File

@@ -0,0 +1,14 @@
/**
* @file
* Hideous Laughter for Malphas
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
DoRacialSLA(SPELL_LOCATE_OBJECT, GetBinderLevel(oBinder, VESTIGE_ANDROMALIUS), GetBinderDC(oBinder, VESTIGE_ANDROMALIUS));
}

View File

@@ -0,0 +1,11 @@
#include "prc_inc_smite"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ANDRAS)) return;
object oTarget = PRCGetSpellTargetObject();
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD || GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL)
DoSmite(oBinder, oTarget, SMITE_TYPE_ANDRAS);
}

View File

@@ -0,0 +1,64 @@
/*
13/03/21 by Stratovarius
Arete, the First Elan
Arete, a powerful psion who sought immortality, created a new race but doomed himself to never-ending rebirths. His granted abilities provide binders with access to several qualities that toughen the body and mind.
Vestige Level: 4th
Binding DC: 21
Special Requirement: Arete does not like to be reminded that the elan are considered abominations by some, and he does not answer your summons if you are already bound to Chupoclops or Eurynome.
Influence: You do not get hungry or tired while bound to Arete, but you do suffer negative effects if you do not eat or sleep for the duration that the vestige is bound.
If faced with a need to do research, Arete insists that you seek out lore regarding him and his research into immortality as well, which can often double or even triple the time you spend seeking information.
Granted Abilities:
While bound to Arete, you gain powers that Arete had at some point in his search for immortality.
Psionic Boon: You gain 13 power points when you bind to Arete. These are added to your pool of power if you already possess psionic power, or they create a pool and you become
a psionic creature for the duration of this binding.
Resistance: Your gain a +4 bonus on a saving throw of your choice. You may change this to another saving throw as a move action.
Damage Reduction: Your body becomes unnaturally tough as you gain damage reduction 5/-.
Repletion: You gain access to the psionic powers body adjustment and body purification for the duration of the binding. You may manifest each power as a psion would and
as if it is a power known by you. You may augment each power as a psion normally could, substituting your effective binder level in place of manifester level.
*/
#include "bnd_inc_bndfunc"
#include "psi_inc_psifunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(PSI_DUR_TIMELESS_BODY), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ARETE_PSIONIC_BOON))
{
GainPowerPoints(oBinder, 13, TRUE);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_PSIONIC_FOCUS), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ARETE_RESISTANCE ))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ARETE_RESISTANCE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
SetLocalInt(oBinder, "AreteResist", SAVING_THROW_FORT);
DelayCommand(1.0, ActionCastSpellOnSelf(VESTIGE_ARETE_RESIST, METAMAGIC_NONE, oBinder));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ARETE_DR ))
{
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, 5));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 5));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_SLASHING, 5));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ARETE_REPLETION ))
{
// Psion Body Adjustment and Body Purification
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12134), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(12135), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
SetLocalInt(oBinder, "AretePsion", GetBinderLevel(oBinder, VESTIGE_ARETE));
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,54 @@
/*
13/03/21 by Stratovarius
Arete, the First Elan
Arete, a powerful psion who sought immortality, created a new race but doomed himself to never-ending rebirths. His granted abilities provide binders with access to several qualities that toughen the body and mind.
Vestige Level: 4th
Binding DC: 21
Special Requirement: Arete does not like to be reminded that the elan are considered abominations by some, and he does not answer your summons if you are already bound to Chupoclops or Eurynome.
Influence: You do not get hungry or tired while bound to Arete, but you do suffer negative effects if you do not eat or sleep for the duration that the vestige is bound. If faced with a need to do research, Arete insists that you seek out lore regarding him and his research into immortality as well, which can often double or even triple the time you spend seeking information.
Granted Abilities:
While bound to Arete, you gain powers that Arete had at some point in his search for immortality.
Resistance: Your gain a +4 bonus on a saving throw of your choice. You may change this to another saving throw as a move action.
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = OBJECT_SELF;
if(!TakeMoveAction(oBinder)) return;
int nSpell = GetSpellId();
PRCRemoveSpellEffects(nSpell, oBinder, oBinder);
GZPRCRemoveSpellEffects(nSpell, oBinder, FALSE);
// Never blank because it's set when the vestige is created
int nType = GetLocalInt(oBinder, "AreteResist");
if (nType == SAVING_THROW_WILL)
{
nType = SAVING_THROW_REFLEX;
FloatingTextStringOnCreature("Arete is now boosting Reflex saves", oBinder, FALSE);
}
else if (nType == SAVING_THROW_REFLEX)
{
nType = SAVING_THROW_FORT;
FloatingTextStringOnCreature("Arete is now boosting Fort saves", oBinder, FALSE);
}
else if (nType == SAVING_THROW_FORT)
{
nType = SAVING_THROW_WILL;
FloatingTextStringOnCreature("Arete is now boosting Will saves", oBinder, FALSE);
}
SetLocalInt(oBinder, "AreteResist", nType);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectSavingThrowIncrease(nType, 4)), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,52 @@
/*
24/03/21 by Stratovarius
Ashardalon, Pyre of the Unborn
A seeker of pure power and wealth, the fiendish red dragon Ashardalon was among the toughest creatures of his era. Having escaped death more than once, he grants binders some of his
powers as a dragon and fiend, as well as a portion of his great resilience.
Vestige Level: 8th
Binding DC: 35
Special Requirement: No
Influence: You greatly hunger for vengeance against those who harm or slight you. Ashardalon requires you to accept any opportunity to strike a foe who damages or insults you in preference over any other target.
Granted Abilities:
Ashardalon grants you some of the vast power he collected during his life as a dragon and a fiendish creature.
Ashardalon's Creed: You gain a bonus on Appraise checks and Search checks equal to your binder level. You can also locate objects near you, as the spell locate object at will.
Ashardalon's Presence: You can strike fear into the hearts of your foes. This acts as the fear spell. Once you have used this ability, you cannot use it again for 5 rounds.
Ashardalon's Vigor: Ashardalon grants you some of the vast resilience he enjoyed in life. When you bind this vestige, you gain temporary hit points equal to twice your binder level.
These temporary hit points last for up to 24 hours.
Fiend's Heart: You share some of the defensive benefits of the balor once bound to Ashardalon's body. This effect grants you damage reduction 10/+3 and resistance to fire 30.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ASHARDALON);
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PROTECTION_ENERGY_FIRE), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASHARDALON_CREED))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_APPRAISE, nBinderLevel));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SEARCH, nBinderLevel));
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ASHARDALON_LOCATE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASHARDALON_PRESENCE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ASHARDALON_PRESENCE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASHARDALON_VIGOR)) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectTemporaryHitpoints(nBinderLevel*2)), oBinder, HoursToSeconds(24));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASHARDALON_HEART))
{
eLink = EffectLinkEffects(eLink, EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_FIRE, 30));
}
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_PRISMATIC_SPHERE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DRAGONBLAST), oBinder);
}

View File

@@ -0,0 +1,15 @@
/**
* @file
* Fear for Ashardalon
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ASHARDALON)) return;
DoRacialSLA(SPELL_FEAR, GetBinderLevel(oBinder, VESTIGE_ASHARDALON), GetBinderDC(oBinder, VESTIGE_ASHARDALON));
}

View File

@@ -0,0 +1,14 @@
/**
* @file
* Locate Object for Ashardalon
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
DoRacialSLA(SPELL_LOCATE_OBJECT, GetBinderLevel(oBinder, VESTIGE_ASHARDALON), GetBinderDC(oBinder, VESTIGE_ASHARDALON));
}

View File

@@ -0,0 +1,53 @@
/*
13/03/21 by Stratovarius
Astaroth, Unjustly Fallen
A fallen angel who would never accept responsibility for his own transgressions, Astaroth grants his summoners influence over the behavior of others, knowledge of hidden things, and the ability to sicken enemies.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No
Influence: Astaroth's influence renders you incapable of taking responsibility for your own actions. You cannot admit any fault, acknowledge any mistake, or make reparations or
apologies for any wrong, no matter the consequences or the evidence against you.
Granted Abilities:
Astaroth guided mortals, and he still grants abilities based in knowledge and education. As a fallen angel, and then a vestige, his magics have grown ever grimmer and more distasteful;
he also grants powers based on directly controlling and offending others.
Angelic Lore: Astaroth constantly whispers the secrets of reality in the back of your mind, allowing you to draw on his own nigh-infinite knowledge. This grants a bonus to Lore equal to your effective binder level.
Astaroth's Breath: Once every 5 rounds, you can exhale a 60-foot cone of foul-smelling gas. Creatures within the cone must make a Fortitude save or be
nauseated for 1 round and sickened for an additional 1d4 rounds. Those who make the save are merely sickened for 1 round. Creatures immune to poison or disease are immune to this effect.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
location lTarget = PRCGetSpellTargetLocation();
float fRange = FeetToMeters(60.0);
int nDC = GetBinderDC(oBinder, VESTIGE_ASTAROTH);
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ASTAROTH)) return;
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && !GetIsImmune(oTarget, IMMUNITY_TYPE_POISON) && !GetIsImmune(oTarget, IMMUNITY_TYPE_DISEASE))
{
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DISEASE_S), oTarget);
DelayCommand(6.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSickened(), oTarget, RoundsToSeconds(d4())));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectNausea(oTarget, 6.0), oTarget, RoundsToSeconds(1));
}
else
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSickened(), oTarget, RoundsToSeconds(1));
}
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,57 @@
/*
13/03/21 by Stratovarius
Astaroth, Unjustly Fallen
A fallen angel who would never accept responsibility for his own transgressions, Astaroth grants his summoners influence over the behavior of others, knowledge of hidden things, and the ability to sicken enemies.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No
Influence: Astaroth's influence renders you incapable of taking responsibility for your own actions. You cannot admit any fault, acknowledge any mistake, or make reparations or apologies for any wrong, no matter the consequences or the evidence against you.
Granted Abilities:
Astaroth guided mortals, and he still grants abilities based in knowledge and education. As a fallen angel, and then a vestige, his magics have grown ever grimmer and more distasteful; he also grants powers based on directly controlling and offending others.
Angelic Lore: Astaroth constantly whispers the secrets of reality in the back of your mind, allowing you to draw on his own nigh-infinite knowledge. This grants a bonus to Lore equal to your effective binder level.
Astaroth's Breath: Once every 5 rounds, you can exhale a 60-foot cone of foul-smelling gas. Creatures within the cone must make a Fortitude save or be nauseated for 1 round and sickened for an additional 1d4 rounds. Those who make the save are merely sickened for 1 round. Creatures immune to poison or disease are immune to this effect.
Honeyed Tongue: You gain a +4 competence bonus on Bluff, Persuade, and Intimidate checks.
Master Craftsman: While bound to Astaroth, you gain a +4 competence bonus on all Craft checks. In addition, each time you bind with Astaroth, you may select one item creation feat as a temporary bonus feat. So long as you continue to bind with Astaroth, you may use that feat as though you possessed it normally; you must still spend all standard gold and XP for any item you create, and you must still provide all necessary spells for a given item. If your effective binder level is not at least as high as the necessary caster level to take a specific item creation feat, you cannot choose that feat. For instance, a 4th-level binder could not choose any item creation feat with a prerequisite of caster level 5th or higher.
Word of Astaroth: You may charm a single creature with your glowing words. You must wait 5 rounds before making another attempt.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ASTAROTH);
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SYMB_PERS), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASTAROTH_LORE)) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_LORE, nBinderLevel));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASTAROTH_BREATH)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ASTAROTH_BREATH), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASTAROTH_TONGUE))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_BLUFF, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_PERSUADE, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_INTIMIDATE, 4));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASTAROTH_CRAFT))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_WEAPON, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_TRAP, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_ARMOR, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_GENERAL, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_ALCHEMY, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_CRAFT_POISON, 4));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ASTAROTH_WORD)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ASTAROTH_WORD), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,40 @@
/*
13/03/21 by Stratovarius
Astaroth, Unjustly Fallen
A fallen angel who would never accept responsibility for his own transgressions, Astaroth grants his summoners influence over the behavior of others, knowledge of hidden things, and the ability to sicken enemies.
Vestige Level: 4th
Binding DC: 22
Special Requirement: No
Influence: Astaroth's influence renders you incapable of taking responsibility for your own actions. You cannot admit any fault, acknowledge any mistake, or make reparations or
apologies for any wrong, no matter the consequences or the evidence against you.
Granted Abilities:
Astaroth guided mortals, and he still grants abilities based in knowledge and education. As a fallen angel, and then a vestige, his magics have grown ever grimmer and more distasteful;
he also grants powers based on directly controlling and offending others.
Word of Astaroth: You may charm a single creature with your glowing words. You must wait 5 rounds before making another attempt.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
float fRange = FeetToMeters(60.0);
int nDC = GetBinderDC(oBinder, VESTIGE_ASTAROTH);
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_ASTAROTH)) return;
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
{
AssignCommand(oTarget, ClearAllActions(TRUE));
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, HoursToSeconds(GetBinderLevel(oBinder, VESTIGE_ASTAROTH))));
}
}

View File

@@ -0,0 +1,75 @@
/*
03/02/21 by Stratovarius
Aym, Queen Avarice
Once a monarch of dwarves, Aym allowed her greed to bring an end to her empire. As a vestige, she gives her
host the ability to wear armor without impedance, to set creatures alight with a touch, to resist the effects of fire, and to scatter objects with heavy blows.
Vestige Level: 1st
Binding DC: 15
Special Requirement: None
Granted Abilities:
Aym grants you powers that reflect her dwarven heritage and the ruin she brought to her kingdom.
Dwarven Step: You can move at normal speed (without the usual reduction) while wearing medium or heavy armor.
Halo of Fire: At will, you can shroud yourself in a wreath of flame. Any opponent that strikes you in melee takes
1d6 points of fire damage. You can also deal 1d6 points of fire damage with each melee touch attack you make.
Improved Disarm: You gain the benefit of the Improved Disarm feat.
Medium Armor Proficiency: You are proficient with medium armor.
Resistance to Fire: You have resistance to fire 10.
Ruinous Attack: If your effective binder level is at least 10th, your melee attacks are treated as +5 for the purpose of overcoming damage reduction.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_PERM_ELEMENTAL_SAVANT_FIRE), EffectPact(oBinder));
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_AYM_RESIST_FIRE)) eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_FIRE, 10));
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
{
object oItem;
if (!GetIsVestigeExploited(oBinder, VESTIGE_AYM_MEDIUM_ARMOR)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_ARMOR_PROF_MEDIUM), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_AYM_IMP_DISARM)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_PRC_IMPROVED_DISARM), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_AYM_HALO_FIRE))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_AYM_HALO), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
// Add eventhook to the armor
oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oBinder);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_AYM_RUINOUS_ATTACK))
{
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
if(IPGetIsMeleeWeapon(oItem) && GetBinderLevel(oBinder, VESTIGE_AYM) >= 10)
{
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oBinder);
if(IPGetIsMeleeWeapon(oItem) && GetBinderLevel(oBinder, VESTIGE_AYM) >= 10)
{
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
}
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,28 @@
/*
03/02/21 by Stratovarius
Aym, Queen Avarice
Halo of Fire: At will, you can shroud yourself in a wreath of flame. Any opponent that strikes you in melee takes
1d6 points of fire damage. You can also deal 1d6 points of fire damage with each melee touch attack you make.
*/
#include "prc_inc_sp_tch"
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nAttack = PRCDoMeleeTouchAttack(oTarget);
// PvP check.
if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oBinder))
{
if (nAttack > 0)
{
int nDamage = d6();
ApplyTouchAttackDamage(oBinder, oTarget, nAttack, nDamage, DAMAGE_TYPE_FIRE);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FLAME_S), oTarget);
}
}
}

View File

@@ -0,0 +1,63 @@
/*
09/03/21 by Stratovarius
Balam, the Bitter Angel
Once a being of extreme goodness, Balam became a wrathful vestige after taking on an impossible task that ended in failure. She grants her summoners the ability to foresee future difficulties and the intellect to interpret what they see, as well as skill with light arms and a stare that chills flesh.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Balam requires a sacrifice of her summoner. In the process of calling her, you must deal 1 point of slashing damage to yourself.
Influence: Balam<61>s influence causes you to distrust clerics, paladins, and other devotees of deities. Whenever you enter a temple or some other holy or unholy site, Balam requires that you spit on the floor and utter an invective about the place.
Granted Abilities:
Balam grants you the power to predict future events. She also teaches cunning and finesse, and gives you the ability to freeze foes with a glance.
Balam<EFBFBD>s Cunning: You reroll your next failed saving throw. Once you have used this ability, you cannot do so again for 5 rounds.
Icy Glare: You gain a gaze attack that deals 2d6 points of cold damage to the target. A successful Will save negates this damage.
Prescience: You get a glimpse of the future a moment before it happens. This knowledge manifests as an insight bonus equal to +1 per four effective binder levels on initiative checks, Reflex saves, and AC.
Weapon Finesse: You gain the benefit of the Weapon Finesse feat.
*/
#include "bnd_inc_bndfunc"
void BalamInit(object oBinder, int nBinderLevel)
{
if (nBinderLevel/4 >= 6)
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_INIT ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_THUG ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
else if (nBinderLevel/4 >= 4)
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_IMPROVED_INIT ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
else if (nBinderLevel/4 >= 2)
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_THUG ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
}
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_BALAM);
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_GLYPH_OF_WARDING_BLUE), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_BALAM_CUNNING )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_BALAM_CUNNING), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_BALAM_GLARE )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_BALAM_GLARE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_BALAM_PRESCIENCE))
{
eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nBinderLevel/4, SAVING_THROW_TYPE_ALL));
eLink = EffectLinkEffects(eLink, EffectACIncrease(nBinderLevel/4));
BalamInit(oBinder, nBinderLevel);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_BALAM_FINESSE )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_FINESSE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,29 @@
/*
09/03/21 by Stratovarius
Balam, the Bitter Angel
Once a being of extreme goodness, Balam became a wrathful vestige after taking on an impossible task that ended in failure. She grants her summoners the ability to foresee future difficulties and the intellect to interpret what they see, as well as skill with light arms and a stare that chills flesh.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Balam requires a sacrifice of her summoner. In the process of calling her, you must deal 1 point of slashing damage to yourself.
Influence: Balam<61>s influence causes you to distrust clerics, paladins, and other devotees of deities. Whenever you enter a temple or some other holy or unholy site, Balam requires that you spit on the floor and utter an invective about the place.
Granted Abilities:
Balam grants you the power to predict future events. She also teaches cunning and finesse, and gives you the ability to freeze foes with a glance.
Balam<EFBFBD>s Cunning: You reroll your next failed saving throw. Once you have used this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_BALAM)) return;
SetLocalInt(oBinder, "BalamCunning", TRUE);
DelayCommand(30.0, DeleteLocalInt(oBinder, "BalamCunning"));
}

View File

@@ -0,0 +1,43 @@
/*
09/03/21 by Stratovarius
Balam, the Bitter Angel
Once a being of extreme goodness, Balam became a wrathful vestige after taking on an impossible task that ended in failure. She grants her summoners the ability to foresee future difficulties and the intellect to interpret what they see, as well as skill with light arms and a stare that chills flesh.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Balam requires a sacrifice of her summoner. In the process of calling her, you must deal 1 point of slashing damage to yourself.
Influence: Balam<61>s influence causes you to distrust clerics, paladins, and other devotees of deities. Whenever you enter a temple or some other holy or unholy site, Balam requires that you spit on the floor and utter an invective about the place.
Granted Abilities:
Balam grants you the power to predict future events. She also teaches cunning and finesse, and gives you the ability to freeze foes with a glance.
Icy Glare: You gain a gaze attack that deals 2d6 points of cold damage to the target. A successful Will save negates this damage.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
effect eArrow = EffectVisualEffect(VFX_IMP_MIRV_DN_STEELBLUE);
int nDC = GetBinderDC(oBinder, VESTIGE_BALAM);
// Only creatures, and PvP check.
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oBinder) && !GetLocalInt(oBinder, "BalamGlare"))
{
SetLocalInt(oBinder, "BalamGlare", TRUE);
DelayCommand(RoundsToSeconds(1), DeleteLocalInt(oBinder, "BalamGlare"));
DelayCommand(RoundsToSeconds(1), FloatingTextStringOnCreature("Balam's Glare is off cooldown", oBinder, FALSE));
FloatingTextStringOnCreature("You must wait 1 round before using Balam's Glare again", oBinder, FALSE);
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_COLD))
{
int nDamage = d6(2);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FROST_L), oTarget);
}
}
}

View File

@@ -0,0 +1,65 @@
/*
03/03/21 by Stratovarius
Buer, Grandmother Huntress
Buer grants binders superior healing as well as powers against poisons and diseases.
Vestige Level: 4th
Binding DC: 20
Special Requirement: Buer requires that her seal be drawn outdoors.
Influence: Under Buer<65>s influence, you are plagued by momentary memory lapses. For an instant, you might forget even a piece of information as familiar as the
name of a friend or family member. Furthermore, since Buer abhors the needless death of living creatures other than animals and vermin, the first melee
attack you make against such a foe must be for nonlethal damage. In addition, Buer requires that you not make any coup de grace attacks.
Granted Abilities:
Buer grants you healing powers, the ability to ignore toxins and ailments, and skills that help you navigate the natural world.
Buer<EFBFBD>s Knowledge: You gain a +4 bonus on Heal, Lore, and Animal Empathy checks.
Buer<EFBFBD>s Purity: You have immunity to disease and poison.
Delay Diseases and Poisons: Each ally within 30 feet of you gains immunity to poison and disease.
Fast Healing: You gain the fast healing 1, and the rate of healing increases with your effective binder level. You gain fast healing 2 at 10th level, fast healing 3
at 13th level, fast healing 4 at 16th level, and fast healing 5 at 19th level.
Healing Gift: As a standard action, you can cure 1d8 points of damage +1 point per effective binder level (maximum 1d8+10 points). You cannot use your healing gift
again for 5 rounds. Both uses of the ability channel positive energy and deal a corresponding amount of damage to undead.
Track: You gain the Track feat.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_BUER);
int nBonus = 1;
if (nBinderLevel >= 10) nBonus = (nBinderLevel-4)/3;
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MARK_OF_THE_HUNTER), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_KNOWLEDGE))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_HEAL, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_LORE, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_ANIMAL_EMPATHY, 4));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_PURITY))
{
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DISEASE));
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_POISON));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_DELAY_DISEASE)) eLink = EffectLinkEffects(eLink, EffectAreaOfEffect(136, "bnd_vest_buerent", "", "bnd_vest_buerext"));
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_FAST_HEALING)) eLink = EffectLinkEffects(eLink, EffectRegenerate(nBonus, 6.0));
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_BUER))) FloatingTextStringOnCreature("You have made a poor pact, and Buer prevents you from making a coup de grace!", oBinder, FALSE);
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_HEALING_GIFT)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_BUER_HEAL), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_BUER_TRACK)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_TRACK), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,43 @@
/*
03/03/21 by Stratovarius
Buer, Grandmother Huntress
Buer grants binders superior healing as well as powers against poisons and diseases.
Vestige Level: 4th
Binding DC: 20
Special Requirement: Buer requires that her seal be drawn outdoors.
Influence: Under Buer<65>s influence, you are plagued by momentary memory lapses. For an instant, you might forget even a piece of information as familiar as the
name of a friend or family member. Furthermore, since Buer abhors the needless death of living creatures other than animals and vermin, the first melee
attack you make against such a foe must be for nonlethal damage. In addition, Buer requires that you not make any coup de grace attacks.
Granted Abilities:
Buer grants you healing powers, the ability to ignore toxins and ailments, and skills that help you navigate the natural world.
Delay Diseases and Poisons: Each ally within 30 feet of you gains immunity to poison and disease.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = GetAreaOfEffectCreator();
//Capture the first target object in the shape.
object oTarget = GetEnteringObject();
//FloatingTextStringOnCreature(GetName(oTarget)+" entered Aura of Sadness", oBinder, FALSE);
if (GetIsFriend(oTarget, oBinder) && oTarget != oBinder)
{
effect eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DISEASE));
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_POISON));
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oTarget);
//FloatingTextStringOnCreature(GetName(oTarget)+" Aura of Sadness effect applied", oBinder, FALSE);
}
}

View File

@@ -0,0 +1,49 @@
/*
03/03/21 by Stratovarius
Buer, Grandmother Huntress
Buer grants binders superior healing as well as powers against poisons and diseases.
Vestige Level: 4th
Binding DC: 20
Special Requirement: Buer requires that her seal be drawn outdoors.
Influence: Under Buer<65>s influence, you are plagued by momentary memory lapses. For an instant, you might forget even a piece of information as familiar as the
name of a friend or family member. Furthermore, since Buer abhors the needless death of living creatures other than animals and vermin, the first melee
attack you make against such a foe must be for nonlethal damage. In addition, Buer requires that you not make any coup de grace attacks.
Granted Abilities:
Buer grants you healing powers, the ability to ignore toxins and ailments, and skills that help you navigate the natural world.
Delay Diseases and Poisons: Each ally within 30 feet of you gains immunity to poison and disease.
OnExit
*/
#include "bnd_inc_bndfunc"
void main()
{
object oCreator = GetAreaOfEffectCreator();
object oTarget = GetExitingObject();
// Loop over effects, removing the ones from this power
effect eAOE;
if(GetHasSpellEffect(VESTIGE_BUER, oTarget))
{
eAOE = GetFirstEffect(oTarget);
while(GetIsEffectValid(eAOE))
{
if(GetEffectCreator(eAOE) == oCreator &&
GetEffectSpellId(eAOE) == VESTIGE_BUER &&
oTarget != oCreator
)
{
RemoveEffect(oTarget, eAOE);
}
// Get next effect on the target
eAOE = GetNextEffect(oTarget);
}// end while - Effect loop
}// end if - Target has been affected at all
}

View File

@@ -0,0 +1,50 @@
/*
03/03/21 by Stratovarius
Buer, Grandmother Huntress
Buer grants binders superior healing as well as powers against poisons and diseases.
Vestige Level: 4th
Binding DC: 20
Special Requirement: Buer requires that her seal be drawn outdoors.
Influence: Under Buer<65>s influence, you are plagued by momentary memory lapses. For an instant, you might forget even a piece of information as familiar as the
name of a friend or family member. Furthermore, since Buer abhors the needless death of living creatures other than animals and vermin, the first melee
attack you make against such a foe must be for nonlethal damage. In addition, Buer requires that you not make any coup de grace attacks.
Granted Abilities:
Buer grants you healing powers, the ability to ignore toxins and ailments, and skills that help you navigate the natural world.
Healing Gift: As a standard action, you can cure 1d8 points of damage +1 point per effective binder level (maximum 1d8+10 points). You cannot use your healing gift
again for 5 rounds. Both uses of the ability channel positive energy and deal a corresponding amount of damage to undead.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_sp_tch"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_BUER)) return;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_BUER);
int nHeal = d8() + min(nBinderLevel, 10);
if(PRCGetIsAliveCreature(oTarget))
{
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_L_MAG), oTarget);
}
else if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
int iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
if (iAttackRoll > 0)
{
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOOM), oTarget);
ApplyTouchAttackDamage(oBinder, oTarget, iAttackRoll, nHeal, DAMAGE_TYPE_DIVINE);
}
}
}

View File

@@ -0,0 +1,44 @@
/*
13/03/21 by Stratovarius
Chupoclops, Harbinger of Forever
A great monster believed to be a harbinger of the apocalypse, Chupoclops became a vestige when slain by mortals. Chupoclops grants its summoner a bite attack and
unnatural senses, plus the ability to pounce on foes, to exist ethereally, and to make enemies despair.
Vestige Level: 6th
Binding DC: 25
Special Requirement: Chupoclops hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: While under the influence of Chupoclops, you can<61>t help but be pessimistic. At best, you are quietly resigned to your own failure, and at
worst, you spread your doubts to others, trying to convince them of the hopelessness of their goals. In addition, Chupoclops requires that you voluntarily fail all saving throws against fear effects.
Granted Abilities:
Chupoclops gives you the power to linger on the Ethereal Plane, sense the living and undead, demoralize foes, and bite enemies.
Aura of Despair: Every creature within 10 feet of you takes a <20>2 penalty on attack rolls, checks, saves, and weapon damage rolls. Aura of despair is a mind-affecting fear ability.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = GetAreaOfEffectCreator();
//Capture the first target object in the shape.
object oTarget = GetEnteringObject();
//FloatingTextStringOnCreature(GetName(oTarget)+" entered Aura of Sadness", oBinder, FALSE);
if (!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS, oBinder) && !GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR, oBinder) && oTarget != oBinder)
{
effect eReturn = EffectAttackDecrease(2);
eReturn = EffectLinkEffects(eReturn, EffectSavingThrowDecrease(SAVING_THROW_ALL, 2));
eReturn = EffectLinkEffects(eReturn, EffectDamageDecrease(2, DAMAGE_TYPE_BLUDGEONING|DAMAGE_TYPE_PIERCING|DAMAGE_TYPE_SLASHING));
eReturn = EffectLinkEffects(eReturn, EffectSkillDecrease(SKILL_ALL_SKILLS, 2));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eReturn), oTarget);
//FloatingTextStringOnCreature(GetName(oTarget)+" Aura of Sadness effect applied", oBinder, FALSE);
}
}

View File

@@ -0,0 +1,49 @@
/*
13/03/21 by Stratovarius
Chupoclops, Harbinger of Forever
A great monster believed to be a harbinger of the apocalypse, Chupoclops became a vestige when slain by mortals. Chupoclops grants its summoner a bite attack and
unnatural senses, plus the ability to pounce on foes, to exist ethereally, and to make enemies despair.
Vestige Level: 6th
Binding DC: 25
Special Requirement: Chupoclops hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: While under the influence of Chupoclops, you can<61>t help but be pessimistic. At best, you are quietly resigned to your own failure, and at
worst, you spread your doubts to others, trying to convince them of the hopelessness of their goals. In addition, Chupoclops requires that you voluntarily fail all saving throws against fear effects.
Granted Abilities:
Chupoclops gives you the power to linger on the Ethereal Plane, sense the living and undead, demoralize foes, and bite enemies.
Aura of Despair: Every creature within 10 feet of you takes a <20>2 penalty on attack rolls, checks, saves, and weapon damage rolls. Aura of despair is a mind-affecting fear ability.
OnExit
*/
#include "bnd_inc_bndfunc"
void main()
{
object oCreator = GetAreaOfEffectCreator();
object oTarget = GetExitingObject();
// Loop over effects, removing the ones from this power
effect eAOE;
if(GetHasSpellEffect(VESTIGE_CHUPOCLOPS_AURA_DESPAIR, oTarget))
{
eAOE = GetFirstEffect(oTarget);
while(GetIsEffectValid(eAOE))
{
if(GetEffectCreator(eAOE) == oCreator &&
GetEffectSpellId(eAOE) == VESTIGE_CHUPOCLOPS_AURA_DESPAIR &&
oTarget != oCreator
)
{
RemoveEffect(oTarget, eAOE);
}
// Get next effect on the target
eAOE = GetNextEffect(oTarget);
}// end while - Effect loop
}// end if - Target has been affected at all
}

View File

@@ -0,0 +1,37 @@
/*
13/03/21 by Stratovarius
Chupoclops, Harbinger of Forever
A great monster believed to be a harbinger of the apocalypse, Chupoclops became a vestige when slain by mortals. Chupoclops grants its summoner a bite attack and
unnatural senses, plus the ability to pounce on foes, to exist ethereally, and to make enemies despair.
Vestige Level: 6th
Binding DC: 25
Special Requirement: Chupoclops hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: While under the influence of Chupoclops, you can<61>t help but be pessimistic. At best, you are quietly resigned to your own failure, and at
worst, you spread your doubts to others, trying to convince them of the hopelessness of their goals. In addition, Chupoclops requires that you voluntarily fail all saving throws against fear effects.
Granted Abilities:
Chupoclops gives you the power to linger on the Ethereal Plane, sense the living and undead, demoralize foes, and bite enemies.
Aura of Despair: Every creature within 10 feet of you takes a <20>2 penalty on attack rolls, checks, saves, and weapon damage rolls. Aura of despair is a mind-affecting fear ability.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if (GetHasSpellEffect(GetSpellId(), oBinder))
{
PRCRemoveSpellEffects(GetSpellId(), oBinder, oBinder);
}
else
{
effect eLink = EffectLinkEffects(EffectAreaOfEffect(VFX_PER_SNARE, "bnd_vest_chupare", "", "bnd_vest_chuparx"), EffectVisualEffect(VFX_DUR_SYMB_SLEEP));
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oBinder);
}
}

View File

@@ -0,0 +1,31 @@
/*
13/03/21 by Stratovarius
Chupoclops, Harbinger of Forever
A great monster believed to be a harbinger of the apocalypse, Chupoclops became a vestige when slain by mortals. Chupoclops grants its summoner a bite attack and
unnatural senses, plus the ability to pounce on foes, to exist ethereally, and to make enemies despair.
Vestige Level: 6th
Binding DC: 25
Special Requirement: Chupoclops hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: While under the influence of Chupoclops, you can<61>t help but be pessimistic. At best, you are quietly resigned to your own failure, and at
worst, you spread your doubts to others, trying to convince them of the hopelessness of their goals. In addition, Chupoclops requires that you voluntarily fail all saving throws against fear effects.
Granted Abilities:
Chupoclops gives you the power to linger on the Ethereal Plane, sense the living and undead, demoralize foes, and bite enemies.
Ethereal Watcher: At will as a move action, you can become ethereal. You can remain on the Ethereal Plane indefinitely if you take no actions, but any movement or
combat causes you to return to the Material Plane. Once you have returned to the Material Plane, you cannot use this ability again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!TakeMoveAction(oBinder)) return;
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SANCTUARY), EffectEthereal());
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oBinder);
}

View File

@@ -0,0 +1,70 @@
/*
13/03/21 by Stratovarius
Chupoclops, Harbinger of Forever
A great monster believed to be a harbinger of the apocalypse, Chupoclops became a vestige when slain by mortals. Chupoclops grants its summoner a bite attack and
unnatural senses, plus the ability to pounce on foes, to exist ethereally, and to make enemies despair.
Vestige Level: 6th
Binding DC: 25
Special Requirement: Chupoclops hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: While under the influence of Chupoclops, you can<61>t help but be pessimistic. At best, you are quietly resigned to your own failure, and at
worst, you spread your doubts to others, trying to convince them of the hopelessness of their goals. In addition, Chupoclops requires that you voluntarily fail all saving throws against fear effects.
Granted Abilities:
Chupoclops gives you the power to linger on the Ethereal Plane, sense the living and undead, demoralize foes, and bite enemies.
Aura of Despair: Every creature within 10 feet of you takes a <20>2 penalty on attack rolls, checks, saves, and weapon damage rolls. Aura of despair is a mind-affecting fear ability.
Ethereal Watcher: At will as a move action, you can become ethereal. You can remain on the Ethereal Plane indefinitely if you take no actions, but any movement or
combat causes you to return to the Material Plane. Once you have returned to the Material Plane, you cannot use this ability again for 5 rounds.
Bite: You gain a natural bite attack that deals damage according to your size, as given on the table below.
Size Bite Damage
Diminutive or Fine 1
Tiny 1d2
Small 1d3
Medium 1d4
Large 1d6
Huge 1d8
Gargantuan 2d6
Colossal 2d8
You add your Strength modifier to your damage roll.
Pounce: If you charge a foe, you can make a full attack at the end of the charge.
Soulsense: You notice and locate living creatures within 10 feet as if you possessed the blindsense ability.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_natweap"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SANCTUARY), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_CHUPOCLOPS_DESPAIR)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_CHUPOCLOPS_DESPAIR ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_CHUPOCLOPS_ETHEREAL)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_CHUPOCLOPS_ETHEREAL), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_CHUPOCLOPS_BITE))
{
string sResRef = "prc_troll_bite_";
int nSize = PRCGetCreatureSize(oBinder);
sResRef += GetAffixForSize(nSize);
AddNaturalSecondaryWeapon(oBinder, sResRef);
}
//if (!GetIsVestigeExploited(oBinder, VESTIGE_CHUPOCLOPS_POUNCE)) Done in prc_inc_combmove
if (!GetIsVestigeExploited(oBinder, VESTIGE_CHUPOCLOPS_SOULSENSE))
{
eLink = EffectLinkEffects(eLink, EffectUltravision());
eLink = EffectLinkEffects(eLink, EffectSeeInvisible());
}
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_CHUPOCLOPS))) FloatingTextStringOnCreature("You have made a poor pact, and Chupoclops prevents you from succeeding at fear saves!", oBinder, FALSE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,39 @@
/*
1/03/21 by Stratovarius
Dahlver Nar, the Tortured One
Once a human binder, Dahlver-Nar now grants powers just as other vestiges do. He gives his summoners tough skin, a frightening moan, protections against madness,
and the ability to share injuries with allies.
Maddening Moan: You can emit a frightful moan as a standard action. Every creature within a 30-foot spread must succeed on a Will save or be dazed for 1 round.
Once you have used this ability, you cannot do so again for 5 rounds. Maddening moan is a mind-affecting sonic ability.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
int nDC = GetBinderDC(oBinder, VESTIGE_DAHLVERNAR);
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_DAHLVERNAR)) return;
location lTarget = GetLocation(oBinder);
//ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_ODD), oBinder);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_INSANITY), oBinder);
// Use the function to get the closest creature as a target
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(oAreaTarget != oBinder) // Everyone
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oAreaTarget, nDC, SAVING_THROW_TYPE_SONIC))
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectDazed()), oAreaTarget, 6.0);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE)), oAreaTarget, 6.0);
}
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,73 @@
/*
1/03/21 by Stratovarius
Dahlver Nar, the Tortured One
Once a human binder, Dahlver-Nar now grants powers just as other vestiges do. He gives his summoners tough skin, a frightening moan, protections against madness,
and the ability to share injuries with allies.
Shield Self: At will as a standard action, you can designate one creature within 10 feet per effective binder level to share the damage you take. As long as the
subject creature remains within range, you take only half damage from all effects that deal hit point damage, and it takes the rest. The effect ends immediately
if you designate another creature or if either you or the subject dies. Any damage dealt to you after the effect ends is no longer split between you and the subject,
but damage already split is not reassigned to you. You can affect one creature at a time with this ability. An unwilling target of this ability
can attempt a Will save to negate the effect.
*/
#include "bnd_inc_bndfunc"
void DispelMonitor(object oBinder, object oTarget, int nSpellID, int nBinderLevel);
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nDC = GetBinderDC(oBinder, VESTIGE_DAHLVERNAR);
int nSpellID = GetSpellId();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_DAHLVERNAR);
effect eDurPos = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
effect eDurNeg = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
// Let the AI know
PRCSignalSpellEvent(oTarget, TRUE, nSpellID, oBinder);
// Save - Fortitude negates, or it's an ally
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE) || GetIsFriend(oBinder, oTarget))
{
// Get the OnHitCast: Unique on the manifester's armor / hide
ExecuteScript("prc_keep_onhit_a", oBinder);
// Hook eventscript
AddEventScript(oBinder, EVENT_ONHIT, "psi_pow_shrpnaux", TRUE, FALSE);
// Store the target for use in the damage script
SetLocalObject(oBinder, "PRC_Power_SharePain_Target", oTarget);
// Do VFX for the monitor to look for
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDurNeg, oTarget);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDurPos, oBinder);
// Start effect end monitor
DelayCommand(6.0f, DispelMonitor(oBinder, oTarget, nSpellID, nBinderLevel));
}
}
void DispelMonitor(object oBinder, object oTarget, int nSpellID, int nBinderLevel)
{
// The conditions that can end the effect
if(GetIsDead(oTarget) ||
GetDistanceBetween(oBinder, oTarget) > FeetToMeters(10.0 * nBinderLevel))
{
if(DEBUG) DoDebug("bnd_vest_dahlsh: Effect expired, clearing");
// Clear the target local
DeleteLocalObject(oBinder, "PRC_Power_SharePain_Target");
// Remove the eventscript
RemoveEventScript(oBinder, EVENT_ONHIT, "psi_pow_shrpnaux", TRUE, FALSE);
// Remove remaining effects
PRCRemoveSpellEffects(nSpellID, oBinder, oTarget);
PRCRemoveSpellEffects(nSpellID, oBinder, oBinder);
}
else
DelayCommand(6.0f, DispelMonitor(oBinder, oTarget, nSpellID, nBinderLevel));
}

View File

@@ -0,0 +1,61 @@
/*
1/03/21 by Stratovarius
Dahlver Nar, the Tortured One
Once a human binder, Dahlver-Nar now grants powers just as other vestiges do. He gives his summoners tough skin, a frightening moan, protections against madness,
and the ability to share injuries with allies.
Vestige Level: 2nd
Binding DC: 17
Special Requirement: None
Influence: You shift quickly from distraction to extreme focus and back again. Sometimes you stare blankly off into space, and at other times you gaze intently at the
person or task at hand. Since Dahlver-Nar dislikes any task that requires more than 1 round of concentration (such as some spellcasting, concentration on an effect,
or any action that requires a Concentration check), he requires that you undertake no such activities while under his influence.
Granted Abilities:
Dahlver-Nar armors you and blends his madness with your sanity, lending you some of his selfish powers.
Mad Soul: Binding to Dahlver-Nar grants you immunity to Wisdom damage, Wisdom drain, and confusion effects.
Maddening Moan: You can emit a frightful moan as a standard action. Every creature within a 30-foot spread must succeed on a Will save or be dazed for 1 round.
Once you have used this ability, you cannot do so again for 5 rounds. Maddening moan is a mind-affecting sonic ability.
Natural Armor: You gain an enhancement bonus to your natural armor equal to one-half your Constitution bonus (if any).
Shield Self: At will as a standard action, you can designate one creature within 10 feet per effective binder level to share the damage you take. As long as the
subject creature remains within range, you take only half damage from all effects that deal hit point damage, and it takes the rest. The effect ends immediately
if you designate another creature or if either you or the subject dies. Any damage dealt to you after the effect ends is no longer split between you and the subject,
but damage already split is not reassigned to you. You can affect one creature at a time with this ability. An unwilling target of this ability
can attempt a Will save to negate the effect.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_BLOOD_FOUNTAIN), EffectPact(oBinder));
// If he gets influence, you can't concentrate
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_DAHLVERNAR))) FloatingTextStringOnCreature("You have made a poor pact, and Dahlver Nar enjoins you from using concentration abilities!", oBinder, FALSE);
// Mad Soul is in prc_inc_damage and prc_effect_inc
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_DAHLVERNAR_NATURAL_ARMOR)) eLink = EffectLinkEffects(eLink, EffectACIncrease(GetAbilityModifier(ABILITY_CONSTITUTION, oBinder)/2, AC_NATURAL_BONUS));
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_DAHLVERNAR_MADDENING_MOAN)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DAHLVER_MOAN), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_DAHLVERNAR_SHIELD_SELF)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DAHLVER_SHARE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,50 @@
/*
09/03/21 by Stratovarius
Dantalion, the Star Emperor
Dantalion, called the Star Emperor for his legend and appearance, is a composite of many souls. He grants binders the ability to teleport short distances, read thoughts, and stop foes.
Vestige Level: 5th
Binding DC: 25
Special Requirement: No
Influence: Dantalion<6F>s influence causes you to be aloof and use stately gestures. Dantalion can<61>t help but be curious about the leaders of the day,
so anytime you are within 100 feet of someone who clearly is (or professes to be) a leader of others, Dantalion requires that you try to read that
person<EFBFBD>s thoughts. Once you have made the attempt, regardless of success or failure, you need not try to read that person<6F>s thoughts again.
Granted Abilities:
Pact magic grimoires attest to Dantalion<6F>s profound wisdom and his extensive knowledge about all subjects. Because he knows all thoughts, he can grant
you a portion of that power, as well as the ability to travel just by thinking. You also gain a portion of his commanding presence, which many binders
ascribe to his royal origins.
Awe of Dantalion: When you invoke this ability (a move action), any creature that sees you is unable to attack you or target you with a hostile spell
for 1 round. If you attempt any hostile action, such as making an attack roll or casting an offensive spell against the affected creature or its allies,
the effect ends. Once you have used this ability, you cannot do so again for 5 rounds.
Dantalion Knows: While bound to Dantalion, you have a +8 bonus on Lore checks.
Read Thoughts: At will as a full-round action, you can attempt to read the surface thoughts of any creature you can see. If the target makes a successful
Will save, you cannot read its thoughts for 1 minute. If you attempt to read the thoughts of a creature with an Intelligence score 10 points higher than
your own, you automatically fail and are stunned for 1 round.
Thought Travel: As a standard action, you can instantly transport yourself to any location you can see that is within 5 feet per effective binder level
you possess. Thought travel is a teleportation effect and is usable a number of times per day equal to your effective binder level. Once you have used
this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(PSI_DUR_INTELLECT_FORTRESS), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_DANTALION_AWE )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DANTALION_AWE ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_DANTALION_KNOWS )) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_LORE, 8));
if (!GetIsVestigeExploited(oBinder, VESTIGE_DANTALION_READ )) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DANTALION_READ ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_DANTALION_TRAVEL)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DANTALION_TRAVEL), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,78 @@
/*
09/03/21 by Stratovarius
Dantalion, the Star Emperor
Dantalion, called the Star Emperor for his legend and appearance, is a composite of many souls. He grants binders the ability to teleport short distances, read thoughts, and stop foes.
Vestige Level: 5th
Binding DC: 25
Special Requirement: No
Influence: Dantalion<6F>s influence causes you to be aloof and use stately gestures. Dantalion can<61>t help but be curious about the leaders of the day,
so anytime you are within 100 feet of someone who clearly is (or professes to be) a leader of others, Dantalion requires that you try to read that
person<EFBFBD>s thoughts. Once you have made the attempt, regardless of success or failure, you need not try to read that person<6F>s thoughts again.
Granted Abilities:
Pact magic grimoires attest to Dantalion<6F>s profound wisdom and his extensive knowledge about all subjects. Because he knows all thoughts, he can grant
you a portion of that power, as well as the ability to travel just by thinking. You also gain a portion of his commanding presence, which many binders
ascribe to his royal origins.
Awe of Dantalion: When you invoke this ability (a move action), any creature that sees you is unable to attack you or target you with a hostile spell
for 1 round. If you attempt any hostile action, such as making an attack roll or casting an offensive spell against the affected creature or its allies,
the effect ends. Once you have used this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
#include "spinc_dimdoor"
#include "prc_inc_template"
void ApplyCharm(object oTarget)
{
object oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget);
int nRemove = FALSE;
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
if (GetItemPropertyType(ip) == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS && GetItemPropertySubType(ip) == IP_CONST_IMMUNITYMISC_MINDSPELLS)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
if (GetItemPropertyType(ip) == ITEM_PROPERTY_MIND_BLANK)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
ip = GetNextItemProperty(oItem);
}
AssignCommand(oTarget, ClearAllActions(TRUE));
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, RoundsToSeconds(1)));
if (nRemove) DelayCommand(1.0, AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oItem));
}
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_DANTALION)) return;
if (GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder) >= 2) if(!TakeSwiftAction(oBinder)) return;
else if(!TakeMoveAction(oBinder)) return;
location lTarget = GetLocation(oBinder);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(PSI_FNF_PSYCHIC_CRUSH), lTarget);
// Use the function to get the closest creature as a target
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != oBinder && GetIsEnemy(oTarget, oBinder)) // Only enemies
ApplyCharm(oTarget);
//Select the next target within the spell shape.
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,73 @@
/*
09/03/21 by Stratovarius
Dantalion, the Star Emperor
Dantalion, called the Star Emperor for his legend and appearance, is a composite of many souls. He grants binders the ability to teleport short distances, read thoughts, and stop foes.
Vestige Level: 5th
Binding DC: 25
Special Requirement: No
Influence: Dantalion<6F>s influence causes you to be aloof and use stately gestures. Dantalion can<61>t help but be curious about the leaders of the day,
so anytime you are within 100 feet of someone who clearly is (or professes to be) a leader of others, Dantalion requires that you try to read that
person<EFBFBD>s thoughts. Once you have made the attempt, regardless of success or failure, you need not try to read that person<6F>s thoughts again.
Granted Abilities:
Pact magic grimoires attest to Dantalion<6F>s profound wisdom and his extensive knowledge about all subjects. Because he knows all thoughts, he can grant
you a portion of that power, as well as the ability to travel just by thinking. You also gain a portion of his commanding presence, which many binders
ascribe to his royal origins.
Read Thoughts: At will as a full-round action, you can attempt to read the surface thoughts of any creature you can see. If the target makes a successful
Will save, you cannot read its thoughts for 1 minute. If you attempt to read the thoughts of a creature with an Intelligence score 10 points higher than
your own, you automatically fail and are stunned for 1 round.
*/
#include "bnd_inc_bndfunc"
void DantalionRead(object oBinder, object oTarget, int nDC)
{
if (GetAbilityScore(oTarget, ABILITY_INTELLIGENCE) - 10 > GetAbilityScore(oBinder, ABILITY_INTELLIGENCE))
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oBinder, 6.0);
else if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
if (!GetLocalInt(oTarget, "DantalionImmune"))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(PSI_IMP_CONCUSSION_BLAST), oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE), oTarget, 60.0);
FloatingTextStringOnCreature(GetName(oTarget)+" thinks "+GetName(oBinder)+" smells of elderberries", oBinder, FALSE);
}
}
else // Enemy succeeded on saving throw here
{
FloatingTextStringOnCreature(GetName(oTarget)+" resists your Read Thoughts for one minute!", oBinder, FALSE);
SetLocalInt(oTarget, "DantalionImmune", TRUE);
DelayCommand(60.0, DeleteLocalInt(oTarget, "DantalionImmune"));
}
}
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nDC = GetBinderDC(oBinder, VESTIGE_DANTALION);
DantalionRead(oBinder, oTarget, nDC);
if (GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder) >= 5)
{
location lTarget = GetLocation(oBinder);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_INSANITY), oBinder);
// Use the function to get the closest creature as a target
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(45.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(oAreaTarget != oBinder && oAreaTarget != oTarget && GetIsEnemy(oBinder, oAreaTarget)) // Enemies only
{
DantalionRead(oBinder, oAreaTarget, nDC);
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(45.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
}

View File

@@ -0,0 +1,55 @@
/*
09/03/21 by Stratovarius
Dantalion, the Star Emperor
Dantalion, called the Star Emperor for his legend and appearance, is a composite of many souls. He grants binders the ability to teleport short distances, read thoughts, and stop foes.
Vestige Level: 5th
Binding DC: 25
Special Requirement: No
Influence: Dantalion<6F>s influence causes you to be aloof and use stately gestures. Dantalion can<61>t help but be curious about the leaders of the day,
so anytime you are within 100 feet of someone who clearly is (or professes to be) a leader of others, Dantalion requires that you try to read that
person<EFBFBD>s thoughts. Once you have made the attempt, regardless of success or failure, you need not try to read that person<6F>s thoughts again.
Granted Abilities:
Pact magic grimoires attest to Dantalion<6F>s profound wisdom and his extensive knowledge about all subjects. Because he knows all thoughts, he can grant
you a portion of that power, as well as the ability to travel just by thinking. You also gain a portion of his commanding presence, which many binders
ascribe to his royal origins.
Thought Travel: As a standard action, you can instantly transport yourself to any location you can see that is within 5 feet per effective binder level
you possess. Thought travel is a teleportation effect and is usable a number of times per day equal to your effective binder level. Once you have used
this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
#include "spinc_dimdoor"
#include "prc_inc_template"
void main()
{
object oBinder = OBJECT_SELF;
int nCasterLevel = GetBinderLevel(oBinder, VESTIGE_DANTALION);
int nUses;
int nSLA = GetSpellId();
if(!BindAbilCooldown(oBinder, nSLA, VESTIGE_DANTALION)) return;
if (GetLevelByClass(CLASS_TYPE_SCION_DANTALION, oBinder) >= 4)
if(!TakeMoveAction(oBinder)) return;
nUses = nCasterLevel;
// Check uses per day
if (GetLegacyUses(oBinder, nSLA) >= nUses)
{
FloatingTextStringOnCreature("You have used " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " the maximum amount of times today.", oBinder, FALSE);
return;
}
else
{
SetLegacyUses(oBinder, nSLA);
FloatingTextStringOnCreature("You have "+IntToString(nUses - GetLegacyUses(oBinder, nSLA))+ " uses of " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " remaining today.", oBinder, FALSE);
DimensionDoor(oBinder, nCasterLevel);
}
}

View File

@@ -0,0 +1,45 @@
/*
16/03/21 by Stratovarius
Desharis, the Sprawling Soul
The first of the "city-born fey," represented today by such creatures as the zeitgeist and the gray jester, Desharis is a boon to those who work to spread civilization, and
anathema to most fey and worshipers of the wild. He grants binders shelter against the dangers of the wild, and he provides powers to carve out their own niche against nature.
Vestige Level: 6th
Binding DC: 27
Special Requirement: Desharis will not answer your call in a natural environment, only responding in the worked landscapes of urban areas.
Influence: Under Desharis's influence, you cannot stand to be alone, and the more people you have around you, the better. You never voluntarily accept any
task that requires you to be alone, and you argue vigorously against options that would split the party. If you have the opportunity to socialize with large groups of people
(such as entering a boisterous tavern), you must take it unless doing so is overtly harmful, or you have reason to suspect the individuals are hostile to you.
Granted Abilities:
Desharis grants abilities that reflect his desire to protect the civilized peoples of the world, plus provides a few that show his anger at the fey and other creatures of nature.
City-Dweller: While hosting Desharis, you gain a +10 ft. bonus to move speed when in urban areas. In addition, you gain a +6 competence bonus on Lore checks.
Infinite Doors: Once per day, you may teleport, as per the spell, as a caster of your binder level.
Smite Natural Soul: You may attempt to smite an animal, elemental, fey, or plant with a single melee attack. You add your Charisma bonus (if any) to the attack roll and deal
1 extra point of damage per effective binder level. If you accidentally smite a creature that is not one of the above types, the attempt has no effect.
Once you have used this ability, you cannot do so again for 5 rounds.
Spirits of the City: You can animate objects, as the spell, as a caster of your binder level. Once you have used this ability, you must wait 5 rounds after the effect has expired before you can do so again.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PROT_PRC_CIRCLEROCK), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_CITY_DWELLER)) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_LORE, 6));
if (!GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_TELEPORT)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DESHARIS_TELEPORT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_SMITE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DESHARIS_SMITE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_ANIMATE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_DESHARIS_ANIMATE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,39 @@
/*
16/03/21 by Stratovarius
Desharis, the Sprawling Soul
The first of the "city-born fey," represented today by such creatures as the zeitgeist and the gray jester, Desharis is a boon to those who work to spread civilization, and anathema to most fey and worshipers of the wild. He grants binders shelter against the dangers of the wild, and he provides powers to carve out their own niche against nature.
Vestige Level: 6th
Binding DC: 27
Special Requirement: Desharis will not answer your call in a natural environment, only responding in the worked landscapes of urban areas.
Influence: Under Desharis's influence, you cannot stand to be alone, and the more people you have around you, the better. You never voluntarily accept any task that requires you to be alone, and you argue vigorously against options that would split the party. If you have the opportunity to socialize with large groups of people (such as entering a boisterous tavern), you must take it unless doing so is overtly harmful, or you have reason to suspect the individuals are hostile to you.
Granted Abilities:
Desharis grants abilities that reflect his desire to protect the civilized peoples of the world, plus provides a few that show his anger at the fey and other creatures of nature.
Spirits of the City: You can animate objects, as the spell, as a caster of your binder level. Once you have used this ability, you must wait 5 rounds after the effect has expired before you can do so again.
*/
#include "bnd_inc_bndfunc"
void WrapDesh(object oBinder, int nSpell)
{
BindAbilCooldown(oBinder, nSpell, VESTIGE_DESHARIS);
}
void main()
{
object oBinder = OBJECT_SELF;
int nSpell = GetSpellId();
if (GetLocalInt(oBinder, "Bind"+IntToString(nSpell))) return;
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_DESHARIS);
SetLocalInt(oBinder, "Bind"+IntToString(nSpell), TRUE);
DoRacialSLA(SPELL_ANIMATE_OBJECT, nBinderLevel, GetBinderDC(oBinder, VESTIGE_DESHARIS), FALSE);
float fDur = RoundsToSeconds(nBinderLevel);
DelayCommand(fDur, DeleteLocalInt(oBinder, "Bind"+IntToString(nSpell)));
DelayCommand(fDur+0.25, WrapDesh(oBinder, nSpell));
}

View File

@@ -0,0 +1,11 @@
#include "prc_inc_smite"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_DESHARIS)) return;
object oTarget = PRCGetSpellTargetObject();
int nRace = MyPRCGetRacialType(oTarget);
if(nRace == RACIAL_TYPE_ANIMAL || nRace == RACIAL_TYPE_BEAST || nRace == RACIAL_TYPE_ELEMENTAL || nRace == RACIAL_TYPE_FEY || nRace == RACIAL_TYPE_PLANT)
DoSmite(oBinder, oTarget, SMITE_TYPE_DESHARIS);
}

View File

@@ -0,0 +1,23 @@
#include "bnd_inc_bndfunc"
#include "prc_inc_template"
void main()
{
object oBinder = OBJECT_SELF;
int nUses = 1;
int nSLA = GetSpellId();
// Check uses per day
if (GetLegacyUses(oBinder, nSLA) >= nUses)
{
FloatingTextStringOnCreature("You have used " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " the maximum amount of times today.", oBinder, FALSE);
return;
}
else
{
SetLegacyUses(oBinder, nSLA);
FloatingTextStringOnCreature("You have "+IntToString(nUses - GetLegacyUses(oBinder, nSLA))+ " uses of " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " remaining today.", oBinder, FALSE);
DoRacialSLA(SPELL_TELEPORT_SELF, GetBinderLevel(oBinder, VESTIGE_DESHARIS), GetBinderDC(oBinder, VESTIGE_DESHARIS), FALSE);
}
}

View File

@@ -0,0 +1,50 @@
/*
18/03/21 by Stratovarius
Eligor, Dragon's Slayer
A champion both against and for evil dragons, Eligor grants martial prowess both in and out of the saddle, as well as supernatural strength.
Vestige Level: 7th
Binding DC: 30
Special Requirement: No
Influence: You feel pity for all outcasts, particularly halfelves and half-orcs, and you make every effort to befriend any such beings you meet. Because Eligor desires revenge on the deities who abandoned him, he requires that you attack a human, elf, or dragon foe in preference to all others whenever you enter combat.
Granted Abilities:
In his first life, Eligor was a skilled horseman, and in his second, he served the primary deity of chromatic dragons. Thus, the powers he grants tend to reflect those associations.
Chromatic Strike: As a free action, you can charge a melee attack with acid, cold, electricity, or fire. Your next melee attack deals an extra 1d6 points of damage of the chosen energy type. You can charge a single melee attack only once.
Eligor<EFBFBD>s Skill in the Saddle: You gain the benefits of the Mounted Combat and Mounted Archery feats.
Eligor<EFBFBD>s Strength: You gain a +4 bonus to Strength.
Eligor<EFBFBD>s Resilience: You gain a +3 enhancement bonus to natural armor. This bonus improves to +4 at 16th level and to +5 at 20th level.
Heavy Armor Proficiency: You are proficient with heavy armor.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_ELIGOR);
int nBonus = 3;
if (nBinderLevel >= 20) nBonus = 5;
else if (nBinderLevel >= 16) nBonus = 4;
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_PERM_ELEMENTAL_SAVANT_WATER), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_STRIKE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_ELIGOR_STRIKE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_SADDLE))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_MOUNTED_COMBAT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_MOUNTED_ARCHERY), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_STRENGTH)) eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_STRENGTH, 4));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_RESILIENCE)) eLink = EffectLinkEffects(eLink, EffectACIncrease(nBonus, AC_NATURAL_BONUS));
if (!GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_ARMOR)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_ARMOR_PROF_HEAVY), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,32 @@
/*
18/03/21 by Stratovarius
Eligor, Dragon's Slayer
A champion both against and for evil dragons, Eligor grants martial prowess both in and out of the saddle, as well as supernatural strength.
Vestige Level: 7th
Binding DC: 30
Special Requirement: No
Influence: You feel pity for all outcasts, particularly halfelves and half-orcs, and you make every effort to befriend any such beings you meet. Because Eligor
desires revenge on the deities who abandoned him, he requires that you attack a human, elf, or dragon foe in preference to all others whenever you enter combat.
Granted Abilities:
In his first life, Eligor was a skilled horseman, and in his second, he served the primary deity of chromatic dragons. Thus, the powers he grants tend to reflect those associations.
Chromatic Strike: As a free action, you can charge a melee attack with acid, cold, electricity, or fire. Your next melee attack deals an extra 1d6 points of damage of the
chosen energy type. You can charge a single melee attack only once.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
// The OnHit
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
SetLocalInt(oBinder, "EligorStrike", DAMAGE_TYPE_ACID);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 6.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", FALSE, FALSE);
}

View File

@@ -0,0 +1,32 @@
/*
18/03/21 by Stratovarius
Eligor, Dragon's Slayer
A champion both against and for evil dragons, Eligor grants martial prowess both in and out of the saddle, as well as supernatural strength.
Vestige Level: 7th
Binding DC: 30
Special Requirement: No
Influence: You feel pity for all outcasts, particularly halfelves and half-orcs, and you make every effort to befriend any such beings you meet. Because Eligor
desires revenge on the deities who abandoned him, he requires that you attack a human, elf, or dragon foe in preference to all others whenever you enter combat.
Granted Abilities:
In his first life, Eligor was a skilled horseman, and in his second, he served the primary deity of chromatic dragons. Thus, the powers he grants tend to reflect those associations.
Chromatic Strike: As a free action, you can charge a melee attack with acid, cold, electricity, or fire. Your next melee attack deals an extra 1d6 points of damage of the
chosen energy type. You can charge a single melee attack only once.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
// The OnHit
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
SetLocalInt(oBinder, "EligorStrike", DAMAGE_TYPE_COLD);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 6.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", FALSE, FALSE);
}

View File

@@ -0,0 +1,32 @@
/*
18/03/21 by Stratovarius
Eligor, Dragon's Slayer
A champion both against and for evil dragons, Eligor grants martial prowess both in and out of the saddle, as well as supernatural strength.
Vestige Level: 7th
Binding DC: 30
Special Requirement: No
Influence: You feel pity for all outcasts, particularly halfelves and half-orcs, and you make every effort to befriend any such beings you meet. Because Eligor
desires revenge on the deities who abandoned him, he requires that you attack a human, elf, or dragon foe in preference to all others whenever you enter combat.
Granted Abilities:
In his first life, Eligor was a skilled horseman, and in his second, he served the primary deity of chromatic dragons. Thus, the powers he grants tend to reflect those associations.
Chromatic Strike: As a free action, you can charge a melee attack with acid, cold, electricity, or fire. Your next melee attack deals an extra 1d6 points of damage of the
chosen energy type. You can charge a single melee attack only once.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
// The OnHit
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
SetLocalInt(oBinder, "EligorStrike", DAMAGE_TYPE_ELECTRICAL);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 6.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", FALSE, FALSE);
}

View File

@@ -0,0 +1,32 @@
/*
18/03/21 by Stratovarius
Eligor, Dragon's Slayer
A champion both against and for evil dragons, Eligor grants martial prowess both in and out of the saddle, as well as supernatural strength.
Vestige Level: 7th
Binding DC: 30
Special Requirement: No
Influence: You feel pity for all outcasts, particularly halfelves and half-orcs, and you make every effort to befriend any such beings you meet. Because Eligor
desires revenge on the deities who abandoned him, he requires that you attack a human, elf, or dragon foe in preference to all others whenever you enter combat.
Granted Abilities:
In his first life, Eligor was a skilled horseman, and in his second, he served the primary deity of chromatic dragons. Thus, the powers he grants tend to reflect those associations.
Chromatic Strike: As a free action, you can charge a melee attack with acid, cold, electricity, or fire. Your next melee attack deals an extra 1d6 points of damage of the
chosen energy type. You can charge a single melee attack only once.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
// The OnHit
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder);
SetLocalInt(oBinder, "EligorStrike", DAMAGE_TYPE_FIRE);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 6.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", FALSE, FALSE);
}

View File

@@ -0,0 +1,42 @@
/*
04/03/21 by Stratovarius
Eurynome, Mother of the Material
Eurynome grants lordship over the beasts of land, seas, and air. She also gives those with whom she binds some of the might of titans.
Vestige Level: 4th
Binding DC: 21
Special Requirement: Eurynome hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: Eurynome<6D>s influence makes you paranoid and ungrateful; you see secret motives and possible betrayals behind every action. Eurynome requires that you not
attack a foe unless an ally has already done so. If no allies are present, she makes no such requirement
Granted Abilities:
Eurynome grants you the ability to befriend animals and wield a massive hammer. In addition, she turns your blood into poison and gives you resistance to weapon blows.
Animal Friend: All animals automatically have an initial attitude of friendly toward you.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = GetLocalObject(GetModule(), "EurynomeCharm");
//FloatingTextStringOnCreature(GetName(oBinder)+" created this AoE", GetFirstPC());
//Capture the first target object in the shape.
object oTarget = GetEnteringObject();
if (!GetIsFriend(oTarget, oBinder) && oTarget != oBinder && MyPRCGetRacialType(oTarget) == RACIAL_TYPE_ANIMAL)
{
//AssignCommand(oTarget, ClearAllActions(TRUE));
//effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
//AssignCommand(oBinder, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, HoursToSeconds(24)));
SetLocalObject(oBinder, "EurynomeCharm", oTarget);
ExecuteScript("bnd_vest_eurychr", oBinder);
}
}

View File

@@ -0,0 +1,35 @@
/*
04/03/21 by Stratovarius
Eurynome, Mother of the Material
Eurynome grants lordship over the beasts of land, seas, and air. She also gives those with whom she binds some of the might of titans.
Vestige Level: 4th
Binding DC: 21
Special Requirement: Eurynome hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: Eurynome<6D>s influence makes you paranoid and ungrateful; you see secret motives and possible betrayals behind every action. Eurynome requires that you not
attack a foe unless an ally has already done so. If no allies are present, she makes no such requirement
Granted Abilities:
Eurynome grants you the ability to befriend animals and wield a massive hammer. In addition, she turns your blood into poison and gives you resistance to weapon blows.
Animal Friend: All animals automatically have an initial attitude of friendly toward you.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = OBJECT_SELF;
//FloatingTextStringOnCreature(GetName(oBinder)+" created this AoE", GetFirstPC());
object oTarget = GetLocalObject(oBinder, "EurynomeCharm");
//FloatingTextStringOnCreature(GetName(oTarget)+" is the target", GetFirstPC());
AssignCommand(oTarget, ClearAllActions(TRUE));
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, HoursToSeconds(24));
}

View File

@@ -0,0 +1,109 @@
/*
04/03/21 by Stratovarius
Eurynome, Mother of the Material
Eurynome grants lordship over the beasts of land, seas, and air. She also gives those with whom she binds some of the might of titans.
Vestige Level: 4th
Binding DC: 21
Special Requirement: Eurynome hates Amon for some unknown reason and will not answer your call if you are already bound to him.
Influence: Eurynome<6D>s influence makes you paranoid and ungrateful; you see secret motives and possible betrayals behind every action. Eurynome requires that you not
attack a foe unless an ally has already done so. If no allies are present, she makes no such requirement
Granted Abilities:
Eurynome grants you the ability to befriend animals and wield a massive hammer. In addition, she turns your blood into poison and gives you resistance to weapon blows.
Animal Friend: All animals automatically have an initial attitude of friendly toward you.
Damage Reduction: You gain damage reduction 2/+3.
Eurynome<EFBFBD>s Maul: You summon a magic warhammer (1d8+1d4 bludgeoning damage, <20>3 crit). You are proficient with this weapon and can wield it without penalty. Your warhammer<65>s
exact bonus and abilities depend on your effective binder level, according to the following table.
Effective Binder Level Warhammer Summoned
10th or lower +1 warhammer
11th<EFBFBD>14th +1 anarchic warhammer
15th<EFBFBD>18th +1 anarchic adamantine warhammer
19th or higher +3 anarchic adamantine warhammer
Poison Blood: While you are bound to Eurynome, your blood becomes poisonous. Any creature that makes a bite attack against you must immediately make a successful
Fortitude save or take 1d6 points of damage. After 1 minute, the creature must make another Fortitude save at the same DC or take another 1d6 points of damage per
three effective binder levels you possess (maximum 5d6). Each bite attack poisons the creature anew, forcing a new round of saving throws.
*/
#include "bnd_inc_bndfunc"
void EurynomeInfluence(object oBinder, int nCombat);
void EurynomeInfluence(object oBinder, int nCombat)
{
if (GetHasSpellEffect(VESTIGE_EURYNOME, oBinder))
{
int nCurrent = GetIsInCombat(oBinder);
// We just entered combat
if (nCurrent == TRUE && nCombat == FALSE)
{
// Find an ally
location lTarget = GetLocation(oBinder);
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(GetIsFriend(oAreaTarget, oBinder)) // Find that friend!
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectSlow()), oBinder, 6.0);
break;
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
DelayCommand(0.25, EurynomeInfluence(oBinder, nCurrent));
}
}
void main()
{
object oBinder = PRCGetSpellTargetObject();
SetLocalObject(GetModule(), "EurynomeCharm", oBinder);
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_EURYNOME);
effect eLink = EffectLinkEffects(EffectVisualEffect(PSI_DUR_SYNESTHETE), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_ANIMAL_FRIEND)) eLink = EffectLinkEffects(eLink, EffectAreaOfEffect(136, "bnd_vest_eurychm", "", ""));
if (!GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_DR)) eLink = EffectLinkEffects(eLink, EffectDamageReduction(2, DAMAGE_POWER_PLUS_THREE));
if (!GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_MAUL))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_WARHAMMER), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
object oHammer = CreateItemOnObject("bnd_eury_hammer", oBinder);
SetIdentified(oHammer, TRUE);
SetDroppableFlag(oHammer, FALSE);
SetItemCursedFlag(oHammer, TRUE);
AssignCommand(oHammer, SetIsDestroyable(FALSE, FALSE, FALSE));
DelayCommand(0.25, AssignCommand(oBinder, ActionEquipItem(oHammer, INVENTORY_SLOT_RIGHTHAND)));
if (nBinderLevel >= 19) IPSafeAddItemProperty(oHammer, ItemPropertyEnhancementBonus(3), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
if (nBinderLevel >= 15)
{
IPSafeAddItemProperty(oHammer, ItemPropertyAttackBonus(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
IPSafeAddItemProperty(oHammer, ItemPropertyAttackPenalty(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
if (nBinderLevel >= 11) IPSafeAddItemProperty(oHammer, ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_LAWFUL, IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGEBONUS_2d6), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
}
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_EURYNOME)))
{
FloatingTextStringOnCreature("You have made a poor pact, and Eurynome prevents you from acting first in combat!", oBinder, FALSE);
// Lets the spell apply first
DelayCommand(3.0, EurynomeInfluence(oBinder, FALSE));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_POISON))
{
IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_CHEST, oBinder), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
AddEventScript(GetItemInSlot(INVENTORY_SLOT_CHEST, oBinder), EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,55 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Focalor has power over storms and seas. He gives those who bind him the power to drown souls in sadness and sink ships in an ocean of tears.
Vestige Level: 3rd
Binding DC: 20
Special Requirement: No
Influence: While influenced by Focalor, you feel some of his inestimable grief and act morose, rarely smiling or finding cause to laugh. Whenever you kill a creature,
Focalor demands that as soon as you have a peaceful moment, you take a round to say a few words of sorrow and regret for the life cut short by your actions.
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Aura of Sadness: You emit an aura of depression and anguish that overtakes even the strongest-willed creatures. Every adjacent creature is overcome with grief, which manifests as a
<EFBFBD>2 penalty on attack rolls, saving throws, and skill checks, for as long as it remains adjacent to you. You can suppress or activate this ability as a standard action. Aura of sadness is a mind-affecting ability.
Focalor<EFBFBD>s Breath: As a standard action, you can exhale toward a single living target within 30 feet. That target is blinded for 1 round unless it succeeds on a Fortitude save.
Once you have used this ability, you cannot do so again for 5 rounds.
Lightning Strike: Once per round as a standard action, you can call down a bolt of lightning that strikes any target you designate, as long as it is within 10 feet per effective
binder level of your position. The lightning bolt deals 3d6 points of electricity damage, plus an additional 1d6 points of electricity damage for every three effective binder
levels you possess above 5th. A successful Reflex save halves this damage.
Water Breathing: You can breathe both water and air easily
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PROTECTION_ENERGY_ELECT), EffectPact(oBinder));
if (!GetIsVestigeExploited(oBinder, VESTIGE_FOCALOR_AURA)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_FOCALOR_AURA), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_FOCALOR_BREATHING)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WATER_BREATHING), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_FOCALOR_LIGHTNING)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_FOCALOR_BOLT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_FOCALOR_BREATH)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_FOCALOR_BREATH), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,28 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Aura of Sadness: You emit an aura of depression and anguish that overtakes even the strongest-willed creatures. Every adjacent creature is overcome with grief, which manifests as a
<EFBFBD>2 penalty on attack rolls, saving throws, and skill checks, for as long as it remains adjacent to you. You can suppress or activate this ability as a standard action. Aura of sadness is a mind-affecting ability.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if (GetHasSpellEffect(GetSpellId(), oBinder))
{
PRCRemoveSpellEffects(GetSpellId(), oBinder, oBinder);
}
else
{
effect eLink = EffectLinkEffects(EffectAreaOfEffect(AOE_PER_TELEPORTATIONCIRCLE, "bnd_vest_focaure", "", "bnd_vest_focaurx"), EffectVisualEffect(VFX_DUR_SYMB_SLEEP));
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eLink), oBinder);
}
}

View File

@@ -0,0 +1,34 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Aura of Sadness: You emit an aura of depression and anguish that overtakes even the strongest-willed creatures. Every adjacent creature is overcome with grief, which manifests as a
<EFBFBD>2 penalty on attack rolls, saving throws, and skill checks, for as long as it remains adjacent to you. You can suppress or activate this ability as a standard action. Aura of sadness is a mind-affecting ability.
OnEnter
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = GetAreaOfEffectCreator();
//Capture the first target object in the shape.
object oTarget = GetEnteringObject();
//FloatingTextStringOnCreature(GetName(oTarget)+" entered Aura of Sadness", oBinder, FALSE);
if (!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS, oBinder) && oTarget != oBinder)
{
effect eReturn = EffectAttackDecrease(2);
eReturn = EffectLinkEffects(eReturn, EffectSavingThrowDecrease(SAVING_THROW_ALL, 2));
eReturn = EffectLinkEffects(eReturn, EffectSkillDecrease(SKILL_ALL_SKILLS, 2));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eReturn), oTarget);
//FloatingTextStringOnCreature(GetName(oTarget)+" Aura of Sadness effect applied", oBinder, FALSE);
}
}

View File

@@ -0,0 +1,40 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Aura of Sadness: You emit an aura of depression and anguish that overtakes even the strongest-willed creatures. Every adjacent creature is overcome with grief, which manifests as a
<EFBFBD>2 penalty on attack rolls, saving throws, and skill checks, for as long as it remains adjacent to you. You can suppress or activate this ability as a standard action. Aura of sadness is a mind-affecting ability.
OnExit
*/
#include "bnd_inc_bndfunc"
void main()
{
object oCreator = GetAreaOfEffectCreator();
object oTarget = GetExitingObject();
// Loop over effects, removing the ones from this power
effect eAOE;
if(GetHasSpellEffect(VESTIGE_FOCALOR_AURA_SADNESS, oTarget))
{
eAOE = GetFirstEffect(oTarget);
while(GetIsEffectValid(eAOE))
{
if(GetEffectCreator(eAOE) == oCreator &&
GetEffectSpellId(eAOE) == VESTIGE_FOCALOR_AURA_SADNESS &&
oTarget != oCreator
)
{
RemoveEffect(oTarget, eAOE);
}
// Get next effect on the target
eAOE = GetNextEffect(oTarget);
}// end while - Effect loop
}// end if - Target has been affected at all
}

View File

@@ -0,0 +1,35 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Lightning Strike: Once per round as a standard action, you can call down a bolt of lightning that strikes any target you designate, as long as it is within 10 feet per effective
binder level of your position. The lightning bolt deals 3d6 points of electricity damage, plus an additional 1d6 points of electricity damage for every three effective binder
levels you possess above 5th. A successful Reflex save halves this damage.
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_FOCALOR);
int nDC = GetBinderDC(oBinder, VESTIGE_FOCALOR);
int nDamage = d6(3 + ((nBinderLevel-5)/3));
effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_ELECTRICITY);
if(nDamage > 0)
{
// Apply effects to the currently selected target.
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL), oTarget);
}
}

View File

@@ -0,0 +1,35 @@
/*
02/03/21 by Stratovarius
Focalor, Prince of Tears
Granted Abilities:
Focalor gives you the ability to breathe water, strike foes down with lightning, blind enemies with a puff of your breath, and cause creatures to be stricken with grief in your presence.
Focalor<EFBFBD>s Breath: As a standard action, you can exhale toward a single living target within 30 feet. That target is blinded for 1 round unless it succeeds on a Fortitude save.
Once you have used this ability, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
//Declare major variables
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_FOCALOR)) return;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_FOCALOR);
int nDC = GetBinderDC(oBinder, VESTIGE_FOCALOR);
effect eVis = EffectVisualEffect(VFX_IMP_BLIND_DEAF_M);
if (!PRCGetIsAliveCreature(oTarget)) return;
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
// Apply effects to the currently selected target.
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, 6.0);
}
}

View File

@@ -0,0 +1,52 @@
/*
12/03/21 by Stratovarius
Geryon, the Deposed Lord
Once a devil of great power, Geryon now exists only as a vestige. He gives binders powers associated with his eyes, as well as the ability to fly at a moment<6E>s notice.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Geryon answers the calls of only those summoners who show an understanding of the relationship between souls and the planes. Thus, you must have at least 5 ranks in Lore to summon him.
Influence: While influenced by Geryon, you become overly trusting of and loyal to those you see as allies, even in the face of outright treachery. Because he values trust, if you make a Sense Motive check or use any ability to read thoughts or detect lies, you rebel against Geryon<6F>s influence.
Granted Abilities:
Geryon gives you his eyes and his baleful gaze, as well as the ability to fly.
Acidic Gaze: The gaze of your devilish eyes can cause foes to erupt with acid. When you use this ability, each opponent within 30 feet of you must succeed on a Will save or take 2d6 points of acid damage.
All-Around Vision: Your extra eyes allow you to look in any direction, granting you a +4 bonus on Spot and Search checks. Opponents gain no benefits when flanking you.
See in Darkness: You can see perfectly in darkness of any kind, even that created by a deeper darkness spell.
Swift Flight: You can fly for 1 round by using the Jump ability. Once you have used swift flight, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_DEATHWARD), EffectPact(oBinder));
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_GERYON)))
{
FloatingTextStringOnCreature("You have made a poor pact, and Geryon enjoins you from being untrusting!", oBinder, FALSE);
eLink = EffectLinkEffects(eLink, EffectSkillDecrease(SKILL_SENSE_MOTIVE, 50));
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_GERYON_GAZE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_GERYON_GAZE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_GERYON_DARKNESS)) eLink = EffectLinkEffects(eLink, EffectUltravision());
if (!GetIsVestigeExploited(oBinder, VESTIGE_GERYON_VISION))
{
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SPOT, 4));
eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_SEARCH, 4));
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_UNCANNY_DODGE1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_UNCANNY_DODGE2), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
if (!GetIsVestigeExploited(oBinder, VESTIGE_GERYON_FLIGHT)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_GERYON_FLIGHT), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,49 @@
/*
12/03/21 by Stratovarius
Geryon, the Deposed Lord
Once a devil of great power, Geryon now exists only as a vestige. He gives binders powers associated with his eyes, as well as the ability to fly at a moment<6E>s notice.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Geryon answers the calls of only those summoners who show an understanding of the relationship between souls and the planes. Thus, you must have at least 5 ranks in Lore to summon him.
Influence: While influenced by Geryon, you become overly trusting of and loyal to those you see as allies, even in the face of outright treachery. Because he values trust, if you make a Sense Motive check or use any ability to read thoughts or detect lies, you rebel against Geryon<6F>s influence.
Granted Abilities:
Geryon gives you his eyes and his baleful gaze, as well as the ability to fly.
Acidic Gaze: The gaze of your devilish eyes can cause foes to erupt with acid. When you use this ability, each opponent within 30 feet of you must succeed on a Will save or take 2d6 points of acid damage.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
int nDC = GetBinderDC(oBinder, VESTIGE_GERYON);
location lTarget = GetLocation(oBinder);
if (GetLocalInt(oBinder, "GeryonGaze")) return;
SetLocalInt(oBinder, "GeryonGaze", TRUE);
DelayCommand(RoundsToSeconds(1), DeleteLocalInt(oBinder, "GeryonGaze"));
DelayCommand(RoundsToSeconds(1), FloatingTextStringOnCreature("Geryon's Acidic Gaze is off cooldown", oBinder, FALSE));
FloatingTextStringOnCreature("You must wait 1 round before using Geryon's Acidic Gaze again", oBinder, FALSE);
object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oAreaTarget))
{
if(oAreaTarget != oBinder && GetIsEnemy(oAreaTarget, oBinder)) // Enemies
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oAreaTarget, nDC, SAVING_THROW_TYPE_ACID))
{
int nDamage = d6(2);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_ACID), oAreaTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_ACID_L), oAreaTarget);
}
}
//Select the next target within the spell shape.
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -0,0 +1,28 @@
/*
12/03/21 by Stratovarius
Geryon, the Deposed Lord
Once a devil of great power, Geryon now exists only as a vestige. He gives binders powers associated with his eyes, as well as the ability to fly at a moment<6E>s notice.
Vestige Level: 5th
Binding DC: 25
Special Requirement: Geryon answers the calls of only those summoners who show an understanding of the relationship between souls and the planes. Thus, you must have at least 5 ranks in Lore to summon him.
Influence: While influenced by Geryon, you become overly trusting of and loyal to those you see as allies, even in the face of outright treachery. Because he values trust, if you make a Sense Motive check or use any ability to read thoughts or detect lies, you rebel against Geryon<6F>s influence.
Granted Abilities:
Geryon gives you his eyes and his baleful gaze, as well as the ability to fly.
Swift Flight: You can fly for 1 round by using the Jump ability. Once you have used swift flight, you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_GERYON)) return;
SetLocalInt(oBinder, "GeryonFlight", TRUE);
DelayCommand(6.0, DeleteLocalInt(oBinder, "GeryonFlight"));
}

View File

@@ -0,0 +1,59 @@
/*
1/03/21 by Stratovarius
Haagenti, Mother of Minotaurs
Haagenti tricked the god of frost giants and paid a terrible price for that deed. She girds her summoners for battle and gives them the power to confuse foes.
Vestige Level: 2nd
Binding DC: 17
Special Requirement: To summon Haagenti, you must be Large.
Influence: You feel ashamed and occasionally bashful in the presence of beautiful creatures. In addition, Haagenti requires that you give deference to any
creature you perceive as more attractive or charismatic than yourself. This deference might take the form of a bow, a salute, opening a door for the creature
in question, not speaking until spoken to, or any other gesture that acknowledges the creature as superior to you. In any case, you must constantly treat any
such creature with respect or suffer the penalty for defying Haagenti<74>s influence.
Granted Abilities:
Haagenti grants you some of Thrym<79>s skill with arms and armor, plus her own aversion to transformation and the ability to inflict a state of confusion upon others.
Confusing Touch: You can confuse by touch. The target of your touch attack must succeed on a Will save or become confused for 1 round per three effective binder
levels you possess. When you attain an effective binder level of 19th, this ability functions as a maze spell. Once you have used this ability,
you cannot do so again for 5 rounds.
Immunity to Transformation: No mortal magic can permanently affect your form while you are bound to Haagenti. You are immune to polymorph and petrification effects.
Shield Proficiency: You are proficient with shields, including tower shields.
Weapon Proficiency: You are proficient with the battleaxe, greataxe, handaxe, and throwing axe.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CHILL_SHIELD), EffectPact(oBinder));
// We get this with the Practiced Binder feat
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder) || GetHasFeat(FEAT_PRACTICED_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_HAAGENTI_WEAPON_PROF))
{
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_BATTLEAXE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_GREATAXE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_HANDAXE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROFICIENCY_THROWING_AXE), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
}
// Binders only down here
if (GetLevelByClass(CLASS_TYPE_BINDER, oBinder))
{
if (!GetIsVestigeExploited(oBinder, VESTIGE_HAAGENTI_SHIELD_PROF)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_FEAT_SHIELD_PROFICIENCY), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_HAAGENTI_CONFUSE)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_HAAGENTI_TOUCH), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,84 @@
/*
1/03/21 by Stratovarius
Haagenti, Mother of Minotaurs
Haagenti tricked the god of frost giants and paid a terrible price for that deed. She girds her summoners for battle and gives them the power to confuse foes.
Granted Abilities:
Haagenti grants you some of Thrym<79>s skill with arms and armor, plus her own aversion to transformation and the ability to inflict a state of confusion upon others.
Confusing Touch: You can confuse by touch. The target of your touch attack must succeed on a Will save or become confused for 1 round per three effective binder
levels you possess. When you attain an effective binder level of 19th, this ability functions as a maze spell. Once you have used this ability,
you cannot do so again for 5 rounds.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_sp_tch"
#include "spinc_maze"
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_HAAGENTI);
int nDC = GetBinderDC(oBinder, VESTIGE_HAAGENTI);
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_HAAGENTI)) return;
int nAttack = PRCDoMeleeTouchAttack(oTarget);;
// PvP check.
if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oBinder))
{
if (nAttack > 0)
{
if(nBinderLevel >= 19)
{
// Get the maze area
object oMazeArea = GetObjectByTag("prc_maze_01");
if(DEBUG && !GetIsObjectValid(oMazeArea))
DoDebug("Maze: ERROR: Cannot find maze area!", oBinder);
// Determine which entry to use
int nMaxEntry = GetLocalInt(oMazeArea, "PRC_Maze_Entries_Count");
int nEntry = Random(nMaxEntry) + 1;
object oEntryWP = GetWaypointByTag("PRC_MAZE_ENTRY_WP_" + IntToString(nEntry));
location lTarget = GetLocation(oEntryWP);
// Validity check
if(DEBUG && !GetIsObjectValid(oEntryWP))
DoDebug("Maze: ERROR: Selected waypoint does not exist!");
// Make sure the target can be teleported
if(GetCanTeleport(oTarget, lTarget, TRUE))
{
// Store the target's current location for return
SetLocalLocation(oTarget, "PRC_Maze_Return_Location", GetLocation(oTarget));
// Jump the target to the maze - the maze's scripts will handle the rest
DelayCommand(1.5f, AssignCommand(oTarget, JumpToLocation(lTarget)));
// Clear the action queue, so there's less chance of getting to abuse the ghost effect
AssignCommand(oTarget, ClearAllActions());
// Make the character ghost for the duration of the maze. Apply here so the effect gets a spellID association
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 600.0f);
// Apply some VFX
DoMazeVFX(GetLocation(oTarget));
}
else
SendMessageToPCByStrRef(oBinder, 16825702); // "The spell fails - the target cannot be teleported."
}
else
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
float fDur = RoundsToSeconds(nBinderLevel / 3);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(PRCEffectConfused()), oTarget, fDur);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE)), oTarget, fDur);
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
/**
* @file
* Blade Barrier for Halphax
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
if(!BindAbilCooldown(oBinder, GetSpellId(), VESTIGE_HALPHAX)) return;
DoRacialSLA(SPELL_BLADE_BARRIER, GetBinderLevel(oBinder, VESTIGE_HALPHAX), GetBinderDC(oBinder, VESTIGE_HALPHAX));
}

View File

@@ -0,0 +1,47 @@
/*
25/03/21 by Stratovarius
Halphax, the Angel in the Angle
Gnomes rarely earn a reputation for their military might, but Halphax is one of the few exceptions to that rule. He grants his summoners the ability to defend a fortress and imprison foes, as well as the hardness of stone.
Vestige Level: 8th
Binding DC: 32
Special Requirement: Halphax<61>s sign must be drawn inside a building.
Influence: In his time as a vestige, Halphax seems to have lost all memory of his life as well as any feeling of guilt or shame for his actions. Thus, when you are under his influence,
you lose any normal sense of shame or embarrassment. However, if someone threatens a hostage you care about<75>be it a creature or an item<65>Halphax requires that you accede to the hostage taker<65>s demands.
Granted Abilities:
Halphax grants you great knowledge of mechanical arts as well as the power to imprison foes, build defenses, and gird your body with the hardness of stone.
Damage Reduction: You gain damage reduction 10/+5.
Halphax<EFBFBD>s Knowledge: You gain a +16 bonus on Lore checks.
Imprison: As a standard action, you can make a melee touch attack to imprison your target. If you hit, the target must make a Fortitude saving throw or be imprisoned.
This ability functions like the imprisonment spell, except that the imprisonment lasts for a number of rounds equal to your effective binder level. If a target makes
its save, you must wait 1d4 rounds before using the ability again. You cannot imprison a creature while you already have another imprisoned from the use of this ability.
Iron Defenses: As a standard action, you can cause a series of gnashing defenses to spring into place. This functions as a blade barrier spell. Once you have used this ability, you cannot do so again for 5 rounds.
Secure Shelter: At will as a standard action, you can cast Mordenkainen's Magnificient Mansion.
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = PRCGetSpellTargetObject();
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_STONE5), EffectPact(oBinder));
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_PROT_PRC_STONESKIN));
if (!GetIsVestigeExploited(oBinder, VESTIGE_HALPHAX_DR)) eLink = EffectLinkEffects(eLink, EffectDamageReduction(10, DAMAGE_POWER_PLUS_FIVE));
if (!GetIsVestigeExploited(oBinder, VESTIGE_HALPHAX_KNOWLEDGE)) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_LORE, 16));
if (!GetIsVestigeExploited(oBinder, VESTIGE_HALPHAX_IMPRISON)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_HALPHAX_IMPRISON), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_HALPHAX_BARRIER)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_HALPHAX_BARRIER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (!GetIsVestigeExploited(oBinder, VESTIGE_HALPHAX_SHELTER)) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_CONST_VESTIGE_HALPHAX_SHELTER ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oBinder, HoursToSeconds(24));
}

View File

@@ -0,0 +1,67 @@
/*
25/03/21 by Stratovarius
Halphax, the Angel in the Angle
Gnomes rarely earn a reputation for their military might, but Halphax is one of the few exceptions to that rule. He grants his summoners the ability to defend a fortress and imprison foes, as well as the hardness of stone.
Vestige Level: 8th
Binding DC: 32
Special Requirement: Halphax<61>s sign must be drawn inside a building.
Influence: In his time as a vestige, Halphax seems to have lost all memory of his life as well as any feeling of guilt or shame for his actions. Thus, when you are under his influence,
you lose any normal sense of shame or embarrassment. However, if someone threatens a hostage you care about<75>be it a creature or an item<65>Halphax requires that you accede to the hostage taker<65>s demands.
Granted Abilities:
Halphax grants you great knowledge of mechanical arts as well as the power to imprison foes, build defenses, and gird your body with the hardness of stone.
Imprison: As a standard action, you can make a melee touch attack to imprison your target. If you hit, the target must make a Fortitude saving throw or be imprisoned.
This ability functions like the imprisonment spell, except that the imprisonment lasts for a number of rounds equal to your effective binder level. If a target makes
its save, you must wait 1d4 rounds before using the ability again. You cannot imprison a creature while you already have another imprisoned from the use of this ability.
*/
#include "bnd_inc_bndfunc"
#include "prc_inc_sp_tch"
void main()
{
object oBinder = OBJECT_SELF;
if(GetLocalInt(oBinder, "HalphaxDelay")) return;
object oTarget = PRCGetSpellTargetObject();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_HALPHAX);
int nDC = GetBinderDC(oBinder, VESTIGE_HALPHAX);
if (PRCDoMeleeTouchAttack(oTarget))
{
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
effect eLink = EffectCutsceneParalyze();
eLink = EffectLinkEffects(eLink, EffectCutsceneGhost());
eLink = EffectLinkEffects(eLink, EffectEthereal());
eLink = EffectLinkEffects(eLink, EffectSpellImmunity(SPELL_ALL_SPELLS));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_POSITIVE, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, 100));
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100));
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, RoundsToSeconds(nBinderLevel));
SetLocalInt(oBinder, "HalphaxDelay", TRUE);
DelayCommand(RoundsToSeconds(nBinderLevel), DeleteLocalInt(oBinder, "HalphaxDelay"));
DelayCommand(RoundsToSeconds(nBinderLevel), FloatingTextStringOnCreature("You can use Halphax's Imprison ability again", oBinder, FALSE));
}
else
{
SetLocalInt(oBinder, "HalphaxDelay", TRUE);
int nDelay = d4();
DelayCommand(RoundsToSeconds(nDelay), DeleteLocalInt(oBinder, "HalphaxDelay"));
DelayCommand(RoundsToSeconds(nDelay), FloatingTextStringOnCreature("You can use Halphax's Imprison ability again", oBinder, FALSE));
}
}
}

View File

@@ -0,0 +1,14 @@
/**
* @file
* Blade Barrier for Halphax
*
*/
#include "bnd_inc_bndfunc"
void main()
{
object oBinder = OBJECT_SELF;
DoRacialSLA(SPELL_MORDENKAINENS_MAGNIFICENT_MANSION, GetBinderLevel(oBinder, VESTIGE_HALPHAX), GetBinderDC(oBinder, VESTIGE_HALPHAX));
}

Some files were not shown because too many files have changed in this diff Show More