459 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			459 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | ||
| //:: Greater Wild Shape, Humanoid Shape
 | ||
| //:: x2_s2_gwildshp
 | ||
| //:: Copyright (c) 2003 Bioware Corp.
 | ||
| //:://////////////////////////////////////////////
 | ||
| /*
 | ||
|     Allows the character to shift into one of these
 | ||
|     forms, gaining special abilities
 | ||
|     Credits must be given to mr_bumpkin from the NWN
 | ||
|     community who had the idea of merging item properties
 | ||
|     from weapon and armor to the creatures new forms.
 | ||
| */
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Created By: Georg Zoeller
 | ||
| //:: Created On: 2003-07-02
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Modified By: Iznoghoud
 | ||
| /*
 | ||
| What this script changes:
 | ||
| - Tower shields now carry over their properties just like Small and Large
 | ||
| shields. (Which has been a bug I believe since the original script had 2 checks
 | ||
| for SMALLSHIELD in it, one probably should have been TOWERSHIELD)
 | ||
| - Melee Weapon properties now carry over to the unarmed forms' claws and bite
 | ||
| attacks.
 | ||
| - My last (and most complicated) changes:
 | ||
| 1) Now, items with an AC bonus (or penalty) carry over to the shifted form as
 | ||
| the correct type. This means if you wear an amulet of natural armor +4, and a
 | ||
| cloak of protection +5, and you shift to a form that gets all item properties
 | ||
| carried over, you will have the +4 natural armor bonus from the ammy, as well as
 | ||
| the +5 deflection bonus from the cloak. No longer will the highest one override
 | ||
| all the other AC bonuses even if they are a different type. Note that some
 | ||
| forms, such as the dragon, get an inherent natural AC bonus, which may still
 | ||
| override your amulet of natural armor, if the inherent bonus is better.
 | ||
| 2) Other "stackable" item properties, like ability bonuses, skill bonuses and
 | ||
| saving throw bonuses, now correctly add up in shifted form. This means if you
 | ||
| have a ring that gives +2 strength, and a ring with +3 strength, and you shift
 | ||
| into a drow warrior, you get +5 strength in shifted form, where you used to get
 | ||
| only +3. (the highest)
 | ||
| 
 | ||
| -- Modified by StoneDK 2003.12.21
 | ||
| Added saving of old equip to allow items to be applied without going
 | ||
| through normal shape, should now get item effects even when changing
 | ||
| directly from wyrm to kobold shape.
 | ||
| Added message to player about which items are merged.
 | ||
| 
 | ||
| -- Modified by Iznoghoud 2003-12-26
 | ||
| Added storing of Polymorph ID on the player for letting exportallchars() scripts
 | ||
| reapply polymorphing effects when saving
 | ||
| 
 | ||
| -- Modified by Iznoghoud 2003-12-27
 | ||
| Added regeneration as a stacking property, bracers now stored correctly for re-shifting,
 | ||
| Added constants for easy configuration.
 | ||
| 
 | ||
| -- Modified by Iznoghoud January 13 2004
 | ||
| The bulk of the handling of stacking item properties, as well as the constants
 | ||
| for configuration, are now in ws_inc_shifter, which is included
 | ||
| by this file, and the two druid polymorphing scripts, nw_s2_elemshape and nw_s2_wildshape.
 | ||
| Made the message about which items are merged more explicit.
 | ||
| */
 | ||
| //:://////////////////////////////////////////////
 | ||
| 
 | ||
| #include "ws_inc_shifter"
 | ||
| 
 | ||
| // Main function of the script
 | ||
| void main()
 | ||
