From 243ed8a65207fb37ca2793146e8dbd30b4a8af3b Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Mon, 15 Sep 2025 08:31:22 -0400 Subject: [PATCH] 2025/09/15 Update Added creature template scripts. Full compile. --- _module/ncs/en3_ronus_3.ncs | Bin 1331 -> 1235 bytes _module/ncs/make_evolved.ncs | Bin 0 -> 153534 bytes _module/ncs/make_greenbound.ncs | Bin 0 -> 22137 bytes _module/ncs/make_paragon.ncs | Bin 0 -> 10834 bytes _module/ncs/qst_hasitem.ncs | Bin 368 -> 352 bytes _module/nss/make_evolved.nss | 526 +++++++++++++++++++++++++++++++ _module/nss/make_greenbound.nss | 259 +++++++++++++++ _module/nss/make_paragon.nss | 512 ++++++++++++++++++++++++++++++ _module/nss/npc_template_inc.nss | 50 +++ 9 files changed, 1347 insertions(+) create mode 100644 _module/ncs/make_evolved.ncs create mode 100644 _module/ncs/make_greenbound.ncs create mode 100644 _module/ncs/make_paragon.ncs create mode 100644 _module/nss/make_evolved.nss create mode 100644 _module/nss/make_greenbound.nss create mode 100644 _module/nss/make_paragon.nss create mode 100644 _module/nss/npc_template_inc.nss diff --git a/_module/ncs/en3_ronus_3.ncs b/_module/ncs/en3_ronus_3.ncs index b673d9f97702ec346b9084108d847e78d77485c3..f70514cb59d8f1bdedbd62e73426fa8ec5545507 100644 GIT binary patch delta 137 zcmdnYb(vGk&pB8j%uvt3iGhLTvK#{ta40Y^F|)8Ta0Uc9$Gf;Xg}Q@+kkz!{2 z|Ns9F2B0ic8Y7tV1top^9u) IVc};40Ke`h;s5{u delta 233 zcmcc2xtYt#&pB8j%uvt3iGhLDSdIY*I20I|n3bnTOw_t##l*}E68pjcRLzveh^hc8`2j3>4^48i0;7inR0YsTRGpIx7>_be gpKQj|Cd(uOwgIRFXhRCRAt#yM;a9Qw2s1w;0PS>G)c^nh diff --git a/_module/ncs/make_evolved.ncs b/_module/ncs/make_evolved.ncs new file mode 100644 index 0000000000000000000000000000000000000000..152072b48acf1cda37ee13193cce94fea8e6577d GIT binary patch literal 153534 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 dKghljveY+1m+!)@9e= 6) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 18); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 2: + if (nBaseHD >= 5) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 23); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 3: + if (nBaseHD >= 4) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 25); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 4: + if (nBaseHD >= 3) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 26); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 5: + if (nBaseHD >= 3) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 27); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 6: + if (nBaseHD >= 7) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 364); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 7: + if (nBaseHD >= 5) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 8: + if (nBaseHD >= 4) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 88); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 9: + if (nBaseHD >= 3) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 10: + if (nBaseHD >= 4) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 82); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 11: + if (nBaseHD >= 2) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + case 12: + if (nBaseHD >= 5) + { + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 566); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + } + else + { + return json_AddEvolvedPowers(jCreature, nBaseHD, nCasterLevel, iEvolution); + } + break; + default: + // Fallback to Doom for creatures with 1HD or less. + int i; + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 46); // Doom spell + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD)); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + break; + } + + return jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList); +} + */ + +//:: Apply Evolved effects to a non-PC creature +void ApplyEvolvedEffects(object oCreature, int nBaseHD, int nCasterLevel, int iEvolution) +{ +//:: Declare major variables + int bIncorporeal = GetIsIncorporeal(oCreature); + effect eVolved; + +//:: Boost caster & SLA level + SetLocalInt(oCreature, PRC_CASTERLEVEL_ADJUSTMENT, PRCMax(nCasterLevel, nBaseHD)); + +//:: AC Bonuses: +1 natural or +1 deflection if Incorporal + if(bIncorporeal) + { + eVolved = EffectACIncrease(1+iEvolution, AC_DEFLECTION_BONUS); + } + else + { + eVolved = EffectACIncrease(1+iEvolution, AC_NATURAL_BONUS); + } + +//:: Fast Healing 3 + eVolved = EffectLinkEffects(eVolved, EffectRegenerate(3, 6.0f)); + +//:: Make *really* permanent + eVolved = UnyieldingEffect(eVolved); + +//:: Apply everything + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVolved, oCreature); +} + + +void main() +{ +//:: Declare major variables + object oBaseCreature = OBJECT_SELF; + object oNewCreature; + + GetObjectUUID(oBaseCreature); + + int bIncorporeal = GetIsIncorporeal(oBaseCreature); + int iBaseRace = MyPRCGetRacialType(oBaseCreature); + int nCasterLevel = PRCGetCasterLevel(oBaseCreature); + + int iEvolution = 1; + int iOldEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION"); + +//:: Creatures & NPCs only + if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE)) + { + DoDebug("Not a creature"); + return; + } + +//:: Undead only + if(iBaseRace != RACIAL_TYPE_UNDEAD) + { + DoDebug("make_evolved: Invalid racial type for template."); + return; + } + + if(DEBUG) DoDebug("make_evolved: Previous Evolution is: " +IntToString(iOldEvolution)); + + iEvolution = iEvolution + iOldEvolution; + + if(DEBUG) DoDebug("make_evolved: Evolution is: " +IntToString(iEvolution)); + + int nBaseHD = GetHitDice(oBaseCreature); + int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature)); + + location lSpawnLoc = GetLocation(oBaseCreature); + + json jBaseCreature = ObjectToJson(oBaseCreature, FALSE); + json jNewCreature; + json jFinalCreature; + +//:: Get original name + string sBaseName = GetName(oBaseCreature); + +//:: Add Spell-like abilities + jNewCreature = json_AddEvolvedPowers(jBaseCreature, nBaseHD, nCasterLevel, iEvolution); + +//:: Update stats + if(bIncorporeal) + { + //:: Incorporeal = CHA only + jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 0, 0, 0, 0, 0, 2); + } + else + { + jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 2, 0, 0, 0, 0, 2); + } + +//:: Delete original creature. + if (GetIsObjectValid(oBaseCreature)) + { + AssignCommand(oBaseCreature, ClearAllActions(TRUE)); + + // optional fade / vanish visuals + effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f); + + DestroyObject(oBaseCreature, 0.1f); + } + +//:: Update CR + jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 1); + +//:: Update the creature + oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc); + +//:: Apply effects + ApplyEvolvedEffects(oNewCreature, nBaseHD, nCasterLevel, iEvolution); + +//:: Update name + if(DEBUG) DoDebug("make_evolved: Final evolution is: " +IntToString(iEvolution)); + if (iEvolution == 1) + { + SetName(oNewCreature, "Evolved " + sBaseName); + } + else if (iEvolution == 2) + { + SetName(oNewCreature, "Greater " + sBaseName); + } + else + { + SetName(oNewCreature, sBaseName); + } +//:: Update race field + SetSubRace(oNewCreature, "Undead (Augmented)"); + +//:: Update age + SetAge(oNewCreature, GetAge(oNewCreature) + d100(1)); + +//:: Freshen up + //DelayCommand(0.0f, PRCForceRest(oNewCreature)); + +//:: Set variables + SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution); + SetLocalInt(oNewCreature, "TEMPLATE_EVOLVED", 1); +} \ No newline at end of file diff --git a/_module/nss/make_greenbound.nss b/_module/nss/make_greenbound.nss new file mode 100644 index 00000000..6c929f89 --- /dev/null +++ b/_module/nss/make_greenbound.nss @@ -0,0 +1,259 @@ +/* Greenbound Creature Template + + By: Jaysyn + Created: 2025-09-06 22:24:15 + + A greenbound creature looks much like it did before + transformation, although certain changes are apparent. + The creature's flesh has been replaced by pulpy wood + and thickly corded creepers, and tiny branches stick + out from its torso, arms, and legs. Any feathers, hair, + or fur it once had have been replaced by some combination + of green vines, moss, flowers, and leaves. + + Greenbound creatures speak any languages they knew before + transformation, although their voices are now deep and + gravelly. + +/*/////////////////////////////////////////////////////////// + +#include "nw_inc_gff" +#include "prc_inc_spells" +#include "prc_inc_util" +#include "npc_template_inc" +#include "inc_debug" +#include "prc_inc_json" + +//:: Adds Greenbound SLA's to jCreature. +//:: +json json_AddGreenboundPowers(json jCreature) +{ + // Get the existing SpecAbilityList (if it exists) + json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList"); + + //:: Get creature's HD + int iHD = json_GetCreatureHD(jCreature); + + // Create the SpecAbilityList if it doesn't exist + if (jSpecAbilityList == JsonNull()) + { + jSpecAbilityList = JsonArray(); + } + +//:: Add Entangle at will (capped @ 20) + int i; + for (i = 0; i < 20; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 53); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD); + jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1); + + // Manually add to the array + jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility); + } + +//:: Add Vine Mine 1x / Day + for (i = 0; i < 1; i++) + { + json jSpecAbility = JsonObject(); + jSpecAbility = GffAddWord(jSpecAbility, "Spell", 529); + jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD); + 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; +} + +//:: Apply Greenbound effects +void ApplyGreenboundEffects(object oCreature, int nBaseHD) +{ +//:: Declare major variables + int nNewCR; + object oSkin = GetPCSkin(oCreature); + + itemproperty ipIP; + + effect eGreenbound; + +//:: Give it a barkskin vfx + eGreenbound = EffectLinkEffects(eGreenbound, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN)); + +//:: Plant Immunities + eGreenbound = EffectLinkEffects(eGreenbound, EffectImmunity(IMMUNITY_TYPE_STUN)); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + + ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB); + IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE); + +//:: Set maximum hit points for each HD + int nMaxHP = GetMaxPossibleHP(oCreature); + SetCurrentHitPoints(oCreature, nMaxHP); + + DoDebug("nMaxHP is: "+IntToString(nMaxHP)+","); + +//:: Resistance to Cold and Electricity (Ex): A greenbound creature gains resistance 10 to cold and electricity. + eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, 10)); + eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_COLD, 10)); + +//:: Damage Reduction (Ex): A greenbound creature has damage reduction 10/magic and slashing. + eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageReduction(10, DAMAGE_POWER_PLUS_ONE)); + eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, 10)); + eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 10)); + +//:: Fast Healing (Ex): A greenbound creature heals 3 points of damage each round so long as it has at least 1 hit point. + eGreenbound = EffectLinkEffects(eGreenbound, EffectRegenerate(3, 6.0f)); + +//:: Tremorsense (Ex): Greenbound creatures can automatically sense the location of +//:: anything within 60 feet that is in contact with the ground. + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(488)); + +//:: Grapple Bonus (Ex): The thorny hooks on a greenbound creature's hands and feet +//:: grant it a +4 bonus on grapple checks. (Imp. Grapple) + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(2804)); + +//:: Immunity to Critical Hits + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3585)); + +//:: Immunity to Sneak Attack + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3591)); + +//:: Immunity to Poison + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3590)); + +//:: Immunity to Mind Effects + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3588)); + +//:: Low-Light Vision + eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(354)); + +//:: Make *really* permanent + eGreenbound = UnyieldingEffect(eGreenbound); + +//:: Apply everything + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGreenbound, oCreature); + +//:: Add slam attack + string sResRef; + int nSize = PRCGetCreatureSize(oCreature); + //primary weapon + sResRef = "prc_warf_slam_"; + sResRef += GetAffixForSize(nSize+1); + AddNaturalPrimaryWeapon(oCreature, sResRef, 1); + +} + + +void main () +{ +//:: Declare major variables + object oBaseCreature = OBJECT_SELF; + object oNewCreature; + + string sBaseName = GetName(oBaseCreature); + + GetObjectUUID(oBaseCreature); + + int nRacial = MyPRCGetRacialType(oBaseCreature); + + //:: No Template Stacking + if(GetLocalInt(oBaseCreature, "TEMPLATE_GREENBOUND") > 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; + } +/* + + A "greenbound creature" is an acquired template that can be added to + any animal, fey, giant, humanoid, monstrous humanoid, or vermin. + +*/ + if(nRacial == RACIAL_TYPE_ABERRATION || nRacial == RACIAL_TYPE_CONSTRUCT || nRacial == RACIAL_TYPE_DRAGON || + nRacial == RACIAL_TYPE_ELEMENTAL || nRacial == RACIAL_TYPE_MAGICAL_BEAST || nRacial == RACIAL_TYPE_OOZE || + nRacial == RACIAL_TYPE_OUTSIDER || nRacial == RACIAL_TYPE_PLANT || nRacial == RACIAL_TYPE_UNDEAD ) + { + DoDebug("make_greenbound: Invalid racial type for template."); + return; + } + + int nBaseHD = GetHitDice(oBaseCreature); + int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature)); + + location lSpawnLoc = GetLocation(oBaseCreature); + + json jBaseCreature = ObjectToJson(oBaseCreature, TRUE); + json jNewCreature; + json jFinalCreature; + +//:: The creature's type changes to plant with the appropriate augmented subtype. +//:: Hit Dice: Change all current Hit Dice to d8s. + jNewCreature = JsonModifyRacialType(jBaseCreature, RACIAL_TYPE_PLANT); + +//:: Armor Class: A greenbound creature's natural armor bonus improves by 6 over that of the base creature. + jNewCreature = json_IncreaseBaseAC(jNewCreature, 6); + +//:: Abilities: Increase from the base creature as follows: Str +6, Dex +2, Con +4, Cha +4. + jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 6, 2, 4, 0, 0, 4); + + if (GetIsObjectValid(oBaseCreature)) + { + AssignCommand(oBaseCreature, ClearAllActions(TRUE)); + + // optional fade / vanish visuals + effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f); + + DestroyObject(oBaseCreature, 0.1f); + } + +//:: Spell-Like Abilities: At will - entangle, pass without trace, speak with plants; 1/day - wall of thorns. + jNewCreature = json_AddGreenboundPowers(jNewCreature); + +//:: Hit Dice: Change all current Hit Dice to d8s. + jNewCreature = json_RecalcMaxHP(jNewCreature, 8); + +//:: Challenge Rating: Same as the base creature +2 + jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 2); + +//:: Update the creature + oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc); + +//:: Apply the non-json effects + ApplyGreenboundEffects(oNewCreature, nBaseHD); + +//:: Update creature's name + SetName(oNewCreature, "Greenbound "+ sBaseName); + +//:: Update race field + SetSubRace(oNewCreature, "Plant (Augmented)"); + +//:: Freshen Up + //DelayCommand(0.0f, PRCForceRest(oNewCreature)); + +//:: Set variables + SetLocalInt(oNewCreature, "TEMPLATE_GREENBOUND", 1); +} \ No newline at end of file diff --git a/_module/nss/make_paragon.nss b/_module/nss/make_paragon.nss new file mode 100644 index 00000000..b7e6796b --- /dev/null +++ b/_module/nss/make_paragon.nss @@ -0,0 +1,512 @@ +/* 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" +#include "prc_inc_json" + +//:: 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; + + location lSpawnLoc = GetLocation(oBaseCreature); + + GetObjectUUID(oBaseCreature); + +//:: 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_UpdateCreatureStats(jNewCreature, oBaseCreature, 15, 15, 15, 15, 15, 15); + +//:: Delete original creature. + if (GetIsObjectValid(oBaseCreature)) + { + AssignCommand(oBaseCreature, ClearAllActions(TRUE)); + + // optional fade / vanish visuals + effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f); + + DestroyObject(oBaseCreature, 0.1f); + } + +//:: Update the creature + oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc); + +//:: Apply effects + ApplyParagonEffects(oNewCreature, nBaseHD, nBaseCR); + +//:: 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); + +//:: Freshen Up + //DelayCommand(0.0f, PRCForceRest(oNewCreature)); + +//:: Set variables + SetLocalInt(oNewCreature, "TEMPLATE_PARAGON", 1); +} \ No newline at end of file diff --git a/_module/nss/npc_template_inc.nss b/_module/nss/npc_template_inc.nss new file mode 100644 index 00000000..6d2e1b73 --- /dev/null +++ b/_module/nss/npc_template_inc.nss @@ -0,0 +1,50 @@ +/* npc_template_inc + + Common functions for Creature Templates + + By: Jaysyn + Created: 2024-11-14 08:27:30 + +*/ +#include "prc_inc_fork" +#include "nw_inc_gff" +#include "prc_inc_natweap" +#include "prc_inc_util" + +void ReallyEquipItemInSlot(object oNPC, object oItem, int nSlot); + +void ReallyEquipItemInSlot(object oNPC, object oItem, int nSlot) +{ + if (GetItemInSlot(nSlot) != oItem) + { + //ClearAllActions(); + AssignCommand(oNPC, ActionEquipItem(oItem, nSlot)); + DelayCommand(0.5, ReallyEquipItemInSlot(oNPC, oItem, nSlot)); + } +} + +// Get the size of a JSON array +int GetJsonArraySize(json jArray) +{ + int iSize = 0; + while (JsonArrayGet(jArray, iSize) != JsonNull()) + { + iSize++; + } + return iSize; +} + +int CheckForWeapon(object oCreature) +{ + if (GetIsWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature)) == 1 || GetIsWeapon(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature)) == 1) + { + // oCreature has a weapon in at least one hand + return TRUE; + } + else + { + // oCreature doesn't have a weapon in either hand + return FALSE; + } +} +//:: void main(){} \ No newline at end of file