PRC8/nwn/nwnprc/trunk/include/pnp_shft_main.nss
Jaysyn904 98135e6f1a Minor script tweaks
Minor script tweaks
2024-08-05 19:55:29 -04:00

2294 lines
85 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name Shifter PnP functions
//:: FileName
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Functions used by the shifter class to better simulate the PnP rules
*/
//:://////////////////////////////////////////////
//:: Created By: Shane Hennessy
//:: Created On:
//:://////////////////////////////////////////////
//see inc_prc_poly.nss for using shifter code for other spells/abilitys
//unequips then destroys items
void ClearCreatureItem(object oPC, object oTarget);
//shift from quickslot info
void QuickShift(object oPC, int iQuickSlot);
//asign form to your quick slot
void SetQuickSlot(object oPC, int iIndex, int iQuickSlot, int iEpic);
// Determine the level of the Shifter needed to take on
// oTargets shape.
// Returns 1-10 for Shifter level, 11+ for Total levels
int GetShifterLevelRequired(object oTarget);
// Can the shifter (oPC) assume the form of the target
// return Values: TRUE or FALSE
int GetValidShift(object oPC, object oTarget);
// Determine if the oCreature can wear certain equipment
// nInvSlot INVENTORY_SLOT_*
// Return values: TRUE or FALSE
int GetCanFormEquip(object oCreature, int nInvSlot);
// Determine if the oCreature has the ability to cast spells
// Return values: TRUE or FALSE
int GetCanFormCast(object oCreature);
// Determines if the oCreature is harmless enough to have
// special effects applied to the shifter
// Return values: TRUE or FALSE
int GetIsCreatureHarmless(object oCreature);
// Determines the APPEARANCE_TYPE_* for the PC
// based on the players RACIAL type
int GetTrueForm(object oPC);
/**
* Checks if the target is mounted by checking the bX3_IS_MOUNTED variable (Bioware's default).
* A duplicate of Bioware's HorseGetIsMounted() script with almost no changes. From x3_inc_horse.
* Here because it's called most places ShifterCheck() is called, also added to CanShift()
* Bioware's one not used to avoid circular include hell
* @param oTarget
* @return TRUE if oTarget is mounted
*/
int PRCHorseGetIsMounted(object oTarget);
//is inventory full if yes then CanShift = false else CanShift = true
int CanShift(object oPC);
// Transforms the oPC into the oTarget using the epic rules
// Assumes oTarget is already a valid target
// Return values: TRUE or FALSE
int SetShiftEpic(object oPC, object oTarget);
// helper function to SetVisualTrueForm() for DelayCommand() to work on
void SetBodyPartTrueForm(object oPC, int i);
// Transforms the oPC back to thier true form if they are shifted
// Return values: TRUE or FALSE
void SetShiftTrueForm(object oPC);
// Creates a temporary creature for the shifter to shift into
// Validates the shifter is able to become that creature based on level
// Return values: TRUE or FALSE
int SetShiftFromTemplateValidate(object oPC, string sTemplate, int iEpic);
// Extra item functions
// Copys all the item properties from the target to the destination
void CopyAllItemProperties(object oDestination,object oTarget);
// Removes all the item properties from the item
void RemoveAllItemProperties(object oItem);
// Gets an IP_CONST_FEAT_* from FEAT_*
// returns -1 if the feat is not available
int GetIPFeatFromFeat(int nFeat);
// Determines if the target creature has a certain type of spell
// and sets the powers onto the object item
void SetItemSpellPowers(object oItem, object oTarget);
// Removes leftover aura effects
void RemoveAuraEffect( object oPC );
// Adds a creature to the list of valid GWS shift possibilities
void RecognizeCreature( object oPC, string sTemplate, string sCreatureName );
// Checks to see if the specified creature is a valid GWS shift choice
int IsKnownCreature( object oPC, string sTemplate );
// Shift based on position in the known array
// oTemplate is either the epic or normal template
void ShiftFromKnownArray(int nIndex,int iEpic, object oPC);
//delete form from spark
void DeleteFromKnownArray(int nIndex, object oPC);
//store the appearance of the pc away for unshifting
void StoreAppearance(object oPC);
// Transforms the oPC into the oTarget
// Assumes oTarget is already a valid target
// this is 2 stage
// these 2 scripts replace the origanel setshift script
// (setshift_02 is almost all of the origenal setshift script)
void SetShift(object oPC, object oTarget);
void SetShift_02(object oPC, object oTarget);
// Generic includes
#include "prc_inc_function"
void StoreAppearance(object oPC)
{
if (GetLocalInt(oPC, "shifting") || GetPersistantLocalInt(oPC, "nPCShifted"))
return;
int iIsStored = GetPersistantLocalInt( oPC, "AppearanceIsStored" );
if (iIsStored == 6)
{
//already stored
}
else
{
SetPersistantLocalInt(oPC, "AppearanceIsStored", 6);
SetPersistantLocalInt(oPC, "AppearanceStored", GetAppearanceType(oPC));
SetPersistantLocalInt(oPC, "AppearanceStoredPortraitID", GetPortraitId(oPC));
SetPersistantLocalString(oPC, "AppearanceStoredPortraitResRef", GetPortraitResRef(oPC));
SetPersistantLocalInt(oPC, "AppearanceStoredTail", GetCreatureTailType(oPC));
SetPersistantLocalInt(oPC, "AppearanceStoredWing", GetCreatureWingType(oPC));
int i;
for(i=0;i<=20;i++)
{
SetPersistantLocalInt(oPC, "AppearanceStoredPart"+IntToString(i), GetCreatureBodyPart(i, oPC));
}
}
}
// PURPOSE: Return whether oTarget is mounted
int PRCHorseGetIsMounted(object oTarget)
{
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{
//original function uses GetSkinInt() so we have to get creature skin here
object oSkin = GetIsPC(oTarget) ? GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget) : oTarget;
if(GetLocalInt(oSkin, "bX3_IS_MOUNTED"))
return TRUE;
}
return FALSE;
}
int CanShift(object oPC)
{
int iOutcome = FALSE;
// stop if mounted
if(PRCHorseGetIsMounted(oPC))
{
// bio default poly floaty text
// "You cannot shapeshift while mounted."
if (GetIsPC(oPC)) FloatingTextStrRefOnCreature(111982,oPC,FALSE);
return iOutcome;
}
if (GetLocalInt(oPC, "shifting") || GetPersistantLocalInt(oPC, "nPCShifted"))
{
return iOutcome;
}
object oItem1 = CreateItemOnObject("pnp_shft_tstpkup", oPC);
object oItem2 = CreateItemOnObject("pnp_shft_tstpkup", oPC);
object oItem3 = CreateItemOnObject("pnp_shft_tstpkup", oPC);
object oItem4 = CreateItemOnObject("pnp_shft_tstpkup", oPC);
if ((GetItemPossessor(oItem1) == oPC) && (GetItemPossessor(oItem2) == oPC) && (GetItemPossessor(oItem3) == oPC) && (GetItemPossessor(oItem4) == oPC))
{
iOutcome = TRUE;
}
else
{
SendMessageToPC(oPC, "Your inventory is too full to allow you to (un)shift.");
SendMessageToPC(oPC, "Please make room enough for 4 Helm-sized items and then try again.");
}
DestroyObject(oItem1);
DestroyObject(oItem2);
DestroyObject(oItem3);
DestroyObject(oItem4);
//there are issues with shifting will polymorphed
effect eEff = GetFirstEffect(oPC);
while (GetIsEffectValid(eEff))
{
int eType = GetEffectType(eEff);
if (eType == EFFECT_TYPE_POLYMORPH)
{
SendMessageToPC(oPC, "Shifting when polymorphed has been disabled.");
SendMessageToPC(oPC, "Please cancel your polymorph first.");
return FALSE;
}
eEff = GetNextEffect(oPC);
}
return iOutcome;
}
void QuickShift(object oPC, int iQuickSlot)
{
int iMaxIndex = GetPersistantLocalInt(oPC, "num_creatures");
persistant_array_create(oPC, "QuickSlotIndex");
persistant_array_create(oPC, "QuickSlotEpic");
int iIndex = persistant_array_get_int(oPC, "QuickSlotIndex", iQuickSlot);
int iEpic = persistant_array_get_int(oPC, "QuickSlotEpic", iQuickSlot);
if(!(iIndex>iMaxIndex))
ShiftFromKnownArray(iIndex, iEpic, oPC);
}
void SetQuickSlot(object oPC, int iIndex, int iQuickSlot, int iEpic)
{
persistant_array_create(oPC, "QuickSlotIndex");
persistant_array_create(oPC, "QuickSlotEpic");
persistant_array_set_int(oPC,"QuickSlotIndex",iQuickSlot,iIndex);
persistant_array_set_int(oPC,"QuickSlotEpic",iQuickSlot,iEpic);
}
// Transforms the oPC into the oTarget
// Assumes oTarget is already a valid target
// starts here and then goes to SetShift_02
// stage 1:
// if the shifter if already shifted call unshift to run after this stage ends
// call next stage to start after this stage ends
void SetShift(object oPC, object oTarget)
{
SetLocalInt(oPC, "shifting", TRUE);
SetShiftTrueForm(oPC);
DelayCommand(0.10, SetShift_02(oPC, oTarget));
}
// stage 1 end:
// the shifter is unshifted if need be
// and the next stage is called
// stage 2:
// this is most of what the old SetShift script did
// the changes are:
// no check for if shifted is needed and has been removed
// the epic ability item is done here (if epicshifter var is 1)
// oTarget is destryed in this script if its from the convo
void SetShift_02(object oPC, object oTarget)
{
int nMaxBonus = GetPRCSwitch(PRC_PNP_SHIFTER_BONUS);
int nMaxPen = -10;
//get all the creature items from the target
object oHide = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oTarget);
object oWeapCR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oTarget);
object oWeapCL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oTarget);
object oWeapCB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oTarget);
//get all the creature items from the pc
object oHidePC = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
object oWeapCRPC = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
object oWeapCLPC = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
object oWeapCBPC = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
//creature item handling
if (!GetIsObjectValid(oHidePC)) //if you dont have a hide
{
oHidePC = CopyObject(oHide, GetLocation(oPC), oPC); //copy the targets hide
if (!GetIsObjectValid(oHidePC)) //if the target dont have a hide
{
oHidePC = CreateItemOnObject("shifterhide", oPC); //use a blank shifter hide
}
// Need to ID the stuff before we can put it on the PC
SetIdentified(oHidePC, TRUE);
}
else // if you do have a hide
{
ScrubPCSkin(oPC, oHidePC); //clean off all old props
CopyAllItemProperties(oHidePC, oHide); //copy all target props to our hide
}
DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oHidePC, INVENTORY_SLOT_CARMOUR))); //reequip the hide to get item props to update properly
// Set a flag on the PC to tell us that they are shifted
// set this early to prevent alot of unequip code from firing and causing an overflow
SetPersistantLocalInt(oPC,"nPCShifted",TRUE);
//copy targets right creature weapon
if (GetIsObjectValid(oWeapCRPC)) //if we still have a creature weapon
{
//remove and destroy the weapon we have
DelayCommand(0.90, ClearCreatureItem(oPC, oWeapCRPC));
}
if (GetIsObjectValid(oWeapCR)) //if the target has a weapon
{
oWeapCRPC = CreateItemOnObject("pnp_shft_cweap", oPC); //create a shifter blank creature weapon
CopyAllItemProperties(oWeapCRPC, oWeapCR); //copy all target props over
SetIdentified(oWeapCRPC, TRUE); //id so we dont get any funny stuff when equiping
DelayCommand(0.2, AssignCommand(oPC, ActionEquipItem(oWeapCRPC, INVENTORY_SLOT_CWEAPON_R))); //reequip the item to get item props to update properly
}
//copy targets left creature weapon
if (GetIsObjectValid(oWeapCLPC)) //if we still have a creature weapon
{
//remove and destroy the weapon we have
DelayCommand(0.90, ClearCreatureItem(oPC, oWeapCLPC));
}
if (GetIsObjectValid(oWeapCL)) //if the target has a weapon
{
oWeapCLPC = CreateItemOnObject("pnp_shft_cweap", oPC); //create a shifter blank creature weapon
CopyAllItemProperties(oWeapCLPC, oWeapCL); //copy all target props over
SetIdentified(oWeapCLPC, TRUE); //id so we dont get any funny stuff when equiping
DelayCommand(0.2, AssignCommand(oPC, ActionEquipItem(oWeapCLPC, INVENTORY_SLOT_CWEAPON_L))); //reequip the item to get item props to update properly
}
//copy targets special creature weapons
if (GetIsObjectValid(oWeapCBPC)) //if we still have a creature weapon
{
//remove and destroy the weapon we have
DelayCommand(0.90, ClearCreatureItem(oPC, oWeapCBPC));
}
if (GetIsObjectValid(oWeapCB)) //if the target has a weapon
{
oWeapCBPC = CreateItemOnObject("pnp_shft_cweap", oPC); //create a shifter blank creature weapon
CopyAllItemProperties(oWeapCBPC, oWeapCB); //copy all target props over
SetIdentified(oWeapCBPC, TRUE); //id so we dont get any funny stuff when equiping
DelayCommand(0.2, AssignCommand(oPC, ActionEquipItem(oWeapCBPC, INVENTORY_SLOT_CWEAPON_B))); //reequip the item to get item props to update properly
}
// Get the Targets str, dex, and con
int nTStr = GetAbilityScore(oTarget, ABILITY_STRENGTH);
int nTDex = GetAbilityScore(oTarget, ABILITY_DEXTERITY);
int nTCon = GetAbilityScore(oTarget, ABILITY_CONSTITUTION);
// Get the PCs str, dex, and con from the clone
int nPCStr = GetAbilityScore(oPC, ABILITY_STRENGTH, TRUE);
int nPCDex = GetAbilityScore(oPC, ABILITY_DEXTERITY, TRUE);
int nPCCon = GetAbilityScore(oPC, ABILITY_CONSTITUTION, TRUE);
// Get the deltas
int nStrDelta = nTStr - nPCStr;
int nDexDelta = nTDex - nPCDex;
int nConDelta = nTCon - nPCCon;
int iRemainingSTR;
int iRemainingCON;
int iRemainingDEX;
// Cap max to +nMaxBonus til they can fix it and nMaxPen for the low value
// get remaining bonus/penelty for later
if (nStrDelta > nMaxBonus)
{
iRemainingSTR = nStrDelta - nMaxBonus;
nStrDelta = nMaxBonus;
}
if (nStrDelta < nMaxPen)
{
iRemainingSTR = nStrDelta + 10;
nStrDelta = nMaxPen;
}
if (nDexDelta > nMaxBonus)
{
iRemainingDEX = nDexDelta - nMaxBonus;
nDexDelta = nMaxBonus;
}
if (nDexDelta < nMaxPen)
{
iRemainingDEX = nDexDelta + 10;
nDexDelta = nMaxPen;
}
if (nConDelta > nMaxBonus)
{
iRemainingCON = nConDelta - nMaxBonus;
nConDelta = nMaxBonus;
}
if (nConDelta < nMaxPen)
{
iRemainingCON = nConDelta + 10;
nConDelta = nMaxPen;
}
// Big problem with < 0 to abilities, if they have immunity to ability drain
// the "-" to the ability wont do anything
// Apply these boni to the creature hide
if (nStrDelta > 0)
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR, nStrDelta), oHidePC);
else
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDecreaseAbility(IP_CONST_ABILITY_STR, nStrDelta*-1), oHidePC);
if (nDexDelta > 0)
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX, nDexDelta), oHidePC);
else
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDecreaseAbility(IP_CONST_ABILITY_DEX, nDexDelta*-1), oHidePC);
if (nConDelta > 0)
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_CON, nConDelta), oHidePC);
else
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDecreaseAbility(IP_CONST_ABILITY_CON, nConDelta*-1), oHidePC);
//add extra str bonuses to pc as attack bonues and damage bonus
int iExtSTRBon;
effect eAttackIncrease;
effect eDamageIncrease;
if (iRemainingSTR != 0)
{
int iDamageType = DAMAGE_TYPE_BLUDGEONING;
iExtSTRBon = FloatToInt(iRemainingSTR/2.0);
if (GetIsObjectValid(oWeapCR))
{
int iCR = GetBaseItemType(oWeapCR);
if ((iCR == BASE_ITEM_CSLASHWEAPON) || (iCR == BASE_ITEM_CSLSHPRCWEAP))
iDamageType = DAMAGE_TYPE_SLASHING;
else if (iCR == BASE_ITEM_CPIERCWEAPON)
iDamageType = DAMAGE_TYPE_PIERCING;
}
else if (GetIsObjectValid(oWeapCL))
{
int iCL = GetBaseItemType(oWeapCL);
if ((iCL == BASE_ITEM_CSLASHWEAPON) || (iCL == BASE_ITEM_CSLSHPRCWEAP))
iDamageType = DAMAGE_TYPE_SLASHING;
else if (iCL == BASE_ITEM_CPIERCWEAPON)
iDamageType = DAMAGE_TYPE_PIERCING;
}
else if (GetIsObjectValid(oWeapCB))
{
int iCB = GetBaseItemType(oWeapCB);
if ((iCB == BASE_ITEM_CSLASHWEAPON) || (iCB == BASE_ITEM_CSLSHPRCWEAP))
iDamageType = DAMAGE_TYPE_SLASHING;
else if (iCB == BASE_ITEM_CPIERCWEAPON)
iDamageType = DAMAGE_TYPE_PIERCING;
}
int iDamageB;
switch (iExtSTRBon)
{
case 0:
iDamageB = 0;
break;
case 1:
case -1:
iDamageB = DAMAGE_BONUS_1;
break;
case 2:
case -2:
iDamageB = DAMAGE_BONUS_2;
break;
case 3:
case -3:
iDamageB = DAMAGE_BONUS_3;
break;
case 4:
case -4:
iDamageB = DAMAGE_BONUS_4;
break;
case 5:
case -5:
iDamageB = DAMAGE_BONUS_5;
break;
case 6:
case -6:
iDamageB = DAMAGE_BONUS_6;
break;
case 7:
case -7:
iDamageB = DAMAGE_BONUS_7;
break;
case 8:
case -8:
iDamageB = DAMAGE_BONUS_8;
break;
case 9:
case -9:
iDamageB = DAMAGE_BONUS_9;
break;
case 10:
case -10:
iDamageB = DAMAGE_BONUS_10;
break;
case 11:
case -11:
iDamageB = DAMAGE_BONUS_11;
break;
case 12:
case -12:
iDamageB = DAMAGE_BONUS_12;
break;
case 13:
case -13:
iDamageB = DAMAGE_BONUS_13;
break;
case 14:
case -14:
iDamageB = DAMAGE_BONUS_14;
break;
case 15:
case -15:
iDamageB = DAMAGE_BONUS_15;
break;
case 16:
case -16:
iDamageB = DAMAGE_BONUS_16;
break;
case 17:
case -17:
iDamageB = DAMAGE_BONUS_17;
break;
case 18:
case -18:
iDamageB = DAMAGE_BONUS_18;
break;
case 19:
case -19:
iDamageB = DAMAGE_BONUS_19;
break;
default:
iDamageB = DAMAGE_BONUS_20;
break;
}
if (iRemainingSTR > 0)
{
eAttackIncrease = EffectAttackIncrease(iDamageB, ATTACK_BONUS_MISC);
eDamageIncrease = EffectDamageIncrease(iDamageB, iDamageType);
}
else if (iRemainingSTR < 0)
{
eAttackIncrease = EffectAttackDecrease(iDamageB, ATTACK_BONUS_MISC);
eDamageIncrease = EffectDamageDecrease(iDamageB, iDamageType);
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eAttackIncrease),oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eDamageIncrease),oPC);
}
//add extra con bonus as temp HP
if (iRemainingCON > 0)
{
int iExtCONBon = FloatToInt(iRemainingCON/2.0);
effect eTemporaryHitpoints = EffectTemporaryHitpoints(iExtCONBon * GetHitDice(oPC));
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eTemporaryHitpoints),oPC);
}
// Apply the natural AC bonus to the hide
// First get the AC from the target
int nTAC = GetAC(oTarget);
nTAC -= GetAbilityModifier(ABILITY_DEXTERITY, oTarget);
// All creatures have 10 base AC
nTAC -= 10;
int i;
for (i=0; i < NUM_INVENTORY_SLOTS; i++)
{
nTAC -= GetItemACValue(GetItemInSlot(i,oTarget));
}
if (nTAC > 0)
{
effect eAC = EffectACIncrease(nTAC,AC_NATURAL_BONUS);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eAC),oPC);
}
//add extra dex bonus as dodge ac
if (iRemainingDEX != 0)
{
int iExtDEXBon = FloatToInt(iRemainingDEX/2.0);
effect eACIncrease;
if (iRemainingDEX > 0)
{
object oPCArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
if (GetIsObjectValid(oPCArmour))
{
int iACArmour = GetItemACValue(oPCArmour);
int iMaxDexBon;
int iCurentDexBon;
iCurentDexBon = FloatToInt(((nPCDex + nStrDelta)-10.0)/2.0);
switch (iACArmour)
{
case 8:
case 7:
case 6:
iMaxDexBon = 1;
break;
case 5:
iMaxDexBon = 2;
break;
case 4:
case 3:
iMaxDexBon = 4;
break;
case 2:
iMaxDexBon = 6;
break;
case 1:
iMaxDexBon = 8;
break;
default:
iMaxDexBon = 100;
break;
}
if (iCurentDexBon > iMaxDexBon)
{
iExtDEXBon = 0;
}
else
{
if ((iExtDEXBon+iCurentDexBon) > iMaxDexBon)
{
iExtDEXBon = iMaxDexBon - iCurentDexBon;
}
}
}
eACIncrease = EffectACIncrease(iExtDEXBon);
}
else if (iRemainingDEX < 0)
{
eACIncrease = EffectACDecrease(iExtDEXBon * -1);
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eACIncrease),oPC);
}
// Apply any feats the target has to the hide as a bonus feat
for (i = 0; i< 500; i++)
{
if (GetHasFeat(i,oTarget))
{
int nIP = GetIPFeatFromFeat(i);
if(nIP != -1)
{
itemproperty iProp = PRCItemPropertyBonusFeat(nIP);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oHidePC);
}
}
}
// Fix the biobugged Improved Critical (creature) by giving the PC Improved Critical (unarmed) which seems
// to work with creature weapons
if (!GetHasFeat(FEAT_IMPROVED_CRITICAL_UNARMED_STRIKE, oPC) && GetHasFeat(FEAT_IMPROVED_CRITICAL_CREATURE, oPC))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_IMPCRITUNARM),oHidePC);
// If they dont have the natural spell feat they can only cast spells in certain shapes
if (!GetHasFeat(FEAT_PRESTIGE_SHIFTER_NATURALSPELL,oPC))
{
if (!GetCanFormCast(oTarget))
{
// remove the ability from the PC to cast
effect eNoCast = EffectSpellFailure();
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eNoCast),oPC);
}
}
// If the creature is "harmless" give it a perm invis for stealth
if(GetIsCreatureHarmless(oTarget))
{
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_NORMAL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(eInvis),oPC);
}
// Change the Appearance of the PC
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH), oPC);
//get the appearance of oTarget
int iAppearance = GetLocalInt(oTarget,"Appearance");
if (iAppearance>0)
SetCreatureAppearanceType(oPC,iAppearance);
else
SetCreatureAppearanceType(oPC,GetAppearanceType(oTarget));
//do 1.67 stuff
//wing/tails
SetCreatureWingType(GetCreatureWingType(oTarget), oPC);
SetCreatureTailType(GetCreatureTailType(oTarget), oPC);
//portrait
SetPortraitResRef(oPC, GetPortraitResRef(oTarget));
SetPortraitId(oPC, GetPortraitId(oTarget));
//bodyparts
for(i=0;i<=20;i++)
{
DelayCommand(1.0, SetCreatureBodyPart(i, GetCreatureBodyPart(i, oTarget), oPC));
}
// For spells to make sure they now treat you like the new race
SetLocalInt(oPC,"RACIAL_TYPE",MyPRCGetRacialType(oTarget)+1);
// PnP rules say the shifter would heal as if they rested
effect eHeal = EffectHeal(GetHitDice(oPC)*d4());
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHeal,oPC);
//epic shift
if (GetLocalInt(oPC,"EpicShift"))
{
// Create some sort of usable item to represent monster spells
object oEpicPowersItem; // = GetItemPossessedBy(oPC,"EpicShifterPowers");
//if (!GetIsObjectValid(oEpicPowersItem))
oEpicPowersItem = CreateItemOnObject("epicshifterpower",oPC);
SetItemSpellPowers(oEpicPowersItem,oTarget);
}
//clear epic shift var
SetLocalInt(oPC,"EpicShift",0);
//remove oTarget if it is from the template
int iDeleteMe = GetLocalInt(oTarget,"pnp_shifter_deleteme");
if (iDeleteMe==1)
{
// Remove the temporary creature
AssignCommand(oTarget,SetIsDestroyable(TRUE,FALSE,FALSE));
SetPlotFlag(oTarget,FALSE);
SetImmortal(oTarget,FALSE);
DestroyObject(oTarget);
}
// Reset any PRC feats that might have been lost from the shift
DelayCommand(1.0, EvalPRCFeats(oPC));
DelayCommand(3.0, DeleteLocalInt(oPC, "shifting"));
SendMessageToPC(oPC, "Finished shifting");
}
// stage 2 end:
// the target is distroyed(target only if not mimic target)
// all effects and item propertys are applyed to you and your hide/cweapons
void RecognizeCreature( object oPC, string sTemplate, string sCreatureName )
{
// Only add new ones
if (IsKnownCreature(oPC,sTemplate))
return;
int num_creatures = GetPersistantLocalInt( oPC, "num_creatures" );
persistant_array_create(oPC, "shift_choice");
persistant_array_create(oPC, "shift_choice_name");
persistant_array_set_string( oPC, "shift_choice", num_creatures, sTemplate );
persistant_array_set_string( oPC, "shift_choice_name", num_creatures, sCreatureName );//added the line to store the name as well as the resref
SetPersistantLocalInt( oPC, "num_creatures", num_creatures+1 );
}
int IsKnownCreature( object oPC, string sTemplate )
{
// object oMimicForms = GetItemPossessedBy( oPC, "sparkoflife" );
int num_creatures = GetPersistantLocalInt( oPC, "num_creatures" );
int i;
string cmp;
for ( i=0; i<num_creatures; i++ )
{
cmp = persistant_array_get_string( oPC, "shift_choice", i );
if ( TestStringAgainstPattern( cmp, sTemplate ) )
{
return TRUE;
}
}
return FALSE;
}
void DeleteFromKnownArray(int nIndex, object oPC)
{
// object oMimicForms = GetItemPossessedBy( oPC, "sparkoflife" );
int num_creatures = GetPersistantLocalInt( oPC, "num_creatures" );
int i;
persistant_array_create(oPC, "shift_choice");
persistant_array_create(oPC, "shift_choice_name");
for ( i=nIndex; i<(num_creatures-1); i++ )
{
persistant_array_set_string( oPC, "shift_choice", i, persistant_array_get_string( oPC, "shift_choice", i+1 ));
persistant_array_set_string( oPC, "shift_choice_name", i, persistant_array_get_string( oPC, "shift_choice_name", i+1 ));
}
persistant_array_shrink(oPC, "shift_choice", num_creatures-1);
persistant_array_shrink(oPC, "shift_choice_name", num_creatures-1);
SetPersistantLocalInt(oPC, "num_creatures", num_creatures-1 );
}
// Shift based on position in the known array
void ShiftFromKnownArray(int nIndex, int iEpic, object oPC)
{
// Find the name
string sResRef = persistant_array_get_string(oPC, "shift_choice", nIndex);
if (iEpic == TRUE)
{
// epic shift
SetShiftFromTemplateValidate(oPC, sResRef, TRUE);
}
else
{
// Force a normal shift
SetShiftFromTemplateValidate(oPC, sResRef, FALSE);
}
}
// This is a duplicate of PRCRemoveEffectsFromSpell, it prevents calling unneeded includes
void RemoveEffectsFromPoly(int SpellID, object oTarget)
{
effect eLook = GetFirstEffect(oTarget);
while (GetIsEffectValid(eLook)) {
if (GetEffectSpellId(eLook) == SpellID)
RemoveEffect(oTarget, eLook);
eLook = GetNextEffect(oTarget);
}
}
// Remove "dangling" aura effects on trueform shift
// Now only removes things it should remove (i.e., auras)
void RemoveAuraEffect( object oPC )
{
if ( GetHasSpellEffect(SPELLABILITY_AURA_BLINDING, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_BLINDING, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_COLD, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_COLD, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_ELECTRICITY, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_ELECTRICITY, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_FEAR, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_FEAR, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_FIRE, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_FIRE, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_MENACE, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_MENACE, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_PROTECTION, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_STUN, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_STUN, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_UNEARTHLY_VISAGE, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_UNEARTHLY_VISAGE, oPC);
if ( GetHasSpellEffect(SPELLABILITY_AURA_UNNATURAL, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_AURA_UNNATURAL, oPC);
if ( GetHasSpellEffect(SPELLABILITY_DRAGON_FEAR, oPC) )
RemoveEffectsFromPoly( SPELLABILITY_DRAGON_FEAR, oPC);
}
void CopyAllItemProperties(object oDestination, object oTarget)
{
itemproperty iProp = GetFirstItemProperty(oTarget);
while (GetIsItemPropertyValid(iProp))
{
AddItemProperty(GetItemPropertyDurationType(iProp), iProp, oDestination);
iProp = GetNextItemProperty(oTarget);
}
}
void RemoveAllItemProperties(object oItem)
{
itemproperty iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
// SendMessageToPC(GetItemPossessor(oItem),"item prop type-" + IntToString(GetItemPropertyType(iProp)));
RemoveItemProperty(oItem,iProp);
iProp = GetNextItemProperty(oItem);
}
// for a skin and prcs to get their feats back
DeletePRCLocalInts(oItem);
}
// Gets an IP_CONST_FEAT_* from FEAT_*
// -1 is an invalid IP_CONST_FEAT
int GetIPFeatFromFeat(int nFeat)
{
switch (nFeat)
{
case FEAT_ALERTNESS:
return IP_CONST_FEAT_ALERTNESS;
case FEAT_AMBIDEXTERITY:
return IP_CONST_FEAT_AMBIDEXTROUS;
case FEAT_ARMOR_PROFICIENCY_HEAVY:
return IP_CONST_FEAT_ARMOR_PROF_HEAVY;
case FEAT_ARMOR_PROFICIENCY_LIGHT:
return IP_CONST_FEAT_ARMOR_PROF_LIGHT;
case FEAT_ARMOR_PROFICIENCY_MEDIUM:
return IP_CONST_FEAT_ARMOR_PROF_MEDIUM;
case FEAT_CLEAVE:
return IP_CONST_FEAT_CLEAVE;
case FEAT_COMBAT_CASTING:
return IP_CONST_FEAT_COMBAT_CASTING;
case FEAT_DODGE:
return IP_CONST_FEAT_DODGE;
case FEAT_EXTRA_TURNING:
return IP_CONST_FEAT_EXTRA_TURNING;
case FEAT_IMPROVED_CRITICAL_UNARMED_STRIKE:
return IP_CONST_FEAT_IMPCRITUNARM;
case FEAT_IMPROVED_KNOCKDOWN:
case FEAT_KNOCKDOWN:
return IP_CONST_FEAT_KNOCKDOWN;
case FEAT_POINT_BLANK_SHOT:
return IP_CONST_FEAT_POINTBLANK;
case FEAT_POWER_ATTACK:
case FEAT_IMPROVED_POWER_ATTACK:
return IP_CONST_FEAT_POWERATTACK;
case FEAT_SPELL_FOCUS_ABJURATION:
case FEAT_EPIC_SPELL_FOCUS_ABJURATION:
case FEAT_GREATER_SPELL_FOCUS_ABJURATION:
return IP_CONST_FEAT_SPELLFOCUSABJ;
case FEAT_SPELL_FOCUS_CONJURATION:
case FEAT_EPIC_SPELL_FOCUS_CONJURATION:
case FEAT_GREATER_SPELL_FOCUS_CONJURATION:
return IP_CONST_FEAT_SPELLFOCUSCON;
case FEAT_SPELL_FOCUS_DIVINATION:
case FEAT_EPIC_SPELL_FOCUS_DIVINATION:
case FEAT_GREATER_SPELL_FOCUS_DIVINIATION:
return IP_CONST_FEAT_SPELLFOCUSDIV;
case FEAT_SPELL_FOCUS_ENCHANTMENT:
case FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT:
case FEAT_GREATER_SPELL_FOCUS_ENCHANTMENT:
return IP_CONST_FEAT_SPELLFOCUSENC;
case FEAT_SPELL_FOCUS_EVOCATION:
case FEAT_EPIC_SPELL_FOCUS_EVOCATION:
case FEAT_GREATER_SPELL_FOCUS_EVOCATION:
return IP_CONST_FEAT_SPELLFOCUSEVO;
case FEAT_SPELL_FOCUS_ILLUSION:
case FEAT_EPIC_SPELL_FOCUS_ILLUSION:
case FEAT_GREATER_SPELL_FOCUS_ILLUSION:
return IP_CONST_FEAT_SPELLFOCUSILL;
case FEAT_SPELL_FOCUS_NECROMANCY:
case FEAT_EPIC_SPELL_FOCUS_NECROMANCY:
case FEAT_GREATER_SPELL_FOCUS_NECROMANCY:
return IP_CONST_FEAT_SPELLFOCUSNEC;
case FEAT_SPELL_PENETRATION:
case FEAT_EPIC_SPELL_PENETRATION:
case FEAT_GREATER_SPELL_PENETRATION:
return IP_CONST_FEAT_SPELLPENETRATION;
case FEAT_TWO_WEAPON_FIGHTING:
case FEAT_IMPROVED_TWO_WEAPON_FIGHTING:
return IP_CONST_FEAT_TWO_WEAPON_FIGHTING;
case FEAT_WEAPON_FINESSE:
return IP_CONST_FEAT_WEAPFINESSE;
case FEAT_WEAPON_PROFICIENCY_EXOTIC:
return IP_CONST_FEAT_WEAPON_PROF_EXOTIC;
case FEAT_WEAPON_PROFICIENCY_MARTIAL:
return IP_CONST_FEAT_WEAPON_PROF_MARTIAL;
case FEAT_WEAPON_PROFICIENCY_SIMPLE:
return IP_CONST_FEAT_WEAPON_PROF_SIMPLE;
case FEAT_IMPROVED_UNARMED_STRIKE:
return IP_CONST_FEAT_WEAPSPEUNARM;
// Some undefined ones
case FEAT_DISARM:
return 28;
case FEAT_HIDE_IN_PLAIN_SIGHT:
return 31;
case FEAT_MOBILITY:
return 27;
case FEAT_RAPID_SHOT:
return 30;
case FEAT_SHIELD_PROFICIENCY:
return 35;
case FEAT_SNEAK_ATTACK:
return 32;
case FEAT_USE_POISON:
return 36;
case FEAT_WHIRLWIND_ATTACK:
return 29;
case FEAT_WEAPON_PROFICIENCY_CREATURE:
return 38;
// whip disarm is 37
}
return (-1);
}
// Determines if the target creature has a certain type of spell
// and sets the powers onto the object item
void SetItemSpellPowers(object oItem, object oCreature)
{
itemproperty iProp;
int total_props = 0; //max of 8 properties on one item
int max_props = 7;
//first, auras--only want to allow one aura power to transfer
if ( GetHasSpell(SPELLABILITY_AURA_BLINDING, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(750,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_COLD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(751,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_ELECTRICITY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(752,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_FEAR, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(753,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_FIRE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(754,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_MENACE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(755,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_PROTECTION, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(756,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_STUN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(757,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_UNEARTHLY_VISAGE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(758,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_AURA_UNNATURAL, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(759,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//now, bolts
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_CHARISMA, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(760,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_CONSTITUTION, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(761,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_DEXTERITY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(762,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_INTELLIGENCE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(763,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_STRENGTH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(764,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ABILITY_DRAIN_WISDOM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(765,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_ACID, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(766,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_CHARM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(767,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_COLD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(768,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_CONFUSE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(769,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_DAZE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(770,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_DEATH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(771,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_DISEASE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(772,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_DOMINATE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(773,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_FIRE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(774,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_KNOCKDOWN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(775,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_LEVEL_DRAIN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(776,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_LIGHTNING, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(777,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_PARALYZE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(778,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_POISON, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(779,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_SHARDS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(780,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_SLOW, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(781,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_STUN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(782,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_BOLT_WEB, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(783,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//now, cones
if ( GetHasSpell(SPELLABILITY_CONE_ACID, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(784,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_COLD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(785,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_DISEASE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(786,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_FIRE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(787,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_LIGHTNING, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(788,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_POISON, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(789,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_CONE_SONIC, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(790,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//various petrify attacks
if ( GetHasSpell(SPELLABILITY_BREATH_PETRIFY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(791,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_PETRIFY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(792,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_TOUCH_PETRIFY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(793,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//dragon stuff (fear aura, breaths)
if ( GetHasSpell(SPELLABILITY_DRAGON_FEAR, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(796,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_ACID, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(400,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_COLD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(401,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_FEAR, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(402,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_FIRE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(403,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_GAS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(404,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_LIGHTNING, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(405,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(698, oCreature) && (total_props <= max_props) ) //NEGATIVE
{
iProp = ItemPropertyCastSpell(794,IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_PARALYZE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(406,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_SLEEP, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(407,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_SLOW, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(408,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_DRAGON_BREATH_WEAKEN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(409,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(771, oCreature) && (total_props <= max_props) ) //PRISMATIC
{
iProp = ItemPropertyCastSpell(795,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//gaze attacks
if ( GetHasSpell(SPELLABILITY_GAZE_CHARM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(797,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_CONFUSION, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(798,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DAZE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(799,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DEATH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(800,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DESTROY_CHAOS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(801,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DESTROY_EVIL, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(802,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DESTROY_GOOD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(803,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DESTROY_LAW, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(804,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DOMINATE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(805,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_DOOM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(806,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_FEAR, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(807,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_PARALYSIS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(808,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_GAZE_STUNNED, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(809,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//miscellaneous abilities
if ( GetHasSpell(SPELLABILITY_GOLEM_BREATH_GAS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(810,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HELL_HOUND_FIREBREATH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(811,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_KRENSHAR_SCARE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(812,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//howls
if ( GetHasSpell(SPELLABILITY_HOWL_CONFUSE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(813,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_DAZE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(814,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_DEATH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(815,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_DOOM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(816,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_FEAR, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(817,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_PARALYSIS, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(818,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_SONIC, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(819,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_HOWL_STUN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(820,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//pulses
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_CHARISMA, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(821,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_CONSTITUTION, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(822,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_DEXTERITY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(823,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_INTELLIGENCE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(824,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_STRENGTH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(825,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_ABILITY_DRAIN_WISDOM, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(826,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_COLD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(827,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_DEATH, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(828,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_DISEASE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(829,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_DROWN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(830,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_FIRE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(831,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_HOLY, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(832,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_LEVEL_DRAIN, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(833,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_LIGHTNING, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(834,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_NEGATIVE, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(835,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_POISON, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(836,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_SPORES, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(837,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_PULSE_WHIRLWIND, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(838,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//monster summon abilities
if ( GetHasSpell(SPELLABILITY_SUMMON_SLAAD, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(839,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(SPELLABILITY_SUMMON_TANARRI, oCreature) && (total_props <= max_props) )
{
iProp = ItemPropertyCastSpell(840,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//abilities without const refs
if ( GetHasSpell(552, oCreature) && (total_props <= max_props) ) //PSIONIC CHARM
{
iProp = ItemPropertyCastSpell(841,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(551, oCreature) && (total_props <= max_props) ) //PSIONIC MINDBLAST
{
iProp = ItemPropertyCastSpell(842,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(713, oCreature) && (total_props <= max_props) ) //MINDBLAST 10M
{
iProp = ItemPropertyCastSpell(843,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(741, oCreature) && (total_props <= max_props) ) //PSIONIC BARRIER
{
iProp = ItemPropertyCastSpell(844,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(763, oCreature) && (total_props <= max_props) ) //PSIONIC CONCUSSION
{
iProp = ItemPropertyCastSpell(845,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(731, oCreature) && (total_props <= max_props) ) //BEBILITH WEB
{
iProp = ItemPropertyCastSpell(846,IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(736, oCreature) && (total_props <= max_props) ) //BEHOLDER EYES
{
iProp = ItemPropertyCastSpell(847,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(770, oCreature) && (total_props <= max_props) ) //CHAOS SPITTLE
{
iProp = ItemPropertyCastSpell(848,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(757, oCreature) && (total_props <= max_props) ) //SHADOWBLEND
{
iProp = ItemPropertyCastSpell(849,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ( GetHasSpell(774, oCreature) && (total_props <= max_props) ) //DEFLECTING FORCE
{
iProp = ItemPropertyCastSpell(850,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
//some spell-like abilities
if (((GetHasSpell(SPELL_DARKNESS,oCreature)) ||
(GetHasSpell(SPELLABILITY_AS_DARKNESS,oCreature))) &&
(total_props <= max_props))
{
iProp = ItemPropertyCastSpell(IP_CONST_CASTSPELL_DARKNESS_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ((GetHasSpell(SPELL_DISPLACEMENT,oCreature)) && (total_props <= max_props))
{
iProp = ItemPropertyCastSpell(IP_CONST_CASTSPELL_DISPLACEMENT_9,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if (((GetHasSpell(SPELLABILITY_AS_INVISIBILITY,oCreature)) ||
(GetHasSpell(SPELL_INVISIBILITY,oCreature))) &&
(total_props <= max_props))
{
iProp = ItemPropertyCastSpell(IP_CONST_CASTSPELL_INVISIBILITY_3,IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
if ((GetHasSpell(SPELL_WEB,oCreature)) && (total_props <= max_props))
{
iProp = ItemPropertyCastSpell(IP_CONST_CASTSPELL_WEB_3,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY);
AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oItem);
total_props++;
}
}
// Determines the level of the shifter class needed to take on
// oTargets shape.
// Returns 1nMaxPen for Shifter level
// 1000 means they can never take the shape
int GetShifterLevelRequired(object oTarget)
{
int nTRacialType = MyPRCGetRacialType(oTarget);
int nLevelRequired = 0;
if ((nTRacialType == RACIAL_TYPE_FEY) || (nTRacialType == RACIAL_TYPE_SHAPECHANGER))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if (GetHasFeat(SHIFTER_BLACK_LIST,oTarget))
{
nLevelRequired = 1000;
return nLevelRequired;
}
int nTSize = GetCreatureSize(oTarget);
int iAllowHuge = GetLocalInt(GetModule(),"PNP_SHFT_S_HUGE");
int iAllowLarge = GetLocalInt(GetModule(),"PNP_SHFT_S_LARGE");
int iAllowMedium = GetLocalInt(GetModule(),"PNP_SHFT_S_MEDIUM");
int iAllowSmall = GetLocalInt(GetModule(),"PNP_SHFT_S_SMALL");
int iAllowTiny = GetLocalInt(GetModule(),"PNP_SHFT_S_TINY");
int iAllowOutsider = GetLocalInt(GetModule(),"PNP_SHFT_F_OUTSIDER");
int iAllowElemental = GetLocalInt(GetModule(),"PNP_SHFT_F_ELEMENTAL");
int iAllowConstruct = GetLocalInt(GetModule(),"PNP_SHFT_F_CONSTRUCT");
int iAllowUndead = GetLocalInt(GetModule(),"PNP_SHFT_F_UNDEAD");
int iAllowDragon = GetLocalInt(GetModule(),"PNP_SHFT_F_DRAGON");
int iAllowAberration = GetLocalInt(GetModule(),"PNP_SHFT_F_ABERRATION");
int iAllowOoze = GetLocalInt(GetModule(),"PNP_SHFT_F_OOZE");
int iAllowMagicalBeast = GetLocalInt(GetModule(),"PNP_SHFT_F_MAGICALBEAST");
int iAllowGiant = GetLocalInt(GetModule(),"PNP_SHFT_F_GIANT");
int iAllowVermin = GetLocalInt(GetModule(),"PNP_SHFT_F_VERMIN");
int iAllowBeast = GetLocalInt(GetModule(),"PNP_SHFT_F_BEAST");
int iAllowAnimal = GetLocalInt(GetModule(),"PNP_SHFT_F_ANIMAL");
int iAllowMonstrousHumanoid = GetLocalInt(GetModule(),"PNP_SHFT_F_MONSTROUSHUMANOID");
int iAllowHumanoid = GetLocalInt(GetModule(),"PNP_SHFT_F_HUMANOID");
// Size validation
if ((nTSize == CREATURE_SIZE_HUGE) && (iAllowHuge == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTSize == CREATURE_SIZE_LARGE) && (iAllowLarge == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTSize == CREATURE_SIZE_MEDIUM) && (iAllowMedium == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTSize == CREATURE_SIZE_SMALL) && (iAllowSmall == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTSize == CREATURE_SIZE_TINY) && (iAllowTiny == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
// Type validation
if ((nTRacialType == RACIAL_TYPE_OUTSIDER) && (iAllowOutsider == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_ELEMENTAL) && (iAllowElemental == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_CONSTRUCT) && (iAllowConstruct == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_UNDEAD) && (iAllowUndead == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_DRAGON) && (iAllowDragon == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_ABERRATION) && (iAllowAberration == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_OOZE) && (iAllowOoze == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_MAGICAL_BEAST) && (iAllowMagicalBeast == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_GIANT) && (iAllowGiant == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_VERMIN) && (iAllowVermin == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_BEAST) && (iAllowBeast == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_ANIMAL) && (iAllowAnimal == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((nTRacialType == RACIAL_TYPE_HUMANOID_MONSTROUS) && (iAllowMonstrousHumanoid == 1))
{
nLevelRequired = 1000;
return nLevelRequired;
}
if ((iAllowHumanoid == 1) && (
(nTRacialType == RACIAL_TYPE_DWARF) ||
(nTRacialType == RACIAL_TYPE_ELF) ||
(nTRacialType == RACIAL_TYPE_GNOME) ||
(nTRacialType == RACIAL_TYPE_HUMAN) ||
(nTRacialType == RACIAL_TYPE_HALFORC) ||
(nTRacialType == RACIAL_TYPE_HALFELF) ||
(nTRacialType == RACIAL_TYPE_HALFLING) ||
(nTRacialType == RACIAL_TYPE_HUMANOID_ORC) ||
(nTRacialType == RACIAL_TYPE_HUMANOID_REPTILIAN)))
{
nLevelRequired = 1000;
return nLevelRequired;
}
// Size validation
if ((nTSize == CREATURE_SIZE_HUGE) && (nLevelRequired < 7))
nLevelRequired = 7;
if ((nTSize == CREATURE_SIZE_LARGE) && (nLevelRequired < 3))
nLevelRequired = 3;
if ((nTSize == CREATURE_SIZE_MEDIUM) && (nLevelRequired < 1))
nLevelRequired = 1;
if ((nTSize == CREATURE_SIZE_SMALL) && (nLevelRequired < 1))
nLevelRequired = 1;
if ((nTSize == CREATURE_SIZE_TINY) && (nLevelRequired < 3))
nLevelRequired = 3;
// Type validation
if ((nTRacialType == RACIAL_TYPE_OUTSIDER) && (nLevelRequired < 9))
nLevelRequired = 9;
if ((nTRacialType == RACIAL_TYPE_ELEMENTAL) && (nLevelRequired < 9))
nLevelRequired = 9;
if ((nTRacialType == RACIAL_TYPE_CONSTRUCT) && (nLevelRequired < 8))
nLevelRequired = 8;
if ((nTRacialType == RACIAL_TYPE_UNDEAD) && (nLevelRequired < 8))
nLevelRequired = 8;
if ((nTRacialType == RACIAL_TYPE_DRAGON) && (nLevelRequired < 7))
nLevelRequired = 7;
if ((nTRacialType == RACIAL_TYPE_ABERRATION) && (nLevelRequired < 6))
nLevelRequired = 6;
if ((nTRacialType == RACIAL_TYPE_OOZE) && (nLevelRequired < 6))
nLevelRequired = 6;
if ((nTRacialType == RACIAL_TYPE_MAGICAL_BEAST) && (nLevelRequired < 5))
nLevelRequired = 5;
if ((nTRacialType == RACIAL_TYPE_GIANT) && (nLevelRequired < 4))
nLevelRequired = 4;
if ((nTRacialType == RACIAL_TYPE_VERMIN) && (nLevelRequired < 4))
nLevelRequired = 4;
if ((nTRacialType == RACIAL_TYPE_BEAST) && (nLevelRequired < 3))
nLevelRequired = 3;
if ((nTRacialType == RACIAL_TYPE_ANIMAL) && (nLevelRequired < 2))
nLevelRequired = 2;
if ((nTRacialType == RACIAL_TYPE_HUMANOID_MONSTROUS) && (nLevelRequired < 2))
nLevelRequired = 2;
if ((nLevelRequired < 1) && (
(nTRacialType == RACIAL_TYPE_DWARF) ||
(nTRacialType == RACIAL_TYPE_ELF) ||
(nTRacialType == RACIAL_TYPE_GNOME) ||
(nTRacialType == RACIAL_TYPE_HUMAN) ||
(nTRacialType == RACIAL_TYPE_HALFORC) ||
(nTRacialType == RACIAL_TYPE_HALFELF) ||
(nTRacialType == RACIAL_TYPE_HALFLING) ||
(nTRacialType == RACIAL_TYPE_HUMANOID_ORC) ||
(nTRacialType == RACIAL_TYPE_HUMANOID_REPTILIAN)))
nLevelRequired = 1;
return nLevelRequired;
}
// Can the shifter (oPC) assume the form of the target
// return Values: TRUE or FALSE
int GetValidShift(object oPC, object oTarget)
{
int iInvalid = 0;
// Valid Monster?
if (!GetIsObjectValid(oTarget))
return FALSE;
// Valid PC
if (!GetIsObjectValid(oPC))
return FALSE;
// Cant mimic a PC
if (GetIsPC(oTarget))
return FALSE;
int iUseCR = GetLocalInt(GetModule(),"PNP_SHFT_USECR");
int nTHD;
// Target Information
if (iUseCR == 1)
{
nTHD = FloatToInt(GetChallengeRating(oTarget));
}
else
{
nTHD = GetHitDice(oTarget);
}
// PC Info
int nPCHD = GetHitDice(oPC);
int nPCShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER,oPC);
// Check the shifter level required
int nPCShifterLevelsRequired = GetShifterLevelRequired(oTarget);
if (nPCShifterLevel < nPCShifterLevelsRequired)
{
if (nPCShifterLevelsRequired == 1000)
{
SendMessageToPC(oPC,"You can never take on that form." );
return FALSE;
}
else
SendMessageToPC(oPC,"You need " + IntToString(nPCShifterLevelsRequired-nPCShifterLevel) + " more shifter levels before you can take on that form." );
iInvalid = 1;
}
// HD check (cant take any form that has more HD then the shifter)
if (nTHD > nPCHD)
{
SendMessageToPC(oPC,"You need " + IntToString(nTHD-nPCHD) + " more character levels before you can take on that form." );
iInvalid = 1;
}
//if checks failed return false
if (iInvalid == 1)
{
//this way both of the texts come up if they are needed
//so you dont just get 1 if your need both
return FALSE;
}
//else if all checks past return true
return TRUE;
}
// Determine if the oCreature has the ability to cast spells
// Return values: TRUE or FALSE
int GetCanFormCast(object oCreature)
{
int nTRacialType = MyPRCGetRacialType(oCreature);
// Need to have hands, and the ability to speak
switch (nTRacialType)
{
case RACIAL_TYPE_ABERRATION:
case RACIAL_TYPE_MAGICAL_BEAST:
case RACIAL_TYPE_VERMIN:
case RACIAL_TYPE_BEAST:
case RACIAL_TYPE_ANIMAL:
case RACIAL_TYPE_OOZE:
//case RACIAL_TYPE_PLANT:
// These forms can't cast spells
return FALSE;
break;
case RACIAL_TYPE_SHAPECHANGER:
case RACIAL_TYPE_ELEMENTAL:
case RACIAL_TYPE_DRAGON:
case RACIAL_TYPE_OUTSIDER:
case RACIAL_TYPE_UNDEAD:
case RACIAL_TYPE_CONSTRUCT:
case RACIAL_TYPE_GIANT:
case RACIAL_TYPE_HUMANOID_MONSTROUS:
case RACIAL_TYPE_DWARF:
case RACIAL_TYPE_ELF:
case RACIAL_TYPE_GNOME:
case RACIAL_TYPE_HALFELF:
case RACIAL_TYPE_HALFLING:
case RACIAL_TYPE_HALFORC:
case RACIAL_TYPE_HUMAN:
case RACIAL_TYPE_HUMANOID_ORC:
case RACIAL_TYPE_HUMANOID_GOBLINOID:
case RACIAL_TYPE_HUMANOID_REPTILIAN:
case RACIAL_TYPE_FEY:
break;
}
return TRUE;
}
// Determines if the oCreature is harmless enough to have
// special effects applied to the shifter
// Return values: TRUE or FALSE
int GetIsCreatureHarmless(object oCreature)
{
string sCreatureName = GetName(oCreature);
// looking for small < 1 CR creatures that nobody looks at twice
if ((sCreatureName == "Chicken") ||
(sCreatureName == "Falcon") ||
(sCreatureName == "Hawk") ||
(sCreatureName == "Raven") ||
(sCreatureName == "Bat") ||
(sCreatureName == "Dire Rat") ||
(sCreatureName == "Will-O'-Wisp") ||
(sCreatureName == "Rat") ||
(GetChallengeRating(oCreature) < 1.0 ))
return TRUE;
else
return FALSE;
}
int GetTrueForm(object oPC)
{
int nRace = GetRacialType(OBJECT_SELF);
int nPCForm;
int iIsStored = GetPersistantLocalInt( oPC, "AppearanceIsStored" );
int iStoredAppearance = GetPersistantLocalInt( oPC, "AppearanceStored" );
if (iIsStored == 6)
{
nPCForm = iStoredAppearance;
}
else
{
nPCForm = StringToInt(Get2DACache("racialtypes", "Appearance", GetRacialType(oPC)));
}
return nPCForm;
}
// Transforms the oPC into the oTarget using the epic rules
// Assumes oTarget is already a valid target
int SetShiftEpic(object oPC, object oTarget)
{
SetLocalInt(oPC,"EpicShift",1); //this makes the setshift_2 script do the epic shifter stuff that used to be here
SetShift(oPC, oTarget);
return TRUE;
}
// Creates a temporary creature for the shifter to shift into
// Validates the shifter is able to become that creature based on level
// Return values: TRUE or FALSE
// the epic version of this script was rolled into this 1 with the
// addition of the iEpic peramiter
int SetShiftFromTemplateValidate(object oPC, string sTemplate, int iEpic)
{
if (!CanShift(oPC))
{
return FALSE;
}
int bRetValue = FALSE;
int in_list = IsKnownCreature(oPC, sTemplate);
if (iEpic==TRUE)
{
if (!GetHasFeat(FEAT_PRESTIGE_SHIFTER_EGWSHAPE_1, oPC))
return FALSE;
else
DecrementRemainingFeatUses(oPC,FEAT_PRESTIGE_SHIFTER_EGWSHAPE_1); //we are good to go with the shift
}
else
{
if (!GetHasFeat(FEAT_PRESTIGE_SHIFTER_GWSHAPE_1, oPC))
return FALSE;
else
DecrementRemainingFeatUses(oPC,FEAT_PRESTIGE_SHIFTER_GWSHAPE_1); //we are good to go with the shift
}
if (!GetHasFeat(FEAT_PRESTIGE_SHIFTER_GWSHAPE_1, oPC)) //if your out of GWS
{
if (GetHasFeat(FEAT_WILD_SHAPE, oPC)) //and you have DWS left
{
if(GetLocalInt(oPC, "DWS") == 1) //and you wont to change then over to GWS
{
IncrementRemainingFeatUses(oPC,FEAT_PRESTIGE_SHIFTER_GWSHAPE_1); // +1 GWS
DecrementRemainingFeatUses(oPC,FEAT_WILD_SHAPE); //-1 DWS
}
}
}
int i=0;
object oLimbo=GetObjectByTag("Limbo",i);
location lLimbo;
while (i < 100)
{
if (GetIsObjectValid(oLimbo))
{
if (GetName(oLimbo)=="Limbo")
{
i = 2000;
vector vLimbo = Vector(0.0f, 0.0f, 0.0f);
lLimbo = Location(oLimbo, vLimbo, 0.0f);
}
}
i++;
object oLimbo=GetObjectByTag("Limbo",i);
}
object oTarget;
if (i>=2000)
{
oTarget = CreateObject(OBJECT_TYPE_CREATURE,sTemplate,lLimbo);
}
else
{
oTarget = CreateObject(OBJECT_TYPE_CREATURE,sTemplate,GetLocation(oPC));
}
if (!GetIsObjectValid(oTarget))
{
SendMessageToPC(oPC, "Not a valid creature.");
}
if ( !in_list )
{
SendMessageToPC( oPC, "You have not mimiced this creature yet." );
}
// Make sure the PC can take on that form
if (GetValidShift(oPC, oTarget) && in_list )
{
//get the appearance before changing it
SetLocalInt(oTarget,"Appearance",GetAppearanceType(oTarget));
//set appearance to invis so it dont show up when scripts run thro
SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
//set oTarget for deletion
SetLocalInt(oTarget,"pnp_shifter_deleteme",1);
//Shift the PC to it
bRetValue = TRUE;
if (iEpic == TRUE)
SetShiftEpic(oPC, oTarget);
else
SetShift(oPC, oTarget);
}
else //if we're not gona shift we need to get ride of the creature
{
// Remove the temporary creature
AssignCommand(oTarget,SetIsDestroyable(TRUE,FALSE,FALSE));
SetPlotFlag(oTarget,FALSE);
SetImmortal(oTarget,FALSE);
DestroyObject(oTarget);
}
return bRetValue;
}
// helper function to SetVisualTrueForm() for DelayCommand() to work on
void SetBodyPartTrueForm(object oPC, int i)
{
int nBodyPartValue = GetPersistantLocalInt(oPC, "AppearanceStoredPart"+IntToString(i));
if(GetCreatureBodyPart(i) != nBodyPartValue) // if the stored and current values are different
SetCreatureBodyPart(i, nBodyPartValue, oPC);
}
//returns the PC to their original form
//purely visual
void SetVisualTrueForm(object oPC)
{
if(GetPersistantLocalInt(oPC,"AppearanceIsStored") == 6)
{
SetCreatureAppearanceType(oPC, GetPersistantLocalInt(oPC,"AppearanceStored"));
SetPortraitId(oPC, GetPersistantLocalInt(oPC, "AppearanceStoredPortraitID"));
SetPortraitResRef(oPC, GetPersistantLocalString(oPC, "AppearanceStoredPortraitResRef"));
SetCreatureTailType(GetPersistantLocalInt(oPC, "AppearanceStoredTail"), oPC);
SetCreatureWingType(GetPersistantLocalInt(oPC, "AppearanceStoredWing"), oPC);
int i;
for(i=0;i<=20;i++)
{
DelayCommand(1.0, SetBodyPartTrueForm(oPC, i));
}
}
else
//hasnt been previously stored
//use racial lookup
SetCreatureAppearanceType(oPC, GetTrueForm(oPC));
}
// Transforms the oPC back to thier true form if they are shifted
void SetShiftTrueForm(object oPC)
{
// Remove all the creature equipment and destroy it
object oHide = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
object oWeapCR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
object oWeapCL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
object oWeapCB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
// Do not move or destroy the objects, it will crash the game
if (GetIsObjectValid(oHide))
{
// Remove all the abilities of the object
ScrubPCSkin(oPC,oHide);
DeletePRCLocalInts(oHide);
AssignCommand(oPC, ActionEquipItem(oHide, INVENTORY_SLOT_CARMOUR)); //reequip the hide to get item props to update properly
}
itemproperty ipUnarmed = ItemPropertyMonsterDamage(2);
if (GetIsObjectValid(oWeapCR))
{
//remove creature weapons
ClearCreatureItem(oPC, oWeapCR);
//AssignCommand(oPC,ActionUnequipItem(oWeapCR));
}
if (GetIsObjectValid(oWeapCL))
{
//remove creature weapons
ClearCreatureItem(oPC, oWeapCL);
//AssignCommand(oPC,ActionUnequipItem(oWeapCL));
}
if (GetIsObjectValid(oWeapCB))
{
//remove creature weapons
ClearCreatureItem(oPC, oWeapCB);
//AssignCommand(oPC,ActionUnequipItem(oWeapCB));
}
// if the did an epic form remove the special powers
object oEpicPowersItem = GetItemPossessedBy(oPC,"EpicShifterPowers");
if (GetIsObjectValid(oEpicPowersItem))
{
ClearCreatureItem(oPC, oEpicPowersItem);
//RemoveAllItemProperties(oEpicPowersItem);
RemoveAuraEffect( oPC );
}
// Spell failure was done through an effect
// AC was done via an effect
// invis was done via an effect
// we will look for and remove them
effect eEff = GetFirstEffect(oPC);
while (GetIsEffectValid(eEff))
{
int eDurType = GetEffectDurationType(eEff);
int eSubType = GetEffectSubType(eEff);
int eType = GetEffectType(eEff);
int eID = GetEffectSpellId(eEff);
object eCreator = GetEffectCreator(eEff);
//all three effects are permanent and supernatural and are created by spell id -1 and by the PC.
if ((eDurType == DURATION_TYPE_PERMANENT) && (eSubType == SUBTYPE_SUPERNATURAL) && (eID == -1) && (eCreator == oPC))
{
switch (eType)
{
case EFFECT_TYPE_SPELL_FAILURE:
case EFFECT_TYPE_INVISIBILITY:
case EFFECT_TYPE_AC_INCREASE:
case EFFECT_TYPE_AC_DECREASE:
case EFFECT_TYPE_ATTACK_INCREASE:
case EFFECT_TYPE_ATTACK_DECREASE:
case EFFECT_TYPE_DAMAGE_INCREASE:
case EFFECT_TYPE_DAMAGE_DECREASE:
case EFFECT_TYPE_TEMPORARY_HITPOINTS:
RemoveEffect(oPC,eEff);
break;
}
}
if (eType == EFFECT_TYPE_POLYMORPH)
{
RemoveEffect(oPC,eEff);
}
eEff = GetNextEffect(oPC);
}
// Change the PC appearance back to TRUE form
SetVisualTrueForm(oPC);
// Set race back to unused
SetLocalInt(oPC, "RACIAL_TYPE", 0);
// Reset shifted state
SetPersistantLocalInt(oPC, "nPCShifted", FALSE);
}
void ClearCreatureItem(object oPC, object oTarget)
{
AssignCommand(oPC, ActionUnequipItem(oTarget));
DelayCommand(0.10, AssignCommand(oPC, DestroyObject(oTarget)));
}