Skip to content

Releases: LinuxJessi/Xenosaga1PythonExtractor

v1.2.1 — movies on a black bar, overlay strings and battle font in the bundles

Choose a tag to compare

@LinuxJessi LinuxJessi released this 15 Oct 17:29

macOS: first launch

The app is ad-hoc signed, not notarized. After unzipping,
right-click Xenosaga-I-Extractor.app → Open the first
time (or run xattr -dr com.apple.quarantine Xenosaga-I-Extractor.app).
After that it double-clicks normally.

Full Changelog: v1.2.0...v1.2.1

Full Changelog: v1.2.0...v1.2.1

Xenosaga I Extractor v1.2.0

Choose a tag to compare

@LinuxJessi LinuxJessi released this 15 Oct 04:28

Superseded by v1.2.1: movie subtitles on a black bar, encoder at the full slot, and bundles that include the overlay-string, battle-font and muxer work.

Third release of the Xenosaga Episode I extractor kit: everything from October 2026. Two halves: models that open in Blender rigged and textured, and a translation layer with no length limits and fonts for scripts the game never had. Packaged builds for macOS (arm64) and Windows (x64) are attached below, rebuilt with all of it; or run from source (python3 cli.py …, stdlib only). The TrueType glyph path of lang scan needs pip install fonttools uharfbuzz, which the source checkout supports; the bundles cover everything else, including hand-drawn PNG cells. Per-change notes: docs/UPDATES.md.

macOS: first launch

The app is ad-hoc signed, not notarized. After unzipping, right-click Xenosaga-I-Extractor.app → Open the first time (or run xattr -dr com.apple.quarantine Xenosaga-I-Extractor.app). After that it double-clicks normally.

Translation

  • Dialogue of any length — evt-export / evt-import (evttext.py) write every string in every scene and cutscene script as a text line and rebuild the Java classes and their FL00 container around the translation. Identity rebuild of all 567 containers is byte-exact. Mails (.uml) may grow too; their image pointers follow.
  • Relocation — --grow moves an object that no longer fits its sector allocation to the end of the image and repoints its TOC entry (the engine reads by raw sector). Read back through the TOC on a scratch disc; not yet booted past the image end.
  • The third chain — the second DVD layer has its own ISO9660 volume with XENOSAGA.20–.24: 266 objects (89 cutscene scripts, 58 movies, 44 voice streams, 42 .fpk, 33 .arc) that were only being carved as raw movie sectors. Every command sees chain 2 now.
  • Fonts, exactly — font.py turns font0.tex / font1.tex into four sheets of 20×24 cells and back byte-for-byte (USA and JP), with the executable's cell addressing, the 256-cell proportional block and its metrics table (right − left + 3 px per glyph). The text is EUC-JP, not Shift-JIS; textpack decodes it as such.
  • New scripts — lang scan shapes a translated tree with HarfBuzz, allocates a proportional slot or kanji cell to every glyph it uses and draws them from a TrueType font (or hand-drawn PNG cells) into both faces; lang encode shapes, measures, wraps and orders right-to-left lines with Latin runs kept forward and brackets mirrored. --extend lets two scripts share one font pair. Mixed-script words keep their Latin halves; control codes and the disc's own symbols pass through.
  • Verified on PCSX2 — an Arabic dialogue line in the Encephalon cold open and an Amharic U.M.N. mail body, both drawn by the game from the rebuilt fonts. Guide, worked example and captures: docs/SCRIPTS.md.

Several of these formats were first worked out by poketony for the Korean localisation XS1KOR; the implementations here are the kit's own, against the USA disc.

