2025/08/15 Update
Added Verdant Lord PrC. Added Create Infusion feat & crafting system. Added Magical Artisan: Create Infusion feat. Added Plant Defiance feat. Added Plant Control feat. Added Control Plants spell. Added Forestfold spell. Added Immunity from Elements spell. Added Creeping Cold & Greater Creeping Cold spells. Added Adrenaline Surge spell. Added Mundane & Infused Herb baseitem types. Added Mundane & Enchanted Scepter baseitem types. Added EffectGazeImmunity() effect. Added Botanical material type. Created json library for summoning support. Updated Plant Domain spells. Fixed bug w/ Regen Circle. Fixed weapon size bug with Enlarge & Reduce Person. Fixed TMI bug in Swarm of Arrows (hopefully) Fixed Blood in the Water. Fixed Iron Soul / Master of Nine prereq bug. Fixed Happo Zanshin to work more like PnP. Fixed targeting bug w/ Ultrablast. Fixed Ubiquitous Vision. Fixed Magic Staves for small creatures. Gave the summoned "treant" from Treebrother a Barkskin vfx. Radial spells can now be scribed w/ Scribe Scroll. Fixed Martial Stances not counting bug w/ levelup NUI (@Rakiov)
This commit is contained in:
@@ -27,6 +27,9 @@
|
||||
1734 - Turn_Blightspawned
|
||||
2259 - turn outsider
|
||||
3497 - Turn cold
|
||||
25992 - FEAT_PLANT_DEFIANCE
|
||||
25993 - FEAT_PLANT_CONTROL
|
||||
|
||||
*/
|
||||
|
||||
#include "prc_inc_clsfunc"
|
||||
@@ -57,7 +60,7 @@ void main()
|
||||
}
|
||||
|
||||
// Because Turn Undead/Outsider isn't from a domain, skip this check
|
||||
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER)
|
||||
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER && nTurnType != SPELL_PLANT_DEFIANCE && nTurnType != SPELL_PLANT_CONTROL)
|
||||
{
|
||||
// Used by the uses per day check code for bonus domains
|
||||
if(!DecrementDomainUses(GetTurningDomain(nTurnType), OBJECT_SELF))
|
||||
@@ -210,7 +213,37 @@ void main()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nTurnOrRebuke == ACTION_TURN)
|
||||
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)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUNSTRIKE), oTest);
|
||||
//if half of level, destroy
|
||||
@@ -219,7 +252,7 @@ void main()
|
||||
DelayCommand(0.0, DoDestroy(oTest));
|
||||
else
|
||||
DoTurn(oTest);
|
||||
}
|
||||
} */
|
||||
else
|
||||
{
|
||||
bDisplayCommandMessage = TRUE;
|
||||
|
117
nwn/nwnprc/trunk/spells/sp_adrenaline.nss
Normal file
117
nwn/nwnprc/trunk/spells/sp_adrenaline.nss
Normal file
@@ -0,0 +1,117 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//::///////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
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,6 +95,10 @@ void main()
|
||||
//Restore original max henchmen
|
||||
SetMaxHenchmen(nMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStringOnCreature("You must have celestial blood to cast this spell", oPC);
|
||||
}
|
||||
|
||||
PRCSetSchool();
|
||||
//SPGoodShift(oPC);
|
||||
|
134
nwn/nwnprc/trunk/spells/sp_creepingcold.nss
Normal file
134
nwn/nwnprc/trunk/spells/sp_creepingcold.nss
Normal file
@@ -0,0 +1,134 @@
|
||||
//::////////////////////////////////////////////////////////
|
||||
//::
|
||||
//:: 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));
|
||||
}
|
||||
}
|
119
nwn/nwnprc/trunk/spells/sp_ctrl_plants.nss
Normal file
119
nwn/nwnprc/trunk/spells/sp_ctrl_plants.nss
Normal file
@@ -0,0 +1,119 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
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");
|
||||
}
|
||||
|
||||
|
79
nwn/nwnprc/trunk/spells/sp_forestfold.nss
Normal file
79
nwn/nwnprc/trunk/spells/sp_forestfold.nss
Normal file
@@ -0,0 +1,79 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//::
|
||||
//:: 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");
|
||||
}
|
122
nwn/nwnprc/trunk/spells/sp_inv_elements.nss
Normal file
122
nwn/nwnprc/trunk/spells/sp_inv_elements.nss
Normal file
@@ -0,0 +1,122 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//:://////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
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();
|
||||
}
|
||||
|
||||
|
@@ -22,7 +22,7 @@ void main()
|
||||
float fMaxDistance = 30.0;
|
||||
int nRegenRate = 1;
|
||||
|
||||
if (nSpellId == 9999)
|
||||
if (nSpellId == SPELL_REGEN_CIRCLE)
|
||||
{
|
||||
nRegenRate = 3;
|
||||
}
|
||||
|
@@ -39,6 +39,9 @@ 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"
|
||||
@@ -111,8 +114,7 @@ void StartMirrorImageTracking(object oSummoned, object oMaster)
|
||||
}
|
||||
|
||||
void SetMirrorImageScripts(object oImage)
|
||||
{
|
||||
|
||||
{
|
||||
string sTag = GetTag(oImage);
|
||||
|
||||
if(DEBUG) DoDebug("sp_mirror >> SetMirrorImageScripts: Setting OnSpellCastAt script on "+ sTag +".");
|
||||
|
@@ -43,279 +43,279 @@ void main()
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DIREBADGER:
|
||||
{
|
||||
sSummon = "nw_s_badgerdire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DIRERAT:
|
||||
{
|
||||
sSummon = "prc_s_direrat001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_DOG:
|
||||
{
|
||||
sSummon = "prc_s_dog001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_HAWK:
|
||||
{
|
||||
sSummon = "prc_s_hawk001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_1_TINY_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_tnviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
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_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_COOSHEE:
|
||||
{
|
||||
sSummon = "prc_s_cooshee001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_WOLF:
|
||||
{
|
||||
sSummon = "prc_s_wolf001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_SMALL_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_smviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_2_BLACKBEAR:
|
||||
{
|
||||
sSummon = "prc_s_blkbear001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
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_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_DIREWOLK:
|
||||
{
|
||||
sSummon = "nw_s_wolfdire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_LARGE_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_lgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_LEOPARD:
|
||||
{
|
||||
sSummon = "prc_s_leopard001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_3_SATYR:
|
||||
{
|
||||
sSummon = "prc_s_satyr001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
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_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_POLAR_BEAR:
|
||||
{
|
||||
sSummon = "prc_s_plrbear001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_DIRE_SPIDER:
|
||||
{
|
||||
sSummon = "nw_s_spiddire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_HUGE_VIPER:
|
||||
{
|
||||
sSummon = "prc_s_hgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_4_WEREBOAR:
|
||||
{
|
||||
sSummon = "prc_s_wrboar001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
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_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_EARTH:
|
||||
{
|
||||
sSummon = "x1_s_earthsmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_FIRE:
|
||||
{
|
||||
sSummon = "x1_s_firesmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_MED_WATER:
|
||||
{
|
||||
sSummon = "x1_s_watersmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_5_DIRE_BEAR:
|
||||
{
|
||||
sSummon = "nw_s_beardire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
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_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_EARTH:
|
||||
{
|
||||
sSummon = "prc_s_earthlarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_FIRE:
|
||||
{
|
||||
sSummon = "prc_s_firelarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_LG_WATER:
|
||||
{
|
||||
sSummon = "prc_s_waterlarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_6_DIRETIGER:
|
||||
{
|
||||
sSummon = "nw_s_diretiger";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
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_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_INVSTALKER:
|
||||
{
|
||||
sSummon = "prc_s_invstlk001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_PIXIE:
|
||||
{
|
||||
sSummon = "prc_s_pixie001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_GORGON:
|
||||
{
|
||||
sSummon = "prc_s_gorgon001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_7_MANTICORE:
|
||||
{
|
||||
sSummon = "prc_s_mntcore001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
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_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_EARTH:
|
||||
{
|
||||
sSummon = "nw_s_earthgreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_FIRE:
|
||||
{
|
||||
sSummon = "nw_s_firegreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_GR_WATER:
|
||||
{
|
||||
sSummon = "nw_s_watergreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_8_NYMPH:
|
||||
{
|
||||
sSummon = "prc_s_nymph001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
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_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_EARTH:
|
||||
{
|
||||
sSummon = "nw_s_earthelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_FIRE:
|
||||
{
|
||||
sSummon = "nw_s_fireelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ELD_WATER:
|
||||
{
|
||||
sSummon = "nw_s_waterelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case SPELL_SUMMON_NATURES_ALLY_9_ARANEA:
|
||||
{
|
||||
sSummon = "prc_s_aranea001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -346,31 +346,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_badgerdire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_direrat001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_dog001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_hawk001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_tnviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -384,31 +384,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_boardire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_cooshee001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_wolf001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_smviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_blkbear001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -422,31 +422,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_brnbear001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_wolfdire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_lgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_leopard001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_satyr001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_1;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -460,31 +460,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_lion001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_plrbear001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_spiddire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_hgviper001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_wrboar001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -498,31 +498,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "x1_s_airsmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "x1_s_earthsmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "x1_s_firesmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "x1_s_watersmall";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "nw_s_beardire";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -536,31 +536,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_airlarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_earthlarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_firelarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_waterlarge";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "nw_s_diretiger";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_2;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -574,31 +574,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "prc_s_bueltte001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "prc_s_invstlk001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "prc_s_pixie001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "prc_s_gorgon001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_mntcore001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -612,31 +612,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_airgreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_earthgreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_firegreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "nw_s_watergreat";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_nymph001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -650,31 +650,31 @@ void main()
|
||||
case 1:
|
||||
{
|
||||
sSummon = "nw_s_airelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
sSummon = "nw_s_earthelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
sSummon = "nw_s_fireelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
sSummon = "nw_s_waterelder";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
sSummon = "prc_s_aranea001";
|
||||
nVFX = VFX_FNF_SUMMON_MONSTER_3;
|
||||
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
93
nwn/nwnprc/trunk/spells/vl_treant_shape.nss
Normal file
93
nwn/nwnprc/trunk/spells/vl_treant_shape.nss
Normal file
@@ -0,0 +1,93 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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));
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user