.
Lê o teu save e o estado em memória via Live Editor, detecta eventos em tempo real e alimenta uma API REST + PWA com narrativa, jornal esportivo, diretoria, mercado, conquistas e muito mais.
⚠️ Projeto independente. Não é afiliado à Electronic Arts nem ao EA FC.
O FC Companion transforma os dados do teu Modo Carreira numa experiência paralela ao jogo: um painel web que acompanha cada resultado, lesão, transferência e marco da tua temporada — com narrativa gerada por IA, jornal esportivo, coletivas de imprensa, diretoria reagindo às tuas decisões e muito mais.
Funciona 100% local no teu PC. Nenhum dado sai da tua máquina sem a tua permissão.
- 📰 Jornal esportivo — feed diário com notícias geradas a partir dos eventos da tua carreira
- 🏆 Sala de troféus — histórico de conquistas com destaque narrativo por temporada
- 🧑💼 Perfil do treinador — biografia, reputação e evolução ao longo da carreira
- 🎙️ Coletivas de imprensa — contexto pré e pós-jogo com dados reais do save
- 💬 Negociações — diálogos com jogadores (contratos, crises, conselhos)
- 📊 Dashboard da temporada — classificação, finanças, plantel e moral
- 🧬 Arcos narrativos — crises, momentos de virada e epílogos de temporada
- 🏅 Conquistas e Hall da Fama — desbloqueadas por marcos reais da carreira
EA FC 26 (save + runtime)
│
├── Live Editor / Lua ───────────────► Desktop/fc_companion/state_lua.json
│ └─ name resolution, live roles, finance_live
│
└── Save de carreira (.db) ─► save_reader/ ─► Desktop/fc_companion/save_data.json
│ └─ transfer_history / season stats / squad
└─ save_watcher.py + node_fbparser/
state_lua.json + save_data.json
│
▼
watcher.py
├── StateMerger ─────────────► Desktop/fc_companion/state.json
├── EventDetector ───────────► eventos brutos
├── EventDispatcher ─────────► eventos híbridos
└── ExternalIngestion ───────► schema / reference_data / season_stats / transfer_history
state.json + eventos + artefatos
│
▼
FastAPI (backend/main.py)
├── database.py / SQLite (fc_companion.db)
├── *_engine.py (narrativa, reputação, mercado, crise, legado, conquistas...)
├── front_read_models.py (payloads agregados para a SPA)
└── uploads/ (troféus e escudos)
FastAPI
│
▼
React PWA (frontend/src)
├── App.tsx + Layout
├── pages/
├── components/
├── store/
└── lib/api.ts
- O script Lua (Live Editor) exporta dados de memória do jogo para
state_lua.json. - O save reader lê o save em disco e complementa com
save_data.json, incluindo histórico de transferências e estatísticas. - O watcher combina as fontes, detecta mudanças, gera eventos e envia o resultado para a API.
- A API (FastAPI) orquestra os motores de domínio, persiste em SQLite e expõe os payloads consumidos pela SPA.
- O frontend (React PWA) lê a API e apresenta o painel web, inclusive nos ecrãs premium.
| Camada | Tecnologia |
|---|---|
| Extrator | Lua (FC 26 Live Editor) |
| Backend | Python 3.11+, FastAPI, SQLite, Watchdog |
| Frontend | React + TypeScript + Tailwind CSS + Vite (PWA) |
| IA | Gemini 2.0 Flash / Ollama (local) / OpenAI-compatible |
- Windows 10/11
- EA FC 26 (PC) com save de Modo Carreira
- FC 26 Live Editor com Lua Engine ativo
- Python 3.11 ou 3.12
- Node.js 18+
git clone https://github.com/seu-usuario/fc-companion.git
cd fc-companioncd backend
pip install -r requirements.txtcd frontend
npm install
npm run build- Abre o EA FC 26 e carrega a tua carreira.
- No Live Editor, abre o Lua Engine.
- Cola o conteúdo de
extractor/companion_export.luae executa.
O script vai criar a pasta %USERPROFILE%\Desktop\fc_companion\ com o ficheiro state_lua.json.
cd backend
uvicorn main:app --host 127.0.0.1 --port 8000Acessa a documentação em: http://localhost:8000/docs
Num segundo terminal:
cd backend
python watcher.pycd frontend
npm run devOu acessa diretamente via http://localhost:8000 se já tiveres feito o build.
fc-companion/
├── extractor/
│ ├── companion_export.lua # Script Lua principal para o Live Editor
│ └── explore_cm_feed_managers.lua
├── backend/
│ ├── main.py # API FastAPI e orquestração dos motores
│ ├── watcher.py # Monitoramento e despacho de eventos
│ ├── merger.py # Unificação das fontes de dados
│ ├── database.py # Persistência SQLite
│ ├── events.py # Detecção de eventos no estado mesclado
│ ├── models.py # Schemas de entrada da API
│ ├── front_read_models.py # Payloads agregados para o frontend
│ ├── external_ingestion.py # Ingestão de artefatos auxiliares
│ ├── competition_stats.py # Estatísticas de competições
│ ├── *_engine.py # Motores de domínio (narrativa, mercado, legado...)
│ ├── internal_comms_*.py # Fluxos de comunicação interna
│ ├── press_*.py # Press conference e fallout narrativo
│ ├── legacy_*.py # Hub de legado e perfil histórico
│ ├── save_reader/
│ │ ├── save_finder.py
│ │ ├── save_parser.py
│ │ ├── save_watcher.py
│ │ ├── transfer_history_from_save.py
│ │ └── node_fbparser/
│ │ ├── parse_fbchunks.js
│ │ ├── package.json
│ │ └── package-lock.json
│ └── uploads/
│ ├── clubs/
│ └── trophies/
├── frontend/
│ ├── public/favicon.svg
│ ├── src/
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── index.css
│ │ ├── components/
│ │ │ ├── Layout.tsx
│ │ │ ├── Header.tsx
│ │ │ ├── BottomNav.tsx
│ │ │ ├── Empty.tsx
│ │ │ ├── NotificationBell.tsx
│ │ │ └── premium/
│ │ │ ├── ArticleReader.tsx
│ │ │ ├── NewsStoryCard.tsx
│ │ │ ├── SectionHeader.tsx
│ │ │ └── SignalRadarCard.tsx
│ │ ├── hooks/useTheme.ts
│ │ ├── lib/api.ts
│ │ ├── lib/utils.ts
│ │ ├── pages/
│ │ │ ├── Feed.tsx
│ │ │ ├── Home.tsx
│ │ │ ├── Plantel.tsx
│ │ │ ├── Carreira.tsx
│ │ │ ├── Legado.tsx
│ │ │ ├── Conquistas.tsx
│ │ │ ├── Configuracoes.tsx
│ │ │ ├── Mercado.tsx
│ │ │ ├── Social.tsx
│ │ │ ├── NewsArticle.tsx
│ │ │ ├── Conference.tsx
│ │ │ ├── Financas.tsx
│ │ │ ├── StatusFisico.tsx
│ │ │ └── Estatisticas.tsx
│ │ └── store/
│ │ ├── index.ts
│ │ ├── useGameStore.ts
│ │ ├── useFinanceStore.ts
│ │ ├── useCareerHubStore.ts
│ │ └── useNotificationsStore.ts
│ ├── package.json
│ ├── vite.config.ts
│ ├── tailwind.config.js
│ └── dist/ # Build gerado pelo Vite/FastAPI
├── launcher/
│ ├── run_companion.py # Script de arranque
│ ├── run_companion.bat
│ ├── FCCompanion.spec # Spec PyInstaller
│ └── BUILD_EXE.md
├── docs/
│ ├── AI_GEMINI.md
│ ├── CAREER_PREMIUM_FRONT_BLUEPRINT.md
│ ├── CM_FEED_ARCHITECTURE.md
│ ├── ENV.md
│ ├── HALL_OF_FAME_SYNC.md
│ ├── LIVE_EDITOR_DATA_CONTRACT.md
│ └── RUN_LOCAL.md
└── README.md
| Ficheiro | Descrição |
|---|---|
Desktop/fc_companion/state_lua.json |
Dados exportados pelo Lua |
Desktop/fc_companion/save_data.json |
Dados lidos do save em disco |
Desktop/fc_companion/state.json |
Estado unificado (fonte da API) |
Desktop/fc_companion/save_probe/ |
Dumps auxiliares do parser do save |
Desktop/fc_companion/<save_uid>/transfer_history.json |
Histórico de transferências ingerido pelo backend |
backend/fc_companion.db |
Histórico, eventos, perfis e narrativas (SQLite) |
backend/uploads/ |
Imagens enviadas para troféus e clubes |
Cria um ficheiro .env dentro de backend/:
# IA (opcional — usa templates por padrão se não configurado)
OPENAI_API_KEY=
OPENAI_BASE_URL=
OPENAI_MODEL=
# Provider de narrativa: "template" | "openai" | "gemini" | "ollama"
PROMANAGER_AI_PROVIDER=templatecd launcher
pip install pyinstaller
pyinstaller FCCompanion.specO executável será gerado em launcher/dist/. Consulta BUILD_EXE.md para detalhes.
| Script | Uso |
|---|---|
backend/diagnose_save.py |
Inspeciona a estrutura do save |
backend/debug_standings.py |
Depura classificações |
cd backend
python -m unittest discover -p "test_*.py"Pull requests são bem-vindos! Se encontrares um bug ou tiveres uma ideia, abre uma issue primeiro para discutirmos.
MIT — livre para uso pessoal e educacional.
EA FC é marca registada da Electronic Arts. Este projeto não é endossado nem afiliado à EA. Faz sempre backup dos teus saves antes de usar ferramentas de terceiros.