Added 1:10000 chance to spawn a Paragon version of any creature
Added 1:10000 chance to spawn a Paragon version of any creature. Full compile. Updated release archive.
This commit is contained in:
parent
b0a9d7abac
commit
99262f2dd9
Binary file not shown.
BIN
_module/ncs/make_paragon.ncs
Normal file
BIN
_module/ncs/make_paragon.ncs
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -53,45 +53,6 @@ void Embiggen(object oNPC, float fIncrease)
|
|||||||
SetObjectVisualTransform(OBJECT_SELF, OBJECT_VISUAL_TRANSFORM_SCALE, fIncrease);
|
SetObjectVisualTransform(OBJECT_SELF, OBJECT_VISUAL_TRANSFORM_SCALE, fIncrease);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EvolvedUndeadCheck(object oUndead)
|
|
||||||
{
|
|
||||||
// Check if the creature is undead and intelligent
|
|
||||||
if (MyPRCGetRacialType(oUndead) != RACIAL_TYPE_UNDEAD || !GetAbilityModifier(ABILITY_INTELLIGENCE, oUndead) > -1)
|
|
||||||
{
|
|
||||||
return; // Exit if not an intelligent undead
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the undead's area and its age
|
|
||||||
object oArea = GetArea(oUndead);
|
|
||||||
int iUndeadAge = GetAge(oUndead);
|
|
||||||
|
|
||||||
// Base evolution chance: 1% for every 100 years
|
|
||||||
int iBaseChance = iUndeadAge / 100;
|
|
||||||
|
|
||||||
// Add chance modifiers: ancient energy and previous evolutions
|
|
||||||
int iAncientBoost = GetLocalInt(oArea, "EVO_UNDEAD_BOOST"); // Area-specific boost
|
|
||||||
int iEvolutionCount = GetLocalInt(oUndead, "UNDEAD_EVOLUTION"); // Previous evolutions
|
|
||||||
int iChance = iBaseChance + iAncientBoost + iEvolutionCount;
|
|
||||||
|
|
||||||
// Roll the dice (1-100)
|
|
||||||
int iRoll = Random(100) + 1;
|
|
||||||
|
|
||||||
// Debug message to monitor rolls and chances
|
|
||||||
if(DEBUG)
|
|
||||||
{
|
|
||||||
DoDebug("Evolution Check: Roll = " + IntToString(iRoll) + ", Chance = " + IntToString(iChance));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the undead evolves
|
|
||||||
if (iRoll <= iChance)
|
|
||||||
{
|
|
||||||
// Apply evolution template
|
|
||||||
ExecuteScript("make_evolved", oUndead); // Apply template script
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
//:: User defined OnSpawn event requested?
|
//:: User defined OnSpawn event requested?
|
||||||
@ -618,16 +579,6 @@ void main()
|
|||||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);
|
||||||
}
|
}
|
||||||
|
|
||||||
//:: Setup Evolved Undead
|
|
||||||
if(iRace == RACIAL_TYPE_UNDEAD)
|
|
||||||
{
|
|
||||||
SetAge(OBJECT_SELF, d20(6));
|
|
||||||
|
|
||||||
EvolvedUndeadCheck(OBJECT_SELF);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//:: Set or Randomize name
|
//:: Set or Randomize name
|
||||||
ms_Nomenclature(OBJECT_SELF);
|
ms_Nomenclature(OBJECT_SELF);
|
||||||
|
|
||||||
|
494
_module/nss/make_paragon.nss
Normal file
494
_module/nss/make_paragon.nss
Normal file
@ -0,0 +1,494 @@
|
|||||||
|
/* Paragon Creature Template
|
||||||
|
|
||||||
|
By: Jaysyn
|
||||||
|
Created: 2024-11-14 08:27:30
|
||||||
|
|
||||||
|
Among the population of every kind of creature are
|
||||||
|
some specimens that are its weakest, worst representatives.
|
||||||
|
Likewise, every population has its paragons: the strongest,
|
||||||
|
smartest, luckiest, and most powerful of the species.
|
||||||
|
Paragon creatures may represent the mythical First Creature,
|
||||||
|
created in its perfect form by some creator deity, or
|
||||||
|
perhaps the evolutionary endpoint of a race after
|
||||||
|
thousands of years of steady improvement. Sometimes,
|
||||||
|
paragons just spring up accidentally, when all the factors
|
||||||
|
are right.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nw_inc_gff"
|
||||||
|
#include "prc_inc_spells"
|
||||||
|
#include "prc_inc_util"
|
||||||
|
#include "npc_template_inc"
|
||||||
|
#include "inc_debug"
|
||||||
|
|
||||||
|
//:: Get a random General feat.
|
||||||
|
void ApplyParagonBonusFeat(object oCreature, int iFeat);
|
||||||
|
|
||||||
|
//:: Adds Paragon SLA's to jCreature.
|
||||||
|
//::
|
||||||
|
json json_AddParagonPowers(json jCreature)
|
||||||
|
{
|
||||||
|
// Get the existing SpecAbilityList (if it exists)
|
||||||
|
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||||
|
|
||||||
|
// Create the SpecAbilityList if it doesn't exist
|
||||||
|
if (jSpecAbilityList == JsonNull())
|
||||||
|
{
|
||||||
|
jSpecAbilityList = JsonArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Greater Dispelling 3x / Day
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Add Haste 3x / Day
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: See Invisiblity 3x / Day
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Add the list to the creature
|
||||||
|
jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Directly modifies jCreature's Challenge Rating.
|
||||||
|
//:: This is useful for most XP calculations.
|
||||||
|
//::
|
||||||
|
json json_UpdateParagonCR(json jCreature, int nBaseCR, int nBaseHD)
|
||||||
|
{
|
||||||
|
int nNewCR;
|
||||||
|
|
||||||
|
//:: Calculate additional CR by HD
|
||||||
|
if(nBaseHD <= 6)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 18;
|
||||||
|
}
|
||||||
|
else if(nBaseHD <= 16)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 15;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{nNewCR = nBaseCR + 12;}
|
||||||
|
|
||||||
|
//:: Modify Challenge Rating
|
||||||
|
jCreature = GffReplaceFloat(jCreature, "ChallengeRating"/* /value" */, IntToFloat(nNewCR));
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get a random General feat.
|
||||||
|
void PickParagonBonusFeat(object oCreature)
|
||||||
|
{
|
||||||
|
//:: Paragon creatures get a +15 to all ability scores,
|
||||||
|
//:: so can always meet feat pre-reqs.
|
||||||
|
|
||||||
|
//:: Detect spellcasting classes (FOR FUTURE USE)
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
if (GetIsArcaneClass(GetClassByPosition(i, oCreature)))
|
||||||
|
{
|
||||||
|
SetLocalInt(oCreature, "ParagonArcaneCaster", 0);
|
||||||
|
}
|
||||||
|
if (GetIsDivineClass(GetClassByPosition(i, oCreature)))
|
||||||
|
{
|
||||||
|
SetLocalInt(oCreature, "ParagonDivineCaster", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (Random(18))
|
||||||
|
{
|
||||||
|
//:: Dodge -> Mobility -> Spring Attack
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
int iDodge = GetHasFeat(FEAT_DODGE, oCreature);
|
||||||
|
int iMobility = GetHasFeat(FEAT_MOBILITY, oCreature);
|
||||||
|
int iSpringAttack = GetHasFeat(FEAT_SPRING_ATTACK, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iDodge == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DODGE);
|
||||||
|
}
|
||||||
|
else if (iMobility == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_MOBILITY);
|
||||||
|
}
|
||||||
|
else if (iSpringAttack == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_SPRING_ATTACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Power Attack -> Cleave -> Imp Power Attack -> Great Cleave
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
int iPower = GetHasFeat(FEAT_POWER_ATTACK, oCreature);
|
||||||
|
int iCleave = GetHasFeat(FEAT_CLEAVE, oCreature);
|
||||||
|
int iImpPower = GetHasFeat(FEAT_IMPROVED_POWER_ATTACK, oCreature);
|
||||||
|
int iGrCleave = GetHasFeat(FEAT_GREAT_CLEAVE, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iPower == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_POWER_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iCleave == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_CLEAVE);
|
||||||
|
}
|
||||||
|
else if (iImpPower == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_POWER_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iGrCleave == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_GREAT_CLEAVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Expertise -> Imp Expertise -> Whirlwind Attack -> Imp Whirlwind Attack
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
int iEx = GetHasFeat(FEAT_EXPERTISE, oCreature);
|
||||||
|
int iImpEx = GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature);
|
||||||
|
int iWhirl = GetHasFeat(FEAT_WHIRLWIND_ATTACK, oCreature);
|
||||||
|
int iImpWhirl = GetHasFeat(FEAT_IMPROVED_WHIRLWIND, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iImpEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iWhirl == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_WHIRLWIND_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iImpWhirl == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_WHIRLWIND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Disarm -> Expertise -> Improved Disarm -> Imp Expertise
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
int iDisarm = GetHasFeat(FEAT_DISARM, oCreature);
|
||||||
|
int iEx = GetHasFeat(FEAT_EXPERTISE, oCreature);
|
||||||
|
int iImpDisarm = GetHasFeat(FEAT_IMPROVED_DISARM, oCreature);
|
||||||
|
int iImpEx = GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iDisarm == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DISARM);
|
||||||
|
}
|
||||||
|
else if (iEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iImpDisarm == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_DISARM);
|
||||||
|
}
|
||||||
|
else if (iImpEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_EXPERTISE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Toughness
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_TOUGHNESS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Great Fortitude
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_GREAT_FORTITUDE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Lightining Reflexes
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_LIGHTNING_REFLEXES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Iron Will -> Unnatural Will
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
int iIronWill = GetHasFeat(FEAT_IRON_WILL, oCreature);
|
||||||
|
int iUnnaturalWill = GetHasFeat(FEAT_UNNATURAL_WILL, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iIronWill == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IRON_WILL);
|
||||||
|
}
|
||||||
|
else if (iUnnaturalWill == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_UNNATURAL_WILL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Blind-Fight
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_BLIND_FIGHT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Improved Initiative
|
||||||
|
case 9:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_INITIATIVE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Alertness
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_ALERTNESS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Blooded
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_BLOODED);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Side-step Charge
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_SIDESTEP_CHARGE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Thug
|
||||||
|
case 13:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_THUG);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Dive for Cover
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DIVE_FOR_COVER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Endurance -> Strong Stomach
|
||||||
|
case 15:
|
||||||
|
{
|
||||||
|
int iEndurance = GetHasFeat(FEAT_ENDURANCE, oCreature);
|
||||||
|
int iStrStomach = GetHasFeat(FEAT_STRONG_STOMACH, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iEndurance == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_ENDURANCE);
|
||||||
|
}
|
||||||
|
else if (iStrStomach == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_STRONG_STOMACH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Resist Disease
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_RESIST_DISEASE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Resist Poison
|
||||||
|
case 17:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_RESIST_POISON);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Check & apply the feat using EffectBonusFeat if it
|
||||||
|
//:: doesn't exist on the creature already
|
||||||
|
void ApplyParagonBonusFeat(object oCreature, int iFeat)
|
||||||
|
{
|
||||||
|
// If the creature does not already have the feat, apply it
|
||||||
|
if (!GetHasFeat(iFeat, oCreature))
|
||||||
|
{
|
||||||
|
effect eFeat = EffectBonusFeat(iFeat);
|
||||||
|
effect eLink = UnyieldingEffect(eFeat);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oCreature);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DelayCommand(0.0f, PickParagonBonusFeat(oCreature));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Apply Paragon effects to a non-PC creature
|
||||||
|
void ApplyParagonEffects(object oCreature, int nBaseHD, int nBaseCR)
|
||||||
|
{
|
||||||
|
//:: Declare major variables
|
||||||
|
int nNewCR;
|
||||||
|
|
||||||
|
effect eParagon;
|
||||||
|
|
||||||
|
//:: Set maximum hit points for each HD
|
||||||
|
int nParagonHP = (GetMaxPossibleHP(oCreature) + (nBaseHD * GetAbilityModifier(ABILITY_CONSTITUTION, oCreature)));
|
||||||
|
SetCurrentHitPoints(oCreature, nParagonHP);
|
||||||
|
|
||||||
|
//:: Tripling the speed for all movement types
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectMovementSpeedIncrease(300));
|
||||||
|
|
||||||
|
//:: +25 luck bonus on all attack rolls
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectAttackIncrease(25));
|
||||||
|
|
||||||
|
//:: +20 luck bonus on damage rolls for melee and thrown ranged attacks
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageIncrease(20));
|
||||||
|
|
||||||
|
//:: AC Bonuses: +12 insight, +12 luck
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectACIncrease(12, AC_DODGE_BONUS));
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectACIncrease(12, AC_DEFLECTION_BONUS));
|
||||||
|
|
||||||
|
//:: Boost caster & SLA level by 15
|
||||||
|
SetLocalInt(oCreature, PRC_CASTERLEVEL_ADJUSTMENT, 15);
|
||||||
|
|
||||||
|
//:: Fire and cold resistance 10, or keep the higher existing resistance if applicable
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageResistance(DAMAGE_TYPE_FIRE, 10));
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageResistance(DAMAGE_TYPE_COLD, 10));
|
||||||
|
|
||||||
|
//:: Damage Reduction 20/epic or retain existing DR if higher
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageReduction(20, DAMAGE_POWER_ENERGY));
|
||||||
|
|
||||||
|
//:: Spell Resistance equal to CR +10, or retain existing SR if higher
|
||||||
|
int iExSR = GetSpellResistance(oCreature);
|
||||||
|
int nSpellResistance;
|
||||||
|
|
||||||
|
if (iExSR < nBaseCR + 10)
|
||||||
|
{
|
||||||
|
nSpellResistance = nBaseCR + 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nSpellResistance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSpellResistanceIncrease(nSpellResistance));
|
||||||
|
|
||||||
|
//:: Fast Healing 20
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectRegenerate(20, 6.0f));
|
||||||
|
|
||||||
|
//:: Saving Throws: +10 insight bonus on all saving throws
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSavingThrowIncrease(SAVING_THROW_ALL, 10));
|
||||||
|
|
||||||
|
//:: Skills: +10 competence bonus to all skill checks
|
||||||
|
int nSkillID = 0;
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
//:: Get & check skill
|
||||||
|
string sSkillLabel = Get2DACache("skills", "Label", nSkillID);
|
||||||
|
|
||||||
|
//:: Break when out of skills
|
||||||
|
if (sSkillLabel == "")
|
||||||
|
break;
|
||||||
|
|
||||||
|
//:: Apply the skill increase effect for the current skill
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSkillIncrease(nSkillID, 10));
|
||||||
|
|
||||||
|
|
||||||
|
//:: Move to the next skill ID
|
||||||
|
nSkillID++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Two free general feats.
|
||||||
|
PickParagonBonusFeat(oCreature);
|
||||||
|
PickParagonBonusFeat(oCreature);
|
||||||
|
|
||||||
|
eParagon = UnyieldingEffect(eParagon);
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParagon, oCreature);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void main ()
|
||||||
|
{
|
||||||
|
//:: Declare major variables
|
||||||
|
object oBaseCreature = OBJECT_SELF;
|
||||||
|
object oNewCreature;
|
||||||
|
|
||||||
|
//:: No Template Stacking
|
||||||
|
if(GetLocalInt(oBaseCreature, "TEMPLATE_PARAGON") > 0)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("No Template Stacking");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Creatures & NPCs only
|
||||||
|
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Not a creature");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nBaseHD = GetHitDice(oBaseCreature);
|
||||||
|
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
|
||||||
|
|
||||||
|
json jBaseCreature = ObjectToJson(oBaseCreature, TRUE);
|
||||||
|
json jNewCreature;
|
||||||
|
json jFinalCreature;
|
||||||
|
|
||||||
|
jNewCreature = json_AddParagonPowers(jBaseCreature);
|
||||||
|
jNewCreature = json_UpdateParagonCR(jNewCreature, nBaseCR, nBaseHD);
|
||||||
|
jNewCreature = json_UpdateBaseAC(jNewCreature, 5);
|
||||||
|
jFinalCreature = json_UpdateStats(jNewCreature, oBaseCreature, 15, 15, 15, 15, 15, 15);
|
||||||
|
|
||||||
|
//:: Update the creature
|
||||||
|
oNewCreature = JsonToObject(jFinalCreature, GetLocation(oBaseCreature));
|
||||||
|
DestroyObject(oBaseCreature, 0.0f);
|
||||||
|
|
||||||
|
//:: Apply effects
|
||||||
|
ApplyParagonEffects(oNewCreature, nBaseHD, nBaseCR);
|
||||||
|
|
||||||
|
PRCForceRest(oNewCreature);
|
||||||
|
|
||||||
|
//:: Adding extra 12 HP per HD as Temporary HP.
|
||||||
|
effect eTempHP = EffectTemporaryHitpoints(nBaseHD * 12);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eTempHP, oNewCreature);
|
||||||
|
|
||||||
|
//:: Update creature's name
|
||||||
|
string sBaseName = GetName(oNewCreature);
|
||||||
|
SetName(oNewCreature, "Paragon "+ sBaseName);
|
||||||
|
|
||||||
|
SetLocalInt(oNewCreature, "TEMPLATE_PARAGON", 1);
|
||||||
|
}
|
@ -135,6 +135,15 @@ void main()
|
|||||||
{
|
{
|
||||||
nAveragePCLevel = 2;
|
nAveragePCLevel = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Paragon Check
|
||||||
|
if (Random(9999) == 0)
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF, "TEMPLATE_PARAGON") < 1)
|
||||||
|
{
|
||||||
|
ExecuteScript("make_paragon", OBJECT_SELF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//:: Setup Evolved Undead
|
//:: Setup Evolved Undead
|
||||||
if(iRacial == RACIAL_TYPE_UNDEAD)
|
if(iRacial == RACIAL_TYPE_UNDEAD)
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user