| {
 | ||
| 
 | ||
| if(GetLocalInt(GetArea(OBJECT_SELF), "NOCAST")==2 && !GetIsDM(OBJECT_SELF))
 | ||
| {
 | ||
| 
 | ||
|  FloatingTextStringOnCreature("All spells fizzle in town.", OBJECT_SELF);
 | ||
| 
 | ||
|  return;
 | ||
| }
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Declare major variables
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     object oPC = OBJECT_SELF;
 | ||
|     int    nSpell = GetSpellId();
 | ||
|     object oTarget = GetSpellTargetObject();
 | ||
|     effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
 | ||
|     int    nShifter = GetLevelByClass(CLASS_TYPE_SHIFTER);
 | ||
|     effect ePoly;
 | ||
|     int    nPoly;
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Determine which form to use based on spell id, gender and level
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     switch (nSpell)
 | ||
|     {
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         // Greater Wildshape I - Wyrmling Shape
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         case 658:  nPoly = POLYMORPH_TYPE_WYRMLING_RED; break;
 | ||
|         case 659:  nPoly = POLYMORPH_TYPE_WYRMLING_BLUE; break;
 | ||
|         case 660:  nPoly = POLYMORPH_TYPE_WYRMLING_BLACK; break;
 | ||
|         case 661:  nPoly = POLYMORPH_TYPE_WYRMLING_WHITE; break;
 | ||
|         case 662:  nPoly = POLYMORPH_TYPE_WYRMLING_GREEN; break;
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         // Greater Wildshape II  - Minotaur, Gargoyle, Harpy
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         case 672: if (nShifter < X2_GW2_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_HARPY;
 | ||
|                   else
 | ||
|                      nPoly = 97;
 | ||
|                   break;
 | ||
|         case 678: if (nShifter < X2_GW2_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_GARGOYLE;
 | ||
|                   else
 | ||
|                      nPoly = 98;
 | ||
|                   break;
 | ||
|         case 680: if (nShifter < X2_GW2_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_MINOTAUR;
 | ||
|                   else
 | ||
|                      nPoly = 96;
 | ||
|                   break;
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         // Greater Wildshape III  - Drider, Basilisk, Manticore
 | ||
|         //-----------------------------------------------------------------------
 | ||
|         case 670: if (nShifter < X2_GW3_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_BASILISK;
 | ||
|                   else
 | ||
|                      nPoly = 99;
 | ||
|                   break;
 | ||
|         case 673: if (nShifter < X2_GW3_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_DRIDER;
 | ||
|                   else
 | ||
|                      nPoly = 100;
 | ||
|                   break;
 | ||
|         case 674: if (nShifter < X2_GW3_EPIC_THRESHOLD)
 | ||
|                      nPoly = POLYMORPH_TYPE_MANTICORE;
 | ||
|                   else
 | ||
|                      nPoly = 101;
 | ||
|                   break;
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Greater Wildshape IV - Dire Tiger, Medusa, MindFlayer
 | ||
|        //-----------------------------------------------------------------------
 | ||
|         case 679: nPoly = POLYMORPH_TYPE_MEDUSA; break;
 | ||
|         case 691: nPoly = 68; break; // Mindflayer
 | ||
|         case 694: nPoly = 69; break; // DireTiger
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Humanoid Shape - Kobold Commando, Drow, Lizard Crossbow Specialist
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        case 682:
 | ||
|                  if(nShifter< 17)
 | ||
|                  {
 | ||
|                      if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow
 | ||
|                          nPoly = 59;
 | ||
|                      else
 | ||
|                          nPoly = 70;
 | ||
|                  }
 | ||
|                  else
 | ||
|                  {
 | ||
|                      if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow
 | ||
|                          nPoly = 105;
 | ||
|                      else
 | ||
|                          nPoly = 106;
 | ||
|                  }
 | ||
|                  break;
 | ||
|        case 683:
 | ||
|                  if(nShifter< 17)
 | ||
|                  {
 | ||
|                     nPoly = 82; break; // Lizard
 | ||
|                  }
 | ||
|                  else
 | ||
|                  {
 | ||
|                     nPoly =104; break; // Epic Lizard
 | ||
|                  }
 | ||
|        case 684: if(nShifter< 17)
 | ||
|                  {
 | ||
|                     nPoly = 83; break; // Kobold Commando
 | ||
|                  }
 | ||
|                  else
 | ||
|                  {
 | ||
|                     nPoly = 103; break; // Kobold Commando
 | ||
|                  }
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Undead Shape - Spectre, Risen Lord, Vampire
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        case 704: nPoly = 75; break; // Risen lord
 | ||
|        case 705: if (GetGender(OBJECT_SELF) == GENDER_MALE) // vampire
 | ||
|                      nPoly = 74;
 | ||
|                   else
 | ||
|                      nPoly = 77;
 | ||
|                  break;
 | ||
|        case 706: nPoly = 76; break; /// spectre
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Dragon Shape - Red Blue and Green Dragons
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        case 707: nPoly = 72; break; // Ancient Red   Dragon
 | ||
|        case 708: nPoly = 71; break; // Ancient Blue  Dragon
 | ||
|        case 709: nPoly = 73; break; // Ancient Green Dragon
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Outsider Shape - Rakshasa, Azer Chieftain, Black Slaad
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        case 733:   if (GetGender(OBJECT_SELF) == GENDER_MALE) //azer
 | ||
|                       nPoly = 85;
 | ||
|                     else // anything else is female
 | ||
|                       nPoly = 86;
 | ||
|                     break;
 | ||
|        case 734:   if (GetGender(OBJECT_SELF) == GENDER_MALE) //rakshasa
 | ||
|                       nPoly = 88;
 | ||
|                     else // anything else is female
 | ||
|                       nPoly = 89;
 | ||
|                     break;
 | ||
|        case 735: nPoly =87; break; // slaad
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        // Construct Shape - Stone Golem, Iron Golem, Demonflesh Golem
 | ||
|        //-----------------------------------------------------------------------
 | ||
|        case 738: nPoly =91; break; // stone golem
 | ||
|        case 739: nPoly =92; break; // demonflesh golem
 | ||
|        case 740: nPoly =90; break; // iron golem
 | ||
|     }
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Determine which items get their item properties merged onto the shifters
 | ||
|     // new form.
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     int bWeapon;
 | ||
|     int bArmor;
 | ||
|     int bItems;
 | ||
|     int bCopyGlovesToClaws = FALSE;
 | ||
| 
 | ||
|     bWeapon = ShifterMergeWeapon(nPoly);
 | ||
| 
 | ||
|     if ( GW_ALWAYS_COPY_ARMOR_PROPS )
 | ||
|         bArmor = TRUE;
 | ||
|     else
 | ||
|         bArmor  = ShifterMergeArmor(nPoly);
 | ||
| 
 | ||
|     if ( GW_ALWAYS_COPY_ITEM_PROPS )
 | ||
|         bItems = TRUE;
 | ||
|     else
 | ||
|         bItems  = ShifterMergeItems(nPoly);
 | ||
| 
 | ||
|     // Send message to PC about which items get merged to this form
 | ||
|     string sMerge;
 | ||
|     sMerge = "Merged: "; // <c~<7E><>>: This is a color code that makes the text behind it sort of light blue.
 | ||
|     if(bArmor) sMerge += "<caz<61>>Armor, Helmet, Shield";
 | ||
|     if(bItems) sMerge += ",</c> <ca<63>a>Rings, Amulet, Cloak, Boots, Belt, Bracers";
 | ||
|     if( bWeapon || GW_COPY_WEAPON_PROPS_TO_UNARMED == 1 )
 | ||
|         sMerge += ",</c> <c<>AA>Weapon";
 | ||
|     else if ( GW_COPY_WEAPON_PROPS_TO_UNARMED == 2 )
 | ||
|         sMerge += ",</c> <c<>AA>Gloves to unarmed attacks";
 | ||
|     else if (GW_COPY_WEAPON_PROPS_TO_UNARMED == 3 )
 | ||
|         sMerge += ",</c> <c<>AA>Weapon (if you had one equipped) or gloves to unarmed attacks";
 | ||
|     else
 | ||
|         sMerge += ",</c> <c<>AA>No weapon or gloves to unarmed attacks";
 | ||
|     SendMessageToPC(oTarget,sMerge + ".</c>");
 | ||
| 
 | ||
|     // Store which items should transfer to this polymorph type. (For exportallchar scripts)
 | ||
|     SetLocalInt(oTarget, "GW_PolyID", nPoly);
 | ||
|     SetLocalInt(oTarget, "GW_bWeapon", bWeapon );
 | ||
|     SetLocalInt(oTarget, "GW_bArmor", bArmor );
 | ||
|     SetLocalInt(oTarget, "GW_bItems", bItems );
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Store the old objects so we can access them after the character has
 | ||
|     // changed into his new form
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     object oWeaponOld;
 | ||
|     object oArmorOld;
 | ||
|     object oRing1Old ;
 | ||
|     object oRing2Old;
 | ||
|     object oAmuletOld;
 | ||
|     object oCloakOld ;
 | ||
|     object oBootsOld  ;
 | ||
|     object oBeltOld   ;
 | ||
|     object oHelmetOld;
 | ||
|     object oShield ;
 | ||
|     object oBracerOld;
 | ||
|     object oHideOld;
 | ||
|     //Assume the normal shape doesn't have a creature skin object.
 | ||
|     //If using a subracesystem or something else that places a skin on the normal shape
 | ||
|     //another condition is needed to decide whether or not to store current items.
 | ||
|     //One way could be to scan all effects to see whether one is a polymorph effect.
 | ||
|     int nPolyed = GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF));
 | ||
|     // If there is a creature armor see if it is a creature hide put
 | ||
|     // on the unpolymorphed player by scanning for a polymorph effect.
 | ||
|     if ( nPolyed )
 | ||
|         nPolyed = ( ScanForPolymorphEffect(OBJECT_SELF) != -2 );
 | ||
|     if(! nPolyed)
 | ||
|     {
 | ||
|         //if not polymorphed get items worn and store on player.
 | ||
|         oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
 | ||
|         oArmorOld  = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF);
 | ||
|         oRing1Old  = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF);
 | ||
|         oRing2Old  = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF);
 | ||
|         oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF);
 | ||
|         oCloakOld  = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF);
 | ||
