A collection of tools for modding Final Fantasy VIII (PC/Remaster), all bundled behind one
launcher: FF8UltimateEditor.exe (or python main.py). Pick a tool from the "Hobbit tools" dropdown
at the top of the window, or launch one of the external programs from the toolbar next to it.
A command-line interface (cli.py) is also available for scripting text import/export without
opening the GUI (see CLI below).
Make your choice!
These are built into the app and selected from the "Hobbit tools" dropdown.
All-in-one editor for monster and summon battle files, organized as tabs sharing one file toolbar:
- AI — decompiles and edits monster AI scripts (conditions/commands) as readable pseudo-code.
- Seq — edits animation sequences (the byte-code that drives monster/summon animations).
- 3D — views the monster's 3D model and animations (mesh/wireframe, playback speed, bone list), with glTF export.
- Texture / Dynamic Texture — edits the monster's textures and palette-animation (VRAM) effects.
- Xlsx — exports/imports monster stats to/from an Excel spreadsheet for easy bulk editing.
- Cronos — shows that mod's configuration instead of the game's: its AI definitions, and the spells and items
its
kernel.binrenames (FF8GameData/kernelnames.pyreads those out of a kernel.bin; unticked, every name is the one the game ships). - Extract sections… / Apply sections… — writes every section of the open file as its own editable file
(
ai.md,anim_seq.xml,camera.xml,info_stat.xlsx,texture_00.tim…) in a folder named after it, and applies section files back onto a file — you pick the files you want (selecting all of a folder works), the other sections stay as they are. That is how a mod keeps its changes next to the game files and re-applies them to a fresh.dat. The stats keep their spreadsheet format:info_stat.xlsxis this one monster in the workbook format of the Xlsx tab (stats and battle texts), so a workbook covering the whole game can be applied as a section file too.
Edits every text string in the game (dialogue, menus, items, names…), with CSV export/import for bulk translation work.
Edits which items each shop sells (Balamb, Dollet, Timber, Deling City…), and the per-slot "rare"
flag. (Item prices live in price.bin — see the Siren tool.)
Edits Triple Triad card values (ranks/elements) and which cards NPCs play with.
Edits every draw point in the game (field and world map), including which spell/quantity/refill rate it gives, and its position on the world map.
Edits GF data: general stats, learnable abilities, and character/GF junction compatibility.
Edits how items behave in menus (what they refine into, what they do when used, their parameters).
Views field character models and their animations (NPCs from chara.one and main characters from
main_chr.fs).
Edits GF refine abilities: which items/cards convert into which magic, and in what quantity.
Views and edits battle stage geometry/textures (a0stgXXX.x files from battle.fs).
Edits the battle sound archive (audio.fmt / audio.dat), the main files on both tabs. Import opens the pair; Import complementary opens the side file battle_actor_sounds.bin. The Actor sound IDs tab shows seven world sound IDs per actor through c0m199, with a panel explaining the selected slot's category, offset, hardcoded starting archive sound and final archive index. Play slot previews it using the loaded archive. New tables preserve original sounds and leave added monster rows empty; copy an actor's row to reuse its sounds. The shared Save writes audio.fmt / audio.dat on Audio archive, and writes the BIN on Actor sound IDs (asking for a destination for a new file). Save the BIN in your mod's direct/exe/ folder.
Edits each item's buy price and sell price multiplier (the sell price the shop pays back is
round((buy price / 10 / 2) * sell multiplier)). Ported from the original Siren tool.
Edits the 30 SeeD written tests (tutorial menu): the question texts, the expected answer of each
question, and the selectable choices (cursor stops) — the engine counts the stops at display time,
so a question can offer more than the standard YES/NO. Also edits the shared exam UI text. A live
in-game preview (using the real FF8 font widths from sysfnt.tdw) shows how each question lays out
and flags text that would overflow the vanilla window. Excel/CSV export/import for bulk editing.
Edits the world map's own event bytecode, which is where every world-map side quest lives (the UFO, the Obel Lake rock, Chocobo forests, the train stations, boarding the Ragnarok) along with the field warps, forced battles and item rewards it triggers. Four script sections are shown side by side with the pseudo-code the game actually walks (an IF / THEN / ELSE tree), and each instruction is edited as an opcode and its parameters.
The hard part of these scripts is that the parameters are bare numbers, so every one the tool can
resolve is spelled out next to it: the dialog a SHOW_TEXT_BOX opens, the item an ADD_ITEM hands
out, the buttons a CHECK_BUTTON_INPUT mask stands for, where an ADD_ENTITY puts what it spawns,
and which instruction of which script a GOTO lands on. Selecting a line also lists everywhere else
in the file that touches the same save flag, script variable, dialog or message window — which for a
side quest spread over a dozen scripts is the only way to see the whole of it.
Each line of the script list says what its script does ("gives Three Stars", "warps to rgcock4",
"sets flag 61"), and Ctrl+F searches those, so finding the script behind a side quest takes a few
letters rather than opening all 92. Opening wm2field.tbl and field/mapdata/maplist alongside
(both read-only, both found by "Open folder") is what turns a warp's entrance number into the field
it lands on, with the spawn position and facing. Whole scripts can be added, duplicated, removed
and reordered —
which matters, because in sections 7 and 11 the first script whose conditions pass is the one that
runs, so the order of the table decides the answer.
Double-clicking a GOTO follows it; double-clicking a cross-reference line goes to that
instruction. "Check section" looks for what would actually break the game — a jump to nowhere, a
script not ending on RETURN, a branch whose conditions can pass with no actions to run — and
reports nothing on the untouched game file. Ctrl+Z / Ctrl+Shift+Z undo and redo, including a whole
text import.
A whole section can be written out as a text file, annotated and edited in any editor, and read back in. Jump targets are written as labels there rather than byte offsets, so instructions can be inserted, deleted, and whole scripts added or removed, and the jumps still land where they were meant to. Editing in the table does the same fix-ups in place. The dialog texts and location names the scripts show are on a second tab, each listed with the scripts that open it.
These are external, standalone programs. The launcher can check for and download updates for them automatically (see the update button in the toolbar).
-
IfritGui — the original Ifrit tool for editing monster stats.
-
Siren —
price.bineditor (shop/item prices). Now also built in (see the Siren tool above); the standalone launcher is kept for reference.
-
Doomtrain —
kernel.bineditor (general game/battle data). -
Junkshop —
mweapon.bineditor (weapon data). -
Quezacotl —
init.outeditor (new-game starting data).
-
Jumbo Cactuar —
Scene.outeditor (field encounters). -
Deling — archive editor (browse/extract/repack the game's
.fs/.fi/.flarchives). -
Hyne — save file editor.
-
VincentTim — command-line texture converter for FF7/FF8
.tim/.texfiles (see its own README).
cli.py exposes GUI features as scriptable commands, useful for batch processing, translation
work, or CI pipelines without opening any window. Every tool runs headless (no Qt window) and
edits the same files as its GUI counterpart.
python cli.py <tool> <command> [options]
python cli.py --helplists every tool.python cli.py <tool> --helplists a tool's commands and their options.
Run it from the repo root (with the project's virtualenv active). The tools that need the game's
reference data load it automatically from FF8GameData/.
- CSV exports use
|as the delimiter; imports auto-detect|,;or,, so a file edited in Excel still re-imports cleanly. Theshumi-translatorandcidCSV formats match what the GUIs produce, so files are interchangeable between CLI and GUI. --output/-ois optional on most in-place editors: omit it to overwrite the input file, or give a path to write a copy. Import commands only touch the fields you changed, and a no-edit round-trip reproduces the original file byte-for-byte (exceptkernel.bin, whose text offsets are recomputed, andinit.out, which is grown to its full size so every item slot is editable — both matching the GUI's own save behaviour).
| Tool | Edits | Commands |
|---|---|---|
shumi-translator |
all in-game text (kernel.bin, mngrp.bin, namedic.bin, field/world/battle, exe) |
export-csv, import-csv, export-all, export-all-{field,battle,kernel,namedic,mngrp,exe,world}, compress, uncompress |
ifrit |
monster/summon c0m*.dat (stats, model, animation seq) |
export-xlsx, import-xlsx, export-gltf, import-gltf, export-seq-xml, import-seq-xml, export-sections, apply-sections |
ifrit-ai |
monster AI scripts in c0m*.dat |
export-md, compile-md |
solomon-ring |
kernel.bin (all data sections, field-level) |
list-sections, list-fields, get, set, export-csv, import-csv |
tonberry-shop |
shop inventories (shop.bin) |
export-csv, import-csv |
siren |
item prices (price.bin) |
export-csv, import-csv, set-price |
junkshop |
weapon-upgrade recipes (mwepon.bin) |
export-csv, import-csv |
pupu-cargo |
item menu behaviour (mitem.bin) |
export-csv, import-csv |
pandemona |
GF refine formulas (mngrp.bin) |
export-csv, import-csv |
nida |
SeeD written tests (mngrp.bin) |
show, export-csv, import-csv, set-answer |
quezacotl |
new-game starting data (init.out) |
export-json, import-json |
ccgroup |
Triple Triad NPC card players (field .jsm) |
list, export-csv, import-csv, set-param |
cid |
draw points (exe .hext + world positions in wmset) |
export-csv, import-csv |
julia |
battle sounds (audio.fmt / audio.dat) |
list, export-wav, export-all, replace |
alexander |
battle stages (a0stgXXX.x) |
export-glb, import-glb |
seed |
field model containers (chara.one) |
list-models |
jp-font-builder |
JP font atlas for the ILP-JP mod | build, decode |
Text (translation workflow):
python cli.py shumi-translator export-csv --input kernel.bin --output kernel.csv
python cli.py shumi-translator import-csv --input kernel.bin --csv kernel.csv
python cli.py shumi-translator compress --input kernel.bin --output kernel_compressed.bin
python cli.py shumi-translator export-all --input-dir game_lang --output-dir csv_out
Binary editors (CSV round-trip, --output optional):
python cli.py tonberry-shop export-csv --input shop.bin --output shops.csv
python cli.py tonberry-shop import-csv --input shop.bin --csv shops.csv --output shops_new.bin
python cli.py siren set-price --input price.bin --item-id 24 --buy-price 3000
python cli.py junkshop export-csv --input mwepon.bin --output weapons.csv
python cli.py pupu-cargo export-csv --input mitem.bin --output items.csv
python cli.py pandemona export-csv --input mngrp.bin --output refine.csv
python cli.py nida show --input mngrp.bin --test 1
python cli.py nida set-answer --input mngrp.bin --test 5 --question 3 --answer 1
kernel.bin field editing (addressed by section → entry → field):
python cli.py solomon-ring list-sections
python cli.py solomon-ring list-fields --section 2
python cli.py solomon-ring get --input kernel.bin --section 2 --entry 1
python cli.py solomon-ring set --input kernel.bin --section 2 --entry 1 --field spell_power --value 99
python cli.py solomon-ring export-csv --input kernel.bin --section 2 --output magic.csv
New-game data as JSON:
python cli.py quezacotl export-json --input init.out --output init.json
python cli.py quezacotl import-json --input init.out --json init.json
NPC card players (a literal value, or var:N to read a savemap variable):
python cli.py ccgroup list --folder extracted_files/field/mapdata
python cli.py ccgroup export-csv --folder extracted_files/field/mapdata --output players.csv
python cli.py ccgroup import-csv --folder extracted_files/field/mapdata --csv players.csv
python cli.py ccgroup set-param --jsm bghall_1.jsm --player 0 --param rare-chance --value 99
Draw points (exe byte + world map position):
python cli.py cid export-csv --exe FF8_EN.exe --wmset wmset.obj --output draws.csv
python cli.py cid import-csv --csv draws.csv --exe FF8_EN.exe --wmset wmset.obj \
--output-hext draw.hext --output-wmset wmset_new.obj
3D models and sound:
python cli.py ifrit export-gltf --input c0m071.dat --output c0m071.glb
python cli.py ifrit export-xlsx --input extracted_files/battle --output monsters.xlsx
python cli.py alexander export-glb --input a0stg001.x --output stage.glb
python cli.py julia export-wav --fmt audio.fmt --index 1 --output sound.wav
python cli.py julia replace --fmt audio.fmt --index 1 --wav new.wav
You can help me releasing those tools on my Patreon
















