Introduction
Nobody:
Absolutely nobody:
me: Here's a TAS for NES Tennis
Yeah, so I wanted to do something different from all the movies I've been working on. I was curious to see how a bot can exploit a game so simple as NES Tennis, and indeed some exploits were found. In particular, movements can affect RNG such that serving can always be manipulated to be aces, and returns can always cause the opponent to either let the ball pass or make an unforced error.
I choose level 5 of difficulty. Here the game makes you beat a (normally) relentless CPU opponent twice on a best-of-3 set match. Repetitive yes, perhaps even boring. But I had a blast working on it.
Objectives
- Hardest Difficulty
- Heavy luck manipulation
Software + Hardware
- Name: Tennis (JU) [!]
- SHA1: 80D99C035E6A5AB9718E413EC25CBE094F085962
- MD5: 32FB31AE20F0D01BC74BAAD9F3A9672B
Emulator
- EmuHawk 2.8.0 (Core: QuickNES)
I tried resyncing to the NesHawk core, but immediate desyncs happened. I believe this is due to the way RNG is managed in this game. I identified the value range [0x500 - 0x503], which seems to diverge depending on the emulator. I estimate that this is an RNG value that is updated with PPU/CPU timing, leading to desync.
With a RAM transplant at frame 128 (127 and before fails -- this is exactly at the moment of serving) from QuickNES to Bizhawk, it is possible to replicate the opponent mistakes also in BizHawk More research would be worth doing here, but this is as far as I took it.
Routing Bot
- Bot: Jaffar
- Routing Core: QuickNES
- Platform 1: AMD Ryzen Threadripper 3990X Processor (64 cores, 128 threads) + 256Gb RAM (Average Exploration Performance: 1.4M States/s)
feos: Claiming for judging.
feos: Great run, reaches an ending, accepting.