EXAMENSARBETE. Developing tactical group-based game-ai

Relevanta dokument
Kognitionsvetenskapliga Programmet LiU. AI i spelet Magicka. Gruppbeteende/Grupprörelser. Jonathan Nilsson

729G11 Artificiell Intelligens Marcus Johansson Marjo581. Fuzzy logic. Marcus Johansson Marjo581

Fuzzy Logic. När oskarpa definitioner blir kristallklara. Åsa Svensson. Linköpings Universitet. Linköping

FUZZY LOGIC. Christopher Palm chrpa087

Beräkning med ord. -hur en dator hanterar perception. Linköpings universitet Artificiell intelligens Erik Claesson

Fuzzy Logic Linköpings Universitet

Fuzzy Logic: Den oskarpa skarpheten

729G Artificiell jakt och flockbeteende inom datorspel

Spelutveckling - Gameplay. Design och produktion

JavaScript del 3 If, Operatorer och Confirm

Slutrapport för Pacman

SPELTESTNING FUZZY LOGIC. Kandidatuppsats i Informatik. Patrik Lundqvist Michael Enhörning VT 2010

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Ett spel skapat av Albin Wahlstrand

Tillämpad Programmering (ID1218) :00-13:00

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

LINKÖPINGS UNIVERSITET. Fuzzy Logic. Johan Brage 9/16/2012

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

+Överskådlighet Normalt sätt blir ett program skrivet i det procedurella paradigmet överskådligt. Modifikationer på delproblem kan ske med lätthet.

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Laboration i datateknik

Artificiell Intelligens II, 729g11 Linköpings universitet Fuzzy logic

Artificiell Intelligens inom datorspel Är det ett seriöst ämne?

Case-based resoning. och dess användning inom sjukvården. Linköpings universitet Artificiell intelligens II 729G11 HT 2011

Öka prestanda i Shared-Cache multi-core processorer

Tor Sterner-Johansson Thomas Johansson Daniel Henriksson

Innehållsförtekning Sida. Inledning 3 Vad är fuzzy logic? 3 Mängder 3 Medlemsfunktioner 5 Operationer 6 Fuzzification 8 Litteraturförteckning 9

LEGO Robot programmering och felsökning Hur svårt ska det vara att följa den svarta linjen?

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Slutrapport för SquareShooter

Logik och kontrollstrukturer

i LabVIEW. Några programmeringstekniska grundbegrepp

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

Regression med Genetiska Algoritmer

Programmering = modellering

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Objektorientering/ Klasser

Universe Engine Rapport

Ekvivalensrelationer

Logging Module into the PRIME Core

Lektion 8: Konstruktion av semantiska tablåer för PTL-formler

Fuzzy logic. Julia Birgersson, julbi

Grundläggande programmering med matematikdidaktisk inriktning för lärare som undervisar i gy eller komvux gy nivå, 7,5 hp

Thinking in systems - Donella H. Meadows

Övningsuppgifter kapitel 8

MinMax Algoritmen Implementation och optimering. Joakim Östlund 15 juni 2004

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

MMA132: Laboration 2 Matriser i MATLAB

Artificiell intelligens

Reagera på WoW-event Att använda OnUpdate Introduktion Att kapa funktioner Automatisering och AI

Inledning. Kapitel Bakgrund. 1.2 Syfte

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

Tentamen: Programutveckling ht 2015

Facit Tentamen TDDC (7)

729G11 ARTIFICIELL INTELLIGENS 2, LINKÖPINGS UNIVERSITET. Fuzzy Logic. Caroline Allmér, caral

Space Shooter. Projektrapport i kursen Avancerad C/C++ (DVA303) vid Mälardalens Högskola av Lars Lindqvist och Niklas Nolte

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Att göra spel med Game Maker. Rum. Grundläggande delar. Gamemaker, dagens föreläsning. Programmeringsmodell

Mälardalens högskola

Molly Lundberg 729G43 Kognitionsvetenskap mollu341 Artificiell Intelligens Linköpings Universitet. Fuzzy Logic. Vad är det och hur fungerar det?

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

JavaScript del 5 Funktioner

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Manual för ett litet FEM-program i Matlab

Det ska endast finnas två bilder av samma typ på spelplanen.

Fuzzy Logic. Ellinor Ihs Håkansson, ellih

Fuzzy control systems

Laboration i datateknik

Viktiga begrepp. Algoritm. Array. Binärkod. Blockprogrammering. Bugg / fel och felsökning. Dataspel. Dator

PARALLELLISERING AV ALGORITMER PROCESSORER FÖR FLERKÄRNIGA

Datastrukturer och algoritmer

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Laboration Fuzzy Logic

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

Post Mortem för Get The Treasure!

