From 3683b8173ce174e3d8e32352e3054f32ca936635 Mon Sep 17 00:00:00 2001 From: Jupiter065 Date: Wed, 30 Apr 2014 12:41:39 -0600 Subject: [PATCH 1/4] Implement Shield Mastery Shield mastery prevents spell interruption on a shield block and grants bonus TP (based on rank) on a shield block. --- src/map/utils/battleutils.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/map/utils/battleutils.cpp b/src/map/utils/battleutils.cpp index b1a6021..e9cac12 100644 --- a/src/map/utils/battleutils.cpp +++ b/src/map/utils/battleutils.cpp @@ -2012,8 +2012,17 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in // try to interrupt spell if(PDefender->PBattleAI->m_PMagicState != NULL) { - // use new method - PDefender->PBattleAI->m_PMagicState->TryHitInterrupt(PAttacker); + + if((PDefender->objtype == TYPE_PC ) && (charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (isBlocked) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) + { + // If the defender has shield mastery and blocked the attack with a shield, + // don't interrupt their spell casting + } + else + { + // use new method + PDefender->PBattleAI->m_PMagicState->TryHitInterrupt(PAttacker); + } } else { @@ -2067,6 +2076,11 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in { //yup store tp counts on hits taken too! PDefender->addTP((baseTp / 3) * sBlowMult * (1.0f + 0.01f * (float)(PDefender->getMod(MOD_STORETP) + getStoreTPbonusFromMerit(PAttacker)))); //here again... + if((charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (isBlocked) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) + { + // If the player blocked with a shield and has shield mastery, add shield mastery TP bonus + PDefender->addTP(PDefender->getMod(MOD_SHIELD_MASTERY_TP)) + } } else { @@ -4613,4 +4627,4 @@ int32 GetRangedAccuracyBonuses(CBattleEntity* battleEntity) } }; - + -- 1.9.1 From 9f8079513c163f593285a58e667035c3e937d6a6 Mon Sep 17 00:00:00 2001 From: Jupiter065 Date: Wed, 30 Apr 2014 13:17:02 -0600 Subject: [PATCH 2/4] Shield Mastery TP bonus TP bonus only occurs when the damage before blocking would be greater than zero, factoring in phalanx and stoneskin. --- src/map/utils/battleutils.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/map/utils/battleutils.cpp b/src/map/utils/battleutils.cpp index e9cac12..62136e2 100644 --- a/src/map/utils/battleutils.cpp +++ b/src/map/utils/battleutils.cpp @@ -1897,6 +1897,7 @@ uint8 GetGuardRate(CBattleEntity* PAttacker, CBattleEntity* PDefender) uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, int32 damage, bool isBlocked, uint8 slot, uint16 tpMultiplier, CBattleEntity* taChar, bool giveTPtoVictim) { bool isRanged = (slot == SLOT_AMMO || slot == SLOT_RANGED); + int32 unblocked_damage = damage; if(PAttacker->StatusEffectContainer->HasStatusEffect(EFFECT_FORMLESS_STRIKES)) { @@ -1906,18 +1907,19 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in formlessMod += ((CCharEntity*)PAttacker)->PMeritPoints->GetMeritValue(MERIT_FORMLESS_STRIKES, (CCharEntity*)PAttacker); damage = damage * formlessMod / 100; + unblocked_damage = damage; } else { - damage = DmgTaken(PDefender, damage); - - if(isRanged) - { - damage = RangedDmgTaken(PDefender, damage); - } else { - damage = PhysicalDmgTaken(PDefender, damage); - } + damage = DmgTaken(PDefender, damage); + + if(isRanged) + { + damage = RangedDmgTaken(PDefender, damage); + } else { + damage = PhysicalDmgTaken(PDefender, damage); + } switch(PAttacker->m_Weapons[slot]->getDmgType()) { @@ -1928,6 +1930,7 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in case DAMAGE_IMPACT: damage = (damage * (PDefender->getMod(MOD_IMPACTRES))) / 1000; break; case DAMAGE_HTH: damage = (damage * (PDefender->getMod(MOD_HTHRES))) / 1000; break; } + unblocked_damage = damage; if(isBlocked) { @@ -1947,6 +1950,12 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in damage = (damage * absorb) / 100; } } + if (unblocked_damage > 0) + { + // check if unblocked damage would have been reduced to 0 by phalanx or stoneskin + unblocked_damage = dsp_max(unblocked_damage - PDefender->getMod(MOD_PHALANX), 0); + unblocked_damage = dsp_max(unblocked_damage - PDefender->getMod(MOD_STONESKIN), 0); + } if (damage > 0) { damage = dsp_max(damage - PDefender->getMod(MOD_PHALANX), 0); @@ -2013,7 +2022,7 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in if(PDefender->PBattleAI->m_PMagicState != NULL) { - if((PDefender->objtype == TYPE_PC ) && (charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (isBlocked) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) + if((isBlocked) && (PDefender->objtype == TYPE_PC ) && (charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) { // If the defender has shield mastery and blocked the attack with a shield, // don't interrupt their spell casting @@ -2076,9 +2085,10 @@ uint32 TakePhysicalDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, in { //yup store tp counts on hits taken too! PDefender->addTP((baseTp / 3) * sBlowMult * (1.0f + 0.01f * (float)(PDefender->getMod(MOD_STORETP) + getStoreTPbonusFromMerit(PAttacker)))); //here again... - if((charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (isBlocked) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) + if((isBlocked) && (unblocked_damage > 0) && (charutils::hasTrait((CCharEntity*)PDefender, TRAIT_SHIELD_MASTERY)) && (PDefender->m_Weapons[SLOT_SUB]->IsShield())) { // If the player blocked with a shield and has shield mastery, add shield mastery TP bonus + // unblocked damage (before stoneskin/phalanx) must be greater than zero PDefender->addTP(PDefender->getMod(MOD_SHIELD_MASTERY_TP)) } } -- 1.9.1 From 4117e29b21f166849bea0ab2e739dfb6c41c7db6 Mon Sep 17 00:00:00 2001 From: Jupiter065 Date: Wed, 30 Apr 2014 13:18:38 -0600 Subject: [PATCH 3/4] Add modifier for shield mastery trait TP bonus --- src/map/modifier.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/map/modifier.h b/src/map/modifier.h index 9f9fc4a..446c9e5 100644 --- a/src/map/modifier.h +++ b/src/map/modifier.h @@ -314,6 +314,7 @@ enum MODIFIER // Paladin MOD_ABSORB_DMG_TO_MP =0x1AA,// Absorbs a percentage of damage taken to MP. (modId = 426) MOD_ENMITY_REDUCTION_PHYSICAL =0x1AB,// TODO: Reduces Enmity decrease when taking physical damage (modId = 427) + MOD_SHIELD_MASTERY_TP =0x1E5,// Shield mastery TP bonus when blocking with a shield (modId = 485) // Dark Knight @@ -540,7 +541,7 @@ enum MODIFIER MOD_EAT_RAW_MEAT =0x19A, // not implemented (modId = 410) }; -#define MAX_MODIFIER 485 +#define MAX_MODIFIER 486 @@ -566,4 +567,4 @@ class CModifier int16 m_amount; }; -#endif \ No newline at end of file +#endif -- 1.9.1 From 53c0c520863bd294d5044111ee0696cd73a4495d Mon Sep 17 00:00:00 2001 From: Jupiter065 Date: Wed, 30 Apr 2014 13:20:00 -0600 Subject: [PATCH 4/4] Added mod for Shield Mastery TP bonus to Shield Mastery Trait --- sql/traits.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sql/traits.sql b/sql/traits.sql index 9a97794..8fc5351 100644 --- a/sql/traits.sql +++ b/sql/traits.sql @@ -213,12 +213,12 @@ INSERT INTO `traits` VALUES ('24','clear mind','20','76','5','71','15'); INSERT INTO `traits` VALUES ('24','clear mind','20','76','5','295','2'); INSERT INTO `traits` VALUES ('24','clear mind','20','96','6','71','18'); INSERT INTO `traits` VALUES ('24','clear mind','20','96','6','295','3'); -INSERT INTO `traits` VALUES ('25','shield mastery','5','87','1','0','0'); -INSERT INTO `traits` VALUES ('25','shield mastery','5','97','2','0','0'); -INSERT INTO `traits` VALUES ('25','shield mastery','7','25','1','0','0'); -INSERT INTO `traits` VALUES ('25','shield mastery','7','50','2','0','0'); -INSERT INTO `traits` VALUES ('25','shield mastery','7','75','3','0','0'); -INSERT INTO `traits` VALUES ('25','shield mastery','7','96','4','0','0'); +INSERT INTO `traits` VALUES ('25','shield mastery','5','87','1','485','1'); +INSERT INTO `traits` VALUES ('25','shield mastery','5','97','2','485','2'); +INSERT INTO `traits` VALUES ('25','shield mastery','7','25','1','485','1'); +INSERT INTO `traits` VALUES ('25','shield mastery','7','50','2','485','2'); +INSERT INTO `traits` VALUES ('25','shield mastery','7','75','3','485','3'); +INSERT INTO `traits` VALUES ('25','shield mastery','7','96','4','485','4'); INSERT INTO `traits` VALUES ('32','beast killer','9','70','1','230','8'); INSERT INTO `traits` VALUES ('33','plantoid killer','9','60','1','229','8'); INSERT INTO `traits` VALUES ('34','vermin killer','9','10','1','224','8'); @@ -417,4 +417,4 @@ INSERT INTO `traits` VALUES ('24','clear mind','21','60','3','71','9'); INSERT INTO `traits` VALUES ('24','clear mind','21','60','3','295','1'); -- Max MP Boost Tiers I ~ II INSERT INTO `traits` VALUES ('8','max mp boost','21','30','1','5','10'); -INSERT INTO `traits` VALUES ('8','max mp boost','21','60','2','5','20'); \ No newline at end of file +INSERT INTO `traits` VALUES ('8','max mp boost','21','60','2','5','20'); -- 1.9.1