diff --git a/changelog.txt b/changelog.txt index e5695ca13..ab4ef1edd 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,11 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 03/03/2014 == +demonstar55: Implemented deadly strikes and gave rogues higher innate throwing crit chance + +New rules: Combat:RogueCritThrowingChance, Combat:RogueDeadlyStrikeChance, Combat:RogueDeadlyStrikeMod + Defaults should give fairly close to live results + == 03/02/2014 == Kayen: Revision to charm code to be consistent with live based on extensive personal parsing. *Charisma ONLY effects the initial resist check when charm is cast with 10 CHA = -1 Resist mod up to 200 CHA diff --git a/common/ruletypes.h b/common/ruletypes.h index 614e12eb7..3b1e5ca44 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -308,6 +308,9 @@ RULE_INT ( Combat, WarBerBaseCritChance, 3 ) //The base crit chance for warriors RULE_INT ( Combat, BerserkBaseCritChance, 6 ) //The bonus base crit chance you get when you're berserk RULE_INT ( Combat, NPCBashKickLevel, 6 ) //The level that npcs can KICK/BASH RULE_INT ( Combat, NPCBashKickStunChance, 15 ) //Percent chance that a bash/kick will stun +RULE_INT ( Combat, RogueCritThrowingChance, 25) //Rogue throwing crit bonus +RULE_INT ( Combat, RogueDeadlyStrikeChance, 80) //Rogue chance throwing from behind crit becomes a deadly strike +RULE_INT ( Combat, RogueDeadlyStrikeMod, 2) //Deadly strike modifier to crit damage RULE_INT ( Combat, ClientBaseCritChance, 0 ) //The base crit chance for all clients, this will stack with warrior's/zerker's crit chance. RULE_BOOL ( Combat, UseIntervalAC, true) RULE_INT ( Combat, PetAttackMagicLevel, 30) diff --git a/zone/StringIDs.h b/zone/StringIDs.h index c1ead87e6..4fb04539b 100644 --- a/zone/StringIDs.h +++ b/zone/StringIDs.h @@ -160,6 +160,7 @@ #define ASSASSINATES 1016 //%1 ASSASSINATES their victim!! #define CRIPPLING_BLOW 1021 //%1 lands a Crippling Blow!(%2) #define CRITICAL_HIT 1023 //%1 scores a critical hit! (%2) +#define DEADLY_STRIKE 1024 //%1 scores a Deadly Strike!(%2) #define RESISTS_URGE 1025 //%1 resists their urge to flee. #define BERSERK_START 1027 //%1 goes into a berserker frenzy! #define DEATH_PACT 1028 //%1's death pact has been benevolently fulfilled! diff --git a/zone/attack.cpp b/zone/attack.cpp index aad79032b..3316c3eb3 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4333,11 +4333,16 @@ void Mob::TryCriticalHit(Mob *defender, uint16 skill, int32 &damage, ExtraAttack } } + int deadlyChance = 0; + int deadlyMod = 0; if(skill == SkillArchery && GetClass() == RANGER && GetSkill(SkillArchery) >= 65) critChance += 6; - if(skill == SkillThrowing && GetClass() == ROGUE && GetSkill(SkillThrowing) >= 65) - critChance += 6; + if (skill == SkillThrowing && GetClass() == ROGUE && GetSkill(SkillThrowing) >= 65) { + critChance += RuleI(Combat, RogueCritThrowingChance); + deadlyChance = RuleI(Combat, RogueDeadlyStrikeChance); + deadlyMod = RuleI(Combat, RogueDeadlyStrikeMod); + } int CritChanceBonus = GetCriticalChanceBonus(skill); @@ -4383,6 +4388,14 @@ void Mob::TryCriticalHit(Mob *defender, uint16 skill, int32 &damage, ExtraAttack critMod += GetCritDmgMob(skill) * 2; // To account for base crit mod being 200 not 100 damage = damage * critMod / 100; + bool deadlySuccess = false; + if (deadlyChance && MakeRandomFloat(0, 1) < static_cast(deadlyChance) / 100.0f) { + if (BehindMob(defender, GetX(), GetY())) { + damage *= deadlyMod; + deadlySuccess = true; + } + } + if (crip_success) { entity_list.FilteredMessageClose_StringID(this, false, 200, MT_CritMelee, FilterMeleeCrits, CRIPPLING_BLOW, @@ -4393,6 +4406,10 @@ void Mob::TryCriticalHit(Mob *defender, uint16 skill, int32 &damage, ExtraAttack defender->Emote("staggers."); defender->Stun(0); } + } else if (deadlySuccess) { + entity_list.FilteredMessageClose_StringID(this, false, 200, + MT_CritMelee, FilterMeleeCrits, DEADLY_STRIKE, + GetCleanName(), itoa(damage)); } else { entity_list.FilteredMessageClose_StringID(this, false, 200, MT_CritMelee, FilterMeleeCrits, CRITICAL_HIT,