Föreläsning 12. Söndra och härska

1 LP-problem på standardform och Simplexmetoden

SLUTRAPPORT: TEXAS HOLDEM 4 FRIENDS

TUTORIAL: SAMLING & KONSOLL

Beräkningsvetenskap föreläsning 2

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Mer OOP. Variation i typ. Medlen repetition. Generiska klasser. Gränssnitt - Interface. Mer om klasser Några exempel UML

Artificial Intelligence

IT för personligt arbete F5

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

4 grundregler. Minneshantering. Problemet. Windows minkrav

Tentaupplägg denna gång

Software Technology. Josef Svenningsson

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Magnus Nielsen, IDA, Linköpings universitet

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

729G43 Artificiell intelligens / Maskininlärning 3. Marco Kuhlmann

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Styrsystem. Quantum, M340 o Momentum. Kom-igång med konvertera Concept till Unity Rev

Cacheprobe: programbibliotek för extrahering av cacheminnesparametrar

Transkript:

EXAMENSARBETE 2010:010 HIP Developing tactical group-based game-ai Bo Isaksson Luleå tekniska universitet Högskoleingenjörsprogrammet Datorspelutveckling Institutionen för LTU Skellefteå 2010:010 HIP - ISSN: 1404-5494 - ISRN: LTU-HIP-EX--10/010--SE

I. Förord: Detta examensarbete utfördes under hösten 2009 på Arrowhead Game Studios i Skellefteå. Personligen har Artificiell Intelligens(AI) varit den aspekt av spelutveckling som överlägset intresserat och inspirerat mig mest. Det finns något i ämnet som ligger utöver att bara skapa vacker grafik som grafikprogrammerare, eller skapa ett intuitivt gameplay som gameplayprogrammerare. Det handlar om att skapa förutsättningarna för distinkta personligheter, som beter sig olika utefter förutsättningar, om att skapa något som går utöver ren och skär matematik och data. Det fascinerar mig och står som grund till mitt val av examensarbete. Jag skulle här också vilja tacka alla på Arrowhead Game Studios som tagit emot mig väl och bjudit på en mycket trevlig arbetsplats och många skratt under lunchkonversationerna. II

II. Sammanfattning: Detta arbete har haft som mål att skapa en flexibel strategisk gruppbaserad artificiell intelligens till Arrowhead Game Studios spel Magicka, genom att implementera, använda och undersöka olika AItekniker som ofta används i mer eller mindre mån i ett antal andra kommersiella spel. Tanken har varit den att det färdiga resultatet ska passa ovan nämnda spelprojekt så bra som möjligt och däri har utmaningen legat. Utvecklingen har skett med C# som programmeringsspråk och implementationen av de olika teknikerna har gjorts så flexibel som möjligt för att vidareutveckling och utökning av AI-regler etc. kan ske smidigt och enkelt. Abstract: The goal of this work has been to create a flexible strategic group-based artificial intelligence for the Arrowhead Game Studios-game Magicka, by implementing, using and examining different AItechniques that's used in many commercial games in more or less extent. C# is the programming language that has been used in the development, and the implementation has been made as flexible as possible to make further development and extending AI-rules etc. easier. III

III. Ordlista: AI - Artificial Intelligence, artificiell intelligens är vetenskapsområdet inom vilket man försöker simulera riktig intelligens i maskiner och program. Agent Benämning på enhet som använder sig av artificiell intelligens. A-Star Heuristisk algoritm för att hitta bästa vägen mellan två punkter. Fuzzy Logic Luddig logik skapad för att simulera tänkande i lingvistiska variabler som t.ex. ganska långt eller helt ok. Garbage Term för icke refererad data i minnet. Poppa Att poppa en lista innebär att man avlägsnar och returnerar det element som ligger först i kön. Script Kod skriven utanför den generella källkoden, ofta till för enkla ändringar utan att behöva vara insatt i källkoden. Statemachine Är ett system som beskriver ett beteende med hjälp av ett antal tillstånd(states) samt hur dessa övergår till varandra. IV

Innehållsförteckning: I. Förord II. Sammanfattning III. Ordlista 1. Inledning 1 2. Teori 2 2.1. Fuzzy Logic 2 2.1.1. Lingvistiska variabler & Fuzzyfiering 2.1.2. Fuzzyregler 3 2.1.3. Åtråvärdhets-värden & defuzzyfiering 2.2. Gruppbeteenden 4 2.2.1. Boids 4 2.3. Övriga tekniker 5 3. Metod & Resultat 6 3.1. Fuzzy Module, utförande 6 3.1.1. Fuzzy Module, Design 6 3.1.1.1. Grund 6 3.1.1.2. Påbyggnader 6 3.2. Gruppbeteende, Utförande 8 3.2.1. Additionell styrning 8 3.2.2 Gruppbeteende, Design 9 3.3. Övriga tekniker 11 3.3.1. Meddelandesystem 11 3.3.2. Tillstånd 12 4. Diskussion & Utvärdering 13 2 3 V

1. Inledning: Syftet med detta examensarbete har varit att undersöka olika AI-tekniker för att tillämpa dem i spelet Magicka som utvecklas av Arrowhead Game Studios. Spel-AI är ett ämne under ständigt utveckling och som fascinerar samt intresserar många, inräknat mig själv. Jag ville därför fördjupa mina kunskaper inom AI och utforska olika tekniker och hur de bäst tillämpas i praktiken i ett spelprojekt vilket tillför både möjligheter och begränsningar. De begränsningar som naturligt infaller beror till viss del på hur spelet är designat, hur miljöer är utformade och hur olika agenter är menade att bete sig. Den andra stora begränsningen är givetvis prestandarelaterade; AI:n får inte vara alltför tung att köra och ta upp för mycket av uppdateringstiden. Häri finner man syftet med denna undersökning; vilka tekniker kan man tillämpa och på vilket sätt kan jag använda dem i projektet utefter förutsättningarna? 1

2. Teori: För att bryta isär arbetet i beståndsdelar delade jag upp uppgiften i två olika, större problemområden. Dessa är beslutsfattande och rörelsemönster, alltså två distinkta men avgörande beståndsdelar i min AI-implementation. 2.1 Fuzzy Logic: Innan jag kom in i projektet på Arrowhead var en del av AI-strukturen redan byggd, men en av mina uppgifter blev att implementera ett naturligare beslutssystem för enheterna i spelet. För att simulera ett trovärdigt,oberäkneligt och naturligt beslutsfattande finns det en teknik som lämpar sig bättre än många andra, s.k. Fuzzy Logic. 2.1.1 Lingvistiska variabler & Fuzzyfiering: Fuzzy logic är en teknik för att få beslutsfattande för olika AI-agenter att verka mänskligt, att inte agera på hård data som t.ex. attackera på 10 meters håll, utan attackera när fienden är ganska nära. Begrepp som definieras är: nära, ganska långt och långt bort som sedan används i beslutsfattandet. Dessa termer är mängder och kan vara delar av varandra (se bild nedan). Som ett exempel använder vi begreppen nära och ganska långt för att beskriva hur processen går till. Nära definieras av avståndet 0 meter ifrån agenten till 10 meter ifrån agenten. Ganska långt definieras i sin tur utav avståndet 7 meter ifrån agenten till 15 meter ifrån agenten. Ifall agentens mål ligger på avståndet 9 så kommer det att både ligga inom mängden nära och mängden ganska långt. Genom att veta graden av nära och graden utav långt bort kan man sedan räkna ut ett s.k. fuzzy-värde. Ett fuzzy-värde får man genom att skicka in ett input-värde i den implementerade fuzzymodulens fuzzify-funktion. Där räknas värdets medlemskap ut i de olika mängderna: Genom att man definierat upp mängderna i ett set där de är representerade som t.ex. trianglar(som i bilden nedan) eller kurvor, kan man få ut medlemskapsgraden(degree of Membership eller DOM) genom att dra en vertikal linje från input-värdet och se där den vertikala linjen skär linjen för en av mängderna. Illustration 1: Medlemskapsgrad 2

2.1.2 Fuzzyregler: För att få ut något ur fuzzy-värden används fuzzy-regler. Reglerna definieras av typen: FÖRSATS ger EFTERSATS eller t.ex. FÖRSATS OCH FÖRSATS ger EFTERSATS och med lingvistiska variabler t.ex: nära OCH ganska svag ger väldigt åtråvärt. Den senare kan användas för att räkna ut t.ex. hur åtråvärt det är att attackera en fientlig enhet. Regler måste täcka alla möjliga utgångar[1] för att man skall kunna räkna ut ett fuzzy-värde, ovanstående regel kan ingå i ett regel-set som kan se ut så här: FÖRSATS LOGISK OPERATOR FÖRSATS EFTERSATS nära OCH svag väldigt åtråvärt nära OCH ganska svag väldigt åtråvärt nära OCH stark åtråvärt ganska långt OCH svag väldigt åtråvärt ganska långt OCH ganska svag åtråvärt ganska långt OCH stark ej åtråvärt långt OCH svag åtråvärt långt OCH ganska svag ej åtråvärt långt OCH stark ej åtråvärt Man kan använda andra logiska operatorer såväl som fler försatser i sina regler, men fler försatser kommer att innebära att man måste definiera upp fler regler. regel-set växer exponentiellt. En försats kommer ge 3 regler, två ger 9 och tre ger 27. Man måste tänka på hur komplexa regler man vill ha för att inte antalet regler skall växa explosionsartat. Det finns sätt att skriva om reglerna så de växer linjärt istället [2], men om en implementation endast kräver ett mindre antal försatser är det inte nödvändigt. 2.1.3 Åtråvärdhets-värden & de-fuzzyfiering: Efter att man räknat ut fuzzy-värden för försatserna och applicerat ev. logiska operatorer på dessa får man ett resultat i form av ett fuzzy-åtråhetsvärde för varje regel. I många fall får man flera utslag(värden över 0) av samma lingvistiska variabel, t.ex. termen åtråvärt. I dessa fall får man använda sig av någon metod för att välja ett av dem, t.ex. räkna ut medelvärdet eller tillämpa den logiska operatorn ELLER på värdena. Fuzzy-åtråhetsvärdet kan ses som tilliten för hur åtråvärt någonting är och används för att kapa de lingvistiska termerna i åtråvärdhets-setet. T.ex. om termen åtråvärt Illustration 2: Åtråvärdhetsset 3

har tilliten 0,45 kapas mängden åtråvärt i setet till den nivån. Alla termer i setet kapas till deras tillits-nivå. För att få ut ett s.k. crispvärde, ett värde man sedan kan använda i beräkningar för att beskriva viljan att utföra en uppgift, måste man de-fuzzyfiera sina fuzzy-värden. Det finns ett antal metoder för att räkna ut crispvärdet och den jag tittat närmare på är average of maxima metoden. Formeln för denna är: Crispvärde = (Σ rep.värde * tillit)/ Σ rep.värde där rep.värdet (representativt värde) är högsta värdet i mängden, som t.ex. högsta punkten i en triangel. Andra alternativ till denna metod kan vara den inexakta men snabba mean of maximummetoden, där man tar medelvärdet av utdatan med det högsta tillitsvärdet, eller centroidmetoden som är väldigt exakt, men krävande. Centroid-metoden går ut på att se det kapade åtråvärdhets-setet, som en enhet med massa och räkna ut dess tyngdpunkt. Där tyngdpunkten är ligger är crisp-värdet. Average of maxima är en kompromiss mellan dessa och lägger sig mellan dem i exakthet och tidskostnad[3]. 2.2 Gruppbeteenden: I projektet fanns redan en implementerad A-star pathfinding för AI-agenterna, men eftersom det är väldigt krävande att på flera agenter köra en pathfinding-algoritm hela tiden för att hitta fram, så behövdes en annan lösning. Med gruppbeteenden kan man komma ifrån detta. Genom att låta agenterna styra i grupp efter en ledare som använder traditionell A-star får man inte bara en mer kostnadseffektiv målsökning utan ett beteende där agenter rör sig i grupp och reagerar i förhållande till varandra, istället för att söka sig till målet oberoende av varandra och röra sig på led i ett väldigt förutsägbart mönster. 2.2.1 Boids: För att simulera ett trovärdigt grupp-/flockbeteende finns en metod som kallas boids. Skapat av Craig Reynolds 1986 simulerar det flockbeteendet hos fåglar och fiskar m.m. [4] Metoden bygger på tre grundkoncept: Separation: Viljan varje agent har att röra sig ifrån sina grannar. Illustration 3: Separation 4

Cohesion: Viljan varje agent har att röra sig mot sina grannar. Illustration 4: Cohesion Alignment: Viljan att vilja röra sig i samma riktning som sina grannar. Illustration 5: Alignment Genom att varje agent styr efter dessa regler inom en radie varifrån de påverkas av sina grannar skapas ett beteende som kan vara förbluffande likt flockdjurs rörelser. För att vidare utveckla komplexiteten i beteendet kan man införa flyktbeteenden, jaktbeteenden m.m. 2.3 Övriga tekniker: I addition till ovan nämnda tekniker behövs andra tillägg för att skapa en levande och intressant artificiell intelligens. En AI-statemachine fanns redan sedan tidigare i projektet, men vissa nya tillstånd och additioner till redan implementerade behövdes. Även ett flexibelt message-system för att sända meddelanden från en agent till andra är mycket användbart. Dessa var uppgifter som utöver huvudinriktningarna behövdes för att nå projektets mål. 5

