Koodaa se uusiksi

Tuomas Honkala yrittää todistaa vääräksi väitteen, jonka mukaan jokainen pelitoimittaja on epäonnistunut pelintekijä. Tilannepäivitykset Twitterissä: @TuomasHonkala

 

Istuin kesälomani sisällä koodaamassa Ultima-klooniani uusiksi.

Kuten maaliskuun Pelit-lehden kolumnissani kirjoitin, koodaan harrastusmielessä omaa retroroolipeliä, tarkemmin sanottuna Ultima-kloonia. Kirjoitushetkellä, kun projekti oli ollut käynnissä noin pari kuukautta, peli oli jo pelattavassa kunnossa ja sen tunnisti esikuvansa Ultima V:n näköiseksi. Lisäksi suurin osa Ultiman perustoiminnoista oli jo paikoillaan, aina keskusteluita ja kuuden hengen seikkailijaryhmänä taistelemista myöten.

Työskentelytahtini oli ollut harrastusprojektille intensiivinen, kiivaimmassa vaiheessa uhrasin pelille kaiken vapaa-aikani. Kolumnin jälkeen päätin pitää pienen tauon, enkä kirjoittanut kuukauteen riviäkään uutta koodia. Kuukausi on jo niin pitkä aika, että sen jälkeen oma koodi näyttää kuin ventovieraan kirjoittamalta: ”Mitä helvettiä olen oikein ajatellut!”

Hämmennys vaihtui tuota pikaa itsekritiikkiin. Olin toki tyytyväinen, että vale-Ultimani oli pelattavissa jo näin varhain, mutta myös vakuuttunut, että olin hätäpäissäni turvautunut liian moneen oikopolkuun.  Koodin puutteet olivat erityisen ilmeisiä sisällöntuotannon kannalta, sillä melkein jokainen pelitapahtuma oli syötettävä peliin käsiin ja vielä monen mutkan kautta.

Jos teet Ultima-kloonin, tee se kunnolla. Päädyin kirjoittamaan isoja osia pelimoottorista uusiksi. Olen sillä tiellä yhä.

 

Merkilliset kartat

Suurin murhekryynini oli karttarutiini. Karttapohjat luettiin peliin merkkijonoina, jossa yksi merkki vastasi yhtä ruutua kartalla, esimerkiksi ”#” kiviseinää tai ”_” kivettyä lattiaa. Tekstitiedostoiksi tallennetut karttapohjat ovat ihan pelinteon perusjuttuja, mutta ruuturoolipelin kannalta ASCII-merkistö on kovin suppea paletti.

Mitä erikoisempiin merkkeihin turvauduin, sitä vaikeampi minun oli hahmottaa mitä merkkisekamelskan piti oikein esittää. Yhteen merkkiin ei ylipäätään voinut tallentaa mitään ylimääräistä informaatiota, ”#” oli kiviseinä ja sillä sipuli. Jos halusin kiinnittää seiniin luettavia kylttejä, ympäristöä valaisevia soihtuja tai painonappeja, minun olisi määriteltävä lisää erikoismerkkejä. ASCII:n 255 merkin merkkiavaruudessa se tie oli äkkiä kuljettu loppuun.

