DKC2Recomp v0.0.5 - macOS + Windows
You must supply your own Donkey Kong Country 2 ROM (USA v1.0, 4 MiB,
SHA-256 35421a9a…). No ROM data is included or distributed here.
Full-game validation
The full game has been tested from start to finish and is working well across
all levels.
Native builds are included for:
- Windows x64 — extract the complete ZIP and run
DKC2Recomp.exe. This
uses the full SDL2/OpenGL display path, including 16:10 and the experimental
Reconstruct upscaler with dither decoding. - macOS arm64 — macOS 26, ad-hoc signed, and not notarized. Control-click
the app and choose Open if Gatekeeper blocks the first launch.
What changed since v0.0.4
Game logic
- Enemies whose behaviour script switches on touch damage no longer freeze at
that point. The sprite sub-state dispatcher indexes a 16-slot table with two
null slots after its first six handlers and a repeat of them for that flag;
the recompiler had cut the table to six, so such objects took an
out-of-bounds path and their scripts never stepped again. Seen as Screech's
Sprint's Kloak hanging idle instead of throwing its TNT barrel; every enemy
that uses the flag is affected.
Stages that now present in widescreen
- Arctic Abyss, Castle Crush, Toxic Tower, and the K. Rool Duel arena. Their
scroll handlers were not classified, so they fell back to a bounded 4:3
screen with black bars. - Level-name cards are presented as bounded screens between black margins.
Level-wall presentation
- Continued walls now show what the level map places beside them instead of a
copy of the wall's edge column, which repeated features such as a mine's
panel of red lamps once per margin column. - The glide slides the frame at a hold the level map reveals, not only at the
map's first page: where the player is pinned at the authored world's edge
with nothing beyond it (Screech's Sprint's start), the frame slides so the
void never shows, and the bias moves at most one pixel per frame so a hold
that comes and goes never jolts the picture. - A wall standing on a floor that continues past it is continued; a walled
void run beside a held wall is continued; the proving row of a wall must be
two metatiles thick.
Fixes in specific stages
- Toxic Tower: the backdrop no longer shows through the castle wall in
flickering patches (plane cells are judged by character transparency, and a
band whose rows hold a strip that stops short of the wrap repeats the ring),
and a one-frame flash of repeated ring columns while riding Rattly is gone
(the terrain phase follows the frame's dominant scroll when nothing is at
the camera phase). - Red-Hot Ride and Hot-Head Hop: foreground rocks and far spikes are presented
as static plane bands; steam columns no longer appear over solid rock beside
the view. - Bramble Blast, Bramble Scramble, Slime Climb, Barrel Bayou's intro, Haunted
Hall's Kackle, Parrot Chute Panic's lower half, the ship hold's water
surface, the vertical ship's mast, and the Gangplank Galleon rigging each
received a margin fix; objects no longer vanish from a margin while still on
screen, and sprites are no longer cut at the right edge near a level's left
wall.
Experimental
- A Reconstruct upscaler for high-density displays, off by default.
Diagnostics
- The headless runner can replay the desktop app's rewind and fast-forward,
reload a savestate at chosen frames, print the prefill's metatile fill map
with ids, dump every scanline band's scrolls and policies, and print an
object's record each frame; the trace reports the window and colour math
registers and a chained-continuation count.
Validation
macOS: 50 of 50 CTest checks including the hidden app smoke runs, a
44-state Quick Save corpus at 16:9 and 16:10 with every native center
pixel-exact and no failures, and deep strict signature verification of the
packaged app.
Windows: all 58 test cases passed under their required preconditions (57
application/runtime tests together, plus the packaging test with its expected
dirty-tree fixture). The uploaded ZIP was then extracted fresh and its packaged
executable completed a hidden 180-frame SDL2/OpenGL run at 16:10 with
Reconstruct and dither decoding before exiting cleanly.
macOS build refreshed on 2026-09-03
The Mac archive on this release was rebuilt from commit 63ed6e4. The Windows
archive is the original v0.0.5 build and does not include these changes.
Frame pacing
- The Mac app now paces each frame on the display's own refresh instead of a
free-running clock. The window's display link delivers refresh ticks at a
requested 60 Hz, so a ProMotion panel ticks at 60 rather than 120, and each
frame is presented right after its tick, on the same refresh phase every
time. Measured during scrolling gameplay on a ProMotion MacBook Pro, the
earlier clock dropped or doubled a frame about twice a second while the FPS
counter read 60; the display lock shows every frame for exactly one
refresh.DKC2_DISPLAY_LOCK=0keeps the old clock. - Audio keeps step with the display through dynamic rate control within half
a percent of unity, and the audio device buffer is 32 ms instead of 64. DKC2_PACING_LOG=<file>records the cadence and
scripts/analyze_pacing_log.pysummarises it.
Save tool
scripts/dkc2_unlock_levels.pymarks every level of a save file as
cleared, can open the Lost World (--lost-worldmarks Klubba's kiosks as
paid and the five Lost World levels as beaten, which opens Krocodile Kore),
sets Kremkoins (--kremkoins), and sets Banana Coins in a quick save
(--banana-coins; the game does not store them in the file). It backs each
file up beside itself and can repair a file the game shows as empty.
Validation of the refreshed Mac build: 53 of 53 CTest checks including
the hidden app smoke runs; the display-locked cadence was measured on a
loaded gameplay state with every frame shown for one refresh; the packaged
app passes deep strict signature verification and its extracted executable
hashes identically to the built one.