3. Metod & Resultat: Till en början tog jag mig tid att analysera programkoden för att förstå den övergripande designen och se hur implementationen av de valda AI-teknikerna skulle gå till. Jag bestämde mig för att implementera fuzzy-logic först. Det är ett väldigt komplext ämne, och eftersom det kan användas i många olika delar av AI-implementationen kändes det naturligt att börja med det. 3.1 Fuzzy Logic, Utförande: Jag modellerade min modul mycket efter ett exempel ifrån boken Programming Game AI by Example av Mat Buckland. Nämnda exempel beskriver en väldigt flexibel och relativt lättförståelig fuzzymodul som passar till de flesta syften. Eftersom min implementation var i C# och exemplet är skrivet skrivet C++ var det fråga om en översättningsprocess, men det var en faktor som inte tog nämnvärt mycket tid. 3.1.1 Fuzzy Module, Design: För att implementation och testning av modulen skulle gå så fort som möjligt höll jag designen enkel. 3.1.1.1 Grund: Grundliga delar är: Fuzzy-module: klassen som ligger i grunden för modulen som helhet. Används för att lägga till nya sets, regler och innehåller fuzzify- och defuzzifyfunktionerna. Alla enheter eller objekt som kan tänkas ha en fuzzy-beslutsamhet ska kunna ha ett eget fuzzymoduleobjekt. FuzzyLinguisticVariable: klass för representation av en lingvistik variabel. FuzzyRule: klass för representation av en fuzzyregel, består av en samling försatser och en eftersats. FuzzySet: klass för representation av ett fuzzyset, denna skrevs för att hålla tre lingvistiska variabler för att hålla komplexiteten låg. 3.1.1.2 Påbyggnader: De utökande delarna är: Logistiska operatorer: Dessa begränsades till två olika eftersom mer komplicerade regler inte bedömdes nödvändiga. FuzzyAND: klass för representation av en logisk OCH-operator. FuzzyOR: klass för representation av en logisk ELLER-operator. 6

Mängdset: Tre enklare setformer finns representerade i modulen och dessa är: TriangleSet: Triangelformat set definierat av ett högeroffset, ett vänsteroffset och en topp. LeftShoulderSet: Axelformat set åt vänster definierat av offset och en topp. RightshoulderSet: Axelformat set åt höger definierat av offset och en topp. Illustration 6: TriangleSet Illustration 7: LeftShoulderSet Illustration 8: RightShoulderSet Dessa klasser är utbyggnadsklasser som används för att skapa set och regler. Vid behov kan man utöka modulen med fler logiska operatorer och nya set. För att testa modulen byggdes först ett ruleset för agenters val av attack-mål, baserat på avstånd och fiendens hälsa. Två försatser ger nio regler, vilket går snabbt att definiera, samt så är de relativt enkla att testa. Detta ger snabbt en bra indikation på att modulen fungerar som den ska. Efter att testerna gjorts utökades rulesetet även med aggression mot fiender. Reglerna byggde alltså på tre försatser, vilket gav 27 olika regler i rulesetet. Det gav ökat komplext beteende samtidigt som rulesetet inte blev opraktiskt stort och svårimplementerat (se 2.1.2 Fuzzyregler). 7

3.2 Gruppbeteende, Utförande: Implementationen av gruppbeteende, utvecklingen och påbyggnaden av denna var en stor del av arbetet. Den skedde stegvis där de tre första grundläggande boids-reglerna, separation, cohesion och alignment (se 2.2.1 Boids), skrevs och testades en efter en. Den första iterationen av utvecklingsprocessen fokuserade på att applicera de tre grundreglerna för att agenter skulle följa en ledande agent som söker sig mot ett mål med hjälp utav A-star pathfinding. Enbart de tre grundreglerna räcker dock inte långt för att skapa ett beteende som känns mer intelligent än planlös flockrörelse. I senare iterationer gjordes flockbeteendet mer fristående ifrån att bara följa ledaren till att fungera generellt med en egna styrkrafter som kan appliceras i ledarens riktning. 3.2.1 Additionell styrning: Med tiden utvecklades gruppbeteendet vidare för att utöver grundreglerna innefatta ett flertal styrkrafter: Wander: Genom att styra mot en slumpvist vald position inom ett visst avstånd och en viss radie skapas ett planlöst vandrande för agenten som kan användas både som det är, men också kan det adderas till ordinarie beteende för att skapa ett oorganiserat intryck. Illustration 9: Wander LeaderFollow: En vilja att förflytta sig mot ledarens position, nödvändig för annat beteende än planlöst vandrande. Illustration 10: LeaderFollow 8

