.THX-Files

.THX-Files

ultima-klooni_kabinettiprojektio1

Vieraana Lord Finnishin linnassa

Toiset kirjoittavat pöytälaatikkoon runoja, toiset UltimaKlooneja. Tuomas raportoi edistymisestään.

En osannut aavistakaan mihin ryhdyin, kun rupesin vuosi sitten ohjelmoimaan henkilökohtaista Iisakin kirkkoani,  UltimaKloonia. Alun perin arvelin, että 1980-luvun klassista Ultima-roolipelisarjaa matkiva tribuuttipelini voisi olla vuodessa valmis. Ja paskanmarjat, vuotta myöhemmin en ole yhtään lähempänä maalia.

On minulla sentään jotain näyttöä edistymisestä: tuhansia rivejä koodia ja peli joka näyttää ja tuntuu Ultima V:ltä. Pelissäni voi keskustella, taistella, kerätä kokemustasoja, räplätä inventaariota, kasvattaa seikkailijaryhmää, heittää loitsuja ja ihmetellä vuorokaudenaikojen ja säätilojen vaihtumista. Siirtymät maailmankartalta kaupunkeihin ja takaisin toimivat. Useimpia toimintoja leimaa hiomaton rosoisuus, mutta perusrakenne kuitenkin toimii.

Vaikka UltimaKloonia voi jo pelata, siinä ei ole vielä mitään kunnollista pelattavaa. On vain testiasukkaiden asuttama testikylä keskellä loputtomasti sikiäviä testihirviöitä kuhisevaa testimaaseutua. Viimeisen vuoden ajan olen järkeillyt, että keskeneräisen pelimoottorin varaan on turha rakentaa tämän enempää pelisisältöä.

Järkeily ontuu, sillä pyhän pelimoottorin alttarille uhrattaville työtunneille ei ole olemassa ylärajaa. Kasibittigrafiikalla höystettyyn tiiligrafiikkaroolipeliinkin voi keksiä loputtomasti paranneltavaa ja uusia featureita. Perfektionismi auttaa suuriin tekoihin, mutta ei perille asti.

UltimaKloonin ensimmäinen vuosi ei siis ole merkannut niinkään paljon edistystä kuin tavoitteiden jatkuvaa siirtymistä kauemmas.

ultima-klooni-kronologia-2014-kesä

Kasarmimme eessä 32 000 merkkiä on

Projektin alkutaipaleella sain tukun vinkkejä Pelit-lehden pitkäaikaiselta lukijalta Paul Pekkariselta.

Valaistuksen teknisestä toteutuksesta karttaeditorin tarpeellisuuteen, samanlaisten ohjelmointiongelmien parissa painiskellut Pekkarinen oli joka kohdassa oikeassa. Pisimpään vastustelin ajatusta karttaeditorista, jota pidin turhana hienosteluna. Kyllähän kartat saa määriteltyä merkki kerrallaan ASCII-koodeillakin!

Vaivalloisissa ja vaikeaselkoisissa ASCII-kartoissa roikkuminen oli suurimman luokan typeryyttä. Kun kutakin 80 x 80 tiilestä koostuvaa karttaa varten oli määriteltävä 32 000 merkin pituinen ASCII-litania, ei ihme, että uskottelin itselleni, että UltimaKloonin karttavalikoimaa ei kannattanut laajentaa.

Joulun tienoilla viimein järkiinnyin ja suuntasin katseeni suosittuun Tiled-karttaeditoriin. Tiled on varta vasten suunniteltu tiilikarttoja varten, joten vähemmän yllättäen se paljastui perfect matchiksi UltimaKloonilleni. Editorina se on kaikin puolin ihastuttava: vaikeaselkoisten ASCII-koodien sijaan saatoin käyttää omaa tiiligrafiikkaani ja loihtia ruudulle karttoja, jotka näyttivät täsmälleen samalta kuin pelissä.

Tiled kirjoittaa karttansa XML-standardia noudattaviksi tekstitiedostoiksi. Verkkosivujen HTML-koodia muistuttavan selkeän rakenteensa ansiosta XML:ää voi pitää universaalisti yhteensopivana. Minun tarvitsi vain koodata UltimaKlooniini Tiled-karttojen rakennetta ymmärtävä XML-tulkki. Siihen meni kaikkinensa suunnilleen viikko, mikä oli näin jälkikäteen ajateltuna mitätön hinta siitä, että pääsin ASCII-riippakivestäni eroon.

