Initial commit: OpenFUT Core + Bridge scaffold

Two-repo monorepo for an offline FUT backend inspired by SPT.

openfut-core: game-independent REST API backend (Axum, SQLite, SQLx)
- 19 API endpoints: auth, profiles, clubs, cards, packs, squads,
  objectives, SBCs, match rewards, NPC market, statistics
- JSON-driven card/pack/objective/SBC data (fully moddable)
- SQLx migrations, weighted pack generator, SBC validation engine
- 5 integration tests passing

openfut-bridge: FIFA 23 traffic proxy + reverse-engineering scaffold
- Catch-all HTTP proxy with request capture to captures/
- Known-route mapper (FUT paths → Core API calls)
- Placeholder responses for unknown endpoints
- Admin endpoints: captures, unknown endpoint list
- 4 unit tests passing

cargo fmt ✓  cargo clippy -D warnings ✓  cargo test ✓

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-06-25 14:42:16 -07:00
commit 6ef4c40e29
79 changed files with 9158 additions and 0 deletions
+189
View File
@@ -0,0 +1,189 @@
[
{
"id": "card_bronze_001",
"name": "Lucas Santos",
"overall": 62,
"position": "ST",
"nation": "Brazil",
"league": "Serie B",
"club": "Santos FC",
"pace": 72,
"shooting": 61,
"passing": 52,
"dribbling": 63,
"defending": 30,
"physical": 64,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_002",
"name": "Marco Ferri",
"overall": 60,
"position": "CM",
"nation": "Italy",
"league": "Serie C",
"club": "Modena FC",
"pace": 58,
"shooting": 52,
"passing": 63,
"dribbling": 59,
"defending": 55,
"physical": 60,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_003",
"name": "Eko Jabari",
"overall": 61,
"position": "CB",
"nation": "Nigeria",
"league": "NPFL",
"club": "Kano Pillars",
"pace": 60,
"shooting": 25,
"passing": 48,
"dribbling": 42,
"defending": 64,
"physical": 70,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_004",
"name": "Pieter Van Dijk",
"overall": 63,
"position": "LB",
"nation": "Netherlands",
"league": "Eerste Divisie",
"club": "FC Volendam",
"pace": 65,
"shooting": 38,
"passing": 60,
"dribbling": 61,
"defending": 65,
"physical": 62,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_005",
"name": "Tomás Ruiz",
"overall": 62,
"position": "GK",
"nation": "Spain",
"league": "Segunda B",
"club": "SD Compostela",
"pace": 40,
"shooting": 10,
"passing": 35,
"dribbling": 20,
"defending": 62,
"physical": 58,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_006",
"name": "James Okafor",
"overall": 60,
"position": "RM",
"nation": "Ghana",
"league": "Ghana Premier League",
"club": "Asante Kotoko",
"pace": 75,
"shooting": 55,
"passing": 58,
"dribbling": 66,
"defending": 32,
"physical": 55,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_007",
"name": "Stefan Kovac",
"overall": 61,
"position": "CDM",
"nation": "Serbia",
"league": "Super liga Srbije",
"club": "FK Partizan",
"pace": 55,
"shooting": 50,
"passing": 60,
"dribbling": 56,
"defending": 63,
"physical": 68,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_008",
"name": "Hiroshi Tanaka",
"overall": 63,
"position": "CAM",
"nation": "Japan",
"league": "J2 League",
"club": "Gamba Osaka",
"pace": 68,
"shooting": 60,
"passing": 66,
"dribbling": 70,
"defending": 38,
"physical": 52,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_009",
"name": "Aleksei Morozov",
"overall": 60,
"position": "RB",
"nation": "Russia",
"league": "FNL",
"club": "Torpedo Moscow",
"pace": 62,
"shooting": 40,
"passing": 56,
"dribbling": 58,
"defending": 62,
"physical": 60,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_010",
"name": "Kwame Asante",
"overall": 62,
"position": "LM",
"nation": "Ghana",
"league": "Ghana Premier League",
"club": "Hearts of Oak",
"pace": 73,
"shooting": 58,
"passing": 60,
"dribbling": 65,
"defending": 35,
"physical": 58,
"rarity": "bronze",
"image_path": null
},
{
"id": "card_bronze_011",
"name": "Ivan Petrov",
"overall": 61,
"position": "CB",
"nation": "Bulgaria",
"league": "First League",
"club": "CSKA Sofia",
"pace": 58,
"shooting": 22,
"passing": 50,
"dribbling": 44,
"defending": 63,
"physical": 67,
"rarity": "bronze",
"image_path": null
}
]
+87
View File
@@ -0,0 +1,87 @@
[
{
"id": "card_gold_001",
"name": "Alejandro Vargas",
"overall": 82,
"position": "ST",
"nation": "Argentina",
"league": "Primera Division",
"club": "River Plate",
"pace": 85,
"shooting": 84,
"passing": 72,
"dribbling": 80,
"defending": 40,
"physical": 78,
"rarity": "gold",
"image_path": null
},
{
"id": "card_gold_002",
"name": "Thomas Beaumont",
"overall": 80,
"position": "CM",
"nation": "France",
"league": "Ligue 2",
"club": "FC Toulouse",
"pace": 72,
"shooting": 74,
"passing": 83,
"dribbling": 78,
"defending": 68,
"physical": 74,
"rarity": "gold",
"image_path": null
},
{
"id": "card_gold_003",
"name": "Dimitri Kovalenko",
"overall": 81,
"position": "CB",
"nation": "Ukraine",
"league": "Premier League UA",
"club": "Shakhtar Donetsk",
"pace": 75,
"shooting": 38,
"passing": 65,
"dribbling": 60,
"defending": 83,
"physical": 82,
"rarity": "gold",
"image_path": null
},
{
"id": "card_gold_004",
"name": "Felipe Moura",
"overall": 83,
"position": "LW",
"nation": "Brazil",
"league": "Brasileirao",
"club": "Palmeiras",
"pace": 88,
"shooting": 80,
"passing": 76,
"dribbling": 86,
"defending": 44,
"physical": 68,
"rarity": "gold",
"image_path": null
},
{
"id": "card_gold_005",
"name": "Lars Eriksson",
"overall": 79,
"position": "GK",
"nation": "Sweden",
"league": "Allsvenskan",
"club": "Malmo FF",
"pace": 45,
"shooting": 12,
"passing": 58,
"dribbling": 32,
"defending": 80,
"physical": 76,
"rarity": "gold",
"image_path": null
}
]
+19
View File
@@ -0,0 +1,19 @@
[
{
"id": "card_icon_loan_001",
"name": "The Maestro (Loan)",
"overall": 94,
"position": "CAM",
"nation": "France",
"league": "Icons",
"club": "Icons",
"pace": 82,
"shooting": 88,
"passing": 95,
"dribbling": 92,
"defending": 60,
"physical": 72,
"rarity": "icon",
"image_path": null
}
]