Tuesday 21 May 2013

Tylsä olen-elossa – päivitys

Tämä teksti on roskaa, mutta koska siinä on tärkeä ajatus MERPGistä, en hukuta tätä pienessä hiprakassa muodostettua tekstinketaletta. Lisäksi tein joskus puoli vuotta sitten tyhmän lupauksen yrittää kirjoitella jotain säännöllisen välillä, ja tällä tahdilla minulla ei ole varaa hylätä yhtään tekstiä :P

Mistä puhutaan? Keskustellaanko binäärioperaattorien käänteisfunktioiden partiaalisesti sovelletuista versioista? Ai ei? Hyvä, sillä en minäkään osaa F#ää/OCamlia. Clojuressa toisaalta näitä voi soveltaa, mutta enpä tiedä onko siitä mitään hyötyä. Clojure on kyllä mielenkiintoinen kieli, jonka ominaisuuksia kaipaa pieni ihminen ohjelmoidessaan C#:llä/Javalla. Let on uskomattoman kiva sana. Sillä saa kivasti järjesteltyä muuttujamäärittelyt lohkon ylälaitaan, ja oikeassa elämässä ihmisen ei edes tarvitse määritellä muuttujia keskellä lohkoa. Tarvitseeko ihmisen edes määritellä muuttujia? Riittäisivätkö vakiot? UI-paradigma lie todella haastava toteuttaa muuttumattomilla datastruktuureilla, mutta toisaalta GUI on roskaa. Graafisin UI, jonka vakavaan työntekoon tarvitsee, on Emacs, joka ei toteuta päällekkäistä ikkunointia, mikä on oikeastaan loistava. Jos ikkunat eivät voi mennä päällekäin, ei voi tulla tilannetta, jossa joku itsekäs ikkuna, joka luulee olevansa tärkeä, peittää jonkin oikeasti tärkeän akkunan.

Toisaalta jonkin pelimaailman toteutus muuttumattomilla voisi olla jännää. Toisaalta, tuhannen pikselin matkan siirtyminen generoi tuhat (decimal * decimal * decimal) - mappia, mikä saattaa performanssifriikkiä ottaa sydämestä, mutta toisaalta sitä varten meillä on GC. Jotain tuonkaltaista olen toteuttamassa MERPGiin, jonka toteutusalustaksi on määritelty Clojure. Clojuren dynaaminen maailma mahdollistaa maailmojen kehittämisen lennossa (voi hitto! Täytyykö minun toteuttaa interaktiivinen karttaeditori? (Toisaalta, miksei?)), yksinkertaisen laajentamisen (toisaalta, mikä vaan mikä omistaa REPLin ja/tai evalin, on helposti laajennettava) kolmansille osapuolille, ja jonkinlaista fiksuutta kehittämiseen. Common Lispin piirtokirjastoista en (olemattomalla) etsinnällä löytänyt mitään kiehtovaa, C/C++/C#/Java - kvartetin muodostama staattisten kielten joukko on... noh, staattinen, mikä on MERPGIN kontekstissa synonyymi roskalle. Staattisuus pysäyttää maailman.

Makrot ovat kivoja. Niillä saa kieltä taivuteltua kohti ongelmaa (sen sijaan että taivuttaa ongelmaa kohti kieltä, niinkuin on tehtävä edellämainitun kvartetin kanssa). Idyllinen tapa toteuttaa MERPGin koneohjatut pelaajat olisi defcharacter-makro, jolle määriteltäisiin reaktiot ja initial statsit kivalla, lispihtävällä kielellä, jota ei kuitenkaan voi suorittaa suorittamatta defcharacterin määritystä. Otetaanpa esimerkki:

(defcharacter Varsieizan
  :type :flying
  :attack 500 ;;He's the the master bird
  :defense 600 ;;And has the heaviest armor in the whole game
  :speed 700 ;;But damn he is fast
  :reactions
  [
   (ground
    (use-moves-type :flying))
   (thunder ;;Does the game have thundery opponents, or am I thinking pokemon?
    (do-defense)
    (if-opponent-does-stupid
     (use-moves-type :flying)))
   (rest
    (attack (move-with-greatest :attack)))])
      

Tuon kaltaisilla makroilla voisi olla kiva ylläpitää globaalia tilaa... tai sitten ei. Koska Clojure, tuon voisi siististi myös muuttaa funktioksi, joka palauttaa characterin. Common Lisp vaatisi [vector syntaksin] muuttamisen makroversiossa (lista syntaksiksi), ja funktioversiossa '(suorittamattomaksi lista syntaksiksi), ainakin tietääkseni. Joka tapauksessa globaalista tilasta voi tulla jännä toteuttaa. Kartan hahmot piilotetaan karttaan, ja aidosti globaalit hahmot (ie. Tässi & co) pidetään jossain ref'ssä (vai atomissa? Clojuren tilanhallinta on niin perverssiä, että sen unohtaa kun ei käytä kieltä viikkoon...).

Mitäs muuta? Animaatoori on yhä harkinnan alla, vaikka Tässi on ilmeisesti harkitsemassa GIF-animaattoria, jolla voisi piirrellä iPadillaan. Minä olen valmis kirjoittamaan MERPG-moottorin grafiikan Quil-kirjastolla, joka saattaa taipua myös MERPG2:n kolmiulotteiseksi speksattuun maailmaan. Mahdollisesti, sillä yritin yksi ilta leikkiä Quilin kolmiulotteisilla omituisuuksilla, jolloin kävi ilmi että Macistä puuttui jokin OpenGL-riippuvuus. Jos Quilin 3D:n säätämisestä tulee haastavaa, hylännen sen kuitenkin herkästi, koska samalla vaivalla säätää Windows-koneelle gcc:n, ja siihen DirectX SDK:n, tai säätää gcc:n (vai clangin?) Maciin ja opiskelee käyttämään OGLää.

Hyötä :P

No comments:

Post a Comment