Sylpheed port agent b632602517 docs: P3 -- the boot runs unattended, and four answers taken as given
Gate: `godot --path port -- --boot --film=/tmp/boot` runs publisher_logo ->
developer_logos (4.65 s) -> title (8.57 s), holding on the title after 13.05 s,
each screen fading in, holding, and fading through black into the next.

verify-screen now covers all 16 screens and passes `--all` to the reference
renderer: the exporter addresses by pak entry index, which is the numbering
`--all` uses, and without it `--build 10` would land on entry 12. The four new
splash bundles come in at max 1-2/255. The three known differences are unchanged.

Also recorded, taken from the RE agent rather than re-derived:

* Focus stays "replace" -- over-vs-instead is unobservable (the focused sprite
  covers the base at 100 % of base-visible pixels; the two compositions differ by
  RMSE 1.1, under the gamma floor). The port guessed right for the wrong reason.
  The real gap is that ptbtn0Nf.rat declares TWO sprites -- a glowing ring, then
  the label -- where ptbtn0N.rat declares one. P5's, and the ring's placement is
  not decoded, so it will be authored from the capture and marked as such.
* RMSE against captures has a FLOOR: capture ~ 255*(render/255)^g, g ~ 1.49 menu
  and EXTRAS, 1.34 title, and it is a ramp the GAME installed, not a capture-path
  artefact to subtract. Narrow reach (fitted on mostly-dark patches), so the port
  will not extrapolate it and will not apply it to rendered output. It is a
  comparison constant, not a rendering one.
* Rotation is escalated to a human and the port has NOT acted. The RE half is
  answered -- about the declared pivot, measured -- and it has zero effect on the
  five screens at rest.
2026-08-29 08:27:41 +00:00

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:

  1. Godot cannot read IPFB archives, RATC bundles, T8aD textures, XMA banks or WMV video, and it should not learn to.
  2. 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.

Description
No description provided
Readme MIT 820 MiB
Languages
Rust 57.6%
Python 27.7%
Shell 10.6%
GDScript 3.5%
Dockerfile 0.4%
Other 0.1%