Skip to content

DKC2Recomp v0.0.5 - macOS + Windows

Choose a tag to compare

@elliotttate elliotttate released this 03 Sep 17:26
· 5 commits to main since this release

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=0 keeps 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.py summarises it.

Save tool

  • scripts/dkc2_unlock_levels.py marks every level of a save file as
    cleared, can open the Lost World (--lost-world marks 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.