Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
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);
|
|
}
|
|
|
|
} |