Rodent's Revenge 2000 (VB6 remake)
test/binaries/wep32-community/Rodent2000/Rodent2000.exe — James Emmrich and
Alexander Popov, 2002. App id rodent2000; the app manifest mounts the five
shipped Levels/0000*.rodent_level files at C:\levels\.
Reaching gameplay headlessly
The credits splash appears first. Open Game > New Game to deal the board:
node test/run.js --app=rodent2000 --max-batches=4300 --batch-size=2000 \
--quiet-api --quiet-blocks --trace-fs \
--input='2500:mousedown:155:38,2501:mouseup:155:38,\
2700:mousedown:165:58,2701:mouseup:165:58,\
4000:png:/tmp/rodent2000-game.png,4100:stop'
At 640x480, 155,38 opens Game and 165,58 selects New Game. A healthy frame
has the cyan border, olive floor, dense green block field, mouse, cats, and
score. test/test-rodent2000-gameplay.js checks those board colors and proves
all five numbered level files were read.
Startup failure and fix (2026-08-30)
Before the fix, VB6 caught a failed embedded-picture decode and displayed
Unexpected error; no level files were opened. Tracing OLEAUT32 from
OleLoadPictureEx through its picture helper reached this call:
CreateIcon(instance, 32, 32, 0x00200001, 0x20, andBits, xorBits)
The apparent plane count is an ABI artifact. Win32 declares cPlanes and
cBitsPixel as BYTE. This Win9x OLEAUT32 build loads adjacent BITMAP WORD
fields with an overlapping dword read, but native USER32 consumes only the low
byte of each argument. The WAT handler had treated the entire 32-bit stack slot
as the plane count, tried to allocate a bitmap with 2,097,153 planes, returned
NULL, and OLEAUT32 translated that into E_OUTOFMEMORY (0x8007000e).
$handle_CreateIcon now masks both BYTE arguments before validating or creating
the color bitmap. test/test-cursor-icon-indirect.js passes deliberately dirty
high bits (0x00200001 planes and 0x5a000020 depth) and requires a valid
32-bpp icon, matching the real OLEAUT32 call rather than a sanitized surrogate.
The initial black page is the remake's authored credits screen, not a failed
board render. Its blank visible caption was separate: VB6 sends WM_SETTEXT
through DefWindowProcA on the Thunder form, and the default procedure did not
yet implement that message. It now stores, paints, and mirrors the caption;
the gameplay test requires Rodent's Revenge 2000 (or its active Level suffix)
on the visible form before accepting the dealt board.
Browser Worker keyboard routing (fixed 2026-08-30)
When the Worker has no live child focus, keyboard messages now fall back to the
front visible top-level owned by that guest instead of hwnd 0. The browser
regression opens Game > New Game through the real menu, holds Right, and checks
the rendered board rather than accepting key logs alone. The verified run
changed 893 pixels and retained the complete Rodent's Revenge 2000 - Level 1
frame: caption/menu, lives and score strip, cyan border, olive floor, green
blocks, mouse and cats were all visually inspected.