Compare commits
95 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 622a774f6a | |||
| cc694774a3 | |||
| 3d3239bab9 | |||
| a7e3e43ae9 | |||
| 31fc590b99 | |||
| 245c22161b | |||
| 43557989f5 | |||
| a3fd51692f | |||
| e578443d73 | |||
| e3092ca0f9 | |||
| 21a81ad63c | |||
| 3f3d5704a7 | |||
| 89da7b7609 | |||
| 1605e6effd | |||
| afdbb364ca | |||
| d0dbfa99c0 | |||
| 897259c8fb | |||
| 9348b83374 | |||
| ccf912c157 | |||
| f5002a0d4d | |||
| 3b58b29094 | |||
| cef1e8d1f4 | |||
| 214be11202 | |||
| c41b1514d3 | |||
| 550313362c | |||
| 122b7b94d2 | |||
| ccb736fa71 | |||
| 2f8a6512db | |||
| 0f83d73364 | |||
| 456ec24360 | |||
| 22ba361578 | |||
| 21b2263e30 | |||
| 0e4bc13db4 | |||
| 9b22435421 | |||
| 9feb577c1c | |||
| 340c31f34e | |||
| d8ef9d4c4f | |||
| 9876a6c870 | |||
| 7b9a4fde15 | |||
| d17cf684ea | |||
| 9a0a76c9f4 | |||
| 49733f79d1 | |||
| c76cf706ef | |||
| b996c0673d | |||
| 1b1c178c09 | |||
| c28cad281b | |||
| 0a1c9dc2ce | |||
| e9e6f203c2 | |||
| b0bbc2a07f | |||
| 87e5cd2e53 | |||
| 132a013b39 | |||
| a3fd9e870f | |||
| 7ad7aa0afa | |||
| 4c5cc3ab4b | |||
| ffb0e6033c | |||
| a7ac5a09fd | |||
| f65c197942 | |||
| 9ee21afb56 | |||
| d2bbb4d378 | |||
| 1e2b073e04 | |||
| b434a3efdc | |||
| 285d4f6cb7 | |||
| 1e9cfb6da9 | |||
| 9cf21202dc | |||
| 397d46f174 | |||
| 24bbc32da5 | |||
| 0968cd351b | |||
| 224874d1d3 | |||
| 38b10e5ec5 | |||
| b7943aead3 | |||
| dd8dddd7af | |||
| e5bfe58fc8 | |||
| 5b139864ee | |||
| 18d864908e | |||
| f488793b34 | |||
| a93a8bcdd7 | |||
| 5d5198f5d1 | |||
| 59934b4ef0 | |||
| 6270c37208 | |||
| f9ffcfdf20 | |||
| 69ef101efb | |||
| 0081dfc8d4 | |||
| f38231d89d | |||
| b05ccd7ce5 | |||
| f7f19aeed3 | |||
| 7a243aa795 | |||
| 629813b580 | |||
| 4e89cce37d | |||
| c7759a52c4 | |||
| 89dc9baa61 | |||
| 1b2319635d | |||
| 5c43dbe39e | |||
| bebe573d05 | |||
| 2083a8821e | |||
| 6ddd5e9d47 |
Generated
+6480
File diff suppressed because it is too large
Load Diff
+10
@@ -0,0 +1,10 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
members = [
|
||||
"openfut-core",
|
||||
"openfut-bridge",
|
||||
"openfut-launcher",
|
||||
"openfut-launcher/openfut-hook",
|
||||
"fifa-blaze/crates/blaze-proto",
|
||||
"fifa-blaze/crates/server",
|
||||
]
|
||||
@@ -0,0 +1,265 @@
|
||||
# OpenFUT — project handoff
|
||||
|
||||
Self-contained briefing for an assistant with **no access to this repo or machine**.
|
||||
Everything needed to understand the project and reason about its open problems is here.
|
||||
|
||||
---
|
||||
|
||||
## 1. What this is
|
||||
|
||||
**OpenFUT** is a clean-room, fully offline re-implementation of the server backend for
|
||||
**FIFA 17 Ultimate Team (FUT)**. EA's servers for FIFA 17 are long dead. The goal is to
|
||||
make the retail game's FUT mode fully playable again — open packs, build squads, use the
|
||||
transfer market, play matches and earn rewards — by emulating every server the client
|
||||
talks to, on localhost.
|
||||
|
||||
Nothing is decompiled *into* the project. The game's binaries are read to learn the
|
||||
**wire format** (which JSON keys, of which types, each response must contain), and the
|
||||
servers are written from scratch in Python against that spec.
|
||||
|
||||
The client is unmodified retail FIFA 17 running under Wine/Proton on Linux.
|
||||
|
||||
---
|
||||
|
||||
## 2. Architecture — four independent servers
|
||||
|
||||
FIFA 17 does not talk to one backend. It talks to four, on different protocols, and all
|
||||
four must be satisfied in sequence before FUT loads.
|
||||
|
||||
```
|
||||
FIFA 17 (Wine/Proton)
|
||||
│
|
||||
├─ LSX / Origin :4216 XML over TCP. Local Origin client emulation.
|
||||
│ Login, entitlements, persona.
|
||||
├─ Blaze :42127 redirector (TLS) → :42130 game server, :42131 nucleus
|
||||
│ EA's binary "Fire2/TDF" RPC protocol. Session, auth,
|
||||
│ and — critically — the CLIENT-CONFIG STORE.
|
||||
├─ UTAS / RS4 :8099 The FUT REST API. JSON over HTTP. ~45 endpoints.
|
||||
│ Club, squads, packs, market, matches. The bulk of it.
|
||||
└─ POW / EASFC :8094 (+ :8080 content) A third HTTP API, discovered late.
|
||||
Online status bar, level, EASFC credits, catalogue.
|
||||
```
|
||||
|
||||
Plus two helpers: a **roster** server (:8081) serving a roster-update XML the FUT
|
||||
loading screen blocks on, and **autopatch**, which patches the running process's
|
||||
ProtoSSL certificate verification so the client accepts our self-signed TLS.
|
||||
|
||||
### How the client is redirected
|
||||
|
||||
Three mechanisms, in decreasing order of preference:
|
||||
|
||||
1. **Blaze client-config keys** — the cleanest. Blaze serves a key/value config store
|
||||
and the client reads its own service URLs from it. `FUT_RS4_APIURL_<MODULE>` and
|
||||
`FUT_RS4_URL_<CALL>` point the FUT API at `127.0.0.1:8099`; `FIFA_POW_URL` points
|
||||
the EASFC layer at `127.0.0.1:8094`. **No root, no DNS games.**
|
||||
2. **`/etc/hosts`** — for hosts baked into the binary (`easw.easports.com`,
|
||||
`gosredirector.ea.com`).
|
||||
3. **iptables DNAT** — for a hardcoded IP (`159.153.51.20` → the Blaze redirector).
|
||||
|
||||
---
|
||||
|
||||
## 3. The wire format, and why it is unforgiving
|
||||
|
||||
FUT responses are JSON, but the client does **not** use a general JSON object model. Each
|
||||
response class has a hand-written SAX-style deserializer that walks tokens and dispatches
|
||||
on a **hashed key id** (an "atom"). This has three consequences that dominate the project:
|
||||
|
||||
**Atoms.** Every JSON key name maps to a 16-bit atom id via FNV-1a. There is a recovered
|
||||
table of ~900 (id → name). A response is really "which atoms does deserializer X read,
|
||||
and of what type".
|
||||
|
||||
**Type fidelity is fatal.** Feeding a scalar where the parser expects an object or array
|
||||
does not error — it **desyncs the token reader and the game hard-freezes** in a busy loop
|
||||
at `0x1801c7f1a`. This is the single most common way to break the game, and it has bitten
|
||||
this project repeatedly. Arrays must be arrays; nested objects must be objects.
|
||||
|
||||
**Unknown keys are usually skipped safely** — most deserializers route an unrecognised
|
||||
atom to a value-skip handler (`FUN_180135ff0`), so extra fields are inert. This document
|
||||
previously named `FutMoveCard` (`0x180128600`) as an exception with no skip handler at
|
||||
all. **That was wrong**, and the retraction is in §5a: it has two skip-handler call sites
|
||||
and parses seven atoms. No deserializer in this project is currently known to lack one.
|
||||
Treat any future "this class has no skip handler" claim as unproven until the search is
|
||||
shown to have covered the whole function.
|
||||
|
||||
### Working method
|
||||
|
||||
For any endpoint: find the response class's deserializer, extract the atom ids it
|
||||
compares against, map them to names, note the getter used for each (int / string / bool /
|
||||
nested), and build the minimal body. Omit nested members unless their shape is known —
|
||||
omission is skip-safe, a wrong shape freezes the game.
|
||||
|
||||
---
|
||||
|
||||
## 4. What works today (live-verified)
|
||||
|
||||
| Area | Status |
|
||||
|---|---|
|
||||
| Boot to the FUT hub | ✅ |
|
||||
| Club identity, coins, W/D/L record | ✅ |
|
||||
| Active squad — renders 11 real players, chemistry links | ✅ |
|
||||
| Squad building — `PUT /squad/<id>` fires, persists across relaunch | ✅ |
|
||||
| Squad roster ("MY SQUADS") | ✅ |
|
||||
| Transfer market — browse, bid, buy-now, sell, watchlist | ✅ |
|
||||
| Packs — buy, reveal, Send to Club | ✅ (the workaround is retired, see §5a) |
|
||||
| Quick sell — destroys cards, credits coins | ✅ |
|
||||
| Match loop — create/ready/play/destroy + coin rewards | ✅ implemented, **never played in-game** |
|
||||
| Online/EASFC status bar (no "servers unreachable") | ✅ when enabled |
|
||||
| Seasons / tournaments / leaderboards / champions | ⚠️ routed with reversed schemas, never live-tested |
|
||||
|
||||
Current save state: 99 club items, 8,400 coins, 0-0-0 record.
|
||||
|
||||
**Design convention:** every risky change ships behind an environment flag, default set
|
||||
to whatever is live-proven (`FUT_MASSINFO`, `FUT_USERINFO`, `FUT_MODES`,
|
||||
`FUT_PACK_AUTOCLUB`, `FUT_POW`, `FUT_STORE_GROUPS`, …). This exists because two working
|
||||
screens were broken by shipping "corrections" on by default.
|
||||
|
||||
---
|
||||
|
||||
## 5. Open problems
|
||||
|
||||
### 5a. "Send to Club" kills the FUT session — SOLVED 2026-08-04
|
||||
|
||||
Opening a pack shows the cards correctly; choosing **Send to Club** used to produce
|
||||
*"there has been an error connecting to FIFA 17 Ultimate Team"* and a logout, seven
|
||||
attempts running. The cards always moved server-side; only the acknowledgement was
|
||||
rejected.
|
||||
|
||||
The cause was the response body. `PUT ut/%s/item` returns per-item **verdict** records,
|
||||
not an acknowledgement, and the completion handler raises
|
||||
`EVENT_CARDS_MOVE_CARD_FAILURE` when the record vector is empty or when `success != 1`.
|
||||
Every body the project returned, `{}` included, reported the move as failed. The fix is
|
||||
the real shape:
|
||||
|
||||
```json
|
||||
{"itemData":[{"id":100000125,"pile":"club","success":true}, ...]}
|
||||
```
|
||||
|
||||
Live: five cards to the club, session survived, cards persisted, no `ut/delete/auth`.
|
||||
The autoclub workaround is retired.
|
||||
|
||||
Two corrections this closed, both worth carrying forward:
|
||||
|
||||
- The repo's claim that this deserializer had **no skip handler** and parsed only two
|
||||
keys was false. It came from searching a truncated decompile. It implied the body
|
||||
could not be at fault, which is what sent seven attempts after client-side state.
|
||||
Never conclude an absence from a truncated or unverified-length extraction.
|
||||
- The quick-sell asymmetry was not evidence of client state. Quick sell's callbacks
|
||||
read only the transport status code and never touch the body.
|
||||
|
||||
### 5b. "MY CLUB" counter always reads 0 — UNSOLVED
|
||||
|
||||
The hub tab bar shows `MY CLUB 0` despite the club holding 99 items.
|
||||
|
||||
**Eliminated by live test:**
|
||||
- **Not the item list** — the user opened MY CLUB, the client fetched the club and
|
||||
**displayed all 99 players correctly**, and the counter still read 0.
|
||||
- **Not `pileSizeClientData`** — the massinfo member that carries pile sizes as
|
||||
`{"entries":[{"key":int,"value":int}]}`. A probe sent 16 entries with uniquely
|
||||
identifiable values; the counter stayed 0.
|
||||
- **Not lazy loading** — the club endpoint was fetched 6 times that session.
|
||||
|
||||
**Unexplored contrast:** the `ACTIVE SQUAD` tab in the same bar correctly shows `11/23`.
|
||||
So some counters work. Whatever differs between that one and the club one is likely the
|
||||
answer.
|
||||
|
||||
### 5c. Store tiles render "unknown" — DIAGNOSED, NOT FIXED
|
||||
|
||||
Pack tiles show `unknown` with zero item counts. The `"unknown"` string is an
|
||||
unconditional **default** in a string constructor — the field simply never gets written.
|
||||
The store renders *display groups*, and `displayGroup` is parsed **recursively by the same
|
||||
element parser**. Sending it populated **froze the store** (the type-desync busy loop), so
|
||||
it is behind a flag, default off. Doing it properly needs the group's own field set worked
|
||||
out rather than a self-referential copy of the pack.
|
||||
|
||||
### 5d. Seasons and Draft refuse — UNSOLVED, and not obviously server-side
|
||||
|
||||
Selecting **single-player Seasons** raises *"There was a problem communicating with the
|
||||
FIFA Ultimate Team servers"* while making **zero requests to any layer**. UTAS, Blaze and
|
||||
POW logs show only pings and one census subscription across the whole failure window. No
|
||||
response can be wrong because no request was made. POW is eliminated (same failure with it
|
||||
enabled and disabled).
|
||||
|
||||
**Online Draft** hangs the client rather than crashing it (process alive, no dump). The
|
||||
one suspicious thing on the wire is `GET ut/%s/squad/mode/draft/state`, which our generic
|
||||
`/squad` route answers with a full active-squad object: 23 slots, nested `itemData`, a
|
||||
33-integer formation string. The real class wants `roundsInfo` plus a state enum, so this
|
||||
is a textbook type-desync candidate and the timing matches. **Nothing has isolated it**;
|
||||
it is a suspect, not a cause.
|
||||
|
||||
Both matter beyond themselves, because they are the only two routes into a match, and the
|
||||
`/match` request shape has therefore never been captured.
|
||||
|
||||
---
|
||||
|
||||
## 6. Notable reverse-engineering findings
|
||||
|
||||
- **Class → deserializer resolution.** A response class's name literal is preceded by a
|
||||
**4-byte header**, and the constructing factory's `lea` points at *the header*, not the
|
||||
text. Lookups must use `name_address - 4`. Six attempts failed on this off-by-four;
|
||||
four of them returned zero results and nearly got recorded as "this class has no
|
||||
deserializer".
|
||||
- **The request-template table is a floor, not a ceiling.** Several real endpoints are
|
||||
built by the caller appending a suffix and therefore never appear in the binary's URL
|
||||
table: `squad/list`, `user/club`, `club/stats/*`, `clientdata/<key>`. Only live traffic
|
||||
reveals them. This has caught the project three separate times.
|
||||
- **The documentation lies.** The project's own `ENDPOINT_MAP.md` (~1,360 lines, ~100
|
||||
reversed structs) has been wrong repeatedly: it claimed `FutMoveCard` parses
|
||||
`chemistry` (it does not); it called seven store pack fields "skipped no-ops" (all are
|
||||
parsed); it gave price-object keys as `amount`/`currency` (the parsers read
|
||||
`externalPriceId`). **Verify against the decompiler before relying on any row.**
|
||||
- **The online layer was hiding in an unpacked DLL.** "EA FC servers are unreachable"
|
||||
comes from a third HTTP API implemented in a *loose, unpacked, string-rich* library —
|
||||
not the packed executable, and not any layer previously emulated. It is redirectable
|
||||
purely through the Blaze config store.
|
||||
- **The main executable is Denuvo-packed.** Its code exists only in a live process. Live
|
||||
memory is readable via `/proc/PID/mem` (the PE is mapped flat), which is how a crash
|
||||
site was disassembled. Any logic living there cannot be reversed statically.
|
||||
|
||||
---
|
||||
|
||||
## 7. Tooling built
|
||||
|
||||
- A **PyGhidra harness** with helpers for decompiling, xrefs, vtables, byte scanning and
|
||||
class→deserializer resolution. (Ghidra's Java/OSGi scripting is broken on this machine;
|
||||
PyGhidra bypasses it entirely.)
|
||||
- A **minidump reader** — exception record, fault-time registers, module map, and a stack
|
||||
walk that recovers a usable backtrace.
|
||||
- A **live code grabber** that reads and disassembles unpacked code out of a running
|
||||
process.
|
||||
- A **read-only live probe** pattern for polling client model state while playing.
|
||||
- **Two test suites**: 380 live contract checks (freeze-safety: asserts every response
|
||||
field's type against the reversed schema) and 51 pure unit checks for match rewards.
|
||||
- A **traffic-replay audit** that diffs current responses against a known-good session —
|
||||
this is what proves a change did not alter what the client sees.
|
||||
|
||||
---
|
||||
|
||||
## 8. Documentation in-repo
|
||||
|
||||
| File | Contents |
|
||||
|---|---|
|
||||
| `ENDPOINT_MAP.md` | ~100 reversed response structs, atoms, types, freeze risks |
|
||||
| `FUT_RESPONSE_REBUILD_PLAN.md` | Squad family, massinfo, the service-layer call graph |
|
||||
| `REBUILD_RESEARCH.md` | Complete API surface, gap analysis, POW layer, and every eliminated hypothesis with its evidence |
|
||||
| `CARD_SYSTEM.md` | How card identity resolves locally from the game's own database |
|
||||
| `REPACK_INTEL.md` | Origin/LSX emulation notes |
|
||||
|
||||
---
|
||||
|
||||
## 9. Where help would be most valuable
|
||||
|
||||
1. **The MY CLUB counter (§5b).** Given the client demonstrably *has* the items and
|
||||
*renders* them, what else could a tab counter read from? Note that a sibling counter in
|
||||
the same bar works correctly.
|
||||
2. **Seasons refusing with zero requests to any server (§5d).** The client raises a
|
||||
"problem communicating with the FIFA Ultimate Team servers" without contacting
|
||||
anything. Nothing on the wire can be wrong because nothing went on the wire.
|
||||
3. **Whether the remaining problems are fixable server-side at all**, or whether the
|
||||
deciding logic lives in the Denuvo-packed executable and only live instrumentation can
|
||||
settle it. Note that this question was asked about `Send to Club` too, and there the
|
||||
answer turned out to be a plain wire fix, so treat "it must be client-side" as a
|
||||
hypothesis needing evidence rather than a fallback explanation.
|
||||
|
||||
Useful framing: this project's failures have almost always come from proposing a fix
|
||||
before testing the assumption under it. Hypotheses that come with a cheap way to
|
||||
disconfirm them are worth far more than plausible ones.
|
||||
@@ -0,0 +1,313 @@
|
||||
# OpenFUT — Project Report
|
||||
|
||||
**Goal:** make FIFA 17 Ultimate Team fully playable offline, forever, by re-implementing
|
||||
every server the game talks to.
|
||||
|
||||
**Status:** FUT boots, loads, and is playable. Packs, squads, the transfer market, coins
|
||||
and progression all work. Two cosmetic/flow problems remain open.
|
||||
|
||||
**Timeline:** 2026-06-25 → 2026-08-04 · 44 commits · ~12,900 lines of Python across 39
|
||||
tools · ~3,600 lines of reverse-engineering documentation.
|
||||
|
||||
---
|
||||
|
||||
## 1. What the project is
|
||||
|
||||
EA shut down FIFA 17's servers years ago, which kills Ultimate Team — the mode is entirely
|
||||
server-driven. Your club, squads, packs, market and progression all live server-side, so
|
||||
without a backend the mode is dead even though the game still installs and runs.
|
||||
|
||||
OpenFUT replaces that backend with local servers. The game is **unmodified retail
|
||||
FIFA 17** running under Wine/Proton on Linux; nothing is patched into the game except a
|
||||
single runtime tweak so it accepts our TLS certificate.
|
||||
|
||||
This is **clean-room work**. No EA code is copied or redistributed. The game's own
|
||||
binaries are read to learn the *wire format* — which JSON keys, of which types, each
|
||||
response must carry — and the servers are written from scratch against that specification.
|
||||
|
||||
---
|
||||
|
||||
## 2. Project history
|
||||
|
||||
The project changed target twice before finding its footing. That arc matters, because
|
||||
each pivot was driven by hitting a hard wall.
|
||||
|
||||
**Phase 1 — FIFA 23 (June 2026).** Began as an offline FUT backend for FIFA 23: a Rust
|
||||
core (`openfut-core`, Axum + SQLite), a protocol bridge (`openfut-bridge`), and a GUI
|
||||
launcher. All three built and passed tests. The architecture was sound but the client
|
||||
never got far enough to exercise it.
|
||||
|
||||
**Phase 2 — the FIFA 23 wall.** FIFA 23 refused to go online at all. Extensive reverse
|
||||
engineering of the connection state machine, live-memory probing, and forcing the
|
||||
"go online" gate directly all failed — the client's internal coherence checks were the
|
||||
wall, not any single flag. Documented as a dead end rather than fought.
|
||||
|
||||
**Phase 3 — the FIFA 17 pivot (late July).** FIFA 17 turned out to be a far better target:
|
||||
its network library is **unprotected and fully symboled**, exposing 979 RPC names. The
|
||||
insight was to crack FIFA 17 first and port the understanding back.
|
||||
|
||||
That worked, quickly:
|
||||
- **TLS pinning defeated** — the client's certificate verification is patched at runtime
|
||||
in memory, so a self-signed cert is accepted.
|
||||
- **Origin/LSX emulation** — the local Origin client protocol was reverse engineered,
|
||||
including the repack's own crypto layer, beating "log in to Origin" and
|
||||
"title version outdated".
|
||||
- **Blaze cracked end to end** — EA's binary RPC protocol: redirector, second-hop
|
||||
handshake, and the encoded pre-auth exchange. This was the big one.
|
||||
- **Full FUT API mapped** — ~100 response structures reverse engineered to field level.
|
||||
|
||||
**Phase 4 — building the FUT backend (August).** With the protocol understood, the work
|
||||
became making FUT actually *play*: card rendering, packs, the store, the transfer market,
|
||||
squads, and match rewards. This is where the project stands.
|
||||
|
||||
---
|
||||
|
||||
## 3. Architecture
|
||||
|
||||
FIFA 17 does not talk to one backend. It talks to **four**, on different protocols, and
|
||||
all four must be satisfied in sequence before FUT loads.
|
||||
|
||||
```
|
||||
FIFA 17 (Wine/Proton)
|
||||
│
|
||||
├─ LSX / Origin :4216 XML/TCP — local Origin client emulation
|
||||
│ login, entitlements, persona
|
||||
├─ Blaze :42127 redirector (TLS) → :42130 game, :42131 nucleus
|
||||
│ EA's binary Fire2/TDF RPC
|
||||
│ session, auth, and the CLIENT-CONFIG STORE
|
||||
├─ UTAS / RS4 :8099 the FUT REST API — JSON/HTTP, ~45 endpoints
|
||||
│ club, squads, packs, market, matches
|
||||
└─ POW / EASFC :8094 a third HTTP API (+ :8080 content)
|
||||
online status, level, credits, catalogue
|
||||
```
|
||||
|
||||
Plus **roster** (:8081), serving an XML file the FUT loading screen blocks on, and
|
||||
**autopatch**, which patches certificate verification in the running process.
|
||||
|
||||
### Redirection, in order of preference
|
||||
|
||||
1. **Blaze client-config keys** — the client reads its own service URLs from a key/value
|
||||
store that Blaze serves. Pointing FUT and EASFC at localhost needs **no root and no
|
||||
DNS manipulation**. This is the clean mechanism and most redirection uses it.
|
||||
2. **`/etc/hosts`** — for hostnames baked into the binary.
|
||||
3. **iptables DNAT** — for one hardcoded IP address.
|
||||
|
||||
---
|
||||
|
||||
## 4. The wire format — and why it is unforgiving
|
||||
|
||||
FUT responses are JSON, but the client does not use a general JSON object model. Each
|
||||
response class has a hand-written SAX-style deserializer that walks tokens and dispatches
|
||||
on a **hashed key id** ("atom"). Three consequences dominate the project:
|
||||
|
||||
**Atoms.** Every JSON key maps to a 16-bit id via FNV-1a. A recovered table of ~900
|
||||
id→name pairs is the Rosetta stone. A response spec is really "which atoms does this
|
||||
deserializer read, of what type".
|
||||
|
||||
**Type fidelity is fatal.** A scalar where an object or array is expected does not error —
|
||||
it **desyncs the reader and hard-freezes the game** in a busy loop. This is the primary
|
||||
failure mode of the entire project.
|
||||
|
||||
**Unknown keys are usually skipped — but not always.** Most deserializers route
|
||||
unrecognised atoms to a skip handler, making extra fields inert. At least one does not,
|
||||
so any unexpected key desyncs it.
|
||||
|
||||
**Working method:** locate the deserializer, extract its atom set and per-atom getter
|
||||
types, build the minimal body, and omit nested members whose shape isn't known — omission
|
||||
is safe, a wrong shape freezes the game.
|
||||
|
||||
---
|
||||
|
||||
## 5. What works
|
||||
|
||||
| Capability | State |
|
||||
|---|---|
|
||||
| Boot: Origin → Blaze → FUT hub | ✅ |
|
||||
| Club identity, coins, W/D/L record | ✅ |
|
||||
| Active squad — 11 real players, ratings, chemistry | ✅ |
|
||||
| Squad building — saves and survives relaunch | ✅ |
|
||||
| Squad roster ("MY SQUADS") | ✅ |
|
||||
| Transfer market — browse, bid, buy-now, list, watchlist | ✅ |
|
||||
| Store — buy packs | ✅ |
|
||||
| Packs — cards land in the club | ✅ via workaround (§6a) |
|
||||
| Quick sell — credits coins | ✅ |
|
||||
| Match loop — create/ready/play/destroy + rewards | ⚠️ built, **never requested by the client** (see below) |
|
||||
| Online/EASFC status bar | ✅ when enabled |
|
||||
| Seasons, tournaments, leaderboards, champions | ⚠️ routed, **never requested by the client** (see below) |
|
||||
| Card identity (names, faces, ratings) | ✅ resolves from the game's own local database |
|
||||
|
||||
### "Untested" is two different things, and the difference matters
|
||||
|
||||
The server log records the User-Agent of every request. The real client identifies as
|
||||
`ProtoHttp`; this project's own curl and Python probes do not. Separating them shows that
|
||||
several endpoints previously filed as "built but untested" have in fact **never been
|
||||
requested by the game at all**, and everything recorded against them was self-inflicted
|
||||
traffic:
|
||||
|
||||
| endpoint | client requests | project probes |
|
||||
|---|---|---|
|
||||
| `/leaderboards/options` | 5 | 1 |
|
||||
| `/clientdata/userHubData` | 13 | 2 |
|
||||
| `/user/accountinfo` | 23 | 49 |
|
||||
| `/season`, `/season/user` | **0** | 2 |
|
||||
| `/tournament`, `/tournament/user` | **0** | 3 |
|
||||
| `/leaderboards` (bare) | **0** | 2 |
|
||||
| `/champion` | **0** | 2 |
|
||||
| `/match` | **0** | 2 |
|
||||
| `/clubUser` | **0** | 93 |
|
||||
| `/user/list` | **0** | 180 |
|
||||
| `/sbs` (SBC), `/draft/mode` | **0** | 0 |
|
||||
|
||||
`/clubUser` and `/user/list` are the starkest: 273 requests between them, none from the
|
||||
game. Work was done on both on the assumption the client wanted them.
|
||||
|
||||
A zero in the client column does **not** mean the client never wants that endpoint. In
|
||||
most cases it means **nobody has navigated to that part of the game yet**. It does mean no
|
||||
claim about those endpoints has been tested against the client, and any analysis that does
|
||||
not apply this filter is misleading by default.
|
||||
|
||||
**Requirement:** every capture and analysis tool in this project should apply the
|
||||
User-Agent split by default rather than as an afterthought.
|
||||
|
||||
**Design convention.** Every risky change ships behind an environment flag whose default
|
||||
is whatever is live-proven. This exists because shipping "corrections" on by default broke
|
||||
two working screens — once freezing the store outright.
|
||||
|
||||
---
|
||||
|
||||
## 6. Open problems
|
||||
|
||||
### 6a. "Send to Club" ends the FUT session — SOLVED 2026-08-04
|
||||
|
||||
Opening a pack displayed the cards correctly, but choosing **Send to Club** produced
|
||||
*"there has been an error connecting to FIFA 17 Ultimate Team"* and a logout, seven
|
||||
attempts running. The cards always moved correctly server-side; only the
|
||||
acknowledgement was rejected.
|
||||
|
||||
**It was the response body all along.** `PUT ut/%s/item` does not parse an
|
||||
acknowledgement, it builds per-item **verdict** records, and the completion handler
|
||||
raises `EVENT_CARDS_MOVE_CARD_FAILURE` when the record vector is empty or when
|
||||
`success != 1`. Every body this project returned, `{}` included, therefore told the
|
||||
client the move had failed, and the client ended the FUT session because that is what
|
||||
that event does. Serving the real shape fixed it in one launch:
|
||||
|
||||
```json
|
||||
{"itemData":[{"id":100000125,"pile":"club","success":true}, ...]}
|
||||
```
|
||||
|
||||
Live result: five cards sent to the club, session survived, cards persisted, no
|
||||
`ut/delete/auth` logout. Both flags are now defaults and the autoclub workaround is
|
||||
retired.
|
||||
|
||||
**Why it took seven attempts,** which is the part worth keeping: the project had
|
||||
recorded that this deserializer had *no skip handler* and parsed only two keys. That
|
||||
was false, produced by searching a **truncated** decompile (the first 4,000 characters
|
||||
of a 6,193-character function). It implied "the body cannot be the problem", which is
|
||||
what redirected the investigation to client-side state. The quick-sell asymmetry that
|
||||
seemed to confirm it has a mundane explanation: quick sell's callbacks read only the
|
||||
transport status code and never touch the body, so its tolerance of `{}` said nothing
|
||||
about this endpoint.
|
||||
|
||||
The general lesson, now a standing rule: **never conclude an absence from a truncated
|
||||
or unverified-length extraction**, and treat every negative claim in the endpoint docs
|
||||
as weaker than the corresponding positive one.
|
||||
|
||||
### 6b. "MY CLUB" counter reads 0
|
||||
|
||||
The hub shows `MY CLUB 0` despite 99 items. Not the item list (the client *displays* all
|
||||
99), not the pile-size data (a 16-entry probe changed nothing), not lazy loading (fetched
|
||||
6 times). Unexplored: the neighbouring `ACTIVE SQUAD` counter works correctly — the
|
||||
difference between them is likely the answer.
|
||||
|
||||
### 6c. Store tiles read "unknown"
|
||||
|
||||
`"unknown"` is an unconditional default in a string constructor — the field is never
|
||||
written. The store renders *display groups*, and that member is parsed recursively by the
|
||||
same parser; sending it populated **froze the store**, so it is flagged off pending a
|
||||
correct group schema.
|
||||
|
||||
### 6d. Large parts of the game have never been opened
|
||||
|
||||
Distinct from 6a to 6c, which are things that misbehave. Per the User-Agent table in
|
||||
section 5, entire modes have never issued a single client request: Seasons, Tournaments,
|
||||
FUT Champions, Draft, SBC, and the match loop itself. Their endpoints are routed and their
|
||||
schemas are reversed, but no claim about any of them has been tested against the game.
|
||||
|
||||
This is not a bug list. It is unmeasured surface, and it is the cheapest information
|
||||
available to the project because most of it costs nothing but navigating menus. It is
|
||||
recorded here because "routed from a reversed schema" reads like a stronger claim than it
|
||||
is, and section 7 warns that this project's notes have described things differently from
|
||||
what is true.
|
||||
|
||||
*A multi-agent investigation into 6a and 6b is currently running.*
|
||||
|
||||
---
|
||||
|
||||
## 7. Notable findings
|
||||
|
||||
- **Class → deserializer resolution.** A response class's name literal is preceded by a
|
||||
4-byte header and the factory points at *the header*. Six attempts failed on that
|
||||
off-by-four; four returned nothing and were nearly recorded as "no deserializer exists".
|
||||
- **The URL table is a floor, not a ceiling.** Several real endpoints are built by
|
||||
appending a suffix at the call site and never appear in the binary's template table.
|
||||
Only live traffic reveals them — this caught the project three separate times.
|
||||
- **The project's own documentation has been wrong repeatedly** — fields described as
|
||||
inert turned out to be parsed, and documented key names didn't match the parsers.
|
||||
Verify against the decompiler, not the notes.
|
||||
- **The online layer was hiding in plain sight.** "EA FC servers unreachable" comes from a
|
||||
third HTTP API in a *loose, unpacked, string-rich* library — not the protected
|
||||
executable, and not any previously emulated layer. Redirectable purely by config.
|
||||
- **The main executable is Denuvo-packed**, so its code exists only in a live process.
|
||||
Live memory is readable, which is how a crash site was disassembled — but logic living
|
||||
there cannot be reverse engineered statically.
|
||||
|
||||
---
|
||||
|
||||
## 8. Tooling and quality
|
||||
|
||||
- **PyGhidra harness** with decompile / xref / vtable / byte-scan / class-resolution
|
||||
helpers (Ghidra's own Java scripting is broken on this machine).
|
||||
- **Minidump reader** — exception record, fault-time registers, module map, stack walk.
|
||||
- **Live code grabber** — reads and disassembles unpacked code from a running process.
|
||||
- **Read-only live model probes** for watching client state while playing.
|
||||
- **Test suites:** 380 live contract checks (type/freeze safety per reversed schema) plus
|
||||
51 pure unit checks. Both green.
|
||||
- **Traffic-replay audit** — diffs current responses against a known-good session to prove
|
||||
a change didn't alter what the client sees.
|
||||
- **~3,600 lines of RE documentation** across six files, including every eliminated
|
||||
hypothesis with its supporting evidence.
|
||||
|
||||
---
|
||||
|
||||
## 9. Roadmap
|
||||
|
||||
**Immediate (free, no code):** play a match — the reward loop is built and unit-tested but
|
||||
has never run in-game. Enable the game-mode endpoints and see whether four more modes
|
||||
light up.
|
||||
|
||||
**Near term:** close the two open problems, most likely via live instrumentation rather
|
||||
than more static analysis. Implement SBC and Draft (schemas already recovered). Fix the
|
||||
store display groups properly.
|
||||
|
||||
**Longer term:** the stated destination is porting this into the Rust `openfut-core`
|
||||
behind a FIFA-17 bridge. Everything currently lives in Python prototypes; the
|
||||
documentation is now good enough to write the port against.
|
||||
|
||||
---
|
||||
|
||||
## 10. Honest assessment
|
||||
|
||||
**What went well.** The FIFA 17 pivot was the decisive call — recognising that an
|
||||
unprotected binary was worth more than persisting against a hardened one. Blaze, Origin
|
||||
and the FUT API were all cracked end to end. The freeze-safety test suite has repeatedly
|
||||
caught regressions before they reached the game.
|
||||
|
||||
**What went badly.** Progress has been slowest where fixes were proposed before the
|
||||
assumption under them was tested. Both open problems absorbed many attempts built on
|
||||
plausible but unverified theories; several were disproved in a single measurement that
|
||||
could have been taken first. Two working screens were broken by shipping unverified
|
||||
"corrections" on by default — which is precisely why the flag convention exists now.
|
||||
|
||||
**The most reliable technique** has been comparing a working case against a failing one:
|
||||
diffing live traffic against a known-good session, and contrasting a succeeding endpoint
|
||||
with its failing sibling. That has produced more answers than any amount of decompilation.
|
||||
@@ -0,0 +1,340 @@
|
||||
{
|
||||
"metadata": {
|
||||
"reportDate": "2026-07-28",
|
||||
"codebaseName": "OpenFUT",
|
||||
"version": "0.1.0",
|
||||
"submodulesCovered": [
|
||||
"openfut-core",
|
||||
"openfut-bridge",
|
||||
"openfut-launcher"
|
||||
],
|
||||
"language": "Rust",
|
||||
"framework": "Axum + SQLite"
|
||||
},
|
||||
"vulnerabilities": [
|
||||
{
|
||||
"severity": "critical",
|
||||
"category": "authentication",
|
||||
"file": "openfut-core/src/services/profile.rs",
|
||||
"line": 8,
|
||||
"cwe": "CWE-287",
|
||||
"title": "Missing Authentication on All Endpoints",
|
||||
"description": "No authentication or authorization checks on any API endpoint. The system uses single-profile design with get_active_profile() returning the first row (LIMIT 1) without any token validation, session management, or per-user isolation. In a networked context, any HTTP client can access all endpoints without credentials.",
|
||||
"impact": "Complete compromise of data confidentiality and integrity. Any attacker can view, modify, or delete all user data without authentication.",
|
||||
"exploitPath": "curl http://127.0.0.1:8080/clubs - accesses club data without any auth headers or tokens",
|
||||
"recommendation": "Implement stateless JWT tokens or session-based authentication. Add middleware to validate tokens on all endpoints. Implement per-user authorization checks in services."
|
||||
},
|
||||
{
|
||||
"severity": "critical",
|
||||
"category": "injection",
|
||||
"file": "openfut-core/src/routes/auth.rs",
|
||||
"line": 87,
|
||||
"cwe": "CWE-89",
|
||||
"title": "SQL Injection via String Interpolation",
|
||||
"description": "SQL table names are interpolated using string formatting: sqlx::query(&format!(\"DELETE FROM {table}\")). Although currently hardcoded in a loop, this violates parameterized query principles and creates a risk if the table list ever becomes user-controlled or the pattern is copied elsewhere.",
|
||||
"impact": "Potential remote code execution via database manipulation. If extended to user input, attackers could modify arbitrary tables or drop the database.",
|
||||
"exploitPath": "Currently mitigated by hardcoded table names, but the pattern is dangerous and violates secure coding practices.",
|
||||
"recommendation": "Use SQLx's dynamic query builders or identifier types that properly escape table/column names. Replace format! string interpolation with sqlx::query_builder for dynamic identifiers."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "configuration",
|
||||
"file": "openfut-bridge/src/proxy.rs",
|
||||
"line": 44,
|
||||
"cwe": "CWE-295",
|
||||
"title": "TLS Certificate Validation Disabled",
|
||||
"description": "HTTP client explicitly disables TLS certificate validation: .danger_accept_invalid_certs(true). This bypasses all certificate pinning, expiration, and hostname verification, making the bridge vulnerable to man-in-the-middle attacks.",
|
||||
"impact": "Attacker positioned between bridge and upstream can intercept, modify, or read all traffic. Compromises confidentiality and integrity of requests to Core and external services.",
|
||||
"exploitPath": "MITM attack between openfut-bridge and openfut-core or upstream services. ARP spoofing on localhost subnet would redirect traffic.",
|
||||
"recommendation": "Remove .danger_accept_invalid_certs(true) in production. If testing requires it, gate behind a development-only environment variable with strong warning. Use proper certificate management (CA bundles, cert pinning)."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "dos",
|
||||
"file": "openfut-core/src/services/season.rs",
|
||||
"line": 23,
|
||||
"cwe": "CWE-248",
|
||||
"title": "Unguarded expect() Causes Denial of Service",
|
||||
"description": "Multiple unchecked expect() calls that will panic and crash the server if database queries fail or return unexpected results: Ok(fetch(pool, profile_id).await?.expect(\"just inserted\"))",
|
||||
"impact": "Denial of service. A single database inconsistency or race condition crashes the entire server, making the application unavailable.",
|
||||
"exploitPath": "Trigger race conditions during concurrent requests (e.g., rapid profile deletion + season fetch). Database corruption or migration failure crashes the service immediately.",
|
||||
"recommendation": "Replace expect() with proper error handling (Result types, error logging, graceful degradation). Handle database query failures without panicking. Add integration tests for race conditions."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "dos",
|
||||
"file": "openfut-core/src/services/season.rs",
|
||||
"line": 69,
|
||||
"cwe": "CWE-248",
|
||||
"title": "Unguarded expect() in season fetch",
|
||||
"description": "let season = fetch(pool, profile_id).await?.expect(\"season must exist\"); Panics if season is not found.",
|
||||
"impact": "Server crash on missing or deleted season records.",
|
||||
"exploitPath": "Delete a season via concurrent requests, then call /seasons endpoint. Server panics.",
|
||||
"recommendation": "Return proper error (AppError::NotFound) instead of panicking."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "dos",
|
||||
"file": "openfut-core/src/services/season.rs",
|
||||
"line": 144,
|
||||
"cwe": "CWE-248",
|
||||
"title": "Unguarded expect() in season update",
|
||||
"description": "let updated = fetch(pool, profile_id).await?.expect(\"season must exist\");",
|
||||
"impact": "Server crash on concurrent season modifications.",
|
||||
"exploitPath": "Rapid concurrent season updates that fail race conditions.",
|
||||
"recommendation": "Handle missing records gracefully."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "cors",
|
||||
"file": "openfut-core/src/app.rs",
|
||||
"line": 257,
|
||||
"cwe": "CWE-346",
|
||||
"title": "Permissive CORS Configuration Allows All Origins",
|
||||
"description": ".layer(CorsLayer::permissive()) enables CORS for all origins (*), methods, and headers. Any website can make cross-origin requests to the API and access/modify data.",
|
||||
"impact": "Cross-site request forgery (CSRF) attacks. Malicious websites can issue API requests on behalf of users. Data exfiltration via JavaScript from any origin.",
|
||||
"exploitPath": "Attacker website:\n <img src=\"http://127.0.0.1:8080/clubs\" />\n Fetch API calls to delete profiles, modify squads, etc.",
|
||||
"recommendation": "Restrict CORS to specific origins (e.g., localhost:3000 for web UI, or the game process if exposed). Use CorsLayer::very_restrictive() as default and explicitly allowlist origins."
|
||||
},
|
||||
{
|
||||
"severity": "high",
|
||||
"category": "dos",
|
||||
"file": "openfut-bridge/src/proxy.rs",
|
||||
"line": 47,
|
||||
"cwe": "CWE-248",
|
||||
"title": "HTTP Client Construction Panic",
|
||||
"description": ".expect(\"failed to build HTTP client\") will panic if the HTTP client fails to initialize, crashing the entire proxy service on startup.",
|
||||
"impact": "Service unavailability. Bridge cannot start if HTTP client configuration is invalid.",
|
||||
"exploitPath": "Invalid system configuration or missing TLS libraries causes HTTP client build to fail, crashing bridge during startup.",
|
||||
"recommendation": "Return Result<ProxyState, Error> from new() and handle construction errors. Use anyhow::Context for better error messages."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "information-disclosure",
|
||||
"file": "openfut-core/src/error.rs",
|
||||
"line": 54,
|
||||
"cwe": "CWE-209",
|
||||
"title": "Error Messages Leak Implementation Details",
|
||||
"description": "JSON parsing errors are returned directly to clients: format!(\"json parse error: {e}\"). Exposes serde_json parser internals and syntax details useful for crafting attacks.",
|
||||
"impact": "Information disclosure. Attackers learn the JSON parser implementation and can tailor payloads to bypass validation or find parser-specific quirks.",
|
||||
"exploitPath": "Send malformed JSON to any endpoint. Response includes parser error details (e.g., 'expected `,` at line 2 col 5') that aid in crafting exploits.",
|
||||
"recommendation": "Return generic error message to clients: 'invalid request format'. Log detailed errors internally with tracing for debugging."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "information-disclosure",
|
||||
"file": "openfut-core/src/error.rs",
|
||||
"line": 40,
|
||||
"cwe": "CWE-215",
|
||||
"title": "Database Errors Logged with Full Details",
|
||||
"description": "Database errors are logged with full SQL/query details: tracing::error!(\"Database error: {e}\"). If logs are exposed or compromised, schema, query patterns, and data structure are revealed.",
|
||||
"impact": "Information disclosure in logs. Compromised log files expose database schema and query logic useful for SQL injection or data exfiltration planning.",
|
||||
"exploitPath": "Access server logs (via log aggregation service, file access, etc.) and extract database schema and query patterns.",
|
||||
"recommendation": "Log only error type and ID to clients. Sanitize logs before exporting. Use structured logging with field masking for queries."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "input-validation",
|
||||
"file": "openfut-core/src/routes/auth.rs",
|
||||
"line": 17,
|
||||
"cwe": "CWE-1025",
|
||||
"title": "Hardcoded Default Credentials",
|
||||
"description": "Default username 'Player 1' is hardcoded with no unique identifier enforcement. Multiple profiles can be created with identical usernames, and weak defaults are used.",
|
||||
"impact": "Weak account creation, potential for account confusion or conflicts. No strong identity guarantees.",
|
||||
"exploitPath": "Multiple users create profiles with default 'Player 1' username. No way to distinguish profiles programmatically.",
|
||||
"recommendation": "Require explicit username on profile creation. Use UUIDs as primary identifiers. Validate username uniqueness and minimum length."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "input-validation",
|
||||
"file": "openfut-core/src/services/",
|
||||
"line": 0,
|
||||
"cwe": "CWE-400",
|
||||
"title": "Missing Input Length Validation",
|
||||
"description": "No maximum length checks on string fields (usernames, club names, squad names, etc.). Large inputs can cause database bloat, memory exhaustion, or DoS.",
|
||||
"impact": "Denial of service via large payloads. Database bloat. Memory exhaustion. While DefaultBodyLimit::max(256KB) provides some protection, field-level validation is missing.",
|
||||
"exploitPath": "POST /auth/local with username = 256KB string. Database receives bloated data. Repeated calls exhaust storage.",
|
||||
"recommendation": "Add input validation for all user-submitted strings. Set maximum lengths (e.g., username: 50 chars, club name: 100 chars). Validate at route handler level."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "configuration",
|
||||
"file": "openfut-core/src/db.rs",
|
||||
"line": 13,
|
||||
"cwe": "CWE-315",
|
||||
"title": "Unencrypted SQLite Database on Disk",
|
||||
"description": "SQLite database file (openfut.db) is stored unencrypted on disk. All user data, profiles, squads, cards, etc., are readable by anyone with filesystem access.",
|
||||
"impact": "Data breach if server filesystem is compromised. No protection against:local file access, stolen backups, forensic recovery.",
|
||||
"exploitPath": "Attacker gains filesystem access (compromised server, stolen disk). Reads openfut.db directly. All game data is readable without authentication.",
|
||||
"recommendation": "Use SQLite encryption (e.g., sqlcipher crate) or migrate to PostgreSQL with TLS. Implement file-level encryption. Use restrictive filesystem permissions (0600)."
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"category": "rate-limiting",
|
||||
"file": "openfut-core/src/app.rs",
|
||||
"line": 0,
|
||||
"cwe": "CWE-770",
|
||||
"title": "No Rate Limiting on Endpoints",
|
||||
"description": "No per-IP or per-user rate limiting. Endpoints like POST /auth/reset can be called repeatedly without restriction, allowing attackers to repeatedly wipe all data.",
|
||||
"impact": "Denial of service and data destruction. Attacker can spam /auth/reset to destroy user data or exhaust server resources.",
|
||||
"exploitPath": "for i in 1..1000: POST /auth/reset with confirm='reset'. All data wiped repeatedly.",
|
||||
"recommendation": "Implement rate limiting middleware using tower_governor or similar. Add per-IP limits (e.g., 10 requests/min) and per-endpoint limits. Use exponential backoff."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"category": "audit-logging",
|
||||
"file": "openfut-core/src/services/",
|
||||
"line": 0,
|
||||
"cwe": "CWE-778",
|
||||
"title": "Missing Audit Logging",
|
||||
"description": "No audit trail of user actions (profile creation, data deletion, squad modifications). Cannot detect unauthorized access, data tampering, or compliance violations.",
|
||||
"impact": "Incident response and forensics are impossible. Cannot determine who did what and when. Compliance risks (GDPR, etc.).",
|
||||
"exploitPath": "Attacker deletes all profiles, modifies squads. No audit log shows what happened or who did it.",
|
||||
"recommendation": "Add audit logging for all data mutations. Log: timestamp, user (profile) ID, action, resource affected, before/after state. Store in separate immutable table."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"category": "dependencies",
|
||||
"file": "openfut-bridge/Cargo.toml",
|
||||
"line": 0,
|
||||
"cwe": "CWE-1035",
|
||||
"title": "Older Dependency Versions (reqwest, rustls)",
|
||||
"description": "openfut-bridge uses reqwest 0.11 (latest is 0.12) and rustls 0.21 (latest is 0.23). Intentional for version matching, but creates a larger surface area for known CVEs.",
|
||||
"impact": "Potential vulnerabilities in older dependencies. Delayed access to security patches.",
|
||||
"exploitPath": "Known CVE in reqwest 0.11 or rustls 0.21 could be exploited. Combined with danger_accept_invalid_certs, TLS bypass becomes easier.",
|
||||
"recommendation": "Upgrade dependencies to latest versions when possible. Monitor CVE databases (CVE, RustSec) for the versions in use. Pin versions and set up automated dependency updates."
|
||||
},
|
||||
{
|
||||
"severity": "low",
|
||||
"category": "error-handling",
|
||||
"file": "openfut-core/src/app.rs",
|
||||
"line": 256,
|
||||
"cwe": "CWE-248",
|
||||
"title": "Body Size Limit Without Per-Field Validation",
|
||||
"description": "DefaultBodyLimit::max(256KB) limits the entire request body, but individual fields are not validated. A single large field can consume most of the limit.",
|
||||
"impact": "Mild DoS. Large field values cause database bloat. Not a critical issue due to body limit, but field-level validation would be better.",
|
||||
"exploitPath": "POST /auth/local with 250KB club_name field. Database receives bloated data.",
|
||||
"recommendation": "Add per-field validation in addition to body limits. Validate and sanitize fields before database insertion."
|
||||
}
|
||||
],
|
||||
"riskScore": 82,
|
||||
"riskCategory": "CRITICAL",
|
||||
"riskSummary": "OpenFUT has critical security issues that would make it unsafe for production or networked deployment. The most severe are the complete absence of authentication/authorization and the SQL injection pattern in the auth.rs module. The system is designed as single-player (single-profile) with no multi-tenant isolation, which is dangerous if exposed to the network.",
|
||||
"recommendations": [
|
||||
{
|
||||
"priority": "CRITICAL",
|
||||
"area": "Authentication & Authorization",
|
||||
"recommendation": "Implement JWT-based or session-based authentication on all endpoints. Add middleware to validate auth tokens on every request. Implement per-profile authorization checks. Currently any HTTP client can access all endpoints.",
|
||||
"effort": "High",
|
||||
"impact": "Blocks all data breaches from unauthenticated access"
|
||||
},
|
||||
{
|
||||
"priority": "CRITICAL",
|
||||
"area": "SQL Injection Prevention",
|
||||
"recommendation": "Replace sqlx::query(&format!(...)) in auth.rs:87 with proper parameterized identifiers. Use sqlx::query_builder for dynamic table/column names instead of string interpolation.",
|
||||
"effort": "Low",
|
||||
"impact": "Prevents SQL injection even if pattern is copied to user input"
|
||||
},
|
||||
{
|
||||
"priority": "HIGH",
|
||||
"area": "TLS & Transport Security",
|
||||
"recommendation": "Remove .danger_accept_invalid_certs(true) from proxy.rs:44. If development requires it, gate behind an environment variable (e.g., DEV_SKIP_TLS_VERIFICATION) with strong warnings in logs.",
|
||||
"effort": "Low",
|
||||
"impact": "Prevents MITM attacks on bridge-to-core communication"
|
||||
},
|
||||
{
|
||||
"priority": "HIGH",
|
||||
"area": "Error Handling",
|
||||
"recommendation": "Replace all expect() calls with proper Result handling. Use anyhow::Context or custom error types. Add logging for debugging but return generic errors to clients.",
|
||||
"effort": "Medium",
|
||||
"impact": "Prevents DoS via server panics"
|
||||
},
|
||||
{
|
||||
"priority": "HIGH",
|
||||
"area": "CORS",
|
||||
"recommendation": "Replace CorsLayer::permissive() with CorsLayer::very_restrictive() or explicit allowlist. For single-player use, restrict to localhost and the game process only.",
|
||||
"effort": "Low",
|
||||
"impact": "Prevents CSRF and cross-origin attacks"
|
||||
},
|
||||
{
|
||||
"priority": "HIGH",
|
||||
"area": "Rate Limiting",
|
||||
"recommendation": "Add per-IP rate limiting using tower_governor or similar. Implement limits on destructive endpoints (e.g., POST /auth/reset: 1 request per hour per IP).",
|
||||
"effort": "Medium",
|
||||
"impact": "Prevents DoS and repeated data destruction"
|
||||
},
|
||||
{
|
||||
"priority": "MEDIUM",
|
||||
"area": "Input Validation",
|
||||
"recommendation": "Add maximum length validation for all string fields (username, club_name, squad_name, etc.). Enforce at route handler level. Example: username max 50 chars, club_name max 100 chars.",
|
||||
"effort": "Medium",
|
||||
"impact": "Prevents database bloat and data validation failures"
|
||||
},
|
||||
{
|
||||
"priority": "MEDIUM",
|
||||
"area": "Data Encryption",
|
||||
"recommendation": "Use SQLite encryption (sqlcipher) or migrate to PostgreSQL with TLS. Set restrictive filesystem permissions (0600) on openfut.db.",
|
||||
"effort": "High",
|
||||
"impact": "Protects data at rest from filesystem access"
|
||||
},
|
||||
{
|
||||
"priority": "MEDIUM",
|
||||
"area": "Error Message Handling",
|
||||
"recommendation": "Return generic error messages to clients. Log detailed errors internally. Example: client sees 'invalid request', server logs 'JSON parse error: expected `,` at line 2'.",
|
||||
"effort": "Low",
|
||||
"impact": "Reduces information disclosure"
|
||||
},
|
||||
{
|
||||
"priority": "MEDIUM",
|
||||
"area": "Audit Logging",
|
||||
"recommendation": "Add audit trail for all data mutations (create, update, delete). Log timestamp, profile ID, action, resource, and before/after state. Store in immutable audit_log table.",
|
||||
"effort": "Medium",
|
||||
"impact": "Enables incident response and forensics"
|
||||
},
|
||||
{
|
||||
"priority": "LOW",
|
||||
"area": "Dependency Management",
|
||||
"recommendation": "Upgrade reqwest to 0.12 and rustls to 0.23 when possible. Set up Dependabot or RustSec monitoring for CVEs. Regularly audit dependencies.",
|
||||
"effort": "Low",
|
||||
"impact": "Reduces attack surface from known CVEs"
|
||||
},
|
||||
{
|
||||
"priority": "LOW",
|
||||
"area": "Default Values",
|
||||
"recommendation": "Remove hardcoded default username 'Player 1'. Require explicit username on profile creation. Use UUIDs for profile identification.",
|
||||
"effort": "Low",
|
||||
"impact": "Improves account identity and prevents confusion"
|
||||
}
|
||||
],
|
||||
"securityDesignNotes": {
|
||||
"intendedUse": "OpenFUT is designed for single-player offline use. Single-profile design is intentional for local FIFA 23 emulation.",
|
||||
"deploymentContext": "Localhost only (127.0.0.1:8080). Not intended for networked or multi-user deployment.",
|
||||
"implicationForSecurity": "Many security issues (no auth, permissive CORS) are acceptable for localhost-only use. However, the code structure lacks security boundaries, so if ever exposed to the network, it would be completely unsecured. Recommend adding security gates now rather than retrofitting later.",
|
||||
"suggestedDefensiveApproach": "Even for single-player use, add security layers (basic auth, CORS restrictions, rate limiting) to prevent accidental misuse if deployed in an unsafe context."
|
||||
},
|
||||
"positiveFindingsAndStrengths": [
|
||||
"✓ SQLx is used throughout with parameterized queries (except auth.rs:87)",
|
||||
"✓ Foreign key constraints are enforced in SQLite",
|
||||
"✓ UUIDs are used for entity IDs instead of sequential IDs (reduces enumeration attacks)",
|
||||
"✓ Request body size is limited to 256KB (prevents large payload DoS)",
|
||||
"✓ Concurrency is limited to 256 concurrent requests",
|
||||
"✓ Sensitive tokens (X-UT-SID, X-UT-PHISHING-TOKEN) are stripped from captures",
|
||||
"✓ Logging is structured using tracing crate (good for audit trails)",
|
||||
"✓ Services layer properly encapsulates database access"
|
||||
],
|
||||
"testingRecommendations": [
|
||||
"Add integration tests for authentication bypass (attempt to access endpoints without tokens)",
|
||||
"Test SQL injection payloads in auth.rs:87 pattern (if table names become dynamic)",
|
||||
"Test CORS with cross-origin requests from external origins",
|
||||
"Test rate limiting with rapid concurrent requests to /auth/reset",
|
||||
"Test input validation with oversized strings (100MB+ usernames)",
|
||||
"Test panic handling with corrupted database state",
|
||||
"Test TLS MITM scenarios (certificate pinning validation)",
|
||||
"Add fuzz testing for JSON parsing to find edge cases"
|
||||
],
|
||||
"complianceNotes": {
|
||||
"gdpr": "No explicit data handling policy. If user data is processed, GDPR requires consent, data retention limits, and audit trails. Not currently implemented.",
|
||||
"dataProtection": "Unencrypted database at rest violates most data protection frameworks.",
|
||||
"logging": "Audit logging is missing, violating compliance requirements."
|
||||
}
|
||||
}
|
||||
+1
-1
Submodule fifa-blaze updated: eccd46f52b...d2a9a01ec9
@@ -9,3 +9,5 @@
|
||||
*.log
|
||||
__pycache__/
|
||||
captures/
|
||||
staging/
|
||||
tools/fifa17_profile.json
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,416 @@
|
||||
{
|
||||
"_source": "data/tables/*.json dumped read-only from the running client by tools/db_dump.py",
|
||||
"_key": "resourceId == carddbid, RAW u32 (the staff branches of FUN_180141660 do NOT mask, unlike players)",
|
||||
"families": {
|
||||
"headcoach": {
|
||||
"cardsubtypeid": 5,
|
||||
"table": "headcoachcards",
|
||||
"record_4c": 3,
|
||||
"rowcount": 124,
|
||||
"carddbid_band": [
|
||||
2000004,
|
||||
2000328
|
||||
],
|
||||
"absent_ids_in_band": 201,
|
||||
"miss_fill_assetid": 2000148,
|
||||
"seeds": [
|
||||
{
|
||||
"carddbid": 2000004,
|
||||
"assetid": 2000004,
|
||||
"attribute": 0,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000008,
|
||||
"assetid": 2000008,
|
||||
"attribute": 2,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000016,
|
||||
"assetid": 2000016,
|
||||
"attribute": 5,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000024,
|
||||
"assetid": 2000024,
|
||||
"attribute": 4,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000032,
|
||||
"assetid": 2000032,
|
||||
"attribute": 5,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000044,
|
||||
"assetid": 2000044,
|
||||
"attribute": 1,
|
||||
"value": 64,
|
||||
"amount": 5,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 2000064,
|
||||
"assetid": 2000064,
|
||||
"attribute": 1,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 2000084,
|
||||
"assetid": 2000084,
|
||||
"attribute": 3,
|
||||
"value": 66,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 2000124,
|
||||
"assetid": 2000124,
|
||||
"attribute": 0,
|
||||
"value": 70,
|
||||
"amount": 10,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 2000164,
|
||||
"assetid": 2000164,
|
||||
"attribute": 1,
|
||||
"value": 77,
|
||||
"amount": 10,
|
||||
"rare": 0
|
||||
}
|
||||
],
|
||||
"bad_controls": [
|
||||
2000005,
|
||||
2000089,
|
||||
2000177,
|
||||
2000259
|
||||
]
|
||||
},
|
||||
"gkcoach": {
|
||||
"cardsubtypeid": 6,
|
||||
"table": "gkcoachcards",
|
||||
"record_4c": 10,
|
||||
"rowcount": 121,
|
||||
"carddbid_band": [
|
||||
9000001,
|
||||
9000324
|
||||
],
|
||||
"absent_ids_in_band": 203,
|
||||
"miss_fill_assetid": 9000258,
|
||||
"seeds": [
|
||||
{
|
||||
"carddbid": 9000001,
|
||||
"assetid": 9000001,
|
||||
"attribute": 0,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 9000017,
|
||||
"assetid": 9000017,
|
||||
"attribute": 4,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 9000021,
|
||||
"assetid": 9000021,
|
||||
"attribute": 5,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 9000025,
|
||||
"assetid": 9000025,
|
||||
"attribute": 0,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 9000037,
|
||||
"assetid": 9000037,
|
||||
"attribute": 3,
|
||||
"value": 64,
|
||||
"amount": 5,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 9000081,
|
||||
"assetid": 9000081,
|
||||
"attribute": 2,
|
||||
"value": 66,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 9000117,
|
||||
"assetid": 9000117,
|
||||
"attribute": 5,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 9000121,
|
||||
"assetid": 9000121,
|
||||
"attribute": 0,
|
||||
"value": 75,
|
||||
"amount": 10,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 9000125,
|
||||
"assetid": 9000125,
|
||||
"attribute": 1,
|
||||
"value": 74,
|
||||
"amount": 10,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 9000308,
|
||||
"assetid": 9000308,
|
||||
"attribute": 5,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
}
|
||||
],
|
||||
"bad_controls": [
|
||||
9000002,
|
||||
9000086,
|
||||
9000174,
|
||||
9000280
|
||||
]
|
||||
},
|
||||
"physio": {
|
||||
"cardsubtypeid": 7,
|
||||
"table": "physiocards",
|
||||
"record_4c": 5,
|
||||
"rowcount": 51,
|
||||
"carddbid_band": [
|
||||
4000002,
|
||||
4000259
|
||||
],
|
||||
"absent_ids_in_band": 207,
|
||||
"miss_fill_assetid": 4000146,
|
||||
"seeds": [
|
||||
{
|
||||
"carddbid": 4000002,
|
||||
"assetid": 4000002,
|
||||
"attribute": 5,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000018,
|
||||
"assetid": 4000018,
|
||||
"attribute": 6,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000022,
|
||||
"assetid": 4000022,
|
||||
"attribute": 0,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 4000026,
|
||||
"assetid": 4000026,
|
||||
"attribute": 2,
|
||||
"value": 55,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000046,
|
||||
"assetid": 4000046,
|
||||
"attribute": 3,
|
||||
"value": 64,
|
||||
"amount": 5,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 4000078,
|
||||
"assetid": 4000078,
|
||||
"attribute": 4,
|
||||
"value": 66,
|
||||
"amount": 5,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000122,
|
||||
"assetid": 4000122,
|
||||
"attribute": 3,
|
||||
"value": 74,
|
||||
"amount": 10,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 4000170,
|
||||
"assetid": 4000170,
|
||||
"attribute": 1,
|
||||
"value": 75,
|
||||
"amount": 10,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000194,
|
||||
"assetid": 4000194,
|
||||
"attribute": 6,
|
||||
"value": 75,
|
||||
"amount": 10,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 4000254,
|
||||
"assetid": 4000254,
|
||||
"attribute": 6,
|
||||
"value": 80,
|
||||
"amount": 15,
|
||||
"rare": 1
|
||||
}
|
||||
],
|
||||
"bad_controls": [
|
||||
4000003,
|
||||
4000089,
|
||||
4000175,
|
||||
4000257
|
||||
]
|
||||
},
|
||||
"fitnesscoach": {
|
||||
"cardsubtypeid": 8,
|
||||
"table": "fitnesscoachcards",
|
||||
"record_4c": 4,
|
||||
"rowcount": 115,
|
||||
"carddbid_band": [
|
||||
3000019,
|
||||
3000328
|
||||
],
|
||||
"absent_ids_in_band": 195,
|
||||
"miss_fill_assetid": 3000259,
|
||||
"seeds": [
|
||||
{
|
||||
"carddbid": 3000019,
|
||||
"assetid": 3000019,
|
||||
"value": 55,
|
||||
"amount": 1,
|
||||
"posbonus": 3,
|
||||
"fieldpos": 1,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 3000023,
|
||||
"assetid": 3000023,
|
||||
"value": 55,
|
||||
"amount": 1,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 1,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 3000035,
|
||||
"assetid": 3000035,
|
||||
"value": 55,
|
||||
"amount": 1,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 0,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 3000043,
|
||||
"assetid": 3000043,
|
||||
"value": 64,
|
||||
"amount": 2,
|
||||
"posbonus": 6,
|
||||
"fieldpos": 2,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 3000047,
|
||||
"assetid": 3000047,
|
||||
"value": 64,
|
||||
"amount": 2,
|
||||
"posbonus": 2,
|
||||
"fieldpos": 1,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 3000059,
|
||||
"assetid": 3000059,
|
||||
"value": 64,
|
||||
"amount": 2,
|
||||
"posbonus": 1,
|
||||
"fieldpos": 0,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 3000083,
|
||||
"assetid": 3000083,
|
||||
"value": 66,
|
||||
"amount": 2,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 0,
|
||||
"rare": 0
|
||||
},
|
||||
{
|
||||
"carddbid": 3000091,
|
||||
"assetid": 3000091,
|
||||
"value": 80,
|
||||
"amount": 5,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 2,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 3000127,
|
||||
"assetid": 3000127,
|
||||
"value": 70,
|
||||
"amount": 3,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 1,
|
||||
"rare": 1
|
||||
},
|
||||
{
|
||||
"carddbid": 3000171,
|
||||
"assetid": 3000171,
|
||||
"value": 77,
|
||||
"amount": 3,
|
||||
"posbonus": 5,
|
||||
"fieldpos": 3,
|
||||
"rare": 0
|
||||
}
|
||||
],
|
||||
"bad_controls": [
|
||||
3000020,
|
||||
3000100,
|
||||
3000178,
|
||||
3000307
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
# Raw /proc/PID/mem captures: regenerate with tools/db_dump.py, never commit.
|
||||
# One of these directories reached 2.3GB.
|
||||
data/memdump/*.bin
|
||||
data/memdump/*.raw
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"20801": 27,
|
||||
"41236": 25,
|
||||
"48717": 0,
|
||||
"48940": 0,
|
||||
"52091": 7,
|
||||
"53612": 5,
|
||||
"53914": 5,
|
||||
"106231": 25,
|
||||
"108080": 3,
|
||||
"112253": 10,
|
||||
"120533": 5,
|
||||
"121944": 14,
|
||||
"137186": 5,
|
||||
"138956": 5,
|
||||
"139668": 0,
|
||||
"139720": 5,
|
||||
"139968": 0,
|
||||
"142780": 5,
|
||||
"142784": 3,
|
||||
"143745": 14,
|
||||
"146530": 3,
|
||||
"146562": 18,
|
||||
"146954": 14,
|
||||
"150724": 0,
|
||||
"152729": 5,
|
||||
"153244": 25,
|
||||
"156616": 16,
|
||||
"157481": 5,
|
||||
"158121": 0,
|
||||
"159147": 5,
|
||||
"161648": 18,
|
||||
"162240": 14,
|
||||
"162895": 14,
|
||||
"163711": 10,
|
||||
"165153": 25,
|
||||
"167431": 14,
|
||||
"168354": 0,
|
||||
"168651": 14,
|
||||
"171877": 14,
|
||||
"172879": 5,
|
||||
"175943": 27,
|
||||
"176769": 25,
|
||||
"177413": 14,
|
||||
"177610": 5,
|
||||
"178509": 25,
|
||||
"179783": 0,
|
||||
"179944": 5,
|
||||
"181458": 16,
|
||||
"182494": 0,
|
||||
"183497": 0,
|
||||
"184144": 16,
|
||||
"184432": 7,
|
||||
"185239": 5,
|
||||
"188152": 18,
|
||||
"189125": 16,
|
||||
"189461": 14,
|
||||
"189560": 10,
|
||||
"190547": 5,
|
||||
"191740": 14
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"155862": "CB",
|
||||
"158023": "RW",
|
||||
"167495": "GK",
|
||||
"176580": "ST",
|
||||
"177003": "CM",
|
||||
"182521": "CM",
|
||||
"183277": "LM",
|
||||
"183907": "CB",
|
||||
"184941": "CB",
|
||||
"188545": "ST",
|
||||
"189332": "LB",
|
||||
"190871": "LW",
|
||||
"192985": "RM",
|
||||
"197445": "LB",
|
||||
"200389": "GK",
|
||||
"202126": "ST",
|
||||
"20801": "LW"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
{"table":"BigAttendance","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":7,"rowsize_bytes":4,"rows_emitted":7,"rowblock":"0x7be0210","rowblock_bytes":104,"descriptor":"0x7bf0848","schema":[{"name":"max","bit":0,"width":4,"kind":"int","min":0,"max":10,"storage":"int"},{"name":"emotion","bit":4,"width":3,"kind":"int","min":0,"max":6,"storage":"int"},{"name":"min","bit":7,"width":4,"kind":"int","min":0,"max":10,"storage":"int"}],"rows":[{"max":6,"emotion":0,"min":0},{"max":6,"emotion":1,"min":0},{"max":7,"emotion":2,"min":0},{"max":7,"emotion":3,"min":0},{"max":10,"emotion":4,"min":1},{"max":9,"emotion":5,"min":1},{"max":9,"emotion":6,"min":1}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"MatchIntensity","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":9,"rowsize_bytes":4,"rows_emitted":9,"rowblock":"0x7c31058","rowblock_bytes":0,"descriptor":"0x42e9a3a8","schema":[{"name":"scorediff","bit":0,"width":4,"kind":"int","min":-4,"max":4,"storage":"int"},{"name":"time60","bit":4,"width":2,"kind":"int","min":-1,"max":2,"storage":"int"},{"name":"time90","bit":6,"width":2,"kind":"int","min":-1,"max":2,"storage":"int"},{"name":"time120","bit":8,"width":3,"kind":"int","min":-1,"max":3,"storage":"int"},{"name":"time75","bit":11,"width":3,"kind":"int","min":-1,"max":3,"storage":"int"},{"name":"time45","bit":14,"width":2,"kind":"int","min":-1,"max":2,"storage":"int"},{"name":"time30","bit":16,"width":2,"kind":"int","min":-1,"max":2,"storage":"int"},{"name":"time15","bit":18,"width":2,"kind":"int","min":-1,"max":2,"storage":"int"}],"rows":[{"scorediff":-4,"time60":-1,"time90":-1,"time120":-1,"time75":-1,"time45":-1,"time30":-1,"time15":-1},{"scorediff":-3,"time60":0,"time90":-1,"time120":-1,"time75":0,"time45":0,"time30":-1,"time15":-1},{"scorediff":-2,"time60":1,"time90":-1,"time120":0,"time75":0,"time45":0,"time30":0,"time15":-1},{"scorediff":-1,"time60":-1,"time90":2,"time120":3,"time75":3,"time45":1,"time30":0,"time15":1},{"scorediff":0,"time60":-1,"time90":2,"time120":3,"time75":3,"time45":0,"time30":-1,"time15":0},{"scorediff":1,"time60":0,"time90":1,"time120":2,"time75":2,"time45":1,"time30":0,"time15":1},{"scorediff":2,"time60":0,"time90":0,"time120":0,"time75":1,"time45":1,"time30":1,"time15":2},{"scorediff":3,"time60":-1,"time90":0,"time120":0,"time75":0,"time45":-1,"time30":-1,"time15":0},{"scorediff":4,"time60":0,"time90":0,"time120":-1,"time75":-1,"time45":0,"time30":-1,"time15":-1}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"NoAttendance","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":7,"rowsize_bytes":4,"rows_emitted":7,"rowblock":"0x7be01e8","rowblock_bytes":114,"descriptor":"0x7bf0f08","schema":[{"name":"max","bit":0,"width":4,"kind":"int","min":0,"max":10,"storage":"int"},{"name":"emotion","bit":4,"width":3,"kind":"int","min":0,"max":6,"storage":"int"},{"name":"min","bit":7,"width":4,"kind":"int","min":0,"max":10,"storage":"int"}],"rows":[{"max":7,"emotion":0,"min":0},{"max":8,"emotion":1,"min":0},{"max":9,"emotion":2,"min":0},{"max":9,"emotion":3,"min":0},{"max":10,"emotion":4,"min":1},{"max":9,"emotion":5,"min":1},{"max":8,"emotion":6,"min":0}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"assetcryptokeys","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":44,"rows_emitted":0,"rowblock":"0x42750c68","rowblock_bytes":3553,"descriptor":"0x7bf0e48","schema":[{"name":"key","bit":0,"width":256,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"keyid","bit":256,"width":64,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"artificialkey","bit":320,"width":7,"kind":"int","min":0,"max":127,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"audiostadium","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":86,"rowsize_bytes":4,"rows_emitted":86,"rowblock":"0x42e9a4c8","rowblock_bytes":369,"descriptor":"0x7b57908","schema":[{"name":"stadiumpalanguageindex","bit":0,"width":6,"kind":"int","min":-1,"max":31,"storage":"int"},{"name":"stadiumid","bit":6,"width":9,"kind":"int","min":0,"max":511,"storage":"int"}],"rows":[{"stadiumpalanguageindex":0,"stadiumid":1},{"stadiumpalanguageindex":4,"stadiumid":2},{"stadiumpalanguageindex":3,"stadiumid":5},{"stadiumpalanguageindex":2,"stadiumid":9},{"stadiumpalanguageindex":4,"stadiumid":10},{"stadiumpalanguageindex":0,"stadiumid":13},{"stadiumpalanguageindex":1,"stadiumid":14},{"stadiumpalanguageindex":7,"stadiumid":15},{"stadiumpalanguageindex":-1,"stadiumid":26},{"stadiumpalanguageindex":0,"stadiumid":28},{"stadiumpalanguageindex":1,"stadiumid":29},{"stadiumpalanguageindex":2,"stadiumid":30},{"stadiumpalanguageindex":-1,"stadiumid":32},{"stadiumpalanguageindex":-1,"stadiumid":33},{"stadiumpalanguageindex":-1,"stadiumid":34},{"stadiumpalanguageindex":-1,"stadiumid":35},{"stadiumpalanguageindex":2,"stadiumid":41},{"stadiumpalanguageindex":4,"stadiumid":42},{"stadiumpalanguageindex":0,"stadiumid":100},{"stadiumpalanguageindex":13,"stadiumid":104},{"stadiumpalanguageindex":0,"stadiumid":112},{"stadiumpalanguageindex":0,"stadiumid":113},{"stadiumpalanguageindex":0,"stadiumid":115},{"stadiumpalanguageindex":0,"stadiumid":116},{"stadiumpalanguageindex":2,"stadiumid":135},{"stadiumpalanguageindex":2,"stadiumid":137},{"stadiumpalanguageindex":-1,"stadiumid":147},{"stadiumpalanguageindex":-1,"stadiumid":149},{"stadiumpalanguageindex":-1,"stadiumid":153},{"stadiumpalanguageindex":0,"stadiumid":155},{"stadiumpalanguageindex":0,"stadiumid":156},{"stadiumpalanguageindex":3,"stadiumid":157},{"stadiumpalanguageindex":-1,"stadiumid":158},{"stadiumpalanguageindex":-1,"stadiumid":172},{"stadiumpalanguageindex":-1,"stadiumid":175},{"stadiumpalanguageindex":-1,"stadiumid":176},{"stadiumpalanguageindex":-1,"stadiumid":178},{"stadiumpalanguageindex":-1,"stadiumid":179},{"stadiumpalanguageindex":-1,"stadiumid":180},{"stadiumpalanguageindex":-1,"stadiumid":181},{"stadiumpalanguageindex":-1,"stadiumid":182},{"stadiumpalanguageindex":-1,"stadiumid":183},{"stadiumpalanguageindex":-1,"stadiumid":192},{"stadiumpalanguageindex":-1,"stadiumid":193},{"stadiumpalanguageindex":-1,"stadiumid":194},{"stadiumpalanguageindex":-1,"stadiumid":195},{"stadiumpalanguageindex":-1,"stadiumid":196},{"stadiumpalanguageindex":-1,"stadiumid":197},{"stadiumpalanguageindex":-1,"stadiumid":212},{"stadiumpalanguageindex":-1,"stadiumid":228},{"stadiumpalanguageindex":-1,"stadiumid":229},{"stadiumpalanguageindex":0,"stadiumid":246},{"stadiumpalanguageindex":3,"stadiumid":247},{"stadiumpalanguageindex":0,"stadiumid":248},{"stadiumpalanguageindex":-1,"stadiumid":249},{"stadiumpalanguageindex":0,"stadiumid":260},{"stadiumpalanguageindex":-1,"stadiumid":261},{"stadiumpalanguageindex":-1,"stadiumid":262},{"stadiumpalanguageindex":14,"stadiumid":264},{"stadiumpalanguageindex":0,"stadiumid":265},{"stadiumpalanguageindex":-1,"stadiumid":316},{"stadiumpalanguageindex":0,"stadiumid":326},{"stadiumpalanguageindex":0,"stadiumid":327},{"stadiumpalanguageindex":0,"stadiumid":329},{"stadiumpalanguageindex":0,"stadiumid":330},{"stadiumpalanguageindex":0,"stadiumid":331},{"stadiumpalanguageindex":0,"stadiumid":332},{"stadiumpalanguageindex":0,"stadiumid":333},{"stadiumpalanguageindex":0,"stadiumid":335},{"stadiumpalanguageindex":0,"stadiumid":336},{"stadiumpalanguageindex":0,"stadiumid":337},{"stadiumpalanguageindex":0,"stadiumid":341},{"stadiumpalanguageindex":2,"stadiumid":343},{"stadiumpalanguageindex":14,"stadiumid":344},{"stadiumpalanguageindex":-1,"stadiumid":345},{"stadiumpalanguageindex":0,"stadiumid":347},{"stadiumpalanguageindex":0,"stadiumid":348},{"stadiumpalanguageindex":0,"stadiumid":349},{"stadiumpalanguageindex":-1,"stadiumid":352},{"stadiumpalanguageindex":-1,"stadiumid":353},{"stadiumpalanguageindex":17,"stadiumid":354},{"stadiumpalanguageindex":0,"stadiumid":355},{"stadiumpalanguageindex":-1,"stadiumid":357},{"stadiumpalanguageindex":-1,"stadiumid":358},{"stadiumpalanguageindex":-1,"stadiumid":359},{"stadiumpalanguageindex":-1,"stadiumid":360}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_calendar","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":1,"rowsize_bytes":20,"rows_emitted":1,"rowblock":"0x7c20708","rowblock_bytes":0,"descriptor":"0x4254fc28","schema":[{"name":"transferwindowend1","bit":0,"width":11,"kind":"int","min":101,"max":1231,"storage":"int"},{"name":"transferwindowstart1","bit":11,"width":11,"kind":"int","min":101,"max":1231,"storage":"int"},{"name":"transferwindowend2","bit":22,"width":11,"kind":"int","min":101,"max":1231,"storage":"int"},{"name":"setupdate","bit":33,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"},{"name":"dateid","bit":52,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"enddate","bit":53,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"},{"name":"currdate","bit":72,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"},{"name":"startdate","bit":91,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"},{"name":"transferwindowstart2","bit":110,"width":11,"kind":"int","min":101,"max":1231,"storage":"int"},{"name":"objectivecheckdate","bit":121,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"}],"rows":[{"transferwindowend1":831,"transferwindowstart1":701,"transferwindowend2":131,"setupdate":20080101,"dateid":0,"enddate":20080101,"currdate":20080101,"startdate":20080101,"transferwindowstart2":101,"objectivecheckdate":20080101}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_clinchedobjectives","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":20,"rows_emitted":0,"rowblock":"0x42e982a8","rowblock_bytes":513,"descriptor":"0x7b102a8","schema":[{"name":"predictedclinchfordrawflags","bit":0,"width":31,"kind":"int","min":0,"max":2147483520,"storage":"int"},{"name":"clinchedobjectivesflags","bit":31,"width":31,"kind":"int","min":0,"max":2147483520,"storage":"int"},{"name":"predictedclinchforwinflags","bit":62,"width":31,"kind":"int","min":0,"max":2147483520,"storage":"int"},{"name":"teamid","bit":93,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"predictedclinchforlossflags","bit":111,"width":31,"kind":"int","min":0,"max":2147483520,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_commonnames","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":8,"rows_emitted":0,"rowblock":"0x0","rowblock_bytes":null,"descriptor":"0x7b408f8","schema":[{"name":"firstname","bit":0,"width":15,"kind":"int","min":0,"max":29999,"storage":"int"},{"name":"lastname","bit":15,"width":15,"kind":"int","min":0,"max":29999,"storage":"int"},{"name":"groupid","bit":30,"width":7,"kind":"int","min":0,"max":127,"storage":"int"},{"name":"commonnameid","bit":37,"width":10,"kind":"int","min":1,"max":1024,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_firstnames","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":8,"rows_emitted":0,"rowblock":"0x0","rowblock_bytes":null,"descriptor":"0x7bf0c08","schema":[{"name":"firstnameid","bit":0,"width":12,"kind":"int","min":1,"max":4096,"storage":"int"},{"name":"firstname","bit":12,"width":15,"kind":"int","min":0,"max":29999,"storage":"int"},{"name":"groupid","bit":27,"width":7,"kind":"int","min":0,"max":127,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_lastnames","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":8,"rows_emitted":0,"rowblock":"0x0","rowblock_bytes":null,"descriptor":"0x7bf12c8","schema":[{"name":"lastname","bit":0,"width":15,"kind":"int","min":0,"max":29999,"storage":"int"},{"name":"lastnameid","bit":15,"width":12,"kind":"int","min":1,"max":4096,"storage":"int"},{"name":"groupid","bit":27,"width":7,"kind":"int","min":0,"max":127,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_playerlastmatchhistory","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":12,"rows_emitted":0,"rowblock":"0x42521898","rowblock_bytes":120033,"descriptor":"0x7ba3408","schema":[{"name":"minsplayed","bit":0,"width":8,"kind":"int","min":0,"max":150,"storage":"int"},{"name":"position","bit":8,"width":6,"kind":"int","min":-1,"max":50,"storage":"int"},{"name":"artificialkey","bit":14,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"},{"name":"playerfact","bit":33,"width":5,"kind":"int","min":-1,"max":15,"storage":"int"},{"name":"teamid","bit":38,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"playeroverall","bit":56,"width":7,"kind":"int","min":-1,"max":100,"storage":"int"},{"name":"playerid","bit":63,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_playermatchratinghistory","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":12,"rows_emitted":0,"rowblock":"0x42493f28","rowblock_bytes":7585,"descriptor":"0x7b205a8","schema":[{"name":"minsplayed","bit":0,"width":8,"kind":"int","min":-1,"max":140,"storage":"int"},{"name":"position","bit":8,"width":5,"kind":"int","min":0,"max":31,"storage":"int"},{"name":"date","bit":13,"width":19,"kind":"int","min":20080101,"max":20601231,"storage":"int"},{"name":"artificialkey","bit":32,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"},{"name":"rating","bit":51,"width":7,"kind":"int","min":-1,"max":100,"storage":"int"},{"name":"playerid","bit":58,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"career_squadranking","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":8,"rows_emitted":0,"rowblock":"0x42e97c18","rowblock_bytes":449,"descriptor":"0x7bf0488","schema":[{"name":"curroverall","bit":0,"width":10,"kind":"int","min":0,"max":1000,"storage":"int"},{"name":"playerid","bit":10,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"},{"name":"lastoverall","bit":29,"width":10,"kind":"int","min":0,"max":1000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"celebrations","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":13,"rowsize_bytes":4,"rows_emitted":13,"rowblock":"0x7bc3088","rowblock_bytes":5,"descriptor":"0x7b701e8","schema":[{"name":"celebrationid","bit":0,"width":4,"kind":"int","min":0,"max":13,"storage":"int"}],"rows":[{"celebrationid":0},{"celebrationid":1},{"celebrationid":2},{"celebrationid":3},{"celebrationid":4},{"celebrationid":5},{"celebrationid":6},{"celebrationid":7},{"celebrationid":8},{"celebrationid":9},{"celebrationid":10},{"celebrationid":11},{"celebrationid":12}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"customteamstyles","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":12,"rows_emitted":0,"rowblock":"0x4254bdf8","rowblock_bytes":369,"descriptor":"0x42816ee8","schema":[{"name":"defmentality","bit":0,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"teamstyleid","bit":7,"width":7,"kind":"int","min":900,"max":1000,"storage":"int"},{"name":"basestyle","bit":14,"width":18,"kind":"int","min":-2,"max":200000,"storage":"int"},{"name":"buspassing","bit":32,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"defteamwidth","bit":39,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"busdribbling","bit":46,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"defaggression","bit":53,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"buspositioning","bit":60,"width":1,"kind":"int","min":1,"max":2,"storage":"int"},{"name":"ccpositioning","bit":61,"width":1,"kind":"int","min":1,"max":2,"storage":"int"},{"name":"busbuildupspeed","bit":62,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"ccshooting","bit":69,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"ccpassing","bit":76,"width":7,"kind":"int","min":1,"max":100,"storage":"int"},{"name":"defdefenderline","bit":83,"width":1,"kind":"int","min":1,"max":2,"storage":"int"},{"name":"cccrossing","bit":84,"width":7,"kind":"int","min":1,"max":100,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"cz_assets","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":248,"rows_emitted":0,"rowblock":"0x427ce458","rowblock_bytes":26817,"descriptor":"0x4254ffa8","schema":[{"name":"crestid","bit":0,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"dbid","bit":32,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"publishdate","bit":64,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"rating","bit":96,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"kitid","bit":128,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"xms_media_id","bit":160,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"type","bit":192,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"author","bit":224,"width":720,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"assetname","bit":944,"width":1008,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"assetyear","bit":1952,"width":4,"kind":"int","min":0,"max":15,"storage":"int"},{"name":"playerposition","bit":1956,"width":6,"kind":"int","min":0,"max":50,"storage":"int"},{"name":"version","bit":1962,"width":15,"kind":"int","min":0,"max":30000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"cz_leagues","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":164,"rows_emitted":0,"rowblock":"0x424a1908","rowblock_bytes":849,"descriptor":"0x424af898","schema":[{"name":"overlaybgcolour3r","bit":0,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"tournamentballid","bit":8,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour3r","bit":16,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour1g","bit":24,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour3b","bit":32,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour1g","bit":40,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"championcupslotallotment","bit":48,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour3b","bit":56,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"finalstadiumid","bit":64,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour2b","bit":72,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour1r","bit":80,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour2b","bit":88,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour1r","bit":96,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour3g","bit":104,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour1b","bit":112,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour3g","bit":120,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour1b","bit":128,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour2r","bit":136,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour2g","bit":144,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"eurocupslotallotment","bit":152,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaytextcolour2r","bit":160,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"overlaybgcolour2g","bit":168,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"leaguedescription","bit":176,"width":1080,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"leaguetype","bit":1256,"width":2,"kind":"int","min":0,"max":2,"storage":"int"},{"name":"numteams","bit":1258,"width":6,"kind":"int","min":0,"max":32,"storage":"int"},{"name":"trophyid","bit":1264,"width":9,"kind":"int","min":-1,"max":255,"storage":"int"},{"name":"teamadvancingpergroup","bit":1273,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"leagueid","bit":1276,"width":12,"kind":"int","min":1,"max":3000,"storage":"int"},{"name":"fixturevsgroup","bit":1288,"width":2,"kind":"int","min":0,"max":2,"storage":"int"},{"name":"teampergroup","bit":1290,"width":5,"kind":"int","min":0,"max":16,"storage":"int"},{"name":"finalmatchlegs","bit":1295,"width":2,"kind":"int","min":0,"max":2,"storage":"int"},{"name":"fixturevseachteam","bit":1297,"width":2,"kind":"int","min":0,"max":2,"storage":"int"},{"name":"subonbench","bit":1299,"width":3,"kind":"int","min":0,"max":7,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"cz_players","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":8,"rows_emitted":0,"rowblock":"0x42614398","rowblock_bytes":12033,"descriptor":"0x7bf0608","schema":[{"name":"assetid","bit":0,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"},{"name":"commentaryid","bit":19,"width":20,"kind":"int","min":-1,"max":1000000,"storage":"int"},{"name":"playerid","bit":39,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"cz_teams","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":24,"rows_emitted":0,"rowblock":"0x4254c208","rowblock_bytes":1473,"descriptor":"0x7b110a8","schema":[{"name":"hascrestimage","bit":0,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"hassponsorimage","bit":32,"width":32,"kind":"int","min":-2147483648,"max":2147483647,"storage":"int"},{"name":"teamabbrev3","bit":64,"width":72,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"teamid","bit":136,"width":18,"kind":"int","min":0,"max":200000,"storage":"int"},{"name":"commentaryid","bit":154,"width":20,"kind":"int","min":-1,"max":1000000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"dcplayernames","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":40,"rows_emitted":0,"rowblock":"0x426df378","rowblock_bytes":200032,"descriptor":"0x7b579b8","schema":[{"name":"name","bit":0,"width":304,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"nameid","bit":304,"width":13,"kind":"int","min":30000,"max":35000,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"dlcballs","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":52,"rows_emitted":0,"rowblock":"0x424a0528","rowblock_bytes":2625,"descriptor":"0x7b576f8","schema":[{"name":"name","bit":0,"width":400,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"assetid","bit":400,"width":11,"kind":"int","min":0,"max":2000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"dlcboots","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":52,"rows_emitted":0,"rowblock":"0x424980e8","rowblock_bytes":2624,"descriptor":"0x7b57dd8","schema":[{"name":"name","bit":0,"width":400,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"assetid","bit":400,"width":11,"kind":"int","min":0,"max":2000,"storage":"int"}],"rows":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"dna","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":260,"rows_emitted":0,"rowblock":"0x0","rowblock_bytes":null,"descriptor":"0x7b57b18","schema":[{"name":"dna","bit":0,"width":2040,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"playerid","bit":2040,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"editedplayernames","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":184,"rows_emitted":0,"rowblock":"0x42a7f108","rowblock_bytes":281553,"descriptor":"0x7b10b68","schema":[{"name":"firstname","bit":0,"width":360,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"commonname","bit":360,"width":360,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"playerjerseyname","bit":720,"width":360,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"surname","bit":1080,"width":360,"kind":"string","min":0,"max":0,"storage":"inline-string"},{"name":"playerid","bit":1440,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_GrandStandPlayers","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":113,"rowsize_bytes":4,"rows_emitted":113,"rowblock":"0x424b4358","rowblock_bytes":481,"descriptor":"0x7988528","schema":[{"name":"playerid","bit":0,"width":19,"kind":"int","min":0,"max":300000,"storage":"int"}],"rows":[{"playerid":1},{"playerid":41},{"playerid":51},{"playerid":195},{"playerid":240},{"playerid":241},{"playerid":244},{"playerid":246},{"playerid":388},{"playerid":393},{"playerid":570},{"playerid":805},{"playerid":942},{"playerid":1025},{"playerid":1040},{"playerid":1041},{"playerid":1075},{"playerid":1088},{"playerid":1109},{"playerid":1116},{"playerid":1183},{"playerid":1198},{"playerid":1201},{"playerid":1419},{"playerid":1605},{"playerid":1620},{"playerid":1845},{"playerid":4000},{"playerid":4202},{"playerid":4833},{"playerid":5419},{"playerid":5467},{"playerid":5589},{"playerid":5673},{"playerid":5680},{"playerid":5681},{"playerid":6235},{"playerid":6975},{"playerid":7289},{"playerid":7512},{"playerid":7518},{"playerid":7743},{"playerid":9014},{"playerid":10264},{"playerid":13038},{"playerid":13128},{"playerid":20170},{"playerid":20801},{"playerid":41236},{"playerid":46747},{"playerid":51539},{"playerid":52241},{"playerid":53769},{"playerid":117106},{"playerid":121939},{"playerid":146530},{"playerid":153079},{"playerid":155862},{"playerid":156353},{"playerid":156616},{"playerid":158023},{"playerid":161840},{"playerid":162895},{"playerid":164000},{"playerid":164240},{"playerid":166120},{"playerid":166124},{"playerid":166906},{"playerid":167495},{"playerid":168473},{"playerid":168542},{"playerid":173731},{"playerid":176580},{"playerid":176635},{"playerid":176676},{"playerid":177003},{"playerid":177845},{"playerid":181872},{"playerid":182521},{"playerid":183277},{"playerid":183898},{"playerid":183907},{"playerid":184941},{"playerid":188350},{"playerid":188545},{"playerid":189332},{"playerid":189511},{"playerid":190043},{"playerid":190044},{"playerid":190053},{"playerid":190871},{"playerid":191189},{"playerid":191695},{"playerid":192119},{"playerid":192181},{"playerid":192883},{"playerid":192985},{"playerid":193080},{"playerid":195864},{"playerid":197445},{"playerid":198710},{"playerid":214098},{"playerid":214100},{"playerid":214101},{"playerid":214267},{"playerid":214649},{"playerid":215558},{"playerid":215732},{"playerid":222000},{"playerid":222257},{"playerid":222481},{"playerid":222680},{"playerid":226764}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_bonusvalues","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":12,"rowsize_bytes":8,"rows_emitted":12,"rowblock":"0x77e13b8","rowblock_bytes":1919903238,"descriptor":"0x7b401a8","schema":[{"name":"bonusvalue","bit":0,"width":32,"kind":"unknown","min":0,"max":0,"storage":"int"},{"name":"bonuslevel","bit":32,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"bonustype","bit":40,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"bonusid","bit":48,"width":8,"kind":"int","min":0,"max":255,"storage":"int"}],"rows":[{"bonusvalue":0,"bonuslevel":0,"bonustype":0,"bonusid":0},{"bonusvalue":1065353216,"bonuslevel":1,"bonustype":0,"bonusid":1},{"bonusvalue":1073741824,"bonuslevel":2,"bonustype":0,"bonusid":2},{"bonusvalue":1077936128,"bonuslevel":3,"bonustype":0,"bonusid":3},{"bonusvalue":1065353216,"bonuslevel":0,"bonustype":1,"bonusid":4},{"bonusvalue":1067450368,"bonuslevel":1,"bonustype":1,"bonusid":5},{"bonusvalue":1069547520,"bonuslevel":2,"bonustype":1,"bonusid":6},{"bonusvalue":1073741824,"bonuslevel":3,"bonustype":1,"bonusid":7},{"bonusvalue":0,"bonuslevel":0,"bonustype":3,"bonusid":8},{"bonusvalue":1065353216,"bonuslevel":1,"bonustype":3,"bonusid":9},{"bonusvalue":1077936128,"bonuslevel":2,"bonustype":3,"bonusid":10},{"bonusvalue":1084227584,"bonuslevel":3,"bonustype":3,"bonusid":11}]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_coinrewards","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":17,"rowsize_bytes":8,"rows_emitted":17,"rowblock":"0x79883e8","rowblock_bytes":0,"descriptor":"0x7b40758","schema":[{"name":"leaderboard","bit":0,"width":12,"kind":"int","min":-1024,"max":1024,"storage":"int"},{"name":"coin","bit":12,"width":12,"kind":"int","min":-1024,"max":1024,"storage":"int"},{"name":"cap","bit":24,"width":7,"kind":"int","min":0,"max":100,"storage":"int"},{"name":"objectiveid","bit":31,"width":7,"kind":"int","min":1,"max":100,"storage":"int"}],"rows":[{"leaderboard":500,"coin":40,"cap":5,"objectiveid":1},{"leaderboard":500,"coin":5,"cap":10,"objectiveid":2},{"leaderboard":500,"coin":1,"cap":25,"objectiveid":3},{"leaderboard":500,"coin":5,"cap":10,"objectiveid":4},{"leaderboard":500,"coin":75,"cap":1,"objectiveid":5},{"leaderboard":500,"coin":1,"cap":80,"objectiveid":6},{"leaderboard":500,"coin":1,"cap":60,"objectiveid":7},{"leaderboard":500,"coin":15,"cap":1,"objectiveid":8},{"leaderboard":-500,"coin":-20,"cap":3,"objectiveid":9},{"leaderboard":-500,"coin":-5,"cap":5,"objectiveid":10},{"leaderboard":-500,"coin":-10,"cap":5,"objectiveid":11},{"leaderboard":-500,"coin":-40,"cap":5,"objectiveid":12},{"leaderboard":-500,"coin":-1,"cap":10,"objectiveid":13},{"leaderboard":500,"coin":0,"cap":0,"objectiveid":15},{"leaderboard":500,"coin":325,"cap":1,"objectiveid":16},{"leaderboard":-500,"coin":0,"cap":0,"objectiveid":17},{"leaderboard":500,"coin":0,"cap":0,"objectiveid":18}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_contractcards","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":13,"rowsize_bytes":16,"rows_emitted":13,"rowblock":"0x7b10ee8","rowblock_bytes":13,"descriptor":"0x42814a68","schema":[{"name":"carddbid","bit":0,"width":31,"kind":"int","min":0,"max":2001001001,"storage":"int"},{"name":"cardsubtype","bit":31,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"weightrare","bit":45,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"cardassetid","bit":59,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"gold","bit":73,"width":7,"kind":"int","min":0,"max":100,"storage":"int"},{"name":"rating","bit":80,"width":7,"kind":"int","min":0,"max":100,"storage":"int"},{"name":"bronze","bit":87,"width":7,"kind":"int","min":0,"max":100,"storage":"int"},{"name":"silver","bit":94,"width":7,"kind":"int","min":0,"max":100,"storage":"int"}],"rows":[{"carddbid":5001001,"cardsubtype":201,"weightrare":0,"cardassetid":7,"gold":1,"rating":50,"bronze":8,"silver":2},{"carddbid":5001002,"cardsubtype":201,"weightrare":0,"cardassetid":7,"gold":8,"rating":65,"bronze":10,"silver":10},{"carddbid":5001003,"cardsubtype":201,"weightrare":0,"cardassetid":7,"gold":13,"rating":80,"bronze":15,"silver":11},{"carddbid":5001004,"cardsubtype":201,"weightrare":100,"cardassetid":7,"gold":3,"rating":60,"bronze":15,"silver":6},{"carddbid":5001005,"cardsubtype":201,"weightrare":100,"cardassetid":7,"gold":18,"rating":70,"bronze":20,"silver":24},{"carddbid":5001006,"cardsubtype":201,"weightrare":100,"cardassetid":7,"gold":28,"rating":90,"bronze":28,"silver":24},{"carddbid":5001007,"cardsubtype":202,"weightrare":0,"cardassetid":8,"gold":1,"rating":50,"bronze":8,"silver":2},{"carddbid":5001008,"cardsubtype":202,"weightrare":0,"cardassetid":8,"gold":8,"rating":65,"bronze":8,"silver":10},{"carddbid":5001009,"cardsubtype":202,"weightrare":0,"cardassetid":8,"gold":13,"rating":80,"bronze":11,"silver":11},{"carddbid":5001010,"cardsubtype":202,"weightrare":10,"cardassetid":8,"gold":3,"rating":60,"bronze":15,"silver":6},{"carddbid":5001011,"cardsubtype":202,"weightrare":10,"cardassetid":8,"gold":18,"rating":70,"bronze":18,"silver":24},{"carddbid":5001012,"cardsubtype":202,"weightrare":10,"cardassetid":8,"gold":28,"rating":90,"bronze":24,"silver":24},{"carddbid":5001013,"cardsubtype":201,"weightrare":0,"cardassetid":7,"gold":99,"rating":90,"bronze":99,"silver":99}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_healingcards","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":27,"rowsize_bytes":12,"rows_emitted":27,"rowblock":"0x42814488","rowblock_bytes":353,"descriptor":"0x7b200f8","schema":[{"name":"carddbid","bit":0,"width":31,"kind":"int","min":0,"max":2001001001,"storage":"int"},{"name":"cardsubtype","bit":31,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"weightrare","bit":45,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"cardassetid","bit":59,"width":14,"kind":"int","min":0,"max":10000,"storage":"int"},{"name":"amount","bit":73,"width":7,"kind":"int","min":0,"max":100,"storage":"int"},{"name":"rating","bit":80,"width":7,"kind":"int","min":0,"max":100,"storage":"int"}],"rows":[{"carddbid":5002001,"cardsubtype":219,"weightrare":0,"cardassetid":10,"amount":20,"rating":55},{"carddbid":5002002,"cardsubtype":219,"weightrare":0,"cardassetid":10,"amount":40,"rating":70},{"carddbid":5002003,"cardsubtype":219,"weightrare":0,"cardassetid":10,"amount":60,"rating":80},{"carddbid":5002004,"cardsubtype":220,"weightrare":70,"cardassetid":10,"amount":10,"rating":55},{"carddbid":5002005,"cardsubtype":220,"weightrare":70,"cardassetid":10,"amount":20,"rating":70},{"carddbid":5002006,"cardsubtype":220,"weightrare":70,"cardassetid":10,"amount":30,"rating":80},{"carddbid":5002007,"cardsubtype":211,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002008,"cardsubtype":211,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002009,"cardsubtype":211,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002010,"cardsubtype":212,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002011,"cardsubtype":212,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002012,"cardsubtype":212,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002013,"cardsubtype":213,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002014,"cardsubtype":213,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002015,"cardsubtype":213,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002019,"cardsubtype":215,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002020,"cardsubtype":215,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002021,"cardsubtype":215,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002022,"cardsubtype":216,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002023,"cardsubtype":216,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002024,"cardsubtype":216,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002025,"cardsubtype":217,"weightrare":0,"cardassetid":9,"amount":1,"rating":55},{"carddbid":5002026,"cardsubtype":217,"weightrare":0,"cardassetid":9,"amount":2,"rating":70},{"carddbid":5002027,"cardsubtype":217,"weightrare":0,"cardassetid":9,"amount":5,"rating":80},{"carddbid":5002028,"cardsubtype":218,"weightrare":20,"cardassetid":9,"amount":1,"rating":60},{"carddbid":5002029,"cardsubtype":218,"weightrare":20,"cardassetid":9,"amount":2,"rating":74},{"carddbid":5002030,"cardsubtype":218,"weightrare":20,"cardassetid":9,"amount":4,"rating":85}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_leagues","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":43,"rowsize_bytes":12,"rows_emitted":43,"rowblock":"0x428136d8","rowblock_bytes":545,"descriptor":"0x7b405b8","schema":[{"name":"leaguename","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"leagueid","bit":32,"width":13,"kind":"int","min":0,"max":5000,"storage":"int"},{"name":"fifacountryid","bit":45,"width":13,"kind":"int","min":0,"max":5000,"storage":"int"},{"name":"futcountryid","bit":58,"width":13,"kind":"int","min":0,"max":5000,"storage":"int"}],"rows":[{"leaguename":236,"leagueid":1,"fifacountryid":13,"futcountryid":212},{"leaguename":250,"leagueid":4,"fifacountryid":7,"futcountryid":212},{"leaguename":269,"leagueid":7,"fifacountryid":54,"futcountryid":211},{"leaguename":290,"leagueid":10,"fifacountryid":34,"futcountryid":212},{"leaguename":305,"leagueid":13,"fifacountryid":14,"futcountryid":14},{"leaguename":321,"leagueid":14,"fifacountryid":14,"futcountryid":14},{"leaguename":342,"leagueid":16,"fifacountryid":18,"futcountryid":18},{"leaguename":354,"leagueid":17,"fifacountryid":18,"futcountryid":18},{"leaguename":366,"leagueid":19,"fifacountryid":21,"futcountryid":21},{"leaguename":383,"leagueid":20,"fifacountryid":21,"futcountryid":21},{"leaguename":401,"leagueid":31,"fifacountryid":27,"futcountryid":27},{"leaguename":413,"leagueid":32,"fifacountryid":27,"futcountryid":27},{"leaguename":425,"leagueid":39,"fifacountryid":95,"futcountryid":211},{"leaguename":443,"leagueid":41,"fifacountryid":36,"futcountryid":212},{"leaguename":458,"leagueid":50,"fifacountryid":42,"futcountryid":212},{"leaguename":474,"leagueid":53,"fifacountryid":45,"futcountryid":45},{"leaguename":491,"leagueid":54,"fifacountryid":45,"futcountryid":45},{"leaguename":504,"leagueid":56,"fifacountryid":46,"futcountryid":212},{"leaguename":519,"leagueid":60,"fifacountryid":14,"futcountryid":14},{"leaguename":534,"leagueid":61,"fifacountryid":14,"futcountryid":14},{"leaguename":549,"leagueid":63,"fifacountryid":22,"futcountryid":212},{"leaguename":564,"leagueid":65,"fifacountryid":25,"futcountryid":212},{"leaguename":586,"leagueid":66,"fifacountryid":37,"futcountryid":212},{"leaguename":608,"leagueid":67,"fifacountryid":40,"futcountryid":211},{"leaguename":624,"leagueid":68,"fifacountryid":48,"futcountryid":212},{"leaguename":639,"leagueid":78,"fifacountryid":75,"futcountryid":211},{"leaguename":648,"leagueid":80,"fifacountryid":4,"futcountryid":212},{"leaguename":663,"leagueid":83,"fifacountryid":167,"futcountryid":211},{"leaguename":681,"leagueid":189,"fifacountryid":47,"futcountryid":212},{"leaguename":699,"leagueid":308,"fifacountryid":38,"futcountryid":212},{"leaguename":714,"leagueid":322,"fifacountryid":17,"futcountryid":212},{"leaguename":731,"leagueid":332,"fifacountryid":49,"futcountryid":212},{"leaguename":746,"leagueid":335,"fifacountryid":55,"futcountryid":211},{"leaguename":772,"leagueid":336,"fifacountryid":56,"futcountryid":211},{"leaguename":788,"leagueid":341,"fifacountryid":83,"futcountryid":211},{"leaguename":802,"leagueid":347,"fifacountryid":140,"futcountryid":211},{"leaguename":820,"leagueid":349,"fifacountryid":163,"futcountryid":211},{"leaguename":833,"leagueid":350,"fifacountryid":183,"futcountryid":211},{"leaguename":856,"leagueid":351,"fifacountryid":195,"futcountryid":211},{"leaguename":876,"leagueid":353,"fifacountryid":52,"futcountryid":211},{"leaguename":897,"leagueid":2025,"fifacountryid":54,"futcountryid":211},{"leaguename":914,"leagueid":2134,"fifacountryid":221,"futcountryid":211},{"leaguename":925,"leagueid":2150,"fifacountryid":221,"futcountryid":211}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_managerbonusvalues","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":9,"rowsize_bytes":4,"rows_emitted":9,"rowblock":"0x7c31088","rowblock_bytes":16472,"descriptor":"0x7b10388","schema":[{"name":"bonuslevel","bit":0,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"bonustype","bit":8,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"cardlevel","bit":16,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"bonusvalue","bit":19,"width":5,"kind":"int","min":0,"max":16,"storage":"int"},{"name":"bonusid","bit":24,"width":5,"kind":"int","min":0,"max":16,"storage":"int"}],"rows":[{"bonuslevel":3,"bonustype":1,"cardlevel":1,"bonusvalue":2,"bonusid":0},{"bonuslevel":3,"bonustype":1,"cardlevel":2,"bonusvalue":5,"bonusid":1},{"bonuslevel":3,"bonustype":1,"cardlevel":3,"bonusvalue":10,"bonusid":2},{"bonuslevel":2,"bonustype":2,"cardlevel":1,"bonusvalue":1,"bonusid":3},{"bonuslevel":2,"bonustype":2,"cardlevel":2,"bonusvalue":2,"bonusid":4},{"bonuslevel":2,"bonustype":2,"cardlevel":3,"bonusvalue":3,"bonusid":5},{"bonuslevel":3,"bonustype":2,"cardlevel":1,"bonusvalue":1,"bonusid":6},{"bonuslevel":3,"bonustype":2,"cardlevel":2,"bonusvalue":1,"bonusid":7},{"bonuslevel":3,"bonustype":2,"cardlevel":3,"bonusvalue":1,"bonusid":8}]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_myclubs","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":2,"rowsize_bytes":8,"rows_emitted":2,"rowblock":"0x7c20748","rowblock_bytes":0,"descriptor":"0x7b57a68","schema":[{"name":"myclubname","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"myclubid","bit":32,"width":8,"kind":"int","min":0,"max":128,"storage":"int"}],"rows":[{"myclubname":0,"myclubid":1},{"myclubname":16,"myclubid":2}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_myclubscategories","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":12,"rowsize_bytes":12,"rows_emitted":12,"rowblock":"0x7988488","rowblock_bytes":0,"descriptor":"0x7b20878","schema":[{"name":"categoryname","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"futcountryid","bit":32,"width":16,"kind":"int","min":0,"max":50000,"storage":"int"},{"name":"myclubid","bit":48,"width":8,"kind":"int","min":0,"max":128,"storage":"int"},{"name":"id","bit":56,"width":8,"kind":"int","min":0,"max":128,"storage":"int"},{"name":"isteamcategory","bit":64,"width":8,"kind":"int","min":0,"max":128,"storage":"int"},{"name":"categoryid","bit":72,"width":8,"kind":"int","min":0,"max":128,"storage":"int"}],"rows":[{"categoryname":0,"futcountryid":0,"myclubid":0,"id":1,"isteamcategory":0,"categoryid":16},{"categoryname":13,"futcountryid":14,"myclubid":0,"id":2,"isteamcategory":1,"categoryid":1},{"categoryname":32,"futcountryid":18,"myclubid":0,"id":3,"isteamcategory":1,"categoryid":2},{"categoryname":50,"futcountryid":21,"myclubid":0,"id":4,"isteamcategory":1,"categoryid":3},{"categoryname":69,"futcountryid":27,"myclubid":0,"id":5,"isteamcategory":1,"categoryid":4},{"categoryname":86,"futcountryid":45,"myclubid":0,"id":6,"isteamcategory":1,"categoryid":5},{"categoryname":103,"futcountryid":212,"myclubid":0,"id":7,"isteamcategory":1,"categoryid":6},{"categoryname":121,"futcountryid":211,"myclubid":0,"id":8,"isteamcategory":1,"categoryid":7},{"categoryname":138,"futcountryid":0,"myclubid":2,"id":10,"isteamcategory":0,"categoryid":18},{"categoryname":155,"futcountryid":0,"myclubid":2,"id":11,"isteamcategory":0,"categoryid":8},{"categoryname":173,"futcountryid":0,"myclubid":2,"id":12,"isteamcategory":0,"categoryid":10},{"categoryname":190,"futcountryid":0,"myclubid":2,"id":13,"isteamcategory":0,"categoryid":11}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fcc_preferredformationcalcback","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":16,"rowsize_bytes":12,"rows_emitted":16,"rowblock":"0x7b40a98","rowblock_bytes":0,"descriptor":"0x42811bb8","schema":[{"name":"formations","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"form10","bit":32,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form2","bit":35,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"id","bit":38,"width":6,"kind":"int","min":0,"max":34,"storage":"int"},{"name":"form3","bit":44,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form5","bit":47,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form4","bit":50,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form13","bit":53,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form7","bit":56,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form9","bit":59,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form14","bit":62,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form12","bit":65,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form15","bit":68,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form8","bit":71,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form6","bit":74,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form16","bit":77,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form11","bit":80,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form1","bit":83,"width":3,"kind":"int","min":0,"max":4,"storage":"int"}],"rows":[{"formations":0,"form10":1,"form2":0,"id":3,"form3":0,"form5":1,"form4":0,"form13":2,"form7":1,"form9":2,"form14":0,"form12":1,"form15":0,"form8":1,"form6":3,"form16":0,"form11":1,"form1":0},{"formations":6,"form10":2,"form2":0,"id":6,"form3":0,"form5":1,"form4":0,"form13":1,"form7":1,"form9":2,"form14":0,"form12":1,"form15":0,"form8":3,"form6":1,"form16":0,"form11":1,"form1":0},{"formations":12,"form10":2,"form2":0,"id":7,"form3":0,"form5":1,"form4":0,"form13":1,"form7":1,"form9":3,"form14":0,"form12":1,"form15":0,"form8":2,"form6":2,"form16":0,"form11":1,"form1":0},{"formations":18,"form10":3,"form2":0,"id":8,"form3":0,"form5":1,"form4":0,"form13":1,"form7":1,"form9":2,"form14":0,"form12":1,"form15":0,"form8":2,"form6":1,"form16":0,"form11":1,"form1":0},{"formations":25,"form10":1,"form2":0,"id":13,"form3":0,"form5":2,"form4":0,"form13":1,"form7":3,"form9":1,"form14":0,"form12":2,"form15":0,"form8":1,"form6":1,"form16":0,"form11":2,"form1":0},{"formations":31,"form10":1,"form2":0,"id":14,"form3":0,"form5":3,"form4":0,"form13":1,"form7":2,"form9":1,"form14":0,"form12":2,"form15":0,"form8":1,"form6":1,"form16":0,"form11":2,"form1":0},{"formations":37,"form10":1,"form2":0,"id":16,"form3":0,"form5":2,"form4":0,"form13":1,"form7":2,"form9":1,"form14":0,"form12":3,"form15":0,"form8":1,"form6":1,"form16":0,"form11":2,"form1":0},{"formations":44,"form10":1,"form2":0,"id":19,"form3":0,"form5":2,"form4":0,"form13":1,"form7":2,"form9":1,"form14":0,"form12":2,"form15":0,"form8":1,"form6":1,"form16":0,"form11":3,"form1":0},{"formations":51,"form10":1,"form2":0,"id":21,"form3":0,"form5":1,"form4":0,"form13":3,"form7":1,"form9":1,"form14":0,"form12":1,"form15":0,"form8":1,"form6":2,"form16":0,"form11":1,"form1":0},{"formations":58,"form10":0,"form2":2,"id":23,"form3":2,"form5":0,"form4":1,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":3},{"formations":64,"form10":0,"form2":3,"id":24,"form3":2,"form5":0,"form4":1,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":70,"form10":0,"form2":2,"id":25,"form3":3,"form5":0,"form4":1,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":76,"form10":0,"form2":1,"id":27,"form3":1,"form5":0,"form4":3,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":1},{"formations":82,"form10":0,"form2":0,"id":29,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":3,"form12":0,"form15":2,"form8":0,"form6":0,"form16":1,"form11":0,"form1":0},{"formations":89,"form10":0,"form2":0,"id":30,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":2,"form12":0,"form15":3,"form8":0,"form6":0,"form16":1,"form11":0,"form1":0},{"formations":96,"form10":0,"form2":0,"id":31,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":1,"form12":0,"form15":1,"form8":0,"form6":0,"form16":3,"form11":0,"form1":0}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_preferredformationcalcgk","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":16,"rowsize_bytes":12,"rows_emitted":16,"rowblock":"0x7b40828","rowblock_bytes":7,"descriptor":"0x428119f8","schema":[{"name":"formations","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"form10","bit":32,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form2","bit":35,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"id","bit":38,"width":6,"kind":"int","min":0,"max":34,"storage":"int"},{"name":"form3","bit":44,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form5","bit":47,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form4","bit":50,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form13","bit":53,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form7","bit":56,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form9","bit":59,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form14","bit":62,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form12","bit":65,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form15","bit":68,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form8","bit":71,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form6","bit":74,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form16","bit":77,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form11","bit":80,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form1","bit":83,"width":3,"kind":"int","min":0,"max":4,"storage":"int"}],"rows":[{"formations":0,"form10":2,"form2":0,"id":3,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":3,"form16":0,"form11":2,"form1":0},{"formations":6,"form10":2,"form2":0,"id":6,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":3,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":12,"form10":2,"form2":0,"id":7,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":3,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":18,"form10":3,"form2":0,"id":8,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":25,"form10":2,"form2":0,"id":13,"form3":0,"form5":2,"form4":0,"form13":2,"form7":3,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":31,"form10":2,"form2":0,"id":14,"form3":0,"form5":3,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":37,"form10":2,"form2":0,"id":16,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":3,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":44,"form10":2,"form2":0,"id":19,"form3":0,"form5":2,"form4":0,"form13":2,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":3,"form1":0},{"formations":51,"form10":2,"form2":0,"id":21,"form3":0,"form5":2,"form4":0,"form13":3,"form7":2,"form9":2,"form14":0,"form12":2,"form15":0,"form8":2,"form6":2,"form16":0,"form11":2,"form1":0},{"formations":58,"form10":0,"form2":2,"id":23,"form3":2,"form5":0,"form4":2,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":3},{"formations":64,"form10":0,"form2":3,"id":24,"form3":2,"form5":0,"form4":2,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":70,"form10":0,"form2":2,"id":25,"form3":3,"form5":0,"form4":2,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":76,"form10":0,"form2":2,"id":27,"form3":2,"form5":0,"form4":3,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":82,"form10":0,"form2":0,"id":29,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":3,"form12":0,"form15":2,"form8":0,"form6":0,"form16":2,"form11":0,"form1":0},{"formations":89,"form10":0,"form2":0,"id":30,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":2,"form12":0,"form15":3,"form8":0,"form6":0,"form16":2,"form11":0,"form1":0},{"formations":96,"form10":0,"form2":0,"id":31,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":2,"form12":0,"form15":2,"form8":0,"form6":0,"form16":3,"form11":0,"form1":0}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_preferredformationcalcmid","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":16,"rowsize_bytes":12,"rows_emitted":16,"rowblock":"0x7b409c8","rowblock_bytes":10,"descriptor":"0x42811838","schema":[{"name":"formations","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"form10","bit":32,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form2","bit":35,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"id","bit":38,"width":6,"kind":"int","min":0,"max":34,"storage":"int"},{"name":"form3","bit":44,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form5","bit":47,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form4","bit":50,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form13","bit":53,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form7","bit":56,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form9","bit":59,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form14","bit":62,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form12","bit":65,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form15","bit":68,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form8","bit":71,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form6","bit":74,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form16","bit":77,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form11","bit":80,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form1","bit":83,"width":3,"kind":"int","min":0,"max":4,"storage":"int"}],"rows":[{"formations":0,"form10":0,"form2":0,"id":3,"form3":0,"form5":0,"form4":1,"form13":2,"form7":0,"form9":2,"form14":0,"form12":0,"form15":0,"form8":0,"form6":3,"form16":0,"form11":0,"form1":0},{"formations":6,"form10":2,"form2":0,"id":6,"form3":0,"form5":1,"form4":0,"form13":0,"form7":0,"form9":2,"form14":0,"form12":0,"form15":0,"form8":3,"form6":0,"form16":0,"form11":0,"form1":0},{"formations":12,"form10":2,"form2":0,"id":7,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":3,"form14":0,"form12":0,"form15":0,"form8":2,"form6":2,"form16":0,"form11":0,"form1":0},{"formations":18,"form10":3,"form2":0,"id":8,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":2,"form14":0,"form12":0,"form15":0,"form8":2,"form6":0,"form16":0,"form11":0,"form1":0},{"formations":25,"form10":0,"form2":1,"id":13,"form3":1,"form5":1,"form4":0,"form13":0,"form7":3,"form9":0,"form14":0,"form12":2,"form15":0,"form8":0,"form6":0,"form16":0,"form11":2,"form1":1},{"formations":31,"form10":0,"form2":1,"id":14,"form3":1,"form5":3,"form4":0,"form13":0,"form7":1,"form9":0,"form14":0,"form12":2,"form15":0,"form8":1,"form6":0,"form16":0,"form11":2,"form1":1},{"formations":37,"form10":0,"form2":1,"id":16,"form3":1,"form5":2,"form4":0,"form13":0,"form7":2,"form9":0,"form14":0,"form12":3,"form15":0,"form8":0,"form6":0,"form16":0,"form11":2,"form1":1},{"formations":44,"form10":0,"form2":1,"id":19,"form3":1,"form5":2,"form4":0,"form13":0,"form7":2,"form9":0,"form14":0,"form12":2,"form15":0,"form8":0,"form6":0,"form16":0,"form11":3,"form1":1},{"formations":51,"form10":0,"form2":0,"id":21,"form3":0,"form5":0,"form4":0,"form13":3,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":2,"form16":0,"form11":0,"form1":0},{"formations":58,"form10":0,"form2":2,"id":23,"form3":2,"form5":1,"form4":0,"form13":0,"form7":1,"form9":0,"form14":0,"form12":1,"form15":0,"form8":0,"form6":0,"form16":0,"form11":1,"form1":3},{"formations":64,"form10":0,"form2":3,"id":24,"form3":2,"form5":1,"form4":0,"form13":0,"form7":1,"form9":0,"form14":0,"form12":1,"form15":0,"form8":0,"form6":0,"form16":0,"form11":1,"form1":2},{"formations":70,"form10":0,"form2":2,"id":25,"form3":3,"form5":1,"form4":0,"form13":0,"form7":1,"form9":0,"form14":0,"form12":1,"form15":0,"form8":0,"form6":0,"form16":0,"form11":1,"form1":2},{"formations":76,"form10":0,"form2":0,"id":27,"form3":0,"form5":0,"form4":3,"form13":0,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":1,"form16":0,"form11":0,"form1":0},{"formations":82,"form10":0,"form2":0,"id":29,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":3,"form12":0,"form15":2,"form8":0,"form6":0,"form16":1,"form11":0,"form1":0},{"formations":89,"form10":0,"form2":0,"id":30,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":2,"form12":0,"form15":3,"form8":0,"form6":0,"form16":1,"form11":0,"form1":0},{"formations":96,"form10":0,"form2":0,"id":31,"form3":0,"form5":0,"form4":0,"form13":0,"form7":0,"form9":0,"form14":1,"form12":0,"form15":1,"form8":0,"form6":0,"form16":3,"form11":0,"form1":0}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"table":"fcc_preferredformationcalcst","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":16,"rowsize_bytes":12,"rows_emitted":16,"rowblock":"0x7b404e8","rowblock_bytes":15,"descriptor":"0x42811678","schema":[{"name":"formations","bit":0,"width":32,"kind":"string","min":0,"max":0,"storage":"offset-unresolved"},{"name":"form10","bit":32,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form2","bit":35,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"id","bit":38,"width":6,"kind":"int","min":0,"max":34,"storage":"int"},{"name":"form3","bit":44,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form5","bit":47,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form4","bit":50,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form13","bit":53,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form7","bit":56,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form9","bit":59,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form14","bit":62,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form12","bit":65,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form15","bit":68,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form8","bit":71,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form6","bit":74,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form16","bit":77,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form11","bit":80,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"form1","bit":83,"width":3,"kind":"int","min":0,"max":4,"storage":"int"}],"rows":[{"formations":0,"form10":0,"form2":0,"id":3,"form3":0,"form5":0,"form4":0,"form13":2,"form7":0,"form9":0,"form14":0,"form12":0,"form15":1,"form8":0,"form6":3,"form16":0,"form11":1,"form1":0},{"formations":6,"form10":2,"form2":1,"id":6,"form3":1,"form5":1,"form4":0,"form13":0,"form7":0,"form9":2,"form14":1,"form12":0,"form15":0,"form8":3,"form6":0,"form16":0,"form11":0,"form1":1},{"formations":12,"form10":2,"form2":1,"id":7,"form3":1,"form5":0,"form4":0,"form13":0,"form7":0,"form9":3,"form14":0,"form12":0,"form15":1,"form8":2,"form6":0,"form16":0,"form11":0,"form1":1},{"formations":18,"form10":3,"form2":1,"id":8,"form3":1,"form5":0,"form4":0,"form13":0,"form7":0,"form9":2,"form14":1,"form12":0,"form15":1,"form8":2,"form6":0,"form16":0,"form11":0,"form1":1},{"formations":25,"form10":0,"form2":0,"id":13,"form3":0,"form5":2,"form4":1,"form13":0,"form7":3,"form9":0,"form14":0,"form12":2,"form15":0,"form8":0,"form6":0,"form16":0,"form11":2,"form1":0},{"formations":31,"form10":0,"form2":0,"id":14,"form3":0,"form5":3,"form4":1,"form13":0,"form7":2,"form9":0,"form14":1,"form12":2,"form15":0,"form8":1,"form6":0,"form16":1,"form11":2,"form1":0},{"formations":37,"form10":0,"form2":0,"id":16,"form3":0,"form5":2,"form4":1,"form13":0,"form7":2,"form9":0,"form14":0,"form12":3,"form15":0,"form8":0,"form6":0,"form16":0,"form11":2,"form1":0},{"formations":44,"form10":0,"form2":0,"id":19,"form3":0,"form5":2,"form4":0,"form13":0,"form7":2,"form9":0,"form14":0,"form12":2,"form15":0,"form8":0,"form6":1,"form16":0,"form11":3,"form1":0},{"formations":51,"form10":0,"form2":1,"id":21,"form3":0,"form5":0,"form4":0,"form13":3,"form7":0,"form9":0,"form14":0,"form12":0,"form15":0,"form8":0,"form6":2,"form16":0,"form11":0,"form1":0},{"formations":58,"form10":1,"form2":2,"id":23,"form3":2,"form5":0,"form4":0,"form13":0,"form7":0,"form9":1,"form14":1,"form12":0,"form15":1,"form8":1,"form6":0,"form16":0,"form11":0,"form1":3},{"formations":64,"form10":1,"form2":3,"id":24,"form3":2,"form5":0,"form4":0,"form13":1,"form7":0,"form9":1,"form14":1,"form12":0,"form15":1,"form8":1,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":70,"form10":1,"form2":2,"id":25,"form3":3,"form5":0,"form4":0,"form13":0,"form7":0,"form9":1,"form14":1,"form12":0,"form15":1,"form8":1,"form6":0,"form16":0,"form11":0,"form1":2},{"formations":76,"form10":0,"form2":0,"id":27,"form3":0,"form5":1,"form4":3,"form13":0,"form7":1,"form9":0,"form14":0,"form12":1,"form15":0,"form8":0,"form6":0,"form16":1,"form11":0,"form1":0},{"formations":82,"form10":1,"form2":1,"id":29,"form3":1,"form5":1,"form4":0,"form13":0,"form7":0,"form9":0,"form14":3,"form12":0,"form15":2,"form8":1,"form6":0,"form16":1,"form11":0,"form1":1},{"formations":89,"form10":1,"form2":1,"id":30,"form3":1,"form5":0,"form4":0,"form13":0,"form7":0,"form9":1,"form14":2,"form12":0,"form15":3,"form8":0,"form6":1,"form16":1,"form11":0,"form1":1},{"formations":96,"form10":0,"form2":0,"id":31,"form3":0,"form5":1,"form4":1,"form13":0,"form7":0,"form9":0,"form14":1,"form12":0,"form15":1,"form8":0,"form6":0,"form16":3,"form11":0,"form1":0}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fifaGameDefaults","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":5,"rowsize_bytes":36,"rows_emitted":5,"rowblock":"0x42e99fb8","rowblock_bytes":353,"descriptor":"0x42816d38","schema":[{"name":"defaultgkteam","bit":0,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"defaultgkid","bit":18,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"},{"name":"defaultfourthofficial","bit":37,"width":9,"kind":"int","min":1,"max":512,"storage":"int"},{"name":"defaultlinesman1","bit":46,"width":9,"kind":"int","min":1,"max":512,"storage":"int"},{"name":"gamesettingscontext","bit":55,"width":3,"kind":"int","min":0,"max":5,"storage":"int"},{"name":"defaultplayerid","bit":58,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"},{"name":"defaultfemalegkteam","bit":77,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"defaultleagueid","bit":95,"width":12,"kind":"int","min":-1,"max":3000,"storage":"int"},{"name":"gamesettingspk","bit":107,"width":31,"kind":"int","min":0,"max":2147483520,"storage":"int"},{"name":"defaultfemaleplayerid","bit":138,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"},{"name":"defaultreferee","bit":157,"width":9,"kind":"int","min":1,"max":512,"storage":"int"},{"name":"defaultlinesman2","bit":166,"width":9,"kind":"int","min":1,"max":512,"storage":"int"},{"name":"defaultteamid","bit":175,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"defaultballid","bit":193,"width":10,"kind":"int","min":-2,"max":1000,"storage":"int"},{"name":"defaultfemalegkid","bit":203,"width":19,"kind":"int","min":-1,"max":300000,"storage":"int"},{"name":"defaultfemaleplayerteam","bit":222,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"},{"name":"defaultplayerteam","bit":240,"width":18,"kind":"int","min":-1,"max":200000,"storage":"int"}],"rows":[{"defaultgkteam":10,"defaultgkid":150724,"defaultfourthofficial":52,"defaultlinesman1":359,"gamesettingscontext":1,"defaultplayerid":198710,"defaultfemalegkteam":113000,"defaultleagueid":13,"gamesettingspk":1,"defaultfemaleplayerid":226328,"defaultreferee":301,"defaultlinesman2":360,"defaultteamid":1,"defaultballid":100,"defaultfemalegkid":227400,"defaultfemaleplayerteam":113009,"defaultplayerteam":243},{"defaultgkteam":10,"defaultgkid":150724,"defaultfourthofficial":52,"defaultlinesman1":359,"gamesettingscontext":2,"defaultplayerid":198710,"defaultfemalegkteam":113000,"defaultleagueid":13,"gamesettingspk":2,"defaultfemaleplayerid":226328,"defaultreferee":301,"defaultlinesman2":360,"defaultteamid":1,"defaultballid":100,"defaultfemalegkid":227400,"defaultfemaleplayerteam":113009,"defaultplayerteam":243},{"defaultgkteam":10,"defaultgkid":150724,"defaultfourthofficial":52,"defaultlinesman1":359,"gamesettingscontext":3,"defaultplayerid":198710,"defaultfemalegkteam":-1,"defaultleagueid":13,"gamesettingspk":3,"defaultfemaleplayerid":-1,"defaultreferee":301,"defaultlinesman2":360,"defaultteamid":10,"defaultballid":100,"defaultfemalegkid":-1,"defaultfemaleplayerteam":-1,"defaultplayerteam":243},{"defaultgkteam":10,"defaultgkid":150724,"defaultfourthofficial":52,"defaultlinesman1":359,"gamesettingscontext":4,"defaultplayerid":198710,"defaultfemalegkteam":-1,"defaultleagueid":13,"gamesettingspk":4,"defaultfemaleplayerid":-1,"defaultreferee":301,"defaultlinesman2":360,"defaultteamid":10,"defaultballid":158,"defaultfemalegkid":-1,"defaultfemaleplayerteam":-1,"defaultplayerteam":243},{"defaultgkteam":10,"defaultgkid":150724,"defaultfourthofficial":52,"defaultlinesman1":359,"gamesettingscontext":5,"defaultplayerid":198710,"defaultfemalegkteam":-1,"defaultleagueid":13,"gamesettingspk":5,"defaultfemaleplayerid":-1,"defaultreferee":301,"defaultlinesman2":360,"defaultteamid":10,"defaultballid":23,"defaultfemalegkid":-1,"defaultfemaleplayerteam":-1,"defaultplayerteam":243}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fixtures","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":0,"rowsize_bytes":24,"rows_emitted":0,"rowblock":"0x42740ef8","rowblock_bytes":28833,"descriptor":"0x427568e8","schema":[{"name":"textid_gameotw","bit":0,"width":8,"kind":"int","min":0,"max":255,"storage":"int"},{"name":"predictedwinner","bit":8,"width":2,"kind":"int","min":0,"max":3,"storage":"int"},{"name":"hometeamid","bit":10,"width":18,"kind":"int","min":0,"max":200000,"storage":"int"},{"name":"fancards","bit":28,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"hometeamskill","bit":29,"width":3,"kind":"int","min":0,"max":7,"storage":"int"},{"name":"legno","bit":32,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"awayteamskill","bit":33,"width":3,"kind":"int","min":0,"max":7,"storage":"int"},{"name":"stageofcompetition","bit":36,"width":6,"kind":"int","min":0,"max":63,"storage":"int"},{"name":"competitionid","bit":42,"width":10,"kind":"int","min":0,"max":1023,"storage":"int"},{"name":"stadiumid","bit":52,"width":9,"kind":"int","min":0,"max":511,"storage":"int"},{"name":"fixturedate","bit":61,"width":20,"kind":"date","min":0,"max":1048575,"storage":"int"},{"name":"currawayprevscore","bit":81,"width":5,"kind":"int","min":0,"max":31,"storage":"int"},{"name":"drawmode","bit":86,"width":5,"kind":"int","min":0,"max":16,"storage":"int"},{"name":"competitiontype","bit":91,"width":3,"kind":"int","min":0,"max":4,"storage":"int"},{"name":"matchimportance","bit":94,"width":3,"kind":"int","min":0,"max":7,"storage":"int"},{"name":"fixtureid","bit":97,"width":18,"kind":"int","min":0,"max":200000,"storage":"int"},{"name":"multipleleg","bit":115,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"livegametype","bit":116,"width":3,"kind":"int","min":0,"max":7,"storage":"int"},{"name":"currhomeprevscore","bit":119,"width":5,"kind":"int","min":0,"max":31,"storage":"int"},{"name":"fixturetime","bit":124,"width":17,"kind":"int","min":0,"max":86400,"storage":"int"},{"name":"fanflags","bit":141,"width":1,"kind":"int","min":0,"max":1,"storage":"int"},{"name":"awayteamid","bit":142,"width":18,"kind":"int","min":0,"max":200000,"storage":"int"},{"name":"refereeid","bit":160,"width":10,"kind":"int","min":-1,"max":512,"storage":"int"}],"rows":[]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"table":"fut_storymodehero","source":"FIFA17.exe resident database (tools/db_dump.py)","rowcount":80,"rowsize_bytes":8,"rows_emitted":80,"rowblock":"0x4280fa38","rowblock_bytes":673,"descriptor":"0x7b57648","schema":[{"name":"carddbid","bit":0,"width":31,"kind":"int","min":0,"max":2147483647,"storage":"int"},{"name":"teamid","bit":31,"width":31,"kind":"int","min":0,"max":2147483647,"storage":"int"}],"rows":[{"carddbid":22800,"teamid":1943},{"carddbid":22801,"teamid":1},{"carddbid":22802,"teamid":1952},{"carddbid":22803,"teamid":5},{"carddbid":22804,"teamid":1799},{"carddbid":22805,"teamid":7},{"carddbid":22806,"teamid":95},{"carddbid":22807,"teamid":9},{"carddbid":22808,"teamid":10},{"carddbid":22809,"teamid":11},{"carddbid":22810,"teamid":1796},{"carddbid":22811,"teamid":12},{"carddbid":22812,"teamid":17},{"carddbid":22813,"teamid":1806},{"carddbid":22814,"teamid":106},{"carddbid":22815,"teamid":1960},{"carddbid":22816,"teamid":18},{"carddbid":22817,"teamid":1795},{"carddbid":22818,"teamid":109},{"carddbid":22819,"teamid":19},{"carddbid":22820,"teamid":1943},{"carddbid":22821,"teamid":1},{"carddbid":22822,"teamid":1952},{"carddbid":22823,"teamid":5},{"carddbid":22824,"teamid":1799},{"carddbid":22825,"teamid":7},{"carddbid":22826,"teamid":95},{"carddbid":22827,"teamid":9},{"carddbid":22828,"teamid":10},{"carddbid":22829,"teamid":11},{"carddbid":22830,"teamid":1796},{"carddbid":22831,"teamid":12},{"carddbid":22832,"teamid":17},{"carddbid":22833,"teamid":1806},{"carddbid":22834,"teamid":106},{"carddbid":22835,"teamid":1960},{"carddbid":22836,"teamid":18},{"carddbid":22837,"teamid":1795},{"carddbid":22838,"teamid":109},{"carddbid":22839,"teamid":19},{"carddbid":22840,"teamid":1943},{"carddbid":22841,"teamid":1},{"carddbid":22842,"teamid":1952},{"carddbid":22843,"teamid":5},{"carddbid":22844,"teamid":1799},{"carddbid":22845,"teamid":7},{"carddbid":22846,"teamid":95},{"carddbid":22847,"teamid":9},{"carddbid":22848,"teamid":10},{"carddbid":22849,"teamid":11},{"carddbid":22850,"teamid":1796},{"carddbid":22851,"teamid":12},{"carddbid":22852,"teamid":17},{"carddbid":22853,"teamid":1806},{"carddbid":22854,"teamid":106},{"carddbid":22855,"teamid":1960},{"carddbid":22856,"teamid":18},{"carddbid":22857,"teamid":1795},{"carddbid":22858,"teamid":109},{"carddbid":22859,"teamid":19},{"carddbid":22860,"teamid":1943},{"carddbid":22861,"teamid":1},{"carddbid":22862,"teamid":1952},{"carddbid":22863,"teamid":5},{"carddbid":22864,"teamid":1799},{"carddbid":22865,"teamid":7},{"carddbid":22866,"teamid":95},{"carddbid":22867,"teamid":9},{"carddbid":22868,"teamid":10},{"carddbid":22869,"teamid":11},{"carddbid":22870,"teamid":1796},{"carddbid":22871,"teamid":12},{"carddbid":22872,"teamid":17},{"carddbid":22873,"teamid":1806},{"carddbid":22874,"teamid":106},{"carddbid":22875,"teamid":1960},{"carddbid":22876,"teamid":18},{"carddbid":22877,"teamid":1795},{"carddbid":22878,"teamid":109},{"carddbid":22879,"teamid":19}]}
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user