Skip to content

Mythic Masters: combat feel hill climb to 7/10, rounds 6+ (from #4046) #4149

Open

Description

@QuinnsCode

Carries the climb on from #4046 (round 5), which carried it from #3688 (round 4), #3511 (round 3), #3493 (round 2) and #3465 (round 1). Part of #2945 (orbit-and-commit combat, weighty attacks). The attacks redesign in #3268 (shapes, tempos, field kits, then telegraphs and effects) is the main thing this climb judges, so rounds follow its steps rather than racing them.

The goalpost

Target 7/10 for how a fight feels to watch and to play: weighty, committed melee where the fighters circle but never stand and trade, hits you can see land (squat, stagger, camera shove, shockwave), and wind-ups you can read and punish.

Agent judges run about 2 points high on visual climbs (#2943: judges 5, owner 3), so the owner's score at the target decides it, through one MANUAL RUN.

Rounds so far

Round PR Change Judge BEFORE to NOW
1 #3492 heavies circle a ring 0.8 m outside their reach, step in only to swing, back out after; balance.json re-fit 4 to 5 (main alone: 4.5)
2 #3510 heavy swings lock (stop tracking) halfway through the wind-up; a reach wedge on the ground whose rim flares at the lock; the coil holds from 40% of the wind-up; bots sometimes dash out of a locked sweep; balance.json re-fit (44-56%) 4.5 to 5.5
3 #3687 bots dash out of a locked sweep most ticks (sim: 21% to 39% of locked swings dodged) and punish the whiff's recovery (2% to 15%); sim-rs and sim.wasm match; balance.json re-fit (44-57%); a dodge burst in --combat 4 to 4.5
4 #3856, #4044 the dodge burst waits for a locked swing on a free fighter and stops at the fight's end (#3856, tooling); a heavy that sees the other step in and face it holds its swing half the time and backs out past the sweep with its punish armed, so same-tick trades fall from 1,670 to 525 of the locked swings and dash-outs rise from 36% to 49%; balance.json re-fit (44-57%) 4 to 4.5
5 #4147 the dodge burst is shot up to four times and kept from the first try whose defender dashes out, and no burst shoots a finished fight (tooling); a blow sits the struck body into its legs for the whole stun, the stagger eases over about 0.4 s instead of 0.25 s, and a big hit's coloured glow is smaller and shorter. Render only: sim and balance.json untouched 4.5 to 5.5

Scores are on the owner's halved scale since 2026-11-05: each round adds half the judge's gain. Now at 3.75/10.

One round

One worker, from main:

  1. BEFORE: cd apps/mythic-masters && bun scripts/burst-shots.ts docs/shots-<date>-combat before --combat (one fight per archetype, a wind-up burst, a dodge burst cued on a locked swing, and a hit burst, side camera).
  2. The change the newest Next: line names.
  3. NOW: the same command with now. Then a fresh judge agent scores BEFORE vs NOW out of 10 without the worker's reasoning. Keep the change only if the score went up.
  4. Balance must hold: bun scripts/tune.ts --each 6 --rust before and after, every creature within 40-60% (main sits at 44-57%). If the change shifts it, bun scripts/tune.ts --fit 6 3 --rust re-fits src/balance.json. Then check bun test test/journey.test.ts, because its Jersey Devil wall is sensitive to that creature's edge.

Carried over (each has its own issue)

Ending a round

Comment here, first line Score: x/10 (target 7), then the shots, then Next: <the judge's top gap>. The PR says "Part of #", never a closing word. Then hop forward (the baton text is in scripts/climbs.ts).

Learned in round 5

  • A render or tooling change can't move the sim, so it skips the tune and the wasm rebuild. Say so in the PR.
  • The dodge burst now retries up to four times for a dash (window.__dashed, watched from the lock for the burst's 1.2 s). Three of four fights caught one on the first or second try; the skirmisher fight is short, so it often ends first.
  • The judge's view of NOW: hits read harder, dodges and the punish after show (now-bruiser-dodge-b1 dash, b5 punish). Still: the struck body stands up a frame later (now-tank-dodge-b1..b3), and fighters stand square-on one body-length apart in several bursts.

Learned in round 4

  • Most locked swings that landed on a busy defender were not a defender choosing to swing into a wedge: both bots pressed on the same tick, because two committing heavies cross the striking distance together. A gate in press that refuses a swing the incoming heavy would beat changed nothing for that reason; splitting the scratch tally by who pressed first (o.t against f.t at the lock) found it.
  • A defender that holds its swing has to leave the other's heavy sweep too: the ring (RING, 0.8 m past reach) sits inside it, so waiting on the ring just eats the blow (tanks fell to 29-46% until it backed out).
  • main drifts: other rounds left five tanks at 36-39% before this one. Take the BEFORE tune on today's main, not the number in this issue.

Learned in round 3

  • The fight plays on the wasm sim (Mythic Masters: the page plays its fights on the wasm sim (sim-rs) #3668). A bot or sim change goes in src/bot.ts/src/sim.ts and sim-rs/src/, statement for statement with every rnd() in the same place. Then bun scripts/sim-rust.ts rebuilds src/sim.wasm and checks 24 fights hash for hash. Run it again after a balance.json re-fit, since the data is written from the TS.
  • The shot counts and the sim's counts can disagree. Measure what changed in the sim (a scratch loop over newMatch/step with both bots) before blaming the change, and fix the cue so the shots catch it.
  • A burst after the fight ends shoots the result page (now-skirmisher in round 3).

Learned in round 2

  • In the sim a walking sidestep can't leave a heavy body's sweep inside the locked beat (lock 0.35-0.5 and sweep cos 0.5-0.8 all tried); a dash gets out at any frame. Making a walk-out possible would mean a faster sideways step while a swing is locked on you, or a longer locked beat.
  • mythicMasters.state().fighters[n].swing is tracking, locked or null: cue a shot on a locked swing with it.
  • The BEFORE shots must come from main with no edits in the tree: burst-shots.ts serves the working tree through Vite, so a mid-run edit leaks into BEFORE.

Activity

  1. self-assigned this
    on Nov 9, 2026
  2. QuinnsCode commented on Nov 9, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 3.75/10 (target 7)

    Round 5, PR #4147. A fresh judge scored BEFORE (main) 4.5/10 and NOW 5.5/10, so on the halved scale the climb goes from 3.25 to 3.75.

    The change: the dodge burst retries until the defender dashes out of the locked swing (three of four fights caught one), and no burst shoots a finished fight. A blow sits the struck body into its legs for the whole stun, the stagger lasts about 0.4 s, and a big hit's glow is smaller and shorter. Only drawing and tooling changed, so the sim and balance.json are untouched.

    In the judge's words, NOW shows "defenders leaving": Rougarou dashes out with a dust ring in now-bruiser-dodge-b1, and the punish lands in b5. Hits read harder (now-tank-hit-b0, now-bruiser-hit-b3).

    Shots: apps/mythic-masters/docs/shots-2026-11-09-combat-r5/ (before-*, now-*) on the PR branch.

    The judge's next gaps, in order:

    1. Fighters stand square-on, flat-footed, one body-length apart: now-bruiser-dodge-b2..b4, now-flyer-windup-b2/b3, now-tank-hit-b1/b2. No frame shows a sideways or orbiting step.
    2. The struck body still recovers too fast: in now-tank-dodge-b1..b3 the Yeti flashes, then stands upright a frame later. There is no camera shove in any hit burst.
    3. Telegraphs are uneven: there is no cone in now-skirmisher-windup, and the Hodag stays in the cone and gets hit in now-tank-windup-b2/b3.

    Next: the orbit. Fighters waiting between swings should circle sideways on the ring instead of standing square. This is a bot change in src/bot.ts and sim-rs, followed by a re-fit.

    Carried over from #4046.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions