This repository has been archived on 2026-09-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Sylpheed port agent 0a026074d3 port: play the exit ramp, and run the boot sequence unattended
P3. The exit is the group playing ITSELF out, not a black rect over a frozen
screen -- and that was settled by a test that discriminates rather than by
plausibility. Under the black-rect model every region is scaled by the same
1-alpha, so the button/background brightness RATIO would hold constant through
the fade; measured, it falls 6.495 -> 5.574 -> 3.105 -> 2.125 -> 1.935.

Implemented by giving the final untimed keyframe a SYNTHETIC time,
exit_ramp_units after the last timed one, then interpolating it like any other
frame. One code path: arriving and leaving differ only in how far `t` is allowed
to run, not in kind. `holding` is what the sequencer clears to send a screen away.

The sequencer waits on nothing the disc does not carry. A screen holds until its
own group has arrived, then plays out; `dwell` in flow.json is deliberately empty
because each screen's dwell IS its keyframe group (publisher wordmark 3.92 s,
developer logos 3.17 s, both read from the disc). Any extra hold would be a
number nobody measured.

The last screen keeps holding -- nothing is taking the title's place, and a boot
that ends by fading to black looks like a boot that crashed.

flow.json reproduces an OBSERVATION and says so in its header: Q6 closed with a
negative, the order is on the disc nowhere, a transition is a call with a name
argument chosen by code. The intro video's place in the real boot is named as a
gap rather than the order being quietly rewritten to hide it.
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 426 KiB
Languages
Rust 55%
Shell 30.3%
Dockerfile 8.7%
Python 6%