Skip to content

Mythic Masters: combat feel hill climb to 7/10, rounds 4+ (from #3511) #3688

Closed

Description

@QuinnsCode

Carries the climb on from #3511 (round 3), which carried it from #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

Scores are on the owner's halved scale since 2026-11-05: each round adds half the judge's gain. Now at 3/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-56%). 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 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 5, 2026
  2. QuinnsCode commented on Nov 5, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 3/10 (target 7)

    Round 3, PR #3687. A fresh judge scored BEFORE (main) 4/10 and NOW 4.5/10, so on the halved scale the climb goes from 2.75 to 3. Its words: "Wind-ups read better: lunge plus motion trails plus wedge ... hits land clearly with a shockwave ring and launch."

    The change: a bot inside a locked heavy swing's sweep dashes out far more often (each tick, skirmisher 0.3, flyer 0.25, bruiser 0.2, tank 0.05). After a dodge, once the whiff is recovering, it comes straight back in and swings: a heavy if that lands before the swinger recovers, else a light. The Rust copy (sim-rs) matches it and sim.wasm is rebuilt: 24 fights, every hash the same as sim.ts. balance.json was re-fit and every creature is at 44-57%.

    Measured over 160 fights a side on the four shot pairings, for every heavy swing that locks with the other fighter in its sweep:

    main now
    Defender dashes out 21% 39%
    Swing lands 71% 61%
    Whiff punished in its recovery 2% 15%

    Shots: apps/mythic-masters/docs/shots-2026-11-05-combat-r3/ (before-*, now-*) on the PR branch. burst-shots.ts --combat now adds a six-frame dodge burst, cued on a locked swing near the other fighter.

    The judge's next gaps, in order:

    1. No one is seen getting out of a telegraphed swing. In now-tank-dodge-b0..b5 the Hodag lies flat, and in now-bruiser-dodge-b0/b1 the Sasquatch takes the hit at once. The sim dodges 39% of the time, but the shots don't catch it: the cue fires on any locked swing, including one on a fighter already down or mid-swing. Also, now-skirmisher-dodge and -hit are both the result page, because that fight ended before those bursts.
    2. Between exchanges the fighters stand square and still, a body length apart, with no footwork (now-bruiser-hit-b2, now-tank-dodge-b2..b4).
    3. Hits are lit up but don't feel heavy: the struck body flashes see-through and floats back, the attacker doesn't squat into the blow, and both are idle again within about 0.4 s (now-bruiser-hit-b0..b3).

    Next: make the dodge show. Cue the dodge burst only on a locked swing whose target is free (not stunned, not attacking), and cut a burst short if the fight ends. Then raise how often a free defender gets out: most of the 61% that still land are on fighters busy with their own swing, so they need a reason not to swing into a locked wedge. Then footwork between exchanges.

  3. QuinnsCode commented on Nov 6, 2026

    @QuinnsCode
    OwnerAuthor

    Phase done: #2945 (the orbit-and-commit umbrella) triaged. Its four areas are in #2959 and its feel goal is this climb's. Its owner checks stay as #2964 and #2947.

  4. QuinnsCode commented on Nov 6, 2026

    @QuinnsCode
    OwnerAuthor

    Phase done: #2953 (before/after shots and a feel check for the weighty attacks of #2950, which landed through #2959). This climb's per-round fight shots and its closing MANUAL RUN cover it.

  5. QuinnsCode commented on Nov 6, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 3/10 (target 7)

    Round 4, step 1, PR #3856 (tooling only, so the score holds). The dodge burst now waits for a locked heavy swing within reach of a free fighter, and every burst stops at the fight's end, so no more result-page shots. Bruiser and flyer dodge bursts were cued; in the bruiser's, the Sasquatch is outside the Rougarou's locked wedge and then back in to punish (docs/shots-2026-11-06-combat/).

    Next: raise how often a free defender gets out of a locked wedge, and give a fighter busy with its own swing a reason not to swing into one (bot.ts and sim-rs, then a balance.json re-fit). Then footwork between exchanges.

  6. QuinnsCode commented on Nov 9, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 3.25/10 (target 7)

    Round 4, step 2, PR #4044. A fresh judge scored BEFORE (main) 4/10 and NOW 4.5/10, so on the halved scale the climb goes from 3 to 3.25. In the judge's words: "NOW fighters fight at closer range and stay engaged", while BEFORE's hit bursts end "two bodies apart, doing nothing" (before-bruiser-hit-b0..b3, before-skirmisher-dodge-b0..b5). In now-tank-dodge-b0..b2, the Yeti hits the Hodag inside the locked wind-up and steps away.

    The change: most of the locked swings that landed on a busy defender were same-tick trades. Two heavies stepping in on a commit cross the striking distance together, and both swing. Now a heavy that sees the other closing in and facing it holds its swing half the time and backs out past the other's heavy sweep, with its punish armed for the whiff's recovery. sim-rs matches, sim.wasm is rebuilt (24 fights hash for hash), and balance.json is re-fit (44-57%; main had five tanks at 36-39%).

    Over 80 fights a side on the four shot pairings, for every heavy swing that locks with the other fighter in its sweep:

    main now
    Defender pressed its own swing the same tick 1,670 of 5,656 525 of 6,662
    Defender free at the lock 30% 40%
    Defender dashes out 36% 49%
    Swing lands 55% 51%

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

    The judge's next gaps, in order:

    1. Defenders are still seen taking the telegraphed heavy: in now-bruiser-dodge-b1 (Sasquatch 17% to 40%), now-flyer-dodge-b3 and now-skirmisher-dodge-b4, the struck fighter is inside the locked cone. No burst shows a defender leaving the cone and punishing a whiff.
    2. Hits barely show on the body: one red-tinted frame, then both fighters stand upright face to face (now-bruiser-hit-b0..b3, now-skirmisher-hit-b1..b3), and the tank's hit flash is an overexposed blob that hides both (now-tank-hit-b1..b3).
    3. Wind-ups are hard to read: no chamber or lean (now-bruiser-windup-b0/b2, now-flyer-windup-b0..b3), faint cones, and no cone at all in now-skirmisher-dodge.

    Next: make the dodge show. The sim dashes out 49% of the time, but no burst catches one: cue the dodge burst on a locked swing whose defender dashes within the beat (or shoot two and keep the one with a dash), and check that the punish after it reads. Then hit weight on the struck body (squat, stagger, a shorter flash).

  7. QuinnsCode commented on Nov 9, 2026

    @QuinnsCode
    OwnerAuthor

    Moved up to #4046

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions