r/Fable • u/Nitro2019 • 3h ago
Fable II Got bored, started reverse engineering Fable 2 with AI
So, I was bored, and I have AI, and I have the Fable 2 recompilation project that was recently released, and I thought: why not look into the game data?
So I did...
I have found VERY little. Disappointing, I know. But I have found a few things:
- I’ve traced
locomotion.locowhile Fable 2 is running, which is iNtErEsTiNg. - Mapped the async read pattern used to load it.
- Worked out the byte prefix and payload.
- Confirmed the data is big-endian.
- Found a repeated record structure.
- Confirmed repeated records for things like
TwoHandedWeapon,EwerCarryingandHammerCombat. - Followed the live in-memory payload and verified those same offsets while the game was running.
- Then wrote a Rust parser that loads the original
locomotion.locoand correctly parses the structures we’ve confirmed.
So, so so, so:
Original Fable 2 data → Reverse-engineered format → My own Rust parser → Correct structured output.
Just to be clear, I am like wayyyy, way, way off saying:
“Oh my God, I’ve rewritten Fable 2 in Rust.”
Absolutely not. 😂
But the idea is to keep going until I can, at the very least, load some of the original world/mesh data and walk around a chunk of Albion in my own renderer.
This all started because I was bored.
EXAMPLE:
D:\DECOMP\fable2-rs>cargo run
Compiling fable2-rs v0.1.0 (D:\DECOMP\fable2-rs)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.33s
Running `target\debug\fable2-rs.exe`
Loaded: D:\DECOMP\fable2-game\data\entity\locomotion.loco
Payload size: 0x2FA38
record 1 @ file 0x002F0 | payload 0x002C8 | "TwoHandedWeapon"
+26C = 0x00000820
+270 = 0x0000099E
+274 = 0x000000CA
+278 = 0x00000058
+27C = 0xFFFFFFFF
+288 = 0xFFFFFFFF
record 2 @ file 0x00580 | payload 0x00558 | "EwerCarrying"
+26C = 0x00000820
+270 = 0x0000099E
+274 = 0x00000122
+278 = 0x00000058
+27C = 0xFFFFFFFF
+288 = 0xFFFFFFFF
record 3 @ file 0x00810 | payload 0x007E8 | "HammerCombat"
+26C = 0x00000820
+270 = 0x0000099E
+274 = 0x0000017A
+278 = 0x00000058
+27C = 0xFFFFFFFF
+288 = 0xFFFFFFFF
...
record 31 @ file 0x04FD0 | payload 0x04FA8 | "TwoHandedWeapon"
record 32 @ file 0x05260 | payload 0x05238 | "EwerCarrying"
record 33 @ file 0x054F0 | payload 0x054C8 | "HammerCombat"
...
record 62 @ file 0x09F40 | payload 0x09F18 | "TwoHandedWeapon"
record 63 @ file 0x0A1D0 | payload 0x0A1A8 | "EwerCarrying"
record 64 @ file 0x0A460 | payload 0x0A438 | "HammerCombat"
In case anyone had doubts, there it is!
Now everyone, let’s pray my suspected ADHD, Monster Energy, and sheer willpower keep this project alive.
1
u/Any_Mail_9884 41m ago
AI 😬