Baleful Utterance affects detected traps
Baleful Utterance affects detected traps. Tempest offhand attack fix. Minified feat.2da. Started reviewing @Tenjac's incomplete spell scripts. Updated release archive.
This commit is contained in:
BIN
Notes/future spells/Paladin Spells Worksheet.xlsx
Normal file
BIN
Notes/future spells/Paladin Spells Worksheet.xlsx
Normal file
Binary file not shown.
@@ -1,46 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Regenerate Critical Wounds
|
||||
//:: 00_S0_REGCW
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Regenerate 4 HP per round for 10 rounds +
|
||||
caster level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "pg_ss_spelltwk"
|
||||
#include "x2_inc_spellhook"
|
||||
//#include "x0_i0_spells"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nRace = MyPRCGetRacialType(oTarget);
|
||||
int nMetamagic = PRCGetMetaMagicFeat();
|
||||
if((nRace != RACIAL_TYPE_CONSTRUCT) || (nRace != RACIAL_TYPE_UNDEAD))
|
||||
{
|
||||
PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
|
||||
RegenerateWounds(4, oTarget, nMetamagic);
|
||||
}
|
||||
}
|
@@ -1,46 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Regenerate Light Wounds
|
||||
//:: 00_S0_REGLW
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Regenerate 1 HP per round for 10 rounds +
|
||||
caster level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "pg_ss_spelltwk"
|
||||
#include "x2_inc_spellhook"
|
||||
//#include "x0_i0_spells"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nRace = MyPRCGetRacialType(oTarget);
|
||||
int nMetamagic = PRCGetMetaMagicFeat();
|
||||
if((nRace != RACIAL_TYPE_CONSTRUCT) || (nRace != RACIAL_TYPE_UNDEAD))
|
||||
{
|
||||
PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
|
||||
RegenerateWounds(1, oTarget, nMetamagic);
|
||||
}
|
||||
}
|
@@ -1,46 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Regenerate Moderate Wounds
|
||||
//:: 00_S0_REGMW
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Regenerate 2 HP per round for 10 rounds +
|
||||
caster level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "pg_ss_spelltwk"
|
||||
#include "x2_inc_spellhook"
|
||||
//#include "x0_i0_spells"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nRace = MyPRCGetRacialType(oTarget);
|
||||
int nMetamagic = PRCGetMetaMagicFeat();
|
||||
if((nRace != RACIAL_TYPE_CONSTRUCT) || (nRace != RACIAL_TYPE_UNDEAD))
|
||||
{
|
||||
PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
|
||||
RegenerateWounds(2, oTarget, nMetamagic);
|
||||
}
|
||||
}
|
@@ -1,46 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Regenerate Moderate Wounds
|
||||
//:: 00_S0_REGSW
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Regenerate 3 HP per round for 10 rounds +
|
||||
caster level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "pg_ss_spelltwk"
|
||||
#include "x2_inc_spellhook"
|
||||
//#include "x0_i0_spells"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nRace = MyPRCGetRacialType(oTarget);
|
||||
int nMetamagic = PRCGetMetaMagicFeat();
|
||||
if((nRace != RACIAL_TYPE_CONSTRUCT) || (nRace != RACIAL_TYPE_UNDEAD))
|
||||
{
|
||||
PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
|
||||
RegenerateWounds(3, oTarget, nMetamagic);
|
||||
}
|
||||
}
|
@@ -1,68 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Speed of the Wind
|
||||
//:: 00_S0_SPEEDWIND
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Caster gains +4 Dex and -2 Con for 10 turns
|
||||
per level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_spellhook"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// This spell no longer stacks. If there is one of that type, thats ok
|
||||
//--------------------------------------------------------------------------
|
||||
if (GetHasSpellEffect(GetSpellId(), oTarget))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(100775, OBJECT_SELF, FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
effect eDex = EffectAbilityIncrease(ABILITY_DEXTERITY, 4);
|
||||
effect eCon = EffectAbilityDecrease(ABILITY_CONSTITUTION, 2);
|
||||
effect eVis1 = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
|
||||
effect eVis2 = EffectVisualEffect(VFX_IMP_HEAD_EVIL);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
|
||||
effect eLink = EffectLinkEffects(eDex, eCon);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
|
||||
int nRace = MyPRCGetRacialType(oTarget);
|
||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF) * 10;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
|
||||
if(nMetaMagic == METAMAGIC_EXTEND) {
|
||||
nDuration = nDuration * 2; }
|
||||
if((nRace != RACIAL_TYPE_CONSTRUCT) || (nRace != RACIAL_TYPE_UNDEAD))
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis1, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget);
|
||||
}
|
||||
}
|
@@ -1,44 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Spiritual Hammer
|
||||
//:: 00_S0_SPIRO
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_spellhook"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
||||
int nAttack = GetBaseAttackBonus(OBJECT_SELF);
|
||||
effect eSummon = EffectSummonCreature("pg_spiritweap", VFX_FNF_SUMMON_MONSTER_1);
|
||||
if(nMetaMagic == METAMAGIC_EXTEND) {
|
||||
nDuration = nDuration * 2; }
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), RoundsToSeconds(nDuration));
|
||||
DelayCommand(1.5f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectAttackIncrease(nAttack - 1), GetAssociate(ASSOCIATE_TYPE_SUMMONED), RoundsToSeconds(nDuration)));
|
||||
}
|
@@ -1,67 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Tortoise Shell
|
||||
//:: 00_S0_TORTSHELL
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Caster gains 100 temporary HP and DR 10/-
|
||||
against physical damage for one round/level.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 7/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_spellhook"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-20 by Georg
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
return;
|
||||
}
|
||||
|
||||
// End of Spell Cast Hook
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// This spell no longer stacks. If there is one of that type, thats ok
|
||||
//--------------------------------------------------------------------------
|
||||
if (GetHasSpellEffect(GetSpellId(), OBJECT_SELF))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(100775, OBJECT_SELF, FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
effect eTemp = EffectTemporaryHitpoints(100);
|
||||
effect eDamage1 = EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, 10);
|
||||
effect eDamage2 = EffectDamageResistance(DAMAGE_TYPE_PIERCING, 10);
|
||||
effect eDamage3 = EffectDamageResistance(DAMAGE_TYPE_SLASHING, 10);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_SPELL_MANTLE_USE);
|
||||
effect eShell = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_SANCTUARY);
|
||||
|
||||
effect eLink = EffectLinkEffects(eTemp, eDamage1);
|
||||
eLink = EffectLinkEffects(eLink, eDamage2);
|
||||
eLink = EffectLinkEffects(eLink, eDamage3);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eShell);
|
||||
|
||||
if(nMetaMagic == METAMAGIC_EXTEND) {
|
||||
nDuration = nDuration * 2; }
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, RoundsToSeconds(nDuration));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
||||
}
|
@@ -1,185 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Sihlbrane's Grove
|
||||
//:: Spirit Worm
|
||||
//:: 00_S0_WORM
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
You create a lingering decay in the spirit and
|
||||
body of the target. If the target fails its saving
|
||||
throw, it takes 1 point of temporary Constitution
|
||||
damage each round while the spell lasts (maximum
|
||||
5 points of Constitution). If it makes its save,
|
||||
it does not lose any Constitution but take 1d2
|
||||
points of damage each round while the spell
|
||||
lasts (maximum 5).
|
||||
|
||||
31.12 - Updated to reflect new scirpting.
|
||||
See melf's acid arrow for details.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Yaballa
|
||||
//:: Created On: 6/9/2003
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "pg_spell_CONST"
|
||||
#include "x2_inc_spellhook"
|
||||
//#include "x2_i0_spells"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
const int nSpellID = 1501;
|
||||
|
||||
void RunConImpact(object oTarget, object oCaster);
|
||||
void RunDamImpact(object oTarget, object oCaster, int nMetamagic);
|
||||
|
||||
void main()
|
||||
{
|
||||
object oTarget = GetSpellTargetObject();
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Spellcast Hook Code
|
||||
// Added 2003-06-20 by Georg
|
||||
// If you want to make changes to all spells, check x2_inc_spellhook.nss to
|
||||
// find out more
|
||||
//--------------------------------------------------------------------------
|
||||
if(!X2PreSpellCastCode()) {
|
||||
return; }
|
||||
// End of Spell Cast Hook
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// This spell no longer stacks. If there is one of that type, thats ok
|
||||
//--------------------------------------------------------------------------
|
||||
if (GetHasSpellEffect(GetSpellId(), oTarget))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(100775, OBJECT_SELF, FALSE);
|
||||
return;
|
||||
}
|
||||
//--------------------------------------------------------------------------
|
||||
// Calculate the duration
|
||||
//--------------------------------------------------------------------------
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
||||
int nTouch = TouchAttackMelee(oTarget);
|
||||
|
||||
if(nDuration < 1) {
|
||||
nDuration = 1; }
|
||||
if(nDuration > 5) {
|
||||
nDuration = 5; }
|
||||
|
||||
if(nMetaMagic == METAMAGIC_EXTEND) {
|
||||
nDuration = nDuration * 2; }
|
||||
//--------------------------------------------------------------------------
|
||||
// Setup VFX
|
||||
//--------------------------------------------------------------------------
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
//--------------------------------------------------------------------------
|
||||
// Set the VFX to be non dispelable
|
||||
//--------------------------------------------------------------------------
|
||||
eDur = ExtraordinaryEffect(eDur);
|
||||
|
||||
if(!GetIsReactionTypeFriendly(oTarget))
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
|
||||
if(nTouch > 0)
|
||||
{
|
||||
if(!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
SetLocalInt(oTarget, "XP2_L_SPELL_SAVE_DC_" + IntToString(nSpellID), GetSpellSaveDC());
|
||||
int nDC = GetLocalInt(oTarget, "XP2_L_SPELL_SAVE_DC_" + IntToString(nSpellID));
|
||||
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC))
|
||||
{
|
||||
//----------------------------------------------------------------------
|
||||
// Con decrease
|
||||
//----------------------------------------------------------------------
|
||||
effect eCon = EffectAbilityDecrease(ABILITY_CONSTITUTION, 1);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eCon, oTarget);
|
||||
//----------------------------------------------------------------------
|
||||
// Apply the VFX that is used to track the spells duration
|
||||
//----------------------------------------------------------------------
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, RoundsToSeconds(nDuration));
|
||||
object oSelf = OBJECT_SELF; // because OBJECT_SELF is a function
|
||||
DelayCommand(6.0f, RunConImpact(oTarget, oSelf));
|
||||
}
|
||||
//-----------------------------------
|
||||
// Magical damage
|
||||
//-----------------------------------
|
||||
else
|
||||
{
|
||||
int nDam = d2();
|
||||
//-----------------------------------
|
||||
//max damage on critical hit, only once
|
||||
//-----------------------------------
|
||||
if(nTouch == 2) {
|
||||
nDam = 2; }
|
||||
effect eDam = EffectDamage(nDam);
|
||||
//-----------------------------------
|
||||
//update VFX
|
||||
//-----------------------------------
|
||||
eVis = EffectVisualEffect(VFX_IMP_MAGBLUE);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||
//----------------------------------------------------------------------
|
||||
// Apply the VFX that is used to track the spells duration
|
||||
//----------------------------------------------------------------------
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, RoundsToSeconds(nDuration));
|
||||
object oSelf = OBJECT_SELF; // because OBJECT_SELF is a function
|
||||
DelayCommand(6.0f, RunDamImpact(oTarget, oSelf, nMetaMagic));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RunDamImpact(object oTarget, object oCaster, int nMetaMagic)
|
||||
{
|
||||
if(!GetIsEnemy(oTarget, oCaster)){return;}
|
||||
//--------------------------------------------------------------------------
|
||||
// Check if the spell has expired (check also removes effects)
|
||||
//--------------------------------------------------------------------------
|
||||
if(PRCGetDelayedSpellEffectsExpired(SPELL_SPIRIT_WORM, oTarget, oCaster)) {
|
||||
return; }
|
||||
|
||||
if(GetIsDead(oTarget) == FALSE)
|
||||
{
|
||||
int nDC = GetLocalInt(oTarget, "XP2_L_SPELL_SAVE_DC_" + IntToString(nSpellID));
|
||||
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC))
|
||||
{
|
||||
//----------------------------------------------------------------------
|
||||
// Calculate Damage
|
||||
//----------------------------------------------------------------------
|
||||
int nDamage = PRCMaximizeOrEmpower(2, 1, nMetaMagic);
|
||||
effect eDam = EffectDamage(nDamage);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_MAGBLUE);
|
||||
eDam = EffectLinkEffects(eVis, eDam); // flare up
|
||||
ApplyEffectToObject (DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||
DelayCommand(6.0f, RunDamImpact(oTarget, oCaster, nMetaMagic));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RunConImpact(object oTarget, object oCaster)
|
||||
{
|
||||
if(!GetIsEnemy(oTarget, oCaster)){return;}
|
||||
//--------------------------------------------------------------------------
|
||||
// Check if the spell has expired (check also removes effects)
|
||||
//--------------------------------------------------------------------------
|
||||
if(PRCGetDelayedSpellEffectsExpired(SPELL_SPIRIT_WORM, oTarget, oCaster)) {
|
||||
return; }
|
||||
|
||||
if(GetIsDead(oTarget) == FALSE)
|
||||
{
|
||||
int nDC = GetLocalInt(oTarget, "XP2_L_SPELL_SAVE_DC_" + IntToString(nSpellID));
|
||||
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC))
|
||||
{
|
||||
//----------------------------------------------------------------------
|
||||
// Calculate Damage
|
||||
//----------------------------------------------------------------------
|
||||
effect eCon = EffectAbilityDecrease(ABILITY_CONSTITUTION, 1);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
|
||||
eCon = EffectLinkEffects(eVis, eCon); // flare up
|
||||
ApplyEffectToObject (DURATION_TYPE_INSTANT, eCon, oTarget);
|
||||
DelayCommand(6.0f, RunConImpact(oTarget, oCaster));
|
||||
}
|
||||
}
|
||||
}
|
143
Notes/future spells/prc_c_bladebane.nss
Normal file
143
Notes/future spells/prc_c_bladebane.nss
Normal file
@@ -0,0 +1,143 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Short description Bladebane Conversation
|
||||
//:: filename prc_c_bladebane.nss
|
||||
//:://////////////////////////////////////////////
|
||||
/** @file
|
||||
|
||||
|
||||
@author Tenjac
|
||||
@date Created - 7/29/22
|
||||
@updater Jaysyn
|
||||
@updated 2024-10-02 10:47:03
|
||||
//////////////////////////////////////////////////
|
||||
/* Constant defintions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
const int STAGE_ENTRY = 0;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Aid functions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Main function */
|
||||
//////////////////////////////////////////////////
|
||||
#include "inc_dynconv"
|
||||
#include "prc_inc_racial"
|
||||
#include "inc_2dacache"
|
||||
#include "inc_addragebonus"
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = GetPCSpeaker();
|
||||
/* Get the value of the local variable set by the conversation script calling
|
||||
* this script. Values:
|
||||
* DYNCONV_ABORTED Conversation aborted
|
||||
* DYNCONV_EXITED Conversation exited via the exit node
|
||||
* DYNCONV_SETUP_STAGE System's reply turn
|
||||
* 0 Error - something else called the script
|
||||
* Other The user made a choice
|
||||
*/
|
||||
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
||||
// The stage is used to determine the active conversation node.
|
||||
// 0 is the entry node.
|
||||
int nStage = GetStage(oPC);
|
||||
|
||||
// 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)
|
||||
{
|
||||
// Check if this stage is marked as already set up
|
||||
// This stops list duplication when scrolling
|
||||
if(!GetIsStageSetUp(nStage, oPC))
|
||||
{
|
||||
// variable named nStage determines the current conversation node
|
||||
// Function SetHeader to set the text displayed to the PC
|
||||
// Function AddChoice to add a response option for the PC. The responses are show in order added
|
||||
if(nStage == STAGE_ENTRY)
|
||||
{
|
||||
// Set the header
|
||||
SetHeader("Choose racial type.");
|
||||
object oPC = GetPCSpeaker(); // The PC object
|
||||
string sName; // Variable to hold the racial type name
|
||||
int racialType; // Variable for the racial type
|
||||
|
||||
// Loop through the specified racial types
|
||||
for (racialType = 0; racialType <= 52; racialType++) // Covers all the default racialtypes + ooze & plant
|
||||
{
|
||||
// Only list specific racial groups
|
||||
if (racialType == 0 || racialType == 1 || racialType == 2 || racialType == 3 || racialType == 4 ||
|
||||
racialType == 5 || racialType == 6 || racialType == 7 || racialType == 8 || racialType == 9 ||
|
||||
racialType == 10 || racialType == 11 || racialType == 12 || racialType == 13 || racialType == 14 ||
|
||||
racialType == 15 || racialType == 16 || racialType == 17 || racialType == 18 || racialType == 19 ||
|
||||
racialType == 20 || racialType == 23 || racialType == 24 || racialType == 25 || racialType == 29 ||
|
||||
racialType == 52)
|
||||
{
|
||||
// Get the racial type name using the current racial type integer
|
||||
sName = Get2DACache("racialtypes", "Constant", racialType); // Use racialType to get the name
|
||||
|
||||
// Only add to the conversation if sName is not empty
|
||||
if (sName != "")
|
||||
{
|
||||
AddChoice(sName, racialType, oPC); // Add the choice to the conversation
|
||||
}
|
||||
}
|
||||
}
|
||||
/* // Set the header
|
||||
SetHeader("Choose racial type.");
|
||||
int i;
|
||||
for (i=0; i <=254; i++)
|
||||
{
|
||||
string sName = Get2daCache("racialtypes", "Constant", i);
|
||||
// Add responses for the PC
|
||||
if(sName != "")
|
||||
{
|
||||
AddChoice(sName, i, oPC);
|
||||
}
|
||||
} */
|
||||
|
||||
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
||||
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
||||
}
|
||||
//add more stages for more nodes with Else If clauses
|
||||
}
|
||||
|
||||
// Do token setup
|
||||
SetupTokens();
|
||||
}
|
||||
// End of conversation cleanup
|
||||
else if(nValue == DYNCONV_EXITED)
|
||||
{
|
||||
// Add any locals set through this conversation
|
||||
}
|
||||
// Abort conversation cleanup.
|
||||
// NOTE: This section is only run when the conversation is aborted
|
||||
// while aborting is allowed. When it isn't, the dynconvo infrastructure
|
||||
// handles restoring the conversation in a transparent manner
|
||||
else if(nValue == DYNCONV_ABORTED)
|
||||
{
|
||||
// Add any locals set through this conversation
|
||||
}
|
||||
// Handle PC responses
|
||||
else
|
||||
{
|
||||
// variable named nChoice is the value of the player's choice as stored when building the choice list
|
||||
// variable named nStage determines the current conversation node
|
||||
int nChoice = GetChoice(oPC);
|
||||
if(nStage == STAGE_ENTRY)
|
||||
{
|
||||
int n2daLine = nChoice--;
|
||||
SetLocalInt(oPC, "BladebaneRace", n2daLine);
|
||||
// Move to another stage based on response, for example
|
||||
//nStage = STAGE_QUUX;
|
||||
}
|
||||
|
||||
// Store the stage value. If it has been changed, this clears out the choices
|
||||
SetStage(nStage, oPC);
|
||||
}
|
||||
}
|
61
Notes/future spells/sp_angelskin.nss
Normal file
61
Notes/future spells/sp_angelskin.nss
Normal file
@@ -0,0 +1,61 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Name Angelskin
|
||||
//:: FileName sp_angelskin.nss
|
||||
//:://////////////////////////////////////////////
|
||||
/** @file
|
||||
Abjuration [Good]
|
||||
Level: Paladin 2
|
||||
Components: V, S, DF,
|
||||
Casting Time: 1 standard action
|
||||
Range: Touch
|
||||
Target: Lawful good creature touched
|
||||
Duration: 1 round/level
|
||||
Saving Throw: Will negates (harmless)
|
||||
Spell Resistance: Yes (harmless)
|
||||
|
||||
You touch your ally with the holy symbol and invoke the blessed words. An opalescent
|
||||
glow spreads across her skin, imbuing it with a pearl-like sheen.
|
||||
|
||||
The subject gains damage reduction 5/evil.
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Tenjac
|
||||
//:: Created On: 1/22/21
|
||||
//:: Updated by: Jaysyn
|
||||
//:: Updated on: 2024-10-01 08:58:45
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_sp_func"
|
||||
#include "prc_add_spell_dc"
|
||||
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
|
||||
PRCSetSchool(SPELL_SCHOOL_ABJURATION);
|
||||
object oPC = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
float fDur = RoundsToSeconds(nCasterLvl);
|
||||
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
{
|
||||
fDur += fDur;
|
||||
}
|
||||
|
||||
// Alignment check
|
||||
if((GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD) && (GetAlignmentLawChaos(oTarget) == ALIGNMENT_LAWFUL))
|
||||
{
|
||||
effect eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_THREE, 0);
|
||||
effect eVFX = EffectVisualEffect(VFX_DUR_AURA_WHITE);
|
||||
effect eSpell = EffectLinkEffects(eDR, eVFX);
|
||||
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSpell, oTarget, fDur);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Invalid target alignment
|
||||
SendMessageToPC(oPC, "This spell must target a lawful good creature.");
|
||||
}
|
||||
}
|
69
Notes/future spells/sp_bladebane.nss
Normal file
69
Notes/future spells/sp_bladebane.nss
Normal file
@@ -0,0 +1,69 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Name Bladebane
|
||||
//:: FileName sp_bladebane.nss
|
||||
//:://////////////////////////////////////////////
|
||||
/** @file Transmutation
|
||||
Level: Paladin 2, Cleric 3, Sorcerer 4, Wizard 4,
|
||||
Components: V, S, M,
|
||||
Casting Time: 1 standard action
|
||||
Range: Touch
|
||||
Target: Weapon touched
|
||||
Duration: 1 round/level
|
||||
Saving Throw: Will negates (harmless, object)
|
||||
Spell Resistance: Yes (harmless, object)
|
||||
|
||||
You impart a deadly quality to a single bladed weapon
|
||||
(any slashing weapon) for a short time.
|
||||
Bladebane confers the bane ability on the weapon touched,
|
||||
against a creature type (and subtype, if necessary) of
|
||||
your choice.
|
||||
The weapon's enhancement bonus increases by +2 against
|
||||
the appropriate creature type, and it deals +2d6 points
|
||||
of bonus damage to those creatures.
|
||||
|
||||
Material Component: A drop of blood and ruby dust worth 500 gp.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Tenjac
|
||||
//:: Created On: 7/27/2022
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_sp_func"
|
||||
#include "prc_add_spell_dc"
|
||||
#include "inc_dynconv"
|
||||
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
|
||||
object oPC = OBJECT_SELF;
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
float fDur = RoundsToSeconds(nCasterLvl);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
if(nMetaMagic & METAMAGIC_EXTEND) fDur += fDur;
|
||||
object oWeapon = PRCGetSpellTargetObject();
|
||||
|
||||
//only bladed
|
||||
if(GetDamageTypeOfWeapon(oWeapon) != DAMAGE_TYPE_SLASHING)
|
||||
{
|
||||
SendMessageToPC(oPC, "Invalid target. This spell must target slashing weapons.");
|
||||
return;
|
||||
}
|
||||
|
||||
//+2 increase
|
||||
int nBonus = IPGetWeaponEnhancementBonus(oWeapon) + 2;
|
||||
|
||||
//convo for race
|
||||
SetLocalInt(oPC, "BladebaneRace");
|
||||
StartDynamicConversation("prc_c_bladebane", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||
|
||||
int nRace = GetLocalInt(oPC, "BladebaneRace");
|
||||
|
||||
itemproperty iEnhance = ItemPropertyEnhancementBonusVsRace(nRace, nBonus);
|
||||
itemproperty iDam = ItemPropertyDamageBonusVsRace(nRace, IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGEBONUS_2d6);
|
||||
|
||||
IPSafeAddItemProperty(oWeapon, iEnhance, fDur);
|
||||
IPSafeAddItemProperty(oWeapon, iDam, fDur);
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
114
Notes/future spells/sp_unmovobj.nss
Normal file
114
Notes/future spells/sp_unmovobj.nss
Normal file
@@ -0,0 +1,114 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Name Unmovable Object
|
||||
//:: FileName sp_unmovobj.nss
|
||||
//:://////////////////////////////////////////////
|
||||
/** @file Evocation
|
||||
Level: Paladin 4,
|
||||
Components: V, S,
|
||||
Casting Time: 1 action
|
||||
Range: Personal
|
||||
Target: You
|
||||
Duration: 1 round/level
|
||||
|
||||
Charging yourself with divine energy, you bond yourself
|
||||
to the ground beneath your feet and become the epitome
|
||||
of stability.
|
||||
The spell ends instantly if you move from your current
|
||||
position and does not work unless you are in contact
|
||||
with the ground.
|
||||
|
||||
You gain a +2 bonus to Strength, a +4 bonus to Constitution,
|
||||
a +2 resistance bonus on saving throws, and a +4 dodge
|
||||
bonus to AC.
|
||||
|
||||
You gain a +10 bonus to resist a bull rush (this bonus does
|
||||
not include the +4 bonus for being "exceptionally stable",
|
||||
but exceptionally stable creatures do get that bonus in
|
||||
addition to the bonus from this spell).
|
||||
|
||||
You gain a +10 bonus to resist all trip attacks (but not
|
||||
to your attempts to trip someone in return).
|
||||
|
||||
You gain a +10 resistance bonus on any roll made to resist
|
||||
an effect that would cause you to move from your current
|
||||
location.
|
||||
|
||||
For example, while you are not immune to enchantment
|
||||
effects, you gain a +10 resistance bonus on saving throws
|
||||
(or Charisma checks, in the case of effects such as charm
|
||||
person) to resist commands that would cause you to leave
|
||||
your current position.
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Tenjac
|
||||
//:: Created On: 8/4/22
|
||||
//:: Updated By: Jaysyn
|
||||
//:: Updated on: 2024-10-01 09:23:56
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_sp_func"
|
||||
#include "prc_add_spell_dc"
|
||||
|
||||
void StillCheck(object oPC, float fDur, location lLoc)
|
||||
{
|
||||
if (!GetIsInCombat(oPC) || GetLocation(oPC) != lLoc)
|
||||
{
|
||||
effect eToDispel = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eToDispel))
|
||||
{
|
||||
if (GetEffectSpellId(eToDispel) == SPELL_UNMOVABLE_OBJECT)
|
||||
{
|
||||
RemoveEffect(oPC, eToDispel);
|
||||
}
|
||||
eToDispel = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DelayCommand(1.0f, StillCheck(oPC, fDur - 1.0f, lLoc));
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
if (!X2PreSpellCastCode()) return;
|
||||
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION); // Set spell school
|
||||
|
||||
object oPC = OBJECT_SELF;
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
float fDur = RoundsToSeconds(nCasterLvl);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
|
||||
if (nMetaMagic & METAMAGIC_EXTEND)
|
||||
{
|
||||
fDur += fDur;
|
||||
}
|
||||
|
||||
// Delay to check if combat has ended, if so remove the effects
|
||||
DelayCommand(1.0f, StillCheck(oPC, fDur - 1.0f, GetLocation(oPC)));
|
||||
|
||||
// Apply cutscene immobilization
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneImmobilize(), oPC, fDur);
|
||||
|
||||
// Apply ability increases: +2 STR, +4 CON
|
||||
effect eLink = EffectLinkEffects(EffectAbilityIncrease(ABILITY_STRENGTH, 2),
|
||||
EffectAbilityIncrease(ABILITY_CONSTITUTION, 4));
|
||||
|
||||
// Apply +2 to all saving throws
|
||||
eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, 2, SAVING_THROW_TYPE_ALL));
|
||||
|
||||
// Apply +4 dodge bonus to AC
|
||||
eLink = EffectLinkEffects(eLink, EffectACIncrease(4, AC_DODGE_BONUS));
|
||||
|
||||
// Apply +10 resistance vs fear effects (to resist effects that move the target)
|
||||
eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, 10, SAVING_THROW_TYPE_FEAR));
|
||||
|
||||
// Apply all linked effects to the caster
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, fDur);
|
||||
|
||||
// Apply visual effect for AC bonus
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), oPC);
|
||||
|
||||
PRCSetSchool(); // Reset spell school (correctly used)
|
||||
}
|
Reference in New Issue
Block a user