The exporter transcodes ADV.wmv and S00A.wmv to Ogg Theora and records the exact ffmpeg command in the manifest, per MISSION §6, so a modder who dislikes the quality re-runs one line rather than reverse-engineering what was done. Quality was MEASURED, not judged: SSIM against the decoded source over a 10 s sample is 0.9863 / 0.9896 / 0.9924 at -q:v 6 / 8 / 10, and at 200 % zoom on the reel's hardest case -- fine serif text and soft gradients over near-black, where Theora breaks first -- q8 is indistinguishable. So MISSION §6's permitted FFmpeg-GDExtension fallback is NOT needed and is NOT being proposed. No new runtime dependency. -ac 2 because the source is 6-channel WMA Pro; that downmix is a decision, so it lives in the recorded command rather than in prose. Encoding is cached on a .cmd sidecar holding the command and the source size -- any change to either re-encodes. export/ is still regenerated wholesale; this is derived state validating derived state, not a hand-edit, and without it every re-export pays ~4 minutes to produce a byte-identical file. The player renders INTO the design SubViewport. Parenting it to the Boot node played the movie to the window instead, and every captured frame came out black -- which is worth more than a capture-bug note: a movie outside the 1280x720 design space is outside the coordinate system every screen is expressed in. (A) skips a movie, because Q9 measured that (title at 57 s vs a 193 s baseline). NOT VERIFIED, and stated as such: audible playback. This container has no audio device and Godot falls back to the dummy driver. The Vorbis stream exists, is 2-channel and decodes; whether Godot emits it is unconfirmed.
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.