Name: open-hpl Version: 1.3.1 Release: 11%{?dist} Summary: Open HPL: an aarch64 port of Amnesia: The Dark Descent's HPL2 engine License: GPL-3.0-or-later # Points at the upstream project this is ported from - Frictional Games' # open-source release of the HPL2 engine and Amnesia: The Dark Descent's game # code. This fork/port (renamed "Open HPL") has no public URL of its own yet. URL: https://github.com/FrictionalGames/AmnesiaTheDarkDescent # Local working-tree snapshot (mid-port, not yet an upstream tag) staged as a # plain tarball under ~/.local/rpm/sources/ - not fetched from a URL. Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: perl-interpreter BuildRequires: ImageMagick BuildRequires: desktop-file-utils BuildRequires: pkgconfig(sdl2) BuildRequires: pkgconfig(gl) BuildRequires: pkgconfig(glu) BuildRequires: pkgconfig(zlib) BuildRequires: DevIL-devel BuildRequires: glew-devel BuildRequires: libtheora-devel BuildRequires: libvorbis-devel BuildRequires: libogg-devel BuildRequires: openal-soft-devel BuildRequires: libjpeg-turbo-devel BuildRequires: angelscript-devel BuildRequires: fltk-devel BuildRequires: libX11-devel BuildRequires: libXext-devel BuildRequires: libXft-devel BuildRequires: fontconfig-devel Requires: hicolor-icon-theme # This engine has only ever targeted x86/x86_64 Linux (plus Windows and # PowerPC-era macOS). It's being actively ported to aarch64 in this spec; # keep it arm64-only for now rather than implying unvalidated x86_64 support. ExclusiveArch: aarch64 %description Open HPL is an unofficial, community aarch64 Linux port of Frictional Games' HPL2 engine and Amnesia: The Dark Descent's game logic, both source-released by Frictional Games under the GPLv3. Not affiliated with or endorsed by Frictional Games; "Amnesia: The Dark Descent" remains their trademark. This build replaces the engine's original bundled 32-bit x86 third-party libraries with native aarch64 system libraries, ports the Newton Dynamics physics bindings from the unrecoverable Newton 2.x API to the current Newton Dynamics 3.14 line (built from vendored source as part of this package), and upgrades the AngelScript scripting integration to 2.38 for aarch64 calling-convention support. See %{_pkgdocdir}/THIRD_PARTY_LICENSES.md for the licenses of the vendored third-party code this package builds. This package ships the engine and launcher binaries only - the FLTK-based content-creation tools (level/model/material/particle editors) are excluded. Amnesia's game data (maps, textures, audio) is not open-source and is not included; you must own a legitimate copy of the game and supply its data directory yourself. An "Amnesia: The Dark Descent" application-menu entry is installed, backed by a small launcher script that locates your existing Steam install (checking the default ~/.steam/steam and ~/.local/share/Steam locations) and its library thumbnail, deploys this package's own aarch64 binaries into the Steam game directory (required - the engine resolves resource paths relative to the binary's own location), and runs them natively. Needs the game already installed via Steam; doesn't work without it. Amnesia: A Machine for Pigs is installed too, via an "Amnesia: A Machine for Pigs" entry - EXPERIMENTAL and not fully working yet. AMFP is a separate, closed-source game (The Chinese Room) built on a fork of this same HPL2 engine - not this project's own ported game logic. What this entry actually does: run this package's real, working Dark Descent game-logic binary directly against AMFP's own Steam data instead of Dark Descent's. This works far enough to be worth shipping - AMFP's real level data loads, its actual game scripts compile and execute, the player spawns correctly and collides with the floor while standing still - but known bugs remain (collision breaks while moving; no AMFP-specific gameplay systems like its Manpig enemies or infection mechanic are implemented, just safely stubbed). See %{_pkgdocdir}/PORTING_NOTES.md for current status. No x86_64 emulation (box64 or otherwise) is used or provided anywhere in this package - this is a genuine native aarch64 run, incomplete as it is. Three more Frictional/HPL-lineage titles get their own EXPERIMENTAL entries too - "SOMA", "Amnesia: Rebirth", and "Amnesia: The Bunker" - each running this package's own from-scratch aarch64 game-module port of that title (soma/, rebirth/, bunker/ in the source tree), not an emulated copy of Steam's own build. All three are genuinely native aarch64, and all three are Phase 0 scaffolding: the real engine boots against that game's actual Steam data, loads one hardcoded starting map, and drives a free-fly debug camera (WASD to move, Q/E for down/up, hold the right mouse button to look around) with no player controller, no menu, and no scripts running - so these entries open straight into that starting map from a debug camera, not a playable game. Rebirth and Bunker's Steam depots ship only a precompiled cache (.msh) for five core primitive meshes the renderer needs by filename (a box and three sphere tessellations used for deferred light-volume stencils, plus a pyramid), not the original .dae source the engine actually asks for by name - this package's own compatibility copies of those five files (pulled from a real install that does ship them) are deployed into the Steam game directory alongside the binary to close that gap; SOMA's own data already has them. See %{_pkgdocdir}/PORTING_NOTES.md for the current state of each. %prep %autosetup -p1 -n %{name}-%{version} %build # Newton Dynamics has no Fedora package, so build the vendored copy of its # actively-maintained legacy-C-API line (Newton 3.14) from source first, then # feed the resulting static libs to the engine build below via its existing # FindPrebuiltLibrary() lookup under HPL2/dependencies/lib/linux/lib/. # # %%cmake_build always builds the fixed relative "redhat-linux-build" dir # %%cmake itself defaults to - there's no per-invocation override - so each # subproject is built by cd-ing into it first rather than passing -B/-S. cd HPL2/dependencies/newton-dynamics %cmake \ -DCMAKE_BUILD_TYPE=Release \ -DNEWTON_BUILD_CORE_ONLY=ON \ -DNEWTON_BUILD_SANDBOX_DEMOS=OFF \ -DNEWTON_BUILD_SHARED_LIBS=OFF \ -DNEWTON_WITH_AVX_PLUGIN=OFF \ -DNEWTON_WITH_REFERENCE_GPU_PLUGIN=OFF %cmake_build cd - install -Dpm0644 -t HPL2/dependencies/lib/linux/lib HPL2/dependencies/newton-dynamics/redhat-linux-build/lib/libdgCore.a install -Dpm0644 -t HPL2/dependencies/lib/linux/lib HPL2/dependencies/newton-dynamics/redhat-linux-build/lib/libdgPhysics.a install -Dpm0644 HPL2/dependencies/newton-dynamics/redhat-linux-build/lib/libnewton.a HPL2/dependencies/lib/linux/lib/libNewton.a cd amnesia/src %cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DUSE_GAMEPAD=ON \ -DAMNESIA_WITH_SERIAL=OFF %cmake_build --target Amnesia --target Launcher --target Soma --target Rebirth --target Bunker cd - # Extract a PNG icon from the bundled Windows .ico for desktop integration. # Used as the fallback/placeholder icon for both games below, until each # launcher's first run replaces it with that game's real Steam library icon # (see steam-common.sh's oh_ensure_icon) - so the app menu entry is never # blank, but shows the accurate per-game thumbnail once it's resolvable. magick 'amnesia/src/game/Lux.ico[0]' %{name}.png cat > open-hpl-amnesia.desktop < open-hpl-machine-for-pigs.desktop < open-hpl-soma.desktop < open-hpl-rebirth.desktop < open-hpl-bunker.desktop </ named # by a sha1-looking hash - there's no fixed filename to hardcode, so this # greps for the hash-shaped name and excludes Steam's other known, # non-square art assets in that same directory). install -Dpm0644 /dev/stdin %{buildroot}%{_libexecdir}/%{name}/steam-common.sh <<'EOF' # Sourced by the open-hpl-* launcher wrappers - not meant to be run directly. oh_find_steam_root() { for d in "$HOME/.steam/steam" "$HOME/.local/share/Steam"; do if [ -d "$d/steamapps/common" ]; then printf '%s\n' "$d" return 0 fi done return 1 } # oh_ensure_icon - idempotent, always safe to call. # # Written to hicolor/128x128/apps (not e.g. 32x32, the real source image's # own actual size) to exactly match the placeholder icon this package itself # ships at that same path/size (see %%install below) - freedesktop icon # theme lookup takes the first match it finds by walking base directories in # order ($XDG_DATA_HOME before /usr/share, i.e. this file before the # package's own), so only an *exact* same name+size collision reliably wins # over the placeholder; a real icon written under a different size directory # was frequently losing to it depending on the desktop environment's nearest- # size substitution rules. The scale-up blur from a genuinely 32x32 source is # an accepted tradeoff for actually showing each game's real icon. oh_ensure_icon() { appid="$1" dest_name="$2" icon_dir="$HOME/.local/share/icons/hicolor/128x128/apps" icon_dest="$icon_dir/$dest_name.png" [ -e "$icon_dest" ] && return 0 steam_root="$(oh_find_steam_root)" || return 0 icon_src=$(find "$steam_root/appcache/librarycache/$appid" -maxdepth 1 \ -regextype posix-extended -regex '.*/[0-9a-f]{40}\.jpg' 2>/dev/null | head -n1) [ -n "${icon_src:-}" ] || return 0 mkdir -p "$icon_dir" cp -f "$icon_src" "$icon_dest" } EOF # Deploys this package's own aarch64 binaries into the Steam game directory # (required - the engine's binreloc mechanism resolves resource paths # relative to the binary's own location, not argv/cwd) and runs the # launcher, which is the normal entry point (it lets the player pick # display/quality settings before starting Amnesia.bin.aarch64 itself). install -Dpm0755 /dev/stdin %{buildroot}%{_bindir}/open-hpl-amnesia <<'EOF' #!/bin/sh set -eu PKGDIR=%{_libexecdir}/%{name} . "$PKGDIR/steam-common.sh" APPID=57300 INSTALLDIR="Amnesia The Dark Descent" oh_ensure_icon "$APPID" open-hpl-amnesia steam_root="$(oh_find_steam_root)" || { echo "Open HPL: no Steam install found under ~/.steam/steam or ~/.local/share/Steam." >&2 exit 1 } gamedir="$steam_root/steamapps/common/$INSTALLDIR" if [ ! -d "$gamedir" ]; then echo "Open HPL: '$INSTALLDIR' isn't installed under $steam_root/steamapps/common - install it via Steam first." >&2 exit 1 fi for f in Amnesia.bin.aarch64 Launcher.bin.aarch64; do if [ ! -e "$gamedir/$f" ] || ! cmp -s "$PKGDIR/$f" "$gamedir/$f"; then cp -f "$PKGDIR/$f" "$gamedir/$f" fi done cd "$gamedir" && exec ./Launcher.bin.aarch64 "$@" EOF # EXPERIMENTAL: runs this package's own Amnesia.bin.aarch64 (Dark Descent's real, # working game-logic binary) directly against AMFP's data instead of Dark Descent's - # see the %%description for what this does and doesn't do yet. Deployed under a # distinct filename (not Amnesia.bin.aarch64) so it can't collide with a real Dark # Descent install if both games happen to share a library folder. Goes straight to # the game binary, not through Launcher.bin.aarch64 - AMFP's display/quality settings # flow through the Launcher has not been tested at all. install -Dpm0755 /dev/stdin %{buildroot}%{_bindir}/open-hpl-machine-for-pigs <<'EOF' #!/bin/sh set -eu PKGDIR=%{_libexecdir}/%{name} . "$PKGDIR/steam-common.sh" APPID=239200 INSTALLDIR="Machine for Pigs" oh_ensure_icon "$APPID" open-hpl-machine-for-pigs steam_root="$(oh_find_steam_root)" || { echo "Open HPL: no Steam install found under ~/.steam/steam or ~/.local/share/Steam." >&2 exit 1 } gamedir="$steam_root/steamapps/common/$INSTALLDIR" if [ ! -d "$gamedir" ]; then echo "Open HPL: '$INSTALLDIR' isn't installed under $steam_root/steamapps/common - install it via Steam first." >&2 exit 1 fi if [ ! -e "$gamedir/AmnesiaOnAmfp.bin.aarch64" ] || ! cmp -s "$PKGDIR/Amnesia.bin.aarch64" "$gamedir/AmnesiaOnAmfp.bin.aarch64"; then cp -f "$PKGDIR/Amnesia.bin.aarch64" "$gamedir/AmnesiaOnAmfp.bin.aarch64" fi cd "$gamedir" && exec ./AmnesiaOnAmfp.bin.aarch64 "$@" EOF # EXPERIMENTAL: this package's own from-scratch Phase 0 aarch64 SOMA game # module (soma/src/game) - see the %%description. Genuinely native, not an # emulated copy of SOMA's own real Linux x86_64 build. install -Dpm0755 /dev/stdin %{buildroot}%{_bindir}/open-hpl-soma <<'EOF' #!/bin/sh set -eu PKGDIR=%{_libexecdir}/%{name} . "$PKGDIR/steam-common.sh" APPID=282140 INSTALLDIR="SOMA" oh_ensure_icon "$APPID" open-hpl-soma steam_root="$(oh_find_steam_root)" || { echo "Open HPL: no Steam install found under ~/.steam/steam or ~/.local/share/Steam." >&2 exit 1 } gamedir="$steam_root/steamapps/common/$INSTALLDIR" if [ ! -d "$gamedir" ]; then echo "Open HPL: '$INSTALLDIR' isn't installed under $steam_root/steamapps/common - install it via Steam first." >&2 exit 1 fi if [ ! -e "$gamedir/OpenHplSoma.bin.aarch64" ] || ! cmp -s "$PKGDIR/Soma.bin.aarch64" "$gamedir/OpenHplSoma.bin.aarch64"; then cp -f "$PKGDIR/Soma.bin.aarch64" "$gamedir/OpenHplSoma.bin.aarch64" fi cd "$gamedir" && exec ./OpenHplSoma.bin.aarch64 "$@" EOF # EXPERIMENTAL: this package's own from-scratch Phase 0 aarch64 Amnesia: # Rebirth game module (rebirth/src/game) - see the %%description, including # why the core_*.dae compat copies below get deployed too (Rebirth's own # Steam depot ships only their precompiled .msh cache, not these five .dae # source files HPL2's renderer needs by hardcoded filename). install -Dpm0755 /dev/stdin %{buildroot}%{_bindir}/open-hpl-rebirth <<'EOF' #!/bin/sh set -eu PKGDIR=%{_libexecdir}/%{name} . "$PKGDIR/steam-common.sh" APPID=999220 INSTALLDIR="Amnesia Rebirth" oh_ensure_icon "$APPID" open-hpl-rebirth steam_root="$(oh_find_steam_root)" || { echo "Open HPL: no Steam install found under ~/.steam/steam or ~/.local/share/Steam." >&2 exit 1 } gamedir="$steam_root/steamapps/common/$INSTALLDIR" if [ ! -d "$gamedir" ]; then echo "Open HPL: '$INSTALLDIR' isn't installed under $steam_root/steamapps/common - install it via Steam first." >&2 exit 1 fi if [ ! -e "$gamedir/OpenHplRebirth.bin.aarch64" ] || ! cmp -s "$PKGDIR/Rebirth.bin.aarch64" "$gamedir/OpenHplRebirth.bin.aarch64"; then cp -f "$PKGDIR/Rebirth.bin.aarch64" "$gamedir/OpenHplRebirth.bin.aarch64" fi mkdir -p "$gamedir/core/models" for f in "$PKGDIR"/compat/*.dae; do dest="$gamedir/core/models/$(basename "$f")" [ -e "$dest" ] || cp -f "$f" "$dest" done cd "$gamedir" && exec ./OpenHplRebirth.bin.aarch64 "$@" EOF # EXPERIMENTAL: this package's own from-scratch Phase 0 aarch64 Amnesia: The # Bunker game module (bunker/src/game) - see open-hpl-rebirth above, same # shape (including the same core_*.dae compat deploy - the Bunker's Steam # depot has the identical gap). install -Dpm0755 /dev/stdin %{buildroot}%{_bindir}/open-hpl-bunker <<'EOF' #!/bin/sh set -eu PKGDIR=%{_libexecdir}/%{name} . "$PKGDIR/steam-common.sh" APPID=1944430 INSTALLDIR="Amnesia The Bunker" oh_ensure_icon "$APPID" open-hpl-bunker steam_root="$(oh_find_steam_root)" || { echo "Open HPL: no Steam install found under ~/.steam/steam or ~/.local/share/Steam." >&2 exit 1 } gamedir="$steam_root/steamapps/common/$INSTALLDIR" if [ ! -d "$gamedir" ]; then echo "Open HPL: '$INSTALLDIR' isn't installed under $steam_root/steamapps/common - install it via Steam first." >&2 exit 1 fi if [ ! -e "$gamedir/OpenHplBunker.bin.aarch64" ] || ! cmp -s "$PKGDIR/Bunker.bin.aarch64" "$gamedir/OpenHplBunker.bin.aarch64"; then cp -f "$PKGDIR/Bunker.bin.aarch64" "$gamedir/OpenHplBunker.bin.aarch64" fi mkdir -p "$gamedir/core/models" for f in "$PKGDIR"/compat/*.dae; do dest="$gamedir/core/models/$(basename "$f")" [ -e "$dest" ] || cp -f "$f" "$dest" done cd "$gamedir" && exec ./OpenHplBunker.bin.aarch64 "$@" EOF install -Dpm0644 open-hpl-amnesia.desktop %{buildroot}%{_datadir}/applications/open-hpl-amnesia.desktop install -Dpm0644 open-hpl-machine-for-pigs.desktop %{buildroot}%{_datadir}/applications/open-hpl-machine-for-pigs.desktop install -Dpm0644 open-hpl-soma.desktop %{buildroot}%{_datadir}/applications/open-hpl-soma.desktop install -Dpm0644 open-hpl-rebirth.desktop %{buildroot}%{_datadir}/applications/open-hpl-rebirth.desktop install -Dpm0644 open-hpl-bunker.desktop %{buildroot}%{_datadir}/applications/open-hpl-bunker.desktop install -Dpm0644 %{name}.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/open-hpl-amnesia.png install -Dpm0644 %{name}.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/open-hpl-machine-for-pigs.png install -Dpm0644 %{name}.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/open-hpl-soma.png install -Dpm0644 %{name}.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/open-hpl-rebirth.png install -Dpm0644 %{name}.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/open-hpl-bunker.png desktop-file-validate %{buildroot}%{_datadir}/applications/open-hpl-amnesia.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/open-hpl-machine-for-pigs.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/open-hpl-soma.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/open-hpl-rebirth.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/open-hpl-bunker.desktop %files %license LICENSE THIRD_PARTY_LICENSES.md %doc README.md PORTING_NOTES.md %{_bindir}/open-hpl-amnesia %{_bindir}/open-hpl-machine-for-pigs %{_bindir}/open-hpl-soma %{_bindir}/open-hpl-rebirth %{_bindir}/open-hpl-bunker %{_libexecdir}/%{name}/ %{_datadir}/applications/open-hpl-amnesia.desktop %{_datadir}/applications/open-hpl-machine-for-pigs.desktop %{_datadir}/applications/open-hpl-soma.desktop %{_datadir}/applications/open-hpl-rebirth.desktop %{_datadir}/applications/open-hpl-bunker.desktop %{_datadir}/icons/hicolor/128x128/apps/open-hpl-amnesia.png %{_datadir}/icons/hicolor/128x128/apps/open-hpl-machine-for-pigs.png %{_datadir}/icons/hicolor/128x128/apps/open-hpl-soma.png %{_datadir}/icons/hicolor/128x128/apps/open-hpl-rebirth.png %{_datadir}/icons/hicolor/128x128/apps/open-hpl-bunker.png %changelog * Wed Sep 02 2026 Lachlan Marie - 1.3.1-11 - Fixed all five desktop entries' real Steam-thumbnail icons (steam-common.sh's oh_ensure_icon, best-effort/local-only - see its own comment for why this package never bundles anyone else's Steam artwork) frequently losing to the generic placeholder icon this package ships: the real icon was written to hicolor/32x32/apps (matching the fetched 32x32 source image's own actual size) while the shipped placeholder lives at hicolor/128x128/apps, and which one wins a given icon lookup depends on the desktop environment's own nearest-size substitution rules rather than being reliably deterministic. Now writes to the exact same 128x128 path as the placeholder, so the user's own copy (found first - $XDG_DATA_HOME precedes system dirs) unambiguously wins every time, at the cost of an accepted blur from upscaling a genuinely-32x32 source. Also re-ran the fetch for all five games on this machine directly, so the real icons show up immediately without needing to launch each game first. - Added "Open HPL" to all five desktop entries' Comment (only the Dark Descent entry had it before) and a new Keywords line on each, so the project name surfaces in app-menu/launcher search results for every game. * Wed Sep 02 2026 Lachlan Marie - 1.3.1-10 - Fixed the pre-menu/splash sections skipping only on Escape/Enter or a click (when no on-screen widget wants the click) - a genuine gap against the "click or press any key to skip" ask, not the already-working case re-verified in 1.3.1-9. Root cause: cLuxInputHandler::UpdatePreMenuInput() only checked two specific bound actions, never the keyboard's own pressed-key queue. Fix drains that queue at the one point in UpdateGlobalInput() where a PreMenu-active frame already forwards it to the GUI (amnesia/src/game/LuxInputHandler.cpp) and treats any key found there as a skip too, gated the same way the existing click-skip already is (only when the section has no Continue button/gamma slider to hit instead, so arrow-key gamma adjustment on those sections is unaffected). - Added an opt-in hidden-window mode to the headless automation server (OPENHPL_HEADLESS_SOCKET, added in 1.3.1-8): a real window/GL context is still created (CopyFrameBufferToBitmap() needs one), but SDL_WINDOW_HIDDEN keeps it off-screen so a scripted test run never pops a window in front of whoever's at the desktop. Also forces the SDL video driver to X11/XWayland for headless runs specifically (when DISPLAY is set and a caller hasn't already forced one) - verified live that a hidden window's screenshot reads back solid black under this system's default Wayland driver (the wl_egl_window surface never gets the compositor's initial configure event when a window is never mapped) but reads back real rendered content under X11, where hidden windows carry no such requirement. Normal on-screen play is unaffected either way. - Added three more EXPERIMENTAL desktop entries - SOMA, Amnesia: Rebirth, Amnesia: The Bunker - each running this package's own new, genuinely native aarch64 Phase 0 game-module port of that title (soma/, new rebirth/src/game and bunker/src/game), not an emulated copy of Steam's own build. All three: boot the shared HPL2 engine against that game's real Steam data, load one map (its own declared entry, resolved generically via the map's own cStartPosEntity for camera placement, rather than SOMA's original hand-picked/hardcoded approach), and drive a free-fly debug camera - no player controller, menu, or scripts, matching the existing SOMA Phase 0 scaffold's scope. Verified live against real Steam data (headless, screenshot-confirmed): both new titles reach "Game Running" and render real level geometry (Rebirth's plane-cabin intro, the Bunker's trenches). Discovered and fixed along the way: Rebirth's and the Bunker's Steam depots ship only a precompiled .msh cache for five core primitive meshes HPL2's deferred renderer loads by hardcoded filename (Renderer.cpp/RendererDeferred.cpp: a box and three sphere tessellations for light-volume stencils, plus a pyramid) - not the original .dae source those calls actually ask for, causing an immediate FatalError on boot. This package now ships its own compatibility copies of those five files (pure geometry, pulled from a real install that does ship them - SOMA's), deployed into each Steam game directory alongside the binary by the new launchers. See PORTING_NOTES.md for details. * Tue Sep 01 2026 Lachlan Marie - 1.3.1-9 - Fixed the in-game "UI Scale" setting (GuiScale, added in 1.3.1-7): at 2x/3x/4x, menus were largely unreachable (most content pushed off screen) and the splash screen was offscreen. Root cause was cGuiSet::SetVirtualSize() zooming the visible UI canvas in around its own geometric centre - since most menu content is laid out from (0,0), not the canvas centre, that pushed the majority of it out of the now-smaller visible window rather than just edge content as originally assumed. Anchored the zoom at each GuiSet's own origin instead; fixed the main menu and in-game pause view's background/overlay draws and button-list layout to use the same (now-scaled) coordinate space consistently instead of mixing in raw screen-pixel math; clamped window-centering so an oversized dialog (e.g. Load Game, Profiles) anchors on-screen instead of overflowing past the top/left edge; and exempted the splash/logo sequence from GuiScale entirely, since a full-bleed splash image has nothing to gain from being "made bigger". Also re-verified splash skip (click/key) live, not just by review - it already worked correctly; a prior report of it not working was against a stale installed binary. Verified live against real game data at GuiScale="2": splash renders unclipped and skips in one keypress, and the main menu, Profiles dialog, and in-game pause view all render correctly. See PORTING_NOTES.md for the full root-cause writeup. * Tue Sep 01 2026 Lachlan Marie - 1.3.1-8 - Made the Launcher and both games' windows run as native Wayland clients instead of going through XWayland. Switched the Launcher's toolkit dependency from fltk1.3-devel to fltk-devel (FLTK >=1.4, the first release with a real Wayland backend; Fedora's build links it against both X11 and Wayland and it auto-selects Wayland when available - no code changes needed there). The game windows (Amnesia/AMFP/Soma, all via the shared HPL2 SDL2 windowing code) needed no changes either - Fedora's SDL2 (via sdl2-compat/SDL3) has always had Wayland support, and the engine never forces a video driver. The only source-level fix was in HPL2/core/CMakeLists.txt: the vendored HPL2/dependencies/include/FL headers (a stale FLTK 1.3.3 snapshot bundled for the Windows/macOS project files, which don't build through this spec) were shadowing the new system FLTK headers via a plain -I, so the Launcher compiled fine against 1.3-era declarations but failed to link against the 1.4 ABI; switched that directory to -idirafter so it's only consulted as a fallback (still needed for Newton.h, which has no Fedora package) after the compiler's normal search finds the real system headers first. Verified locally: the built Launcher.bin.aarch64 shows up as a genuine Wayland toplevel (app_id "FLTK") with its own wayland-cursor memfd, not an XWayland-mapped window. * Tue Sep 01 2026 Lachlan Marie - 1.3.1-7 - Fixed the in-game Options menu's resolution dropdown silently dropping resolutions shared between two connected displays (e.g. both a laptop panel and an external monitor supporting 1920x1080): its pre-populate "remove duplicates" pass merged adjacent same-WxH entries without checking which display they belonged to, so one display's entry vanished whenever a size collided with a neighbour after the (display-then-size) sort. Now requires a display match before merging, and labels entries with the display name whenever more than one display is present - mirrors a fix already shipped for the separate FLTK Launcher. - Added an in-game "UI Scale" control (Options -> Graphics, 1x/2x/3x/4x) wiring up the GuiScale engine feature that previously required hand- editing main_settings.cfg. Requires a restart to take effect, same as other Graphics-tab settings that already behave this way; inherits the existing known limitation that content anchored near a GuiSet's edge can clip at scale > 1 (not addressed here). See PORTING_NOTES.md. * Tue Sep 01 2026 Lachlan Marie - 1.3.1-6 - Fixed a real engine bug affecting both games: teleporting the player (cLuxPlayer::PlaceAtStartNode, used by the TeleportPlayer script command) repositioned the character but never cleared its existing velocity, so a teleport issued while already falling could tunnel straight through solid floor collision at the destination. Surfaced by the experimental open-hpl-machine-for-pigs entry (AMFP's own opening script teleports the player before it has a safe spawn) but fixed at the shared engine level (HPL2 CharacterBody's existing StopMovement(), now called from PlaceAtStartNode) - Dark Descent re-verified unaffected. See PORTING_NOTES.md for the full root-cause writeup. * Mon Aug 31 2026 Lachlan Marie - 1.3.1-5 - Added back an "Amnesia: A Machine for Pigs" entry (open-hpl-machine-for-pigs) - explicitly NOT box64/x86_64 emulation this time. Runs this package's own Amnesia.bin.aarch64 (Dark Descent's real game-logic binary, unmodified) directly against AMFP's own Steam data. This actually works far enough to be worth shipping as an experimental entry: AMFP's real level data loads, its own scripts compile and run (see AngelScript API shims added to LuxScriptHandler this session), and the player collides with the floor while standing still. Known-incomplete: collision breaks while moving, and no AMFP-specific gameplay (Manpig enemies, infection, etc.) is implemented - see PORTING_NOTES.md. Shipped anyway per explicit direction, honestly labeled EXPERIMENTAL in both the desktop entry's comment and the package %%description. * Mon Aug 31 2026 Lachlan Marie - 1.3.1-4 - Removed the box64-based "Amnesia: A Machine for Pigs" launcher, desktop entry, and icon entirely (open-hpl-machine-for-pigs, its Recommends on box64) per explicit direction: this project is native-aarch64-only by design, no x86_64-emulation fallback wanted even as an interim measure. AMFP support ships nothing in this package until/unless a real native port (engine + a from-scratch game-logic layer, since AMFP's own code was never open-sourced) is actually playable - see PORTING_NOTES.md for where that stands. Dark Descent's own launcher/entry is unaffected. * Mon Aug 31 2026 Lachlan Marie - 1.3.1-3 - Source refresh only, no change to the shipped Dark Descent binaries or either launcher wrapper. Picks up upstream source-tree additions from ongoing reverse-engineering work on two more Frictional/HPL-lineage games (Amnesia: A Machine for Pigs, SOMA) - a new amfp/src/game/ Phase 0 scaffolding target (not built by this spec; AMFP is still shipped via box64 running Steam's own native x86_64 build, per open-hpl-machine -for-pigs) and expanded PORTING_NOTES.md documenting that work. See %{_pkgdocdir}/PORTING_NOTES.md for details, including an unresolved severe performance bug found while loading AMFP's real first map. * Sun Aug 30 2026 Lachlan Marie - 1.3.1-2 - Replace the single generic desktop entry with two game-specific ones: open-hpl-amnesia (deploys this package's own aarch64 binaries into the Steam game directory and runs them) and open-hpl-machine-for-pigs (runs Steam's unmodified native x86_64 build of that separate, unported game under box64). Both locate the default Steam install automatically and pull each game's real library icon from Steam's cache on first run, falling back to a bundled placeholder icon until then. Adds a soft Recommends on box64. Also fixes a real bug found along the way: the Launcher's "Play" binary name was hardcoded to Amnesia.bin.x86_64 for every non-i386 Linux target, so it silently failed to launch the aarch64 binary this port actually produces (amnesia/src/launcher/Main.cpp). * Sun Aug 30 2026 Lachlan Marie - 1.3.1-1 - Renamed from amnesia-dark-descent to open-hpl, matching the project's rebrand to Open HPL. Ships THIRD_PARTY_LICENSES.md and PORTING_NOTES.md alongside the existing docs; otherwise unchanged from the last verified amnesia-dark-descent build (system libraries replace bundled 32-bit x86 prebuilts, Newton physics bindings ported to Newton Dynamics 3.14 built from vendored source, AngelScript upgraded to 2.38, FBX mesh loading removed, FLTK content-creation tools excluded).