Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
189 lines
7.3 KiB
Plaintext
189 lines
7.3 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Shifter Traits
|
|
//:: race_shifter.nss
|
|
//::///////////////////////////////////////////////
|
|
/*
|
|
Handles Eberron Shifters' shifting ability
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Fox
|
|
//:: Created On: Feb 19, 2008
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_inc_function"
|
|
#include "prc_inc_natweap"
|
|
|
|
void ApplyPrimaryTrait(object oPC, int nAbility, int nDuration)
|
|
{
|
|
effect eTrait = EffectAbilityIncrease(nAbility, 2);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
|
DelayCommand(RoundsToSeconds(nDuration), ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
|
|
object oPC = OBJECT_SELF;
|
|
int nDuration = 3 + GetAbilityModifier(ABILITY_CONSTITUTION, oPC) + GetShiftingFeats(oPC);
|
|
int nPrimaryTrait = GetPersistantLocalInt(oPC, "FirstShifterTrait");
|
|
|
|
if(GetIsPolyMorphedOrShifted(oPC))
|
|
{
|
|
SendMessageToPC(oPC, "You can only shift in your natural form.");
|
|
return;
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_WILDHUNT, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_WILDHUNT)
|
|
ApplyPrimaryTrait(oPC, ABILITY_CONSTITUTION, nDuration);
|
|
|
|
//scent bonuses
|
|
effect eTrait = EffectSkillIncrease(SKILL_SPOT, 4);
|
|
eTrait = EffectLinkEffects(eTrait, EffectSkillIncrease(SKILL_SEARCH, 4));
|
|
eTrait = EffectLinkEffects(eTrait, EffectSkillIncrease(SKILL_LISTEN, 4));
|
|
if(GetHasFeat(FEAT_WILDHUNT_ELITE))
|
|
eTrait = EffectLinkEffects(eTrait, EffectUltravision());
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_RAZORCLAW, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_RAZORCLAW)
|
|
ApplyPrimaryTrait(oPC, ABILITY_STRENGTH, nDuration);
|
|
|
|
//primary weapon
|
|
string sResRef = "prc_claw_1d6l_";
|
|
int nSize = PRCGetCreatureSize(oPC);
|
|
if(GetHasFeat(FEAT_SHIFTER_SAVAGERY) && GetHasFeatEffect(FEAT_FRENZY, oPC))
|
|
nSize += 2;
|
|
if(nSize > CREATURE_SIZE_COLOSSAL)
|
|
nSize = CREATURE_SIZE_COLOSSAL;
|
|
sResRef += GetAffixForSize(nSize);
|
|
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
|
DelayCommand(RoundsToSeconds(nDuration), RemoveNaturalPrimaryWeapon(oPC, sResRef));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_LONGTOOTH, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_LONGTOOTH)
|
|
ApplyPrimaryTrait(oPC, ABILITY_STRENGTH, nDuration);
|
|
|
|
|
|
string sResRef = "prc_raks_bite_";
|
|
if(GetHasFeat(FEAT_LONGTOOTH_ELITE))
|
|
sResRef = "prc_lngth_elt_";
|
|
int nSize = PRCGetCreatureSize(oPC);
|
|
if(GetHasFeat(FEAT_SHIFTER_SAVAGERY) && GetHasFeatEffect(FEAT_FRENZY, oPC))
|
|
nSize += 2;
|
|
if(nSize > CREATURE_SIZE_COLOSSAL)
|
|
nSize = CREATURE_SIZE_COLOSSAL;
|
|
sResRef += GetAffixForSize(nSize);
|
|
AddNaturalSecondaryWeapon(oPC, sResRef);
|
|
DelayCommand(RoundsToSeconds(nDuration), RemoveNaturalSecondaryWeapons(oPC, sResRef));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_LONGSTRIDE, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_LONGSTRIDE)
|
|
ApplyPrimaryTrait(oPC, ABILITY_DEXTERITY, nDuration);
|
|
|
|
effect eTrait = EffectMovementSpeedIncrease(33);
|
|
if(GetHasFeat(FEAT_LONGSTRIDE_ELITE))
|
|
eTrait = EffectMovementSpeedIncrease(67);
|
|
if(GetHasFeat(FEAT_SHIFTER_AGILITY))
|
|
{
|
|
eTrait = EffectLinkEffects(eTrait, EffectACIncrease(1));
|
|
eTrait = EffectLinkEffects(eTrait, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, 1));
|
|
}
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_BEASTHIDE, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_BEASTHIDE)
|
|
ApplyPrimaryTrait(oPC, ABILITY_CONSTITUTION, nDuration);
|
|
|
|
effect eTrait = EffectACIncrease(2);
|
|
if(GetHasFeat(FEAT_BEASTHIDE_ELITE))
|
|
eTrait = EffectACIncrease(4);
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_DREAMSIGHT, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_DREAMSIGHT)
|
|
ApplyPrimaryTrait(oPC, ABILITY_WISDOM, nDuration);
|
|
|
|
effect eTrait = EffectSkillIncrease(SKILL_ANIMAL_EMPATHY, 2);
|
|
if(GetHasFeat(FEAT_DREAMSIGHT_ELITE))
|
|
{
|
|
eTrait = EffectLinkEffects(eTrait, EffectSeeInvisible());
|
|
eTrait = EffectLinkEffects(eTrait, EffectSkillIncrease(SKILL_SPOT, 5));
|
|
}
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_GOREBRUTE, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_GOREBRUTE)
|
|
ApplyPrimaryTrait(oPC, ABILITY_STRENGTH, nDuration);
|
|
|
|
SetLocalInt(oPC, "ShifterGore", TRUE);
|
|
DelayCommand(RoundsToSeconds(nDuration), DeleteLocalInt(oPC, "ShifterGore"));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_WINTERHIDE, oPC))
|
|
{
|
|
if(nPrimaryTrait == FEAT_SHIFTER_WINTERHIDE)
|
|
ApplyPrimaryTrait(oPC, ABILITY_CONSTITUTION, nDuration);
|
|
|
|
effect eTrait = EffectACIncrease(1, AC_NATURAL_BONUS);
|
|
eTrait = EffectLinkEffects(eTrait, EffectDamageResistance(DAMAGE_TYPE_COLD, 5));
|
|
|
|
eTrait = SupernaturalEffect(eTrait);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTrait, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_HEALING_FACTOR))
|
|
{
|
|
effect eHeal = EffectHeal(GetHitDice(oPC));
|
|
eHeal = EffectLinkEffects(eHeal, EffectVisualEffect(VFX_IMP_HEALING_L));
|
|
DelayCommand(RoundsToSeconds(nDuration), ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_DEFENSE))
|
|
{
|
|
effect eDR = EffectDamageReduction(2, DAMAGE_POWER_PLUS_TWO);
|
|
eDR = SupernaturalEffect(eDR);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDR, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
else if(GetHasFeat(FEAT_GREATER_SHIFTER_DEFENSE))
|
|
{
|
|
effect eDR = EffectDamageReduction(4, DAMAGE_POWER_PLUS_TWO);
|
|
eDR = SupernaturalEffect(eDR);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDR, oPC, RoundsToSeconds(nDuration));
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_SAVAGERY) && GetHasFeatEffect(FEAT_FRENZY, oPC))
|
|
{
|
|
itemproperty ipSavage = ItemPropertyBonusFeat(IP_CONST_FEAT_ImpCritCreature);
|
|
IPSafeAddItemProperty(GetPCSkin(oPC), ipSavage, RoundsToSeconds(nDuration),
|
|
X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
|
|
if(GetHasFeat(FEAT_SHIFTER_FEROCITY))
|
|
{
|
|
itemproperty ipSavage = ItemPropertyBonusFeat(IP_CONST_FEAT_REMAIN_CONCIOUS);
|
|
IPSafeAddItemProperty(GetPCSkin(oPC), ipSavage, RoundsToSeconds(nDuration),
|
|
X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
|
|
} |