Merges the Godot port into the reverse-engineering repository, preserving both
histories -- 1019 commits of corpus plus the port's 31, brought in by subtree
merge and then moved into place so git can follow each file across the rename.
The reason is not tidiness. The two-repo split forced the exporter to depend on
the decoders by pinned revision, and that created a whole class of failure that
now disappears: a sha reachable only from a topic branch, orphaned by a
squash-merge, breaking a fresh checkout silently at build time. It also forced a
live read-only mount of one agent's working tree into another's container, which
is why a contract file could move mid-iteration. With a path dependency, a
decoder change and the exporter change it requires land in the same commit or
not at all.
Canary stays separate: it is a fork tracking upstream.
New structure for the long term:
docs/game/ how the game is NAVIGATED -- menus, modals, prompts, alerts,
and in-game flight. Written so nobody rediscovers it. Mostly
open questions on purpose; the in-game tutorials are the
resource for the flight half.
docs/port/MODDING.md
modding as a constraint on the exporter TODAY, not a later
feature: one logical asset in one file (the disc splits nearly
everything, and resolving that is the exporter's job), names a
person recognises, PNG/OGG/OGV/JSON only, base-and-overrides so
re-exporting is always safe, provenance in every file.
data/base + data/mods
generated tree and drop-in overrides, both gitignored
exchange/ transient inter-agent files, deliberately outside history
docs/agents/ the team protocol
Both the README and the navigation doc lead with the correction that cost the
most: the oracle is the real game under Xenia Canary. Reborn's renderer is a
hypothesis under test, it has been wrong, and treating it as ground truth
propagated into three documents and both agents before a human caught it.
Scripted modding stays possible without being built: no screen name is hardcoded
in GDScript and there is no native code in port/, which is what Godot Mod Loader
needs to be able to substitute behaviour later.
56 lines
2.8 KiB
JSON
56 lines
2.8 KiB
JSON
{
|
|
"format": "sylpheed.flow/1",
|
|
"_": [
|
|
"The boot sequence. AUTHORED, and it has to be: HANDOFF Q6 closed this with a",
|
|
"negative -- the order is in none of the four places it could have been. It is",
|
|
"not in config.ini's empty [SYSTEM], not in the movie manifest (which carries",
|
|
"assets, not transitions), not in a persistent GamePart field (the requested id",
|
|
"lives only as a stack argument in flight), and `GP_ADVERTISE_DEMO` has zero",
|
|
"xrefs of any kind. A transition is a call with a name argument, chosen by code.",
|
|
"",
|
|
"So this file REPRODUCES AN OBSERVATION. The sequence below is what the RE",
|
|
"agent watched the game do, not what any file on the disc says it does. Nothing",
|
|
"here may be presented as decoded."
|
|
],
|
|
"boot": [
|
|
{
|
|
"screen": "publisher_logo",
|
|
"why": "The SQUARE ENIX wordmark is the first thing the boot shows -- RE agent, 2026-08-29. Entry 10 of the pair; 13 is its region twin and the port shows one, not both."
|
|
},
|
|
{
|
|
"screen": "developer_logos",
|
|
"why": "GAME ARTS / SETA / studio anima, after the publisher wordmark. HANDOFF Q2."
|
|
},
|
|
{
|
|
"video": "ADV",
|
|
"why": "HANDOFF Q9, DECODED from the movie manifest: ADVERTISE_MOVIE -> ADV.wmv, and the boot intro and the attract movie are the SAME asset -- there is no separate boot slot. Its POSITION here (after the developer logos, before the title) is measured, not decoded: it is the order the RE agent watched the game boot in.",
|
|
"skippable": true,
|
|
"skippable_why": "HANDOFF Q9: one (A) press skips a movie -- measured, title reached at 57 s against a 193 s baseline."
|
|
},
|
|
{
|
|
"screen": "title",
|
|
"why": "HANDOFF Q2/Q6: the boot reaches the title after the intro movie. The port holds here -- nothing takes the title's place until P5 gives it somewhere to go."
|
|
}
|
|
],
|
|
"dwell": {
|
|
"_": [
|
|
"DELIBERATELY EMPTY. Each screen's dwell is its own keyframe group -- the",
|
|
"publisher wordmark reaches its hold at t=235 (3.92 s) and the developer",
|
|
"logos at t=190 (3.17 s), both read from the disc. Holding beyond that would",
|
|
"be a number nobody has measured, so the sequencer holds for zero extra time",
|
|
"and the pacing is the disc's own.",
|
|
"",
|
|
"When a capture times the real boot, the extra hold per screen goes here."
|
|
]
|
|
},
|
|
"screens": {
|
|
"_": [
|
|
"What each button does. NOT FILLED IN -- that is P5. HANDOFF Q4 measured the",
|
|
"destination screens and the RE agent later decoded that a transition is a",
|
|
"lookup by NAME, giving a candidate vocabulary (TITLE_SCREEN, TITLE_MENU,",
|
|
"LOADING, DIFFICULTY, EXTRA_MENU, TUTORIAL_MENU). Those are the right `goto`",
|
|
"targets when this is written, marked as the name match they are."
|
|
]
|
|
}
|
|
}
|