Models

  • .lex → glTF binary — browse --kinds models writes every character, enemy, weapon, mech, prop and map as a .glb with its texture inside: 1,315 files on the retail disc, faces merged into their bodies. How-to: docs/BLENDER.md.
  • Skeletons decoded — .jnt is a tree of 64-byte nodes; the three stored angles are rotations about Z, Y, X in that order (settled against the running game's per-bone matrix table over PINE). Armatures land on the mesh from the files alone, hands and hair included; 760 models carry one.
  • Eyelashes solved — the lash material is a small true-colour alpha strip the lash polygons stretch into strokes; it had been read through a palette.
  • Four texture-decoder fixes found by looking at models in Blender: two-part atlases overwriting themselves (42 character textures were beige noise), materials hidden in the vertex stream, hair-sheet true-colour regions, and UV scale on narrower atlases. 756 of 1,019 model textures change.
  • Casino closed out — the menu overlay's texture descriptors supply the palettes for the card faces, slot machine and gallery (GitHub issue #1).

Pictures

In-game, from the LANGTEST disc described in docs/SCRIPTS.md:

Arabic in the Encephalon cold open

Amharic U.M.N. mail

More from the same disc, after the follow-up on main (overlay strings, the battle screen's own font, movies without libass; see docs/UPDATES.md 2026-10-15):

Hindi: KOS-MOS's program menu in the Encephalon

Hindi: a subtitle burned into the first movie on a black bar over the English (capture from v1.2.1's encoder; v1.2.0's blurred the band and encoded with a tight rate buffer, visibly blocky)

Hindi: KOS-MOS confirming the battle program

Georgian (Mkhedruli): KOS-MOS's command bars, drawn by the battle HUD's own font

Blender, straight from the kit's output:

Faces

KOS-MOS posed through the exported armature

🤖 Generated with Claude Code

Xenosaga I Extractor v1.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 03:17

Second release of the Xenosaga Episode I extractor kit. Everything since v1.0.0 is on the extract/browse (viewing) side plus the repack/translation layer; the packaged builds are rebuilt with all of it.

Added

  • Repack layer — patch writes any object back into the ISO in place; a byte-perfect clone of Monolith's ARX packer; pinkhair as the worked recolor example (with the disc-wide sweep for the 12 embedded copies of a character texture).
  • Translator text pipeline — text-export / text-import round-trip all 914 in-game text objects (588 scene/menu .txt + 326 U.M.N. mails) as UTF-8 with Shift-JIS byte budgets; docs/FRENCH-TRANSLATION-GUIDE.md and docs/ARABIC-TRANSLATION-SPEC.md.
  • Cutscene subtitles — subs-template / subs-burn author and burn subtitles into the .pss movies, audio untouched.
  • Sequenced BGM — music-export renders the Procyon SMD/SWD music to MIDI + SoundFont2 + WAV/FLAC, reversed from the game's own unstripped IOP driver (SSD.IRX).
  • Battle voice/SE banks — battle_audio browse kind, ~1,500 sample WAVs from yamamoto/snd/sed.
  • Embedded texture sweep — every dump file is swept for XTX blobs inside effect/scene/UI containers: 1,363 more PNGs (title, help and menu screens, room backdrops, effect sheets) plus a per-carrier manifest.
  • More content — PS2ICON3D hdd.res unpacked; hidden string tables sniffed out of binary files (event-item descriptions, casino dialogue, EUC-JP dev configs).

Fixed

  • Texture decode (GitHub issue #1) — palette tiles no longer show as a square of noise in the corner; character atlases no longer garble: raw true-colour regions (the hair sheets) are drawn from the canvas, companion-model palettes are merged (KOS-MOS's red eye), map atlases rescue their parked CLUTs, and every one of the 1,269 standalone textures decodes (was 1 undecodable).
  • Casino sheets — overlay texture descriptors now supply the casino/menu palettes; the 30 numbered tanaka sheets and the data viewer render instead of magenta blocks and pink tints. UI sheets with transparent cut-outs keep their own corner-spot palette (the slot frame, pay table, neon reel labels, window sheet, card-rarity labels and the Elsa deck map had been handed washed-out palettes by the ranking). The raw-CT32 and block-rescue passes are restricted to model-bound textures after they were caught repainting the slot reels, poker felt and one slot tile with noise — verified against v1.0.0 renders decoded from the tagged code.
  • Scene archives — the ~500 embedded textures reported as "undecodable" were ARX-compressed in place; they are now decompressed and decoded (all turn out to be per-scene copies of standalone textures, so the manifest doubles as a scene → texture provenance map). Two garbage PNGs decoded from inside compressed streams are gone.
  • BGM tempo — the driver's timebase is a fixed 96 PPQN; the first cut played the battle themes ~25% fast.
  • XTX sprite files that are all 16×16 sub-images (carddata/game/1p2p.xtx) decode.

Updated

  • docs/FORMATS.md — scene-archive layout (TOC + record header + ARX member), corrected repack notes, LEX/XTX palette pipeline, sequenced-BGM spec. docs/UPDATES.md has the per-change notes and what to re-run.
  • Packaging pins Python 3.12 and bundles numpy (for WAV/FLAC music rendering) and ffmpeg.

Before / after

Left or top: the earlier build. Right or bottom: v1.1.0. All renders are straight from browse --kinds textures on the retail USA disc.

KOS-MOS atlas (char/pc/kosmos.xtx) — v1.0.0 could not decode this file at all; top is the August interim build, bottom is v1.1.0 (hair band and eye).

KOS-MOS before/after

Casino slot machine (tanaka/slot_1.xtx) — v1.0.0 vs v1.1.0. The small square of noise at the bottom of the v1.0.0 render is the parked palette tile from issue #1, blanked now.

slot before/after

Casino poker table (tanaka/poker_1.xtx) — v1.0.0 vs v1.1.0.

poker before/after

Casino data viewer (tanaka/dataviewer.xtx) — v1.0.0 vs v1.1.0.

data viewer before/after

Casino slot frame (tanaka/slot_2.xtx) — v1.0.0 vs v1.1.0. v1.0.0 already had this one right; an interim build tinted it purple, and the final decoder keeps its corner-spot palette (the parked tile is blanked).

slot frame before/after

Still imperfect: tanaka/base.png (slot symbol sheet) is tinted by a wrong overlay palette, and two small regions of the KOS-MOS atlas are plane-packed 4bpp visor-HUD sheets whose palettes are not on disc.

Samples

Short excerpts, as documentation of what the kit produces. Regenerate the full set from your own disc.

  • Music, rendered by music-export from the sequenced SMD/SWD data at the corrected tempo: BATTLE1, first 20 s · U.M.N. Mode, first 20 s

  • Spoken dialogue: voice stream chain1/sound/vda/s191008, first 15 s (decoded by browse --kinds audio from the interleaved SPU ADPCM streams) · cutscene layer1_021, 20 s of the dubbed track (carved from layer 1 and converted by browse --kinds movies)

  • Battle dialogue: montage of eleven in-battle lines — KOS-MOS (special, boost, battle-end), Shion, Jr., MOMO, chaos and Ziggy, straight from the per-character yamamoto/snd/sed banks that browse --kinds battle_audio unpacks (file names km_sp1, shion_end5, jr_sp6, mo_bst3, chaos_bst3, z8_end2, …).

  • Dialogue text, as text-export and browse --kinds text deliver it:

    U.M.N. mail scene umn/event01.txt (speaker tags and control codes preserved):

    <speech>02
    <char>SHION
    <msg>
    \15\2They sure did.\37
    But guess what! I had the "RIOS 680RR" model even before
    they made their official announcement.\15\0\37
    </msg>
    

    Encephalon tutorial (scene/ST0210.evt, lifted from the Java constant pool by classes):

    After a battle, you'll flash for a few seconds. During this time, you won't trigger a new battle, even if you come in contact with the enemy. Remember this, okay?
    You want to move on to real combat? All right then, I'll transport you to your original location after the battle is over. Are you ready?
    

    Event items (karakama/evtitem.dat, sniffed string table):

    Master Key — A key to a prison cell.
    U-TIC Card — This card will disarm the electronic lock in corridor number 5.
    Flower Seed — Seed of the Ariadne flower.
    

Packages

  • Xenosaga-I-Extractor-win64.zip — Windows, embedded Python + ffmpeg, no install.
  • Xenosaga-I-Extractor-macos.zip — macOS (Apple Silicon) .app.

music-export WAV/FLAC rendering needs numpy (bundled in the packages; pip install -r requirements.txt from source).

Xenosaga I Extractor v1.0.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 15:24

macOS: first launch

The app is ad-hoc signed, not notarized. After unzipping,
right-click Xenosaga-I-Extractor.app → Open the first
time (or run xattr -dr com.apple.quarantine Xenosaga-I-Extractor.app).
After that it double-clicks normally.

Full Changelog: https://github.com/LinuxJessi/Xenosaga1PythonExtractor/commits/v1.0.0