funman300 9b22435421 fifa17-recon: manager cards -- 417 ids, real names, and a nation/league slot that is ours alone
managercards: 417 rows, carddbid 1000001..1001552, assetid == carddbid on all 417,
value 57..88 (120 rows at exactly 57), rare 282/135 and NOT a rating threshold.
talkrating and formationid are 0 on ALL 417 rows -- both columns are dead in FIFA 17.
MEASURED from data/tables/, rowcount == rows_emitted.

Names come out after all, and by the CLIENT's own rule rather than an inference:
FUN_1801bb060 (879 bytes, read in full) does SELECT firstname,surname,... FROM manager
WHERE managerid == (*(u32*)(rec+0x18) & 0xffffff) - 1000000. Joining data/tables/
manager.json on that rule gives 1000509 Luis Enrique 88, 1000089 Wenger 86, 1000417
Guardiola 87, 1000414 Klopp 84 -- the ratings match the men, which a shifted column
could not produce. This supersedes the note that we get ids and not names: true of
managercards, false once you join `manager`.

Fixed here: `manager` has 747 rows but 746 distinct managerids -- managerid 107 is
duplicated with an empty-name row, and a plain dict comprehension kept the wrong one,
silently giving carddbid 1000107 a blank name and teamid 1357 instead of Slutskiy and
315. 296 -> 297 usable names.

THE KEY FACT, verified at instruction level: the parser routes the JSON `nation` to a
DIFFERENT record offset for a manager. At 0x180140e0b FUN_1800d8330's result is DEC'd
twice -- cardtype 1 stores nation to rec+0x148, cardtype 2 to rec+0xde, everything
else DISCARDS it. leagueId (atom 0x18a) lands unconditionally at rec+0xe0. The manager
merge FUN_1801356c0 (452 bytes, 1,587 chars, read in full) writes only firstname,
lastname, assetid, rating, talkrating, negotiation and rare -- it never touches
rec+0xde/+0xe0. So for a manager, WE are the only source of nation and league, and
they are read: FUN_1801a8580/FUN_1801a8540 feed FUN_1800e5940 ("ManagerCardBio"),
which publishes NATIONALITY, NATIONALITY_ASSET_ID and LEAGUE_ID.

That merge has NO else-branch, so unlike a coach a wrong manager id is COMPLETELY
SILENT. resourceId must equal carddbid exactly -- the manager arm reads the key raw,
with no & 0xffffff.

Also corrected against the design round's own draft: talkrating and negotiation are
NOT unread. FUN_1800e5940 publishes them as ATTRIB_TEAM_TALKS (rec+0xe2) and
ATTRIB_CONTRACT_NEGOTIATION (rec+0xe3). They come from the DB, not from us, and since
talkrating is 0 on all 417 rows TEAM TALKS reads 0 on every manager card in the game.

Not wired into the server in this commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VUT92pz6RWKih9dSr8ZpxW
2026-08-05 10:05:05 -07:00

OpenFUT

Offline Ultimate Team — like SPT, but for FIFA 23.

OpenFUT replaces EA's retired FUT servers with a fully offline, single-player backend. You own FIFA 23 legitimately. You just want to keep playing after EA shut down the servers.


Repositories

Repo Purpose
openfut-core Game-independent offline FUT backend
openfut-bridge FIFA 23 integration layer + reverse-engineering proxy

Architecture

FIFA 23 client
      │
      ▼
┌─────────────────┐
│  openfut-bridge │  ← intercepts FUT traffic, maps routes, logs unknown
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  openfut-core   │  ← offline FUT backend: profiles, packs, squads, SBCs
└─────────────────┘
         │
         ▼
   SQLite database

Core is game-independent. It speaks a clean REST API and knows nothing about FIFA 23 internals.

Bridge is FIFA-specific. It speaks FIFA 23's wire protocol and translates it into Core API calls. Bridge is where all reverse engineering work happens.


Current Status

Feature Status
Local profiles + clubs Working
Coin system Working
Pack generator Working
Card collection Working
Squad builder Working
Objectives engine Working
SBC engine Working
Match rewards Working
NPC transfer market Working
Statistics Working
FIFA 23 integration 🔴 Reverse engineering in progress
Chemistry calculation 🟡 In progress
Full Draft mode 🟡 In progress
Squad Battles AI generator 🟡 In progress
Objectives claim flow 🟡 In progress

Running

# Start the offline backend
cd openfut-core
cargo run

# Start the proxy (for traffic capture / FIFA integration)
cd openfut-bridge
cargo run

Core listens on http://127.0.0.1:8080 by default. Bridge listens on http://127.0.0.1:8443 by default.


Design Principles

  • Offline-first. No EA account required. No internet connection needed.
  • Single-player only. This is not a multiplayer server emulator.
  • Data-driven. All cards, packs, SBCs, and objectives are JSON files. Everything is moddable.
  • Clean architecture. Core has zero knowledge of FIFA 23. Bridge has zero game logic.
  • No copyrighted assets. No real player images, no EA trademarks in data files.

Disclaimer

This project is not affiliated with EA Sports. You must own FIFA 23 legitimately to use this software. This project does not bypass any ownership verification and is intended only to restore offline playability of a game whose online services have been retired.

S
Description
No description provided
Readme 25 MiB
Languages
Python 54.8%
Rust 41.2%
Shell 3.3%
Lua 0.3%
PowerShell 0.2%
Other 0.1%