This commit is contained in:
Jaysyn904
2025-08-21 07:40:32 -04:00
parent 9c7b452b9a
commit 59b2630adf
3642 changed files with 96023 additions and 130017 deletions

View File

@@ -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;

View File

@@ -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");

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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));
}
}

View File

@@ -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");
}

View File

@@ -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");
}

View File

@@ -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");
}

View File

@@ -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();
}

View File

@@ -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");
}

View File

@@ -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);
}
}
}

View File

@@ -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();
}

View File

@@ -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
}

View File

@@ -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;
} */

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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))