WHAT I WANTED FROM IT: 56cc7ac, "a RATC child's name is stated, not inferred". A child was named by scanning backwards for the last printable run of bytes before its magic. For `pteff05.t32` the three trailing payload bytes are 38 41 58 = `8AX`, which beat the real name, so the child registered under a name no element declares and resolved to no sprite. `pteff05.t32` is the full-resolution background of all five menu screens. Every menu render this port has produced has been missing its background, and P1 wrote that up as a fact about the disc -- "the bundle carries zero RATC children for either, so there is no texture on the disc to export". That is retracted in docs/DECISIONS.md rather than edited away. The re-export is contained: six new sprites and nothing else. pteff05 on main_menu/extras and their JP twins, pteff04 on both titles. Each gains a `sprite` line and moves `layer_source` from "implied" to "sprite" -- the layer key is now read from the file instead of the decoders' table of keys measured off the running game, which is the ratchet turning the right way. pteff05.png is 1280x720; ptbase.png, which had been carrying the background alone, is 640x360 drawn at 200 %. Measured against the live capture rather than the other renderer: settled main_menu RMSE 8.05 % -> 5.92 %. The reference renderer was missing the same element for the same reason, so no renderer-vs-renderer diff could have found this -- the third time a capture has caught something both renderers agreed on.
Sylpheed Godot
A clean-room Godot 4 port of Project Sylpheed: Arc of Deception, starting with the menu shell: developer splash → intro video → title → main menu → submenus.
You need your own copy of the game. Nothing in this repository is game content. An offline exporter reads the disc you supply and writes an open, moddable asset tree; the Godot project reads only that tree and never touches a disc format.
your disc ──▶ crates/sylpheed-export ──▶ export/ ──▶ port/ (Godot 4)
(Rust; decoders come from JSON + PNG reads ONLY
sylpheed-formats) + OGG + OGV open formats
Why the wall
Two reasons, and the second is the interesting one:
- Godot cannot read IPFB archives, RATC bundles, T8aD textures, XMA banks or WMV video, and it should not learn to.
- Modding is a goal of this port. If the runtime reads the original formats, modding means reverse engineering. If it reads JSON and PNG, modding means opening a file.
Where the knowledge comes from
The decoders live in sylpheed-formats, pinned by revision — a
separate project, where the reverse engineering happens. Its
docs/port/HANDOFF.md is the contract: what has been decoded, what was measured
off the running game, and what is known to be undecodable. Read it before
assuming a value is on the disc.
Layout
crates/sylpheed-export/ |
disc → open formats. Regenerates export/ wholesale |
port/ |
the Godot 4 project |
authored/ |
decisions that are not on the disc, each with its reason |
export/ |
generated, gitignored, never hand-edited |
tools/ |
verification harnesses that hold the port to the reference renderer |
docs/ |
the mission, the format spec, the agent's loop prompt |
Verifying
sylpheed-cli screen render -- built from the same sylpheed-formats revision
the exporter is pinned to -- is the reference renderer. tools/verify-screen
draws every exported screen both ways and reports the largest per-channel
difference in the frame:
tools/verify-screen # every screen in the manifest
tools/verify-screen main_menu # one of them
Where the two disagree, one of them is wrong; docs/DECISIONS.md says which and
why, rather than tuning the port until the number goes down.
Status
P1. The exporter writes GP_TITLE's twelve screen builds and their sprites,
and the Godot project draws any of them statically at 1280x720 from that tree
alone. main_menu matches the reference renderer to within 3/255 on every
channel of every pixel. Next: P2, keyframe animation.