PRC8_fork/trunk/scripts/prc_blight_undws.nss

173 lines
6.8 KiB
Plaintext
Raw Normal View History

/*
At 3rd level, the blighter gains a version of the wild shape ability. Undead wild shape functions like the druid<69>s wild shape ability,
except that the blighter adds the skeleton template to the animal form he chooses to transform into. The blighter<65>s animal form is
altered as follows:
<EFBFBD> Type changes to undead.
<EFBFBD> Natural armor bonus is +0 (Tiny animal), +1 (Small), +2 (Medium or Large), or +3 (Huge).
<EFBFBD> +2 Dexterity, no Constitution score.
<EFBFBD> Immunity to cold.
<EFBFBD> Damage reduction 5/bludgeoning.
The blighter gains one extra use per day of this ability at every even blighter level after 3rd. In addition, she gains the
ability to take the shape of a Large skeletal animal at 5th level and a Huge skeletal animal at 9th level.
*/
#include "prc_alterations"
#include "pnp_shft_poly"
void wild_shape_shift(object oPC, int nShape)
{
string sResRef = Get2DACache("prc_polymorph", "ResRef", nShape);
StoreCurrentAppearanceAsTrueAppearance(oPC, TRUE);
ShiftIntoResRef(oPC, SHIFTER_TYPE_DRUID, sResRef);
}
void main()
{
//Declare major variables
int nSpell = GetSpellId();
object oTarget = PRCGetSpellTargetObject();
object oPC = OBJECT_SELF;
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
effect ePoly;
int nPoly;
int nMetaMagic = PRCGetMetaMagicFeat();
int nDuration = GetLevelByClass(CLASS_TYPE_BLIGHTER, oPC);
if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK"))
{ // check to see if abort due to being mounted
if (PRCHorseGetIsMounted(oTarget))
{ // abort
if (GetIsPC(oTarget)) FloatingTextStrRefOnCreature(111982,oTarget,FALSE);
return;
} // abort
} // check to see if abort due to being mounted
//this command will make shore that polymorph plays nice with the shifter
ShifterCheck(OBJECT_SELF);
int nShape = GetPersistantLocalInt(oPC, PRC_PNP_SHIFTING + IntToString(nSpell));
if(nShape > 0)
{
wild_shape_shift(oPC, nShape);
//Applying Skeleton template here
SetLocalInt(oPC, "PRC_ShiftingOverride_Race", RACIAL_TYPE_UNDEAD + 1);
DelayCommand(HoursToSeconds(nDuration), DeleteLocalInt(oPC, "PRC_ShiftingOverride_Race"));
effect eLink = EffectLinkEffects(EffectAbilityIncrease(ABILITY_DEXTERITY, 2), EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 5));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_SLASHING, 5));
eLink = EffectLinkEffects(eLink, EffectACIncrease(2, AC_NATURAL_BONUS));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, HoursToSeconds(nDuration));
return;
}
//Determine Polymorph subradial type
if(nSpell == 401)
{
nPoly = POLYMORPH_TYPE_BROWN_BEAR;
if (nDuration >= 9)
{
nPoly = POLYMORPH_TYPE_DIRE_BROWN_BEAR;
}
}
else if (nSpell == 402)
{
nPoly = POLYMORPH_TYPE_PANTHER;
if (nDuration >= 5)
{
nPoly = POLYMORPH_TYPE_DIRE_PANTHER;
}
}
else if (nSpell == 403)
{
nPoly = POLYMORPH_TYPE_WOLF;
if (nDuration >= 5)
{
nPoly = POLYMORPH_TYPE_DIRE_WOLF;
}
}
else if (nSpell == 404)
{
nPoly = POLYMORPH_TYPE_BOAR;
if (nDuration >= 5)
{
nPoly = POLYMORPH_TYPE_DIRE_BOAR;
}
}
else if (nSpell == 405)
{
nPoly = POLYMORPH_TYPE_DIRE_BADGER;
if (nDuration >= 9)
{
nPoly = POLYMORPH_TYPE_GIANT_SPIDER;
}
}
ePoly = EffectPolymorph(nPoly);
ePoly = ExtraordinaryEffect(ePoly);
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE));
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF);
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF);
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF);
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF);
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF);
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF);
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF);
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF);
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF);
if (GetIsObjectValid(oShield))
{
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD &&
GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD)
{
oShield = OBJECT_INVALID;
}
}
ClearAllActions(); // prevents an exploit
//Apply the VFX impact and effects
//Applying Skeleton template here
SetLocalInt(oPC, "PRC_ShiftingOverride_Race", RACIAL_TYPE_UNDEAD + 1);
DelayCommand(HoursToSeconds(nDuration), DeleteLocalInt(oPC, "PRC_ShiftingOverride_Race"));
effect eLink = EffectLinkEffects(EffectAbilityIncrease(ABILITY_DEXTERITY, 2), EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 5));
eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_SLASHING, 5));
eLink = EffectLinkEffects(eLink, EffectACIncrease(2, AC_NATURAL_BONUS));
ePoly = EffectLinkEffects(ePoly, eLink);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePoly, OBJECT_SELF, HoursToSeconds(nDuration));
object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF);
if (bWeapon)
{
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE);
}
if (bArmor)
{
IPWildShapeCopyItemProperties(oShield,oArmorNew);
IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew);
IPWildShapeCopyItemProperties(oArmorOld,oArmorNew);
}
if (bItems)
{
IPWildShapeCopyItemProperties(oRing1Old,oArmorNew);
IPWildShapeCopyItemProperties(oRing2Old,oArmorNew);
IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew);
IPWildShapeCopyItemProperties(oCloakOld,oArmorNew);
IPWildShapeCopyItemProperties(oBootsOld,oArmorNew);
IPWildShapeCopyItemProperties(oBeltOld,oArmorNew);
}
DelayCommand(1.5,ActionCastSpellOnSelf(SPELL_SHAPE_INCREASE_DAMAGE));
}