A farm is a system that wants to return to chaos. Your job is to delay that.
Uma fazenda é um sistema que quer voltar ao caos. Seu trabalho é adiar isso.
I am building a game. It is called Greenvale, it is written in Rust, and it is a real-time farming simulation — a reinterpretation of SimFarm (Maxis, 1993) with the systemic depth of RimWorld and Dwarf Fortress. Soil depletes, metal rusts, pests evolve, markets betray you, and people wear out. You do not build a perfect farm. You negotiate with decay.
Estou construindo um jogo. Ele se chama Greenvale, é escrito em Rust, e é um simulador de fazenda em tempo real — uma releitura de SimFarm (Maxis, 1993) com a profundidade sistêmica de RimWorld e Dwarf Fortress. O solo se esgota, o metal enferruja, as pragas evoluem, o mercado te trai e as pessoas se desgastam. Você não constrói uma fazenda perfeita. Você negocia com a decadência.
What I did not expect is how much of it turned out to be my day job wearing a hat.
O que eu não esperava é o quanto disso acabou sendo o meu trabalho de todo dia usando um chapéu.
The rule that shaped everything
A regra que moldou tudo
The first design pillar is legible entropy: everything decays, nothing decays in secret. If the yield drops 18%, the player has to be able to trace it — nitrogen below threshold at flowering, compaction from a tractor that entered a wet field, a pest population that grew because they planted the same crop three years running. Difficulty comes from managing decline, never from hiding information.
O primeiro pilar de design é entropia legível: tudo se degrada, nada se degrada em segredo. Se a colheita cai 18%, o jogador precisa conseguir rastrear o porquê — nitrogênio abaixo do limite na floração, compactação de um trator que entrou em campo molhado, uma população de pragas que cresceu porque ele plantou a mesma cultura três anos seguidos. A dificuldade vem de administrar o declínio, nunca de esconder informação.
That pillar has a hard consequence written next to it in the design doc:
Esse pilar tem uma consequência dura escrita ao lado dele no documento de design:
Every simulation system has a map overlay and a line in the post-harvest
report. If a system can't be visualized, it doesn't ship.
Todo sistema de simulação tem um overlay no mapa e uma linha no
relatório pós-colheita. Se um sistema não pode ser visualizado, ele não entra.
I spend my days making infrastructure explain itself. An outage you cannot attribute is worse than one you can, because the second one ends. So when I sat down to design difficulty, the instinct was already there: a game that hides why the harvest failed is not hard, it is unobservable. The overlays are dashboards. The post-harvest report is a postmortem. The player is on call.
Eu passo meus dias fazendo infraestrutura se explicar. Uma indisponibilidade que você não consegue atribuir é pior do que uma que você consegue, porque a segunda termina. Então quando sentei pra desenhar a dificuldade, o instinto já estava lá: um jogo que esconde por que a colheita falhou não é difícil, ele é inobservável. Os overlays são dashboards. O relatório pós-colheita é um postmortem. O jogador está de plantão.
Deferred maintenance, as a mechanic
Manutenção adiada, como mecânica
The second pillar is delayed consequence: today's decision pays out two or three seasons from now. Tilling releases nitrogen now and burns organic matter for the next decade. Pesticide saves this crop and kills the natural predators that would have saved the next one. Deferring maintenance saves money until the day it doesn't.
O segundo pilar é consequência adiada: a decisão de hoje paga daqui a duas ou três safras. Arar libera nitrogênio agora e queima matéria orgânica pela próxima década. O agrotóxico salva esta safra e mata os predadores naturais que teriam salvado a próxima. Adiar manutenção economiza dinheiro até o dia em que não economiza.
Nobody who has run production infrastructure needs that explained. The rule I wrote for myself is that no significant system may resolve within the same season — if it resolves that fast, it is noise, not a decision. Which is another way of saying that the interesting part of any system is the part with a lag.
Ninguém que já operou infraestrutura em produção precisa que isso seja explicado. A regra que escrevi pra mim mesmo é que nenhum sistema relevante pode se resolver dentro da mesma estação — se resolve tão rápido, é ruído, não é decisão. O que é outro jeito de dizer que a parte interessante de qualquer sistema é a parte que tem atraso.
Determinism is test infrastructure
Determinismo é infraestrutura de teste
The simulation is deterministic given (seed, command log). That is an architecture decision with its own ADR, and it exists to solve three problems that a nondeterministic build cannot:
A simulação é determinística dados (seed, log de comandos). Essa é uma decisão de arquitetura com ADR próprio, e ela existe pra resolver três problemas que um build não determinístico não resolve:
- Balancing. Hundreds of seeds compared across builds. If a change to the pest model also shifts the weather sequence, the comparison is meaningless.
- Regression testing. The only practical way to test a simulation this coupled is same seed, same commands → same state hash.
- Bug reports. "My farm collapsed in year 7 and I don't know why" is untestable. A seed plus a command log is a reproducible test case.
- Balanceamento. Centenas de seeds comparadas entre builds. Se uma mudança no modelo de pragas também desloca a sequência do clima, a comparação não significa nada.
- Teste de regressão. O único jeito prático de testar uma simulação tão acoplada é mesma seed, mesmos comandos → mesmo hash de estado.
- Relatos de bug. "Minha fazenda colapsou no ano 7 e eu não sei por quê" não é testável. Uma seed mais um log de comandos é um caso de teste reproduzível.
Getting there costs discipline. Per-domain RNG streams, so adding a roll to the pest
model does not shift the weather. No HashMap iteration may influence state — enforced
by an invariant test, not by good intentions. The RNG state lives in the save file, so
save → quit → load produces the same future as never quitting. And every mutation goes through a
command, which means the command log is the replay.
Chegar lá custa disciplina. Streams de RNG por domínio, pra que adicionar um sorteio
no modelo de pragas não desloque o clima. Nenhuma iteração de HashMap pode influenciar
o estado — garantido por um teste de invariante, não por boa intenção. O estado do RNG mora no save,
então salvar → sair → carregar produz o mesmo futuro que nunca ter saído. E toda mutação passa por
um comando, o que significa que o log de comandos é o replay.
The explicit non-goal is bit-identical replay across platforms. Floating point across operating systems and compiler versions is not identical without soft-float or fixed-point everywhere, and Greenvale is single-player with no leaderboards and no lockstep networking. The cost buys nothing. Same build, same platform, same result — that is enough for balance runs, CI and reproducing a player's bug.
O não-objetivo explícito é replay bit a bit idêntico entre plataformas. Ponto flutuante entre sistemas operacionais e versões de compilador não é idêntico sem soft-float ou ponto fixo em tudo, e Greenvale é single-player, sem placar e sem rede em lockstep. O custo não compra nada. Mesmo build, mesma plataforma, mesmo resultado — isso basta pra rodadas de balanceamento, CI e reproduzir o bug de um jogador.
The renderer is a detail
O renderizador é um detalhe
The simulation never depends on the renderer. It is its own crate, it depends only on an ECS library, and it runs headless. That boundary is not architectural vanity — it is what makes a balance sweep possible: a hundred seeds, thirty simulated years, one strategy, straight to a CSV, with no GPU and no window anywhere in the process.
A simulação nunca depende do renderizador. Ela é um crate próprio, depende só de uma biblioteca de ECS, e roda headless. Essa fronteira não é vaidade arquitetural — é o que torna possível uma varredura de balanceamento: cem seeds, trinta anos simulados, uma estratégia, direto pra um CSV, sem GPU e sem janela em lugar nenhum do processo.
Where it is now
Onde está agora
The first vertical slice is feature-complete and waiting at its decision gate. The farm runs end to end: order work, wait for the soil to carry a tractor — or force it and pay in compaction — grow, harvest, sell, and read a report that says why the yield was what it was. Tests pass, lints are clean, headless sweeps are deterministic, and a committed replay corpus guards against semantic drift.
A primeira fatia vertical está completa e esperando no seu portão de decisão. A fazenda roda de ponta a ponta: ordenar o trabalho, esperar o solo aguentar um trator — ou forçar e pagar em compactação — crescer, colher, vender, e ler um relatório que diz por que a colheita foi o que foi. Os testes passam, os lints estão limpos, as varreduras headless são determinísticas, e um corpus de replay commitado protege contra desvio semântico.
What remains is not a task. It is a judgement, and it belongs to a human sitting in front of the game: play eight game years on one farm and decide whether the decline is interesting or merely tiring. I do not know the answer yet. That is the honest status.
O que falta não é uma tarefa. É um julgamento, e ele pertence a um humano sentado na frente do jogo: jogar oito anos de jogo em uma fazenda e decidir se o declínio é interessante ou só cansativo. Eu ainda não sei a resposta. Esse é o status honesto.
The repository is private for now. When there is something worth showing, it shows up here first — and probably on Twitch while it is still broken.
O repositório está privado por enquanto. Quando tiver alguma coisa que valha a pena mostrar, aparece aqui primeiro — e provavelmente na Twitch enquanto ainda estiver quebrado.