Further file organization
Further file organization
This commit is contained in:
23
nwn/nwnprc/trunk/newspellbook/bnd_anim_cast.nss
Normal file
23
nwn/nwnprc/trunk/newspellbook/bnd_anim_cast.nss
Normal 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);
|
||||
}
|
||||
}
|
13
nwn/nwnprc/trunk/newspellbook/bnd_anim_meta.nss
Normal file
13
nwn/nwnprc/trunk/newspellbook/bnd_anim_meta.nss
Normal 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);
|
||||
}
|
200
nwn/nwnprc/trunk/newspellbook/bnd_anim_metacnv.nss
Normal file
200
nwn/nwnprc/trunk/newspellbook/bnd_anim_metacnv.nss
Normal 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);
|
||||
}
|
||||
}
|
25
nwn/nwnprc/trunk/newspellbook/bnd_anim_vcast.nss
Normal file
25
nwn/nwnprc/trunk/newspellbook/bnd_anim_vcast.nss
Normal 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);
|
||||
}
|
53
nwn/nwnprc/trunk/newspellbook/bnd_bind_pact.nss
Normal file
53
nwn/nwnprc/trunk/newspellbook/bnd_bind_pact.nss
Normal 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));
|
||||
}
|
12
nwn/nwnprc/trunk/newspellbook/bnd_binder.nss
Normal file
12
nwn/nwnprc/trunk/newspellbook/bnd_binder.nss
Normal 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);
|
||||
}
|
472
nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss
Normal file
472
nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss
Normal 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);
|
||||
}
|
||||
}
|
15
nwn/nwnprc/trunk/newspellbook/bnd_bndvestige.nss
Normal file
15
nwn/nwnprc/trunk/newspellbook/bnd_bndvestige.nss
Normal 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);
|
||||
}
|
39
nwn/nwnprc/trunk/newspellbook/bnd_dnt_glare.nss
Normal file
39
nwn/nwnprc/trunk/newspellbook/bnd_dnt_glare.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
|
59
nwn/nwnprc/trunk/newspellbook/bnd_dnt_ovrwhelm.nss
Normal file
59
nwn/nwnprc/trunk/newspellbook/bnd_dnt_ovrwhelm.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
4
nwn/nwnprc/trunk/newspellbook/bnd_dnt_scholar.nss
Normal file
4
nwn/nwnprc/trunk/newspellbook/bnd_dnt_scholar.nss
Normal file
@@ -0,0 +1,4 @@
|
||||
void main()
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSkillIncrease(SKILL_LORE, 8), OBJECT_SELF, 6.0);
|
||||
}
|
765
nwn/nwnprc/trunk/newspellbook/bnd_events.nss
Normal file
765
nwn/nwnprc/trunk/newspellbook/bnd_events.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
249
nwn/nwnprc/trunk/newspellbook/bnd_expelcnv.nss
Normal file
249
nwn/nwnprc/trunk/newspellbook/bnd_expelcnv.nss
Normal 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);
|
||||
}
|
||||
}
|
305
nwn/nwnprc/trunk/newspellbook/bnd_exploitcnv.nss
Normal file
305
nwn/nwnprc/trunk/newspellbook/bnd_exploitcnv.nss
Normal 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);
|
||||
}
|
||||
}
|
8
nwn/nwnprc/trunk/newspellbook/bnd_ft_expel.nss
Normal file
8
nwn/nwnprc/trunk/newspellbook/bnd_ft_expel.nss
Normal 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);
|
||||
}
|
28
nwn/nwnprc/trunk/newspellbook/bnd_kss.nss
Normal file
28
nwn/nwnprc/trunk/newspellbook/bnd_kss.nss
Normal 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);
|
||||
}
|
||||
}
|
27
nwn/nwnprc/trunk/newspellbook/bnd_kss_pow.nss
Normal file
27
nwn/nwnprc/trunk/newspellbook/bnd_kss_pow.nss
Normal 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));
|
||||
}
|
||||
}
|
51
nwn/nwnprc/trunk/newspellbook/bnd_kss_prot.nss
Normal file
51
nwn/nwnprc/trunk/newspellbook/bnd_kss_prot.nss
Normal 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));
|
||||
}
|
||||
}
|
17
nwn/nwnprc/trunk/newspellbook/bnd_kss_surge.nss
Normal file
17
nwn/nwnprc/trunk/newspellbook/bnd_kss_surge.nss
Normal 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);
|
||||
}
|
16
nwn/nwnprc/trunk/newspellbook/bnd_tenebrous.nss
Normal file
16
nwn/nwnprc/trunk/newspellbook/bnd_tenebrous.nss
Normal 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));
|
||||
}
|
||||
}
|
43
nwn/nwnprc/trunk/newspellbook/bnd_tnb_charm.nss
Normal file
43
nwn/nwnprc/trunk/newspellbook/bnd_tnb_charm.nss
Normal 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));
|
||||
}
|
88
nwn/nwnprc/trunk/newspellbook/bnd_tnb_desempud.nss
Normal file
88
nwn/nwnprc/trunk/newspellbook/bnd_tnb_desempud.nss
Normal 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;
|
||||
}
|
||||
}
|
||||
|
64
nwn/nwnprc/trunk/newspellbook/bnd_tnb_rebuke.nss
Normal file
64
nwn/nwnprc/trunk/newspellbook/bnd_tnb_rebuke.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
34
nwn/nwnprc/trunk/newspellbook/bnd_tnb_umbral.nss
Normal file
34
nwn/nwnprc/trunk/newspellbook/bnd_tnb_umbral.nss
Normal 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);
|
||||
}
|
||||
|
25
nwn/nwnprc/trunk/newspellbook/bnd_tnb_visage.nss
Normal file
25
nwn/nwnprc/trunk/newspellbook/bnd_tnb_visage.nss
Normal 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);
|
||||
}
|
||||
}
|
53
nwn/nwnprc/trunk/newspellbook/bnd_tnb_void.nss
Normal file
53
nwn/nwnprc/trunk/newspellbook/bnd_tnb_void.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
|
47
nwn/nwnprc/trunk/newspellbook/bnd_vest_abysm.nss
Normal file
47
nwn/nwnprc/trunk/newspellbook/bnd_vest_abysm.nss
Normal 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));
|
||||
}
|
60
nwn/nwnprc/trunk/newspellbook/bnd_vest_aceptch.nss
Normal file
60
nwn/nwnprc/trunk/newspellbook/bnd_vest_aceptch.nss
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
51
nwn/nwnprc/trunk/newspellbook/bnd_vest_acerak.nss
Normal file
51
nwn/nwnprc/trunk/newspellbook/bnd_vest_acerak.nss
Normal 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));
|
||||
}
|
34
nwn/nwnprc/trunk/newspellbook/bnd_vest_acespll.nss
Normal file
34
nwn/nwnprc/trunk/newspellbook/bnd_vest_acespll.nss
Normal 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);
|
||||
}
|
||||
|
56
nwn/nwnprc/trunk/newspellbook/bnd_vest_agacomp.nss
Normal file
56
nwn/nwnprc/trunk/newspellbook/bnd_vest_agacomp.nss
Normal 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);
|
||||
}
|
29
nwn/nwnprc/trunk/newspellbook/bnd_vest_agadel.nss
Normal file
29
nwn/nwnprc/trunk/newspellbook/bnd_vest_agadel.nss
Normal 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));
|
||||
}
|
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_agares.nss
Normal file
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_agares.nss
Normal 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));
|
||||
}
|
56
nwn/nwnprc/trunk/newspellbook/bnd_vest_agastep.nss
Normal file
56
nwn/nwnprc/trunk/newspellbook/bnd_vest_agastep.nss
Normal 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
|
||||
}
|
60
nwn/nwnprc/trunk/newspellbook/bnd_vest_amon.nss
Normal file
60
nwn/nwnprc/trunk/newspellbook/bnd_vest_amon.nss
Normal 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);
|
||||
}
|
66
nwn/nwnprc/trunk/newspellbook/bnd_vest_amonbrt.nss
Normal file
66
nwn/nwnprc/trunk/newspellbook/bnd_vest_amonbrt.nss
Normal 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));
|
||||
}
|
||||
}
|
||||
|
||||
|
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_anddsrd.nss
Normal file
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_anddsrd.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
46
nwn/nwnprc/trunk/newspellbook/bnd_vest_andmnt.nss
Normal file
46
nwn/nwnprc/trunk/newspellbook/bnd_vest_andmnt.nss
Normal 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);
|
||||
}
|
94
nwn/nwnprc/trunk/newspellbook/bnd_vest_andras.nss
Normal file
94
nwn/nwnprc/trunk/newspellbook/bnd_vest_andras.nss
Normal 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));
|
||||
}
|
66
nwn/nwnprc/trunk/newspellbook/bnd_vest_andro.nss
Normal file
66
nwn/nwnprc/trunk/newspellbook/bnd_vest_andro.nss
Normal 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));
|
||||
}
|
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_androin.nss
Normal file
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_androin.nss
Normal 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));
|
||||
}
|
||||
|
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_androla.nss
Normal file
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_androla.nss
Normal 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));
|
||||
}
|
||||
|
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_androlo.nss
Normal file
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_androlo.nss
Normal 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));
|
||||
}
|
||||
|
11
nwn/nwnprc/trunk/newspellbook/bnd_vest_andsmt.nss
Normal file
11
nwn/nwnprc/trunk/newspellbook/bnd_vest_andsmt.nss
Normal 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);
|
||||
}
|
64
nwn/nwnprc/trunk/newspellbook/bnd_vest_arete.nss
Normal file
64
nwn/nwnprc/trunk/newspellbook/bnd_vest_arete.nss
Normal 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));
|
||||
}
|
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_areters.nss
Normal file
54
nwn/nwnprc/trunk/newspellbook/bnd_vest_areters.nss
Normal 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));
|
||||
}
|
||||
|
52
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashard.nss
Normal file
52
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashard.nss
Normal 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);
|
||||
}
|
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashardf.nss
Normal file
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashardf.nss
Normal 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));
|
||||
}
|
||||
|
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashardl.nss
Normal file
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_ashardl.nss
Normal 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));
|
||||
}
|
||||
|
53
nwn/nwnprc/trunk/newspellbook/bnd_vest_astbrth.nss
Normal file
53
nwn/nwnprc/trunk/newspellbook/bnd_vest_astbrth.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
|
57
nwn/nwnprc/trunk/newspellbook/bnd_vest_astroth.nss
Normal file
57
nwn/nwnprc/trunk/newspellbook/bnd_vest_astroth.nss
Normal 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));
|
||||
}
|
40
nwn/nwnprc/trunk/newspellbook/bnd_vest_astword.nss
Normal file
40
nwn/nwnprc/trunk/newspellbook/bnd_vest_astword.nss
Normal 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))));
|
||||
}
|
||||
}
|
||||
|
75
nwn/nwnprc/trunk/newspellbook/bnd_vest_aym.nss
Normal file
75
nwn/nwnprc/trunk/newspellbook/bnd_vest_aym.nss
Normal 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));
|
||||
}
|
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_aymfire.nss
Normal file
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_aymfire.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
63
nwn/nwnprc/trunk/newspellbook/bnd_vest_balam.nss
Normal file
63
nwn/nwnprc/trunk/newspellbook/bnd_vest_balam.nss
Normal 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));
|
||||
}
|
29
nwn/nwnprc/trunk/newspellbook/bnd_vest_balamc.nss
Normal file
29
nwn/nwnprc/trunk/newspellbook/bnd_vest_balamc.nss
Normal 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"));
|
||||
}
|
43
nwn/nwnprc/trunk/newspellbook/bnd_vest_balamg.nss
Normal file
43
nwn/nwnprc/trunk/newspellbook/bnd_vest_balamg.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
65
nwn/nwnprc/trunk/newspellbook/bnd_vest_buer.nss
Normal file
65
nwn/nwnprc/trunk/newspellbook/bnd_vest_buer.nss
Normal 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));
|
||||
}
|
43
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerent.nss
Normal file
43
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerent.nss
Normal 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);
|
||||
}
|
||||
}
|
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerext.nss
Normal file
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerext.nss
Normal 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
|
||||
}
|
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerhl.nss
Normal file
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_buerhl.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
44
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupare.nss
Normal file
44
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupare.nss
Normal 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);
|
||||
}
|
||||
}
|
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_chuparx.nss
Normal file
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_chuparx.nss
Normal 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
|
||||
}
|
37
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupaur.nss
Normal file
37
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupaur.nss
Normal 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);
|
||||
}
|
||||
}
|
31
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupeth.nss
Normal file
31
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupeth.nss
Normal 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);
|
||||
}
|
70
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupo.nss
Normal file
70
nwn/nwnprc/trunk/newspellbook/bnd_vest_chupo.nss
Normal 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));
|
||||
}
|
39
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlmn.nss
Normal file
39
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlmn.nss
Normal 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);
|
||||
}
|
||||
}
|
73
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlsh.nss
Normal file
73
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlsh.nss
Normal 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));
|
||||
}
|
61
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlver.nss
Normal file
61
nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlver.nss
Normal 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));
|
||||
}
|
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantaln.nss
Normal file
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantaln.nss
Normal 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));
|
||||
}
|
78
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantawe.nss
Normal file
78
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantawe.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
|
73
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantrd.nss
Normal file
73
nwn/nwnprc/trunk/newspellbook/bnd_vest_dantrd.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
55
nwn/nwnprc/trunk/newspellbook/bnd_vest_danttvl.nss
Normal file
55
nwn/nwnprc/trunk/newspellbook/bnd_vest_danttvl.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
|
45
nwn/nwnprc/trunk/newspellbook/bnd_vest_desh.nss
Normal file
45
nwn/nwnprc/trunk/newspellbook/bnd_vest_desh.nss
Normal 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));
|
||||
}
|
39
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshanm.nss
Normal file
39
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshanm.nss
Normal 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));
|
||||
}
|
11
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshsmt.nss
Normal file
11
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshsmt.nss
Normal 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);
|
||||
}
|
23
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshtel.nss
Normal file
23
nwn/nwnprc/trunk/newspellbook/bnd_vest_deshtel.nss
Normal 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);
|
||||
}
|
||||
}
|
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligor.nss
Normal file
50
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligor.nss
Normal 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));
|
||||
}
|
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligora.nss
Normal file
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligora.nss
Normal 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);
|
||||
}
|
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligorc.nss
Normal file
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligorc.nss
Normal 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);
|
||||
}
|
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligore.nss
Normal file
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligore.nss
Normal 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);
|
||||
}
|
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligorf.nss
Normal file
32
nwn/nwnprc/trunk/newspellbook/bnd_vest_eligorf.nss
Normal 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);
|
||||
}
|
42
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurychm.nss
Normal file
42
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurychm.nss
Normal 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);
|
||||
}
|
||||
}
|
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurychr.nss
Normal file
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurychr.nss
Normal 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));
|
||||
}
|
109
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurynom.nss
Normal file
109
nwn/nwnprc/trunk/newspellbook/bnd_vest_eurynom.nss
Normal 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));
|
||||
}
|
55
nwn/nwnprc/trunk/newspellbook/bnd_vest_focalor.nss
Normal file
55
nwn/nwnprc/trunk/newspellbook/bnd_vest_focalor.nss
Normal 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));
|
||||
}
|
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaura.nss
Normal file
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaura.nss
Normal 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);
|
||||
}
|
||||
}
|
34
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaure.nss
Normal file
34
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaure.nss
Normal 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);
|
||||
}
|
||||
}
|
40
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaurx.nss
Normal file
40
nwn/nwnprc/trunk/newspellbook/bnd_vest_focaurx.nss
Normal 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
|
||||
}
|
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_focbolt.nss
Normal file
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_focbolt.nss
Normal 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);
|
||||
}
|
||||
|
||||
}
|
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_focbrth.nss
Normal file
35
nwn/nwnprc/trunk/newspellbook/bnd_vest_focbrth.nss
Normal 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);
|
||||
}
|
||||
|
||||
}
|
52
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryon.nss
Normal file
52
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryon.nss
Normal 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));
|
||||
}
|
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryona.nss
Normal file
49
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryona.nss
Normal 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);
|
||||
}
|
||||
}
|
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryonf.nss
Normal file
28
nwn/nwnprc/trunk/newspellbook/bnd_vest_geryonf.nss
Normal 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"));
|
||||
}
|
59
nwn/nwnprc/trunk/newspellbook/bnd_vest_hagenti.nss
Normal file
59
nwn/nwnprc/trunk/newspellbook/bnd_vest_hagenti.nss
Normal 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));
|
||||
}
|
84
nwn/nwnprc/trunk/newspellbook/bnd_vest_hagtch.nss
Normal file
84
nwn/nwnprc/trunk/newspellbook/bnd_vest_hagtch.nss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpbar.nss
Normal file
15
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpbar.nss
Normal 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));
|
||||
}
|
||||
|
47
nwn/nwnprc/trunk/newspellbook/bnd_vest_halphax.nss
Normal file
47
nwn/nwnprc/trunk/newspellbook/bnd_vest_halphax.nss
Normal 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));
|
||||
}
|
67
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpimp.nss
Normal file
67
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpimp.nss
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpmmm.nss
Normal file
14
nwn/nwnprc/trunk/newspellbook/bnd_vest_halpmmm.nss
Normal 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
Reference in New Issue
Block a user