Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Final Fantasy XI — a measured installation of a game that is still running

A byte-level description of a live Steam installation of Final Fantasy XI (Square 2002, Square Enix thereafter), Windows PAL edition, appId 230350. 66,192 files, 15,150,034,054 bytes, read-only. Nothing was executed, nothing was registered, nothing was contacted, and no decoded asset is shipped with this repository.

This is the largest object this collection has measured, the first from Steam, the first with a player's own saved state inside it, and the first measured while its service is still running — which means half of the product is not in the folder and cannot be measured from it. Chapter 01 says so before any number is given.

The short sheet

files / directories / bytes 66,192 / 1,167 / 15,150,034,054
distinct sha1 61,184 of 66,192 — 5,008 redundant copies, 2.3308 %
the one file type that is 73.2738 % 52,631 files called <number>.DAT, in 385 directories called <number>, with no name anywhere on the disk
entropy blocks above 7.5 22,515 of 271,996 = 8.2777 % — the least compressed object measured in many sessions
the index nine VTABLE/FTABLE pairs, all 109,701 and 219,402 bytes, over one id space of 109,701
ids claimed by more than one layer 0. It is a partition, not a stack
the .DAT chain derived from the bytes, closes on the exact last byte of 48,757 of 52,626 files, and on 0 of 130 files that are not .DAT
chunks inside them 2,019,932, 105,987 distinct tags, 35 types
the manifests four, 126,899 entries, and the 22-character field is MD5 in a permuted base64 alphabet
fields reproduced 126,865 of 126,865 present = 100.0000 %
the program FFXiMain.dll, 2,896,464 bytes = 0.0191 % of the disk
its compiler, in December 2025 Visual C++ 6.0, linker 6.00
its graphics dependency one function, Direct3DCreate8, from d3d8.dll
middleware named, of any kind 0
COFF timestamps 2002-09-17 to 2025-12-04 — 23 years 2 months, 16 distinct days
recorded sound and film 26.2100 % by extension (24.5362 % by branch)
the two films MPEG under an 8-byte XOR: 512x336 / 7 m 01 s and 640x480 / 11.93 s
how long it is 22 h 35 m at 44,100 Hz — and the rate is not in the header
leftovers 2,569,896,989 = 16.9630 %, published as a ceiling
crossings with 64 other repositories 2 files of 61,184 — and 0 members of 739,235

The five findings this session exists for

1. Nine indexes over one id space, and they never overlap. Each ROM* directory carries its own VTABLE/FTABLE pair. The pairwise intersection of the nine claimed-id sets is zero everywhere off the diagonal: not one id of 109,701 is claimed twice, and each layer's volume table contains exactly two values — zero and its own number. It is not a stack of overwrites, it is a partition, and nine files could be concatenated into one without losing a bit. The overlap the layering story predicts is real, but it lives elsewhere: in 113 pieces of content that exist in two layers and in the fact that ROM, the 2002 directory, contains the names of expansions from 2013 and 2015. Chapter 03.

2. The format that is 73 % of the object, opened. A .DAT is a chain of chunks — 4-byte tag, then a u32 packing a 7-bit type, a 21-bit length in units of sixteen, and 4 flag bits — with no directory, no index and no member names. Walking it lands on the exact last byte of 48,757 files; the identical walk over 130 files that are not .DAT closes on none. And the proof is not arithmetic: a type-32 chunk decodes into a legible ASCII font sheet, and another into 1024×2048 of kanji. Chapter 04.

3. A checksum nobody had read. All 126,899 manifest entries carry a 22-character field in a non-standard 64-character alphabet. 22 × 6 = 132 = 128 + 4, so if it is a 128-bit digest the last character can take only four values — and it does, before anything else is known. The alphabet was then recovered from forty files, and it is TSG8IncW3HFKokOg79qzeCmZs2yBYEQVAUxR5rbwi4P@jMDLtpvad0f_J1hlN6uX. SHA-1 is refused on width; CRC-32 gives 64 conflicts of 64. MD5 reproduces every field of every manifest, exactly. Chapter 06.

4. The audio decodes, and a human recognised it. .spw and .bgw name themselves SeWave and BGMStream in their own first bytes; two header bytes give the channel count and the codec; the count at +20 times a per-codec constant reproduces every body length exactly. Decoded as 4-bit ADPCM, the correlation between adjacent samples is 0.9846 — against 0.0361 for the identical bytes read as the other codec. And then one file was played, and the person running the session named it: the Final Fantasy victory fanfare. Chapter 05.

