Centenas de naves a negociar sozinhas: The Space Project em Rust e Bevy
Space Project é um simulador de economia espacial auto-suficiente em Rust e Bevy. Centenas de naves autónomas negociam, mineram e vão à falência sem input do jogador.
Passei a tarde de sábado a ver pontos a mexerem-se num ecrã. Naves a negociar rotas, a esgotar combustível, a declarar falência. Eu não controlava nada — só observava. Foi o momento mais interessante que tive com um simulador em meses.
O Space Project é um simulador de economia espacial construído em Rust com o motor Bevy, criado por Kalcode. Apareceu no HN há dias com 86 pontos e uma discussão animada, por boas razões. A premissa é desconcertante de simples: não há jogador, não há objetivos, não há eventos escritos à mão. Centenas de naves autónomas com a sua própria conta bancária, tripulação, combustível e porão de carga decidem o que fazer sozinhas.
Como funciona
Cada nave usa um planeador GOAP (Goal-Oriented Action Planning) para escolher a ação mais útil: perseguir a rota comercial mais rentável, aceitar um contrato de entrega, dirigir-se a um estaleiro para fazer retrofit, ou atracar para a tripulação descansar antes que a moral colapse. É o mesmo tipo de sistema que o jogo F.E.A.R. usou para os seus inimigos em 2005, mas aplicado a centenas de entidades (cerca de 485 agentes, segundo o README) numa simulação económica.
O estado de cada nave é composto por variáveis como combustível, moral, créditos e integridade da estrutura. O planeador GOAP avalia o estado atual, define objetivos (maximizar lucro, sobreviver) e executa a sequência de ações que melhor os satisfaz. Nada é aleatório — cada decisão tem uma razão de ser, mesmo que o resultado global pareça caótico.
Arquitetura
O que me chamou a atenção foi a arquitetura. O núcleo da simulação é puro, síncrono e sem IO; usa o seu próprio ECS (hecs) em vez do ECS do Bevy. O cliente Bevy embebe a simulação como uma biblioteca, e ambas partilham o mesmo mundo sem qualquer marshalling. Como o autor escreveu no HN: “The sim core is pure, synchronous, IO-free, and the Bevy client embeds it directly as a library, sim and renderer share one world with zero marshalling.”
Isto tem implicações práticas. O simulador corre a mesma lógica quer estejas a ver as naves em 3D com o Bevy, quer estejas a correr uma versão headless para testes ou análise de dados. Tudo num único binário nativo, sem dependências runtime. Compila em macOS, Windows e Linux.
git clone https://github.com/Kalcode/spaceprojectsim
cd spaceprojectsim && cargo run --release
Comportamento emergente
O mais cativante é ver como comportamentos complexos emergem de regras simples. Nenhuma nave foi programada para “criar uma crise económica”. Mas se uma rota comercial deixa de ser rentável porque uma estação saturou o mercado, as naves migram, os preços ajustam-se, e algumas vão à falência. O sistema encontra o seu próprio equilíbrio — ou desequilíbrio.
Mercados encontram os seus preços sozinhos. Fações taxam e subsidiam. Populações migram quando estão insatisfeitas. Estações abandonadas apodrecem com o tempo. Nada disto está escrito num guião: emerge da interação entre agentes com regras locais simples. É o tipo de simulação que mostra como ordem pode surgir do caos sem um designer a controlar tudo.
O projeto está licenciado sob MIT e o código está todo no GitHub. O autor descreve-o como experimental, e a estrutura do repositório mostra que ainda está em evolução; commits recentes focam-se em preparar o código para open source.
A cena do game dev em Rust está a crescer, mas projetos como este mostram um caminho diferente. Um motor de jogo pode servir para simular sistemas complexos sem precisar de um jogador sentado à frente do ecrã. O Bevy tanto serve para fazer jogos como para correr economias espaciais inteiras — a parte gráfica é quase um extra.
A pergunta que me ficou: se conseguimos simular economias espaciais inteiras sem intervenção humana, porque é que a maioria dos jogos ainda insiste em dar ao jogador o controlo de tudo?
Partilhar
Comentários 0
Ainda sem comentários — sê o primeiro.