PostionFollow: En vilja att förflytta sig mot en slumpvis position i en formation bakom ledaren. Antingen i en triangelformad formation eller rektangelformad. Detta beteende gick igenom många iterationer innan den slutgiltiga formen fastställdes. Till en början skapade jag ett beteende där ett antal agenter rörde sig i en strikt formation bakom en ledare. Även om det i vissa fall fungerade väldigt bra gick det bort på grund av dynamiken som krävdes då miljöerna är varierande och väggar och stup försvårar formationshållandet. Eftersom medlen för att kontra dessa problem som t.ex. fysikcheckar kostade mer än vad det gav valdes den enklare lösningen nämn ovan i stycket. Pursuit: Pursuit-kraften är viljan att genskjuta sitt mål. För att göra detta räknas en kraft ut proportionell mot målets hastighet och riktning riktad framför målet. Ifall målet är rakt framför söker sig agenten givetvis direkt till målet. Detta utbyggnadsbeteende är kanske det som gör störst skillnad på gameplay om det är använt och ger ett mycket mer levande intryck. Samma uträkningar används även för att räkna målpositionen för agenter som använder sig av A-star pathfinding och för uträkningar för projektilskjutande agenter. Illustration 11: PostitionFollow Illustration 12: Pursuit 3.2.2 Gruppbeteende, Design: Det direkta tillvägagångssättet att implementera de tre grundkoncepten till en första början är att ge dem varsina funktioner, men detta blir snabbt onödigt krävande i takt med att antalet agenter växer i antal. Eftersom varje agent måste kolla vilka agenter som är inom dess cirkel av inflytande blir funktionen kvadratisk, d.v.s. alla kollar alla. Lösningen på detta blev att skriva ihop alla beräkningar i en loop, vilken i sin tur blir något oöverskådlig men samtidigt mycket mer effektiv. En andra optimering kommer ur frågeställningen; hur många agenters riktningar behövs egentligen för att bilda en fungerande flock? Att begränsa antalet agenter som undersöks inom influens-cirkeln borde inte påverka slutresultatet märkvärdigt. Om en agent A påverkas av t.ex. tio grannar kommer en annan agent B indirekt påverkas av dessa ifall någon av de tidigare nämnda grannarna inte räknas med men ändå är inom influens-cirkeln, förutsett att den räknar med den först nämnda 9

agenten A. Efter snabb implementation fungerade funktionen till synes som förut, men komplexiteten gick ned från en potentiell O(n²) till O(n). Antalet vektoroperationer i gruppbeteendet är många och för att optimera de metoderna användes referenser och vektorklassens egna funktioner, som t.ex. multiply eller divide, i enlighet med artikeln Optimizing performance of XNA on Xbox 360 (vilken beskriver många generella optimeringsmetoder, inte nödvändigtvis och enbart för Xbox 360). Direkt och upprepat nyttjande av vektorer kan bli krävande då de alltid kopieras till stacken när de används, och detta kan leda till att större delen av sagda metods exekverings-tid utgörs av kopiering snarare än till de vektoroperationer som skall göras. Genom användandet av referenser kopieras inte datatyperna till stacken för användning, utan metoderna använder datan direkt. Användning av vektorfunktionerna ger möjligheten att använda referenser till skillnad mot de vanliga operatorerna '*' eller '/' [5]. Som det också står i ovan nämnd artikel blir koden något oöverskådlig, men i detta fallet var det av mindre betydelse då tillfället för optimeringen var i slutfasen på examensarbetet och det främst var en fråga om konvertering av kod som var i ett litet behov av eventuell vidareutveckling. En annan svårighet med ett stort antal vektoroperationer är att olika styrkrafter ofta motverkar varandra, detta skapar ett ryckigt rörelsemönster där agenter kan stå på samma plats och vända sig fram och tillbaka och agera väldigt konstigt. Att man kommer stöta på detta förr eller senare när man arbetar med styrkrafter är nog mer eller mindre oundvikligt om man inte är beredd på problemen som medföljer. Lösningen är dock enkel. Genom att spara undan den resulterande styrvektorn från ett godtyckligt antal (detta får man testa sig fram till) uppdateringar, och räkna ut medelvärdet för dessa, får man ut en vektor som sedan används av agenten istället. Detta ger ett mycket mjukare rörelsemönster och det enda man behöver tänka på är antalet uppdateringar man skall räkna medelvärdet för. För få hjälper lite och för många kan resultera i att agenten inte ändrar riktning tillräckligt ofta. Eftersom gruppbeteendet alltid var tänkt för att underlätta prestandan genom att ett antal agenter följer en ledare infördes även en ökning av separation-viljan när en agent är inom en liten radie runtom ledaren. Detta för att ledaren ska kunna komma fram obehindrat till dennes mål. Det är ett bra exempel på hur man kan utveckla sitt gruppbeteende för ett speciellt spel med enkla medel. Miljöerna i spelet skiftar kraftigt i utformning och agenterna är tvungna att ha ett fysikcheck för att se vart de är på väg så att väggar undviks. Detta sker genom att en check för kollisioner sker på ett lämpligt avstånd framför dem t.ex. 1,5 m. Sker detta byter agenten från att styra genom flockregler till att köra en A-star pathfinding en kort stund. Illustration 13: Miljöerna varierar med bl.a. broar och stup. Magicka Arrowhead Game Studios 10