Heitin karttarutiinin mäkeen, mutta en merkkijonoja. Laajensin karttaruudun määritelmän yhdestä merkistä kolmen merkin pituiseksi. Uudessa määritelmässä ensimmäinen merkki viittaa ruudun yleiseen tyyppiin (”#”, tiiliseinä), toinen merkki on varattu ruudun mahdolliselle erityispiirteelle (”B”, painonappi) ja jos sellaista tarvitaan, kolmanteen merkkiin voidaan tallentaa erityispiirteen järjestysnumero (0-9, a-z, A-Z). Ruutu ”#B2” tulkittaisiin siis kiviseinäksi, jossa on painonappi numero 2. Tällaisen painonapin numero 2 pelillinen merkitys voisi olla esimerkiksi se, että se avaa samassa kartassa sijaitsevan valeseinän numero 2.

Seuraavaksi ryhdyin tekemään kokeiluja proseduraalisen karttageneroinnin suuntaan. En kaivannut peliini kokonaan satunnaisgeneroituja karttoja, vaan tietokoneen apua yksityiskohtien viimeistelyyn. Rantaviivojen muotoilu on hyvä esimerkki karttasuunnittelun osa-alueesta, joka on käsityönä erittäin vaivalloista ja virhealtista, mutta tietokoneelle delegoituna pelkkä rutiinihomma. Rantaviivojen lisäksi uusi karttarutiinini linjaa joet ja polut, ympäröi metsät vähäisemmällä kasvustolla ja sisustaa koteja.

Elettyäni kuukausia siinä uskossa, että dynaaminen valaistus oli ohjelmointitaitojeni ulottumattomissa, olin varsin yllättynyt, kun sain valaistuksen 95-prosenttisesti kuntoon jo yhden iltapäivän työllä.

 

Algoritmi vuosimallia 1968

Dynaaminen valaistus oli kiva lisä, mutta ei välttämättömyys. Sen sijaan ilman toimivaa tallennussysteemiä, esteet kiertävää reitinhakua ja kyläläisten arkirutiineja Ultima-kloonini jäisi kovin kauas oikeasta Ultimasta.

Tallennukset olen toistaiseksi toteuttanut Javaan sisäänrakennetulla serialisaatiolla, joka tallentaa muistissa olevat oliot levylle ja lukee ne takaisin muistiin. Se ei ole kovin elegantti saati kevyt tapa toteuttaa pelitallenteita, mutta ainakin se toimii.

Reitinhakua varten tein oman väännökseni klassisesta A star -algoritmista. A star etsii ”edullisimman” reitin kahden pisteen välille hakkaamalla hakupäätä seinään. Mitä suuremmasta pelialueesta on kysymys, sitä raskaammaksi A starin toiminta muuttuu, joten etäisyyksien kasvaessa rutiinini turvautuu suorituskykyä edistävään vilunkiin.

Koska A star perustuu jokaiselle ruudulle erikseen määriteltävään hintaan, pystyin hyödyntämään sitä myös varsinaisen tekoälyn toteutuksessa. Taistelussa viholliset pyrkivät välttämään palaviin ruutuihin astumista, ellei heillä ole erityisen painavaa syytä oikaista liekkien läpi. Painavia syitä voivat olla esimerkiksi korkeat terveyspisteet tai liekkien takana odottavien pelaajahahmojen jousipyssyt.

A star sopi mallikkaasti myös arkirutiinien toteuttamiseen. Testikyläni maajussi herää kuudelta aamulla, istahtaa aamiaiselle, painuu sitten pellolle, pitää puoliltapäivin ruokatauon, palaa takaisin pellolle, rientää illaksi tavernaan ja sitten pimeän tullen kotiinsa nukkumaan. Ei mitään suurta interaktiivista taidetta, mutta neljällä waypointilla toteutetuksi yllättävän hyvä illuusio vaihtuvista askareista.

 

Suunnitelmat muuttuvat

Alkuperäisvisioni Ultima-kloonista oli varsin suoraviivainen kopio Ultima V:stä uudella juonella. Niin korkealle kuin vitos-Ultimaa arvostankin, päädyin loppujen lopuksi sekoittamaan konseptia omilla ideoillani.

Ultiman vuoropohjaisissa taisteluissa kukin ryhmänjäsen voi joko liikkua tai hyökätä vuorollaan. Se on omalla tavallaan elegantti systeemi, mutta kaipasin jotain taktisempaa. Taistelusäännöt olivat jo alusta lähtien itse sepittämiäni ja muistuttivat Ultimaa vain pintapuolisesti, mutta halusin mennä vielä pidemmälle. Lopulta ymppäsin taisteluihin toimintapisteet, jotka mahdollistavat hahmon ominaisuuksien ja varusteiden rajoissa useamman kuin yhden toiminnon per taisteluvuoro.

Toimintapisteet sopivat Ultima-taisteluihin paljon paremmin kuin osasin odottaa. Mikä yllättävintä, systeemin rukkaaminen paransi selvästi pelitasapainoa, kun raskaat haarniskat ja aseet vähentävät väistämättä käytössä olevia toimintapisteitä. Taikurien elämää vaikeutetaan sillä, että taikomisen hinta on yhtä kuin hahmon toimintapistemaksimi. Tätä seikkaa lukuun ottamatta taikurit voivat käyttää samoja varusteita kuin muutkin.

Ultiman kolmen perusominaisuuden (voima, ketteryys, älykkyys) hahmonkehitykseen en ole vielä puuttunut, mutta todennäköisesti laajennan settiä ainakin hahmojen terveyspisteitä säätelevällä ruumiinrakenteella. Ultiman perinteinen laskentakaava, jossa hahmo kuin hahmo saa automaattiset 30 terveyspistettä lisää per kokemustaso on vähän pöljä.

Riimutaikuuteni seisoo toinen jalka Ultiman puolella ja toinen jossain muualla. Jokainen taika muodostuu 1–4 riimusta, joiden ”reseptit” on löydettävä pelistä tai keksittävä itse. Riimut itsessään ovat keräilyesineitä – ei tulipalloja ennen tuliriimun löytämistä! Ultima V:n taikuuteen liittyneet ainesosat eli reagenssit jäävät omasta pelistäni pois. Reagenssit syvensivät taikasysteemiä, mutta tekivät siitä myös vaivalloisen, kun jokainen loitsu on valmisteltava etukäteen erilaisista pussiruohoista.

 

Ei näin

Retroroolipeliä koodaavana en voi kieltää, ettei Ken Levinen esittämä visio pelaajalähtöisestä narratiivista (katso sivut 64–67) tuntuisi houkuttelevalta. Levinellä on monta hyvää ideaa, joita voisin lainata, mutta toisaalta haluaisin myös saada pelini joskus valmiiksi. Dynaamisesti pelaajan puuhiin reagoivat NPC:t ja ihmissuhdematriisin pohjalta muovautuvat tehtävät ovat ylivoimainen ohjelmointi- ja kirjoitusurakka, jota en ole valmis ottamaan niskoilleni. Näyttäköön Levine itse mallia.

Suuruudenhulluudelle antautuminen onkin pahinta mitä tällaiselle yhden miehen harrastusprojektille voi tapahtua. Muutaman viikon takainen uutisointi YouTube-kanava Yogscastin katastrofaalisesti epäonnistuneesta nimikkopelistä on kauhea luettavaa.

Devaamisen realiteeteista autuaan tietämättömät YouTube-persoonat pestasivat avukseen kokemattoman pikkutiimin ja antoivat hurjan toimeksiannon: tehkää Minecraft mutta parempi! Projekti oli toivotonta sähläämistä alusta loppuun. Winterkewl-tiimiin ei koskaan palkattu edes pääohjelmoijaa. Sen sijaan rahaa haaskattiin E3-esiintymisiin ja epämääräisten alihankkijoiden taskuihin. Kaiken huippu oli Dreamworksin ammattigraafikko, jolle maksettiin 35 000 dollaria kahden viikon työstä.

Yogscast-peliä pakerrettiin puolen miljoonan dollarin Kickstarter-rahoituksella kaksi vuotta. Yhteisörahoitukseen liittyi kaikenlaista epäselvää, kuten maksamatta jääneitä top-tier-lahjoituksia ja kesken projektin pelinkehittäjiltä yogscastilaisille tehty 150 000 dollarin tilisiirto. Projektin kuivuttua kasaan Yogscast ja Winterkewl ovat keskittyneet lähinnä toistensa syyttelyyn.

Vaikka suunnitelmani Ultima-kloonista yhä elää, tiedän jo sen, etten halua siitä ikuisuusprojektia. Maaliskuun kolumnissani esittämä arvio pelin valmistumisajasta saattoi silti olla liian optimistinen. Täten ilmoitan vale-Ultimani lykkääntymisestä ensi keväälle. Koettakaa kestää!

Lisää aiheesta

  • Tuomas: Matka sinne ja takaisin

    Amerikassa kaikki on tunnetusti suurta, niin myös lentokenttädraama.
    Toimitukseemme iski melkein viikon kestänyt sähköpostikatkos juuri ennen kuin olin lähdössä Game Developers Conferenceen San Franciscoon. Kaltaiselleni sähköpostineurootikolle tilanne olisi ollut jo ihan riittävän…
  • Tuomas: P2P

    Tietokonepelaamisen ylivertaisuudesta vakuuttunut pc-herrarotu tunnetaan dogmaattisuudestaan. Asiat ovat joko tai ja konsoleilla yleensä huonommin. Eräs opinkappale koskee verkkopelaamista ja dedikoituja servereitä. Dedikoidulla serverillä tarkoitetaan konetta, joka on omistettu verkkopelin…
  • X:ynä

    X Rebirth on kipeä muistutus pelien ennakkotilaamisen vaaroista.