|         oBootsOld  = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF);
 | ||
|         oBeltOld   = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF);
 | ||
|         oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF);
 | ||
|         oShield    = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF);
 | ||
|         oBracerOld  = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF);
 | ||
|         oHideOld = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldWeapon",oWeaponOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldArmor",oArmorOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldRing1",oRing1Old);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldRing2",oRing2Old);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldAmulet",oAmuletOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldCloak",oCloakOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBoots",oBootsOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBelt",oBeltOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldHelmet",oHelmetOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBracer",oBracerOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldHide",oHideOld);
 | ||
|         if (GetIsObjectValid(oShield))
 | ||
|         {
 | ||
|             if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
 | ||
|                 GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD &&
 | ||
|                 GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD)
 | ||
|             {
 | ||
|                 oShield = OBJECT_INVALID;
 | ||
|             }
 | ||
|         }
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldShield",oShield);
 | ||
| 
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         //if already polymorphed use items stored earlier.
 | ||
|         oWeaponOld =     GetLocalObject(OBJECT_SELF,"GW_OldWeapon");
 | ||
|         oArmorOld  =     GetLocalObject(OBJECT_SELF,"GW_OldArmor");
 | ||
|         oRing1Old  =     GetLocalObject(OBJECT_SELF,"GW_OldRing1");
 | ||
