//:://///////////////////////////////////////////// //:: Turns player into a werewolf //:: prc_wwhybridwolf //:: Copyright (c) 2004 Shepherd Soft //::////////////////////////////////////////////// /* */ //::////////////////////////////////////////////// //:: Created By: Russell S. Ahlstrom //:: Created On: May 11, 2004 //:: Updated On: 2012 11-27 (Added Switch for PnP Shifter Polymorphing instead of Bioware) //::////////////////////////////////////////////// #include "pnp_shft_poly" // Creates the target Hybrid Form creature that the PC will transform into object PnP_WereWolfHybridShifting_BuildTarget(object oPC); // Removes the 1st standard Invisiblity effect from the PC after using PnP Shifter shifting void PRC_StripWereWolfInvis(object oPC); void main() { object oPC = OBJECT_SELF; int nPoly; // Retrieve Module flag int iPnPShifterShapchange = GetPRCSwitch(PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE); if (GetLocalInt(oPC, "WWHybrid") != TRUE) { //Can only turn into a werewolf if level 2 in werewolf class if (!GetHasFeat(FEAT_PRESTIGE_WEREWOLFCLASS_2)) { FloatingTextStringOnCreature("You can only assume your hybrid form if you are at least level 2 in the werewolf class", oPC, FALSE); return; } if (!iPnPShifterShapchange) // Use Bioware Polymorph effect { nPoly = POLYMORPH_TYPE_WEREWOLF_0s; if (GetHasFeat(FEAT_PRESTIGE_WOLFCLASS_1)) { nPoly = POLYMORPH_TYPE_WEREWOLF_1s; } if (GetHasFeat(FEAT_PRESTIGE_WOLFCLASS_2)) { nPoly = POLYMORPH_TYPE_WEREWOLF_2s; } if (GetHasFeat(FEAT_PRESTIGE_WEREWOLFCLASS_3)) { nPoly = POLYMORPH_TYPE_WEREWOLF_0l; } if (GetHasFeat(FEAT_PRESTIGE_WOLFCLASS_1) && GetHasFeat(FEAT_PRESTIGE_WEREWOLFCLASS_3)) { nPoly = POLYMORPH_TYPE_WEREWOLF_1l; } if (GetHasFeat(FEAT_PRESTIGE_WOLFCLASS_2) && GetHasFeat(FEAT_PRESTIGE_WEREWOLFCLASS_3)) { nPoly = POLYMORPH_TYPE_WEREWOLF_2l; } SetLocalInt(oPC, "WWHybrid", TRUE); LycanthropePoly(oPC, nPoly); } // END Polymorph Shifting else // Use PnP Shifter Shape Change { // Check if we can transform if (!CanShift(oPC)) return; //check if a shifter (or morphed-werewolf) and if shifted then unshift ShifterCheck(oPC); ClearAllActions(); // prevents an exploit (taken from shifter code), PC is OBJECT_SELF, so no need to Assign this action // Create target Creature to transform into, based on the PC's Werewolf class feats object oCreature = PnP_WereWolfHybridShifting_BuildTarget(oPC); if (!GetIsObjectValid(oCreature)) { FloatingTextStringOnCreature("Unable to create Werewolf Hybrid Form template creature. Aborting transformation!", oPC, FALSE); return; } // Call the Transformation into the target creature SetShift(oPC,oCreature); // Will automatically delete the target creatue after the shift is completed // Set Shifted Flag SetLocalInt(oPC, "WWHybrid", TRUE); // Remove the 1st normal invisibility effect that we can find on the werewolf, since the shifting will provide one // Delayed so it occurs after shifting is completed DelayCommand(2.0,PRC_StripWereWolfInvis(oPC)); } // END PnP Werewolf Shifting } // END Transform to Hybrid // Currently in Hybrid Form, so unpolymorph // PnP Unshift handed in prc_wwunpoly else { ExecuteScript("prc_wwunpoly", oPC); SetLocalInt(oPC, "WWHybrid", FALSE); } // END Unpolymorph from Hybrid form } // PnP Werewolf Shifting, Target Form // Creates the target Hybrid Form creature that the PC will transform into // Uses the PC's Werewolf feats to create the target creature object PnP_WereWolfHybridShifting_BuildTarget(object oPC) { object oCreature; // Get the waypoint in Limbo where shifting template creatures are spawned object oSpawnWP = GetWaypointByTag(SHIFTING_TEMPLATE_WP_TAG); // Paranoia check - the WP should be built into the area data of Limbo if(!GetIsObjectValid(oSpawnWP)) { if(DEBUG) DoDebug("prc_inc_shifting: ShiftIntoResRef(): ERROR: Template spawn waypoint does not exist."); // Create the WP oSpawnWP = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, SHIFTING_TEMPLATE_WP_TAG); } // Get the WP's location location lLimbo = GetLocation(oSpawnWP); // Create the target creature (in Limbo) by copying the PC oCreature = CopyObject(oPC, lLimbo, OBJECT_INVALID, "PRC_WereWolf_Hybrid_PnP_Template"); // Abort creation if we can't make the target if(!GetIsObjectValid(oCreature)) return OBJECT_INVALID; // Strip the created creature of all items, objects and effects // remove inventory contents from created creature object oItem = GetFirstItemInInventory(oCreature); while(GetIsObjectValid(oItem)) { SetPlotFlag(oItem,FALSE); if(GetHasInventory(oItem)) { object oItem2 = GetFirstItemInInventory(oItem); while(GetIsObjectValid(oItem2)) { object oItem3 = GetFirstItemInInventory(oItem2); while(GetIsObjectValid(oItem3)) { SetPlotFlag(oItem3,FALSE); DestroyObject(oItem3); oItem3 = GetNextItemInInventory(oItem2); } SetPlotFlag(oItem2,FALSE); DestroyObject(oItem2); oItem2 = GetNextItemInInventory(oItem); } } DestroyObject(oItem); oItem = GetNextItemInInventory(oCreature); } // remove all equipped items from created creature int i; for(i=0;i 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityIncrease(ABILITY_STRENGTH, iStrBoost), oCreature, 0.0f); else if (iStrBoost < 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityDecrease(ABILITY_STRENGTH, abs(iStrBoost)), oCreature, 0.0f); // Dexterity modification if (iDexBoost > 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityIncrease(ABILITY_DEXTERITY, iDexBoost), oCreature, 0.0f); else if (iDexBoost < 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityDecrease(ABILITY_DEXTERITY, abs(iDexBoost)), oCreature, 0.0f); // Constitution modification if (iConBoost > 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityIncrease(ABILITY_CONSTITUTION, iConBoost), oCreature, 0.0f); else if (iConBoost < 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAbilityDecrease(ABILITY_CONSTITUTION, abs(iConBoost)), oCreature, 0.0f); // Remove all AC bonuses from the werewolf creature skin itemproperty ipIPLoop = GetFirstItemProperty(oItem); while (GetIsItemPropertyValid(ipIPLoop)) { if (GetItemPropertyType(ipIPLoop) == ITEM_PROPERTY_AC_BONUS) RemoveItemProperty(oItem,ipIPLoop); ipIPLoop = GetNextItemProperty(oItem); } // Calcualte AC bonus granted by the werewolf class iNaturalArmor -= ( GetAC(oCreature) - GetAbilityModifier(ABILITY_DEXTERITY, oCreature) - 10 ); // Natural Armor modification if (iNaturalArmor > 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectACIncrease(iNaturalArmor,AC_NATURAL_BONUS,AC_VS_DAMAGE_TYPE_ALL), oCreature, 0.0f); else if (iNaturalArmor < 0) ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectACDecrease(abs(iNaturalArmor),AC_DODGE_BONUS,AC_VS_DAMAGE_TYPE_ALL), oCreature, 0.0f); // Other feats int iClassLevel = GetLevelByClass(CLASS_TYPE_WEREWOLF, oPC); // Class Level 3 Grants Weapon Focus in Creature weapons; Provide Focus in Unarmed strike to avoid Bio-Bug'd Creature Weapon Focus // 9 WeapFocusCreature 291 3 3 0 if (iClassLevel >= 3) { // Don't need "safe add" here - that will be used in the actual Shifting routine for the PC. AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_FOCUS_UNARMED_STRIKE), oSkin, 0.0f); } // Class Level 5 Grants Weapon Specialization in Creature weapons; Provide Specialization in Unarmed strike to avoid Bio-Bug'd Creature Weapon Spec // 12 WeapSpecCreature 290 3 5 0 if (iClassLevel >= 5) { // Don't need "safe add" here - that will be used in the actual Shifting routine for the PC. AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_SPECIALIZATION_UNARMED_STRIKE), oSkin, 0.0f); } // Set target Creature to be deleted by the Shifter Script SetLocalInt(oCreature,"pnp_shifter_deleteme",1); // Paranoya clean up of creature in 10 seconds DestroyObject(oCreature, 10.0); return oCreature; } // Removes the 1st standard Invisiblity effect from the PC void PRC_StripWereWolfInvis(object oPC) { effect eInvis = GetFirstEffect(oPC); int iContinue = TRUE; while( GetIsEffectValid(eInvis) && iContinue ) { if (GetEffectType(eInvis) == EFFECT_TYPE_INVISIBILITY) { RemoveEffect(oPC, eInvis); iContinue = FALSE; } eInvis = GetNextEffect(oPC); } }