Repository navigation
Releases
Phase Distorter v0.5
Phase Distorter 0.5
macOS
- Add a universal macOS application for Apple silicon and Intel, with SDL2
included. Requires macOS 11 or later and uses the native OpenGL framework. - The app is ad-hoc signed, without Apple Developer ID signing or notarization.
macOS may require Privacy & Security > Open Anyway after the first attempt. - Fix CRT phosphor stripe selection on macOS OpenGL while preserving the
intended RGB mask pattern on other platforms.
Display and frame pacing
- Add exact MacBook Air 13/15 and MacBook Pro 14/16 panel proportions to the
shared Display menu and command-line options on Linux, Windows and macOS.
Existing 16:10, 16:9, Window and Custom modes remain available. Window follows
the actual drawable area; panel presets do not change display resolution. - Merge PR #9 by
s-ilent, with an optional adaptive deadline guard under F1 > Debug >
Experimental frame pacing, default off and saved with display preferences.
The guard accounts for the complete presentation cost, including swap. - Keep interpolation on the native timeline to avoid alternating-cost holds
and transition jumps. Toggling the guard preserves game and audio clocks.
Compatibility
- Retain the Linux glibc 2.36 baseline and private static C++ support. SDL2 is
included with each platform's application. - Keep existing save, asset-pack, snapshot and display preference formats.
- No ROMs, imported asset packs, saves or personal preferences are included.
This remains a development release. Bounded tests do not establish a complete
playthrough, complete native-engine parity or physical display/VRR/audio behavior.
Higher-rate presentation remains sensitive to game update cost and host load.
0.4
Phase Distorter v0.4
Draft patch notes prepared October 10, 2026. Changes are relative to the
packaged v0.3.1 source snapshot. Linux, Windows and combined launcher bundles
are available locally for upload.
Rendering performance
- Reduce CPU work when drawing backgrounds, capturing direct scenes and
composing native battle backgrounds. Decode complete tile rows once and
reuse their pixels and palette colors within an immutable capture. - Make cached background reads cheaper and skip inactive window-mask work.
Direct capture keeps separate scratch storage so changes in sampling policy
cannot reuse stale pixels. - Calculate software rasterizer coordinates once per row or column where
possible, reducing repeated work in interpolated scene rendering. - Preserve full rendering resolution, CRT quality, layer priority, window
effects and transparent sprite behavior. Gameplay and audio cadence remain
unchanged.
In a paired 600-frame Twoson walking replay with direct scene capture, median
game-update CPU time fell from 6.72 to 5.45 ms in EarthBound and 6.87 to
5.51 ms in Mother 2, about 19–20% less CPU time. The 99th percentile fell
from 8.26 to 6.56 ms and 8.24 to 6.92 ms respectively. State, native and
presentation pixels, and generated audio matched frame by frame.
These are measurements of one replay on one Linux host, not whole-game FPS
guarantees. Game updates still share the presentation thread. Uncapped runs
improved in initial probes but continued to show long presentation gaps under
workstation load; uniformly stable uncapped output remains unresolved.
Verification and compatibility
- Extend independent background comparisons to cover scroll, tile sizes,
flips, map wrapping, distortion, transparent pixels and physical VRAM wrapping. - Retain existing save, imported-asset, display-setting and machine-snapshot
formats. The default gameplay route and experimental native Continue route
keep their existing acceptance limits. - Retain the standard Linux glibc 2.36 baseline, bundled SDL2 and privately
linked C++ support. Windows includes SDL2.dll.
Bundles
- Update both canonical applications in
launchers/and their version to 0.4. - Provide separate Linux/Windows ZIPs and a combined launcher ZIP/folder with
instructions, these notes, dependency licenses, manifests and checksums. - Include source-input and build records; retain earlier release archives.
No ROMs, imported game packs, saves, snapshots or personal preferences are
bundled. Windows execution checks use Wine. Bounded replay and virtual-display
checks do not establish native Windows hardware, physical VRR/audio/controller
behavior, a complete playthrough or complete native-engine parity.
0.3.1
Phase Distorter v0.3.1
Prepared October 9, 2026. Changes are relative to the actual packaged v0.3
source index recorded in Phase-Distorter-0.3-build-info.json, including the
existing native-engine work in that release. This is a local release bundle
for manual upload; it does not create or publish a GitHub release.
Direct rendering and CRT performance
- Batch consecutive source primitives with matching stencil, clipping,
window-mask and color-math state. Preserve their order, triangle diagonals,
first-opaque sprite selection and nearest-texel sampling. - Reuse atlas texture storage when new artwork has the same dimensions,
avoiding repeated texture allocation during game updates. - Keep the full output resolution and the existing CRT shader. An initial
NVIDIA 1920×1200 imported-map benchmark reduced median plain-scene+CRT cost
from 0.277 to 0.205 ms and effect-scene+CRT from 0.349 to 0.267 ms. These are
isolated renderer costs with GPU completion included, not whole-game FPS
gains or guarantees for other hardware. - Add dense tile regressions for transparency, clipping, masking, sprite
overlap, color effects and fractional motion, plus the opt-in
direct_scene_benchmarkdevelopment target for imported local artwork.
Game updates and presentation still share one thread. Updates measured around
8–12 ms in the native Continue probe and can interrupt high-rate output.
Uncapped stability is not fully fixed; a cap alone cannot eliminate these
update stalls. Gameplay, input and audio keep their original cadence.
Linux compatibility
- Use Debian 12's glibc 2.36 baseline for the standard Linux download and
canonical Linux launcher. This also satisfies the glibc requirement on
glibc 2.37 hosts; the original v0.3 standard package required glibc 2.43. - Retain SDL2 2.32.10, rebuilt for the older baseline and baseline x86-64.
- Link C++ support privately into the application. Bundle SDL2 without shared
libstdc++/libgcc copies that could shadow a system graphics driver's runtime. - Keep a vector-owning native battle-menu command alive in a named coroutine
local, fixing a double-free exposed by GCC 12 across suspension.
Desktop OpenGL, graphics drivers, glibc and SDL's system desktop dependencies
remain host requirements. Physical Steam Deck acceptance remains unverified.
Delivery and compatibility
- Rebuild Linux and Windows applications and update
launchers/to 0.3.1. - Provide separate Linux/Windows ZIPs and a combined launcher ZIP/folder,
with instructions, dependency licenses, patch notes, manifests and checksums. - Record source inputs, build configuration, archive hashes and fresh
verification inPhase-Distorter-0.3.1-build-info.json. - Retain earlier release archives and their hashes.
Existing supported ROM imports, battery saves, display settings and machine
snapshot formats remain compatible. The default path still uses GameSession;
the optional native Continue route retains its v0.3 acceptance limits.
No ROMs, imported packs, saves, snapshots or personal preferences are bundled.
Windows execution checks use Wine. Bounded tests and replays do not establish
native Windows hardware, physical VRR/audio/controller behavior, a complete
game playthrough or complete native-engine parity.
0.3
Phase Distorter v0.3
A development release for EarthBound (US) and Mother 2 (Japan), covering changes
since the packaged v0.2.1 release of October 4, 2026.
This update improves widescreen presentation, fixes Teleport α and room-entry
problems, keeps enemies and text clear with the photosensitivity filter, and
introduces an optional native Continue engine alongside the regular gameplay
runtime. The native engine is still in development.
Gameplay fixes
- Fix a Teleport α arrival crash with a sparse party. Party members now use
their actual actor roles after teleporting instead of assuming roster order
matches actor order. Empty roster entries no longer overwrite a live member's
graphics pointer. This covers parties such as Ness and Jeff after another
member has been removed, in both regional games. - Fix missing NPCs and props when entering widescreen rooms. Initial map
loading and vertical scrolling finish the original NPC row before checking
the wider row. The wider row keeps consistent bounds throughout loading,
even if a fade, window effect or display-width change occurs midway through.
This fixes cases such as the missing phone and mother in Ness's home while
retaining the original appearance, ownership and capacity checks. - Expose Player does max damage in the Debug settings. The option uses the
existing player-damage rules; misses and zero-damage results remain possible. - Spawn passive cars, delivery vans and taxis across the widescreen loading
area. Their original routes, appearance conditions and collision remain
authoritative. Reserve all required worker tasks and nearby NPC/enemy capacity
before admitting extra traffic. - Fix the museum lamp appearing late in widescreen. Its photograph-trigger
script now supplies a verified initial artwork preview without running the
trigger. Check all fifteen streetlights during edge scrolling and source
activation, with artwork prepared beyond the visible viewport.
Widescreen, Steam Deck and fullscreen
- Clearly label the 16:10 (Steam Deck) display preset and document 1280×800
use. Add--fullscreento start directly in desktop fullscreen mode. - Move overworld command, carried-money, dialogue, Goods, Equip, PSI and
check/talk windows together toward the widescreen left edge, using their
original dimensions and relative offsets. This also covers the A-button
shortcut and prevents overlapping windows from leaving clipped parent menus.
Status and its PSI information remain centered. Startup and name-entry
retain their authored layouts. Direct and completed-frame rendering agree. - Move battle target-selection, Goods, PSI and temporary-message windows with
their battle command menu. Preserve text, cursors and overlap order; standalone
battle narration and HP/PP panels remain centered. - Keep the overworld wide during battle entry. The source transition mask
spans the selected canvas, fixing the snap back to native width immediately
before the battle swirl. - Keep the entire War Against Giygas intro card centered in its original
4:3 composition, including static, clean holds, palette flashes and fades.
The following logo scene restores the selected widescreen width. - Extend the animated backgrounds in coffee and tea scenes across the
selected canvas while keeping captions centered and unrepeated. Retain the
original center pixels, scroll behavior and source state, including with
direct rendering and the photosensitivity filter enabled. - Expand regional presentation regressions through the maximum supported
1024-column canvas, including display changes and unrelated-layout rejection.
Photosensitivity filter and snapshots
- Keep visible battle enemies and text windows at their original colors and
brightness while backgrounds and flashing effects remain filtered. The
exemption follows the visible sprite or window pixel, including borders,
fills, scrolling and prompt sprites; transparent or occluded pixels leave
the background filtered. - Clear exempted pixels' feedback history so moving enemies, closing windows
and changing text do not leave smoothing trails. Alternate enemy palettes,
targeting colors and the game's own fades still appear immediately. - Apply the foreground metadata consistently at desktop startup, after settings
changes and after snapshot loading. This fixes the actual frontend path that
could still blur text despite the renderer supporting exemptions. - Keep Giygas-strength smoothing active throughout the intro card, including
holds and flashes after procedural static stops. Filtering still advances
once per completed game frame, independently of the presentation frame rate. - Write snapshot format 9, preserving foreground exemption masks and
in-flight widened row scans. Formats 1–8 remain loadable with matching
game content; older snapshots captured inside a widened scan finish that row
before returning to the corrected scan order. - Existing supported ROM imports and ordinary battery saves remain usable.
No reimport or new game is required for the regular gameplay fixes.
The filter remains optional and off by default. Foreground exemptions are a
port preference; complete SNES Classic/Wii U scene equivalence remains unverified.
Optional native Continue engine
Launch with --native-session 1, 2 or 3 to continue the matching
slot in an existing regional battery save using NativeSession. The regular
launch path continues to use GameSession.
- Add native ownership for Continue restoration, map startup, world execution,
input, frame publication and the existing SPC/DSP audio adapter. Supported
gameplay runs without the compatibility gameplay CPU; the existing audio
implementation is retained. - Integrate enemy approach/contact, visible encounter transitions, battle
command menus, action scheduling, targeting, outcomes, victory and map return. - Integrate world commands, Goods browsing and Help/Drop/Give/Use actions,
equipment changes, Status and PSI help, field item/PSI effects, authored doors,
town-map entry/exit and PSI Teleport α/β travel. - Share party, inventory, battler, dialogue, window, actor and palette owners
across field and battle actions. Suspended operations resume their actual
child instead of polling input, repeating work or advancing the world early. - Preserve immutable published frames: repeated display sampling does not
advance gameplay, consume random numbers or produce extra audio. - Disable machine debug controls and machine snapshots in native sessions,
with an explanation in Settings.
This is an experimental Continue route, not a replacement for the complete
regular game. Native title/new-game, save-writing, defeat/restart, some story
services and full regional playthrough acceptance remain unfinished. Some
Japanese door-key and higher teleport-selector storage cases are explicitly
rejected. Physical text/DMA timing and native filter metadata remain open.
Native engine and cutscene development
- Add shared cinematic display, nested-event and retained-resource owners, with
separate Coffee/Tea, Sound Stone, Cast and Ending modules. - Integrate real regional Coffee/Tea Talk/Yes callers and cancelable, mandatory
and nested Sound Stone sequences. Add source comparisons for text, resources,
palettes, input order, party/RNG and returned graphics. - Implement Cast actor/map/window sequencing and native saved-photo playback
with slot selection, authored fades, directional slides and credits callbacks.
Ending event 12 remains gated while complete physical-scene acceptance is open. - Expand original-source comparisons for actor graphics allocation, lifetime,
streaming and upload order; map overlays/collision; palette changes; sector
music; party relocation; dialogue buffers and Japanese text aliases. - Add bounded source-work components for foreground scheduling, screen and
window publication, interrupts/NMI, random generation, object drawing and
HP/PP meter rolling/artwork. These retain actual source owners and publication
order; passing individual helpers does not establish complete scene timing. - Fix native selection-menu input advancement, battle window focus, graphics
publication during party relocation and NPC/enemy creation, and retained
window/background/actor resources across scene transitions. - Organize native world menus, doors, town maps, teleport, battle actions,
dialogue, cinematic and graphics services into focused modules. Expand
regional unit, integration, original-source and dependency-audit coverage.
Native cutscene work still has documented physical-frame, intermediate-picture,
input/callback and full-scene audio differences. Name entry, title cinematics
and the live photographer also need their complete native callers. These are
ongoing engine work, not claims of complete endgame or whole-game parity.
Downloads and updating
Phase-Distorter-0.3-windows-x86_64.zip— Windows application and SDL2.Phase-Distorter-0.3-linux-x86_64.zip— Linux application and SDL2/GCC runtimes.Phase-Distorter-0.3-launchers-x86_64.zip— both platforms in the combined
repository-style launcher layout.SHA256SUMS— archive integrity checks.
Extract the complete archive into a fresh folder and run Phase Distorter
or Phase Distorter.exe. The combined bundle also provides launch.sh and
launch.bat. Back up your .srm files before updating; existing imports and
saves stay in the external application-data directory.
Linux binaries require x86-64, glibc 2.43 or newer and desktop OpenGL.
Windows binaries require 64-bit Windows and desktop OpenGL. Windows
execution checks use Wine. De...
0.2.1
- Preserve the original horizontal NPC scan and add the wider scan afterward,
fixing people, lamps, presents, containers and sanctuary markers disappearing
when entering the original viewport. Cover both regions and execution paths. - Extend scripted map cutscenes and the robot ending across widescreen without
changing the source camera or scene timing. Expand captured prayer apertures
around their original focus, preserving their shape. - Add ultrawide capture padding to prevent black edge strips during fractional
camera interpolation. - Replace temporary automatic dimming with the recovered SNES Classic brightness
ramp and PSI/Giygas temporal feedback, processed once per completed game frame. - Preserve suspended battle PSI state during prayer cutscenes, fixing prolonged
stalls after battle return and supporting mid-prayer snapshot restoration. - Save snapshot format 7 with aperture, prayer/filter context and pending NPC
scans; retain loading compatibility with formats 1–6. - Rebuild both launcher applications and provide v0.2.1 Linux, Windows and
combined launcher bundles, notes, version records and integrity metadata.
0.2
Phase Distorter v0.2
Prepared October 4, 2026. Covers changes since the original v0.1 release on
September 27, including the current working-tree fixes packaged for v0.2.
This release improves widescreen presentation, motion, frame pacing, audio
delivery, controllers and debugging in both EarthBound and Mother 2. It also
includes substantial work on independent native engine components and the
organization of the source. The playable desktop application still uses the
compatibility game runtime; the full native engine migration remains in progress.
Widescreen, ultrawide and scene fixes
- Expanded world rendering now uses published actor descriptors, including
sprite parts clipped out of the original hardware object list. Nearby NPC,
enemy and prop artwork is prepared separately from gameplay activation. - Fixed streetlights, decorations and other prepared sprites being cut off
inside the original viewport or disappearing with widescreen disabled. - Reduced activation pop-in for presents, trash containers and the sparkling
Your Sanctuary boss markers. Newly created props retain their artwork until
the source publishes their first pose; opened, defeated and hidden states
still follow the game's conditions. - Corrected source/prepared NPC ownership during map loading and cutscenes,
removing duplicate bodies and noninteractive previews. Newly created Saturn
Valley actors retain their initial artwork through their first source draw. - Lumine Hall's scrolling message stays within its authored 30-column wall
patch, including direct scene rendering. The game's boss/story condition
still controls when the message appears. - Forest borders and the black void around caves and rooms extend naturally
without pulling the presentation camera away from the player. Short road
tunnels to Threed/Fourside and desert traffic retain their boundaries. - Fixed the pyramid demo's scenery and party drifting outside its circular
aperture at wide and ultrawide aspects. - Preserved authored cutscene stages, prayer apertures and fixed black borders
during direct rendering. Post-Giygas robot corpses keep their original
centered framing, and departing souls travel beyond the full wide display
before their source sprites are released. - PSI animations use the wider battle canvas while targeted effects stay
anchored to their enemy. Battle backgrounds remain visible through exit fades. - The War Against Giygas still card uses its centered 4:3 composition. Animated
Giygas static extends across wide margins; Mother 2's logo background extends
while the original logo and copyright remain centered. - Fixed repeated widescreen texture uploads turning black on the NVIDIA path.
- Added README screenshot pairs at 16:9, 21:9 and 32:9, showing identical
gameplay frames with CRT effects off and on.
Motion, performance and audio
- Added saved Native, 90–300 FPS and Uncapped presentation choices, with game
logic and generated audio retaining their native cadence. - Added direct overworld scene rendering with smooth camera/actor positions
between game frames. Unsupported raster effects and battles retain completed
game pictures; optional motion interpolation provides intermediate pictures. - Added interpolation controls, scene-cut/history resets and an exact completed
frame opt-out. Image-based interpolation adds one game frame of visual latency
and can produce blending artifacts. - Reduced original overworld slowdown with a bounded extra entity-update CPU
budget. Hardware arithmetic, transfers and frame waits retain their timing;
--original-timingpreserves the original comparison path. - Added host-owned overworld sprite allocation, custom/overlay artwork and
active-actor edge retention. The experimental widening of source gameplay
activation was disabled after reproducing sprite-pool exhaustion in the
attract demo and Twoson; visual preparation supplies the wider view. - Improved fixed-refresh pacing and matched playback audio to its cadence.
Optional saved VRR pacing is available in Display settings and through
--vrr/--no-vrr; driver/monitor VRR still needs its own configuration. - Fixed short Windows waits rounding to roughly 16 ms and limiting high-FPS
presentation. The updated wait path supports the requested higher caps. - Bounded catch-up presentation starvation during sustained host load so new
pictures continue to appear without dropping simulation or audio ticks. - Reduced rendering cost by skipping disabled background layers and decoding
tile rows once per scanline, preserving palette/scroll/transfer behavior. - Added a 64 ms playback jitter reserve and audio underrun recovery. These
improve delivery under delayed callbacks without changing generated PCM. - Warm enabled CRT shaders before timed playback; Linux requests a foreground
scheduling improvement when the existing account permits it.
CRT and reduced flashing
- Added a saved, flat CRT filter based on CRT-Lottes Fast, with scanlines,
aperture-grille shading and softness, preserving black and fractional motion.
It uses no temporal blending. - Matched direct-rendered and completed-frame CRT softness in both axes,
including verification at multiple scales on Mesa and NVIDIA. - Replaced selective effect suppression with automatic whole-picture dimming.
The default-off Photosensitivity filter checks every completed frame for
luminance, palette and pattern changes, immediately dims repeated flashing,
and gradually recovers after a quiet period. - Detection includes wide margins and the original center independently, so
dark ultrawide borders cannot dilute a central flash. High-FPS direct redraws
respect dimming, and catch-up frames advance detection exactly once each. - Improved detection of small repeated SNES palette steps in Kraken, Starman
and Giygas backgrounds. Added asset-backed PSI/background/status probes and
fixtures for lightning, white-burst and warp-flash mechanisms. - The filter is an independent implementation, with its scope and parameters
documented. Exact Wii U/SNES Mini/Switch equivalence and medical safety have
not been established.
Controllers, Settings and debugging
- Corrected SNES Nintendo Switch Online A/B/X/Y labels and Linux USB/Bluetooth
mappings, including shoulders, Start/Select and the D-pad. - Added a Controller settings tab with connected-device information, live
inputs, remapping of all 12 SNES buttons, stick deadzone and Restore defaults.
Mappings persist beside display settings and honor--config/--no-config. - Fullscreen hides the gameplay bar until the pointer reaches the top edge,
then overlays it without resizing the game picture. - Added Debug controls for infinite HP/PP at 999/999, noclip, enemy avoidance
and playable-party selection. Story-triggered battles remain available. - Added Player does max damage: successful damaging player attacks use
the source damage routine's 65,535 maximum while retaining its immunity,
zero-damage and enemy/ally rules. - Added a searchable teleport catalog covering 385 named areas and all
scripted warps/door landings, totaling 1,472 choices. Debug teleports fade
fully to black before map loading and use the original arrival fade-in. - Added named persistent save-state snapshots in Debug, with per-game lists,
dates/frame numbers, save/load, refresh and confirmed deletion. Loads validate
format, game content and checksum before replacing play; failed loads leave
the running session intact. Snapshot restoration also restores debug switches
and resets host presentation/audio history. - Added
--replay-onlyfor deterministic desktop input replay without physical
gameplay-button interference, while retaining window and Settings controls.
Gameplay corrections
- Fixed the crash after Paula's party-join jingle by accepting the source's
hidden sprite initialization marker until a visible frame is selected. - Restored Threed/Threek's Investigator after Master Belch and kept the Ghost
Enthusiast available afterward, preserving original placement, sprites and
dialogue in both games. The Investigator's post-Belch condition follows an
inference about the unused original appearance flag. Existing imports and
normal saves need no conversion or reimport.
Native engine and source work
- Introduced named source-derived C++ gameplay continuations for 808 US and
783 Japanese dialogue, cutscene, entity, NPC and enemy routines, preserving
instruction retirement and the original imported content. - Split simulation, scene capture/rendering, presentation scheduling, desktop
window/input, CLI/preferences, replay, storage and audio delivery into explicit
owners.GameSessioncan be built and tested without SDL/frontend dependencies. - Built independent native world modules for maps, terrain/collision, area
palettes, map animation/streaming, actors and lifecycle, action programs,
appearance resources, overlays, camera focus, pathfinding, enemy activation,
contact and encounter-effect preparation. - Built independent native party/story modules for formation, inventory, HP/PP
rolling, RNG, dialogue control flow and substitutions, regional fonts, text
windows, prompts/menus, Talk/Check, gifts, character growth and credits. - Added native battle components for roster/admission, enemy/background artwork,
startup, dead-player checks, names/grammar, shields/palette effects, PSI,
targeting, initiative and turn scheduling. These are component-level migration
results; the complete battle, startup and world-return flow is still open. - Added a native save codec and Continue-prefix restoration work, plus source
comparisons for input/control modes, walking, retained camera/actor identity
and map...
0.1.1
Fixed title screen and photo-sensitivity modes Photosensitivity filtering targets identified flashing effects, including battle effects and Franklin Badge lightning. “The War Against Giygas” displays at 4:3. Mother 2’s logo background supports widescreen, keeping the logo centered.