|         oRing2Old  =     GetLocalObject(OBJECT_SELF,"GW_OldRing2");
 | ||
|         oAmuletOld =     GetLocalObject(OBJECT_SELF,"GW_OldAmulet");
 | ||
|         oCloakOld  =     GetLocalObject(OBJECT_SELF,"GW_OldCloak");
 | ||
|         oBootsOld  =     GetLocalObject(OBJECT_SELF,"GW_OldBoots");
 | ||
|         oBeltOld   =     GetLocalObject(OBJECT_SELF,"GW_OldBelt");
 | ||
|         oHelmetOld =     GetLocalObject(OBJECT_SELF,"GW_OldHelmet");
 | ||
|         oShield    =     GetLocalObject(OBJECT_SELF,"GW_OldShield");
 | ||
|         oBracerOld =     GetLocalObject(OBJECT_SELF,"GW_OldBracer");
 | ||
|         oHideOld   =     GetLocalObject(OBJECT_SELF,"GW_OldHide");
 | ||
|     }
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Here the actual polymorphing is done
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ePoly = EffectPolymorph(nPoly);
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Iznoghoud: Link the stackable properties as permanent bonuses to the
 | ||
|     // Polymorph effect, instead of putting them on the creature hide. They will
 | ||
|     // properly disappear as soon as the polymorph is ended.
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ePoly = AddStackablePropertiesToPoly ( oPC, ePoly, bWeapon, bItems, bArmor, oArmorOld, oRing1Old, oRing2Old, oAmuletOld, oCloakOld, oBracerOld, oBootsOld, oBeltOld, oHelmetOld, oShield, oWeaponOld, oHideOld);
 | ||