Karttaeditorin kanssa työskentely teki minuun niin lähtemättömän vaikutuksen, että päätin siirtää melkein kaiken pelidatani – tehtävät, keskustelut, varusteet, hirviöt – helposti parsittavaan XML-muotoon. Sitä ennen innostuin kuitenkin ihan jostain muusta.

ultima-klooni-kronologia-2014-kevät

Melkein kolmiulotteinen

Yksi Tiledin parhaista ominaisuuksista on layerointi eli kerrostaminen. Sen sijaan, että kaikki karttainformaatio olisi mätetty iloiseksi sekamelskaksi yhteen ja samaan layeriin, Tiledissä voi sijoittaa esimerkiksi lattiat ja seinät alimpaan layeriin, irtaimiston seuraavaan layeriin, hahmot sitä seuraavaan ja ohjauskoodit vielä omaan layeriinsä edellisten yläpuolelle.

Eikä layerointia tarvitse lopettaa tähän. Olin tuossa tuokiossa loihtinut Tiledillä viisikerroksisen Lord Finnishin linnan (yhteensä 20 layeria). Se symboloi pientä askelta karttaeditoinnille, mutta jättiharppausta UltimaKloonilleni ja sen yhden kerroksen väelle.

Siihen asti minulla ei ollut mitään erityisiä intohimoja visuaalisen toteutuksen suhteen. Tiiligrafiikka oli tiiligrafiikkaa, enkä odottanut, että UltimaKlooni näyttäisi sen kummemmalta kuin ikivanhat Ultima-esikuvansa.

Tiledin mahdollistamat korkeat rakennukset avasivat kuitenkin huikeita mahdollisuuksia erilaisiin perspektiivikokeiluihin. Rakennukset koostuivat jo valmiiksi päällekkäin pinotuista kerroksista, joten miksen pinoaisi näitä kerroksia päällekkäin myös pelinäkymässä?

Ja toden totta, jo saman illan aikana sävelletyt muutokset UltimaKloonin grafiikkarutiiniin tuottivat ruudulle kolmiulotteiselta näyttävän peliympäristön. Koska 3D-grafiikkaan liittyvä matematiikka on minulle täysin vierasta, luotin perspektiivilaskelmissani perstuntumaan. Eikä se haitannut, sillä ylhäältäpäin kuvattu tiiligrafiikka ei ole pienestä perspektiivivääristymistä moksiskaan.

Kuten sain huomata, monikerroksiset kartat eivät olleet näkyvyyslaskelmien kannalta mitenkään yksinkertaisia. Niinkin yksinkertaiselta kuulostava asia kuin ikkunasta sisälle katsominen edellytti, että näkyvyysrutiini tunnisti, että pelaaja on a) ulkona, b) riittävän lähellä ikkunaa ja c) oikeassa kerroksessa ikkunaan nähden. Näiden kaikkien kolmen ehdon täyttyessä näkyvyysrutiinin kuului d) paljastaa sisätiloista vain sen verran kuin ikkunan kohdalta kuului nähdä ja e) jättää rakennuksen yläkerrokset (tai katto) kokonaan piirtämättä.

Ylimääräistä päänvaivaa aiheutti se, että korkeiden rakennusten sisäänkäyntejä oli yläperspektiivin takia välillä mahdoton erottaa katutasolta. Ratkaisuna päätin soveltaa sisäänkäynteihin samaa tekniikkaa kuin ikkunasta sisälle katsellessa. Kun pelaaja kävelee riittävän läheltä ohi, oviaukko leikataan julkisivusta esiin kuin pala piirakkaa.

Pähkäillessäni ovien dilemmaa ehdin kokeilla myös vaihtoehtoisia perspektiivejä. Yllätyin kuinka monella eri tavalla monikerroksista tiiligrafiikkaa pystyi esittämään: suoraan ylhäältä, kavaljeeriperspektiivistä, kabinettiperspektiivistä ja isometrisesti. Korkeuseroja ja seinien langettamia varjoja korostava kabinettiperspektiivi näytti erityisen hyvältä. Tulokset olivat houkuttelevia, mutta lopulta päätin hylätä kabinettikokeiluni, koska se olisi sotkenut näkyvyysrutiinini lopullisesti.

ultima-klooni-kronologia-2014-syksy

Ajattelen, siis olen

Karttaeditori ja sen innoittamat korkeuserokokeilut muuttivat radikaalisti käsitystäni siitä, mihin kaikkeen UltimaKloonin karttasuunnittelu voisi venyä. Visuaaliset puzzlet, siirtelypuzzlet, salahuoneiden etsintä ja vihollisten ohi hiipiminen - kaikissa on mahdollista hyödyntää korkeuseroja.

