349 lines
15 KiB
Plaintext
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));
|
|
}
|
|
|
|
} |