This commit is contained in:
@@ -27,9 +27,6 @@
|
||||
1734 - Turn_Blightspawned
|
||||
2259 - turn outsider
|
||||
3497 - Turn cold
|
||||
25992 - FEAT_PLANT_DEFIANCE
|
||||
25993 - FEAT_PLANT_CONTROL
|
||||
|
||||
*/
|
||||
|
||||
#include "prc_inc_clsfunc"
|
||||
@@ -60,7 +57,7 @@ void main()
|
||||
}
|
||||
|
||||
// Because Turn Undead/Outsider isn't from a domain, skip this check
|
||||
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER && nTurnType != SPELL_PLANT_DEFIANCE && nTurnType != SPELL_PLANT_CONTROL)
|
||||
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER)
|
||||
{
|
||||
// Used by the uses per day check code for bonus domains
|
||||
if(!DecrementDomainUses(GetTurningDomain(nTurnType), OBJECT_SELF))
|
||||
@@ -213,37 +210,7 @@ void main()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nTurnOrRebuke == ACTION_TURN)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUNSTRIKE), oTest);
|
||||
|
||||
// If target's HD < half level we would normally destroy.
|
||||
// For plants targeted by Plant Defiance/Control, never destroy <20> apply non-lethal outcome instead.
|
||||
if(nTargetHD < nLevel/2)
|
||||
{
|
||||
if(nTargetRace == RACIAL_TYPE_PLANT
|
||||
&& (nTurnType == SPELL_PLANT_DEFIANCE || nTurnType == SPELL_PLANT_CONTROL))
|
||||
{
|
||||
// For Turn-type (Plant Defiance) -> DoTurn (fear)
|
||||
// For Control-type (Plant Control) -> DoCommand (dominate)
|
||||
if(nTurnType == SPELL_PLANT_DEFIANCE)
|
||||
DelayCommand(0.0, DoTurn(oTest));
|
||||
else
|
||||
DelayCommand(0.0, DoCommand(oTest));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Default: destroy
|
||||
DelayCommand(0.0, DoDestroy(oTest));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DoTurn(oTest);
|
||||
}
|
||||
}
|
||||
|
||||
/* if(nTurnOrRebuke == ACTION_TURN)
|
||||
if(nTurnOrRebuke == ACTION_TURN)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUNSTRIKE), oTest);
|
||||
//if half of level, destroy
|
||||
@@ -252,7 +219,7 @@ void main()
|
||||
DelayCommand(0.0, DoDestroy(oTest));
|
||||
else
|
||||
DoTurn(oTest);
|
||||
} */
|
||||
}
|
||||
else
|
||||
{
|
||||
bDisplayCommandMessage = TRUE;
|
||||
|
@@ -52,9 +52,8 @@ void main()
|
||||
effect ePoly;
|
||||
int nPoly;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nDuration = GetLevelByClass(CLASS_TYPE_DRUID, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_ARCANE_HIEROPHANT, oPC);
|
||||
int nDuration = GetLevelByClass(CLASS_TYPE_DRUID, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_ARCANE_HIEROPHANT, oPC);
|
||||
|
||||
int bShiftingDruid = GetLocalInt(GetModule(),"PRC_DRUID_USES_SHIFTING");
|
||||
|
||||
|
@@ -1,117 +0,0 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//::///////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Adrenaline Surge
|
||||
Transmutation
|
||||
Level: Druid 2, Sor/Wiz 2
|
||||
Components: V, S, DF
|
||||
Casting Time: 1 action
|
||||
Range: Close (25 ft. + 5 fr./2 levels)
|
||||
Area: Your summoned creatures within a spherical
|
||||
emanation with a radius equal to the range, centered on you
|
||||
Duration: 1 round/level
|
||||
Saving Throw: Will negates (harmless)
|
||||
Spell Resistance: Yes (harmless)
|
||||
|
||||
Each of your summoned creatures within the area receives
|
||||
a +4 enhancement bonus to Strength. This effect lasts until
|
||||
the spell ends or the creature leaves the area.
|
||||
|
||||
*/
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Script: sp_adrenaline
|
||||
//:: Author: Jaysyn
|
||||
//:: Created: 2025-08-11 22:28:40
|
||||
//:://////////////////////////////////////////////
|
||||
#include "x2_inc_spellhook"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
|
||||
// Helper function to remove the adrenaline surge effect from the target
|
||||
void RemoveAdrenalineEffect(object oTarget)
|
||||
{
|
||||
if (!GetIsObjectValid(oTarget)) return;
|
||||
|
||||
effect e = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
effect eNext = GetNextEffect(oTarget);
|
||||
if (GetEffectTag(e) == "ADRENALINE_SURGE")
|
||||
RemoveEffect(oTarget, e);
|
||||
e = eNext;
|
||||
}
|
||||
}
|
||||
|
||||
// Checks each second if the target has moved out of range
|
||||
void CheckAdrenalineSurge(object oCaster, object oTarget, float fRange)
|
||||
{
|
||||
if (!GetIsObjectValid(oTarget) || !GetIsObjectValid(oCaster))
|
||||
return;
|
||||
|
||||
// If out of range, remove the effect early
|
||||
if (GetDistanceBetween(oTarget, oCaster) > fRange)
|
||||
{
|
||||
RemoveAdrenalineEffect(oTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
// Still valid <20> check again in 1 second
|
||||
DelayCommand(1.0, CheckAdrenalineSurge(oCaster, oTarget, fRange));
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oCaster = OBJECT_SELF;
|
||||
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||||
float fRange = 25.0 + (5.0 * IntToFloat(nCasterLevel / 2));
|
||||
float fDuration = IntToFloat(nCasterLevel) * 6.0; // in seconds
|
||||
location lCaster = GetLocation(oCaster);
|
||||
|
||||
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lCaster, TRUE, OBJECT_TYPE_CREATURE);
|
||||
|
||||
while (GetIsObjectValid(oTarget))
|
||||
{
|
||||
// Only apply to summons of this caster
|
||||
if (GetMaster(oTarget) == oCaster)
|
||||
{
|
||||
// Prevent stacking <20> skip if already has the effect
|
||||
int bHas = FALSE;
|
||||
effect eCheck = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(eCheck))
|
||||
{
|
||||
if (GetEffectTag(eCheck) == "ADRENALINE_SURGE")
|
||||
{
|
||||
bHas = TRUE;
|
||||
break;
|
||||
}
|
||||
eCheck = GetNextEffect(oTarget);
|
||||
}
|
||||
|
||||
if (!bHas)
|
||||
{
|
||||
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
|
||||
eStr = TagEffect(eStr, "ADRENALINE_SURGE");
|
||||
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_HASTE);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, 3.0);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oTarget);
|
||||
|
||||
// Schedule effect removal after the full duration
|
||||
DelayCommand(fDuration, RemoveAdrenalineEffect(oTarget));
|
||||
|
||||
// Start periodic range check
|
||||
DelayCommand(1.0, CheckAdrenalineSurge(oCaster, oTarget, fRange));
|
||||
}
|
||||
}
|
||||
|
||||
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lCaster, TRUE, OBJECT_TYPE_CREATURE);
|
||||
}
|
||||
}
|
@@ -95,10 +95,6 @@ void main()
|
||||
//Restore original max henchmen
|
||||
SetMaxHenchmen(nMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStringOnCreature("You must have celestial blood to cast this spell", oPC);
|
||||
}
|
||||
|
||||
PRCSetSchool();
|
||||
//SPGoodShift(oPC);
|
||||
|
@@ -1,134 +0,0 @@
|
||||
//::////////////////////////////////////////////////////////
|
||||
//::
|
||||
//:: Creeping Cold & Greater Creeping Cold
|
||||
//:: sp_creepingcold.nss
|
||||
//:
|
||||
//::////////////////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Creeping Cold
|
||||
Transmutation [Cold]
|
||||
Level: Drd 2
|
||||
Components: V, S, F
|
||||
Casting Time: 1 action
|
||||
Range: Close (25 ft. + 5 ft./2 levels)
|
||||
Target: One creature
|
||||
Duration: 3 rounds
|
||||
Saving Throw: Fortitude half
|
||||
Spell Resistance: Yes
|
||||
You turn the subject<63>s sweat to ice, creating blisters as
|
||||
ice forms on and inside the skin. The spell deals 1d6 cumulative
|
||||
points of cold damage per round it is in effect (that is, 1d6
|
||||
on the 1st round, 2d6 on the second, and 3d6 on the third).
|
||||
Only one save is allowed against the spell; if successful,
|
||||
it halves the damage each round.
|
||||
|
||||
Focus: A small glass or pottery vessel worth at least 25
|
||||
gp filled with ice, snow, or water.
|
||||
|
||||
Greater Creeping Cold
|
||||
Transmutation [Cold]
|
||||
Level: Drd 7
|
||||
Duration: See text
|
||||
This spell is the same as creeping cold, but it adds a fourth
|
||||
round to the duration, during which it deals 4d6 points
|
||||
of damage, if the caster is at least 15th level, it adds a fifth
|
||||
round at 5d6 points of damage. If the caster is at least
|
||||
20th level, it adds a sixth round at 6d6 points of damage
|
||||
*/
|
||||
//::
|
||||
//::////////////////////////////////////////////////////////
|
||||
//::
|
||||
//:: Created By: Jaysyn
|
||||
//:: Created on: 2025-08-07 00:18:04
|
||||
//::
|
||||
//::////////////////////////////////////////////////////////
|
||||
#include "x2_inc_spellhook"
|
||||
|
||||
void ApplyCreepingColdDamage(object oTarget, object oCaster, int nSpellID, int nMetaMagic, int nRound, int nMaxRounds, int nMaxDice, int nSave, int nEleDmg);
|
||||
|
||||
void main()
|
||||
{
|
||||
if (!X2PreSpellCastCode()) return;
|
||||
|
||||
int nSpellID = PRCGetSpellId();
|
||||
object oCaster = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nCL = PRCGetCasterLevel(oCaster);
|
||||
nCL += SPGetPenetr();
|
||||
|
||||
int nMaxRounds = 3;
|
||||
int nMaxDice = 3;
|
||||
|
||||
if (nSpellID == SPELL_GREATER_CREEPING_COLD)
|
||||
{
|
||||
nMaxRounds = 4;
|
||||
if (nCL >= 15) nMaxRounds = 5;
|
||||
if (nCL >= 20) nMaxRounds = 6;
|
||||
|
||||
nMaxDice = nMaxRounds; // capped at 6
|
||||
}
|
||||
|
||||
// Extend doubles duration but not damage cap
|
||||
if (nMetaMagic & METAMAGIC_EXTEND)
|
||||
nMaxRounds *= 2;
|
||||
|
||||
int nEleDmg = ChangedElementalDamage(oCaster, DAMAGE_TYPE_COLD);
|
||||
|
||||
if (!GetIsReactionTypeFriendly(oTarget, oCaster))
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(oCaster, nSpellID));
|
||||
|
||||
if (PRCDoResistSpell(oCaster, oTarget, nCL))
|
||||
{
|
||||
effect eFail = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eFail, oTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
int nDC = PRCGetSpellSaveDC(nSpellID, SPELL_SCHOOL_TRANSMUTATION, oCaster);
|
||||
int nSave = PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_COLD, oCaster);
|
||||
|
||||
effect eVis = ExtraordinaryEffect(EffectVisualEffect(VFX_DUR_ICESKIN));
|
||||
effect eCold = ExtraordinaryEffect(EffectVisualEffect(VFX_IMP_FROST_L));
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eCold, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nMaxRounds));
|
||||
|
||||
DelayCommand(0.0f, ApplyCreepingColdDamage(oTarget, oCaster, nSpellID, nMetaMagic, 1, nMaxRounds, nMaxDice, nSave, nEleDmg));
|
||||
}
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FROST_L), oTarget);
|
||||
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
|
||||
}
|
||||
|
||||
void ApplyCreepingColdDamage(object oTarget, object oCaster, int nSpellID, int nMetaMagic, int nRound, int nMaxRounds, int nMaxDice, int nSave, int nEleDmg)
|
||||
{
|
||||
if (GetIsDead(oTarget)) return;
|
||||
|
||||
int nDice = nRound;
|
||||
if (nDice > nMaxDice)
|
||||
nDice = nMaxDice;
|
||||
|
||||
int nDamage = d6(nDice);
|
||||
if (nMetaMagic & METAMAGIC_MAXIMIZE)
|
||||
nDamage = nDice * 6;
|
||||
else if (nMetaMagic & METAMAGIC_EMPOWER)
|
||||
nDamage += nDamage / 2;
|
||||
|
||||
nDamage += SpellDamagePerDice(oCaster, nDice);
|
||||
|
||||
if (nSave == FALSE)
|
||||
nDamage /= 2;
|
||||
|
||||
effect eVFX = EffectVisualEffect(VFX_IMP_FROST_S);
|
||||
effect eDmg = PRCEffectDamage(oTarget, nDamage, nEleDmg);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectLinkEffects(eVFX, eDmg), oTarget);
|
||||
|
||||
if (nRound < nMaxRounds)
|
||||
{
|
||||
DelayCommand(6.0f, ApplyCreepingColdDamage(oTarget, oCaster, nSpellID, nMetaMagic, nRound + 1, nMaxRounds, nMaxDice, nSave, nEleDmg));
|
||||
}
|
||||
}
|
@@ -1,119 +0,0 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Control Plants
|
||||
Transmutation
|
||||
Level: Drd 8, Plant 8
|
||||
Components: V, S, DF
|
||||
Casting Time: 1 standard action
|
||||
Range: Close (25 ft. + 5 ft./2 levels)
|
||||
Targets: Up to 2 HD/level of plant creatures,
|
||||
no two of which can be more than 30 ft.
|
||||
apart
|
||||
Duration: 1 min./level
|
||||
Saving Throw: Will negates
|
||||
Spell Resistance: No
|
||||
|
||||
This spell enables you to control the actions of one
|
||||
or more plant creatures for a short period of time. You
|
||||
command the creatures by voice and they understand you,
|
||||
no matter what language you speak. Even if vocal
|
||||
communication is impossible the controlled plants do
|
||||
not attack you. At the end of the spell, the subjects
|
||||
revert to their normal behavior.
|
||||
|
||||
Suicidal or self-destructive commands are simply ignored.
|
||||
*/
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Script: sp_ctrl_plants
|
||||
//:: Author: Jaysyn
|
||||
//:: Created: 2025-08-11 22:28:40
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_add_spell_dc"
|
||||
|
||||
void main()
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
return;
|
||||
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
|
||||
|
||||
if (GetLevelByClass(CLASS_TYPE_VERDANT_LORD, OBJECT_SELF) >= 4)
|
||||
{
|
||||
CasterLvl = CasterLvl + 3;
|
||||
}
|
||||
|
||||
int nDuration = CasterLvl; // minutes
|
||||
int nHDLimit = CasterLvl * 2; // RAW
|
||||
|
||||
if (nMetaMagic & METAMAGIC_EXTEND)
|
||||
nDuration *= 2;
|
||||
|
||||
int nPenetr = CasterLvl + SPGetPenetr();
|
||||
|
||||
// Close range in NWN terms: 25 ft. + 5 ft./2 levels
|
||||
float fMaxRange = 25.0 + (IntToFloat(CasterLvl / 2) * 5.0);
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
location lTarget = GetLocation(oTarget);
|
||||
object oCreature = GetFirstObjectInShape(SHAPE_SPHERE, fMaxRange, lTarget, TRUE);
|
||||
|
||||
while (GetIsObjectValid(oCreature) && nHDLimit > 0)
|
||||
{
|
||||
if (MyPRCGetRacialType(oCreature) == RACIAL_TYPE_PLANT
|
||||
&& !GetIsReactionTypeFriendly(oCreature)
|
||||
&& GetDistanceBetweenLocations(lTarget, GetLocation(oCreature)) <= 30.0
|
||||
&& GetHitDice(oCreature) <= nHDLimit)
|
||||
{
|
||||
// Fire cast spell at event for the specified target
|
||||
SignalEvent(oCreature, EventSpellCastAt(OBJECT_SELF, SPELL_CONTROL_PLANTS));
|
||||
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oCreature, nPenetr))
|
||||
{
|
||||
if (!PRCMySavingThrow(SAVING_THROW_WILL, oCreature, PRCGetSaveDC(oCreature, OBJECT_SELF),
|
||||
SAVING_THROW_TYPE_NONE, OBJECT_SELF, 1.0))
|
||||
{
|
||||
// Remove old domination if present
|
||||
effect eCheck = GetFirstEffect(oCreature);
|
||||
while (GetIsEffectValid(eCheck))
|
||||
{
|
||||
int nType = GetEffectType(eCheck);
|
||||
if (nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_CUTSCENE_DOMINATED)
|
||||
RemoveEffect(oCreature, eCheck);
|
||||
|
||||
eCheck = GetNextEffect(oCreature);
|
||||
}
|
||||
|
||||
// Apply domination
|
||||
effect eControl = EffectCutsceneDominated();
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_DOMINATE_S);
|
||||
effect eLink = EffectLinkEffects(eMind, eControl);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature);
|
||||
DelayCommand(1.0, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oCreature,
|
||||
MinutesToSeconds(nDuration), TRUE, -1, CasterLvl));
|
||||
|
||||
nHDLimit -= GetHitDice(oCreature);
|
||||
}
|
||||
}
|
||||
}
|
||||
oCreature = GetNextObjectInShape(SHAPE_SPHERE, fMaxRange, lTarget, TRUE);
|
||||
}
|
||||
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
}
|
@@ -167,7 +167,7 @@ void main()
|
||||
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_DEXTERITY, 2));
|
||||
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_STRENGTH, 2));
|
||||
eLink = EffectLinkEffects(eLink, EffectACDecrease(1));
|
||||
//eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_INCREASE_1));
|
||||
eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_INCREASE_1));
|
||||
eLink = TagEffect(eLink, "ARCANE_SIZE_INCREASE");
|
||||
}
|
||||
else
|
||||
@@ -176,7 +176,7 @@ void main()
|
||||
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_DEXTERITY, 2));
|
||||
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_STRENGTH, 2));
|
||||
eLink = EffectLinkEffects(eLink, EffectACIncrease(1));
|
||||
//eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_DECREASE_1));
|
||||
eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_DECREASE_1));
|
||||
eLink = TagEffect(eLink, "ARCANE_SIZE_DECREASE");
|
||||
}
|
||||
|
||||
|
@@ -1,79 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//::
|
||||
//:: Forestfold
|
||||
//:: sp_forestfold.nss
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Caster Level(s): Druid 4, Ranger 3
|
||||
School: Transmutation
|
||||
Component(s): Verbal, Somatic
|
||||
Range: Personal
|
||||
Area of Effect / Target: Caster
|
||||
Duration: 10 turns / level
|
||||
Additional Counter Spells:
|
||||
Save: None
|
||||
Spell Resistance: No
|
||||
|
||||
The caster's movement is muffled & their coloring
|
||||
changes to match their surroundings, gaining a +20
|
||||
competence bonus to any Hide and Move Silently
|
||||
checks.
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
//:: Created By: Jaysyn
|
||||
//:: Created On: 2025-08-06 12:24:24
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_add_spell_dc"
|
||||
|
||||
|
||||
void PRCDoForestfold(object oPC)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
|
||||
effect eHide = EffectSkillIncrease(SKILL_HIDE, 20);
|
||||
effect eMS = EffectSkillIncrease(SKILL_MOVE_SILENTLY, 20);
|
||||
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||||
effect eLink = EffectLinkEffects(eHide, eDur);
|
||||
|
||||
eLink = EffectLinkEffects(eLink, eMS);
|
||||
|
||||
int nDuration = 10*PRCGetCasterLevel(oPC); // * Duration 10 turn/level
|
||||
if (nMetaMagic & METAMAGIC_EXTEND) //Duration is +100%
|
||||
{
|
||||
nDuration = nDuration * 2;
|
||||
}
|
||||
|
||||
//Fire spell cast at event for target
|
||||
SignalEvent(oPC, EventSpellCastAt(oPC, SPELL_FORESTFOLD, FALSE));
|
||||
//Apply VFX impact and bonus effects
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, TurnsToSeconds(nDuration));
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
|
||||
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);
|
||||
|
||||
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||
if (!X2PreSpellCastCode()) { return; }
|
||||
|
||||
// No stacking
|
||||
PRCRemoveEffectsFromSpell(oPC, SPELL_FORESTFOLD);
|
||||
|
||||
// End of Spell Cast Hook
|
||||
PRCDoForestfold(oPC);
|
||||
|
||||
// Erasing the variable used to store the spell's spell school
|
||||
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
}
|
@@ -1,122 +0,0 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Invulnerability to Elements
|
||||
Abjuration
|
||||
Level: Druid 9
|
||||
Components: V, S, DF
|
||||
Casting Time: 1 action
|
||||
Range: Touch
|
||||
Target: Creature touched
|
||||
Duration: 10 minutes/level
|
||||
Saving Throw: None
|
||||
Spell Resistance: Yes
|
||||
|
||||
As protection from all elements, but the target creature
|
||||
becomes immune to damage from acid, cold, electricity,
|
||||
fire, and sonic damage while the spell is in effect.
|
||||
|
||||
*/
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Script: sp_inv_elements
|
||||
//:: Author: Jaysyn
|
||||
//:: Created: 2025-08-11 22:28:40
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_sp_func"
|
||||
|
||||
// Implements the spell impact
|
||||
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
|
||||
{
|
||||
int nSpellID = PRCGetSpellId();
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
|
||||
float fDuration = MinutesToSeconds(10 * nCasterLevel); // 10 min/level
|
||||
|
||||
// Extend Spell metamagic check
|
||||
if (nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDuration *= 2.0;
|
||||
|
||||
// Fire spell cast at event
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID, FALSE));
|
||||
|
||||
// Remove old versions
|
||||
PRCRemoveEffectsFromSpell(oTarget, nSpellID);
|
||||
|
||||
// Visual Effects
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_PROTECTION_ELEMENTS);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_ELEMENTAL_PROTECTION);
|
||||
effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||||
|
||||
// Immunities
|
||||
effect eImmAcid = EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100);
|
||||
effect eImmCold = EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100);
|
||||
effect eImmElec = EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100);
|
||||
effect eImmFire = EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 100);
|
||||
effect eImmSonic = EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100);
|
||||
|
||||
// Tag everything for possible later use
|
||||
eImmAcid = TagEffect(eImmAcid, "invuln_elements");
|
||||
eImmCold = TagEffect(eImmCold, "invuln_elements");
|
||||
eImmElec = TagEffect(eImmElec, "invuln_elements");
|
||||
eImmFire = TagEffect(eImmFire, "invuln_elements");
|
||||
eImmSonic = TagEffect(eImmSonic, "invuln_elements");
|
||||
eDur = TagEffect(eDur, "invuln_elements");
|
||||
eDur2 = TagEffect(eDur2, "invuln_elements");
|
||||
|
||||
// Link Effects
|
||||
effect eLink = EffectLinkEffects(eImmAcid, eImmCold);
|
||||
eLink = EffectLinkEffects(eLink, eImmElec);
|
||||
eLink = EffectLinkEffects(eLink, eImmFire);
|
||||
eLink = EffectLinkEffects(eLink, eImmSonic);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eDur2);
|
||||
|
||||
// Apply immunity effects
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, -1, nCasterLevel);
|
||||
|
||||
// Instant cast VFX
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oCaster = OBJECT_SELF;
|
||||
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||||
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
|
||||
|
||||
if (!X2PreSpellCastCode()) return;
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT);
|
||||
|
||||
if (!nEvent) // Normal cast
|
||||
{
|
||||
if (GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
|
||||
{
|
||||
SetLocalSpellVariables(oCaster, 1); // Hold the charge
|
||||
return;
|
||||
}
|
||||
DoSpell(oCaster, oTarget, nCasterLevel, nEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nEvent & PRC_SPELL_EVENT_ATTACK)
|
||||
{
|
||||
if (DoSpell(oCaster, oTarget, nCasterLevel, nEvent))
|
||||
DecrementSpellCharges(oCaster);
|
||||
}
|
||||
}
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
||||
|
||||
|
@@ -1,143 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Leonal's Roar
|
||||
//:: [sp_leonalsroar.nss]
|
||||
//:: Created by: Jaysyn
|
||||
//:: Created on: 2025-08-01 19:06:26
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Leonal's Roar
|
||||
(Book of Exalted Deeds)
|
||||
|
||||
Evocation [Good, Sonic]
|
||||
Level: Druid 8,
|
||||
Components: V
|
||||
Casting Time: 1 standard action
|
||||
Range: 40 ft.
|
||||
Target: Nongood creatures in a 40-ft.-radius spread centered on you
|
||||
Duration: Instantaneous
|
||||
Saving Throw: Fortitude partial
|
||||
Spell Resistance: Yes
|
||||
|
||||
This spell has the effect of a holy word, and it additionally
|
||||
deals 2d6 points of sonic damage to nongood creatures in the area.
|
||||
A successful Fortitude saving throw negates the sonic damage, but
|
||||
not the other effects of the spell.
|
||||
|
||||
*/
|
||||
//:
|
||||
//::///////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_alterations"
|
||||
#include "prc_add_spell_dc"
|
||||
|
||||
void main()
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
if (!X2PreSpellCastCode()) return;
|
||||
|
||||
object oTarget;
|
||||
object oCaster = OBJECT_SELF;
|
||||
|
||||
int nSpellId = PRCGetSpellId();
|
||||
int CasterLvl = PRCGetCasterLevel(oCaster);
|
||||
int nPenetr = CasterLvl + SPGetPenetr();
|
||||
int nSaveDC;// = PRCGetSpellSaveDC(9999 /*SPELL_LEONALS_ROAR*/, SPELL_SCHOOL_EVOCATION, oCaster);
|
||||
int n35ed = GetPRCSwitch(PRC_35ED_WORD_OF_FAITH);
|
||||
|
||||
// Spell visuals
|
||||
effect eDeaf = EffectDeaf();
|
||||
effect eStun = EffectStunned();
|
||||
effect eConfuse = PRCEffectConfused();
|
||||
effect eDeath = EffectDeath();
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
|
||||
effect eSmite = EffectVisualEffect(VFX_FNF_WORD);
|
||||
effect eSonicVFX = EffectVisualEffect(VFX_IMP_SONIC);
|
||||
effect eUnsummon = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
effect eLink;
|
||||
|
||||
if(nSpellId == SPELL_FOT_LEONALS_ROAR)
|
||||
{
|
||||
int nCHA = GetAbilityModifier(ABILITY_CHARISMA, oCaster);
|
||||
nSaveDC = 20 + nCHA;
|
||||
}
|
||||
else
|
||||
{
|
||||
int nSaveDC = PRCGetSpellSaveDC(SPELL_LEONALS_ROAR, SPELL_SCHOOL_EVOCATION, oCaster);
|
||||
}
|
||||
|
||||
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSmite, PRCGetSpellTargetLocation());
|
||||
|
||||
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
||||
while (GetIsObjectValid(oTarget))
|
||||
{
|
||||
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster)
|
||||
&& GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
|
||||
{
|
||||
float fDelay = PRCGetRandomDelay(0.5, 2.0);
|
||||
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_LEONALS_ROAR));
|
||||
|
||||
if (!PRCDoResistSpell(oCaster, oTarget, nPenetr, fDelay))
|
||||
{
|
||||
// Added: Leonal's Roar Sonic Damage (Fort negates)
|
||||
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, SAVING_THROW_TYPE_SONIC, oCaster, fDelay))
|
||||
{
|
||||
int nDmg = d6(2);
|
||||
effect eSonicDmg = EffectDamage(nDmg, DAMAGE_TYPE_SONIC);
|
||||
effect eSonicLink = EffectLinkEffects(eSonicVFX, eSonicDmg);
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eSonicLink, oTarget));
|
||||
}
|
||||
|
||||
// Retain Holy Word's VFX sonic flash for hit feedback
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eSonicVFX, oTarget);
|
||||
|
||||
if (GetIsObjectValid(GetMaster(oTarget)))
|
||||
{
|
||||
if (GetAssociateType(oTarget) == ASSOCIATE_TYPE_SUMMONED)
|
||||
{
|
||||
DeathlessFrenzyCheck(oTarget);
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eUnsummon, oTarget));
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(eDeath), oTarget));
|
||||
}
|
||||
}
|
||||
else if (!PRCGetHasEffect(EFFECT_TYPE_DEAF, oTarget))
|
||||
{
|
||||
int nHD = GetHitDice(oTarget);
|
||||
|
||||
// Deaf 1d4 rounds
|
||||
eLink = EffectLinkEffects(eDur, eDeaf);
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(d4()), TRUE, -1, CasterLvl));
|
||||
|
||||
if ((nHD < 12 && !n35ed) || (n35ed && nHD < CasterLvl))
|
||||
{
|
||||
eLink = EffectLinkEffects(eMind, eStun);
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(1), TRUE, -1, CasterLvl));
|
||||
}
|
||||
|
||||
if ((nHD < 8 && n35ed) || (n35ed && nHD < CasterLvl - 5))
|
||||
{
|
||||
eLink = EffectLinkEffects(eSonicVFX, eConfuse);
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(d10()), TRUE, -1, CasterLvl));
|
||||
}
|
||||
|
||||
if ((nHD < 4 && n35ed) || (n35ed && nHD < CasterLvl - 10))
|
||||
{
|
||||
DeathlessFrenzyCheck(oTarget);
|
||||
if (!GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH))
|
||||
{
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
||||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
||||
}
|
||||
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
}
|
@@ -60,66 +60,100 @@ Created: 6/20/06
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
|
||||
//Declare main variables.
|
||||
int nEvent = GetRunningEvent();
|
||||
object oPC;
|
||||
switch(nEvent)
|
||||
{
|
||||
case EVENT_ONHEARTBEAT: oPC = OBJECT_SELF; break;
|
||||
|
||||
default:
|
||||
oPC = OBJECT_SELF;
|
||||
}
|
||||
|
||||
PRCSetSchool(SPELL_SCHOOL_ABJURATION);
|
||||
|
||||
object oPC = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nSpell = GetSpellId();
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
int nAlign = GetAlignmentGoodEvil(oTarget);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
float fDur = HoursToSeconds(nCasterLvl);
|
||||
|
||||
if(nAlign == ALIGNMENT_GOOD)
|
||||
if(nEvent == FALSE)
|
||||
{
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDur += fDur;
|
||||
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nSpell = GetSpellId();
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
int nAlign = GetAlignmentGoodEvil(oTarget);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
float fDur = HoursToSeconds(nCasterLvl);
|
||||
|
||||
//VFX
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUPER_HEROISM), oTarget);
|
||||
if(nAlign == ALIGNMENT_GOOD)
|
||||
{
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDur += fDur;
|
||||
|
||||
//Light as a daylight spell, AoE for attack penalty
|
||||
effect eLight = EffectLinkEffects(EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20), EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||
eLight = EffectLinkEffects(eLight, EffectAreaOfEffect(AOE_MOB_LUMINOUS_ARMOR));
|
||||
//VFX
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUPER_HEROISM), oTarget);
|
||||
|
||||
int nArmor;
|
||||
int nLevel = GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION);
|
||||
//Light as a daylight spell, AoE for attack penalty
|
||||
effect eLight = EffectLinkEffects(EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20), EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||
eLight = EffectLinkEffects(eLight, EffectAreaOfEffect(AOE_MOB_LUMINOUS_ARMOR));
|
||||
|
||||
int nArmor;
|
||||
int nLevel = GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION);
|
||||
|
||||
|
||||
if(nSpell == SPELL_LUMINOUS_ARMOR)
|
||||
{
|
||||
nArmor = nLevel + 5;
|
||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d2(1), 0);
|
||||
}
|
||||
if(nSpell == SPELL_LUMINOUS_ARMOR)
|
||||
{
|
||||
nArmor = nLevel + 5;
|
||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d2(1), 0);
|
||||
}
|
||||
|
||||
else if(nSpell == SPELL_GREATER_LUMINOUS_ARMOR)
|
||||
{
|
||||
nArmor = nLevel + 8;
|
||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d3(), 0);
|
||||
}
|
||||
else if(nSpell == SPELL_GREATER_LUMINOUS_ARMOR)
|
||||
{
|
||||
nArmor = nLevel + 8;
|
||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d3(), 0);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
PRCRemoveEffectsFromSpell(oTarget, SPELL_LUMINOUS_ARMOR);
|
||||
PRCRemoveEffectsFromSpell(oTarget, SPELL_GREATER_LUMINOUS_ARMOR);
|
||||
PRCRemoveEffectsFromSpell(oTarget, SPELL_LUMINOUS_ARMOR);
|
||||
PRCRemoveEffectsFromSpell(oTarget, SPELL_GREATER_LUMINOUS_ARMOR);
|
||||
RemoveEventScript(oPC, EVENT_ONHEARTBEAT, "sp_lumins_armr", TRUE, FALSE);
|
||||
|
||||
effect eArmor = EffectACIncrease(nArmor, AC_ARMOUR_ENCHANTMENT_BONUS, AC_VS_DAMAGE_TYPE_ALL);
|
||||
eArmor = EffectLinkEffects(eArmor, eLight);
|
||||
effect eArmor = EffectACIncrease(nArmor, AC_ARMOUR_ENCHANTMENT_BONUS, AC_VS_DAMAGE_TYPE_ALL);
|
||||
eArmor = EffectLinkEffects(eArmor, eLight);
|
||||
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eArmor, oTarget, fDur);
|
||||
object oArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
||||
if (GetBaseAC(oArmour) > 0)
|
||||
{
|
||||
ForceUnequip(oPC, oArmour, INVENTORY_SLOT_CHEST);
|
||||
SendMessageToPC(oPC, "You cannot wear armor while under the effects of Luminous Armour");
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
|
||||
//Sanctified spells get mandatory 10 pt good adjustment, regardless of switch
|
||||
AdjustAlignment(oPC, ALIGNMENT_GOOD, 10, FALSE);
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eArmor, oTarget, fDur);
|
||||
object oArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
||||
if (GetBaseAC(oArmour) > 0)
|
||||
{
|
||||
ForceUnequip(oPC, oArmour, INVENTORY_SLOT_CHEST);
|
||||
SendMessageToPC(oPC, "You cannot wear armor while under the effects of Luminous Armour");
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
|
||||
AddEventScript(oPC, EVENT_ONHEARTBEAT, "sp_lumins_armr", TRUE, FALSE);
|
||||
DelayCommand(fDur, RemoveEventScript(oPC, EVENT_ONHEARTBEAT, "sp_lumins_armr", TRUE, FALSE));
|
||||
//Sanctified spells get mandatory 10 pt good adjustment, regardless of switch
|
||||
AdjustAlignment(oPC, ALIGNMENT_GOOD, 10, FALSE);
|
||||
}
|
||||
else if(nEvent == EVENT_ONHEARTBEAT)
|
||||
{
|
||||
if(GetHasSpellEffect(SPELL_LUMINOUS_ARMOR, oPC) || GetHasSpellEffect(SPELL_GREATER_LUMINOUS_ARMOR, oPC))
|
||||
{
|
||||
object oArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
||||
if (GetBaseAC(oArmour) > 0)
|
||||
{
|
||||
ForceUnequip(oPC, oArmour, INVENTORY_SLOT_CHEST);
|
||||
SendMessageToPC(oPC, "You cannot wear armor while under the effects of Luminous Armour");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PRCRemoveEffectsFromSpell(oPC, SPELL_LUMINOUS_ARMOR);
|
||||
PRCRemoveEffectsFromSpell(oPC, SPELL_GREATER_LUMINOUS_ARMOR);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,102 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Regenerate Ring / Circle
|
||||
//:: sp_regen_ring_circle.nss
|
||||
//:: Jaysyn - PRC8 2025-08-01
|
||||
//::
|
||||
//:: Group fast healing aura spells
|
||||
//::///////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
if (!X2PreSpellCastCode()) return;
|
||||
|
||||
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
|
||||
|
||||
object oCaster = OBJECT_SELF;
|
||||
int nSpellId = PRCGetSpellId();
|
||||
int nMetamagic = PRCGetMetaMagicFeat();
|
||||
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||||
int nDuration = 10 + (nCasterLevel / 2);
|
||||
int nMaxTargets = nCasterLevel / 2;
|
||||
float fMaxDistance = 30.0;
|
||||
int nRegenRate = 1;
|
||||
|
||||
if (nSpellId == SPELL_REGEN_CIRCLE)
|
||||
{
|
||||
nRegenRate = 3;
|
||||
}
|
||||
|
||||
if (nMetamagic == METAMAGIC_EXTEND)
|
||||
{
|
||||
nDuration *= 2;
|
||||
}
|
||||
|
||||
location lCaster = GetLocation(oCaster);
|
||||
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
|
||||
int nCount = 0;
|
||||
|
||||
while (GetIsObjectValid(oTarget) && nCount < nMaxTargets)
|
||||
{
|
||||
if (!GetIsEnemy(oCaster, oTarget) &&
|
||||
GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
|
||||
GetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
||||
{
|
||||
int nCurrentHP = GetCurrentHitPoints(oTarget);
|
||||
int nInitialHP = GetLocalInt(oTarget, "INITIAL_HIT_POINTS");
|
||||
|
||||
if (nCurrentHP > nInitialHP)
|
||||
{
|
||||
nInitialHP = nCurrentHP;
|
||||
SetLocalInt(oTarget, "INITIAL_HIT_POINTS", nInitialHP);
|
||||
}
|
||||
|
||||
int nCurrentRegen = GetLocalInt(oTarget, "REGEN_RATE");
|
||||
int nExistingDuration = 0;
|
||||
int bSameSpell = FALSE;
|
||||
|
||||
effect e = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == "REGEN_WOUNDS")
|
||||
{
|
||||
if (nCurrentRegen == nRegenRate)
|
||||
{
|
||||
bSameSpell = TRUE;
|
||||
nExistingDuration = GetEffectDurationRemaining(e) / 6;
|
||||
if (nRegenRate >= nCurrentRegen) RemoveEffect(oTarget, e);
|
||||
else return;
|
||||
}
|
||||
else if (nRegenRate >= nCurrentRegen)
|
||||
{
|
||||
RemoveEffect(oTarget, e);
|
||||
}
|
||||
}
|
||||
e = GetNextEffect(oTarget);
|
||||
}
|
||||
|
||||
if (bSameSpell)
|
||||
{
|
||||
nDuration += nExistingDuration;
|
||||
}
|
||||
|
||||
SetLocalInt(oTarget, "REGEN_RATE", nRegenRate);
|
||||
SetLocalInt(oTarget, "REGEN_WOUNDS_REMAINING", nDuration);
|
||||
|
||||
effect eVis = EffectVisualEffect(1330/* VFX_DUR_BF_IOUN_STONE_GREEN */);
|
||||
effect eRegen = EffectRunScript("rs_regen_wounds", "rs_regen_wounds", "rs_regen_wounds", 6.0f, IntToString(nRegenRate));
|
||||
eRegen = SetEffectSpellId(eRegen, nSpellId);
|
||||
eRegen = EffectLinkEffects(eVis, eRegen);
|
||||
eRegen = TagEffect(eRegen, "REGEN_WOUNDS");
|
||||
|
||||
PRCRemoveEffectsFromSpell(oTarget, nSpellId);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRegen, oTarget, RoundsToSeconds(nDuration));
|
||||
|
||||
nCount++;
|
||||
}
|
||||
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
|
||||
}
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
@@ -39,130 +39,10 @@ dead after being hit by a fireball).
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Stratovarius
|
||||
//:: Created On: August 20, 2004
|
||||
//::
|
||||
//:: Fixed By: Jaysyn
|
||||
//:: Fixed On: July 24, 2025
|
||||
//:://////////////////////////////////////////////
|
||||
#include "nw_inc_gff"
|
||||
|
||||
#include "prc_inc_spells"
|
||||
|
||||
// Validates and tracks mirror image alignment with master
|
||||
void TrackMirrorImage(object oSummoned)
|
||||
{
|
||||
DoDebug("sp_mirror >> TrackMirrorImage: Running.");
|
||||
|
||||
if (!GetIsObjectValid(oSummoned))
|
||||
{
|
||||
DoDebug("sp_mirror >> TrackMirrorImage: oSummoned invalid.");
|
||||
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
object oMaster = GetLocalObject(oSummoned, "oMaster");
|
||||
if (!GetIsObjectValid(oMaster))
|
||||
{
|
||||
DoDebug("sp_mirror >> TrackMirrorImage: oMaster invalid.");
|
||||
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
float fRelX = GetLocalFloat(oSummoned, "rel_x");
|
||||
float fRelY = GetLocalFloat(oSummoned, "rel_y");
|
||||
|
||||
vector vMaster = GetPosition(oMaster);
|
||||
float fFacing = GetFacing(oMaster);
|
||||
float fRadians = fFacing * 3.14159 / 180.0;
|
||||
|
||||
// Apply facing-based 2D rotation to the stored offset
|
||||
float fX = vMaster.x + fRelX * cos(fRadians) - fRelY * sin(fRadians);
|
||||
float fY = vMaster.y + fRelX * sin(fRadians) + fRelY * cos(fRadians);
|
||||
|
||||
location lTarget = Location(GetArea(oMaster), Vector(fX, fY, vMaster.z), fFacing);
|
||||
|
||||
// Ensure these commands only execute under needed context
|
||||
AssignCommand(oSummoned, ClearAllActions());
|
||||
AssignCommand(oSummoned, ActionJumpToLocation(lTarget));
|
||||
|
||||
// Schedule next update in 0.25 seconds
|
||||
DelayCommand(0.1, TrackMirrorImage(oSummoned));
|
||||
}
|
||||
|
||||
// Initializes the summoning and tracking system
|
||||
void StartMirrorImageTracking(object oSummoned, object oMaster)
|
||||
{
|
||||
if (!GetIsObjectValid(oMaster))
|
||||
{
|
||||
DoDebug("sp_mirror >> StartMirrorImageTracking: oMaster invalid.");
|
||||
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
vector vMaster = GetPosition(oMaster);
|
||||
vector vSummoned = GetPosition(oSummoned);
|
||||
|
||||
float fRelX = vSummoned.x - vMaster.x;
|
||||
float fRelY = vSummoned.y - vMaster.y;
|
||||
|
||||
SetLocalFloat(oSummoned, "rel_x", fRelX);
|
||||
SetLocalFloat(oSummoned, "rel_y", fRelY);
|
||||
SetLocalObject(oSummoned, "summoner", oMaster);
|
||||
|
||||
SetLocalObject(oSummoned, "oMaster", oMaster);
|
||||
|
||||
DoDebug("sp_mirror >> StartMirrorImageTracking: Firing TrackMirrorImage().");
|
||||
TrackMirrorImage(oSummoned);
|
||||
}
|
||||
|
||||
void SetMirrorImageScripts(object oImage)
|
||||
{
|
||||
string sTag = GetTag(oImage);
|
||||
|
||||
if(DEBUG) DoDebug("sp_mirror >> SetMirrorImageScripts: Setting OnSpellCastAt script on "+ sTag +".");
|
||||
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DEATH, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_NOTICE, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_RESTED, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, "");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "mirror_image_sa");
|
||||
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "");
|
||||
}
|
||||
|
||||
json JsonModifyRacialType(json jCreature, int nNewRacialType)
|
||||
{
|
||||
if(DEBUG)DoDebug("sp_mirror >> JsonModifyRacialType: Entering function");
|
||||
|
||||
// Retrieve the RacialType field
|
||||
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
|
||||
|
||||
if (JsonGetType(jRacialTypeField) == JSON_TYPE_NULL)
|
||||
{
|
||||
DoDebug("sp_mirror >> JsonModifyRacialType: JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
||||
//SpeakString("JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
||||
return JsonNull();
|
||||
}
|
||||
|
||||
// Retrieve the value to modify
|
||||
json jRacialTypeValue = JsonObjectGet(jRacialTypeField, "value");
|
||||
|
||||
if (JsonGetType(jRacialTypeValue) != JSON_TYPE_INTEGER)
|
||||
{
|
||||
DoDebug("sp_mirror >> JsonModifyRacialType: JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
||||
//SpeakString("JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
||||
return JsonNull();
|
||||
}
|
||||
|
||||
jCreature = GffReplaceByte(jCreature, "Race", nNewRacialType);
|
||||
|
||||
// Return the new creature object
|
||||
return jCreature;
|
||||
}
|
||||
|
||||
void CleanCopy(object oImage)
|
||||
{
|
||||
@@ -227,38 +107,22 @@ void CleanCopy(object oImage)
|
||||
void MakeMoreImages(object oImage, int iImages, int nDuration)
|
||||
{
|
||||
string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror";
|
||||
|
||||
object oMaster = OBJECT_SELF;
|
||||
|
||||
if (!GetIsObjectValid(oMaster))
|
||||
{
|
||||
DoDebug("sp_mirror >> MakeMoreImages: oMaster invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
SetLocalObject(oImage, "oMaster", oMaster);
|
||||
|
||||
effect //eImage = EffectCutsceneParalyze();
|
||||
effect eImage = EffectCutsceneParalyze();
|
||||
eImage = SupernaturalEffect(eImage);
|
||||
effect eGhost = EffectCutsceneGhost();
|
||||
eGhost = SupernaturalEffect(eGhost);
|
||||
effect eNoSpell = EffectSpellFailure(100);
|
||||
eNoSpell = SupernaturalEffect(eNoSpell);
|
||||
effect eSpeed = EffectMovementSpeedIncrease(200);
|
||||
eSpeed = SupernaturalEffect(eSpeed);
|
||||
|
||||
int iPlus;
|
||||
for (iPlus = 0; iPlus < iImages; iPlus++)
|
||||
{
|
||||
object oImage2 = CopyObject(oImage, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage2);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage2);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage2);
|
||||
ChangeFaction(oImage2, oImage);
|
||||
SetIsTemporaryFriend(OBJECT_SELF, oImage2, FALSE);
|
||||
DelayCommand(0.0f, SetMirrorImageScripts(oImage2));
|
||||
DelayCommand(0.5f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage2));
|
||||
StartMirrorImageTracking(oImage2, OBJECT_SELF);
|
||||
DelayCommand(3.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage2));
|
||||
DestroyObject(oImage2, TurnsToSeconds(nDuration)); // they dissapear after a minute per level
|
||||
}
|
||||
}
|
||||
@@ -281,9 +145,7 @@ void RemoveExtraImages()
|
||||
|
||||
void main2()
|
||||
{
|
||||
object oCaster = OBJECT_SELF;
|
||||
|
||||
int iLevel = PRCGetCasterLevel(oCaster);
|
||||
int iLevel = PRCGetCasterLevel(OBJECT_SELF);
|
||||
int iAdd = iLevel/3;
|
||||
int iImages = d4(1) + iAdd;
|
||||
if(iImages >8)
|
||||
@@ -294,64 +156,37 @@ void main2()
|
||||
if (CheckMetaMagic(nMetaMagic, METAMAGIC_EXTEND))
|
||||
{
|
||||
nDuration = nDuration *2; //Duration is +100%
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string sImage = "PC_IMAGE"+ObjectToString(oCaster)+"mirror";
|
||||
string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror";
|
||||
|
||||
effect //eImage = EffectCutsceneParalyze();
|
||||
effect eImage = EffectCutsceneParalyze();
|
||||
eImage = SupernaturalEffect(eImage);
|
||||
effect eGhost = EffectCutsceneGhost();
|
||||
eGhost = SupernaturalEffect(eGhost);
|
||||
effect eNoSpell = EffectSpellFailure(100);
|
||||
eNoSpell = SupernaturalEffect(eNoSpell);
|
||||
effect eSpeed = EffectMovementSpeedIncrease(200);
|
||||
eSpeed = SupernaturalEffect(eSpeed);
|
||||
|
||||
//:: Convert to a construct.
|
||||
object oImage;
|
||||
json jImage = ObjectToJson(oCaster);
|
||||
|
||||
jImage = JsonModifyRacialType(jImage, RACIAL_TYPE_CONSTRUCT);
|
||||
|
||||
oImage = JsonToObject(jImage, GetLocation(oCaster));
|
||||
|
||||
if (!GetIsObjectValid(oImage))
|
||||
{
|
||||
DoDebug("sp_mirror: Image failed to spawn");
|
||||
//SpeakString("Image failed to spawn.");
|
||||
return;
|
||||
}
|
||||
|
||||
// make, then clean up, first image and copy it, not the PC for subsequent images
|
||||
//object oImage = CopyObject(OBJECT_SELF, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
|
||||
|
||||
SetTag(oImage, sImage);
|
||||
|
||||
CleanCopy(oImage);
|
||||
|
||||
// images will have only 1 HP
|
||||
// make, then clean up, first image and copy it, not the PC for subsequent images
|
||||
object oImage = CopyObject(OBJECT_SELF, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
|
||||
CleanCopy(oImage);
|
||||
|
||||
// images will have only 1 HP
|
||||
int iHP = GetCurrentHitPoints(oImage);
|
||||
--iHP;
|
||||
effect eDamage = PRCEffectDamage(oImage, iHP); // reduces image to 1 hp
|
||||
effect eDamage = PRCEffectDamage(oImage, iHP); // reduces image to 1 hp
|
||||
|
||||
// these need to be applied to every image
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage);
|
||||
|
||||
SetMirrorImageScripts(oImage);
|
||||
|
||||
DelayCommand(0.0, SetLocalObject(oImage, "oMaster", oCaster));
|
||||
|
||||
if(!GetIsPC(oCaster))
|
||||
ChangeFaction(oImage, oCaster);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oImage);
|
||||
if(!GetIsPC(OBJECT_SELF))
|
||||
ChangeFaction(oImage, OBJECT_SELF);
|
||||
else
|
||||
ChangeToStandardFaction(oImage, STANDARD_FACTION_DEFENDER);
|
||||
|
||||
SetIsTemporaryFriend(oCaster, oImage, FALSE);
|
||||
DelayCommand(0.5f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage));
|
||||
StartMirrorImageTracking(oImage, OBJECT_SELF);
|
||||
SetIsTemporaryFriend(OBJECT_SELF, oImage, FALSE);
|
||||
DelayCommand(3.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage));
|
||||
DestroyObject(oImage, TurnsToSeconds(nDuration)); // they dissapear after a minute per level
|
||||
|
||||
--iImages; // made one already
|
||||
@@ -360,8 +195,15 @@ void main2()
|
||||
|
||||
void main()
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
|
||||
/*
|
||||
Spellcast Hook Code
|
||||
Added 2003-06-23 by GeorgZ
|
||||
If you want to make changes to all spells,
|
||||
check x2_inc_spellhook.nss to find out more
|
||||
|
||||
*/
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
@@ -374,6 +216,6 @@ void main()
|
||||
DelayCommand(0.0, RemoveExtraImages());
|
||||
DelayCommand(0.1, main2());
|
||||
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
// Getting rid of the local integer storing the spellschool name
|
||||
}
|
||||
|
@@ -1,700 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Summon Nature's Ally
|
||||
//:: sp_sum_nat_ally
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Carries out the summoning of the appropriate
|
||||
creature for the Summon Nature's Ally Series
|
||||
of spells 1 to 9
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Jaysyn
|
||||
//:: Created On: 2025-08-01 22:02:26
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
|
||||
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
|
||||
|
||||
//Declare major variables
|
||||
object oCaster = OBJECT_SELF;
|
||||
|
||||
//int nSpellId = PRCGetSpellId();
|
||||
int nSpellId = GetSpellId();
|
||||
int nRandom;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nSwitch = GetPRCSwitch(PRC_SUMMON_ROUND_PER_LEVEL);
|
||||
|
||||
float fDuration = nSwitch == 0 ? HoursToSeconds(24) :
|
||||
RoundsToSeconds(PRCGetCasterLevel(oCaster) * nSwitch);
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDuration *= 2;
|
||||
|
||||
string sSummon;
|
||||
int nVFX;
|
||||
|
||||
switch(nSpellId)
|
||||
{
|
||||
//:: Summon Nature's Ally 1
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DIREBADGER:
|
||||
{
|
||||
sSummon = "nw_s_badgerdire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DIRERAT:
|
||||
{
|
||||
sSummon = "prc_s_direrat001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DOG:
|
||||
{
|
||||
sSummon = "prc_s_dog001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_HAWK:
|
||||
{
|
||||
sSummon = "prc_s_hawk001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_TINY_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_tnviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 2
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_DIREBOAR:
|
||||
{
|
||||
sSummon = "nw_s_boardire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_COOSHEE:
|
||||
{
|
||||
sSummon = "prc_s_cooshee001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_WOLF:
|
||||
{
|
||||
sSummon = "prc_s_wolf001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_SMALL_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_smviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_BLACKBEAR:
|
||||
{
|
||||
sSummon = "prc_s_blkbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 3
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_BROWNBEAR:
|
||||
{
|
||||
sSummon = "prc_s_brnbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_DIREWOLK:
|
||||
{
|
||||
sSummon = "nw_s_wolfdire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_LARGE_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_lgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_LEOPARD:
|
||||
{
|
||||
sSummon = "prc_s_leopard001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_SATYR:
|
||||
{
|
||||
sSummon = "prc_s_satyr001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 4
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_LION:
|
||||
{
|
||||
sSummon = "prc_s_lion001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_POLAR_BEAR:
|
||||
{
|
||||
sSummon = "prc_s_plrbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_DIRE_SPIDER:
|
||||
{
|
||||
sSummon = "nw_s_spiddire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_HUGE_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_hgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_WEREBOAR:
|
||||
{
|
||||
sSummon = "prc_s_wrboar001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 5
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_AIR:
|
||||
{
|
||||
sSummon = "x1_s_airsmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_EARTH:
|
||||
{
|
||||
sSummon = "x1_s_earthsmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_FIRE:
|
||||
{
|
||||
sSummon = "x1_s_firesmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_WATER:
|
||||
{
|
||||
sSummon = "x1_s_watersmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_DIRE_BEAR:
|
||||
{
|
||||
sSummon = "nw_s_beardire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 6
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_AIR:
|
||||
{
|
||||
sSummon = "prc_s_airlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_EARTH:
|
||||
{
|
||||
sSummon = "prc_s_earthlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_FIRE:
|
||||
{
|
||||
sSummon = "prc_s_firelarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_WATER:
|
||||
{
|
||||
sSummon = "prc_s_waterlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_DIRETIGER:
|
||||
{
|
||||
sSummon = "nw_s_diretiger";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 7
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_BULETTE:
|
||||
{
|
||||
sSummon = "prc_s_bueltte001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_INVSTALKER:
|
||||
{
|
||||
sSummon = "prc_s_invstlk001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_PIXIE:
|
||||
{
|
||||
sSummon = "prc_s_pixie001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_GORGON:
|
||||
{
|
||||
sSummon = "prc_s_gorgon001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_MANTICORE:
|
||||
{
|
||||
sSummon = "prc_s_mntcore001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 8
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_AIR:
|
||||
{
|
||||
sSummon = "nw_s_airgreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_EARTH:
|
||||
{
|
||||
sSummon = "nw_s_earthgreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_FIRE:
|
||||
{
|
||||
sSummon = "nw_s_firegreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_WATER:
|
||||
{
|
||||
sSummon = "nw_s_watergreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_NYMPH:
|
||||
{
|
||||
sSummon = "prc_s_nymph001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
//:: Summon Nature's Ally 9
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_AIR:
|
||||
{
|
||||
sSummon = "nw_s_airelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_EARTH:
|
||||
{
|
||||
sSummon = "nw_s_earthelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_FIRE:
|
||||
{
|
||||
sSummon = "nw_s_fireelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_WATER:
|
||||
{
|
||||
sSummon = "nw_s_waterelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ARANEA:
|
||||
{
|
||||
sSummon = "prc_s_aranea001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG) DoDebug("sp_summon_nature: oCaster " +GetName(oCaster)+", GetSpellId " +IntToString(GetSpellId())+", sSummon " +sSummon);
|
||||
|
||||
effect eSummon = EffectSummonCreature(sSummon, nVFX);
|
||||
|
||||
//Apply the VFX impact and summon effect
|
||||
MultisummonPreSummon();
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
||||
|
||||
/* switch(nSpellId)
|
||||
{
|
||||
|
||||
|
||||
case SPELL_SUMMON_NATURES_ALLY_1:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_badgerdire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_direrat001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_dog001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_hawk001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_tnviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_boardire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_cooshee001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_wolf001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_smviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_blkbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_brnbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_wolfdire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_lgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_leopard001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_satyr001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_lion001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_plrbear001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_spiddire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_hgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_wrboar001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "x1_s_airsmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "x1_s_earthsmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "x1_s_firesmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "x1_s_watersmall";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "nw_s_beardire";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_airlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_earthlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_firelarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_waterlarge";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "nw_s_diretiger";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_bueltte001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_invstlk001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_pixie001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_gorgon001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_mntcore001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_airgreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_earthgreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_firegreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "nw_s_watergreat";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_nymph001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9:
|
||||
{
|
||||
nRandom = Random(5)+1;
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_airelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_earthelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_fireelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "nw_s_waterelder";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_aranea001";
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
// [TODO] Turn this into a proper template
|
||||
if (GetHasFeat(FEAT_SUMMON_ALIEN, oCaster) || GetHasSpellEffect(VESTIGE_ZCERYLL, oCaster))
|
||||
{
|
||||
sSummon = "pseudo"+sSummon;
|
||||
}
|
||||
else
|
||||
{
|
||||
sSummon = "nw_s_"+sSummon;
|
||||
} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -1,93 +0,0 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Wild Shape
|
||||
//:: NW_S2_WildShape
|
||||
//:: Copyright (c) 2001 Bioware Corp.
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Allows the Druid to change into animal forms.
|
||||
|
||||
Updated: Sept 30 2003, Georg Z.
|
||||
* Made Armor merge with druid to make forms
|
||||
more useful.
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Preston Watamaniuk
|
||||
//:: Created On: Jan 22, 2002
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Deva Winblood
|
||||
//:: Modified Date: January 15th-16th, 2008
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Modified to insure no shapeshifting spells are castable upon
|
||||
mounted targets. This prevents problems that can occur due
|
||||
to dismounting after shape shifting, or other issues that can
|
||||
occur due to preserved appearances getting out of synch.
|
||||
|
||||
This can additional check can be disabled by setting the variable
|
||||
X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this
|
||||
variable is set then this script will function as it did prior to
|
||||
this modification.
|
||||
|
||||
*/
|
||||
|
||||
//#include "x3_inc_horse"
|
||||
#include "prc_alterations"
|
||||
#include "pnp_shft_poly"
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
int nSpell = GetSpellId();
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nCasterLevel = GetLevelByClass(CLASS_TYPE_DRUID, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oPC)
|
||||
+ GetLevelByClass(CLASS_TYPE_ARCANE_HIEROPHANT, oPC);
|
||||
|
||||
float fDuration = HoursToSeconds(nCasterLevel);
|
||||
|
||||
int bShiftingDruid = GetLocalInt(GetModule(), "PRC_DRUID_USES_SHIFTING");
|
||||
|
||||
if (!GetLocalInt(GetModule(), "X3_NO_SHAPESHIFT_SPELL_CHECK"))
|
||||
{
|
||||
if (PRCHorseGetIsMounted(oPC))
|
||||
{
|
||||
if (GetIsPC(oPC))
|
||||
FloatingTextStrRefOnCreature(111982, oPC, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
StoreCurrentAppearanceAsTrueAppearance(oPC, TRUE);
|
||||
|
||||
// Always shift into treant form
|
||||
string sTreantShape = "prc_sum_treant";
|
||||
|
||||
ClearAllActions();
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH), oPC);
|
||||
|
||||
effect eBark = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
|
||||
eBark = ExtraordinaryEffect(eBark);
|
||||
|
||||
|
||||
if (bShiftingDruid)
|
||||
{
|
||||
ShiftIntoResRef(oPC, SHIFTER_TYPE_DRUID, sTreantShape, FALSE);
|
||||
DelayCommand(fDuration, SetShiftTrueForm(oPC));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ShiftIntoResRef(oPC, SHIFTER_TYPE_DRUID, sTreantShape, FALSE);
|
||||
DelayCommand(fDuration, SetShiftTrueForm(oPC));
|
||||
}
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBark, oPC, fDuration);
|
||||
|
||||
DelayCommand(1.5, ActionCastSpellOnSelf(SPELL_SHAPE_INCREASE_DAMAGE));
|
||||
|
||||
|
||||
}
|
||||
|
@@ -30,7 +30,7 @@ void main()
|
||||
object oGlyph = CreateObject(OBJECT_TYPE_PLACEABLE, "x2_plc_glyph", PRCGetSpellTargetLocation());
|
||||
object oTest = GetNearestObjectByTag("X2_PLC_GLYPH",oGlyph);
|
||||
|
||||
if(GetIsObjectValid(oTest) && GetDistanceBetween(oGlyph, oTest) < 5.0f)
|
||||
if(GetIsObjectValid(oTest) && GetDistanceBetween(oGlyph, oTest) <5.0f)
|
||||
{
|
||||
FloatingTextStrRefOnCreature(84612, oCaster);
|
||||
DestroyObject(oGlyph);
|
||||
|
@@ -41,8 +41,7 @@ void main()
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nDuration = GetLevelByClass(CLASS_TYPE_DRUID)
|
||||
+ GetLevelByClass(CLASS_TYPE_LION_OF_TALISID);
|
||||
int nDuration = GetLevelByClass(CLASS_TYPE_DRUID);
|
||||
if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK"))
|
||||
{ // check to see if abort due to being mounted
|
||||
if (PRCHorseGetIsMounted(oTarget))
|
||||
|
Reference in New Issue
Block a user