DEV Community

Nivando Soares
Nivando Soares

Posted on

Porting Test Drive II from SNES to PC, Part 45: Fingerprinting the current track-start gameplay seed

Porting Test Drive II from SNES to PC, Part 45: Fingerprinting the current track-start gameplay seed

I stopped spending CPU on the tiny post-02:9016 blink in the corner and
went back to a larger gameplay-facing question:

what does the current track-start savestate actually do under A, B, and
A+B?

That turned out to be a better checkpoint than expected, because the answer is
not just “which button accelerates.”

It also exposed that the current game_11.mss seed has drifted from older
promoted sweep results, so the pipeline now fingerprints the ROM and savestate
directly in the sweep summary.

The sweep is now seed-aware

tools/run_track1_seed_sweep.py now records:

  • ROM SHA-256
  • savestate SHA-256
  • capture config

That matters here because the current fingerprinted seed:

  • ROM SHA-256: 53e1a9e17a8b0cffd24946e61a47a6f21e7d85ba32b9436da8705b5e53b1f017
  • savestate SHA-256: 17f2857d3309ad99fc87724d131f9b1e7965c1fb5a530f739dedda9f51086b14

does not reproduce the older promoted b_hold sequence anymore.

The cross-generation compare already differs from capture 0.

So this is not a tiny timing tweak.

It is a changed seed, and the tooling now says so explicitly.

A and B are the same early lane on the current seed

On the current fingerprinted seed:

  • a_hold: dynamic, first nontrivial frame 62, next motion 64
  • b_hold: dynamic, first nontrivial frame 62, next motion 64
  • a_and_b_hold: dynamic, first nontrivial frame 62, next motion 64

The important part is stronger than “all three move.”

a_hold and b_hold are pixel-identical across all 300 captured frames.

So the current track-start lane should no longer treat b = true as the only
defensible early-gameplay proxy.

The first useful branch is A vs A+B at frame 219

A+B does not stay redundant forever.

It matches the shared A/B lane through frame 218 and then breaks away at
frame 219.

A at frame 219:

A hold frame 219

A+B at frame 219:

A+B hold frame 219

That first branch is already large enough to matter:

  • first divergence: capture 159, script frame 219
  • mismatch pixels: 2085
  • bbox: [99, 75, 153, 113]

That is a much better target than the tiny rearview blink window, because it
already points at a gameplay-facing subsystem change rather than a one-corner
OAM cue.

What changes next

The next gameplay lane is no longer “keep poking the old 76/92/108
cadence.”

It is:

  • treat the current seed as fingerprinted evidence
  • use A or B as equivalent early moving lanes
  • use the first A vs A+B branch at frame 219 as the next ownership target

That should give a better handle on live gameplay state than the blink chase
was giving.

Top comments (0)