5. A product that costs twenty-three years to keep alive, in figures. A 1998 compiler, a 2000 graphics API, a 2003 Unicode shim for Windows 98 shipped twice, a 2002 binary whose CompanyName reads SQAURE CO., LTD. — the U and the A the wrong way round — and a Steam installation script that writes eleven gamepad-button DWORDs for TetraMaster, a game that is not on the disk and whose uninstaller silently un-registers a DLL that was never registered. Chapters 07, 08 and 10.

What was got wrong

Twelve figures in the pre-briefing do not survive re-derivation, and the biggest is its headline. It computes the chance expectation for PS2 as if the string were four bytes — 3.53 — and concludes that 479 occurrences are 136 times chance. PS2 is three bytes, chance predicts 903.01, and 479 is 0.53 of chance: below it, in the same band as Ogg and Wii, the two strings the briefing correctly dismisses. Mapping the 479 shows 342 of them inside ADPCM audio payload, and the two in FFXiMain.dll are the low bytes of pointers.

The real evidence is one string table in the launcher reading PS2 · FFXI · W20 · W2U · IXFF, and four structural facts that do not need a count. Chapter 07, Chapter 18.

Five of my own errors are there too, including breaking the branch's own backslash rule twice — the second time writing a form feed and a backspace into a Python source — and writing the scoring card from memory inside the scoring document.

The chapters

00 55 predictions, written before a byte was opened
01 what it is, and which of four denominators
02 every figure with the command that reproduces it
03 nine indexes, and where the Jenga went
04 the .DAT, and a font sheet that proves it
05 two containers, one codec, a fanfare, and two films
06 four manifests and a checksum nobody had read
07 an engine with no name and one Direct3D call
08 forty binaries and a company misspelling itself
09 ten days, sixteen days, and twenty-three years
10 Steam, nine COM servers, a game never shipped
11 274 paths, and 123,765 that were not
12 the strings, and the four that mean nothing
13 the first object with a player inside it
14 2 crossings of 61,184, and 0 of 739,235
15 16.96 %, published as a ceiling
16 26.2100 %, and the half that is not here
17 272 tools, 10 new, 183 that did not apply
18 mine, and the pre-briefing's
19 44.5 of 55, and what is left open

Method, and what is not here

Every figure in this repository carries the command that reproduces it. The predictions were written before anything was opened and are scored whether they won or lost. Three formats were derived from the bytes this session — the .DAT chunk chain, the two audio containers, and the manifest checksum — and each was proved with something that is not arithmetic: a control that had to fail, a picture you can read, a piece of music somebody recognised.

Nothing of the object is in this repository. No decoded texture, no WAV, no extracted chunk, no member. .gitignore excludes the working directory, the pre-briefing and the prompt, and git ls-files is checked line by line before every commit.

Nothing was executed and nothing was registered. Nine of this object's DLLs are in-process COM servers and its installation script hands them to regsvr32; reading a PE does not register it, and regsvr32 was never invoked.

Nothing was contacted. This is an online game and a large share of its strings are host names. They are artefacts: counted, never resolved, never opened. No packet was captured, no session observed, no protocol exercised. The live half of this product is out of scope, and every number here is a statement about bytes at rest on 27 December 2025 — the day this installation was last written to, and the day a subscription lapsed.

The build-machine paths that are here — c:\image\ffxi\, D:\build0001\, m:\FFXI\, C:\Program Files\PlayOnline\SQUARE\FINAL FANTASY XI — are directories on machines at a company, compiled into a product sold in large numbers, and are findings. The path of the machine that did the measuring is not written anywhere.

There is personal data in this object, for the first time in this collection: 178 files and 2,421,300 bytes of one player's saved state, macros, logs, mail spool and screenshots directory. It is counted, characterised and not printed. Chapter 13.

About

A byte-level measurement of a live Steam installation of Final Fantasy XI: 66,192 files, 15.15 GB. The .DAT chunk chain derived and closed on 48,757 files, the 22-character manifest checksum broken (MD5 in a permuted base64 alphabet, 126,865/126,865), the audio decoded, and nine ROM indexes shown to be a partition and not a stack.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages