Kun olemassaolevat koneet eivät enää inspiroi, on aika siirtyä mielikuvituskoneisiin.
Artikkeli on alun perin julkaistu Skrollin numerossa 2016.1.
Tämä artikkeli englanniksi: Pico-8 – Fascinating fantasy console
Moni tietokoneharrastaja on ehtinyt uransa aikana tutustua lukemattomiin erilaisiin laite- ja softa-alustohin. Jotkut ovat jopa varta vasten kolunneet niitä läpi esimerkiksi pelailu- tai taiteilumielessä. Tällaisen tutkimusmatkailun myötä kehittyy näkemys siitä, millaiset piirteet tekevät alustasta mukavan tai mielenkiintoisen. Pico-8-fantasiakonsoli edustaa yhtä tällaista näkemystä.
Pico-8 on ehkä luontevinta mieltää emulaattoriksi, jonka emuloimaa laitetta ei ole koskaan ollut. Yleishengeltään se on varsin kasibittinen ja helposti kuviteltavissa vaikkapa Game Boy Color -tyyppiseksi käsikonsoliksi. Näytön resoluutio on 128 × 128 pikseliä 16 värillä ja äänet chip-pilpatusta neljällä kanavalla.
Kyseessä ei kuitenkaan ole mikään vaihtoehtohistoriallinen tutkielma, sillä Pico on suunnittelulähtökohdiltaan hyvin toisenlainen kuin sitä pintapuolisesti muistuttavat laitteet. Se ei yritä saada rajallisesta logiikkamäärästä mahdollisimman paljon irti vaan pikemminkin tarjoaa pienen joukon palikoita, joilla on mahdollisimman mukava leikkiä. Kehittäjän toiveissa on, että ennen pitkää Pico-8:n teknisistä puitteista kasvaisi omanlaisensa estetiikka, joka olisi minimalismistaan huolimatta ilmaisuvoimainen.
Pico-8 on hieman jakomielinen otus. Käynnistyttyään se on tilassa, jossa se muistuttaa pikemminkin kotimikroa näppäimistöineen ja hiirineen kuin pelikonsolia. Komentotulkissa voi ladata ohjelmia ja kirjoitella vaikkapa print-käskyjä. Esciä painamalla pääsee editoriin, jossa on omat osastonsa koodille, grafiikalle ja äänelle. Muut kuin sisäiset varusohjelmat eivät kuitenkaan pääse käsiksi näppäimistöön, hiireen tai kunnolla tiedostojärjestelmäänkään – niiden kannalta Pico on rom-moduuleita käyttävä pelikonsoli, jota ohjataan kahdella kaksinappisella pad-ohjaimella.
Picon äidinkieli on Lua, joka on alkujaan pelien skriptaukseen tarkoitettu pieni mutta suhteellisen ilmaisukykyinen kieli. Pico-virtuaalikone ei siis emuloi mitään varsinaista suoritinta – edes tavukoodia ajavaa sellaista. Kaikki on Lua-lähdekoodia, eikä ohjelmoija sen alemmaksi pääse.
Pelit ja muut ohjelmat voi jakaa maailmalle kahdessa päämuodossa. Cart eli rom-moduuli on käytännössä png-kuva, jotka on esittävinään fyysistä pelimoduulia päällyskuvineen, mutta jonka pikselien alabitteihin on vesileimamaisesti tallennettu ohjelmakoodi sekä grafiikka- ja äänidatat. HTML5-muotoon vietyä ohjelmaa puolestaan voi ajaa nykyaikaisissa www-selaimissa ilman varsinaista Pico-8-ohjelmistoa.
Picon näkyvin tekninen piirre on 128 × 128 pikselin näyttöalue 16 värin kiinteällä paletilla. Paletti on värivalikoimaltaan varsin persoonallinen ja helposti tunnistettava, ja sen suunnittelijalla on selvästi enemmän värisilmää kuin keskivertoinsinöörillä.
Vaikka Pico-pelit tyypillisesti käyttävätkin 8 × 8 pikselin palikoista koostuvia taustakarttoja, joiden päällä liikkuu niin ikään 8 × 8 pikselin spritejä, ei tämä ole mikään rajoite. Grafiikkatila on puhdas pikselipuskuri, johon voi piirtää mitä vain – ja koneelle on myös annettu sen verran nopeutta, että ainakin 90-lukulaiset demoefektit saa useimmiten pyörimään sulavasti. Alusta kuitenkin kannustaa 8 × 8 -palikoiden käyttöön sitä kautta, että karttoja ja spritejä piirtävät funktiot ovat nopeampia kuin saman tekeminen pikseli kerrallaan omalla koodilla.
Koodia mahtuu moduulille 15360 tavun verran pakattuna. Editorissa sen maksimipituus on 65536 merkkiä, ja tokenisoidussa muodossa sen pituus ei saa ylittää 8192 tokenia. Nämä rajat eivät tule kovin helposti vastaan – monet parhaistakin peleistä menevät huomattavasti rajan alle. Toisaalta rajan olemassaolo kannustaa pitämään ohjelman yksinkertaisena ja suoraviivaisena, valtaville pelimoottoreille ja monikerroksisille abstraktioille kun ei ole tilaa.
Grafiikalle on varattu moduulilta 12544 tavua ja äänelle 4608. Toki näitä data-alueita voi käyttää halutessaan muuhunkin – muistinkäsittelykäskyt päästävät siihen vapaasti tavutasolla käsiksi. Moduulin datapuolen sisältö kopioidaan ohjelman käynnistyessä käyttäjä-ramiin, josta ohjelma voi sitä tarvittaessa muokata. Käyttäjä-ramissa on lisäksi vajaat 7 kilotavua käyttäjälle varattua muistitilaa ja 8 kilotavua näyttömuistia.
Grafiikkadata koostuu 8 × 8 pikselin kokoisista spriteistä, joissa koko väripalettia voi käyttää vapaasti. Spritejä voi olla määriteltynä enintään 256, ja kartta puolestaan on kooltaan 128 × 32 spriteä. Kartan koon saa kuitenkin tuplattua, jos tyytyy 128 spriteen.
Äänipuolella ”spriteä” vastaava yksikkö on ääniefekti (sfx), joka koostuu 32 nuottipaikasta. Kussakin nuottipaikassa on tilaa paitsi itse nuotille, myös aaltomuodolle, äänenvoimakkuudelle ja tehosteelle, joita on kutakin 8 erilaista. Toistonopeutta voi vaihtaa, ja hitaammat nopeudet sopivat paremminkin musiikkiin kuin tehosteääniin.
Musiikkikappale koostuu tracker-musiikin tapaan kuvioista (pattern), joissa määritellään, mikä ääniefekti soitetaan kullakin neljästä kanavasta. 64 kuvion tilaan saa tarvittaessa useitakin kappaleita käyttämällä kuviokohtaisia silmukka- ja lopetuslippuja.
Siinä missä grafiikkapuolella kaiken voi halutessaan toteuttaa pikselitasolla itse, äänipuolella käyttäjä ei pääse kiinni ”rekistereihin”. Periaatteessa oman soittorutiinin voisi toteuttaa niin, että soitettavaa äänidataa muutetaan lennossa, mutta virtuaalikoneen ajastuksen rajat tulevat tällöin herkästi vastaan. Ääniefektimuistiin sekalaista dataa kirjoittamalla on kuitenkin helppo saada aikaan erilaisia kokeellisia äänimaailmoja.
Ohjelmakoodin, data-ramin ja moduuli-romin lisäksi Picossa on 256 kilotavua työskentelytilaa Lua-tulkille. Tämä on suhteellisen paljon verrattuna Picon muihin muistiavaruuksiin, mutta sen saa helposti täyteen vaikkapa isoilla lukutaulukoilla. Yksi lukutaulukon alkio vie tilaa kahdeksan tavua, joista puolet on varsinaista dataa. Kukin luku koostuu 16 bitin kokonaislukuosasta ja 16 bitin murto-osasta, joten tiukan paikan tullen voi tilaa tiivistää bittiaritmetiikalla.
Tilan käydessä vähiin on Picossa myös mahdollisuus lukea dataa muilta rom-moduuleilta, ja niille voi jopa kirjoittaa. Ohjelmakoodia ei sen sijaan voi suorittaa muilta moduuleilta, sen raja on tiukka. Koska Luasta sinänsä löytyvä mahdollisuus ajaa dataa koodina on poistettu, on lisäkooditilaa kaipaavan rakennettava koodin ajamiseen oma virtuaalikone.
Pico-8 ei suinkaan aja Lua-koodia niin nopeasti kuin alla oleva suoritin antaa myöten, vaan eri toiminnoille on annettu erilaiset suoritusajat. Nopeusrajoitus johtaa harvoin ongelmiin tyypillisiten Pico-ohjelmien kehityksessä, mutta se vakioi alustan rajat ja estää varustelukilpailun. Ensimmäisen sukupolven Raspberry Pi kuulemma riittää mainiosti kaikkein raskaimpienkin Pico-ohjelmien ajamiseen täydellä nopeudella.
Lua muistuttaa pelkillä isoilla kirjaimilla kirjoitettuna erehdyttävästi basicia. Esimerkkinä vaikkapa seuraava loputtomiin tekstiä toistava ohjelma, jonka basic-versio on monille tuttu:
::ALKU::
PRINT ”TERVEHDYS”
GOTO ALKU
Picossa ei ole tarjolla Lua-standardikirjastoa vaan melko suppea valikoima basic-henkisiä valmisfunktioita: piirtokäskyjä, pari äänikäskyä, ohjainten lukufunktiot ja muutamia funktioita muistinkäsittelyä, matematiikkaa, bittiaritmetiikkaa ja merkkijononkäsittelyä varten.
Peruspiirtokäskyillä voi piirtää pikseleitä, suorakaiteita, viivoja, ympyröitä, tekstiä, spritejä ja taustakarttoja. Paletin värejä voi vaihtaa piirtokäskyjen kannalta toisikseen, ja haluamansa värit saa myös asetettua spritejen ja taustagrafiikan kannalta läpinäkyviksi.
Liikkuvan grafiikan piirtotapa muistuttaa enemmän PC:tä kuin kasibittisiä kotimikroja. Picossa ei ole ”rautaspritejä” tai ”rautaskrollausta”, vaan näytön sisältö rakennetaan yleensä uusiksi joka näytönvirkistystä varten: tyhjennä näyttö, piirrä tausta, piirrä haluamasi spritet sen päälle.
Spritejen piirtoon on kaksi funktiota: spr() piirtää yksittäisen 8 × 8 pikselin spriten annettuihin koordinaatteihin, kun taas sspr() piirtää spritet sisältävältä ”arkilta” (sprite sheet) mielivaltaisen alueen mielivaltaisella skaalauksella. Skaalaustoiminto mahdollistaa helposti jotkin temput, jotka ovat useimmilla klassikkokoneilla varsin tyyriitä, esimerkiksi Doom-tyyppisen tekstuurinpiirron.
Ohjelmoija voi hyvin laittaa piirtokäskyjä vaikkapa ikuiseen silmukkaan, mutta hienostuneempi tapa on määritellä funktio nimeltä _draw(), jota kutsutaan joka näytönvirkistyksellä eli 30 kertaa sekunnissa. Aiempi esimerkki näyttäisi tällä tavoin seuraavalta:
FUNCTION _DRAW()
PRINT ”TERVEHDYS”
END
Peliohjainta luetaan funktiolla btn(), joka ottaa parametrikseen tutkittavan napin numeron ja palauttaa tiedon, onko kyseinen nappi alhaalla. Spriteä numero 0 vasemmalle ja oikealle liikuttava ohjelma voisi näyttää tältä:
X=64
FUNCTION _DRAW()
CLS()
SPR(0,X,112)
IF BTN(0) THEN X=X-1 END
IF BTN(1) THEN X=X+1 END
END
Jotta ruudulla näkyisi mitään, on spriteen numero 0 toki ensin piirrettävä jotain sprite-editorin puolella.
Joskus _draw() sisältää niin paljon tehtävää, ettei sitä ehditä suorittaa joka näytönvirkistyksellä. Tällöin ohjelmoijan kannattaa siirtää pelitilan päivittäminen _update()-funktioon, jota kutsutaan periaatteessa 30 kertaa sekunnissa. Periaatteessa siksi, että se ei ole ajastinkeskeytys, vaan sitä vain kutsutaan useamman kerran peräkkäin, jos _draw() venähtää.
Tuplapuskuroinnista ei tarvitse huolehtia: näyttömuistin muutokset tulevat näkyviin vasta, kun _draw() on suoritettu loppuun. Koko näytön kokoiselle tuplapuskurille ei käyttäjä-ramissa olisi toisaalta tilaakaan ellei jyrää osaa ääniefektialueesta pois tieltä.
Äänipuolella tarjolla ovat funktiot sfx() ja music(), joista ensimmäinen soittaa parametrina saamansa numeron mukaisen ääniefektin ensimmäisellä vapaalla äänikanavalla, ja jälkimmäinen aloittaa musiikin soittamisen annetusta kuvionumerosta.
2D-pikkupelien tekijän ei juuri tarvitse välittää käskyjen nopeuksista, mutta ne tulevat vastaan alustan rajoja koetellessa. Kaikki näytön pikselit ehtii piirtää läpi pikselinpiirtofunktion pset() avulla noin puolitoista kertaa näytönvirkistyksessä, ja suora näyttömuistiin kirjoittaminen poke()-funktiolla on noin kolme kertaa nopeampaa. Muistin täyttäminen memcpy()– ja memset()-funktioilla on sen sijaan peräti kymmenisen kertaa nopeampaa, ja myös taustagrafiikan piirtokäsky map() on nopeudeltaan samaa luokkaa.
Picoon on koottu monenlaisia piirteitä, jotka tuovat mieleen 80-luvun kotitietotekniikan. Perinteistä tai teknisestä realismista ei kuitenkaan pidetä liian hanakasti kiinni, vaan tekemisen mukavuus ja palikkaestetiikka ovat etusijalla. Jos tämä harmittaa, voi palauttaa mieleensä alustan fantasialuonteen: fantasiamaailmoiden lainalaisuuksissakaan ei tarvitse olla kauheasti järkeä, vaan tärkeintä on, että niiden puitteissa voi tapahtua mielenkiintoisia ja mielikuvitusta kutkuttavia asioita.
Picon yleishenkeä voisi ehkä parhaiten luonnehtia sanalla huoleton. Osa huolettomuudesta on tuttua basic-ohjelmoitavista kasibittisistä: ohjelmaa voi ruveta kirjoittamaan heti ”virran kytkemisen” jälkeen, eikä käskyjä naputellessaan tarvitse miettiä käyttöjärjestelmän vaatimuksia, rajapintakehyksiä tai ajoympäristöjen moninaisuutta. Asiat ovat yksinkertaisia ja konkreettisia: tietyt bitit tietyssä muistipaikassa tarkoittavat aina tietynväristä palikkaa tietyssä ruudun kohdassa.
Huolettomuus menee kuitenkin paljon pitemmälle kuin kasibittisillä: ei kellojaksojen ja rasterijuovien laskemista, ei värisolurajoja, ei apuohjelmien ja tiedostojen edestakaisin jonglööraamista. Alustan rajat myös usein estävät aikaavievän nypläämisen ja viilaamisen. Koska säädettävää palettia, sampleja tai konekäskyjä ei ole, ei niitä voi myöskään juuttua nysväämään. Pikseleitäkin on sen verran vähän, ettei perfektionistiltakaan mene varjostusten säätämiseen kovin pitkään.
Halukkaille on tarjolla joitakin teknisiä haasteita ja niihin liittyvää aivojumppaa, mutta on vaikea kuvitella, että Pico-8-skenessä menestyminen vaatisi koskaan kovin syvällistä yksityiskohdille omistautumista. Pico-ohjelmia on helppo ja nopea tehdä, ja alustan perusteet omaksunut tekijä saa helposti vaikka yhdessä illassa aikaan pelin, joka ei vaikuta hutiloidusti tehdyltä.
Tätä kirjoitettaessa Pico on vielä alfaversioissa, mikä näkyy ainakin joissakin kehitysympäristön kömpelyyksissä. Koodieditori ei hyppää automaattisesti virheriville, eikä pikselöinti onnistu näppäimistöllä. Ohjelma ei tarjoa käyttäjälle tarpeeksi aputoimintoja, vaan hänen on lueskeltava erillisiä dokumentteja ja keksittävä itse, että esc-näppäin vie editoriin. Karttaeditorin kanssa saattaa opetteluvaiheessa tuskastua, sillä se ei osoita mitenkään sitä, että nollasprite on aina kartan kannalta tyhjä.
Muutamista ongelmistaan huolimatta Picoa voi kuitenkin jo nyt suositella aloittelevallekin ohjelmoijalle – ainakin sellaiselle, jota kasibittishenkinen palikkaestetiikka viehättää, ja joka jaksaa lukea ohjeita tekstitiedostosta. Luassa ei ole kielenä mitään pahoja sudenkuoppia, ja Picon rajapinnan yksinkertaisuus kannustaa tekemään asiat alusta alkaen itse valmisratkaisujen etsimisen sijaan. Kokeneemmalle tekijälle Pico puolestaan tarjoaa helppoa ja huoletonta askartelua, ja aikaansaannoksiinsa voi olla sen verran tyytyväinen, ettei touhu vaikuta aivan sormivärisottaamiselta.
Pico-8:n kehitys rahoitettiin joukkorahoituksella, joten sillä oli iso joukko innokkaita faneja jo julkaisuvaiheessa. Julkaistuja pelejä ja muita moduuleja on kirjoitushetkellä yli 250 kappaletta jo pelkästään pelin kehittäneen Lexaloffle Gamesin foorumisivustolla. Huomattava osa julkaisuista on tasohyppelyjä ja muita perinteisentyyppisiä 2D-toimintapelejä, mutta myös erikoisempiin kokeiluihin törmäilee välillä. Onpa Picolle jokunen demoskenetuotoskin.
Foorumi on Pico-kehitystyön ja julkaisun keskusyhteisö, ja sen ilmapiiri on ainakin toistaiseksi hyvin innokas, lämmin ja kannustava. Myös aloittelijoita kohtaan ollaan ystävällisiä ja auttavaisia. Picon kehittäjätiimi on usein osallistumassa keskusteluun, joten foorumi on myös paras paikka kysellä Picon teknisistä yksityiskohdista.
Pico-8:lla on myös oma fanzine-julkaisu ”Pico-8 Fanzine” jonka tekemiseen Lexalofflen pääkehittäjä ”zep” on itsekin osallistunut. Nimekkäimpiin tekijöihin kuuluu muun muassa indietasohyppelyseikkailu VVVVVV:n luoja Terry Cavanagh. Fanzinea tehdään faneilta faneille -periaatteella, ja sitä on julkaistu kirjoitushetkellä kolme numeroa. Sisältönä zinessä on muun muassa ohjeita pelien tekemiseen, haastatteluja, arvosteluita ja erilaisia teknisiä artikkeleita Pico-8-ohjelmointiin – fanitaidetta unohtamatta.
Moni on varmasti tämän luettuaan varma siitä, että näin hyvähenkisen ja kehityskulttuuriltaan avoimen lelun täytyy olla ilmainen, mahdollisesti jopa avointa lähdekoodia. Näin ei kuitenkaan ole. Pico-8 on kaupallinen tuote, jonka latausoikeudesta joutuu maksamaan tätä kirjoitettaessa parikymmentä dollaria. Binäärit on saatavilla kolmelle tärkeimmälle x86-käyttöjärjestelmälle eli Windowsille, Macille ja Linuxille. Monet ovat kaivanneet fyysistä Pico-8-konsolia, mutta sellaisen voi toistaiseksi toteuttaa virallisesti vain käyttämällä ajoympäristöä, johon ohjelmabinäärin saa ajettavaksi.
Toki Pico olisi yksinkertaisena alustana helppo takaisinmallintaa, ja sen käyttämä Lua-tulkki on avointa lähdekoodia jo ennestään. Toistaiseksi projektin ympärillä on kuitenkin sen verran vahva sympatian aura, että harvempi hakkeri edes kehtaisi ruveta tuottamaan vapaata versiota Picosta. Pikemminkin voidaan toivoa, että Lexaloffle tajuaisi itse vapauttaa Picon lähdekoodit siinä vaiheessa, kun maksavien asiakkaiden kiinnostus on ruvennut hiipumaan. Näin Pico saisi yhteisön ja kehitystyön hiivuttuakin pidettyä paikkaansa pelinkehityksen marginaalivaihtoehtona ja vaikkapa alustana ohjelmoinnin opetteluun.
Pico-8:n kaltaiset fantasiakonsolit ovat varsin tuore ilmiö. Vaikka idean kantavanhempana voikin pitää 70-luvun harrastemikrojen Chip-8-virtuaalikonetta, ja monissa opetusohjelmissa on yksinkertaistettuja koneita, Pico on syntynyt poikkeuksellisesti luovuus edellä. Tällaisena sillä ei ole oikeastaan muita esikuvia kuin Lexalofflen aikaisempi Voxatron-fantasiakone.
Voi hyvin olla, että Picon vanavedessä rupeaa ilmestymään enemmänkin pieniä ja helposti omaksuttavia fantasia-alustoja. Eikä motiivina tähän tarvitse välttämättä olla kilpailu tai vastakkainasettelu – pelkkä puhdas uteliaisuus vaihtoehtoja kohtaan riittää.
Picon ominaisuudet kannustavat huolettomiin, söpöihin ja nostalgisiin luomuksiin, mutta toisenlaiset ominaisuudet voisivat synnyttää alustan ympärille aivan erilaisen hengen ja estetiikan. Olisi hauska nähdä esimerkiksi Picon ”paha kaksoisveli”, joka painottaisi enemmän mahdollisuusavaruuden synkkiä ja rosoisia nurkkia. Ilmiö on toki tuttu historiallisista alustoista, mutta kokeellisia fantasia-alustoja tehtaileva alakulttuuri tarjoaisi sen tutkimiseen mielenkiintoiset laboratorio-olosuhteet.
Oli tulevaisuus millainen hyvänsä, Pico-8 on joka tapauksessa mielenkiintoinen kehitysympäristö, joka tarjoaa huolettomamman vaihtoehdon historiallisille kotimikroille ja konsoleille. Siinä kasibittisille koneille tyypilliset, luovuutta inspiroivat rajoitteet yhdistyvät mutkattomuutta ja helppoutta painottavaan, moderniin suunnittelufilosofiaan. Jos vähänkin on edellytyksiä koodaamiselle, eikä usko kyllästyvänsä isoihin neliöpikseleihin, Picossa riittää askarreltavaa vuosiksi eteenpäin.
Tämä artikkeli englanniksi: Pico-8 – Fascinating fantasy console
Teksti: Visa-Valtteri Pimiä, Ville-Matias Heikkilä
Kuvat: Laura Pesola, Ville-Matias Heikkilä
Lisätietoja: http://www.pico-8.com/
Linkit yllä esiteltyihin peleihin:
Duangle http://www.lexaloffle.com/bbs/?tid=1984
Duskchild http://www.lexaloffle.com/bbs/?tid=2274
Celeste http://www.lexaloffle.com/bbs/?tid=2145
Ennuigi http://www.lexaloffle.com/bbs/?tid=2232
Hhybris http://www.lexaloffle.com/bbs/?pid=17774
Hyperspace http://www.lexaloffle.com/bbs/?tid=2688
Lemmtris http://www.lexaloffle.com/bbs/?tid=2028
Picoracer2048 http://www.lexaloffle.com/bbs/?tid=2243
Starbeast http://www.lexaloffle.com/bbs/?tid=2950