|     ePoly = ExtraordinaryEffect(ePoly);
 | ||
|     ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
 | ||
|     ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF);
 | ||
|     SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // This code handles the merging of item properties
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
 | ||
|     object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF);
 | ||
|     object oClawLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,OBJECT_SELF);
 | ||
|     object oClawRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,OBJECT_SELF);
 | ||
|     object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,OBJECT_SELF);
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Weapons
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bWeapon)
 | ||
|     {
 | ||
|         //----------------------------------------------------------------------
 | ||
|         // GZ: 2003-10-20
 | ||
|         // Sorry, but I was forced to take that out, it was confusing people
 | ||
|         // and there were problems with updating the stats sheet.
 | ||
|         //----------------------------------------------------------------------
 | ||
|         /* if (!GetIsObjectValid(oWeaponOld))
 | ||
|         {
 | ||
|             //------------------------------------------------------------------
 | ||
|             // If we had no weapon equipped before, remove the old weapon
 | ||
|             // to allow monks to change into unarmed forms by not equipping any
 | ||
|             // weapon before polymorphing
 | ||
|             //------------------------------------------------------------------
 | ||
|             DestroyObject(oWeaponNew);
 | ||
|         }
 | ||
|         else*/
 | ||
|         {
 | ||
|             //------------------------------------------------------------------
 | ||
|             // Merge item properties...
 | ||
|             //------------------------------------------------------------------
 | ||
|             WildshapeCopyWeaponProperties(oTarget, oWeaponOld,oWeaponNew);
 | ||
|         }
 | ||
|     }
 | ||
|     else {
 | ||
|         switch ( GW_COPY_WEAPON_PROPS_TO_UNARMED )
 | ||
|         {
 | ||
|         case 1: // Copy over weapon properties to claws/bite
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oClawLeft, TRUE);
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oClawRight, TRUE);
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oBite, TRUE);
 | ||
|             break;
 | ||
|         case 2: // Copy over glove properties to claws/bite
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oClawLeft, FALSE);
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oClawRight, FALSE);
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oBite, FALSE);
 | ||
|             bCopyGlovesToClaws = TRUE;
 | ||
|             break;
 | ||
|         case 3: // Copy over weapon properties to claws/bite if wearing a weapon, otherwise copy gloves
 | ||
|             if ( GetIsObjectValid(oWeaponOld) )
 | ||
|             {
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oClawLeft, TRUE);
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oClawRight, TRUE);
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oBite, TRUE);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oClawLeft, FALSE);
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oClawRight, FALSE);
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oBite, FALSE);
 | ||
|                 bCopyGlovesToClaws = TRUE;
 | ||
|             }
 | ||
|             break;
 | ||
|         default: // Do not copy over anything
 | ||
|             break;
 | ||
|         };
 | ||
|     }
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Armor
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bArmor)
 | ||
|     {
 | ||
|         //----------------------------------------------------------------------
 | ||
|         // Merge item properties from armor and helmet...
 | ||
|         //----------------------------------------------------------------------
 | ||
|         WildshapeCopyNonStackProperties(oArmorOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oHelmetOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oShield,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oHideOld,oArmorNew);
 | ||
|     }
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Magic Items
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bItems)
 | ||
|     {
 | ||
|         //----------------------------------------------------------------------
 | ||
|         // Merge item properties from from rings, amulets, cloak, boots, belt
 | ||
|         // Iz: And bracers, in case oBracerOld gets set to a valid object.
 | ||
|         //----------------------------------------------------------------------
 | ||
|         WildshapeCopyNonStackProperties(oRing1Old,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oRing2Old,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oAmuletOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oCloakOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oBootsOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oBeltOld,oArmorNew);
 | ||
|         // Because Bracers can have On Hit Cast Spell type properties we should
 | ||
|         // avoid copying the bracers twice. Otherwise the player can get that On
 | ||
|         // Hit effect both when hitting, and getting hit.
 | ||
|         if ( bCopyGlovesToClaws == FALSE )
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oArmorNew);
 | ||
|     }
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Set artificial usage limits for special ability spells to work around
 | ||
|     // the engine limitation of not being able to set a number of uses for
 | ||
|     // spells in the polymorph radial
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ShifterSetGWildshapeSpellLimits(nSpell);
 | ||
| }
 | ||
| 
 |