Satirični tower defense na temu AI-ja: korisnike ne gađate, nego ih uslužujete. Sedam tržišta, 140 razina, više od 600 generiranih grafika, izrađeno u otprilike tri tjedna — kao iskren test dokle razvoj uz AI zaista stiže.
Igra je brutalan testni slučaj. Treba joj kod koji radi, stotine usklađenih grafika, dizajn razina koji ostaje zabavan dvadeset sati i šale koje pogađaju. Promašite u bilo čemu i sve se ruši. Zato smo je napravili i zapisali što se dogodilo.
Jedna osoba, tri tjedna, 580 commitova. Prava igra objavljena na pravom URL-u — ne prototip i ne demo snimka. Kampanja, beskonačno preživljavanje, stablo napretka, baza znanja, spremanje napretka i Android verzija.
Svaka odluka, slijepa ulica i vraćanje na staro zapisani su javno, dok su se događali.
Dalje nego što smo očekivali po količini — kod, grafika i razine dolazili su dovoljno brzo da opseg prestane biti ograničenje. Ne toliko daleko po ukusu. AI je znao reći može li se razina preživjeti, ali ne i je li dosadna.
Pokazalo se da je zanimljiv posao izrada alata koji čovjeku omogućuju brzu prosudbu — i zatim sama prosudba.
Četiri različite vrste rezultata, četiri različita pipelinea — svaki pretvoren u ponovljiv proces, a ne u sretan prompt.
Phaser 3 i TypeScript, oko 17.000 redaka u 54 modula: HUD s dvjema kamerama, matematika izometrijske projekcije, balistika projektila s opadanjem eksplozije po prstenovima polja, generiranje valova, sposobnosti bossova, sustav spremanja, proceduralni zvuk. Provjera tipova mora proći prije svakog pojedinog commita.
Svaka razina dobiva vlastiti lijevak, generiran skriptom i zamrznut u build. Ulazi se izmjenjuju po sva četiri ruba, najmanji broj zavoja raste kako napredujete, a duljina je ograničena onime što to tržište može obraniti. Build se prekida ako ijedna razina padne ispod svog minimuma.
Kule, korisnici, bossovi, ukrasi, polja, ikone sučelja i strip-kadrovi — sve generirano, pa im je pozadinu uklonio segmentacijski model, obrezano na sadržaj, zabilježeno i ugrađeno. Prompt, sjeme, rezolucija i model za svako generiranje stoje u JSON datoteci u repozitoriju, pa se svaka grafika može ponoviti ili vratiti.
SAD, Europa, Kina, Afrika, Zemlja, svemir i odmetnici. Svako tržište nameće leću koja mijenja koliko dobar odgovor vrijedi — u Europi je privatnost kralj, uz obvezni sloj birokracije, a kineski vatrozid cenzurira jeftine odgovore. Iste kule, posve druga zagonetka.
Satirične udarne vijesti između razina, dobacivanja jedva prikrivenih tehnoloških titana kao bossova i kula-chatbot koja pri svakom pogotku izbaci novi samodopadni odgovor. Napisano prema specifikaciji tona, pa je čovjek prosijao one koje su zaista pogodile.
Glazba i efekti sintetiziraju se u kodu umjesto da se uzorkuju — tema izbornika, klikovi sučelja, pogoci, eksplozije. Ništa za licenciranje, ništa za preuzimanje, a podešava se kao bilo koja druga podatkovna datoteka.
Zapakirano za Android, sa zaključanom orijentacijom i uvodnim zaslonom, nakon prolaza za performanse koji je otkrio da vrijeme po sličici troši HUD koji se iscrtava šezdeset puta u sekundi — a ne sama igra.
Podešavanje težine najsporija je petlja u razvoju igara: promijeni broj, odigraj razinu ponovno, pogađaj. Zato je petlja predana automatskom igraču bez sučelja, koji stvarni pogon igre vrti u tijesnoj petlji i javlja koliko je blizu bio porazu.
Nije glupa skripta. Kule postavlja po graničnoj pokrivenosti, koristeći stvarni doseg svake kule, teži poljima prema izlazu gdje se propuštanja doista događaju, čita leću tržišta pri kupnji, štedi valutu, gradi laboratorije i troši na nadogradnje — jer stvarni igrač radi sve to, a bot koji to ne radi past će na razinama koje su zapravo dobre.
Puštanje kroz sve razine otkrilo je probleme koje nikakvo zurenje u tablicu ne bi: zid težine koji je nastao zbog omjera štete i cijene, a ne sirove štete, i bossove koji su prolazili neuslužni jer su kaskali iza vlastite pratnje, pa su kule gađale pratnju.
Kad je naučio dobro igrati, ručno podešavanje težine postalo je šum. Dizajn razina predan je njemu: svaki val raste dok ga bot jedva preživi. Svih 140 razina podesilo je nešto što ih je stvarno odigralo, a ne dizajner koji pogađa.
Neuspjesi su koristan dio ovog eksperimenta. Svaki je od njih u devlogu, jer referenca koja nabraja samo pobjede ne vrijedi čitati.
Bot je dokazao da se svaka razina može pobijediti. Nije mogao prepoznati da su neke dosadne. Ubačene su tri namjerno prejake kule i nije ih ni primijetio — ekonomija ih je progutala. „Može se preživjeti" mjerljivo je, „vrijedi dvadeset minuta Vaše večeri" nije.
Cijela značajka — nadogradnja kula po pojedinom svojstvu — objavljena je i izbrisana istog dana. Radila je besprijekorno i učinila igru gorom.
Ponovno generiranje usklađenog skupa, jednu po jednu grafiku, potiho ga uništava — svaki render odluta u mjerilu, perspektivi i kadru dok se zbirka prestane slagati sama sa sobom. Skup kula tako je mjerljivo pogoršan pa je vraćen iz gita.
Cijeli je svijet izašao kao drugi svijet s crvenim filtrom preko njega. Plošna boja nije likovno vodstvo, a to je rekao samo čovjek koji ga je pogledao.
Lekcija nije „AI sada radi igre". Lekcija je da je generiranje jeftino, a prosudba nije, pa prednost leži u skeli oko generiranja: zabilježenom, ponovljivom pipelineu za grafiku; nepromjenjivim pravilima zapisanima ondje gdje se ne mogu zaboraviti; botu koji mjeri ono do čega Vam je stvarno stalo; i čovjeku čiji je cijeli posao odlučiti što je dobro. Overserved je mjesto gdje smo tu skelu izgradili i izmučili — u vlastito vrijeme, na projektu na kojem loša odluka ne stoji ništa.
Bilješke iz izrade — što je pokušano, što se slomilo, čemu nas je naučilo. Nekoliko primjera:
Pipelineovi iza Overserveda — ponovljivo generiranje, zapisana nepromjenjiva pravila, botovi koji mjere ono što je važno — isti su oni koje donosimo u rad s klijentima. Prvo odigrajte rezultat.