#include "inc_utility" //:: Created by Mr. Bumpkin //:: Include for all rages //:: This function gets called right after the attribute bonuses are //:: Applied. // Applies all the bonus damage, to hit, and temporary hp to barbarians who would go over their // +12 attribute caps by raging. void GiveExtraRageBonuses(int nDuration, int nStrBeforeRaging, int nConBeforeRaging, int strBonus, int conBonus, int nSave, int nDamageBonusType, object oRager = OBJECT_SELF); // Returns the damage type of the weapon held in nInventorySlot by oCreature. If they aren't // holding a weapon, or the weapon they're holding is a x-bow, sling, shuriken, or dart, it returns // either the damage type of slashing or bludgeoning, depending on whether they have a prc creature // slashing weapon or not. It's bludgeoning if they don't have a prc creature slashing weapon. int GetDamageTypeOfWeapon(int nInventorySlot, object oCreature = OBJECT_SELF); // Applies all the bonus damage, to hit, and temporary hp to barbarians who would go over their // +12 attribute caps by raging. void GiveExtraRageBonuses(int nDuration, int nStrBeforeRaging, int nConBeforeRaging, int strBonus, int conBonus, int nSave, int nDamageBonusType, object oRager = OBJECT_SELF) { float nDelayed = 0.1; int nStrSinceRaging = GetAbilityScore(oRager, ABILITY_STRENGTH); int nConSinceRaging = GetAbilityScore(oRager, ABILITY_CONSTITUTION); int nStrAdded = nStrSinceRaging - nStrBeforeRaging; // The amount that was added to the str int nStrWeWouldAdd = strBonus - nStrAdded; // The amount we would have to theorhetically add if we wanted to give them the full bonus. effect eDamage; effect eToHit; if(nStrAdded < strBonus) { //int nDamageBonusType = GetDamageTypeOfWeapon(INVENTORY_SLOT_RIGHTHAND, oRager); if((nStrSinceRaging/2) * 2 != nStrSinceRaging) // determine if their current Str right now is odd { if((nStrWeWouldAdd/2) * 2 != nStrWeWouldAdd) // determine if the amount we would theorhetically have to add is odd. // If so, then we're adding 2 odd numbers together to get an even. Add one to the bonuses { //::::: in this event we add nStrWeWouldAdd/2 + 1 //int nAmountToAdd = nStrWeWouldAdd/2 + 1; eDamage = EffectDamageIncrease(nStrWeWouldAdd/2 + 1, nDamageBonusType); eToHit = EffectAttackIncrease(nStrWeWouldAdd/2 +1); } else { //::::: in this event we add nStrWeWouldAdd/2 eDamage = EffectDamageIncrease(nStrWeWouldAdd/2, nDamageBonusType); eToHit = EffectAttackIncrease(nStrWeWouldAdd/2); } } else { //::::: in this event we add nStrWeWouldAdd/2 eDamage = EffectDamageIncrease(nStrWeWouldAdd/2, nDamageBonusType); eToHit = EffectAttackIncrease(nStrWeWouldAdd/2); } effect eLink2 = ExtraordinaryEffect(EffectLinkEffects(eDamage, eToHit)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink2, oRager, RoundsToSeconds(nDuration) - nDelayed); // Applies the damage and toHit effects. I couldn't help myself, so I made the damage type be fire. } // If nStrAdded >= nStrBonus, then no need to add any special bonuses. :) int nConAdded = nConSinceRaging - nConBeforeRaging; // The amount that was added to the Con int nConWeWouldAdd = conBonus - nConAdded; // The amount we would have to theorhetically add if we wanted to give them the full bonus. if(nConAdded < conBonus) { effect eHitPoints; effect eHPRemoved; int nCharacterLevel = GetHitDice(oRager); if((nConSinceRaging/2) * 2 != nConSinceRaging) // determine if their current Con right now is odd { if((nConWeWouldAdd/2) * 2 != nConWeWouldAdd) // determine if the amount we would theorhetically have to add is odd. // If so, then we're adding 2 odd numbers together to get an even. Add one to the bonuses { //::::: in this event we add nConWeWouldAdd/2 + 1 eHitPoints = EffectTemporaryHitpoints((nConWeWouldAdd/2 +1) * nCharacterLevel); eHPRemoved = EffectDamage(((nConWeWouldAdd/2 +1) * nCharacterLevel), DAMAGE_TYPE_MAGICAL); // We have to remove the temporary HP at the end of the rage via a damage effect, hehe. // The damage type will be magical, something to keep in mind of magical resistances exist // on your module. :) If that's a problem, change the damage type. } else { //::::: in this event we add nConWeWouldAdd/2 eHitPoints = EffectTemporaryHitpoints((nConWeWouldAdd/2) * nCharacterLevel); eHPRemoved = EffectDamage(((nConWeWouldAdd/2) * nCharacterLevel), DAMAGE_TYPE_MAGICAL); // We have to remove the temporary HP at the end of the rage via a damage effect, hehe. // The damage type will be magical, something to keep in mind of magical resistances exist // on your module. :) If that's a problem, change the damage type. } } else { //::::: in this event we add nConWeWouldAdd/2 eHitPoints = EffectTemporaryHitpoints((nConWeWouldAdd/2) * nCharacterLevel); eHPRemoved = EffectDamage(((nConWeWouldAdd/2) * nCharacterLevel), DAMAGE_TYPE_MAGICAL); // We have to remove the temporary HP at the end of the rage via a damage effect, hehe. // The damage type will be magical, something to keep in mind of magical resistances exist // on your module. :) If that's a problem, change the damage type. } eHitPoints = ExtraordinaryEffect(eHitPoints); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHitPoints, oRager, RoundsToSeconds(nDuration)- nDelayed); //::: Had to ditch applying the damage effect, cause it would apply it even if they rested during their //::: rage, and the resting was what ended it. Pretty Ironic. //::: If you reactivate it, make sure to have the temporary HP effect last longer than the delay on the damage effect. 8j //DelayCommand(RoundsToSeconds(nDuration) - nDelayed, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHPRemoved, oRager)); // This is really how the temporary hp are going to get removed. I just didn't want to take any chances, // so I gave the temporary hp a temporary duration. } // If nConAdded >= nConBonus, then no need to add any special bonuses. :) }// End of the whole function. // Returns the damage type of the weapon held in nInventorySlot by oCreature. If they aren't // holding a weapon, or the weapon they're holding is a x-bow, sling, shuriken, or dart, it returns // either the damage type of slashing or bludgeoning, depending on whether they have a prc creature // slashing weapon or not. It's bludgeoning if they don't have a prc creature slashing weapon. int GetDamageTypeOfWeapon(int nInventorySlot, object oCreature = OBJECT_SELF) { // 2da lookup to see what kind of damage it deals, then find the equivalent constant int iDamageType = StringToInt(Get2DACache("baseitems","WeaponType",GetBaseItemType(GetItemInSlot(nInventorySlot, oCreature)))); switch(iDamageType) { case 1: return DAMAGE_TYPE_PIERCING; case 2: return DAMAGE_TYPE_BLUDGEONING; case 3: return DAMAGE_TYPE_SLASHING; case 4: return DAMAGE_TYPE_SLASHING; // slashing & piercing... slashing bonus. case 5: return DAMAGE_TYPE_BLUDGEONING; // bludeoning & piercing... bludeoning bonus. } // If none of the above types got a hit, we must assume the character is unarmed. if(GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCreature)) == BASE_ITEM_CSLSHPRCWEAP || GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCreature)) == BASE_ITEM_CSLSHPRCWEAP || GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCreature)) == BASE_ITEM_CSLSHPRCWEAP) { return DAMAGE_TYPE_SLASHING; } // If they're unarmed and have no creature weapons from a prc, we must assume they are just using their fists. return DAMAGE_TYPE_BLUDGEONING; } // function I typed out to add duration to the rage, only to realize happily that there is no need. // the normal rage function calculates duration as being what it naturally should be, even if there // were no +12 bonus cap. :) /* if(nBonusDuration) { effect eStr = EffectAbilityIncrease(ABILITY_CONSTITUTION, nBonus); effect eCon = EffectAbilityIncrease(ABILITY_STRENGTH, nBonus); effect eSave = EffectSavingThrowIncrease(SAVING_THROW_WILL, nSave); effect eAC = EffectACDecrease(2, AC_DODGE_BONUS); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eLink = EffectLinkEffects(eCon, eStr); eLink = EffectLinkEffects(eLink, eSave); eLink = EffectLinkEffects(eLink, eAC); eLink = EffectLinkEffects(eLink, eDur); SignalEvent(OBJECT_SELF, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_BARBARIAN_RAGE, FALSE)); //Make effect extraordinary eLink = ExtraordinaryEffect(eLink); DelayCommand(RoundsToSeconds(nDuration, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oRager, RoundsToSeconds(nBonusDuration))); } */