Lisää skriptisysteemistä...
21.11.2002 17:15 julkaistun artikkelin on kirjoittanut Lauri.
Edellisestä päivityksestä onkin jo aika reilusti aikaa... Muutama viikko sitten jo aloitin tämän päivityksen kirjoittamisen, mutta kun en sitten saanut sitä kerralla valmiiksi, niin se sitten jäi vähän roikkumaan. Mutta nyt ajattelin että kirjoitan tämän loppuun ja laitan sivulle näkyviin kaikkien luettavaksi. Vieläköhän joku muistaa, mistä viimeksi puhuin? En ole kyllä varma muistanko enää itsekään. :) Juttu ilmeisesti jäi skriptisysteemiin ja sen erilaisiin toteutusvaihtoehtoihin. Eli niistä nyt sitten tässä, mennään asiaan.
Eli sainhan tuon skriptisysteemin sitten lopulta kuitenkin toimimaan, vaikka välillä tuntuikin niin toivottomalta. Tuota viimekertaista Tech File -päivitystä kirjoitellessa oli mielessäni herännyt joitain sellaisia ajatuksia, joista oli sitten lopulta apua. Sain mielessäni risteilevät ajatukset koottua kasaan ja onnistuin hahmottamaan jonkinlaisen kuvan tarvitsemastani systeemistä. Se on aika jännä juttu, että kun vain tarpeeksi asioita pyörittelee ja maistelee mielessään, niin niistä lopulta saa melkein huomaamatta koottua kokonaisuuksia. Tässäkin asiassa tuntui, että aluksi oli vain kasa irrallisia ajatuksia, jotka eivät tuntuneet mitenkään liittyvän toisiinsa, mutta sitten vain jossakin vaiheessa huomasi, että aivot olivat muodostaneet niistä yhtenäisen kokonaisuuden.
Päätinkin lopulta, että tuollaiseen tekstiseikkailuun riittää hyvinkin yksinkertainen systeemi, joka vain suorittaa komennon kerrallaan, eikä komentojen tarvitse sen kummemmin liittyä toisiinsa, paria pientä poikkeusta lukuun ottamatta (esim. if-lause). Myöskin päätin, etten tarvitse erillisiä muuttujia skripteihin. Näin säästyin suurelta työltä, joka minun olisi täytynyt tehdä muuttujienkäsittelysysteemiä varten. Ainoat muuttujat joita skripteissä voi/tarvitsee käyttää, on varatut muuttujat, joilla pääsee käsiksi pelin toiminnallisiin tietoihin. Ei siis mitenkään erityisen monipuolinen systeemi, mutta kuitenkin tarpeisiini riittävä. Tämän monimutkaisemmasta systeemistä ei loppujen lopuksi olisi kuitenkaan ollut minun tapauksessani suurempaa hyötyä, tai ainakaan vielä en ole keksinyt, mitä muuta tuohon tarvitsisi.
Lähdin sitten suunnittelemaan systeemiä näiden ajatusten pohjalta ja sainkin aika nopeasti peruspalikat kokoon. Mietin aluksi komentojen rakennetta ja päädyin melko yksinkertaiseen rakenteeseen. Päätin, että jokainen komento alkaa funktion nimellä. Funktion nimet ovat varattuja sanoja, joille on jokaiselle koodattu valmiiksi omat toimintonsa. Näiden perään tulee parametrit välilyönneillä erotettuina. Parametreina voi olla joko dataa tai varattu muuttuja. Data voi olla melkein mitä tahansa dataa (tekstiä, lukuja, taulukoita, yms..) ja varattu muuttuja on siis muuttuja joka osoittaa johonkin pelin sisällä olevaan tietoon, jota halutaan muuttaa (esim. 'change tavarat[12].sisalto "Kaunis kynttilä."' ). Näistä lisää vielä hiukan myöhemmin.
Tämä ei kuitenkaan vielä riittänyt. Eri funktiot tarvitsevat erilaisia parametreja, joten tarvitsin tavan, jolla tarkistaa annettujen parametrien oikea järjestys ja oikea määrä. Niinpä tein funktio-luokan, jonne tallensin jokaisesta funktiosta oleellisimmat tiedot, mm. taulukkomuotoon funktion haluamat parametrit oikeassa järjestyksessä. Suuri pulma oli myös keksiä, miten saan tiedon kuljetettua skriptiltä pelille ja toisin päin. Skriptistä pitäisi ensin lukea parametri, tutkia onko se dataa, varattu muuttuja vai kenties jokin muu varattu sana. Tämän jälkeen parametrista pitäisi vielä tulkita, mihin sillä viitataan tai minkälaisesta datasta on kysymys.
Ratkaisin ongelman tallentamalla parametrin tiedon datapaketiksi, joka sisältää itse datan lisäksi datan tyypin. Erilaisia datatyyppejä on mm. merkkijono (string), kokonaisluku (integer) sekä vastaavat osoitintyypit jokaiselle eri datatyypille. Näin parametrit on helppo lähettää funktiolle, kun kaikki parametrit ovat samanlaisessa paketissa, olipa sitten kysymyksessä merkkijono, kokonaisluku tai varattu muuttuja (osoitin). Systeemi on erittäin käytännöllinen siinä mielessä, että samaa funktiota voidaan näin käyttää minkälaisen tahansa datan kanssa. Otetaanpa esimerkiksi vaikka edellä kuvattu change-funktio. Funktio vain tutkii, ovatko annetut parametrit samaa tyyppiä vastaavat osoitin ja data, jonka jälkeen se kopioi datan osoittimen osoittamaan paikkaan, ottamatta minkäänlaista kantaa datan tyyppiin. Edellä sillä on käsitelty merkkijonoa, mutta yhtä hyvin se toimisi vaikka kokonaislukutaulukon kanssa.
Huh... alkaa mennä vissiin aika tekniseksi tämä selostaminen. Toivottavasti kuitenkin pysyit mukana tänne asti. Vaan eipä tästä tällä kertaa enempää. Skriptisysteemi toimii tällä hetkellä hienosti ja seikkailupelikin alkaa jo pikkuhiljaa tuntumaan peliltä, mutta paljon vielä puuttuu. Viime aikoina on ollut sen verran paljon muita kiireitä, ettei seikkailupeli ole edennyt oikeastaan ollenkaan, ja voi olla, että se jää vielä vähän pitemmäksikin aikaa tauolle, mutta kunhan taas jatkan koodailua, niin kirjoittelen sitten tänne jotain lisää ja varmastikin jossain vaiheessa laitan pelin jonnekin imuroitavaksi ja kokeiltavaksikin.
