Atomic Bomberman demo

The registry has one Atomic Bomberman, the June 1997 public demo (atomic_bomberman_june_demo, below). The April 1997 alpha described first was dropped on 2026-09-22: it needed its expiry patched out of the binary (lib/app-profiles.js, 0x416e42), and the June build does everything it did plus network play. Its notes stay for anyone who digs it out again.

April 1997 alpha (no longer registered)

The tested April 7, 1997 alpha is the ready-to-run BMANDEMO tree from the local Windows 98 A-D compatibility archive documented in sources.md. That selected package contains no setup program, cabinet, or self-extractor, so launching _BOMB.EXE does not bypass an available installer. The package and all gameplay files stay local and gitignored.

Pinned SHA-256 values:

The bundled readme describes the release as unsupported and says all rights are reserved. It grants no redistribution permission, so neither the loose tree nor the executable belongs in a public deployment.

Gameplay route

Written against the April alpha; the test now drives the June demo. test/test-atomic-bomberman-gameplay.js launches the registered browser app in headless Chromium. It waits for each publisher logo to render, skips it, and synchronizes on the title, main menu, input selection, options, and arena frames. Four Enter presses select Start Regular Game, keyboard input, the default level options, and the match.

The acceptance then holds Right, presses Space, and captures the arena before movement, after movement, with a placed bomb, and during its explosion. It requires the game to remain live, rejects browser/runtime compatibility failures, and checks rich arena pixels, visible movement, bomb placement, and explosion colors. Captures are written to build/local-candidate-smoke/atomic-bomberman/.

Run explicitly with:

node test/test-atomic-bomberman-gameplay.js

June 1997 public demo (atomic_bomberman_june_demo)

archive.org item BOMBDEMO (ATOMDEMO.zip) is the public demo, "SECOND Alpha Release - 06/02/97": BM95DEMO.EXE, 25 MB installed. It is an InstallShield 3 setup; node tools/install-atomic-bomberman-demo.js fetches the zip (or takes --zip=), checks its SHA-256, and extracts DATA.Z with tools/is3-extract.js into test/binaries/win98-games-a-d/Atomic Bomberman Demo-archive/installed/ (gitignored). Its licence allows personal copies only, so it stays local.

It is a Watcom build (sections BEGTEXT/DGROUP, so --section=.text finds nothing) with rdtsc profiling hooks around every function; a function entry is the inc [counter] after the previous ret, not a push ebp.

On a present-day calendar it draws "Software expired. Contact Interplay." over the game. The registry's wallClock: '1997-07-01T12:00:00Z' fixes it: test/run.js pins the calendar there (deterministic, like --wall-clock-ms), and the browser moves the real clock back a whole number of days, keeping the real time of day. Pinning an instant in the browser would break network play: the node id below is rand() seeded by srand(time()) (0x4091b8), so two players pinned to one second draw the same id.

Network play (IPX)

Menu: Start Game / Start Network Game / Join Network Game / Options / ... The socket opens only when a network item is picked, which is why the registry lan block is onDemand.

Calls: socket(AF_IPX=6, SOCK_DGRAM, 1000), bind (14-byte SOCKADDR_IPX), getsockname, SO_REUSEADDR + SO_BROADCAST, FIONBIO, then polling: ioctlsocket(FIONREAD) and, when nonzero, recvfrom(len 0x206). Everything goes to socket 0x6446 (25670), the server's announcements to node FF×6. src/09d-winsock.wat maps it onto room UDP: node 00 00 a b c d is the room address, the socket number is the port.

Packet (after the ring header [seq u32][len u16]): +0 version 0x5344 ("Network Packet Version: 21316"), +2 length, +4 sender node id, +8 message type (the handler is call [0x44db60 + type*4], 0x407823), +0xc target node id. Types seen: 0x44 server announce (59 B, carries the node name from NODENAME.INI), 0x03 join request (61 B), 0x47 join reply (20 B).

Headless two-process route (lockstep, one batch per round; a 10-batch round is longer than the join's 1000 ms, which is 5 batches at the default clock, so the reply always lands too late):