🐾PurrwikimaniaSword x Staff, datamined

Combat mechanics

Duel simulator

Pick a class a side — the sheet fills with a realistic Champion-tier build for that line — load four Techniques and four Charms from it — its own tier and every tier below it — tap a slot to change one, then run a thousand duels — or watch one play out action by action on the game's own turn clock, with every hit through Damage() and every crit and block rolled.

You
?
VS
Opponent
?
You — stats
Opponent — stats

What is exact. The turn clock is SpeedToTime: each unit carries its own round counter that advances every 100000 / sqrt(SPD x rankSpeedScale), and whoever comes due next acts — so a unit with four times the SPD really does act twice as often. Cooldowns count that unit's own turns, not a shared round: FightSkillAgentComponent stamps LastRound from the caster's own FightRoundComponent. A skill with a cooldown starts on cooldown unless it is a Zero Initial CD skill (ResetCDAtStart in its prefab), which is what that keyword means. The strip of portraits along the top is the real order of play for the fight being shown.

From the EC prefabs, not the description text: each skill's element, its hit list with the coefficient each hit reads (Lion Combo is SkillAttack1, SkillAttack1, SkillAttack2; Divine Wrath rolls SkillAttack4 through a random-target hit), use limits, and heals. Damage is the whole of Damage() with crit and block rolled per hit, block cancelling crit exactly as CalcDamageTypeImpl does. Charms are folded into the sheet through CalcSkillPassiveProps, and the scene says which of their effects it could not use.

It is a PvP fight, and Damage() knows. Damage from a player is divided by the target's PlayerSkillDmgReduceScale and again by ProSkillDmgReduceScale, both per-rank bases from level_prop_battle_extra — at Champion III that is ÷1.14 and ÷1.31. The sheet's PvP Bonus DMG and PvP DMG RES join the percentage block, and the few skills with a PvpPropScale under 100% are scaled by it.

Then the governor. PVPSkillPropsScaleOnBattleProcessor multiplies every skill's damage by one more factor, the product of three: a survival floor — each fighter's burst-to-HP ratio, ATK²/(ATK+DEF)/HP carried through crit, block, element and the percentage block, and if the lowest one exceeds MinSurvivalRatio (0.10, a full-coefficient hit is worth at most a tenth of a health bar) all damage is scaled down to meet it; a skill-rank decay — the fighters' average skill rank against what avg_skill_rank expects for a server of this age, through level_number[456], never above 1; and a balance value from balance_value, which only has rows from Saint upward and so is 1.0 below that. This is why real fights run to ten rounds.

What a Charm does comes from its passive status. Each Charm equips one or more passive status entities, and the components on them are the effect: a skill fired on your hits, when you are hit, at the start or end of your turns or on a turn with no Technique (Blade Siphon, Counter Blade, Frost Guard); a status applied every so many Techniques (Blazing Clash), per 15% of HP lost (Frame of Battles) or when HP drops under a fraction (Pure Protection); a Mark that pays out at ten stacks with the Charm's own damage (Blade of Judgment); a lethal hit floored at 1 HP once, with the heal on the card (Indomitable Will). The sim runs all of those. Component types it has no model for are named on the Charm's hover card and in the note under the odds, so a Charm never silently does nothing.

Timing is the prefab's. Every hit carries the moment it lands (HitCfg.Delay): Eclipse Slash's six cuts fall at 0.3, 0.4, 0.78, 0.9, 1.04 and 1.48 seconds; Divine Wrath's sixteen from 0.85 to 2.24. At 1x the scene plays them at that pace.

Statuses, from the prefabs. Every hit's damage entity lists the statuses it applies (FightDamageComponent.StatusList: id, base chance, whether Effect Hit Rate and Effect RES modify it), and each status entity says what it is. The fight now runs them: stat buffs and debuffs from FightStatusPropComponent, scaled by the caster's rank like everything else; per-hit falloff (Divine Wrath's sixteen hits stamp a 40% decay on the target, so the cast is worth about 2.5 hits, not 16); Stun and Frozen (the holder loses its action, and Stun also freezes cooldowns via FightStatusSkillStopCdComponent); Blind (the holder's next Attack skill deals nothing, then it clears); shields that absorb before HP; poison and other round-start ticks; and expiry triggers, which is how Icebound heals when it ends. Durations count the holder's own turns. Landing rolls use EffectRate(): base chance x (1 + Effect Hit Rate / base) / (1 + Effect RES / base), cubed-ratio penalty for hard controls against a higher-ranked target, and Damp raising the odds of Frozen. Every hit rolls in the client's order: the attacker's Blind chance, then the target's Dodge, then block, then crit. Blind is a chance rather than a certainty — the status grants a 50% Blind chance for one Technique — and a dodged or blinded hit deals nothing and applies no status. Status DMG Bonus, Status DMG Taken and Status DMG RES form their own multiplicative stage, as Damage() applies them.

Charms with procs now fire: on-hit skills, each-turn skills, when-hit skills (reflect), and the turn-with-no-Technique check that Frost Guard uses. Fear, Confusion, Ridicule and Restrict are applied and shown but change nothing here — taunts and movement have no meaning in a 1v1 without a grid.

Hits and hooks follow the prefab's conditions. A hit typed HitDamageType.None deals nothing itself but still applies its statuses and child skills: Wind's Delight's damage is its child skill, seven waves that decay 35% per repeat on the same target (FightStatusDamageFalloffComponent). Child skills bring their own numbers, PvP scale and governor gate. A when-hit Charm fires only on the events its component names: Rebound on a hit the wearer blocks, Counter Blade on any damage, a Charm with ConditionCount every Nth event; the strike a Charm fires cannot set off further Charms when its skill's CanTriggerChild is off (Radiant Sear's, Rebound's, a Burn tick). Meteoric Flames' 60% Burn cell under the opponent burns at once and again each time they start a turn on it, for three of the caster's rounds; in a 1v1 nobody steps off it. Block is rolled before crit and cancels it; both chances fold the flat value forms over their per-rank bases, and the attacker's Accuracy lowers the block divisor too. Heals run the client's Cure() and are never governed.

Before round 1. The fight has a PlayStart status before Play, during which the AI is driven on a fixed interval, and a Technique whose card says "Casts once before battle starts" (skill.TryAtStartType, e.g. Heart of Challenge, Valor Surge) fires then: on each tick both fighters fire their next start skill, the faster one first, and each then sits on its cooldown like any cast.

A turn casts every Technique that is ready. Each goes in slot order and then onto its own cooldown, counted in that caster's turns. The engine's test is Round − LastRound > CD, so a skill with no cooldown fires every turn, a CD 1 skill sits out one full turn and returns the turn after, and every skill opens the fight on its full cooldown — a CD 2 skill first goes on turn 3, or turn 2 with Rapid Cast. A turn with three ready skills is three casts. There is no basic attack in the client: with nothing ready the turn passes, which is when Charms like Frost Guard that key off a Technique-less turn fire. Blind is spent by the first attack of the turn. The prefab lists the AI's tie-break priorities for targets, but there is no grid here, so range, area and positioning do nothing. That silences one Charm outright: Repelling Wind fires "when an enemy actively enters within 2 grids of the caster", and with nobody moving it never fires in this 1v1 (the Charm note under the loadout says so). The team simulator has the grid and plays it.

Fantomon are not here. The game does spawn each fighter's engaged Fantomon in a real fight, but the follower form's stats are set by the server and are nowhere in the client, and the adult form is a summon with its own turns and grid body. Neither simulator runs them yet; the team simulator page says what the client defines about them.