Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.20)
project(MetroidPrimeHuntersRecomp VERSION 0.4.2 LANGUAGES C CXX)
project(MetroidPrimeHuntersRecomp VERSION 0.4.3 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Expand Down
39 changes: 21 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,41 +20,43 @@ Click the image to watch the gameplay preview on YouTube.
## Current Release

Latest release:
**[v0.4.2-alpha](https://github.com/mstan/MetroidPrimeHuntersRecomp/releases/tag/v0.4.2-alpha)**.
**[v0.4.3-alpha](https://github.com/mstan/MetroidPrimeHuntersRecomp/releases/tag/v0.4.3-alpha)**.

Downloads:

- Windows:
`MetroidPrimeHuntersRecomp-windows-x64-v0.4.2.zip`
`MetroidPrimeHuntersRecomp-windows-x64-v0.4.3.zip`
- Linux:
`MetroidPrimeHuntersRecomp-linux-v0.4.2-x86_64.AppImage`
`MetroidPrimeHuntersRecomp-linux-v0.4.3-x86_64.AppImage`

This is the first release line in the ndsrecomp ecosystem and it is still very
early. Campaign entry, widescreen output, Prime-style controls, gamepad support,
and Wiimmfi lobby connectivity have all seen active bring-up, but this should
still be treated as an alpha test build rather than a polished game release.

New in v0.4.2: the developer Tab turbo shortcut is disabled in public builds
by default so it no longer conflicts with MPH's default virtual stylus binding.
The v0.4.1 Nintendo WFC reconnect and same-machine local Multi-Card runtime-bank
fixes remain included. The v0.4.0 HD Rendering mod is still available on the
Mods page: it raises the 3D engine above one sample per DS pixel (up to 4x) and
filters decoded textures, while the 2D layers stay native. It is off by default;
enable it under Mods and pick the internal resolution and texture upscaling that
suit your GPU.
New in v0.4.3: the launcher now passes the selected fullscreen and stacked/
separate window settings through to the runner, and the pinned framework
contains compute-renderer fixes for native-HD presentation, high-resolution
vertex coordinates, and an Intel OpenGL uniform-update crash. The v0.4.2 Tab
turbo fix and the v0.4.1 Nintendo WFC reconnect and same-machine local
Multi-Card runtime-bank fixes remain included. The v0.4.0 HD Rendering mod is
still available on the Mods page: it raises the 3D engine above one sample per
DS pixel (up to 4x) and filters decoded textures, while the 2D layers stay
native. It is off by default; enable it under Mods and pick the internal
resolution and texture upscaling that suit your GPU.

## Quick Start

Windows:

1. Download and fully extract the `v0.4.2-alpha` Windows ZIP.
1. Download and fully extract the `v0.4.3-alpha` Windows ZIP.
2. Put your own Metroid Prime Hunters USA revision-0 `.nds` ROM next to
`MetroidPrimeHuntersRecomp.exe`.
3. Run `MetroidPrimeHuntersRecomp.exe` and press Play.

Linux:

1. Download the `v0.4.2-alpha` AppImage.
1. Download the `v0.4.3-alpha` AppImage.
2. Put your own Metroid Prime Hunters USA revision-0 `.nds` ROM next to the
AppImage.
3. Run the AppImage.
Expand Down Expand Up @@ -180,11 +182,12 @@ console. If you move or delete one without the other, the game will report that
the WFC ID from the Nintendo DS and the Game Card do not match. Keep them
together, or back them up together.

The v0.4.2 patch disables the public default Tab turbo shortcut, which could
conflict with MPH's virtual stylus binding when focus moved between the two DS
screen windows. The v0.4.1 reconnect fix remains included: the validated
reconnect probe reaches Nintendo WFC three times in one run without error 52200.
Online play remains experimental beyond that and may still disconnect or desync.
The v0.4.3 patch keeps the v0.4.2 public Tab turbo default disabled, and also
fixes launcher fullscreen/layout argument forwarding plus several compute
renderer HD/Intel compatibility paths. The v0.4.1 reconnect fix remains
included: the validated reconnect probe reaches Nintendo WFC three times in one
run without error 52200. Online play remains experimental beyond that and may
still disconnect or desync.

The Wi-Fi implementation is built on
[melonDS](https://github.com/melonDS-emu/melonDS)'s Wi-Fi work in the shared
Expand Down
58 changes: 58 additions & 0 deletions docs/RELEASE-0.4.3-alpha.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# MetroidPrimeHuntersRecomp v0.4.3-alpha

Patch release after `v0.4.2-alpha`.

## Included

- Pins ndsrecomp to `9f2f8f3f531fb084a15f4d924e875334d9d8209d`.
- Passes the launcher Fullscreen setting through to the runner as
`--fullscreen off|borderless|exclusive`.
- Honors the launcher's Stacked/Separate window setting instead of forcing
separate windows whenever Adaptive Widescreen or Prime Controls are enabled.
- Guards the compute renderer's texture-size uniform update so Intel OpenGL
drivers do not receive `InvTextureSize` writes while a no-texture raster
program is current.
- Enables melonDS high-resolution vertex coordinates when internal resolution
is above 1x, reducing native-grid wobble in HD rendering.
- Allows the direct OpenGL top-screen presenter for native-HD output even when
Adaptive Widescreen is off.
- Keeps native-width direct-presenter output at 4:3 with black bars instead of
stretching it across wide/fullscreen windows.
- Retains the v0.4.2 public Tab turbo default-off fix and the v0.4.1 Nintendo
WFC reconnect and same-machine local Multi-Card runtime-bank fixes.

## Validated scope

- ndsrecomp Windows runner build succeeded; all 15 runner tests passed.
- ndsrecomp Linux runner build succeeded; all 15 runner tests passed.
- MPH launcher `mph_mod_provider_test` passed on Windows and Linux.
- Windows release package built with `tools/build-windows.ps1 -Version 0.4.3`.
- Linux AppImage built with `tools/build-linux.sh --version 0.4.3`; AppImage
layout validation passed.

## Validation Needed

- Affected Intel OpenGL users should retest the startup crash / blank-screen
path.
- HD-rendering users should visually compare native-HD upscaling, texture
wobble, mission briefing/FMV aspect ratio, and Adaptive Widescreen behavior.
- Window-setting reporters should retest Stacked, Separate, Borderless
fullscreen, and Exclusive fullscreen from the launcher.

## Known limits

- Steam Deck / older-glibc compatibility is not fixed by this release.
- European ROM support is not included.
- Online cross-machine play remains unvalidated.
- Local wireless has been validated on one machine only.
- Several renderer compatibility, adaptive-widescreen visibility, and
performance issues remain under active investigation.

## Artifact

- `MetroidPrimeHuntersRecomp-windows-x64-v0.4.3.zip`
- SHA-256:
`0684C524816CD8874571B5E54EC7BA1CED6594924C6CEED7877D34B883497018`
- `MetroidPrimeHuntersRecomp-linux-v0.4.3-x86_64.AppImage`
- SHA-256:
`18d60c3fd26f2812aa808f64309f5b1e33614bcbcd62128561d4cbe486d9fb0e`
25 changes: 18 additions & 7 deletions launcher/recomp-ui/launcher_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1236,8 +1236,20 @@ void show_launch_error(const char* message) {
#endif
}

const char* runner_screen_layout_arg(int display_layout) {
return display_layout == 1 ? "separate" : "stacked";
}

const char* runner_fullscreen_arg(int fullscreen) {
switch (fullscreen) {
case 1: return "borderless";
case 2: return "exclusive";
default: return "off";
}
}

bool launch_runner(const std::filesystem::path& game_dir, const char* rom,
int display_layout, bool adaptive,
int display_layout, int fullscreen, bool adaptive,
const ModState& mods,
int supersampling, int antialiasing,
const char* expected_sha1) {
Expand Down Expand Up @@ -1327,10 +1339,8 @@ bool launch_runner(const std::filesystem::path& game_dir, const char* rom,
quote(runner.wstring()) + L" " + quote(bios.wstring()) +
L" --interactive --rom " + quote(rom_wide) +
L" --config " + quote(config.wstring()) +
L" --screen-layout " +
(adaptive || mods.prime_controls || display_layout == 1
? L"separate"
: L"stacked") +
L" --screen-layout " + widen(runner_screen_layout_arg(display_layout)) +
L" --fullscreen " + widen(runner_fullscreen_arg(fullscreen)) +
L" --adaptive-widescreen " +
(adaptive ? L"top" : L"none") +
// Inert unless the HD mod is on, so the faithful native output stays
Expand Down Expand Up @@ -1406,8 +1416,8 @@ bool launch_runner(const std::filesystem::path& game_dir, const char* rom,
append_arg(args, "--rom", rom);
append_arg(args, "--config", config.string());
append_arg(args, "--screen-layout",
adaptive || mods.prime_controls || display_layout == 1
? "separate" : "stacked");
runner_screen_layout_arg(display_layout));
append_arg(args, "--fullscreen", runner_fullscreen_arg(fullscreen));
append_arg(args, "--adaptive-widescreen", adaptive ? "top" : "none");
append_arg(args, "--internal-resolution",
std::to_string(mods.hd_rendering
Expand Down Expand Up @@ -1630,6 +1640,7 @@ int main(int argc, char** argv) {
save_mod_state(mod_state);
}
return launch_runner(exe, selected_rom, settings.display_layout,
settings.fullscreen,
mod_state.adaptive_widescreen,
mod_state,
settings.supersampling,
Expand Down
13 changes: 13 additions & 0 deletions launcher/recomp-ui/tests/launcher_mod_provider_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@ bool require(bool condition, const char* label) {
} // namespace

int main() {
if (!require(std::strcmp(runner_screen_layout_arg(0), "stacked") == 0,
"stacked layout arg")) return 88;
if (!require(std::strcmp(runner_screen_layout_arg(1), "separate") == 0,
"separate layout arg")) return 89;
if (!require(std::strcmp(runner_fullscreen_arg(0), "off") == 0,
"fullscreen off arg")) return 90;
if (!require(std::strcmp(runner_fullscreen_arg(1), "borderless") == 0,
"fullscreen borderless arg")) return 91;
if (!require(std::strcmp(runner_fullscreen_arg(2), "exclusive") == 0,
"fullscreen exclusive arg")) return 92;
if (!require(std::strcmp(runner_fullscreen_arg(99), "off") == 0,
"fullscreen invalid clamps to off")) return 93;

{
const std::filesystem::path root =
std::filesystem::temp_directory_path() /
Expand Down
2 changes: 1 addition & 1 deletion ndsrecomp.pin
Original file line number Diff line number Diff line change
@@ -1 +1 @@
9ddd3a35a8d96d374acb39497e40e6bce46b99ea
9f2f8f3f531fb084a15f4d924e875334d9d8209d