Return to Suhalia Noctis

The microscopic save file

One of my favorite Fun Noctis Facts is that its main save file is 438 bytes. If you are a software engineer in 2026, 438 bytes is minuscule. Almost unfathomably small, really. But it is small even for Noctis's age: it's less than 1/100th of a single framebuffer. Pulling up a copy of the save, which the original program outputs as binary in CURRENT.BIN, yields:

01 01 00 00 3f 01 03 00 00 00 00 ff 00 00 00 00

No special headers in this file! We are looking at game state at byte zero. To figure out what is going on here, we can take a look at the nicely named freeze() method inside NOCTIS.CPP. It writes one variable after another and leaves its byte offsets in comments:

WRITEFILE(fh, &sync,               sizeof(sync));               // 0
WRITEFILE(fh, &anti_rad,           sizeof(anti_rad));           // 1
WRITEFILE(fh, &pl_search,          sizeof(pl_search));           // 2
WRITEFILE(fh, &field_amplificator, sizeof(field_amplificator)); // 3
WRITEFILE(fh, &ilight,             sizeof(ilight));             // 4
WRITEFILE(fh, &ilightv,            sizeof(ilightv));             // 5
WRITEFILE(fh, &charge,             sizeof(charge));              // 6
// and so on...

The first dozen fields occupy exactly one byte each. Later values widen to two-byte integers, four-byte floating-point numbers, and eight-byte coordinates, but the principle never changes. The Noctis save file is just a pile of values concatenated in a fixed order. This is a little bit more fun to visualize than to describe, so here's a byte-by-byte view of a canonical Noctis save.

Save layout