AstralChain-PC
AstralChain-PC is an unofficial Windows port of Astral Chain made by static recompilation with Vulkan support.
- Type: PC port
- Game: Astral Chain
- By Puddz
- Source: https://github.com/Puddz/AstralChain-PC
README
Astral Chain PC
Important
This project was built entirely with AI. All of the code, tooling, reverse engineering and documentation in this repository was written by an AI model (Anthropic's Claude, through Claude Code, and Codex), directed, tested and reviewed by the project's owner. It is shared as is, as a fan project. If you prefer not to use AI-written code, you are free to skip it. As with any code from the internet, you build and run it at your own discretion.
An unofficial, experimental native Windows port of Astral Chain (Nintendo Switch, PlatinumGames, 2019), made by static recompilation. The game's ARM64 code is translated to C and compiled into an ordinary Windows x64 program, and its NVN graphics calls run on Vulkan. There is no emulator or JIT.
You build it yourself from your own legally dumped game and keys. This repository contains no game code, assets,
shaders, keys or firmware, and never will. Everything the setup produces comes from your dump: do not share the
build/, game/ or userdata/ folders.
AI disclosure. Most of the code, tooling, reverse engineering and documentation here was written by Claude (Anthropic) through Claude Code, directed and tested by the repository owner. It is shared as-is as a fan project.
Status
| Tested | From the title screen through File 01 (its boss fight included) and File 02, into File 03, with the in-game camera taking photos (played by the owner) |
| Frame rate | 60 fps target, cutscenes included (Dynamic-FPS patch, game speed correct at any frame rate). RTX 4090 / Ryzen 7 7800X3D: 57-60 fps. AC_CUTSCENE_FPS=30 plays cutscenes exactly as the original does |
| Stability | Driver watchdog plus a GPU hang stop. No driver resets since 2026-10-19 across dozens of test runs |
| Saving | Works (tested in File 01) |
| Shader pauses | Shaders are compiled for your GPU before the game starts. Simulated first play of an area never recorded: 7 pauses over 50 ms, 0.49 s in total (26 and 8.0 s before 2026-10-21) |
| Controllers | Keyboard and mouse, and Xbox-style pads through XInput (every connected pad is read). Other pads (Switch Pro Controller, DualSense, DualShock 4, 8BitDo) go through SDL3: tested with a virtual SDL pad only, not yet with a real one |
| Integrated GPUs | A memory copy meant for dedicated graphics cards is off on integrated GPUs: highway chase effects at 46-56 fps instead of 5-6 on an Intel Arc laptop (Linux). Not yet tested on a Windows integrated GPU |
| Not yet tested | The rest of File 03 and everything after it |
Known issues are listed under Known issues.
What's new
Fixes marked not yet confirmed were tested in scripted runs, but not yet confirmed in play.
2026-11-11
- Saves and settings made safer, and several stops and freezes addressed (from a review of the code; not yet
confirmed in play). Nothing moves: saves, settings and game data stay where they are, and the next Play
rebuilds the game once as after any update.
- Save backups never hold a half-written save: the automatic backup next to the saves (
...-snapshots) is now taken only while the game is not writing, and thrown away and taken again if the game changed its save during the copy. Before, a backup taken in the middle of the next save could be kept as complete. userdata\launcher.iniis not lost or overwritten: the in-game menu no longer writes a new file when it cannot read the old one (which dropped key bindings and the other settings); the launcher keeps what the in-game menu saved while it was open, and writes the file in one step. The in-game sliders save when let go, not at every step.- A folder that was copied or moved is built again on the next Play. Before, a copy kept reading from, and saving into, the folder it was copied from, and a moved folder did not start (exit code 31).
- Folder names with letters outside English (for example
C:\Users\Jörg\...): the game no longer closes at every start with exit code 31. - A rare freeze or stop in the game's thread locks addressed: two places changed a lock's state in two steps while the game changed it too.
- A fast mouse can no longer stop the game (
host-message-budget) after a long stall. - Setup: a folder path with
[or]is reported at the start instead of failing later; the GPU warm-up's time limit now works when it hangs; a failed BC7 textures preparation no longer blocks Play; a build cancelled at the wrong moment no longer fails every later build. - Reports from a downloaded zip say which version it is (a
VERSIONfile filled in when the zip is made).
- Save backups never hold a half-written save: the automatic backup next to the saves (
- Detailed frame rate panel (issue #28; not yet confirmed in play): Settings > Display > Show the frame rate (also in the in-game menu) is now Off / Frame rate / Detailed. Detailed shows a frame time graph, the 1% and 0.1% lows, GPU and CPU load, video and system memory, the GPU's temperature, power and clock, the GPU's busy time and the waits per frame, and the window, picture and 3D render sizes. Temperature, power and clock come from the graphics driver's own library (NVIDIA, AMD; nothing extra is downloaded); Intel GPUs show the rest. Tested on NVIDIA only.
- Quit game in the in-game menu, and Swap A and B for controllers (PR #23, by red-Geck0; confirmed in play): see In-game menu and Controllers under Playing.
- Sharp picture with Windows display scaling (by red-Geck0, from issue #25; not yet confirmed here): with scaling above 100% (common on laptops and handhelds), Windows gave the game a smaller screen and stretched the result, so the picture was blurry. The game now uses the screen's real pixels. In a window it opens at 1600x900 real pixels, so with scaling the window looks smaller than before.
- Launcher background no longer tiles when Windows enlarges the launcher after it opens (PR #24, by red-Geck0).
2026-11-10
- Lights missing in blocks of the screen fixed (issue #20; confirmed in play): dark, stair-stepped blocks, for example on the side of the truck on the street after the highway chase, at any screen shape.
- Input recorder for reporting problems: Settings > Troubleshooting > Record controller input records your buttons and sticks from launch with a copy of your save, into a folder next to your save. Zip it and attach it to an issue, and the problem can be played again on another PC.
- Frame rate counter: Settings > Display > Show the frame rate (see 2026-11-11 for the detailed panel).
2026-11-09
- Much less processor use (not yet confirmed in play): three of the game's worker threads each kept a core busy doing nothing; they now really sleep. Highway chase on the test PC: 4.6 busy cores down to 0.8, frame rate the same or slightly better. Mostly matters on laptops (less heat and power).
- For GPUs with 4 GB of video memory (experimental, not yet tested on a 4 GB GPU): Settings > Shaders and performance > Keep the game's memory copy in system RAM (issue #17).
2026-11-08
- Title screen (not yet confirmed in play): "Port by Puddz" above the version number (on by default; Settings > Display, or the in-game menu, turns it off), and an option for the twin on the roof: the game shows the twin you did not choose; Settings > Display > Title screen shows the twin you play as (off by default) shows yours. See Title screen under Playing.
- All the settings explained in one place: docs/settings.md.
- The game window comes to the front when it opens (issue #15; not yet confirmed): the game reads keys and controllers only while its window is the active one, and it used to open without asking to be (a controller doing nothing until a click; in fullscreen, no start prompt).
- Installing works when Python cannot check a download's certificate (issue #16; not yet confirmed): setup then downloads its tools with Windows' own downloader (each still checked against its SHA-256).
- Saves are flushed to disk when the game closes a save file and when it commits, and save backups are kept only when complete (not yet confirmed).
2026-11-04
- Controllers other than Xbox pads (issue #10): Switch Pro Controller, DualSense, DualShock 4, 8BitDo and most pads SDL knows now work, through SDL3 (setup downloads it). Buttons follow their position, as on the Switch. See Controllers under Playing. Switch 2 controllers are not supported yet. Not yet confirmed with a real non-Xbox controller (tested with a virtual SDL pad: every button, trigger and stick direction arrived).
- Every connected Xbox-style pad is read (PR #13, by lcd1232), not only the first one found: Steam Input's virtual pad, or a pad plugged in after the start, used to be ignored until a restart.
- Prepare graphics on a separate thread: hangs and crashes fixed, seen at high frame rates (with the uncapped frame rate, the title screens run at 200+ fps): the list of GPU results waiting to be copied back was changed by two threads at once, and a fence wait could end before its work reached the GPU. In tests with both settings on, 25 of 25 runs through the title screens were clean (about a third hung or crashed before). Not yet confirmed in play.
- Title screen flicker fixed (reported in play: about every 10 s at 60 fps, nearly all the time uncapped): for a frame the background movie was drawn squashed into a band between black bars. The game had rewritten the vertices of its menu and movie quads by the time the GPU read them; small draws now take a copy of their vertices when the port handles them. Uncapped title screen, 25 s captured per run: 1-12 squashed frames per run before, none in 5 runs after, same frame rate (~186 fps); street walk unchanged (about 70 fps). Confirmed in play (2026-11-06).
- Faster atomic memory operations: each one the game makes checked its memory against every mapping table; the last region that passed is now kept until a mapping changes. Street after the opening helicopter scene, uncapped (RTX 4090 / Ryzen 7 7800X3D, 3 runs each): 67.0 -> 71.4 fps; at the street's start 55.6 -> 58.5 fps, slowest 2 s 41.8 -> 44.4. Not yet confirmed in play.
- Uncapped frame rate (experimental): Settings > Game in the launcher, or the in-game menu. Gameplay is no longer held to 60 fps; cutscenes stay at 60 (their cuts are timed for it), and it stops at 450 fps, where the 60 fps patch's game timing ends. Most places are limited by the CPU: on the street after the opening helicopter scene 64-66 fps instead of 60 (RTX 4090 / Ryzen 7 7800X3D). The 60 fps patch scales game speed to the measured frame time up to 480 fps. Reported in play: it does not feel right above 60 fps, for about 10 fps more; being looked into.
- In-game settings menu: F1, or Minus and Plus together on a controller, opens it over the game, which pauses as under the Switch's HOME menu. Button icons, rumble strength, the mouse settings, fullscreen, 30 fps cutscenes and keeping the game running while minimized change at once; handheld mode, presentation mode and the separate graphics thread from the next start. Changes are saved for the launcher too. Navigate with the mouse, the arrow keys or a controller (A selects, B goes back); Esc, F1 or Minus and Plus close it. Confirmed in play: F1 opens it, the game pauses, navigation works, changes apply and the launcher shows them.
- Xbox and PlayStation button icons, and automatic icons (the new default): the game's button prompts follow what you last used, keys and mouse buttons for the keyboard, the buttons of an Xbox, PlayStation or Switch controller for a controller (by position: the right face button is Xbox B and PlayStation circle). The style can also be fixed in the menu or the launcher. Not yet confirmed in play.
- Rumble: controllers rumble when the game asks for it (it used to be dropped), through XInput for Xbox pads and SDL3 for the others. Settings > Controller > Rumble strength (0 turns it off). The game asks for weak rumble (made for the Switch's actuators); weak values are raised for PC pads' motors, as yuzu does. Stops when the window loses focus or the game closes. Confirmed in play (rumble works; an 8BitDo controller's buttons work).
- Integrated GPUs (PR #13, by lcd1232): on Intel and AMD integrated graphics, a memory copy meant for graphics
cards with their own memory is now off; on an Intel Arc laptop (Linux) the highway chase's effects went from 5-6
fps to 46-56.
LARECOMP_VK_GMEM_FAST=1turns it back on. Not yet tested on a Windows integrated GPU. Discrete GPUs are unchanged. - Occasional stop at startup (
host-shared-placeholder-reserve), seen about once in 20 starts after the controller change: Windows had placed one of the program's own thread stacks where the game then put one of its thread stacks. The game now places its memory around such allocations. Forced in a test (a large block reserved there on purpose): the game stopped without the fix and played with it.
2026-10-27
- In-game camera: the camera never locked on to anyone, so no name label appeared and photo quests (such as Lappy's) never completed. The game measures how much of a subject is visible with the GPU, and reads that count a frame later without waiting; the count always read 0. Photos are also read back from the GPU now. Confirmed in play (the owner found the last part of this fix).
2026-10-26
- Street after the opening helicopter scene: it was held at 33-53 fps on a fast PC (RTX 4090 / Ryzen 7 7800X3D, CPU-bound) by thousands of small memory-tracking queries a second. They are now grouped: average 55.6 → 58.7 fps there at 2560x1440. Not yet confirmed in play.
- Settings > Prepare graphics on a separate thread (experimental), off by default: the game's render thread no longer translates and submits each frame itself. On the same street: average 59.9 fps, the slowest 2 s about 57. Not yet confirmed in play; sound may run slightly later relative to the picture with it on.
- Brightness pumping in a dialogue after the opening street fight: the picture brightened over a few frames and snapped back. A compute shader that averages the scene's brightness read stale data (threads of a group passed a barrier early); the measured average is now steady in every frame. Not yet confirmed in play.
2026-10-25
- Mouse support. Click in the game window to give it the mouse: it turns the camera, left click attacks (ZR), right click calls the Legion (ZL), the wheel changes weapons. Hold Alt to get the cursor back. Sensitivity and invert in Settings > Mouse and keyboard.
- Keyboard and mouse button icons in the game. The button prompts show the keys and mouse buttons you set instead of the Switch buttons (Settings > Mouse and keyboard > Button icons to keep the Switch ones).
- Controls: two bindings per action (main and alternative), mouse buttons and wheel included. New defaults: Shift sprints, Space dodges, Tab is IRIS, Esc the pause menu (the old keys stay as alternatives). Keys you had changed in Controls stay on their actions; a new default that would clash with one of them is left empty.
2026-10-24
- Flickering light in the opening helicopter cutscene: the whole picture jumped between two brightnesses. The game asks for depth clamping, which was ignored, so an effect card it places right in front of the camera was cut away in some frames and drawn in others. Depth clamping is now on. On a test save, that stretch of the cutscene went from 150-200 brightness jumps per 500 frames to 1-2 (camera cuts). The cutscene now stays at the darker of the two brightnesses. Not yet confirmed in play.
- Setup after picking the wrong file: once a wrong base game or update had been picked, every retry failed with the same "belongs to program" message. Setup now extracts again for any other file, and says which file to pick.
- Experimental features on a separate branch:
upscalinghas an AMD FSR 1 upscaling option, render resolutions from 1920x1080 to 3840x2160, and ultrawide sizes (21:9 and 32:9). They are not part of this version yet; see that branch's README.
2026-10-23
- Shorter wait before the game after a play session. The game records the shader combinations it meets in play; the next Play then redid all of "Preparing shaders" and "Compiling for your GPU". Now only what was added since the last time is done. On the test PC, with about 15% new records, the wait went from about 3 s to under 1 s (the saving is larger on slower PCs). A new version still prepares everything once.
- Fullscreen (issue #5): F11 or Alt+Enter switches between a window and borderless fullscreen on the window's monitor (the display mode is not changed). Settings > Display > Start in fullscreen starts in it.
2026-10-22
- Python no longer needs to be installed (issue #3). Setup downloads its own Python 3.14 into
tools\python(pinned, checked by SHA-256), so the version installed on your PC, if any, does not matter. An existing.venvthat works is kept. - Setup from a ZIP download stopped at "unreviewed Maxwell translator identity" (issue #2): a file check depended on line endings. Fixed; confirmed by the reporter.
- Green flashes in the title movie (and noise or green in the tutorial clips): video frames were sometimes drawn before the decoded picture reached the GPU, for up to 8 frames. Textures written by the CPU are now checked every frame. In a recorded start, the title movie had about 50 green frames before and none after. Not yet confirmed in play; the tutorial clips are untested.
- Handheld mode (Settings > Display, off by default; issue #4): the game runs as on a Switch out of its dock and renders at 1280x720 instead of 1600x900 (36% fewer pixels), for GPUs that cannot hold 60 fps. The picture is scaled to the window as before. Its frame rate gain was not measured: the test PC's GPU is not the limit.
2026-10-21
- Keyboard controls can be changed: Controls in the launcher (click a key, press the new one).
- Optional BC7 texture compression (Settings, off by default), in two versions: converted on the GPU while playing, or prepared once at setup. Both save about 2.5 GB of video memory; see Texture compression for what each costs. Not yet confirmed in play.
- Launcher.
Astral Chain Launcher.exe: install, compile shaders, play without console windows, play with diagnostics and create a bug report, and settings for every option, over original key art (six backgrounds to pick from with the arrows at the top right). See Playing. - Shaders compiled for your GPU before the game starts ("Compiling for your GPU", about 10 s the first time). In-game, pipelines are linked from those compiled shaders instead of being compiled whole, and the recorded ones are built before their first draw. Most shader pauses in new areas are gone (see Status). Not yet confirmed.
- ASTC textures are decoded on the GPU instead of the CPU: no more 60-240 ms pauses when large textures load. Checked byte for byte against the CPU decoder.
- Crash at the File 01 boss (when it throws a container): the game stopped on a rumble value out of range. It now ignores such values. Not yet confirmed.
- NSP base games stopped setup at the RomFS step (issue #1). Setup now gives NSTool both the base game's and the update's title keys. *Not yet