Compare commits
1 Commits
fix/corpus
...
docs/adopt
| Author | SHA1 | Date | |
|---|---|---|---|
| 06601c2a48 |
@@ -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) {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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)> {
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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" "$@"
|
||||||
|
|||||||
@@ -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
104
docs/re/disc-contents.md
Normal 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.
|
||||||
Reference in New Issue
Block a user