Projeto para carregar, editar e exportar arquivos de save do Brasfoot em uma sessao em memoria.
Repositorio no GitHub
- Sobre o projeto
- Arquitetura
- Como o save foi mapeado
- Funcionalidades
- Stack
- Como executar localmente
- Fluxo de uso
- API principal
- Exemplo rapido com curl
- Testes e qualidade
- Estrutura do repositorio
- Contribuicao
- Licenca
O Brasfoot Save Editor evoluiu para um produto web com duas partes:
- Backend Spring Boot que carrega o arquivo
.s22, expoe endpoints REST e gerencia sessao em memoria. - Frontend Next.js para upload, navegacao de workspace e edicao de entidades.
- O fluxo principal e: upload -> editar -> download.
- A sessao e mantida em cache por ate 1 hora.
- Ao fazer download do save, a sessao e marcada como encerrada (nao reutilizavel).
- O frontend foi desenhado para desktop/tablet (largura >= 768px).
- Upload limitado a 500 MB.
- API versionada em
/api/v1. - Organizacao orientada a portas e adaptadores (hexagonal).
- Persistencia de sessao em cache Caffeine:
- sessao ativa: 1 hora
- tombstone de sessao expirada/deletada: 24 horas
- Leitura/escrita de save com Kryo.
- Tela de intake para upload do
.s22. - Workspace com secoes: Overview, Teams, Players, Managers.
- Proxy interno em
/api/brasfoot/*para o backend. - Edicao individual e em lote nas entidades suportadas.
- Atalho de navegacao com command palette (
Ctrl/Cmd + K).
O arquivo .s22 do Brasfoot e um objeto Java serializado com Kryo, uma biblioteca de serializacao binaria de alta performance. O jogo aplica ofuscacao nos nomes dos campos — atributos que semanticamente sao money, overall ou reputation aparecem no binario como nb, eq, nc e similares, sem documentacao publica de nenhum tipo.
O processo de mapeamento foi feito por engenharia reversa direta: inspecionar o objeto deserializado em runtime, correlacionar os valores dos campos ofuscados com o comportamento observado no jogo e validar cada campo manualmente contra saves reais. O resultado esta centralizado em BrasfootConstants.java, que mapeia cada chave ofuscada para uma constante legivel com tipo e descricao. Campos identificados mas ainda nao validados foram isolados em BrasfootUnverifiedConstants.java para evitar uso acidental em codigo de producao.
- Upload de save
.s22e abertura de sessao. - Download do save editado.
- Visualizacao e edicao de:
- times (dinheiro e reputacao)
- jogadores (idade, overall, posicao, energia, moral, estrelas)
- tecnicos (nome, confianca da diretoria e torcida)
- Atualizacao em lote por entidade.
- Endpoint de comandos mistos em lote (
/commands/batch). - Mensagens de erro padronizadas via
ProblemDetail.
- Java 17+
- Spring Boot 3.2
- Spring Web + Validation + springdoc-openapi
- Caffeine Cache
- Kryo
- Next.js 16 + React 19 + TypeScript
- Tailwind CSS
Você pode executar o projeto de três maneiras diferentes, dependendo da sua preferência:
A maneira mais rapida de executar a aplicacao sem instalar as ferramentas localmente. Pre-requisito: ter o Docker instalado.
- Clone o repositorio:
git clone https://github.com/leonifrazao/brasfoot-save-editor.git
cd brasfoot-save-editor- Suba todos os servicos de uma vez em background:
docker compose up -d- Acesse:
- Frontend Web:
http://localhost:3000 - Backend API e Swagger:
http://localhost:8080/swagger-ui/index.html
- Frontend Web:
Se voce usa o gerenciador de pacotes Nix, o repositorio inclui um shell.nix que ja configura o ecossistema exato do projeto (Java 17, Node 20+, Maven, Docker, etc).
- Na pasta do projeto clonado, ative o ambiente virtual:
nix-shell- Pronto! Voce tera um painel interativo confirmando todas as versoes e podera executar os comandos manuais para backend (
mvn spring-boot:run) ou frontend (cd frontend && npm run dev) tudo no mesmo shell homogeneo.
- Java 17 ou superior
- Maven 3.9+
- Node.js 20+
- npm 10+
git clone https://github.com/leonifrazao/brasfoot-save-editor.git
cd brasfoot-save-editorSe o Maven reclamar de com.brasfoot:brasfoot-game:1.0, instale o jar que ja esta no repositorio:
mvn install:install-file \
-Dfile=lib/brasfoot.jar \
-DgroupId=com.brasfoot \
-DartifactId=brasfoot-game \
-Dversion=1.0 \
-Dpackaging=jarmvn spring-boot:runSwagger/OpenAPI:
Em outro terminal:
cd frontend
npm installCrie um arquivo frontend/.env.local (opcional, recomendado):
BRASFOOT_API_BASE_URL=http://localhost:8080Depois execute:
npm run devAplicacao web:
- Abra a home do frontend em
http://localhost:3000. - Envie um arquivo
.s22. - Navegue pelo workspace (Overview, Teams, Players, Managers).
- Salve as alteracoes que quiser por entidade ou em lote.
- Clique em Download save para exportar o arquivo editado.
Observacao: apos o download, a sessao e invalidada no backend.
| Metodo | Rota | Descricao |
|---|---|---|
POST |
/api/v1/sessions |
Upload do save (multipart/form-data, campo file) |
GET |
/api/v1/sessions/{sessionId}/download |
Download do save editado e encerramento da sessao |
GET |
/api/v1/sessions/{sessionId}/teams |
Lista times |
PATCH |
/api/v1/sessions/{sessionId}/teams/{teamId} |
Atualiza um time |
PATCH |
/api/v1/sessions/{sessionId}/teams/batch |
Atualiza varios times |
GET |
/api/v1/sessions/{sessionId}/teams/{teamId}/players |
Lista jogadores do time |
PATCH |
/api/v1/sessions/{sessionId}/teams/{teamId}/players/{playerId} |
Atualiza um jogador |
PATCH |
/api/v1/sessions/{sessionId}/teams/{teamId}/players/batch |
Atualiza varios jogadores |
GET |
/api/v1/sessions/{sessionId}/managers |
Lista tecnicos |
PATCH |
/api/v1/sessions/{sessionId}/managers/{managerId} |
Atualiza um tecnico |
PATCH |
/api/v1/sessions/{sessionId}/managers/batch |
Atualiza varios tecnicos |
POST |
/api/v1/sessions/{sessionId}/commands/batch |
Executa lote misto (team.update, player.update, manager.update) |
Mapeamento utilizado pela API:
0: Municipal1: Estadual2: Regional3: Nacional4: Continental5: Mundial
curl -X POST "http://localhost:8080/api/v1/sessions" \
-F "file=@meu-save.s22"Resposta esperada:
{
"sessionId": "UUID_DA_SESSAO"
}curl -X PATCH "http://localhost:8080/api/v1/sessions/UUID_DA_SESSAO/teams/12" \
-H "Content-Type: application/json" \
-d '{"money":50000000,"reputation":5}'curl -L "http://localhost:8080/api/v1/sessions/UUID_DA_SESSAO/download" -o save-editado.s22[
{
"type": "team.update",
"teamId": 1,
"money": 70000000,
"reputation": 5
},
{
"type": "player.update",
"teamId": 1,
"playerId": 8,
"overall": 99
},
{
"type": "manager.update",
"managerId": 2,
"confidenceBoard": 100
}
]Backend:
mvn testFrontend:
cd frontend
npm run lintbrasfoot-save-editor/
├── frontend/ # Aplicacao Next.js (UI)
│ └── src/
│ ├── app/ # Rotas e pages
│ ├── components/ # Componentes de interface
│ └── lib/ # Cliente API, tipos e rotas
├── lib/ # JARs locais usados no projeto
├── src/main/java/ # Backend Spring Boot
├── src/main/resources/ # Configuracoes backend
├── src/test/java/ # Testes backend
├── pom.xml # Build Maven
└── README.md
Contribuicoes sao bem-vindas.
- Faca um fork
- Crie uma branch (
feature/minha-feature) - Commit suas alteracoes
- Abra um Pull Request
Distribuido sob a licenca AGPL-3.0. Veja LICENSE.