2025/10/21 Update
Added PEPS AI. Hopefully stopped "bleed" bug after being healed from dying. Full compile.
This commit is contained in:
@@ -13,5 +13,180 @@
|
||||
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);
|
||||
|
||||
if(DEBUG) 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 MakeGreenboundCreature(string sResRef)
|
||||
{
|
||||
int bGBSActive = GetLocalInt(OBJECT_SELF);
|
||||
|
||||
if(bGBSActive)
|
||||
{
|
||||
int i = 1;
|
||||
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF);
|
||||
while(GetIsObjectValid(oSummon))
|
||||
{
|
||||
if(GetResRef(oSummon) == sResRef && !GetLocalInt(oSummon, "TEMPLATE_GREENBOUND"))
|
||||
{
|
||||
object oNewCreature;
|
||||
|
||||
string sBaseName = GetName(oSummon);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
effect eLink = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
|
||||
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_CONSTITUTION, 4));
|
||||
eLink = UnyieldingEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oSummon);
|
||||
SetLocalInt(oSummon, "TEMPLATE_GREENBOUND", TRUE);
|
||||
}
|
||||
i++;
|
||||
oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, i);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user