Elke eerdere poging aan dit spel begon bij een grid en bij dingen neerzetten. En elke eerdere poging kwam nooit toe aan de simulatie. Deze sprint doet het andersom: eerst de tijd, en verder niets. Geen grid, geen kas, geen enkel object om te plaatsen.
Waarom de tijd het eerst moet
Een tuinbouwspel is een spel over duren. Een tomaat doet er weken over, een seizoen kantelt de prijs, een lening loopt in jaren. Zolang die duren in echte seconden staan, is elke balansknop een gok — en verandert de betekenis van elk getal zodra je de spelsnelheid aanraakt.
Dus staat er nu een kalender waarin een maand en een seizoen worden afgeleid en nergens opgeslagen. Je kunt aan één knop draaien — hoeveel dagen een jaar telt — en de rest volgt. Draai je hem naar 48, dan wordt een maand vier dagen en een seizoen twaalf, en dat is in een test vastgelegd.
Onderweg kwam er een eis boven water die nergens stond: dat aantal dagen moet deelbaar zijn door twaalf. Anders vallen maanden en seizoenen niet in hele dagen uiteen. De code weigert nu elke andere waarde, en noemt in de foutmelding de dichtstbijzijnde waarden die wél werken.
Een regel die de compiler afdwingt
De afspraak was dat de simulatie niet van Unity mag afhangen, zodat je hem kunt testen zonder de editor te starten. Zo'n afspraak is een goed voornemen tot iemand hem vergeet.
Die is nu een compilerfout. De simulatie zit in een eigen module met "geen engineverwijzingen" aangevinkt: wie er per ongeluk toch iets uit Unity in gebruikt, krijgt geen waarschuwing maar een bouwfout.
Het effect is meteen merkbaar. Een heel speljaar doorrekenen — 864 uurtikken — gebeurt nu in een test, in een fractie van een seconde, zonder dat de editor opstart. Precies wat er nodig is om balans later te kúnnen meten in plaats van te beweren.
Twee tests die aan de werkelijkheid hangen
De meeste tests controleren code tegen code. Twee doen iets anders.
De eerste hangt aan de gewassentabel uit het ontwerpdocument: wijkt de code daar ooit van af, dan valt hij om. De tweede eist dat de Nederlandse en de Engelse tekstentabel exact dezelfde sleutels dragen, zodat een scherm nooit half vertaald kan raken.
Dat is het soort test dat pas over een half jaar zijn geld opbrengt, op de dag dat iemand denkt "die ene string zet ik er zo even bij".
Het saveformaat met de hand
Saves zijn in zes eerdere pogingen kapotgegaan bij de eerste de beste refactor. Daarom staat het formaat nu met de hand uitgeschreven — leesbare JSON met een versienummer — in plaats van automatisch afgeleid uit de klassen.
Dat is meer typewerk, en dat is precies het punt: een refactor kan het formaat nu niet stilzwijgend veranderen. Een save uit een onbekende versie wordt geweigerd in plaats van half ingelezen.
Drieënveertig tests groen, en elke test is vóór de code geschreven en heeft eerst zien falen.
Volgende sprint: de negenendertig gewassen die in zes pogingen nooit in het spel zijn gekomen.