Jardinains! v1.2

Jardinains! 1.2 is a Win32 Blitz/DirectDraw Breakout-style shareware game. The original author still links the Windows 1.2 installer from the Jardinains 2 downloads page. Wine-Assembly runs that unchanged installer and launches the files it writes; no host-side archive extraction is part of the workflow.

Original package

The installed manual describes the game as fully functional shareware and free to play indefinitely. Its copyright notice separately prohibits redistribution or reproduction without the author's written consent. The installer and its output therefore remain local and gitignored. The Sources page links to the original distribution instead of republishing either one.

Installer result

The native installer writes 115 files, including 30 original levels, under C:\Program Files\Jardinains!. The local playable fixture is copied only from that guest-produced VFS tree into:

test/binaries/candidates/jardinains/installed/

The ignored .wine-assembly-browser.json beside the installed executable maps that exact tree to C:\. The jardinains app launches it; the separate jardinains_installer app continues to launch the original setup program.

DirectDraw failure

The first working installer run opened a black game window with only the native player-name overlay visible. The application creates temporary DDSCAPS_SYSTEMMEMORY surfaces with both DDSD_LPSURFACE and DDSD_PITCH. Their pixel pointers refer directly to decoded FreeImage/Blitz ARGB rows.

Wine-Assembly previously discarded lpSurface, allocated a new DIB, and zeroed it. Every image conversion therefore read black pixels. DirectDraw now aliases caller-owned system-memory pixels, preserves their pitch, excludes them from DIB/video-memory accounting, and does not clear or free them.

Blitz also probes a primary surface for an attached DDSCAPS_TEXTURE|DDSCAPS_MIPMAP child. GetAttachedSurface used to return the unrelated back buffer regardless of requested caps. It now returns an attachment only when all requested capability bits match.

Gameplay gate

Jardinains polls DirectInput mouse state. A synthetic down/up in one batch is not enough, and setting an absolute click point does not create the relative motion its menu cursor consumes. The gate therefore moves first, holds the button over New Game, releases it, repeats for Easy, and advances into Level 1. Once the field is live it moves the paddle and holds another click to launch the ball, then compares two rendered frames.

bash tools/build.sh
node test/test-jardinains-candidate.js

The test uses --control-stdin --frozen and the CLI's own --max-seconds guard. It does not wrap the emulator in an external signal timeout. The verified exact-payload frame is /private/tmp/jardinains-level-final.png.