Skip to content

TMC PC port v0.1.3-experimental

Pre-release
Pre-release

Choose a tag to compare

@999sian 999sian released this 03 May 03:02

0.1.3-experimental — 2026-05-03

Bug-fix pass on top of 0.1.2 driven by the GitHub issue tracker — Deepwood Shrine playthrough now reaches the boss-clear warp, and a class of x86-64 struct-alignment bugs that was silently breaking ~30 entity subclasses is fixed at the source.

Fixed (issue tracker)

  • #2 Linux white-screen on launch. Asset loader fell back to /proc/self/exe to locate assets/, but Kubuntu users running through a custom ld-linux interpreter saw the loader path instead of the binary's directory. Now also probes the current working directory, and the missing-asset message points at ./asset_extractor instead of "ROM fallback disabled". (port/port_asset_loader.cpp, src/common.c, commit dc31679e)
  • #3 Minish Village entrance vegetation missing. Gfx group 30 has destinations in EWRAM (gMapDataTopSpecial at 0x02002F00); the asset loader was writing those through the wrong resolver and the foliage tilemap stayed zeroed. Now routed through Port_ResolveEwramPtr like other heap-allocated game variables. (port/port_asset_loader.cpp, commit 0f728182)
  • #6 Deepwood Shrine barrel doors render as flat colour bands + gust-jar barrel soft-lock. Two unrelated bugs in the same room. (a) HBlank-DMA wasn't honouring DEST_FIXED vs DEST_INC vs DEST_RELOAD modes, so the cylindrical barrel-stave affine warp showed as solid bands. (b) The middle-hatch fall-through was gated on a barrel-rotation angle window the port never reached (max 0xF0 < required 0x118 because the port stops simulating once you're aligned); PC build now bypasses the angle gate. (port/port_hdma.c, src/manager/rollingBarrelManager.c, commits 107e7451, cd99dd4d)
  • #7 "Mysterious Shells" textbox showed 0 obtained. Number-variable substitution in textboxes wasn't being initialised on the port — gUnk_08107BE0[1] (the variable-slot pointer table) needed to point inside gTextRender so the code that copies the rupee count into the message buffer would land in the right place. Also fixed a DecToHex BCD-encoder regression that relied on GBA Div SWI's r1 remainder side effect; replaced with plain divmod. (src/message.c, src/common.c, commit 580ff28c)
  • #10 Drop shadows missing. sShadowFrameTable was never populated because the GBA original loads it via the IWRAM overlay copy (sub_080B197C..RAMFUNCS_END) that the PC port deliberately skips. Now loaded directly from ROM at first use, with IWRAM↔ROM offset translation for each region. Also fixed a draw-order bug where shadows rendered above their owning sprite. (port/port_draw.c, commits 4a191f01, cd99dd4d)
  • #12 Boss reward chain (heart container + green warp) didn't spawn after defeating the Deepwood Shrine boss. Three layered fixes:
    • gUnk_additional_a_DeepwoodShrineBoss_Main (the post-defeat entity list) was a zeroed 64-byte stub in port_linked_stubs.c because the asset extractor doesn't index it. Now populated from ROM 0x0DF94C in Port_InitDataStubs. (commit cd99dd4d)
    • Root cause (the data fix alone wasn't enough): GenericEntity has a void*-aligned scriptContext union that pushes cutsceneBeh/field_0x86 to PC offset 0xB0/0xB2, but most entity subclass structs (WarpPointEntity, HeartContainerEntity, GentariCurtainEntity, bossDoorEntity, lockedDoorEntity, ~25 more) lay out a flag field at GBA offset 0x84/0x86 without that void* trick, landing at PC 0xAE. RegisterRoomEntity was writing spritePtr halves via GE_FIELD which always lands at 0xB0/0xB2, so subclass reads got junk — warps never armed and heart containers stayed in their hidden first-action state forever. Fix mirrors the writes to PC 0xAC/0xAE for all non-Enemy kinds, catching every affected subclass at once. (src/room.c, commit bfd80ec6)
  • #14 Minish Village elder (Gentari) wouldn't open the curtain after the first dungeon. Same root cause as #12GentariCurtainEntity::flags at GBA 0x86 lands at PC 0xAE, was reading junk so the curtain animated as already-open or not at all. Universal struct-alignment fix from #12 covers it. (src/room.c, commit bfd80ec6)

Other fixes carried since 0.1.2

  • Doorway crash on HouseDoorExterior_Type3 — guard against NULL script context when the spawner failed to resolve. (src/object/houseDoorExterior.c, commit 6bc17ac2)
  • Map-hint cutscene black BGsub_0807C4F8 now iterates native 24-byte MapDataDefinition structs from the asset loader; RestoreGameTask force-flushes the BG buffer→VRAM copy. (src/playerUtils.c, src/gameUtils.c, commits 01948f13, 86f1463a)

Known issues (still open)

  • #4 Pulled mushroom (B1) renders as a flat tan rectangle while held. Sprite-frame extraction edge case — gSpriteAnimations_PullableMushroom is one of ~900 animations the extractor flags as Animation loop byte missing / Animation data has trailing bytes. Held state falls back to zeroed frame data. The unmounted mushroom renders correctly. Tracked under the broader extractor fix.
  • #5 Backflip / vault triggers off solid walls in Deepwood Shrine. Likely a gMapTileTypeToActTile mismatch — a wall tile is being mapped to a vaultable act-tile (43, 44, 65, 66, 76-79). Needs world coordinates / tile type to pin down.
  • #8 Blue/red teleport-icon parallax sprite missing. PARALLAX_ROOM_VIEW spawns but its sprite frame may be in the same extraction-loss bucket as #4. Worth retesting with this release's struct-alignment fix.
  • #11 Boss texture renders incorrectly during the fight. Likely also in the animation-extraction loss bucket; struct fix may help indirectly. Retest requested in 0.1.3.
  • #13 Re-entering the boss room after defeat breaks textures. Per-room state (tilemap / palette / gfx group) may not be fully refreshed on re-entry. Needs a fresh repro on 0.1.3.
  • #15 Fedora 43: libfmt.so.12: cannot open shared object when running the prebuilt asset_extractor. The xmake config sets header_only = true for fmt but the linker still pulls the host's libfmt.so.12 SONAME. Workaround: install fmt 12 from upstream, or build from source with python3 build.py --usa. Build-side fix coming in 0.1.4.
  • Inside-the-rolling-barrel scene still renders as flat brown bands — the BG2PA per-scanline DMA driving the cylindrical roll isn't honoured by VirtuaPPU even with the dest-mode fix above. Visible only inside the barrel; the room is otherwise playable.
  • Festival house facades, doorway sprite glitches, map-screen grey patches, cloud-shadow lines, Minish Woods fog, tall-grass shoes overlay — renderer-iteration deferred from 0.1.2.
  • ~900 animation entries still skipped during extraction (Animation loop byte missing / Animation data has trailing bytes). Affects boss frames, Vaati cutscene, MazaalHand, mushroom carry pose, possibly the teleport icons.
  • Mosaic effect on title fade and certain spell charges still kill-switched.