Townscaper
Oskar Stålberg

Published
september 20, 2020

Townscaper is een procedureel town builder game of ‘toy’ waar de speler dorpjes kan bouwen door simpelweg te klikken. Er is in het spel geen echt doel buiten ontspannen en creatief zijn.

 

Het spel bevat een slim en verregaand systeem om ervoor te zorgen dat wat de speler ook doet, het resultaat er altijd goed uit ziet.

Als je bijvoorbeeld twee huisjes naast elkaar plaatst vormen ze een groter huis waarbij de daken en muren mooi in elkaar overgaan. Of als je twee huisjes op een hoger verdiep met elkaar verbindt wordt er een boog gevormd over de straat tussen de huizen.

 

Het spel is ontwikkeld door Oskar Stålberg. En ontwikkeld in Unity, sinds deze zomer is het spel te proberen in early access op Steam. https://store.steampowered.com/app/1291340/Townscaper/

Grid generatie

Een van de zaken die Townscaper interessant maken is het onregelmatig grid waarop alles gebouwd wordt. In zowat alle ‘city-building’ games wordt er gebruik gemaakt van een regelmatig rechthoekig of hexagonaal grid. Bij Townscaper is de developer net een stapje verder gegaan om een onregelmatig gevoel te kunnen geven aan de gegenereerde dorpjes.

Het grid is quadrilateral, wat wil zeggen dat elke vakje uit vier hoeken bestaat, maar elk vakje kan een unieke vorm hebben. Ook kunnen meer dan 4 vakjes een zelfde vertex of punt delen.

Om het grid te genereren wordt gestart van een regelmatig grid dat uit driehoeken bestaat. Dan worden random aanliggende driehoeken gecombineerd tot vierhoeken. Dit levert een grid op met vierhoeken en driehoeken. Vervolgens wordt elke vierhoek en driehoek opgedeeld in 4 of 3 delen. Tot slot zorgt een ‘relax’ algoritme ervoor dat elk vakje zo goed mogelijk op een vierkant lijkt.

Wave Function Collapse

Het belangrijkste deel van het procedureel systeem achter Townscaper is de wave function collapse (WFC). WFC wordt binnen game development bijvoorbeeld gebruikt om automatisch 2D levels te genereren.

Oskar Stålberg heeft zelf een handige online tool gemaakt om te demonstreren hoe het principe werkt. Hij heeft hier ook een interessante talk over gegeven, deze kan je vinden op de volgende link. https://www.youtube.com/watch?v=0bcZb-SsnrA

Bij WFC worden eerst grid ‘modules’ of patronen bepaald. Dit zijn alle unieke onderdelen die in het resulterende grid kunnen voorkomen. Daarnaast wordt ook vastgelegd welke modules naast welke andere modules geplaatst kunnen worden, met onderscheid tussen links, rechts, boven en onder. Het WFC algoritme kan dan, wanneer er een module vastgelegd wordt in een resulterende grid ‘slot’, gaan vernauwen welke buren deze module nog mogelijks kan hebben. Dit vernauwd automatisch ook welke buren de buren kunnen hebben etc. Wanneer er slechts één mogelijkheid meer overblijft in een grid slot kan het algoritme dit automatisch invullen. 

wfc example tool

http://oskarstalberg.com/game/wave/wave.html

In Townscaper past Oskar dit toe in een 3D grid, waarbij elke module of grid slot een hoek vormt of een achtste van elk blokje in de game (bijvoorbeeld een huisje bestaat uit 8 hoekdelen in het WFC systeem).

Om dus tot het resultaat en de vele mogelijkheden te komen in de game heeft Oskar alle mogelijke hoekdelen moeten maken en moeten bepalen welke naast elkaar kunnen liggen. Uiteraard komt er nog veel meer bij kijken om alle regels en uitzonderingen te implementeren maar dit vormt de basis van hoe het werkt.