För att däremot kolla efter stup fungerar inte fysikcheck. Lösningen på det problemet var att beräkna närmsta nod till punkten agenten för tillfället styr, är denna nod lokaliserad ifrån styrpunkten på ett avstånd större än det vanliga avståndet mellan noderna betyder det med stor sannolikhet att styrpunkten ligger i tomma intet och därav ut över ett stup. Lösningen på detta var även här att köra en tillfällig A-star pathfinding för att på så sätt få agenten på rätt kurs. Flockbeteendet är fullt scriptat för att man skall kunna skapa det beteende man vill för vilken fiendetyp man vill. För alla styrkrafter kan man scripta in en multiplier för att förstärka, försvaga, eller helt eliminera kraften. För att skapa det oorganiserade kaotiska beteendet hos små goblins är wander-beteende väldigt framträdande, tillsammans med viljan att följa ledaren får man resultatet att de rör sig i en vild oorganiserad flock med ett inslag av målmedvetenhet. För att ge ett organiserat och strategiskt intryck som hos de mer rustade goblin warriors ger man dem stark vilja att följa formation, ha mycket alignment och cohesion. Med rätt inställningar ger man intrycket att de rör sig i organiserade formationer. Gruppbeteendet kan man om man vill helt slå av, som t.ex. hos större fiender som troll vilka är relativt få samtidigt. Att dessa fåtal troll skulle röra sig i grupp skulle eventuellt se konstigt ut. Det är viktigt att göra en spel-ai så flexibel som möjligt så att man skall kunna påverka den så mycket som möjligt utan att behöva vara mycket insatt i programmering. Illustration 14: Agenterna kommer i olika former och storlekar. Magicka Arrowhead Game Studios 3.3 Övriga tekniker: I addition till det övriga innehållet skrevs ett messagesystem för att skicka olika meddelanden mellan och till agenterna. Ett smidigt sådant system kan vara mycket användbart för många olika situationer såsom när en agent behöver använda sig av tidigare nämnd temporär A-star pathfinding( se 3.2.2 Gruppbeteende, Design). Då en sådan situation sker skickar agenten ett meddelande till sig själv om att sluta använda pathfinding. Detta meddelande försenas ett antal sekunder för att agenten ska hinna utföra sin uppgift innan meddelandet kommer fram och får agenten att byta tillbaka till flockbeteende. 3.3.1 Meddelandesystem: Messagesystemet är enkelt att implementera och är intuitivt att använda. Min implementation är inspirerat av systemet i exemplet WestWorld with messaging [7] ifrån boken Programming Game AI by Example, vilken erbjuder den flexibilitet som jag var ute efter. Något enklare än förlagan innehåller den en klass för representation av ett meddelande, vilket innehåller data som visar avsändare, mottagare, typ av meddelande samt övrig information ifall det behövs, som t.ex. en vektor för representation av en position. Utöver meddelandeklassen finns en klass för skapande och distribution av meddelanden, MessageDispatcher. Denna är byggd som en singelton eftersom det bara behövs en instans som behandlar 11

meddelandena i spelet. MessageDispatcher innehåller en lista där meddelandena sorteras in efter vilken tid de skall skickas. För detta ändamål använde jag mig av en listtypen SortedList. Med denna typ av lista kan man även fastställa storleken när man definierar upp den, vilket stämmer bra överens med förhållningsreglerna beskrivna i artikeln Optimizing performance of XNA on Xbox 360. Genom att veta hur stor en lista maximalt kommer vara skapar man inget garbage genom att listan aldrig behöver göras större [8]. När MessageDispatcher uppdateras kollas sändningstiden på meddelandet högst upp i listan ifall det är tid att skicka iväg det. Listan poppas fram till att sändningstiden på det aktuella meddelandet är senare än den aktuella uppdateringstiden. På så sätt får man ut meddelandena på ett snabbt och effektivt sätt. Varje agent har sedan en funktion för hantering av meddelanden. Beroende på vilket meddelande som ankommer utför agenten olika handlingar. 3.3.2 Tillstånd: I en modern spel-ai är det i det närmaste otänkbart att inte ha en implementerad statemachine. Innan jag kom in i projektet så var det, likt nämnt ovan, redan implementerat en statemachine med vanliga tillstånd som move, idle och attack. En av mina uppgifter på Arrowhead Game Studios var att implementera nya tillstånd och arbeta med gamla sådana. Gruppbeteende-arbetet skedde mycket inom move-tillståndet, medans nya tillstånd var jump-state och kanske framför allt aggressive idle-state. Det sistnämnda är ett bra exempel på hur utomstående testares feedback har en direkt påverkan på AI-utvecklingen. Under testningen av Magicka under DreamHack Skellefteå, anmärkte ett antal testare att det var skönt de gånger agenterna inte funkade precis som de skulle och stannade, eller sprang åt andra håll, istället för att attackera. Detta gav ett andrum i ett annars hektiskt speltempo. Efter detta ombads jag skriva ett aggressive idle-beteende, alltså ett beteende där agenterna inte direkt attackerar utan agerar aggressivt på avstånd. För att skapa detta beteende gavs varje agent ett curage-value som beskriver dess mod. Det är lågt till en början, men ökar linjärt medan de befinner sig i ett aggressive idle-tillstånd, och när modet är högt nog attackerar de. I närhet av agentens mål minskar i sin tur modet i förhållande till avståndet, vilket till slut resulterar i att de flyr för att känna sig säkra så att modet kan öka igen. I beteendet ligger också att agenter flyr ifall fienden kommer för nära, innan modet blivit tillräckligt högt. Modet och radien för aggressive idle-reaktion är scriptat och kan ställas in för att skapa ett speciellt beteende i varje fiendetyp. 12

