MapleStory Quest

Client formula audit

Formulas

Every calculation this site performs, with its source and status. If a number in the planner surprises you, it should be traceable to something on this page.
About this page

These are transcribed from the COT2 client formula audit published alongside the OSMS datamine. They are COT2 formulas, and several differ from both COT1 and older versions of the game, so applying remembered numbers from other versions will give wrong answers. The audit was made on Closed Online Test 2 and has not been redone for the Public Release, so until it is, these are the CoT2 formulas. The engine that implements them is covered by unit tests that assert these exact expressions.

Damage7

Physical damage

Read from the client
StatDiv = 300 if Prone Stab, or Bow/Crossbow/Claw on Swing, Stab or Other
          100 otherwise
AtkDiv  = 150 if Prone Stab, or Bow/Crossbow/Claw on Swing or Other
           50 otherwise

MIN = SkillMult × (0.8 + (Primary × WepMult × Mastery + Secondary) / StatDiv + AttackPower / AtkDiv) × WeaponAttack
MAX = SkillMult × (1.0 + (Primary × WepMult + Secondary) / StatDiv + AttackPower / AtkDiv) × WeaponAttack
  • WeaponAttack is attack from the weapon and shield (5 barehanded), plus the throwing stars or arrows being fired. AttackPower is every other slot plus buffs.
  • The planner fires the first star or arrow in the build’s consumables that the weapon in hand can shoot (the Damage tab picks it), and adds it only on a shot: a Claw swung in melee throws nothing.
  • WepMult comes from the attack action, not the skill. Lucky Seven overrides it to 3.0.
  • A few skills never roll for swing or stab: Double Stab and Savage Blow always Stab, Avenger always Shoots, and Rush, Assaulter, Meso Explosion, Shout, Dragon Fury, Dragon Roar and Piercing Crusher always use Other. Every other physical skill is averaged over the weapon’s action list.
  • MIN and MAX are the corners of two independent rolls, so damage bunches toward the middle.

Magical damage

Read from the client
MAGIC = floor(Total INT / 2) + Magic Attack

MIN = (BasicAttack / 100) × MAGIC × (Total INT × Mastery / 100 + 1)
MAX = (BasicAttack / 100) × MAGIC × (Total INT / 100 + 1)
  • MAGIC and Magic Attack are different numbers. The planner shows both separately for exactly this reason.
  • The client seeds MAGIC with half the INT rounded down, so an odd INT adds nothing over the even one below it.
  • Magic reads mastery from the attacking skill itself, so a weapon mastery skill never affects magic.

Heal

Read from the client
HealAmount = ((INT × rand(0.8, 1.0) + LUK) / 200 + 3) × MAGIC × (RecoveryRate / 100) × (Targets × 0.1 + 1)
HealAmount = HealAmount × (HealBonus / 100 + 1)
UndeadDamage = trunc(HealAmount) / Targets × 0.5
  • MAGIC is the floored value above.
  • Targets is everyone the cast reaches: the monsters, the caster and the allies in range, and never fewer than 1, because the caster is always in range. The planner counts the caster alone unless an undead target is measured (then the caster and that monster), and takes a party size when one is given.
  • HealBonus is Bless’s bonus, 1% at level 1 rising to 10% at level 20, applied when Bless is switched on.

Mastery

Read from the client
MasteryMult = (0.1 + MasteryLevel / 10) × 0.8

At mastery 10 → 0.88
With no mastery skill (level 0) → 0.08
Lucky Seven → fixed at 0.5
  • An unlearned mastery is level 0, not a zero multiplier: the primary stat still counts toward MIN at 0.08.
  • Lucky Seven ignores Claw Mastery and rolls its MIN at 0.5, the equivalent of mastery level 5.25.

Combo Attack & Elemental Charge

Read from the client
ComboBonus = 5 × Orbs × (Orbs − 1)   for Panic and Coma
ComboBonus = ComboDamage             for every other skill
SkillMult  = SkillMult × (ComboBonus / 100 + 1)

SkillMult  = SkillMult × (ChargeDamage / 100 + 1)
  • Both land on the Skill Damage % before the physical formula runs, so they scale the whole hit.
  • Combo Attack needs at least one orb. The planner assumes the skill’s own maximum orb count unless told otherwise, which is what a Crusader builds up to before Panic.
  • An active charge also gives the hit its element.

Critical hit

Read from the client
IsCrit = rand(0, 99) < CritRate
Damage = Damage × (100 + CritDamage) / 100
  • Base player values are 5% rate and 20% damage before gear and buffs.
  • The planner reports the expected value, 1 − rate + rate × (100 + CritDamage)/100, and shows the all-crit ceiling separately.

Clamp

Read from the client
Damage = trunc(Damage)
Damage = clamp(Damage, 1, 99,999)

What is deliberately missing

  • Cast times and DPS. The audit does not establish frame-accurate cast delays, and Spell Booster’s speed stages have no verified conversion to milliseconds. The character’s own action frames are extracted from the client, but not yet turned into cast times, so the planner computes damage per cast exactly and turns it into DPS only for a cast time you supply.
  • Monster drop tables. Not present in the datamine. Item sources on this site come from quest rewards and crafting recipes only.
  • Potion stacking rules. The data states each consumable’s effect but not how overlapping categories interact, so consumable bonuses are entered as manual modifiers rather than stacked automatically.
  • Skill elements. Read from the client’s own skill data rather than from the tooltips: twenty-one skills carry an element there. The monster side is the datamine’s resistance table, and every value is overridable per target in the planner.
MapleStory Classic World damage & EXP formulas · MapleStory Quest