Vault-Tec field manual · how the reconstruction works

How we rebuild the Mojave

The whole project in five pictures. No programming background needed.

THE GOAL

Write the game's source code again, so exactly that it compiles back into the very same bytes.

THE GAMEshipped in 20108B41082B410485C07D0233C0C3
OUR VERSIONour C++ + the 2008 compiler8B41082B410485C07D0233C0C3
13 OF 13 BYTES IDENTICAL · ACCEPTED
Illustration: a tiny made-up function, not code from the game

The game came out as a finished program: about 74,500 functions of machine code, with no source code released. We write each function again in C++ and build it with the same compiler the developers used, Microsoft Visual C++ 2008. It only counts if every byte comes out identical. Almost right counts as zero, which is why every function on this site is proven, not guessed.

THE LOOP

Every function goes through the same loop: write, build, compare, try again.

Pick a functionfrom a shared to-do list, sorted by size
Brief the AIits machine code, the classes it uses, similar solved examples
Write · build · comparethe AI writes C++, the real compiler builds it, the result is compared byte by byte↻ repeats until it matches or the tries run out
Match savedwith the name of the model that wrote it
Merged overnightrebuilt and re-checked with everything else, every night

Here is what those tries look like for the little function above.

TRY 1DOES NOT BUILD
BYTESnothing to compare

The AI used a field name our project does not know yet, so the compiler refused. This is the most common failure of all (see What is hard).

› show the code
int Inventory::FreeSlots() const {
  return maxCount - count;   // error: 'maxCount' is not a member
}
TRY 25 OF 13 BYTES MATCH
BYTES8B51048B41083BD07E0333C0C32BC2C3

Right idea, wrong wording. The program would behave the same, but the compiler laid it out differently, and it even came out 3 bytes too long.

› show the code
int Inventory::FreeSlots() const {
  return count > unk08 ? 0 : unk08 - count;
}
TRY 312 OF 13 · ONE BYTE OFF
BYTES8B41082B410485C07F0233C0C3

So close. Writing "greater than zero" instead of "not below zero" gives the same answer for every input, but the compiler picks a different jump instruction. Close does not count.

› show the code
int n = unk08 - count;
if (n > 0) return n;
return 0;
TRY 413 OF 13 · MATCH
BYTES8B41082B410485C07D0233C0C3

Reworded the way the 2008 compiler likes it. Identical. The match is saved and merged that night.

› show the code
int n = unk08 - count;
return n < 0 ? 0 : n;
same as the gamedifferentextra byte the game does not have
Illustration: a made-up 13-byte function. Real ones run from a few bytes to tens of thousands.

WHO DOES WHAT

Bigger functions are harder, so the bigger the function, the stronger the AI we send.

TINY, REPETITIVEScripts22,000 boilerplate functions generated in bulk, no AI needed
SMALL · UNDER 256 BOur own AIa model we trained, running free on a home PC around the clock
MEDIUMLow-cost AIsopen models on a flat $10 monthly plan
LARGE · 512 B AND UPTop AIsClaude, Codex and Gemini: dozens of careful tries per function
‹ easierfunction sizeharder ›

Every AI works through the same loop and the same byte-for-byte check, so a match from a small local model is worth exactly as much as one from the most expensive model. The SQUAD tab on the main page keeps score.

TRAINING OUR OWN

We taught a free local AI from our own proven matches, and it got 4.6 times better.

Out of the same 300 never-seen small functions, how many did it match?
Off the shelf8
Training round 121
Training round 237

Every proven match is also a perfect lesson: code that is known to produce the right bytes. We trained a 27-billion-parameter open model on a few thousand of them, using two desktop AI computers, then let it learn from its own wins as well. A third round, aimed at bigger functions, learns from rewrites by Claude. Only matches from models whose terms allow it are used for training.

WHAT IS HARD

Out of every 100 tries, only about 3 succeed.

42do not even build55build, but the bytes differ3match

That is normal. A function usually needs several tries, and the AI learns from each failure. Measured over 96,537 tries in a day and a half.

The biggest blocker is not the AI. It is gaps in our shared blueprints.

class Inventory
  count
  ??? unknown field
  items
FreeSlots ✗AddItem ✗RemoveItem ✗IsFull ✗Sort ✗Load ✗Save ✗Merge ✗
Illustration: one blueprint and the functions that depend on it

Functions share "blueprints" (class declarations) that describe the game's objects. When one is missing a field, every function that touches that field fails to build, however good the AI is. That is what happened in try 1. About a third of all build failures are blueprint gaps, so fixing one blueprint unblocks many functions at once.

› what the build failures actually are
Blueprint gaps34%
Auto-fixed now28%
AI mistakes and other38%

From the first error in 320 failed builds. "Auto-fixed" are slips the checker now repairs before compiling, such as the AI pasting in its own copy of a blueprint.

Three more things we learned the hard way.

0 of 40Close is not nearly done

741 open functions are only 1–2 instructions off. A tool that shuffled instructions around fixed none of the 40 we tried: the last difference is almost always a misunderstanding, not an ordering.

12 → 17Thinking harder helps, at a price

Out of 20 big functions, Claude matched 12 on its lightest thinking setting and 17 on its heaviest, but got less code per unit of effort. We run it in the middle.

2/3The rest is the big stuff

Two thirds of the code still to do sits in large functions. The bytes percentage on the main page is the honest measure of progress; the functions percentage flatters.

WHAT THIS IS, AND IS NOT

A fan research project that publishes numbers about our own work. Never the game.

What you will find here

Progress statistics: how many functions and bytes we have rewritten, by day and by AI model, plus this explanation of how the work is done.

What you will never find here

No game files, assets, executables, disassembly or downloads. Nothing on this site, or anything we release, can be played or used in place of the game.

Our source code stays private

Contributors receive only what one function needs: its file with every function body removed, plus headers. No repository, no game data, nothing that runs.

Who owns what

Fallout, Fallout: New Vegas and related names are trademarks of their owners (Bethesda Softworks and ZeniMax Media, part of Microsoft; the game was developed by Obsidian Entertainment). We use them only to say which game we study. This project is not affiliated with or endorsed by any of them.

We do this to understand and preserve a game we love, the same way established fan decompilation projects work. If you hold rights in the game and have a concern, please email contact@fnvdecomp.com and we will respond promptly.

THE NUMBERS how the main page counts

Matched
Proven byte-identical. Includes functions waiting for that night's merge.
In scope
Everything except standard library code and code the compiler writes by itself, which come straight from Microsoft's original libraries.
Doc Mitchell
The code the game actually runs from launch through the opening scene in Doc Mitchell's house, recorded by playing the real game.
Days and credit
Each function is dated by the day it first matched (US Central time) and credited to the model that wrote it.
Refresh
Recomputed twice a day, after the nightly merge and in the evening. Spend and token figures are updated by hand.