4. Diskussion & Utvärdering: Detta examensarbete riktade sig till att utveckla en strategisk gruppbaserad AI, och det har erbjudit många spännande utmaningar och gav många nya lärdomar. Det slutgiltiga resultatet var lyckat, det bestod av en vidareutvecklad AI med fungerande fuzzy logic, ett välfungerande scriptbart gruppbeteende och andra nyttiga lösningar på problem. Eftersom jag hade en begränsad tid på mig var det viktigt att göra allt så intuitivt och flexibelt som möjligt för att användande och vidareutveckling ska vara så enkel. Det har jag gjort så gott som möjligt med utformandet av rulesets, scripting osv. Fuzzy logic är ett avancerat ämne, men att titta på en annan implementation hjälpte mycket för förståelsen och min egen implementation fungerade förvånansvärt snabbt och enkelt. Det är ett kraftfullt sätt att skapa en intressant och mer oförutsägbar grund för beslutstagande hos agenter. Att skapa upp regler och allt annat som hör till beslutsfattande kan dock kosta lite tid, men resultatet man får ut tycker jag gör det värt besväret många gånger. En av inriktningarna för arbetet var att skapa en strategisk AI, men strategiska aspekten av AI:n blev dock lidande av ett antal orsaker. Kanske främst spelets utformning med tanke på tempo och miljöer. Tempot gör det svårt att implementera mer avancerade strategier och begränsningarna miljöerna gav gjorde det svårare att implementera ett mer invecklat formationssystem, vilket jag la ned mycket tid på men inte riktigt lyckades skapa som jag planerat i början. Det hade givetvis varit enklare att jobba med sådana saker om man kunnat planera AI:n från början i projektet sida vid sida med andra finesser, men så var ju inte fallet och däri låg en stor del utav utmaningen med examensarbetet. Den strategiska aspekten bestod i slutändan av möjligheten att skapa enklare men mer dynamiska formationer, koordinerade pilskyttar som agerar på skjutmeddelanden från ledare, väntan inför attacker, val av attacksätt och förmåga att förutse målets framtida position. Eftersom det i slutändan är ett spel man utvecklar är inte det faktiska strategiska djupet det viktigaste utan att spelaren skall uppleva det som taktiskt. Gruppbeteendet var i övrigt ett mycket effektivt sätt att göra AI:n mer levande och spännande. Med relativt enkla medel kan man skapa beteenden som skiljer sig markant från andra. Ett utvecklat boids-beteende var ett givet inslag i spelet som har både spelmässiga som prestandamässiga fördelar. 13

Referenser: [1] Buckland M, Programming Game AI by Example, Wordware Publishing Inc, Plano, 2005, pp. 452 [2] Buckland M, Programming Game AI by Example, Wordware Publishing Inc, Plano, 2005, pp. 452 [3] Buckland M, Programming Game AI by Example, Wordware Publishing Inc, Plano, 2005, pp. 433-437 [4] Reynolds C. W., Flocks, Herds, and Schools: A Distributed Behavioral Model, 1987 [5] Leischner N, Liebe O,Denninger O, Optimizing performance of XNA on Xbox 360, 2008, pp. 5-6 [6] Leischner N, Liebe O,Denninger O, Optimizing performance of XNA on Xbox 360, 2008, pp. 6 [7] Buckland M, Programming Game AI by Example, Wordware Publishing Inc, Plano, 2005, pp. 69-83 [8] Leischner N, Liebe O,Denninger O, Optimizing performance of XNA on Xbox 360, 2008, pp. 4 Källor: Illustration 3-5: http://www.red3d.com/cwr/boids/ 14