Compare commits

..

1 Commits

Author SHA1 Message Date
06601c2a48 docs(re): adopt the homeless disc-contents page, re-measured
`GAME_CONTENTS.md` sat in the workspace root through the whole consolidation,
adopted by neither repo -- the corpus documents formats in depth but never said
what files the disc holds or where they sit.

Re-measured rather than transcribed, and that caught a real error: the source
placed `resource3d/`, `DefTables` and `MiscBin` under `dat/`. All three are in
`hidden/` -- which is why `SYLPHEED_RES3D` points at `hidden/resource3d`.
Counts, the language table and `media_id` (0x2D2E2EEB, from the XEX header)
re-verified against the retail extract.

Half the source was pre-RE speculation phrased as status -- `dat/*.pak` marked
"Unknown, magic bytes TBD" when the container is decoded disc-wide, plus a table
guessing each archive's contents from its name. Carrying that forward would put
claims into the corpus the corpus has already refuted, so it is dropped and the
page says what was dropped and why. INDEX.md stays the single authority on
format status.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 21:07:03 +02:00
25 changed files with 159 additions and 57 deletions

View File

@@ -7,8 +7,7 @@ use std::process::Command;
use sylpheed_formats::media; use sylpheed_formats::media;
fn main() { fn main() {
let disc = let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&disc); let src = media::DirectorySource::new(&disc);
for bank in ["BGM_103.slb", "BGM_102.slb", "BGM_001.slb"] { for bank in ["BGM_103.slb", "BGM_102.slb", "BGM_001.slb"] {
match media::sound_bank_riffs(&src, bank) { match media::sound_bank_riffs(&src, bank) {

View File

@@ -18,8 +18,7 @@
use sylpheed_formats::media; use sylpheed_formats::media;
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&root); let src = media::DirectorySource::new(&root);
const WANT: [usize; 2] = [3_876_864, 3_930_112]; const WANT: [usize; 2] = [3_876_864, 3_930_112];
let (mut found, mut matches) = (0usize, Vec::new()); let (mut found, mut matches) = (0usize, Vec::new());

View File

@@ -20,8 +20,7 @@ use std::collections::BTreeSet;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_DIALOG.pak")).expect("GP_DIALOG.pak"); let ar = pak::PakArchive::open(format!("{root}/dat/GP_DIALOG.pak")).expect("GP_DIALOG.pak");
let sets: Vec<Option<BTreeSet<String>>> = ar let sets: Vec<Option<BTreeSet<String>>> = ar
.entries() .entries()

View File

@@ -17,8 +17,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
// 🔴 WIDENED 2026-08-31 to every pak, to check the Decoder's rival search // 🔴 WIDENED 2026-08-31 to every pak, to check the Decoder's rival search
// independently. They report zero four-button builds within 6 px of // independently. They report zero four-button builds within 6 px of
// 259/329/399/469 anywhere on the disc, which turns "another dialog with // 259/329/399/469 anywhere on the disc, which turns "another dialog with

View File

@@ -8,8 +8,7 @@
use sylpheed_formats::{pak::PakArchive, ui_layout}; use sylpheed_formats::{pak::PakArchive, ui_layout};
fn main() { fn main() {
let disc = let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = PakArchive::open(format!("{disc}/dat/GP_TITLE.pak")).expect("open"); let ar = PakArchive::open(format!("{disc}/dat/GP_TITLE.pak")).expect("open");
let e = &ar.entries()[4]; // entry 4 = the English title let e = &ar.entries()[4]; // entry 4 = the English title
let bundle = ar.read(e).expect("read"); let bundle = ar.read(e).expect("read");

View File

@@ -48,8 +48,7 @@ fn main() {
.unwrap_or(8); .unwrap_or(8);
unsafe { OFFSET = off }; unsafe { OFFSET = off };
println!(" reading the loop length at header +0x{off:02x}"); println!(" reading the loop length at header +0x{off:02x}");
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -11,8 +11,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -11,8 +11,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_TITLE.pak")).expect("GP_TITLE.pak"); let ar = pak::PakArchive::open(format!("{root}/dat/GP_TITLE.pak")).expect("GP_TITLE.pak");
let (mut total, mut hits, mut multipose) = (0usize, 0usize, 0usize); let (mut total, mut hits, mut multipose) = (0usize, 0usize, 0usize);
for (i, e) in ar.entries().iter().enumerate() { for (i, e) in ar.entries().iter().enumerate() {

View File

@@ -7,8 +7,7 @@ use std::process::Command;
use sylpheed_formats::{media, slb::VoiceLang}; use sylpheed_formats::{media, slb::VoiceLang};
fn main() { fn main() {
let disc = let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&disc); let src = media::DirectorySource::new(&disc);
for movie in ["ADV", "S00A", "RT01A"] { for movie in ["ADV", "S00A", "RT01A"] {
let Some((s, e)) = media::resolve_movie_voice_region(&src, movie, VoiceLang::English) let Some((s, e)) = media::resolve_movie_voice_region(&src, movie, VoiceLang::English)

View File

@@ -1,7 +1,6 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_READY_ROOM.pak")).unwrap(); let ar = pak::PakArchive::open(format!("{root}/dat/GP_READY_ROOM.pak")).unwrap();
for (i, e) in ar.entries().iter().enumerate() { for (i, e) in ar.entries().iter().enumerate() {
let Ok(by) = ar.read(e) else { continue }; let Ok(by) = ar.read(e) else { continue };

View File

@@ -16,7 +16,8 @@
//! Usage: //! Usage:
//! SYLPHEED_ISO=... cargo run --release --example correlate_capture -- \ //! SYLPHEED_ISO=... cargo run --release --example correlate_capture -- \
//! <capture.log> <Stage_SNN> <ship_id> [ref_part_substr] [--emit] //! <capture.log> <Stage_SNN> <ship_id> [ref_part_substr] [--emit]
//! e.g. SYLPHEED_ISO="/path/to/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja).iso" \ //! e.g. SYLPHEED_ISO="/home/fabi/RE - Project Sylpheed/Project Sylpheed - Arc of
//! Deception (USA, Europe) (En,Ja).iso" \
//! cargo run --release --example correlate_capture -- \ //! cargo run --release --example correlate_capture -- \
//! xenia_ship_capture.log Stage_S01 e106 bdy_04 --emit //! xenia_ship_capture.log Stage_S01 e106 bdy_04 --emit

View File

@@ -11,8 +11,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -15,8 +15,7 @@ use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -6,8 +6,7 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -14,8 +14,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -33,8 +33,7 @@ fn opaque_span(el: &ui_layout::Element, thr: u32, tmax: u32) -> Vec<(f64, f64)>
} }
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -58,8 +58,7 @@ fn forced(b: &ui_layout::UiBuild, el: &ui_layout::Element, tmax: u32, hold: bool
} }
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -20,8 +20,7 @@ use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into());
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -16,8 +16,10 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
mod common; fn disc_root() -> Option<PathBuf> {
use common::disc_root; let p = PathBuf::from(std::env::var("SYLPHEED_DISC").ok()?);
p.join("dat").is_dir().then_some(p)
}
fn build(ar: &PakArchive, i: usize) -> (Vec<u8>, ui_layout::UiBuild) { fn build(ar: &PakArchive, i: usize) -> (Vec<u8>, ui_layout::UiBuild) {
let by = ar.read(&ar.entries()[i]).expect("entry"); let by = ar.read(&ar.entries()[i]).expect("entry");

View File

@@ -26,8 +26,21 @@ use std::path::{Path, PathBuf};
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
mod common; fn disc_root() -> Option<PathBuf> {
use common::disc_root; if let Ok(p) = std::env::var("SYLPHEED_DISC") {
let p = PathBuf::from(p);
if p.join("dat").is_dir() {
return Some(p);
}
}
let default = Path::new(
"/home/fabi/RE - Project Sylpheed/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja)",
);
if default.join("dat").is_dir() {
return Some(default.to_path_buf());
}
None
}
fn for_each_build(root: &Path, mut f: impl FnMut(&str, &[u8])) { fn for_each_build(root: &Path, mut f: impl FnMut(&str, &[u8])) {
let mut paks: Vec<PathBuf> = std::fs::read_dir(root.join("dat")) let mut paks: Vec<PathBuf> = std::fs::read_dir(root.join("dat"))

View File

@@ -22,8 +22,10 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
mod common; fn disc_root() -> Option<PathBuf> {
use common::disc_root; let p = PathBuf::from(std::env::var("SYLPHEED_DISC").ok()?);
p.join("dat").is_dir().then_some(p)
}
/// Read a nested record's declared length and its largest keyframe time. /// Read a nested record's declared length and its largest keyframe time.
fn record_len_and_maxt(bundle: &[u8], off: usize, size: usize) -> Option<(i64, i64)> { fn record_len_and_maxt(bundle: &[u8], off: usize, size: usize) -> Option<(i64, i64)> {

View File

@@ -25,8 +25,15 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
mod common; fn disc_root() -> Option<PathBuf> {
use common::disc_root; if let Ok(p) = std::env::var("SYLPHEED_DISC") {
let p = PathBuf::from(p);
if p.join("dat").is_dir() {
return Some(p);
}
}
None
}
/// The case that found the bug, asserted end to end. /// The case that found the bug, asserted end to end.
#[test] #[test]

View File

@@ -36,20 +36,8 @@ args=(
-w /work -w /work
) )
# The corpora, read-only, when a disc-backed test or the exporter needs them. # The disc, read-only, when a disc-backed test or the exporter needs it.
#
# All three, not just the disc: a suite whose corpus is absent self-skips and
# still counts as passed, so mounting one of three made an in-container run look
# like a full one while `res3d` and `iso` suites silently sat out (#16). Each is
# mounted only when it exists, and `target/sylpheed-corpus-report.txt` says which
# ones the run actually had.
DISC="${SYLPHEED_DISC:-$REPO/../sylph_extract}" DISC="${SYLPHEED_DISC:-$REPO/../sylph_extract}"
[ -d "$DISC" ] && args+=(-v "$DISC:/disc:ro" -e SYLPHEED_DISC=/disc) [ -d "$DISC" ] && args+=(-v "$DISC:/disc:ro" -e SYLPHEED_DISC=/disc)
RES3D="${SYLPHEED_RES3D:-}"
[ -n "$RES3D" ] && [ -d "$RES3D" ] && args+=(-v "$RES3D:/res3d:ro" -e SYLPHEED_RES3D=/res3d)
ISO="${SYLPHEED_ISO:-}"
[ -n "$ISO" ] && [ -f "$ISO" ] && args+=(-v "$ISO:/disc.iso:ro" -e SYLPHEED_ISO=/disc.iso)
exec docker run "${args[@]}" "$IMAGE" "$@" exec docker run "${args[@]}" "$IMAGE" "$@"

View File

@@ -5,7 +5,8 @@ Confidence: ✅ `CONFIRMED` · 🟡 `PROBABLE` · ❔ `HYPOTHESIS`. See [README]
Also durable, and worth reading before proposing anything: Also durable, and worth reading before proposing anything:
[`REFUTED.md`](REFUTED.md) — what has already been tested and died · [`REFUTED.md`](REFUTED.md) — what has already been tested and died ·
[`METHOD.md`](METHOD.md) — the traps this corpus has already paid for · [`METHOD.md`](METHOD.md) — the traps this corpus has already paid for ·
[`BACKLOG.md`](BACKLOG.md) — what is still open. [`BACKLOG.md`](BACKLOG.md) — what is still open ·
[`disc-contents.md`](disc-contents.md) — what files the disc actually holds, and where.
Formats we've already reversed are, for now, **documented by their parser + disc round-trip Formats we've already reversed are, for now, **documented by their parser + disc round-trip
tests** (the executable spec) rather than a prose file — the "Spec" column points there. tests** (the executable spec) rather than a prose file — the "Spec" column points there.
@@ -72,6 +73,7 @@ files, which is how the same ground got covered twice.
| [`autopilot-memory-driven.md`](autopilot-memory-driven.md) | Memory-driven autopilot — build log and current state | 🟢 IT FLIES, KILLS AND SURVIVES — but it loses the mission anyway. | | [`autopilot-memory-driven.md`](autopilot-memory-driven.md) | Memory-driven autopilot — build log and current state | 🟢 IT FLIES, KILLS AND SURVIVES — but it loses the mission anyway. |
| [`canary-scripted-input-traps.md`](canary-scripted-input-traps.md) | Getting past the title screen in the container — three traps and one blocker | ✅ CONFIRMED for the three traps (each reproduced, and two of them | | [`canary-scripted-input-traps.md`](canary-scripted-input-traps.md) | Getting past the title screen in the container — three traps and one blocker | ✅ CONFIRMED for the three traps (each reproduced, and two of them |
| [`challenge-mission-gate.md`](challenge-mission-gate.md) | Challenge / EX missions — the stage set, the GamePart graph, and the kind field | ✅ for the static structure (stage set, GamePart ids, the config-section | | [`challenge-mission-gate.md`](challenge-mission-gate.md) | Challenge / EX missions — the stage set, the GamePart graph, and the kind field | ✅ for the static structure (stage set, GamePart ids, the config-section |
| [`disc-contents.md`](disc-contents.md) | What is actually on the disc, and where | ✅ CONFIRMED — layout, counts and `media_id` re-measured against the retail extract 2026-09-18; `resource3d/` is in `hidden/`, not `dat/` |
| [`dynamic-re-state-restore.md`](dynamic-re-state-restore.md) | The container's dynamic-RE state is not durable — how to rebuild it | ✅ CONFIRMED by rebuilding it (2026-08-23). Everything the dynamic | | [`dynamic-re-state-restore.md`](dynamic-re-state-restore.md) | The container's dynamic-RE state is not durable — how to rebuild it | ✅ CONFIRMED by rebuilding it (2026-08-23). Everything the dynamic |
| [`flight-controls-runtime.md`](flight-controls-runtime.md) | In-flight control mapping — measured, not assumed | ✅ for the weapon bindings (ammo counters move), 🟡 for the rest (HUD | | [`flight-controls-runtime.md`](flight-controls-runtime.md) | In-flight control mapping — measured, not assumed | ✅ for the weapon bindings (ammo counters move), 🟡 for the rest (HUD |
| [`flight-speed-law.md`](flight-speed-law.md) | The throttle is a TARGET-SPEED selector — measured against the definition (2026-08-13) | ✅ for the shape of the law, 🟡 for the unit scale. | | [`flight-speed-law.md`](flight-speed-law.md) | The throttle is a TARGET-SPEED selector — measured against the definition (2026-08-13) | ✅ for the shape of the law, 🟡 for the unit scale. |

104
docs/re/disc-contents.md Normal file
View File

@@ -0,0 +1,104 @@
# What is actually on the disc, and where
**Status:**`CONFIRMED` for the layout and the counts — every figure below was
re-measured against the retail extract on 2026-09-18, not copied from the source
document. ✅ `CONFIRMED` for `media_id`, read from the XEX header.
This page exists because the corpus never had one: it documents formats in depth
(see [INDEX](INDEX.md)) but nowhere said **what files the disc holds and where they sit**.
It is adopted from a pre-RE-era `GAME_CONTENTS.md` that lived homeless in the workspace
root through the repository consolidation. **Only the measured parts were carried over**
see [What was dropped](#what-was-dropped-and-why) at the end, which matters more than the
rest of the page.
Extracted from the XISO image with [extract-xiso](https://github.com/XboxDev/extract-xiso).
---
## Identity
| Field | Value | Source |
|---|---|---|
| `media_id` | `0x2D2E2EEB` | XEX `execution_info`, via `.xex.json` |
| `title_id` | `0x53512D14` (`"SQ"` + `0x2D14`) | XEX `execution_info` |
| `disc_number` / `disc_count` | 1 / 1 | XEX `execution_info` |
---
## Top-level layout
```
<extract root>/
├── default.xex ← the game executable (XEX2, PowerPC BE)
├── config.ini ← language table (Shift-JIS comments)
├── $SystemUpdate/ ← su20076000_00000000 (dashboard update, not game data)
├── dat/ ← 71 entries
└── hidden/ ← 5 entries
```
⚠️ **`resource3d/` is in `hidden/`, not in `dat/`.** So are `DefTables` and `MiscBin`.
The source document placed all three under `dat/`; that is wrong, and it is the reason
this page re-measured rather than transcribed. `SYLPHEED_RES3D` points at
`hidden/resource3d` for exactly this reason.
### `dat/` — 71 entries
| Group | Count | Note |
|---|---|---|
| `*.pak` + `*.p00` pairs | 33 + 33 | the IPFB archives — format ✅ decoded, see [INDEX](INDEX.md) |
| `sound.pak` + `sound.p00``.p04` | 6 | one archive whose payload is split across five chunks |
| `movie/` | 109 entries | |
`dat/movie/` holds **97 `.wmv`** files plus **six language packs** as `.pak`/`.p00`
pairs (`deu eng esp fra ita jpn`). ⚠️ Those packs carry **subtitles and fonts, not voice**
all voice and SFX live in `sound.pak`. That trap is recorded separately; do not go looking
for dialogue audio in the movie directory.
### `hidden/` — 5 entries
| Entry | Size | Note |
|---|---|---|
| `resource3d/` | 166 files | `.xpr` texture/model containers (`Base.xpr`, `BG_*.xpr`, stage and ship sets) |
| `DefTables.pak` / `.p00` | 17 596 B / 3 058 037 B | balance and definition tables |
| `MiscBin.pak` / `.p00` | 496 B / 22 553 238 B | |
---
## `config.ini`
Plain-text INI, **Shift-JIS** comments (they render as mojibake in a UTF-8 reader — the
file is not corrupt). `[SYSTEM]` is present but empty; `[LANGUAGE]` maps the Xbox 360
locale constants onto the disc's three-letter directory names, with `eng` as the default:
```ini
[LANGUAGE]
= eng ; default
#0x01 = eng ; XC_LANGUAGE_ENGLISH
#0x02 = jpn ; XC_LANGUAGE_JAPANESE
#0x03 = deu ; XC_LANGUAGE_GERMAN
```
Those keys are why the six-language pack naming above is what it is.
---
## What was dropped, and why
The source document was written **before** the formats were reversed, and roughly half of
it was speculation phrased as status. Carrying that forward would have put claims into the
corpus that the corpus itself has already refuted — the precise failure mode
[README](README.md) warns about ("a wrong-but-confident note is worse than no note").
Dropped:
- **A "Known File Formats" status table** marking `dat/*.pak` as *"⏳ Unknown — magic bytes
TBD"*, and `.XWB`/`.XSB` as *"⏳ TODO"*. The `.pak` container is ✅ decoded disc-wide.
[INDEX](INDEX.md) is the authority on format status; a second table would only drift.
- **A "PAK Archive Structure (TBD)" section** guessing each archive's contents from its
name ("`GP_BUNK.pak` — likely barracks/crew quarters UI"). Those are guesses, and the
real contents are known.
- **An "RE Entry Points" section** recommending loading `default.xex` into Ghidra to find
the loaders. Static analysis now goes through `sylpheed.db` (see the workspace
`CLAUDE.md` and `/sylph-dis`).
Nothing measured was dropped. The layout, the counts, the identity fields and the language
table are all re-verified above.