diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 8e1ebba..a2e54b0 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.51.0" + ".": "1.52.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a8f30e2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,85 @@ +# Changelog + +## [1.52.0](https://github.com/pythoninthegrasses/jumpnbump/compare/v1.51.0...v1.52.0) (2026-09-23) + + +### Features + +* **abi:** implement core/abi.zig as the sole jnb_ ABI exporter (TASK-012.02) ([5638954](https://github.com/pythoninthegrasses/jumpnbump/commit/56389540fce92f2fafd6a427cc9938bf47d40ee4)) +* **abi:** write include/jumpnbump.h with frozen-ABI discipline (TASK-012.01) ([1a3d48b](https://github.com/pythoninthegrasses/jumpnbump/commit/1a3d48b8b9bd956c5cf777c18766817fceabc692)) +* **abi:** write the ABI conformance test suite (TASK-012.03) ([b5ffe22](https://github.com/pythoninthegrasses/jumpnbump/commit/b5ffe2240edacbc2c65c51c323d0edc4f25eaa12)) +* **assets:** build the audio pipeline (TASK-013.03) ([277b9a1](https://github.com/pythoninthegrasses/jumpnbump/commit/277b9a142fe2064bfb03cbd66abad0c18d09d3b8)) +* **assets:** build the level layer pipeline (TASK-013.02) ([1808325](https://github.com/pythoninthegrasses/jumpnbump/commit/1808325ffedd928cafd5727243156a5358675032)) +* **assets:** build the sprite atlas pipeline (TASK-013.01) ([52a541a](https://github.com/pythoninthegrasses/jumpnbump/commit/52a541af2f551644772ec06e62d55a5d0aaeff62)) +* **build:** add `task run` to build and launch the Godot game end-to-end ([9bc51c8](https://github.com/pythoninthegrasses/jumpnbump/commit/9bc51c8d941a5e5b17a2e90f3b6f665d577c79fa)) +* **build:** add task submodules/deps meta task, add summary blocks ([fbf0cfc](https://github.com/pythoninthegrasses/jumpnbump/commit/fbf0cfc30223472a47f22ba305006cbb2910b643)) +* **build:** port legacy Makefile build graph to Task ([8c96a94](https://github.com/pythoninthegrasses/jumpnbump/commit/8c96a94c5b49e64da76c8191d317cc949bd23f12)) +* **build:** retire the SDL runtime path from the default check gate (TASK-015.05) ([7a2f779](https://github.com/pythoninthegrasses/jumpnbump/commit/7a2f7792669993d03db3f63fa536b33d6a7f26ce)) +* **build:** wire every _install-* task into the deps meta task ([90e6f6c](https://github.com/pythoninthegrasses/jumpnbump/commit/90e6f6ce2d2f753ac2725216b6f062f9c1e6f7dc)) +* **build:** wrap the GDExtension shim's compiler in ccache when available ([9111c27](https://github.com/pythoninthegrasses/jumpnbump/commit/9111c278d1589b98e63b5640f4cdeea07d7e9879)) +* **ci:** add release-please and release automation, pin act via mise ([c6abc67](https://github.com/pythoninthegrasses/jumpnbump/commit/c6abc673a2d7a2ba77c774a9d2323ce41ba5cd24)) +* **core,extension,game:** add runtime Zig ProTracker .mod player for custom-level music ([1c4c89e](https://github.com/pythoninthegrasses/jumpnbump/commit/1c4c89eb30c2d57f2ddfab5172c4489d2e47d300)) +* **core,extension:** add runtime .dat asset decoding (TASK-016.01) ([dd1f83d](https://github.com/pythoninthegrasses/jumpnbump/commit/dd1f83d8529d18b4fc410576df49f716d7497575)) +* **core:** add Tier-B differential-test harness to build.zig (TASK-008.04) ([50cf408](https://github.com/pythoninthegrasses/jumpnbump/commit/50cf408400092538b73eb70233ed95a4289dbc5d)) +* **core:** close the core-purity gap the boundary check found (TASK-011.08) ([8a4dceb](https://github.com/pythoninthegrasses/jumpnbump/commit/8a4dcebbb2622bf1584987e3c850d2463202e4cc)) +* **core:** extract fireworks.c into a renamed-C differential reference ([0fd6db2](https://github.com/pythoninthegrasses/jumpnbump/commit/0fd6db2b12651f11f931dd1f8c7d4edec539d6d6)) +* **core:** port .dat archive reader/writer to Zig (TASK-010.01) ([790b177](https://github.com/pythoninthegrasses/jumpnbump/commit/790b17744825d8b5cc63fe977e24ff6572490f6c)) +* **core:** port .gob sprite format reader/writer to Zig (TASK-010.02) ([340ba5c](https://github.com/pythoninthegrasses/jumpnbump/commit/340ba5c559906cc0d95eac953bfdd7a91ec2e670)) +* **core:** port 8-bit PCX reader/writer to Zig (TASK-010.03) ([25c4263](https://github.com/pythoninthegrasses/jumpnbump/commit/25c426368972ea1539e6aed40b9356ce8a7c8481)) +* **core:** port add_object/update_objects particle system to Zig (TASK-011.04) ([bdbfe92](https://github.com/pythoninthegrasses/jumpnbump/commit/bdbfe928758e694a7b13c6ef277b27412973024c)) +* **core:** port collision_check/player_kill/bump scoring to Zig (TASK-011.03) ([3ea81f5](https://github.com/pythoninthegrasses/jumpnbump/commit/3ea81f5b6ad2555f7af018b876749155c084bdb1)) +* **core:** port cpu_move bunny AI to Zig (TASK-011.05) ([5e31d04](https://github.com/pythoninthegrasses/jumpnbump/commit/5e31d048f21f54fc43b62928fb35f14e298c6656)) +* **core:** port fireworks.c screensaver mode to Zig ([0a2da60](https://github.com/pythoninthegrasses/jumpnbump/commit/0a2da60a3873a2a6df5f0111329412cd3136557a)) +* **core:** port game_loop into step()/pump() with an event stream (TASK-011.07) ([c48882d](https://github.com/pythoninthegrasses/jumpnbump/commit/c48882d459c636ef9e772247b8ad796e1cb754c5)) +* **core:** port levelmap.txt parser to Zig (TASK-010.04) ([879da75](https://github.com/pythoninthegrasses/jumpnbump/commit/879da75488836294aa405f8e618cef8c87e3b7d7)) +* **core:** port rnd()/fixed-point/world layout to Zig (TASK-011.01) ([#3](https://github.com/pythoninthegrasses/jumpnbump/issues/3)) ([03dbd96](https://github.com/pythoninthegrasses/jumpnbump/commit/03dbd96e7c2786444250fdb05e76508e836e1633)) +* **core:** port steer_players/position_player physics to Zig (TASK-011.02) ([1b9b4d1](https://github.com/pythoninthegrasses/jumpnbump/commit/1b9b4d1419adec8af068bbd426193660f10cdba2)) +* **core:** port update_flies fly swarm to Zig (TASK-011.06) ([eb75ce1](https://github.com/pythoninthegrasses/jumpnbump/commit/eb75ce11d1f14cbcc8ae24babcc0d65d2ef91600)) +* **core:** rebuild jnbpack/jnbunpack/gobpack as Zig CLIs (TASK-010.05) ([980f70b](https://github.com/pythoninthegrasses/jumpnbump/commit/980f70b25e925bf8473bb9c81e378f5bb146e590)) +* **extension:** add build-macos task for template_release GDExtension ([1c9d3a9](https://github.com/pythoninthegrasses/jumpnbump/commit/1c9d3a942198e615fa21e2ac22629a08f3630386)) +* **extension:** build the godot-cpp GDExtension shim (TASK-012.04) ([53006ed](https://github.com/pythoninthegrasses/jumpnbump/commit/53006edc52e106ca02830bf3934e34b9076667cb)) +* **extension:** package the macOS arm64 framework bundle and .gdextension file (TASK-012.05) ([b8b51c2](https://github.com/pythoninthegrasses/jumpnbump/commit/b8b51c2016c3c298ac5e694946a3dd186a951e0a)) +* **game:** add app icon cropped from the rabbit sprite atlas ([6c2c230](https://github.com/pythoninthegrasses/jumpnbump/commit/6c2c230cadd6fe19c9b555de8706aaaeb126e63c)) +* **game:** add headless import task for the release export pipeline ([74005db](https://github.com/pythoninthegrasses/jumpnbump/commit/74005db0a75e3eed718c21899ef33a3f3ccce1f2)) +* **game:** add in-game custom level picker with drag-and-drop and validation ([ec7ce38](https://github.com/pythoninthegrasses/jumpnbump/commit/ec7ce38b79fd4340a65c81746b2a50834e30e57b)) +* **game:** add persisted settings for sound/music/gore/flies/mirror/player count (TASK-015.03) ([d141a18](https://github.com/pythoninthegrasses/jumpnbump/commit/d141a18541321b6bb59d951f6489a5f0954751ba)) +* **game:** bootstrap gdUnit4 and attempt Phase 1 corpus replay through the real GDExtension (TASK-014.07) ([78dbc3d](https://github.com/pythoninthegrasses/jumpnbump/commit/78dbc3dcf9f8757bdb33899ba89756b6608ed099)) +* **game:** build InputRouter for 4 local players with remapping (TASK-015.01) ([caf4deb](https://github.com/pythoninthegrasses/jumpnbump/commit/caf4deb8bebb2a1f422d9293e69ad4be4e1a49fa)) +* **game:** build level layers with integer scaling and letterboxing (TASK-014.04) ([2b82c4c](https://github.com/pythoninthegrasses/jumpnbump/commit/2b82c4cbc449daf5a54aaf1b5b31c07aa0aac6ff)) +* **game:** build the scoreboard from font/number atlases (TASK-014.05) ([97a6100](https://github.com/pythoninthegrasses/jumpnbump/commit/97a610035b0fd884ca0dcbbbc1d3f77e46a87fb1)) +* **game:** build the sprite renderer for rabbits, objects, flies, and gore (TASK-014.03) ([d78f976](https://github.com/pythoninthegrasses/jumpnbump/commit/d78f9764b40f0d5775a70321f1293a02bb4ac41a)) +* **game:** build TickDriver and SimWorld wrapper over jnb_pump (TASK-014.02) ([fd16dcf](https://github.com/pythoninthegrasses/jumpnbump/commit/fd16dcfbe656e76b47e2834b2a179ece40bda0a4)) +* **game:** complete the title-to-scores match flow with pause and clean quit (TASK-015.04) ([c0d56ce](https://github.com/pythoninthegrasses/jumpnbump/commit/c0d56ceef95afe2a966793c1545bde009cc1f64d)) +* **game:** port the pixel menu to Godot Control nodes (TASK-015.02) ([377e871](https://github.com/pythoninthegrasses/jumpnbump/commit/377e8714f6c4fc7b233f4747b1c28555b29f4ed4)) +* **game:** scaffold Godot project skeleton with four-layer boundary (TASK-014.01) ([ba1dd9e](https://github.com/pythoninthegrasses/jumpnbump/commit/ba1dd9e13e3c51370f02284cfe98025b945f0778)) +* **game:** wire up audio buses, players, and the event coalescer (TASK-014.06) ([949036a](https://github.com/pythoninthegrasses/jumpnbump/commit/949036af0a916f94765addd1bba7aca64a135a21)) +* **headless:** add deterministic headless mode to the C build (TASK-008.01) ([42a8ea5](https://github.com/pythoninthegrasses/jumpnbump/commit/42a8ea593ba69c795afcd764c29b81a7511ecf40)) +* **headless:** add multiplayer/AI support and record checksummed corpus (TASK-008.03) ([8eb61d1](https://github.com/pythoninthegrasses/jumpnbump/commit/8eb61d1b637b20760b93d16bc95b61d689bfa931)) +* **headless:** add per-frame canonical-state checksum (TASK-008.02) ([1e38b99](https://github.com/pythoninthegrasses/jumpnbump/commit/1e38b99d4f7c611574421e8f76700f549e285190)) +* **release:** add macOS export, codesign, notarize, and DMG pipeline ([1c20a1e](https://github.com/pythoninthegrasses/jumpnbump/commit/1c20a1e9d8c24516611ae16a7f10b11ddbe5b3ee)) +* **screensaver:** deliver fireworks mode as a native Swift/Metal screensaver (TASK-017.03) ([af6057b](https://github.com/pythoninthegrasses/jumpnbump/commit/af6057bf8938cb591f774b53ef0ca05f54316dcb)) +* **screensaver:** scale fireworks framebuffer anisotropically at QHD ([9d9774f](https://github.com/pythoninthegrasses/jumpnbump/commit/9d9774ffea5cfd03257ed9ecd7dad908151e940f)) +* **screensaver:** sign and notarize the fireworks .saver bundle (TASK-017.04) ([a68e1b7](https://github.com/pythoninthegrasses/jumpnbump/commit/a68e1b70b2400df642c14bf644082bc9a53b7697)) +* **taskfile:** add DOSBox-X install task, fix Linux SDL 1.2 deps for dnf ([dcffd8f](https://github.com/pythoninthegrasses/jumpnbump/commit/dcffd8f53c2463f9613c14f2d6535830c5fd15bf)) +* **taskfiles:** add zig.yml and act.yml wrappers ([16d4e29](https://github.com/pythoninthegrasses/jumpnbump/commit/16d4e29581eeb8060d979562bce5f136bf44a0a7)) +* **tools:** enforce core purity boundary check (TASK-011.08) ([27e5d06](https://github.com/pythoninthegrasses/jumpnbump/commit/27e5d0696a2c21c3354d503ced464124425fe767)) + + +### Bug Fixes + +* **assets:** compare decoded pixels, not PNG bytes, in sprite/level checks ([2503838](https://github.com/pythoninthegrasses/jumpnbump/commit/2503838e64388ef6cd24d839f4c9f5584a9bc557)) +* **build:** pin arch=arm64 for the macOS extension build, drop windows ([258955e](https://github.com/pythoninthegrasses/jumpnbump/commit/258955e9d330da718c686b37f7d44249715b7f49)) +* **ci:** build the GDExtension shim before game:test and fix ar extraction bug ([27a8049](https://github.com/pythoninthegrasses/jumpnbump/commit/27a80498a17345b4758790eeb8d5b50d86b29651)) +* **core:** expose player enable/position and level-object seeding on the ABI (TASK-018) ([92e4663](https://github.com/pythoninthegrasses/jumpnbump/commit/92e466321fd46de32c084aeaa9c2c3c1a986f2d2)) +* **core:** find a working objcopy on macOS for localize_abi_symbols.sh ([991f236](https://github.com/pythoninthegrasses/jumpnbump/commit/991f23694b9f1aacc1b91b10b65e19bdc3cb9499)) +* **core:** link steer.zig's and flies.zig's own Tier-A tests, fix rnd.zig wraparound and flies.zig seeding ([1d66d90](https://github.com/pythoninthegrasses/jumpnbump/commit/1d66d902b6ea9ef3fd677753f4be4ecae9aa9eae)) +* **core:** replace libc rand() with a portable glibc-compatible rnd() ([86040d7](https://github.com/pythoninthegrasses/jumpnbump/commit/86040d7c3963f2c78fc3d86bcfd65ccc78be470c)) +* **core:** stop steer.zig's weak world-storage fallback from colliding with real definitions ([90f96d5](https://github.com/pythoninthegrasses/jumpnbump/commit/90f96d5a3a76b032016a23978d1897250cffa952)) +* **core:** underscore-prefix jnb_ symbol names for Mach-O objcopy matching ([64dd935](https://github.com/pythoninthegrasses/jumpnbump/commit/64dd935100837e90048ea9544b7bd8ccbd018b07)) +* **extension:** route linux ar link through a response file ([5bc9eed](https://github.com/pythoninthegrasses/jumpnbump/commit/5bc9eedc18b3db763b13f7877b30bf6c2b5eee94)) +* **game:** enable ETC2/ASTC texture import for arm64/universal macOS export ([fd37693](https://github.com/pythoninthegrasses/jumpnbump/commit/fd3769377229018298057b07dbcdeb16c838fd83)) +* **game:** retry the flaky import crash and bootstrap gdUnit4 in CI ([af7975f](https://github.com/pythoninthegrasses/jumpnbump/commit/af7975f78419e629b27e8f814082812b9472ce20)) +* **game:** work around a Godot editor race crashing headless import ([0776257](https://github.com/pythoninthegrasses/jumpnbump/commit/0776257f91045211cae36d51e7ac8fa13c44c07c)) +* **taskfile:** run brew install dosbox-x non-interactively ([5fabce4](https://github.com/pythoninthegrasses/jumpnbump/commit/5fabce46fceeeb0a5598ca3356b8cf6f472ecc64)) +* **taskfile:** use brew install --no-ask, not NONINTERACTIVE ([269c095](https://github.com/pythoninthegrasses/jumpnbump/commit/269c09548eb9882cd1e76c977813662e8d2b0c5e)) +* **tools:** pin semver + exclude-newer for PEP 723 uv script deps ([7c3dde4](https://github.com/pythoninthegrasses/jumpnbump/commit/7c3dde411af018a6a42f89c74d0b691dd737386c))