diff --git a/common/ruletypes.h b/common/ruletypes.h index 17a7919ac..bf5b87d47 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -256,6 +256,7 @@ RULE_INT(Skills, SenseHeadingStartValue, 200, "Start value of sense heading skil RULE_BOOL(Skills, SelfLanguageLearning, true, "Enabling self-learning of languages") RULE_BOOL(Skills, RequireTomeHandin, false, "Disable click-to-learn and force hand in to Guild Master") RULE_INT(Skills, TradeSkillClamp, 0, "Legacy tradeskills would clamp at 252 regardless of item modifiers and skill combination. DEFAULT: 0 will bypass clamp. Legacy value 252") +RULE_BOOL(Skills, UseAltSinisterStrikeFormula, false, "Enabling will utilize a formula derived from 2004 monkey business post which makes the AA actually worth something.") RULE_CATEGORY_END() RULE_CATEGORY(Pets) diff --git a/zone/attack.cpp b/zone/attack.cpp index 911fdcafb..e12f449e9 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3217,57 +3217,73 @@ uint8 Mob::GetWeaponDamageBonus(const EQ::ItemData *weapon, bool offhand) // We assume that the level check is done before calling this function and sinister strikes is checked before // calling for offhand DB auto level = GetLevel(); - if (!weapon) + + if (!weapon) { return 1 + ((level - 28) / 3); // how does weaponless scale? + } auto delay = weapon->Delay; if (weapon->IsType1HWeapon() || weapon->ItemType == EQ::item::ItemTypeMartial) { // we assume sinister strikes is checked before calling here if (!offhand) { - if (delay <= 39) + if (delay <= 39) { return 1 + ((level - 28) / 3); - else if (delay < 43) + } else if (delay < 43) { return 2 + ((level - 28) / 3) + ((delay - 40) / 3); - else if (delay < 45) + } else if (delay < 45) { return 3 + ((level - 28) / 3) + ((delay - 40) / 3); - else if (delay >= 45) + } else if (delay >= 45) { return 4 + ((level - 28) / 3) + ((delay - 40) / 3); + } + } else { + if (RuleB(Skills, UseAltSinisterStrikeFormula)) { + if (delay <= 19) { + return 5 + ((level - 40) / 3) * (delay / 30); + } else if (delay <= 23) { + return 6 + ((level - 40) / 3) * (delay / 30); + } else if (delay >= 24) { + return 7 + ((level - 40) / 3) * (delay / 30); + } + } else { + return 1 + ((level - 40) / 3) * (delay / 30); // YOOO shit's useless waste of AAs + } } - else { - return 1 + ((level - 40) / 3) * (delay / 30); // YOOO shit's useless waste of AAs - } - } - else { + } else { // 2h damage bonus int64 damage_bonus = 1 + (level - 28) / 3; - if (delay <= 27) + + if (delay <= 27) { return damage_bonus + 1; + } + // Client isn't reflecting what the dev quoted, this matches better if (level > 29) { int level_bonus = (level - 30) / 5 + 1; if (level > 50) { level_bonus++; int level_bonus2 = level - 50; - if (level > 67) + if (level > 67) { level_bonus2 += 5; - else if (level > 59) + } else if (level > 59) { level_bonus2 += 4; - else if (level > 58) + } else if (level > 58) { level_bonus2 += 3; - else if (level > 56) + } else if (level > 56) { level_bonus2 += 2; - else if (level > 54) + } else if (level > 54) { level_bonus2++; + } level_bonus += level_bonus2 * delay / 40; } damage_bonus += level_bonus; } if (delay >= 40) { int delay_bonus = (delay - 40) / 3 + 1; - if (delay >= 45) + if (delay >= 45) { delay_bonus += 2; - else if (delay >= 43) + } else if (delay >= 43) { delay_bonus++; + } damage_bonus += delay_bonus; } return damage_bonus;