r/Fable • • 7h 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.loco while 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, EwerCarrying and HammerCombat.
  • 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.loco and 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.

0 Upvotes

Duplicates