Ancordia_PRC8/_module/nss/adv_spawn.nss
Jaysyn904 102ba7dab6 Initial Commit
Initial Commit
2023-09-21 19:51:32 -04:00

349 lines
15 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name x2_def_spawn
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Default On Spawn script
2003-07-28: Georg Zoeller:
If you set a ninteger on the creature named
"X2_USERDEFINED_ONSPAWN_EVENTS"
The creature will fire a pre and a post-spawn
event on itself, depending on the value of that
variable
1 - Fire Userdefined Event 1510 (pre spawn)
2 - Fire Userdefined Event 1511 (post spawn)
3 - Fire both events
2007-12-31: Deva Winblood
Modified to look for X3_HORSE_OWNER_TAG and if
it is defined look for an NPC with that tag
nearby or in the module (checks near first).
It will make that NPC this horse's master.
*/
//:://////////////////////////////////////////////
//:: Created By: Keith Warner, Georg Zoeller
//:: Created On: June 11/03
//:://////////////////////////////////////////////
const int EVENT_USER_DEFINED_PRESPAWN = 1510;
const int EVENT_USER_DEFINED_POSTSPAWN = 1511;
#include "x2_inc_switches"
#include "x3_inc_horse"
#include "x4_inc_functions"
#include "x2_inc_itemprop"
void EpicBonuses()
{
//This part is a substitute for lacking NPC OnEquip and OnUnequip
int nACBonus;
int nSRBonus;
object oPC = OBJECT_SELF;
effect eEffect;
int nLevel = GetHitDice(oPC);
if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) == "anc_it_epiche") //if the item is an equipped epic helmet
{
switch (nLevel)
{
case 40: nACBonus = 12; break;
case 39: nACBonus = 12; break;
case 38: nACBonus = 11; break;
case 37: nACBonus = 11; break;
case 36: nACBonus = 11; break;
case 35: nACBonus = 10; break;
case 34: nACBonus = 9; break;
case 33: nACBonus = 8; break;
case 32: nACBonus = 8; break;
case 31: nACBonus = 7; break;
case 30: nACBonus = 7; break;
case 29: nACBonus = 7; break;
case 28: nACBonus = 7; break;
case 27: nACBonus = 6; break;
case 26: nACBonus = 6; break;
case 25: nACBonus = 5; break;
case 24: nACBonus = 5; break;
case 23: nACBonus = 4; break;
case 22: nACBonus = 4; break;
default: nACBonus = 3; break;
}
eEffect = ExtraordinaryEffect(EffectACIncrease(nACBonus, AC_DEFLECTION_BONUS));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
}
if (GetTag(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)) == "anc_it_epicar" && GetLocalInt(oPC, "X4_CASTER_CLERIC") == FALSE) //if the item is an equipped epic armor
{
switch (nLevel)
{
case 40: nACBonus = 13; break;
case 39: nACBonus = 13; break;
case 38: nACBonus = 12; break;
case 37: nACBonus = 12; break;
case 36: nACBonus = 12; break;
case 35: nACBonus = 10; break;
case 34: nACBonus = 9; break;
case 33: nACBonus = 9; break;
case 32: nACBonus = 9; break;
case 31: nACBonus = 8; break;
case 30: nACBonus = 8; break;
case 29: nACBonus = 7; break;
case 28: nACBonus = 7; break;
case 27: nACBonus = 6; break;
case 26: nACBonus = 6; break;
case 25: nACBonus = 6; break;
case 24: nACBonus = 6; break;
case 23: nACBonus = 4; break;
case 22: nACBonus = 4; break;
default: nACBonus = 3; break;
}
eEffect = ExtraordinaryEffect(EffectACIncrease(nACBonus, AC_ARMOUR_ENCHANTMENT_BONUS));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
}
if (GetTag(GetItemInSlot(INVENTORY_SLOT_BELT, oPC)) == "anc_it_epicsr") //if the item is an equipped epic belt
{
nSRBonus = nLevel-18;
if (nLevel < 21) nSRBonus = 12;
nSRBonus = nSRBonus*2 + 10;
eEffect = ExtraordinaryEffect(EffectSpellResistanceIncrease(nSRBonus));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
}
//Give monks an attack bonus equal to wis modifier / 2
if (GetHasFeat(FEAT_MONK_AC_BONUS, oPC))
{
int nBonus = (GetWisdom(oPC)-10)/4;
effect eBonus = EffectAttackIncrease(nBonus);
eBonus = SupernaturalEffect(eBonus);
if (nBonus > 0) AssignCommand(GetModule(), ApplyEffectToPCAndHideIcon(eBonus, oPC));
}
//Give assassins an attack bonus equal to int modifier
if (GetHasFeat(1120, oPC))
{
int nBonus = (GetIntelligence(oPC)-10)/2;
effect eBonus = EffectAttackIncrease(nBonus);
eBonus = SupernaturalEffect(eBonus);
if (nBonus > 0) AssignCommand(GetModule(), ApplyEffectToPCAndHideIcon(eBonus, oPC));
}
//Apply Dwarven Defender damage reduction
if (GetHasFeat(1118, oPC))
{
int nReduction;
switch (GetLevelByClass(CLASS_TYPE_DWARVEN_DEFENDER, oPC))
{
case 6: nReduction = 3; break;
case 7: nReduction = 3; break;
case 8: nReduction = 3; break;
case 9: nReduction = 3; break;
case 10: nReduction = 6; break;
case 11: nReduction = 6; break;
case 12: nReduction = 6; break;
case 13: nReduction = 6; break;
case 14: nReduction = 9; break;
case 15: nReduction = 9; break;
case 16: nReduction = 9; break;
case 17: nReduction = 9; break;
case 18: nReduction = 12; break;
case 19: nReduction = 12; break;
case 20: nReduction = 12; break;
case 21: nReduction = 12; break;
case 22: nReduction = 15; break;
case 23: nReduction = 15; break;
case 24: nReduction = 15; break;
case 25: nReduction = 15; break;
case 26: nReduction = 18; break;
case 27: nReduction = 18; break;
case 28: nReduction = 18; break;
case 29: nReduction = 18; break;
case 30: nReduction = 21; break;
}
effect eReduction = EffectDamageReduction(nReduction, DAMAGE_POWER_PLUS_TEN);
eReduction = SupernaturalEffect(eReduction);
AssignCommand(GetModule(), ApplyEffectToPCAndHideIcon(eReduction, oPC));
}
//Done applying damage reduction
//Check for Parry being used and apply bonus then
if (GetActionMode(oPC, ACTION_MODE_PARRY)==TRUE)
{
int nParryAC = GetSkillRank(SKILL_PARRY, oPC) / 5;
if(nParryAC>6)nParryAC=6;
effect eParryAC = SupernaturalEffect(EffectACIncrease(nParryAC, AC_DODGE_BONUS));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eParryAC, oPC, 7.0);
}
//End of Parry part
//Halve the normal Tumble AC bonus and restrict Pale Master AC bonus to 6
if (GetSkillRank(SKILL_TUMBLE, oPC, TRUE) != 0 || GetLevelByClass(CLASS_TYPE_PALE_MASTER, oPC) > 11)
{
int nOld = GetSkillRank(SKILL_TUMBLE, oPC, TRUE)/5;
int nNew = GetSkillRank(SKILL_TUMBLE, oPC, TRUE)/10;
int nPalePenalty;
switch (GetLevelByClass(CLASS_TYPE_PALE_MASTER, oPC))
{
case 30: nPalePenalty = 10; break;
case 29: nPalePenalty = 10; break;
case 28: nPalePenalty = 10; break;
case 27: nPalePenalty = 8; break;
case 26: nPalePenalty = 8; break;
case 25: nPalePenalty = 8; break;
case 24: nPalePenalty = 8; break;
case 23: nPalePenalty = 6; break;
case 22: nPalePenalty = 6; break;
case 21: nPalePenalty = 6; break;
case 20: nPalePenalty = 6; break;
case 19: nPalePenalty = 4; break;
case 18: nPalePenalty = 4; break;
case 17: nPalePenalty = 4; break;
case 16: nPalePenalty = 4; break;
case 15: nPalePenalty = 2; break;
case 14: nPalePenalty = 2; break;
case 13: nPalePenalty = 2; break;
case 12: nPalePenalty = 2; break;
}
int nPenalty = nOld - nNew;
if ( GetLevelByClass(CLASS_TYPE_PALE_MASTER, oPC) > 11) nPenalty = nPenalty + nPalePenalty;
effect eEffect = SupernaturalEffect(EffectACDecrease(nPenalty, AC_DODGE_BONUS));
AssignCommand(GetModule(), ApplyEffectToPCAndHideIcon(eEffect, oPC));
}
// Grant the PC dragon immunity if he has that feat
if ( GetHasFeat(1116, oPC) == TRUE )
{
int nType;
switch(GetCreatureWingType(oPC))
{
case 4: nType = DAMAGE_TYPE_FIRE; break; //red dragon disciple
case 34: nType = DAMAGE_TYPE_ACID; break; //black dragon disciple
case 35: nType = DAMAGE_TYPE_ELECTRICAL; break; //blue dragon disciple
case 36: nType = DAMAGE_TYPE_FIRE; break; //brass dragon disciple
case 37: nType = DAMAGE_TYPE_ELECTRICAL; break; //bronze dragon disciple
case 38: nType = DAMAGE_TYPE_ACID; break; //copper dragon disciple
case 39: nType = DAMAGE_TYPE_FIRE; break; //gold dragon disciple
case 40: nType = DAMAGE_TYPE_ACID; break; //green dragon disciple
case 41: nType = DAMAGE_TYPE_COLD; break; //silver dragon disciple
case 42: nType = DAMAGE_TYPE_COLD; break; //white dragon disciple
default: nType = DAMAGE_TYPE_FIRE; break;
}
effect eImmunity = ExtraordinaryEffect(EffectDamageImmunityIncrease(nType, 100));
AssignCommand(GetModule(), ApplyEffectToPCAndHideIcon(eImmunity, oPC));
}
}
void main()
{
DelayCommand(2.0, EpicBonuses());
string sTag;
object oNPC;
// User defined OnSpawn event requested?
int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS");
// Pre Spawn Event requested
if (nSpecEvent == 1 || nSpecEvent == 3 )
{
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN ));
}
sTag=GetLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
if (GetStringLength(sTag)>0)
{ // look for master
oNPC=GetNearestObjectByTag(sTag);
if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE)
{ // master found
AddHenchman(oNPC);
} // master found
else
{ // look in module
oNPC=GetObjectByTag(sTag);
if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE)
{ // master found
AddHenchman(oNPC);
} // master found
else
{ // master does not exist - remove X3_HORSE_OWNER_TAG
DeleteLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
} // master does not exist - remove X3_HORSE_OWNER_TAG
} // look in module
} // look for master
/* Fix for the new golems to reduce their number of attacks */
int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS);
if (nNumber >0 )
{
SetBaseAttackBonus(nNumber);
}
//Apply penalties/bonuses based on world difficulty
string sDifficulty = GetLocalString(GetModule(), "mDiffAdven");
if (sDifficulty != "ADVENTURER")
{
effect eImmunity;
if (sDifficulty == "COMMONER")
{
eImmunity = EffectDamageImmunityDecrease(DAMAGE_TYPE_SLASHING, 25);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_PIERCING, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_BLUDGEONING, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_ACID, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_COLD, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_DIVINE, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_ELECTRICAL, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_FIRE, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_MAGICAL, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_NEGATIVE, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_POSITIVE, 25), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityDecrease(DAMAGE_TYPE_SONIC, 25), eImmunity);
eImmunity = SupernaturalEffect(eImmunity);
}
else
{
int nValue;
if (sDifficulty == "HERO") nValue = 10;
if (sDifficulty == "LEGEND") nValue = 25;
if (sDifficulty == "DEMIGOD") nValue = 50;
eImmunity = EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, nValue);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_POSITIVE, nValue), eImmunity);
eImmunity = EffectLinkEffects(EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, nValue), eImmunity);
eImmunity = SupernaturalEffect(eImmunity);
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity, OBJECT_SELF);
}
// Execute default OnSpawn script.
if (GetLevelByClass(CLASS_TYPE_CLERIC, OBJECT_SELF) != 0) SetLocalInt(OBJECT_SELF, "X4_EXTRA_HEALS", 3);
if(GetLocalInt(GetModule(), "X4_VANILLA_AI") == TRUE /*|| GetLevelByClass(CLASS_TYPE_CLERIC, OBJECT_SELF) != 0*/)
SetLocalInt(OBJECT_SELF, "X4_VANILLA_AI", TRUE);
if(GetLocalInt(OBJECT_SELF, "X4_VANILLA_AI") == TRUE) ExecuteScript("nw_c2_default9_v", OBJECT_SELF);
else ExecuteScript("nw_c2_default9", OBJECT_SELF);
//Post Spawn event requeste
if (nSpecEvent == 2 || nSpecEvent == 3)
{
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN));
}
}