feat(mods): a Mods tab, merged resource size tables, ExeFS patches and Atmosphere cheats #2900

Open
snaildev99 wants to merge 7 commits from snaildev99/Hookshot-fork:feat/mods-exefs-patches into main
First-time contributor

Mods that change the game's code (ExeFS patches: .ips, .pchtxt) do nothing on Hookshot, two mods that each ship a resource size table cannot load together, and there is no place in the game to see or order the mods. sirhumanbean's draft for all of this is #2478, restored here from GitHub without its author, so its branch cannot be brought up to date (it no longer merges). This is that work on current main, with the fixes from its review on Longshot. Supersedes #2478.

(Opened a second time: it was pull request 3 here for a few hours, before the old issues and pull requests were restored and took the numbers.)

Built from this branch and played on Hookshot by hand (below, with two pictures); the same code was played more widely on Longshot before the port. The build and the run were at b18ab96c; the branch has been rebased as main moved, last onto main @ 262ea386 (head 6db793b3; the comments say what each rebase changed), and the mod checks pass again there. That head is not built or played.

What changed

sirhumanbean's two commits are kept under his name; the commits after them are the port and the review's fixes. It is squashed at the merge, so please credit him there (Co-authored-by: hckrman101).

  • Mods (host/mods.c, host/restbl.c, host/zs.c): the mods' order and switches are read from hookshot_mods.txt; one size table is served, merged from every enabled mod's and raised for each file a mod serves (written to modcache/rsizetable.zs), so mods that each grow files load together; the menu gets the list (hos_mod_info, hos_mod_edit, hos_mods_changed).
  • ExeFS patches (nx2/exefs_patches.py, nx2/image.py, nx2/make_game.py): mods/<name>/exefs/*.ips and *.pchtxt are read when the game is built and written into main before it is relocated and lifted; a write into the padding after the code makes it code (a code cave). They are part of the lift's key, and exefs_patches.txt in the game folder lists what the build applied.
  • Cheats (host/cheats.c): Atmosphere cheats of the mods that are on; data cheats are switched in the menu.
  • Menu (gpu/vk/vk_menu.cpp): a Mods tab, shown when there are mods: each mod On or Off, Enter and Up or Down to move it, its cheats under it. A change asks for a restart as a row that takes one does.
  • The port to current main: main took API version 22 for wide_cover and 23 for take_text, so the Mods tab's five functions come after them as version 24 (gpu/vk/vk_api.h, host/rx_backend.c, can_mods(), tests/test_mods_menu.py). Six conflict blocks in five files; nothing of main's was dropped.
  • From the review on Longshot: no size table for the prompts when the merged one is served; a mod that is off is not told to wait for a build; a Restart or Quit waiting for its second press is cleared on the Mods tab; a mod file whose path differs in case from the game's takes the game's entry; bytes a patch writes into a relocated word are left out and counted in exefs_patches.txt; the compact bar shows the Mods tab's full page.
  • Tests: tests/test_exefs_patches.py, test_cheat_vm.py, test_mods_menu.py, test_mods_sizes.py, and additions to test_mods_size_table.py and test_fs_links.py. Docs: the README's Mods section, docs/development.md.

The lift fix a code-cave routine needs is already on main (commit 56ca2f89: a function with code below its entry starts at its entry).

How it was tested

Game-free, on this branch (Windows 11, llvm-mingw; the full run was on main @ 34389c34, the branch has since been rebased onto f532c100, three commits of docs, and the mod checks pass again there):

  • python -I -B tests/run_all.py at 6db793b3 on Windows 11: 541 passed, 81 skipped, 31 failed. The same thirty-one fail on main @ 262ea386 on this PC in the same run (537 passed there): test_builder_details_hitbox, test_builder_dlss_update, test_builder_dump_search, test_builder_upscaler_parts, test_controls_key_slots, test_cpm_discovery, test_cpp_preflight, test_crash_dialog, test_dev_packs, test_fastfp_fma, test_fpx_sticky, test_hdr_encode, test_linux_preflight, test_make_game_cache, test_make_game_prepare, test_missing_nup, test_oot_state_tap, test_options_budget_once, test_portable_archive, test_portable_builder_home, test_portable_builder_startup, test_portable_setup_start, test_portable_setup_transaction, test_readback_late, test_setup_runtime, test_setup_runtime_paths, test_spawn_emit, test_tested_configurations, test_updater_asset_digest, test_upscaler_round_trip, test_vram_budget_row; none of them is a mods or menu check.
  • The mod checks by themselves pass: test_mods_menu, test_exefs_patches, test_cheat_vm, test_menu_restart, test_menu_tune (test_mods_sizes, test_mods_size_table and test_fs_links skip their file parts off Linux).

In the game on Hookshot, this branch @ b18ab96c (v2.2.0-rc.1-124-gb18ab96c), Windows 11, RTX 3090, by hand, with a mod that has RomFS files, a size table and six code patches in one .ips (https://github.com/snaildev99/OoT-Character-Select):

  • A build with nx2/make_game.py, the mod in mods: 13 min 8 s, compiled in 10 min 44 s, 0 failed.
  • The Insert menu's Mods tab lists the mod, On (first picture).
  • The mod's own page opens from the game's menu, with its fourth tab and its character picker: all of it comes from the code patches (second picture). A character picked there is the player in the field.
  • The mod switched Off on the tab: closing the menu asks to restart; Restart now starts the game again with the mod off. Its RomFS files are then not served and its patch stays built in, as the log says. The game runs (60 fps), but not cleanly: the tabs at the top of the game's own menu are drawn wrong, because one of the mod's patches gives that header a fourth tab whose layout and text are RomFS files. That is what switching a code mod off without a build gives: half of it. The Mods tab says "Its ExeFS patches stay in the game until it is built again" for such a mod; a follow-up could say it in the restart question too.
  • No crash in either start.
exefs: code        OoT Character Select/exefs/E0F3CCFAF50065AE4EA01EB5AEB13B1A45DA3348.ips (4935 bytes)
exefs: main's code reaches 0x3c47000 now (a code cave)
exefs: 4935 bytes of main patched by 1 files
compiled in 633s, 0 failed
the build took 0:13:08, compiled in 0:10:44

mods: OoT Character Select: 534 RomFS files (16 replace the game's, 518 added), ExeFS patches
mods: OoT Character Select: ExeFS E0F3CCFAF50065AE4EA01EB5AEB13B1A45DA3348.ips: built into the game
mods: resource size table: 1 tables of mods merged (90 entries), 15 entries raised for mod files (0 added files estimated), served from modcache, 504 ms
mods: OoT Character Select switched off (at the next start)
menu: restart now, to apply the mods
(the next start) mods: OoT Character Select: off (the Mods tab)
mods: 1 ExeFS patch files built into the game belong to mods that are off or gone: they stay in it until it is built again
vi: 4725 frames presented (60.0 fps over the last 5.0 s, interval 1)

this branch @ b18ab96c on Hookshot: the Insert menu's Mods tab with the mod listed

this branch @ b18ab96c on Hookshot: the mod's Characters page in the game's own menu, which its code patches add

In the game, the same code before this port, on Longshot (its pull request 134, where the pictures and the log lines are: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/134):

  • Windows 11, RTX 3090, by hand, with a mod that has RomFS files, a size table and six code patches in one .ips (https://github.com/snaildev99/OoT-Character-Select, v0.1.3): the Mods tab lists it, the mod's menu page, its character swap, its cloth and voice hooks all work, 60 fps, the size table's merge takes 56 to 111 ms at the start.
  • The same mod as eight folders at once: four size tables merged, six .ips files for one build id built in (exefs: 4935 bytes of main patched by 6 files), a mod switched Off and On from the tab with Restart now, a mod moved.
  • Linux (Arch, RTX 4090) and Windows (RTX 5090) by two other testers: a full build with the mod, the tab, a switch and a move kept over a restart.

Not tested anywhere: a .pchtxt mod, a cheat file, the mouse on the tab, the compact bar with Mods current, a patch into a relocated word. Not tested on Hookshot itself: several mods at once (on Longshot only), and Linux.

For mod authors

A patch routine that is entered with bl has to leave with ret. One that jumps back into its caller runs the caller's tail twice once the code is lifted; the console and the emulators do not show it.

Risk

Without a mods folder nothing of this runs (hos_mods_init returns first). With mods, the size table the game gets is the merged one, where before it was the last mod's own. A build with ExeFS patches lifts patched code; without such patches the lift and its key are as before. Reverting the merge is enough.

🤖 Generated with Claude Code

Mods that change the game's code (ExeFS patches: `.ips`, `.pchtxt`) do nothing on Hookshot, two mods that each ship a resource size table cannot load together, and there is no place in the game to see or order the mods. sirhumanbean's draft for all of this is #2478, restored here from GitHub without its author, so its branch cannot be brought up to date (it no longer merges). This is that work on current `main`, with the fixes from its review on Longshot. Supersedes #2478. (Opened a second time: it was pull request 3 here for a few hours, before the old issues and pull requests were restored and took the numbers.) Built from this branch and played on Hookshot by hand (below, with two pictures); the same code was played more widely on Longshot before the port. The build and the run were at b18ab96c; the branch has been rebased as `main` moved, last onto `main` @ 262ea386 (head 6db793b3; the comments say what each rebase changed), and the mod checks pass again there. That head is not built or played. ## What changed sirhumanbean's two commits are kept under his name; the commits after them are the port and the review's fixes. It is squashed at the merge, so please credit him there (`Co-authored-by: hckrman101`). - **Mods** (`host/mods.c`, `host/restbl.c`, `host/zs.c`): the mods' order and switches are read from `hookshot_mods.txt`; one size table is served, merged from every enabled mod's and raised for each file a mod serves (written to `modcache/rsizetable.zs`), so mods that each grow files load together; the menu gets the list (`hos_mod_info`, `hos_mod_edit`, `hos_mods_changed`). - **ExeFS patches** (`nx2/exefs_patches.py`, `nx2/image.py`, `nx2/make_game.py`): `mods/<name>/exefs/*.ips` and `*.pchtxt` are read when the game is built and written into `main` before it is relocated and lifted; a write into the padding after the code makes it code (a code cave). They are part of the lift's key, and `exefs_patches.txt` in the game folder lists what the build applied. - **Cheats** (`host/cheats.c`): Atmosphere cheats of the mods that are on; data cheats are switched in the menu. - **Menu** (`gpu/vk/vk_menu.cpp`): a **Mods** tab, shown when there are mods: each mod On or Off, Enter and Up or Down to move it, its cheats under it. A change asks for a restart as a row that takes one does. - **The port to current `main`**: `main` took API version 22 for `wide_cover` and 23 for `take_text`, so the Mods tab's five functions come after them as version 24 (`gpu/vk/vk_api.h`, `host/rx_backend.c`, `can_mods()`, `tests/test_mods_menu.py`). Six conflict blocks in five files; nothing of `main`'s was dropped. - **From the review on Longshot**: no size table for the prompts when the merged one is served; a mod that is off is not told to wait for a build; a Restart or Quit waiting for its second press is cleared on the Mods tab; a mod file whose path differs in case from the game's takes the game's entry; bytes a patch writes into a relocated word are left out and counted in `exefs_patches.txt`; the compact bar shows the Mods tab's full page. - **Tests**: `tests/test_exefs_patches.py`, `test_cheat_vm.py`, `test_mods_menu.py`, `test_mods_sizes.py`, and additions to `test_mods_size_table.py` and `test_fs_links.py`. Docs: the README's Mods section, `docs/development.md`. The lift fix a code-cave routine needs is already on `main` (commit 56ca2f89: a function with code below its entry starts at its entry). ## How it was tested Game-free, on this branch (Windows 11, llvm-mingw; the full run was on `main` @ 34389c34, the branch has since been rebased onto f532c100, three commits of docs, and the mod checks pass again there): - `python -I -B tests/run_all.py` at 6db793b3 on Windows 11: 541 passed, 81 skipped, 31 failed. The same thirty-one fail on `main` @ 262ea386 on this PC in the same run (537 passed there): `test_builder_details_hitbox`, `test_builder_dlss_update`, `test_builder_dump_search`, `test_builder_upscaler_parts`, `test_controls_key_slots`, `test_cpm_discovery`, `test_cpp_preflight`, `test_crash_dialog`, `test_dev_packs`, `test_fastfp_fma`, `test_fpx_sticky`, `test_hdr_encode`, `test_linux_preflight`, `test_make_game_cache`, `test_make_game_prepare`, `test_missing_nup`, `test_oot_state_tap`, `test_options_budget_once`, `test_portable_archive`, `test_portable_builder_home`, `test_portable_builder_startup`, `test_portable_setup_start`, `test_portable_setup_transaction`, `test_readback_late`, `test_setup_runtime`, `test_setup_runtime_paths`, `test_spawn_emit`, `test_tested_configurations`, `test_updater_asset_digest`, `test_upscaler_round_trip`, `test_vram_budget_row`; none of them is a mods or menu check. - The mod checks by themselves pass: `test_mods_menu`, `test_exefs_patches`, `test_cheat_vm`, `test_menu_restart`, `test_menu_tune` (`test_mods_sizes`, `test_mods_size_table` and `test_fs_links` skip their file parts off Linux). In the game on Hookshot, this branch @ b18ab96c (`v2.2.0-rc.1-124-gb18ab96c`), Windows 11, RTX 3090, by hand, with a mod that has RomFS files, a size table and six code patches in one `.ips` (https://github.com/snaildev99/OoT-Character-Select): - A build with `nx2/make_game.py`, the mod in `mods`: 13 min 8 s, compiled in 10 min 44 s, 0 failed. - The Insert menu's Mods tab lists the mod, On (first picture). - The mod's own page opens from the game's menu, with its fourth tab and its character picker: all of it comes from the code patches (second picture). A character picked there is the player in the field. - The mod switched Off on the tab: closing the menu asks to restart; Restart now starts the game again with the mod off. Its RomFS files are then not served and its patch stays built in, as the log says. The game runs (60 fps), but not cleanly: the tabs at the top of the game's own menu are drawn wrong, because one of the mod's patches gives that header a fourth tab whose layout and text are RomFS files. That is what switching a code mod off without a build gives: half of it. The Mods tab says "Its ExeFS patches stay in the game until it is built again" for such a mod; a follow-up could say it in the restart question too. - No crash in either start. ``` exefs: code OoT Character Select/exefs/E0F3CCFAF50065AE4EA01EB5AEB13B1A45DA3348.ips (4935 bytes) exefs: main's code reaches 0x3c47000 now (a code cave) exefs: 4935 bytes of main patched by 1 files compiled in 633s, 0 failed the build took 0:13:08, compiled in 0:10:44 mods: OoT Character Select: 534 RomFS files (16 replace the game's, 518 added), ExeFS patches mods: OoT Character Select: ExeFS E0F3CCFAF50065AE4EA01EB5AEB13B1A45DA3348.ips: built into the game mods: resource size table: 1 tables of mods merged (90 entries), 15 entries raised for mod files (0 added files estimated), served from modcache, 504 ms mods: OoT Character Select switched off (at the next start) menu: restart now, to apply the mods (the next start) mods: OoT Character Select: off (the Mods tab) mods: 1 ExeFS patch files built into the game belong to mods that are off or gone: they stay in it until it is built again vi: 4725 frames presented (60.0 fps over the last 5.0 s, interval 1) ``` ![this branch @ b18ab96c on Hookshot: the Insert menu's Mods tab with the mod listed](https://git.notrexed.dev/attachments/9d30710e-4f73-44ee-bf44-5a08c20f54e1) ![this branch @ b18ab96c on Hookshot: the mod's Characters page in the game's own menu, which its code patches add](https://git.notrexed.dev/attachments/fcdd3898-3e61-4b6d-814e-43db50b41a3c) In the game, the same code before this port, on Longshot (its pull request 134, where the pictures and the log lines are: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/134): - Windows 11, RTX 3090, by hand, with a mod that has RomFS files, a size table and six code patches in one `.ips` (https://github.com/snaildev99/OoT-Character-Select, v0.1.3): the Mods tab lists it, the mod's menu page, its character swap, its cloth and voice hooks all work, 60 fps, the size table's merge takes 56 to 111 ms at the start. - The same mod as eight folders at once: four size tables merged, six `.ips` files for one build id built in (`exefs: 4935 bytes of main patched by 6 files`), a mod switched Off and On from the tab with Restart now, a mod moved. - Linux (Arch, RTX 4090) and Windows (RTX 5090) by two other testers: a full build with the mod, the tab, a switch and a move kept over a restart. Not tested anywhere: a `.pchtxt` mod, a cheat file, the mouse on the tab, the compact bar with Mods current, a patch into a relocated word. Not tested on Hookshot itself: several mods at once (on Longshot only), and Linux. ## For mod authors A patch routine that is entered with `bl` has to leave with `ret`. One that jumps back into its caller runs the caller's tail twice once the code is lifted; the console and the emulators do not show it. ## Risk Without a `mods` folder nothing of this runs (`hos_mods_init` returns first). With mods, the size table the game gets is the merged one, where before it was the last mod's own. A build with ExeFS patches lifts patched code; without such patches the lift and its key are as before. Reverting the merge is enough. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
snaildev99 force-pushed feat/mods-exefs-patches from b5e3f992e3
Some checks failed
PR title / Conventional Commit title (pull_request_target) Has been cancelled
Linux AppImage / appimage (pull_request) Has been cancelled
Linux AppImage / Release asset (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Has been cancelled
Game-free source regressions / Workflow lint (actionlint) (pull_request) Has been cancelled
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Has been cancelled
Windows builder / Hookshot Builder package and setup (pull_request) Has been cancelled
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Has been cancelled
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Has been cancelled
Windows builder / Release assets (pull_request) Has been cancelled
to 0e86799d7d
Some checks failed
PR title / Conventional Commit title (pull_request_target) Has been cancelled
Linux AppImage / appimage (pull_request) Has been cancelled
Linux AppImage / Release asset (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Has been cancelled
Game-free source regressions / Workflow lint (actionlint) (pull_request) Has been cancelled
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Has been cancelled
Windows builder / Hookshot Builder package and setup (pull_request) Has been cancelled
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Has been cancelled
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Has been cancelled
Windows builder / Release assets (pull_request) Has been cancelled
2026-11-14 07:38:07 +00:00
Compare
Author
First-time contributor

Rebased onto main @ 0822ffb4, since it no longer merged: head 0e86799d. Two conflicts, both small and the same two as on Longshot's copy of this work: restart_values in gpu/vk/vk_menu.cpp (main now reads a row's value through row_restart_value; the mods' slot is added after that loop as before) and the list of posix shims in tests/test_mods_size_table.py (main's comment kept, MoveFileExA added). The mod checks pass (the Mods tab, ExeFS patches, the cheat VM, the size table merge, the restart rows). tests/run_all.py on Windows: 560 passed, 19 failed, 39 skipped, and the 19 are the same 19 that fail on main @ 0822ffb4 on this PC (556 passed, 19 failed there). Not built or played again after this rebase: the run in the game described above is of b18ab96c.

Rebased onto main @ 0822ffb4, since it no longer merged: head 0e86799d. Two conflicts, both small and the same two as on Longshot's copy of this work: `restart_values` in `gpu/vk/vk_menu.cpp` (main now reads a row's value through `row_restart_value`; the mods' slot is added after that loop as before) and the list of posix shims in `tests/test_mods_size_table.py` (main's comment kept, `MoveFileExA` added). The mod checks pass (the Mods tab, ExeFS patches, the cheat VM, the size table merge, the restart rows). `tests/run_all.py` on Windows: 560 passed, 19 failed, 39 skipped, and the 19 are the same 19 that fail on main @ 0822ffb4 on this PC (556 passed, 19 failed there). Not built or played again after this rebase: the run in the game described above is of b18ab96c.
Author
First-time contributor

Rebased onto main @ a2bcc012, since it no longer merged: head 779941c0. What changed:

  • API version 24. Main took version 23 for the text fields (take_text) since the last rebase, so the Mods tab's five functions now follow wide_cover (22) and take_text (23) in MkwVkHost as version 24: vk_api.h, the table in host/rx_backend.c (in the struct's order), can_mods() and tests/test_mods_menu.py. Nothing else about them changed.
  • vk_menu.cpp, the rows' keys. Main's text field line (field_row) joins the block this branch moved inside the Mods tab's else.
  • tests/test_menu_text_field.py (main's new test), one new commit, the last. Its harness cuts restart_values out of the menu, and that function also fills the mods' slot here, so the harness declares the slot (none), can_mods and the host's mods_changed beside its pad_raw.

The mod checks and the text field test pass. tests/run_all.py on Windows: 573 passed, 17 failed, 39 skipped, the same failures as main @ a2bcc012 on this PC in the same run (569 passed there). Not built or played again after this rebase or the one before: the run in the game described above is of b18ab96c. The same work on Longshot's side (their pull request 134) had the same three changes there.

Rebased onto main @ a2bcc012, since it no longer merged: head 779941c0. What changed: - **API version 24.** Main took version 23 for the text fields (`take_text`) since the last rebase, so the Mods tab's five functions now follow `wide_cover` (22) and `take_text` (23) in `MkwVkHost` as version 24: `vk_api.h`, the table in `host/rx_backend.c` (in the struct's order), `can_mods()` and `tests/test_mods_menu.py`. Nothing else about them changed. - **`vk_menu.cpp`, the rows' keys.** Main's text field line (`field_row`) joins the block this branch moved inside the Mods tab's `else`. - **`tests/test_menu_text_field.py` (main's new test), one new commit, the last.** Its harness cuts `restart_values` out of the menu, and that function also fills the mods' slot here, so the harness declares the slot (none), `can_mods` and the host's `mods_changed` beside its `pad_raw`. The mod checks and the text field test pass. `tests/run_all.py` on Windows: 573 passed, 17 failed, 39 skipped, the same failures as main @ a2bcc012 on this PC in the same run (569 passed there). Not built or played again after this rebase or the one before: the run in the game described above is of b18ab96c. The same work on Longshot's side (their pull request 134) had the same three changes there.
snaildev99 force-pushed feat/mods-exefs-patches from 0e86799d7d
Some checks failed
PR title / Conventional Commit title (pull_request_target) Has been cancelled
Linux AppImage / appimage (pull_request) Has been cancelled
Linux AppImage / Release asset (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Has been cancelled
Game-free source regressions / Workflow lint (actionlint) (pull_request) Has been cancelled
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Has been cancelled
Windows builder / Hookshot Builder package and setup (pull_request) Has been cancelled
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Has been cancelled
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Has been cancelled
Windows builder / Release assets (pull_request) Has been cancelled
to 779941c098
Some checks failed
PR title / Conventional Commit title (pull_request_target) Has been cancelled
Linux AppImage / appimage (pull_request) Has been cancelled
Linux AppImage / Release asset (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Has been cancelled
Game-free source regressions / Workflow lint (actionlint) (pull_request) Has been cancelled
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Has been cancelled
Windows builder / Hookshot Builder package and setup (pull_request) Has been cancelled
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Has been cancelled
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Has been cancelled
Windows builder / Release assets (pull_request) Has been cancelled
2026-11-14 22:51:05 +00:00
Compare
snaildev99 force-pushed feat/mods-exefs-patches from 779941c098
Some checks failed
PR title / Conventional Commit title (pull_request_target) Has been cancelled
Linux AppImage / appimage (pull_request) Has been cancelled
Linux AppImage / Release asset (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Has been cancelled
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Has been cancelled
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Has been cancelled
Game-free source regressions / Workflow lint (actionlint) (pull_request) Has been cancelled
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Has been cancelled
Windows builder / Hookshot Builder package and setup (pull_request) Has been cancelled
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Has been cancelled
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Has been cancelled
Windows builder / Release assets (pull_request) Has been cancelled
to 6db793b3f8
Some checks are pending
PR title / Conventional Commit title (pull_request_target) Waiting to run
Linux AppImage / appimage (pull_request) Blocked by required conditions
Linux AppImage / Release asset (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Blocked by required conditions
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Blocked by required conditions
Game-free source regressions / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Blocked by required conditions
Windows builder / Hookshot Builder package and setup (pull_request) Blocked by required conditions
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / Release assets (pull_request) Blocked by required conditions
2026-11-15 18:52:11 +00:00
Compare
Author
First-time contributor

Rebased onto main @ 262ea386 (v2.3.1 and the commits after it), since it no longer merged: head 6db793b3.

  • One conflict, in gpu/vk/vk_menu.cpp: main added the weak laptop row's press (is_laptop_row) to the block this branch moves inside the Mods tab's else; the line is in that block now. Nothing else in the seven commits changed (git range-diff: the first commit's one line, the other six equal). The API version stays 24 (main is at 23).
  • The lift store (#372) and code mods. Checked by reading: the lift's key and its share key both take the OOT_ environment, which holds the patches' file and its SHA-1, so a build with ExeFS patches never restores a lift made without them, or with other patches.
  • Checks. The mod checks pass (the Mods tab, ExeFS patches, the cheat VM, the text field harness, the restart rows), gpu/vk/vk_menu.cpp compiles alone with the build's flags, and tests/run_all.py on Windows gives 541 passed, 31 failed, 81 skipped, the same thirty-one as main @ 262ea386 in the same run (537 passed there).
  • Not built or played at this head. The head that was built and played is b18ab96c (the description's log lines and pictures).

Since the last comment, on the Longshot copy of this work (the same code): two .pchtxt mods run for another tester, and an Atmosphere cheat file works (listed off, switched on in the game, in effect at once). A mod that ships only a code module (exefs/subsdk*) is listed and does nothing, without a note that says why; that note is a small follow-up I would send after this.

Rebased onto main @ 262ea386 (v2.3.1 and the commits after it), since it no longer merged: head 6db793b3. - **One conflict,** in `gpu/vk/vk_menu.cpp`: main added the weak laptop row's press (`is_laptop_row`) to the block this branch moves inside the Mods tab's `else`; the line is in that block now. Nothing else in the seven commits changed (`git range-diff`: the first commit's one line, the other six equal). The API version stays 24 (main is at 23). - **The lift store (#372) and code mods.** Checked by reading: the lift's key and its share key both take the `OOT_` environment, which holds the patches' file and its SHA-1, so a build with ExeFS patches never restores a lift made without them, or with other patches. - **Checks.** The mod checks pass (the Mods tab, ExeFS patches, the cheat VM, the text field harness, the restart rows), `gpu/vk/vk_menu.cpp` compiles alone with the build's flags, and `tests/run_all.py` on Windows gives 541 passed, 31 failed, 81 skipped, the same thirty-one as main @ 262ea386 in the same run (537 passed there). - **Not built or played at this head.** The head that was built and played is b18ab96c (the description's log lines and pictures). Since the last comment, on the Longshot copy of this work (the same code): two `.pchtxt` mods run for another tester, and an Atmosphere cheat file works (listed off, switched on in the game, in effect at once). A mod that ships only a code module (`exefs/subsdk*`) is listed and does nothing, without a note that says why; that note is a small follow-up I would send after this.
Some checks are pending
PR title / Conventional Commit title (pull_request_target) Waiting to run
Linux AppImage / appimage (pull_request) Blocked by required conditions
Linux AppImage / Release asset (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (windows-2022, part 1/2) (pull_request) Blocked by required conditions
Game-free source regressions / Python source checks (windows-2022, part 2/2) (pull_request) Blocked by required conditions
Game-free source regressions / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
Game-free source regressions / Vulkan fixtures (lavapipe, validation) (pull_request) Blocked by required conditions
Game-free source regressions / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Blocked by required conditions
Windows builder / Hookshot Builder package and setup (pull_request) Blocked by required conditions
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / Release assets (pull_request) Blocked by required conditions
This pull request can be merged automatically.
Some workflows are waiting to be reviewed.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'feat/mods-exefs-patches:snaildev99-feat/mods-exefs-patches'
git switch 'snaildev99-feat/mods-exefs-patches'

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch 'main'
git merge --no-ff 'snaildev99-feat/mods-exefs-patches'
git switch 'snaildev99-feat/mods-exefs-patches'
git rebase 'main'
git switch 'main'
git merge --ff-only 'snaildev99-feat/mods-exefs-patches'
git switch 'snaildev99-feat/mods-exefs-patches'
git rebase 'main'
git switch 'main'
git merge --no-ff 'snaildev99-feat/mods-exefs-patches'
git switch 'main'
git merge --squash 'snaildev99-feat/mods-exefs-patches'
git switch 'main'
git merge --ff-only 'snaildev99-feat/mods-exefs-patches'
git switch 'main'
git merge 'snaildev99-feat/mods-exefs-patches'
git push origin 'main'
Sign in to join this conversation.
No description provided.