Vaikka implementointi on vielä kesken, olen jo varma, että kiipeily ja kattojen kautta oikaiseminen näyttelee vielä merkittävää roolia pelialueen tutkimisessa. Onko pelaajalla sitten apunaan tikkaita, seinäköynnöksiä tai kiipeilyköysiä - se on vielä päättämättä. Periaatteessa riittävän ketterille hahmoille voisi sallia jopa vapaan mahdollisuuden ylittää yhden kerroksen korkuisia esteitä.

Pöytälaatikkokoodaajana uudet featuret tuntuvat innostavilta, vaikka samalla ne symboloivat projektini pysähtyneisyyttä. Tämän suuruusluokan muutoksista seuraa väistämättä tuhansia rivejä hukkaan heitettyä koodia. Korkeuseroilla onnistuin muun muassa mitätöimään lähes kaiken aikaisemman uurastukseni tekoälyn reitinhaussa. Onhan se ihan eri asia etsiä suorin tie pelaajan luokse, jos suorin tie kulkee kaukaisimman portaikon kautta!

Mutta ehkä näin on parempi, sillä UltimaKloonin tekoäly sietikin kirjoittaa uusiksi. Reitinhaku toimi sentään automaattisesti, mutta kaiken muun npc-käyttäytymisrutiineihin liittyvän jouduin määrittelemään käsin. Parhaillani hahmottelen systeemiä, jossa npc:n tarvitsisi tietää vain kotinsa ja ammattinsa, päivärutiinien määrittyessä pelkästään näiden kahden tiedon pohjalta. Jotenkin näin:

- Jos olen ammatiltani maanviljelijä, minun kuuluu herätä aamukuudelta ja suunnata peltotöihin kotipaikastani katsoen lähimmälle pellolle.

- Jos olen ammatiltani vartija ja näen pelaajan rakennuksen katolla, yritän seurata ja pidättää hänet.

- Kun minulla on nälkä, etsin kotipaikkaani nähden lähimmän laillisen ruokapöydän ja istun syömään. Jos en löydä ruokaa, valitan nälkääni.

- Jos olen ammatiltani tavernanpitäjä ja näen ruokapöydässäni nälkäisen npc-hahmon, kävelen hänen luokseen ja generoin pöytään yhden ruoka-annoksen.

Dynaamiset käyttäytymismalleihin perustuvat vuorokausirutiinit lisäisivät kummasti pelimaailman uskottavuutta - ja edessä olevaa työmäärää. Ainakin pääsen koettelemaan Java-ohjelmointitaitojeni rajoja...

ultima-klooni-näin-toimii-line-of-sight

Realismiruuvi yhteentoista

UltimaKlooni herättää epäilemättä kysymyksiä tavoitteideni realistisuudesta. Richard Garriott ohjelmoi varhaiset Ultimansa suurelta osin yksin. En tietenkään ole Garriottin veroinen ohjelmoija, mutta toisaalta minun ei myöskään tarvitse elää kasibittisten kotitietokoneiden kuristavien muistirajoitusten ja olemattoman suorituskyvyn ehdoilla. Tiiligrafiikkaroolipelin koodin saa sössiä aika huolellisesti, että nykykoneilla enää törmäisi suorituskykyongelmiin.

Suurin haasteeni lienee aika. Vaikka mieli välillä tekisi, en voi omistaa UltimaKloonille kaikkea vapaa-aikaani. Tästä seuraa, että projekti etenee viikon-parin mittaisissa intensiivisissä tuotteliaisuuden puuskissa, joita saattaa seurata jopa kuukauden tauko. Pitkät keskeytykset syövät työtehoa, kun projektia jatkaessa ensimmäiset illat kuluvat koodin koukeroita ihmetellessä.

Pöytälaatikkokoodaajan onni on, ettei projektista ole vastuussa kuin itselleen. Teoreettisessa tilanteessa, jossa olisin mankunut apurahaa Kickstarterista, joutuisin sitoutumaan silkasta velvollisuudesta johonkin julkaisuajankohtaan. Voi Ultima vee sentään, että sellainen olisi kamalaa.

Jos muuten ihmettelette mistä olen saanut liikanimeni Lord Finnish, niin se johtuu itsepintaisesta tavastani tervehtiä aina suomeksi. En huikkaa “Hi!” tai “Hello!” vaan “Morjens!”

 

Tuomas Honkala

 

Työn edistymistä voi seurata Twitterissä @TuomasHonkala ja #UltimaKlooni.