Sääntöjärjestelmät peliohjelmoinnissa Risto Saarelma 2008-04-10 Ohjelmistotuotanto ja tietokonepelit -seminaari, kevät 2008 Helsingin Yliopisto, Tietojenkäsittelytieteen laitos Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 1 / 22
Sääntöjärjestelmät peliohjelmoinnissa Sekä pelin ydinosuus että skriptaus toteutetaan yleensä imperatiivisella ohjelmoinnilla. Skriptauksen abstraktiotasoa voisi nostaa käyttämällä imperatiivisen sijasta deklaratiivista ohjelmointia. Deklaratiivisessa ohjelmoinnissa pyritään välttämään muuttuvan tilan eksplisiittistä käsittelemistä. Eräs deklaratiivinen ohjelmointityyli on sääntöpohjainen ohjelmointi. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 2 / 22
Peliohjelman rakenne Peliohjelman rakenne: järjestelmärajapinta pelilogiikka staattinen data Järjestelmärajapinta mahdollistaa grafiikanpiirron, äänentoiston ja syötteen lukemisen. Käytännössä ohjelmointikielenä aina C tai C++. Pelilogiikka määrittää, mistä pelissä varsinaisesti on kysymys. Vaatii Turing-täydellisen ohjelmointikielen, mutta matalan tason järjestelmärajapinnat voidaan abstrahoida pois. Datatiedostoissa ei enää käytetä Turing-täydellistä ohjelmointia. Ne voivat parametrisoida pelin sääntöjä, mutta eivät enää varsinaisesti määrittele niitä. Erilaiset tavat kuvailla pelin sääntöjä vaikuttavat pelilogiikkakerrokseen. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 3 / 22
Miten kuvailla pelilogiikkaa? Olisiko yksinkertaisinta käyttää järjestelmäohjelmointikieltä kaikkeen? Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 4 / 22
Miten kuvailla pelilogiikkaa? void make sick ( xtime, cause, talk, type ) long xtime ; const char cause ; / sickness cause / boolean t a l k ; i n t type ; { long old = Sick ; i f ( xtime > 0L ) { i f ( S i c k r e s i s t a n c e ) return ; i f (! old ) { / newly sick / You feel ( deathly s i c k. ) ; } else { / already sick / i f ( t a l k ) You feel ( %s worse., xtime <= Sick /2 L? much : even ) ; } s e t i t i m e o u t (& Sick, xtime ) ; u. usick type = type ; flags. b o t l = TRUE; NetHack, potion.c, funktio make sick } else i f ( old && ( type & u. u s i c k t y p e ) ) { / was sick, now not / u. u s i c k t y p e &= type ; i f ( u. u s i c k t y p e ) { / only p a r t l y cured / i f ( t a l k ) You feel ( somewhat b e t t e r. ) ; set itimeout (& Sick, Sick 2 ) ; / approximation / } else { i f ( t a l k ) p l i n e ( What a r e l i e f! ) ; Sick = 0L ; / set itimeout (& Sick, 0L ) / } flags. b o t l = TRUE; } i f ( Sick ) { exercise (A CON, FALSE ) ; i f ( cause ) { ( void ) strncpy ( u. usick cause, cause, sizeof ( u. usick cause ) ) ; u. usick cause [ sizeof ( u. usick cause ) 1] = 0; } else u. usick cause [ 0 ] = 0; } else u. usick cause [ 0 ] = 0; } Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 5 / 22
Miten kuvailla pelilogiikkaa? Kuvaustaso on liian matala, eikä säännön oleellista sisältöä voida esittää niin tiiviisti kuin olisi mahdollista. Miten ihmisen luettavaksi tarkoitetut pelisäännöt esitetään? Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 6 / 22
Miten kuvailla pelilogiikkaa? Move Your Move is the distance (in yards) you can actually run in one second. To find your Move, add up the total weight of all your possessions and find your encumbrance level. Now subtract your encumbrance penalty from your Speed score, and round down. The result is your Move score always a whole number, not a fraction. Your Move controls: (1) How fast you can move. (If you have the Running skill, add 1/8 of your skill level to Basic Speed for this purpose only. Don t round off until the very end! Running doesn t affect your Speed score, but it will help your Move.) (2) When you move. (3) Your Dodge defense (p. 26). This active defense is equal to your Move. The less weighted-down you are, the quicker you can dodge! Your Move can never be reduced to 0 unless you are unconscious, unable to use your legs, or lifting over 30 times your ST. GURPS Lite Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 7 / 22
Miten kuvailla pelilogiikkaa? Deklaratiivinen sääntö, kertoo mitä tapahtuu, mutta ei anna yksityiskohtaisia ohjeita siitä, missä kaikissa tilanteissa sääntöä pitää soveltaa. Onnistuuko sama mekaanisesti? On tiedettävä milloin sääntö on voimassa, ja mitä säännöstä seuraa. Halutaan formaali kieli, jolla voidaan ilmaista tällaisia syy-seurauspareja ilman, että täytyy määrittää eksplisiittistä kontrollilogiikkaa. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 8 / 22
Miten kuvailla pelilogiikkaa? ( d e f r u l e (game time > 1100) => ( attack now) ( enable t i m e r 7 1100) ( disable s e l f ) ( chat l o c a l to s e l f f i r s t a t t a c k ) ) ( d e f r u l e ( timer t r i g g e r e d 7) ( defend s o l d i e r count >= 12) => ( attack now) ( disable t i m e r 7) ( enable t i m e r 7 1400) ( chat local to s e l f other attacks ) ) Age of Empires 2 -pelin tekoälyskripti Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 9 / 22
Sääntöjärjestelmät Kehitettiin 1970-luvulla asiantuntijajärjestelmien toteutuskieliksi. Varhaisia sääntöpohjaisia asiantuntijajärjestelmiä esimerkiksi DENDRAL (orgaaninen kemia) ja MYCIN (sairauksien diagnosointi). Koostuu väittämiä sisältävästä työmuistista, sääntöjoukosta, ja sääntöjä työmuistiin soveltavasta tulkista. Sääntöjärjestelmä on eräänlainen ohjelmointikieli. Se ei ole riippuvainen mistään tietystä asiantuntemusalueesta. Käytössä olevia sääntöjärjestelmiä ovat esimeriksi OPS5, CLIPS, Soar ja Jess. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 10 / 22
Sääntöjärjestelmät Asiantuntijajärjestelmät hävisivät julkisuudesta kun huomattiin, että ne eivät kykene ihmisen kaltaiseen ajatteluun. Sääntöjärjestelmiä käytetään kuitenkin edelleen monimutkaista päätöslogiikkaa vaativan rajatun tietämyksen kuvaamiseen. Sääntöjärjestelmä ei ole kovin hyvä tekoäly. Se ei opi eikä ymmärrä analogioita. Sääntöjärjestelmä saattaa kuitenkin kyetä reagoimaan johdonmukaisesti tilanteisiin, joita sen suunnittelija ei ole osannut ennakoida. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 11 / 22
Esimerkki säännöistä Väittämiä: ( has s t e a l t h generator s t e a l t h tank ) Sääntöjä: ( d e f r u l e s t e a l t h enables i n v i s i b i l i t y ( has s t e a l t h generator?x ) => ( a s s e r t ( becomes i n v i s i b l e?x ) ) ) ( d e f r u l e a c t i v a t e s t e a l t h under f i r e ( under f i r e?x ) ( becomes i n v i s i b l e?x ) ( not ( is i n v i s i b l e?x ) ) => ( a s s e r t ( is i n v i s i b l e?x ) ) ) Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 12 / 22
Sääntöjärjestelmät Sääntöjärjestelmä perustuu eteenpäin ketjutukseen. Vastakohtana taaksepäin ketjutus, jota käyttää esimerkiksi Prolog-ohjelmointikieli. Käytetään Rete-algoritmia, jotta väittämien sovittaminen sääntöihin olisi nopeaa. Sääntöjärjestelmät soveltuvat ohjelmiin, joissa on paljon haarautuvia ehtoja ja päätöslogiikkaa, ja vähemmän laskennallisesti vaativia osuuksia. Pelin hahmojen ja esineiden erikoistoiminnot ovat yleensä tällaisia. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 13 / 22
Sääntöjärjestelmät Sääntöjärjestelmä auttaa myös logiikan muokkauksessa ja ylläpidossa. Pelimekaniikka vaatii iteratiivista kehittämistä, ja massiivimoninpelejä ylläpidetään usein aktiivisesti vuosia. Toisaalta sääntöjärjestelmien suorituskyvyssä voi olla merkittäviä ongelmia imperatiivisiin skriptikieliinkin verrattuna. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 14 / 22
Sääntöjärjestelmät tietokonepeleissä Sääntöjärjestelmien käyttö peleissä on pitkälti tutkimusasteella. Tunnetuin sääntöpohjaista skriptausta käyttävä peli on Age of Empires 2. Sääntöjärjestelmä on eräänlainen skriptausjärjestelmä. Sillä on samansuuntaiset edut ja haitat kuin laajemmin käytetyillä peliskriptikielillä. Deklaratiivinen ohjelmointi voisi kuitenkin olla peleissä parempi ratkaisu kuin imperatiivinen ja oliopohjainen. Sääntöjärjestelmä ei ole välttämättä tekoäly, vaan yleinen kuvaustapa pelin tapahtumille ja seuraussuhteille. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 15 / 22
Sääntöjärjestelmät tietokonepeleissä Oliosuunnittelun ongelma: Mihin luokkaan kuuluu useamman olion suhdetta kuvaa tieto? Esimerkiksi tieto siitä, mitä esineitä jokin hahmo kantaa. Vain toisessa luokassa ne johtavat tehottomuuteen, jos tietoa halutaan hakea molempien olioiden suhteen. Esimerkiksi hahmo haluaa tietää, mitä sillä on hallussaan ja esine haluaa tietää, minkä hahmon hallussa se on. Jos sama tieto on molemmissa luokissa, joudutaan taltioimaan redundanttia tietoa. Toistetun tiedon yhdenmukaisena pitäminen monimutkaistaa ohjelmaa. Sääntöjärjestelmässä olioiden suhde voidaan kaapata yhdellä väittämällä, esimerkiksi (kantaa hahmo esine). Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 16 / 22
Sääntöjärjestelmät tietokonepeleissä Mallinnusongelmaan törmätään toteutettaessa pelilogiikkaa C++:lla, ja myös yleensä imperatiivisilla skriptikielillä. Jos on nähty vaiva dynaamisen skriptikielen sitomiseksi pelin ydinkoodiin, miksi rajoittua samaan ohjelmointiparadigmaan, jotka järjestelmäohjelmoinnissa jo käytetään? Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 17 / 22
Sääntöjärjestelmät tietokonepeleissä Sääntöjärjestelmät sopivat yhteen emergentin pelimekaniikan kanssa. Pelisuunnittelija määrittelee säännöt, ja peli soveltaa niitä pelitilanteessa. Kaikki pelit eivät suosi emergenttiä mekaniikkaa. Monet hyvin menestyneet pelit perustuvat hyvin tiiviisti etukäteen suunniteltuun pelikokemukseen. Moni pelityyppi kuitenkin perustuu emergenttiin sisältöön, esimerkiksi rakentelusimulaattorit, strategiapelit ja tietokoneroolipelit. Tällaisissa peleissä sääntöjärjestelmä voisi helpottaa ylläpidettävän sääntöjoukon laatimista ilman C++:n tyylisten järjestelmäohjelmointikielten tuntemusta. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 18 / 22
Sääntöjärjestelmät tietokonepeleissä Sääntöjen semantiikka on yksinkertaisempi kuin imperatiivisen ohjelmakoodin. Niitä on helpompi muokata ja tarkastella koneellisesti kuin imperatiivisia skriptejä. Esimerkkejä: Sisältyykö yhden säännön ehto aina toisen säännön ehtoon? Ovatko säännön ehdot loogisesti ristiriitaisia? Säännöilläkin voi syntyä ongelmallista koodia, erityisesti jos ohjelmoija haluaa tehdä jotain, mihin normaalit säännöt venyvät huonosti. Tarvitaan luultavasti kokemusta ja käytäntöjä. Pelialalla ei tällä hetkellä luultavasti ole paljoa kokemusta sääntöpohjaisesta suunnittelusta, mikä on ongelma. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 19 / 22
Sääntöjärjestelmät tietokonepeleissä Ian Wright ja James Marshall tutkivat sääntöjärjestelmien soveltamista peleihin. Lopputulos: Vuoden 2003 paikkeilla sääntöjärjestelmät näyttivät liian raskailta, eivätkä Wright ja Marshall vakuuttuneet niiden ilmaisuvoimaisesta hyödystä. Yhtenä ongelmana pelimaailman esittäminen symbolisena. Toisaalta Lynne Hall piti sääntöjärjestelmiä hyvänä toteutustekniikkana mobiilipokeripelin tekoälyn toimintasäännöille. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 20 / 22
Sääntöjärjestelmät tietokonepeleissä IGDA:n Artificial Intelligence Interface Standards Committee (AIISC) on käsitellyt sääntöjärjestelmiä. Ehdottaa Sunin JSR-94-standardia yhteiseksi kieleksi pelitekoälyväliohjelmistoille. Komitea ilmeisesti hajosi standardoinnin ollessa vielä kesken. Sääntöjärjestelmien nykytilanne peliteollisuudessa on epäselvä. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 21 / 22
Sääntöjärjestelmien tulevaisuus Sääntöjärjestelmiä ei toistaiseksi tunnuta käyttävän peleissä paljoa, mutta tutkimusta on olemassa jonkin verran. Onko odotettavissa että niiden käyttö kasvaa peleissä tulevaisuudessa? Pelit monimutkaistuvat jatkuvasti, ja vakiintuneille tekniikoille mallintaa pelimaailman logiikkaa on varmasti tarvetta. Kasvava koneteho vähentää myös ongelmia sääntöjärjestelmien suorituskyvyn suhteen. Massiivimoninpelit ovat yksi mahdollinen sovelluskohde: Ne tarvitsevat paljon jatkuvasti laajennettavaa ja ylläpidettävää pelilogiikkasisältöä, ja ne voivat käyttää raskasta palvelinteknologiaa pelilogiikan suorittamiseen. Myös pienen budjetin pelit hyötyvät kehittyneestä ohjelmointitekniikasta. Prosessoriteho on halvempaa kuin ylimääräisen pelisuunnittelijan työpanos, ja jos grafiikka on vaatimattomampaa, voi konetehon käyttää pelilogiikan ajamiseen. Risto Saarelma () Sääntöjärjestelmät peliohjelmoinnissa 2008-04-10 22 / 22