Commit 1513b257bec44a335685985d8085ca0d20334e0a

  • avatar
  • Oskari Leppaaho <oskari.leppaaho @gm…l.com> (Committer)
  • Wed Aug 20 08:28:26 EEST 2014
  • avatar
  • Oskari Leppaaho <oskari.leppaaho @gm…l.com> (Author)
  • Wed Aug 20 08:28:26 EEST 2014
Siirretty 2013 syksyllä kirjoitettu gradunalku omaan kansioonsa.
Latex/2013 syksy/Kuvat/LostTemple.jpg
(3084 / 0)
Binary files differ
Latex/2013 syksy/Kuvat/LostTempleEdited.png
(5447 / 0)
Binary files differ
Latex/2013 syksy/gradu.bib
(97 / 0)
  
1% This file was created with JabRef 2.9.2.
2% Encoding: Cp1252
3
4@ELECTRONIC{starcraft-compendium,
5 author = {{Blizzard Entertainment}},
6 year = {2013},
7 title = {StarCraft Compendium},
8 url = {http://classic.battle.net/scc/},
9 owner = {Oskari},
10 timestamp = {2013.11.11},
11 urldate = {2013-11-11}
12}
13
14@ARTICLE{buro-ai-research-challenge,
15 author = {Michael Buro},
16 title = {Real-Time Strategy Games: A New AI Research Challenge},
17 journal = {Proceedings of Eighteenth International Joint Conference on Artificial
18 Intelligence},
19 year = {2003},
20 pages = {1534-1535},
21 owner = {Oskari},
22 timestamp = {2013.10.21},
23 url = {https://skatgame.net/mburo/ps/RTS-ijcai03.pdf}
24}
25
26@INPROCEEDINGS{churchill2011build,
27 author = {Churchill, David and Buro, Michael},
28 title = {Build Order Optimization in StarCraft.},
29 booktitle = {AIIDE},
30 year = {2011},
31 owner = {Oskari},
32 timestamp = {2013.11.11}
33}
34
35@ELECTRONIC{starcraft2-automated-player,
36 author = {Matthew Fisher},
37 year = {2012},
38 title = {Starcraft 2 Automated Player},
39 url = {http://graphics.stanford.edu/~mdfisher/GameAIs.html},
40 owner = {Oskari},
41 timestamp = {2013.10.21},
42 urldate = {2013-10-21}
43}
44
45@ARTICLE{huang2011skynet,
46 author = {Huang, H},
47 title = {Skynet meets the Swarm: how the Berkeley Overmind won the 2010 StarCraft
48 AI competition},
49 journal = {Ars Technica},
50 year = {2011},
51 volume = {18}
52}
53
54@ARTICLE{kostler2013multi,
55 author = {K{\"o}stler, Harald and Gmeiner, Bj{\"o}rn},
56 title = {A Multi-objective Genetic Algorithm for Build Order Optimization
57 in StarCraft II},
58 journal = {KI-K{\"u}nstliche Intelligenz},
59 year = {2013},
60 volume = {27},
61 pages = {221--233},
62 number = {3},
63 owner = {Oskari},
64 publisher = {Springer},
65 timestamp = {2013.11.25}
66}
67
68@ARTICLE{ontano-et-al,
69 author = {Santiago Onta\~{n}\'{o}n and Gabriel Synnaeve and Alberto Uriarte
70 and Florian Richoux and David Churchill and Mike Preuss},
71 title = {A Survey of Real-Time Strategy Game AI Research and Competition in
72 StarCraft},
73 journal = {IEEE Transactions on Computational Intelligence and AI in games (2013)},
74 year = {2013},
75 volume = {X},
76 pages = {?-?},
77 number = {Y},
78 url = {http://hal.univ-nantes.fr/docs/00/87/10/01/PDF/survey.pdf},
79 urldate = {2013-10-18}
80}
81
82@BOOK{russell2009artificial,
83 title = {Artificial Intelligence: a Modern Approach},
84 publisher = {Prentice Hall},
85 year = {2010},
86 author = {Russell, Stuart J and Norvig, Peter},
87 edition = {Third Edition}
88}
89
90@INPROCEEDINGS{weber2011building,
91 author = {Weber, Ben G and Mateas, Michael and Jhala, Arnav},
92 title = {Building human-level ai for real-time strategy games},
93 booktitle = {Proceedings of the AAAI Fall Symposium on Advances in Cognitive Systems},
94 year = {2011},
95 pages = {329--336},
96 url = {http://www.aaai.org/ocs/index.php/FSS/FSS11/paper/viewFile/4209/4567}
97}
Latex/2013 syksy/gradu.tex
(454 / 0)
  
1 \documentclass[utf8]{gradu3}
2% Jos työ on kandidaatintutkielma eikä pro gradu, käytä ylläolevan
3% asemesta \documentclass[utf8,bachelor]{gradu3} Jos kirjoitat
4% englanniksi, käytä ylläolevan asemesta
5% \documentclass[utf8,english]{gradu3} tai
6% \documentclass[utf8,bachelor,english]{gradu3}
7
8\usepackage{graphicx} % kuvien mukaan ottamista varten
9
10\usepackage{amsmath} % hyödyllinen jos tekstisi sisältää matikkaa,
11 % ei pakollinen
12
13\usepackage{booktabs} % hyvä kauniiden taulukoiden tekemiseen
14
15% HUOM! Tämän tulee olla viimeinen \usepackage koko dokumentissa!
16\usepackage[bookmarksopen,bookmarksnumbered,linktocpage]{hyperref}
17
18\addbibresource{gradu.bib} % Lähdetietokannan tiedostonimi
19
20\begin{document}
21
22\title{Reaaliaikastrategiapelin tekoälyn toteuttaminen
23 StarCraft-peliin} \translatedtitle{Implementing an Artificial
24 Intelligence for the Real Time Strategy Game StarCraft}
25\studyline{Ohjelmistotekniikka} \avainsanat{%
26 pro gradu -tutkielmat, tekoäly, reaaliaikastrategiapelit, StarCraft}
27\keywords{Master's Theses, artificial intelligence, real time strategy
28 games, StarCraft} \tiivistelma{%
29 Suomenkielinen tiivistelmä tulee tähän. } \abstract{%
30 Abstract in English here }
31
32\author{Oskari Leppäaho}
33\contactinformation{\texttt{oskari.h.leppaaho@jyu.fi}}
34% jos useita tekijöitä, anna useampi \author-komento
35\supervisor{Tuukka Puranen}
36% jos useita ohjaajia, anna useampi \supervisor-komento
37
38% \type{tutkielmapohjan esimerkki ja
39% käsikirja} % et tarvitse tätä riviä tutkielmassa!
40
41\maketitle
42
43% \preface
44% Tähän voit kirjoittaa tutkielmasi esipuheen. Tutkielmissa on
45% harvemmin esipuheita, mutta jos sen kirjoitat, pidä se lyhyenä
46% (enintään sivu).
47
48% Esipuheen tulisi kertoa ennemminkin tutkielmaprosessista kuin
49% tutkielman sisällöstä. Esimerkiksi jos tutkielman aiheen valintaan
50% tai tekemiseen liittyy jokin erikoinen sattumus, voit siitä kertoa
51% esipuheessa. Tapana esipuheessa on myös kiittää nimeltä mainiten
52% tärkeimpiä tutkielman tekemisessä auttaneita ihmisiä -- ainakin
53% ohjaajia, puolisoa ja lapsia. (Yleensä perhe on auttanut vähintään
54% tukemalla ja kannustamalla.)
55
56% Esipuhe kannattaa kirjoittaa minä-muodossa. Tavanomaista on myös
57% allekirjoittaa se.
58
59% Jyväskylässä \today
60
61% \bigskip
62
63% Tutkielman tekijä
64
65% \begin{thetermlist}
66% \item[\TeX] Donald Knuthin 1977--1989 laatima eräajotyyppinen
67% ladontajärjestelmä \parencite[ks.][]{knuth86:_texbook}.
68% \item[\LaTeX] \TeX in \parencite[ks.][]{knuth86:_texbook} päälle
69% rakennettu rakenteisten kirjoitelmien ladontaan tarkoitettu
70% järjestelmä \parencite[ks.][]{lamport94:_latex}. Siitä on nykyään
71% käytössä versio \LaTeXe.
72% \end{thetermlist}
73
74\mainmatter
75
76\chapter{Johdanto}
77
78Tämä pro gradu -tutkielma käsittelee tekoälyn ohjelmointia
79reaaliaikastrategiapeleissä (RTS-peleissä) ja erityisesti StarCraft:
80Brood War -pelissä. Aiheen valinta juontaa henkilökohtaisesta
81mielenkiinnostani reaaliaikastrategiapeleihin. Olen pelannut Warcraft
82III, StarCraft II ja StarCraft -pelejä vaihtelevalla aktiivisuudella
83noin kymmenen vuoden ajan.
84
85RTS-pelin tekoälyn toteuttaminen on monimutkainen ongelma ja
86esimerkiksi parhaita ihmispelaajia vahvempaa tekoälyä ei vielä olla
87onnistuttu toteuttamaan. Tekoälylle tuottavat suuria haasteita
88monimutkaiset, dynaamiset ympäristöt ja toiminta osittaisen tiedon
89varassa. Myös reaalimaailmassa on ongelmia, joissa on samankaltaiset
90olosuhteet: esimerkiksi liikenne, talous tai
91sääennusteet \parencite{ontano-et-al}. RTS-pelit voidaan nähdä
92yksinkertaistettuna versiona näistä ongelmista ja siksi RTS-pelin
93tekoälyn kehittäminen edistää tekoälytutkimusta myös yleisellä tasolla
94sen lisäksi, että sillä on suoria kaupallisia hyötyjä peliteollisuuden
95käytössä. Tulevaisuudessa myös sotilaskäytössä saatetaan käyttää
96tietokoneita päätöksenteon tukena esimerkiksi ennakoimalla
97yhteenottojen lopputuloksia
98tietokonesimulaatioilla \parencite{buro-ai-research-challenge}.
99%Lainaus dokumentista A Survey of Real-Time Strategy Game AI...
100
101Tutkimuksessa tullaan toteuttamaan botti, eli ohjelma, joka pelaa
102StarCraft: Brood War -peliä, tai vaihtoehtoisesti moduuli, joka
103hallitsee jotain pelin osa-aluetta. Jos päädytään yhteen
104osa-alueeseen, voi se olla esimerkiksi strategia, taktiikka,
105yksittäisten yksiköiden kontrollointi, resurssien hallinta, tiedustelu
106tai rakentaminen. Toteutuksen evaluointiin on kaksi vaihtoehtoa:
107Bottia voidaan testata laittamalla se pelaamaan ihmispelaajia vastaan
108ICCup-palvelimella, jossa pelaajien taitotasoa arvioidaan Elo-luvulla,
109kuten \textcite{weber2011building} tekivät. Toinen vaihtoehto on
110laittaa ohjelma pelaamaan toisia botteja vastaan. Tämä voidaan
111toteuttaa esimerkiksi käyttämällä Star\-Craft AI Competition
112-ta\-pah\-tu\-man botteja, jotka ovat avointa lähdekoodia, tai
113osallistumalla jatkuvasti käynnissä oleviin Student StarCraft AI
114Tournament tai StarCraft BroodWar Bots Ladder -bottisarjoihin.
115
116Mikäli päädytään toteuttamaan ainaostaan yksi osa-alue, voidaan
117toteutuksen evaluointi toteuttaa niin, että otetaan lähtökohdaksi
118jokin StarCraft AI Competition -tapahtuman avoimen lähdekoodin
119boteista ja korvataan botin kyseistä osa-aluetta hallinnoiva moduuli
120itse tehdyllä moduulilla. Näin saadun uuden botin tasoa voidaan sitten
121verrata alkuperäiseen bottiin.
122
123\textcite{ontano-et-al} nostavat vielä hyödyntämättöminä tekniikkoina
124esille erityisesti oppimisen ja sopeutumisen sekä suunnittelun
125reaaliaikaisesti, osittaisen tiedon varassa suunnittelun, resurssien
126käytön suunnittelun, hierarkkinen suunnittelun ja
127sovellusaluetietämyksen hyödyntämisen. Jotain näistä tekniikoista
128saattaisi olisi hyvä kehittää tutkimustiedon kartuttamiseksi.
129
130\chapter{Tutkimusasetelma}
131
132\section{Taustaa RTS-peleistä}
133
134\subsection{StarCraft}
135
136StarCraft on Blizzard Entertainmentin vuonna 1998 julkaisema
137reaaliaikastrategiapeli PC:lle ja myöhemmin Mac OS:lle, ja StarCraft:
138Brood War on samana vuonna kyseiseen peliin julkaistu laajennus. Tästä
139eteenpäin käytetään termiä StarCraft tarkoittamaan StarCraft: Brood
140Warilla laajennettua StarCraft-peiä. Science Fiction -teemaisessa
141pelissä kerätään resursseja, joita käytetään rakennusten ja yksiköiden
142tuottamiseen. (Yksikkö RTS-pelissä tarkoittaa yksittäistä sotilasta,
143jolla on sellaisia ominaisuuksia kuin terveyspisteet, hyökkäyksen
144voimakkuus ja liikkumisnopeus. Rakennukset taas tuottavat yksiköitä
145tai päivityksiä niiden ominaisuuksiin. \parencite{kostler2013multi})
146Pelin voittaja on pelaaja, joka ensin onnistuu tuhoamaan omilla
147yksiköillään kaikki vastustajan rakennukset. Rakennukset menetettänyt
148pelaaja häviää, vaikka hänellä olisi vielä yksiköitä jäljellä. Pelaaja
149voi myös luovuttaa, jolloin vastustaja voittaa pelin. Peliä voi pelata
150yksi yhtä vastaan, joukkueissa tai useampi pelaaja kaikki kaikkia
151vastaan, jolloin voittaja on viimeinen jäljelle jäänyt pelaaja
152kaikkien muiden pelaajien hävittyä.
153
154Jokainen pelaaja valitsee ennen pelin alkua käyttöönsä yhden kolmesta
155eri rodusta, jotka ovat Terran, Zerg ja Protoss. Jokaisella rodulla on
156erilaiset yksiköt ja rakennukset. Protossien rotu on tieteellisesti ja
157psyykkisesti kehittynyt muukalaisrotu, jonka yksiköt ovat kalliita,
158mutta voimakkaita. Zergit ovat eläimellisiä, primitiivisiä olentoja,
159jotka eivät käytä teknologiaa, vaan niitä on monta alalajia, jotka
160ovat kehittyneet hyvin erilaisiksi. Jopa Zergien rakennukset ovat
161eläviä olentoja. Zergien yksiköt ovat halpoja, mutta eivät kovin
162voimakkaita. Terranit ovat ihmisten siirtokunta ulkoavaruudessa ja
163niiden yksiköt ovat hinnaltaan ja tehokkuudeltaan Zergien ja
164Protossien välimaastossa.
165
166\begin{figure}[h]
167\centering
168\includegraphics[width=0.8\textwidth]{Kuvat/LostTempleEdited}
169\caption{Resurssien ja aloituspaikkojen sijainnit Lost Temple
170 -kartassa}
171\label{fig:resurssit-lt}
172\end{figure}
173
174StarCraftia pelatessa pelaajan on huolehdittava samaan aikaan useista
175eri tehtävistä. Ensimmäinen tehtävä on hankkia
176resursseja. StarCraftissa on käytettävissä kahta eri resurssia:
177mineraaleja ja vespene-kaasua (lyhyesti
178kaasua). Kuvassa~\ref{fig:resurssit-lt} on korostettu Lost Temple
179-kartassa sinisellä mineraalirykelmät ja keltaisella
180vespene-kaasulähteet. Punaisella raksilla on merkitty mahdolliset
181pelaajien aloituspaikat. Pelin alussa pelaajalla on käytössään yksi
182keskusrakennus ja viisi työläistä (Engl. worker). Työläisiä käytetään
183resurssien keräämiseen ja rakennusten rakentamiseen. Tarpeeksi suuren
184tulovirran saamiseksi pelaajan on tuotettava lisää työläisiä ja
185rakennettava lisää keskusrakennuksia uusille resurssialueille, sillä
186työläisten on resursseja kerätessään vietävä ne aina
187keskusrakennukseen, ennen kuin ne tulevat pelaajan käyttöön. Lisäksi
188vain yksi työläinen voi kerätä resursseja samanaikaisesti yhdestä
189resurssikohteesta. Koska resursseja on välillä vietävä takaisin
190keskusrakennukseen, tarvitaan käytännössä 2-4 työläistä keräämään
191resursseja yhdestä kohteesta mahdollisimman
192tehokkaasti. Aloituspaikassa on yleensä 8 mineraalikohdetta, joissa on
193kussakin 1500 yksikköä mineraaleja, ja vespene-kaasulähde, jossa on
1945000 yksikköä kaasua.
195
196Kyetäkseen rakentamaan sotilasyksiköitä, pelaajan on ensin
197rakennettava näitä tuottavia rakennuksia. Yksiköiden tuottamiseksi on
198rakennettava myös huoltorakennuksia (Zergeillä huolto tapahtuu
199Overlord-yksiköillä) jokainen huoltorakennus lisää rakennettavissa
200olevien yksiköiden määrää ja yksiköitä ei voi rakentaa enempää, jos
201olemassaolevien huoltorakennusten kapasiteetti loppuu. Maksimimäärä
202huoltokapasiteettia on 200 yksikköä. Voimakkaat yksiköt voivat
203kuluttaa enemmän kuin yhden yksikön huoltokapasiteettia. Tiettyjä
204yksiköitä voi tuottaa ainoastaan, kun tiettyä rakennusta on rakennettu
205vähintään yksi kappale, vaikka jokin toinen rakennus tuottaisikin
206niitä. Rakennuksia tarvitaan myös yksiköiden päivittämiseksi
207tehokkaammiksi, ja lisäksi on vielä puolustusrakennuksia, jotka voivat
208tehdä vahinkoa. Rakennusten sijoittelulla on merkitystä: Niiden avulla
209voi luoda pullonkauloja tai muureja, jotka voivat olla hyödyllisiä
210taisteluissa. Liian ahtaasti rakennuksia sijoittelmalla voi tulla myös
211luoneeksi tilanteen, jossa oma yksikkö jää jumiin rakennusten väliin,
212ja ainoa mahdollisuus vapauttaa se on tuhota jokin rakennus.
213
214StarCraftista on julkaistu myös jatko-osa, StarCraft II vuonna 2010.
215Miksi tutkimuksessa sitten käsitellään StarCraft-peliä, eikä StarCraft
216II:ta? StarCraftiin on kehitetty
217BWAPI\footnote{https://code.google.com/p/bwapi/}-niminen
218C++-ohjelmointirajapinta, jonka avulla pelin tilaa voi tarkastella ja
219sille voi antaa komentoja. \textcite{starcraft2-automated-player} on
220kyllä onnistunut kommunikoimaan StarCraft II:n kanssa keskeyttämällä
221ja tulkitsemalla pelin lähettämiä Direct3D-kutsuja, mutta pelin kanssa
222vuorovaikuttaminen on vastoin loppukäyttäjän lisenssisopimusta (EULA,
223End User License Agreement). Lisäksi BWAPI tarjoaa kattavan kirjaston,
224jonka avulla tekoälyn kehittäminen on nopeaa. Myös StarCraftin
225lisenssisopimus kieltää BWAPI:n kaltaisen kirjaston käytön kohdalla,
226mutta Blizzard Entertainment on osoittanut tukensa tekoälyn
227kehittämiseen BWAPI:a hyödyntäen esimerkiksi lahjoittamalla palkintoja
228AIIDE StarCraft AI Competition -kilpailuihin \parencite{ontano-et-al}.
229Lisäksi BWAPI:lla toteutettuja StarCraft-tekoälyjä kehitetään
230aktiivisesti, joten oman toteutuksen vertailu viimeisintä teknologiaa
231hyödyntäviin tekoälyihin on helppoa.
232
233\subsection{RTS-pelit ongelmana tekoälyn näkökulmasta}
234
235Tekoälyssä itsenäistä toimijaa, joka tarkkailee ympäristöään,
236vaikuttaa ympäristöönsä, muodostaa päämääriä, tekee suunnitelmia ja
237sopeutuu muutoksiin, kutsutaan
238\textit{agentiksi} \parencite{russell2009artificial}. RTS-peliä
239pelaavaa bottia voidaan pitää agenttina.
240
241\textcite{russell2009artificial} luokittelevat erilaiset ongelmat
242tekoälyn näkökulmasta seuraavilla perusteilla:
243
244\textbf{Informaation epätäydellisyys} tai \textbf{täydellisyys}
245kertoo, voiko agentti havaita ympäristöstä kaiken ongelmaan liittyvän
246informaation.
247
248\textbf{Yhden agentin} ja \textbf{monen agentin} ympäristöt voidaan
249vielä jakaa \textbf{kilpailullisiin} ympäristöihin ja
250\textbf{yhteistyöympäristöihin}.
251
252\textbf{Deterministisessä} ympäristössä ympäristön seuraava tila
253riippuu täysin agentin toiminnasta ja ympäristön nykyisestä tilasta,
254kun taas \textbf{epädeterministisessä} ympäristössä toiminnan
255seurauksiin liittyy satunnaisuutta. \textbf{Stokastisessa}
256ympäristössä toiminnon seurausten todennäköisyydet ovat
257tiedossa.
258
259\textbf{Staattinen} ympäristö ei muutu, kun agentti pohtii seuraavaa
260toimenpidettään, \textbf{dynaamisessa} ympäristössä näin voi
261tapahtua.
262
263\textbf{Epäjatkuvuus} tai \textbf{jatkuvuus} voi liittyä ympäristön
264tiloihin, agentin havaintoihin ja agentin toimintoihin. Esimerkiksi
265shakissa ympäristöllä on rajallinen määrä tiloja ja rajallisia ovat
266myös shakkia pelaavan agentin havainnot ja toiminnot.
267
268\textbf{Tunnettu} tai \textbf{vieras} ympäristö kertoo, tunteeko
269agentti ympäristössä pätevät säännöt, eli esimerkiksi toimenpiteiden
270vaikutukset.
271
272Luokitellaan seuraavaksi RTS-pelin pelaaminen näistä näkökulmista.
273Useimmissa RTS-peleissä, niin myös StarCraftissa, informaatio on
274epätäydellistä. Tämä johtuu \textit{Fog of War}:iksi kutsutusta
275pelimekaniikasta, joka toimii siten, että pelaaja näkee
276vihollisen yksiköt ja rakennukset vain silloin kun hänen oma
277yksikkönsä tai rakennuksensa on riittävän lähellä.
278
279RTS-pelit ovat monen agentin ympäristöjä, sillä niissä pelaaja pelaa
280joko tekoälyn ohjaamaa vastustajaa vastaan tai yhden tai useamman
281ihmispelaajan kanssa. Lisäksi kyseessä on kilpailullinen ympäristö.
282
283Deterministisyys eri RTS-peleissä vaihtelee. StarCraft 2:ssa on hyvin
284vähän merkittäviä satunnaiselementtejä, StarCraftissa merkittävin on
285alemmalla tasolla olevien yksiköiden osumatarkkuus ylemmällä tasolla
286oleviin yksiköihin, joka on 70 \%. Sen sijaan esimerkiksi WarCraft III
287-pelissä yksiköiden tekemä vahinko on aina satunnainen minimi- ja
288maksimivahingon välillä. Jos jokin RTS-peli ei ole täysin
289deterministinen, on se tavallisesti stokastinen, eli toimintojen
290mahdollisten tulosten todennäköisyys on tiedossa.
291
292RTS-pelit ovat dynaamisia ympäristöjä, sillä vastustajan toiminta
293muuttaa ympäristöä jatkuvasti botin pohtiessa seuraavaa
294toimenpidettään.
295
296RTS-pelin mahdolliset tilat, pelistä tehtävät havainnot, ja pelaajan
297tekemät toiminnot ovat periaatteessa epäjatkuvia, koska yksiköiden
298sijainti voidaan määritellä yhden pikselin välein ja pelitila
299päivittyy vain jokaisen ruudunpäivityksen yhteydessä. Peli saattaa
300tosin sisäisesti säilyttää tietoa yksikön sijainnista myös tarkemmalla
301tasolla. Käytännössä mahdollisten tilojen joukko on kuitenkin niin
302suuri, että RTS-peliä voidaan pitää epäjatkuvana.
303
304RTS-pelin säännöt ovat yleensä tiedossa melko tarkaaan, esimerkiksi
305yksikköjen osumapisteet ja niiden yhdellä iskulla tekemä vahinko ovat
306tiedossa. Pelimoottorin ohjelmakoodia ei kaupallisessa pelissä
307tavallisesti ole saatavilla, joten aivan kaikkia yksityiskohtia ei
308voida tietää.
309
310\subsection{Millaisia päätöksiä RTS-pelin pelaaja joutuu tekemään?}
311
312RTS-pelin pelaajan on tehtävä jatkuvasti päätöksiä. Mihin keskittää
313huomio? Mihin käyttää resursseja? Investoidako uuteen tukikohtaan
314lisäresurssien toivossa, vai rakentaako armeijaa, jotta selviää
315seuraavan muutaman minuutin ajan tai saa yliotteen hetkeksi ja voi
316vahingoittaa vihollista enemmän kuin mitä itse saisi etua
317lisäresursseista muutaman minuutin kuluttua? Pitäisikö hyökätä nyt,
318vai myöhemmin? Jos hyökkäys on käynnissä, pitäisikö vetäytyä vai
319jatkaa hyökkäystä?
320
321Tärkeä valinta pelistrategiassa on, missä vaiheessa kannattaa olla
322aggressiivinen. Aggressiivisin mahdollinen strategia on olla
323investoimatta lainkaan resurssien keräämiseen rakentamalla työläisiä,
324vaan rakentaa välittömästi, kun resursseja on kerätty riittävästi,
325rakennus joka mahdollistaa yksiköiden tuotannon, tehdä muutama yksikkö
326ja sitten hyökätä, mahdollisesti vielä työläiset mukaan hyökkäykseen
327ottaen. Tällaista strategiaa käytettäessä peli on yleensä voitettava
328nopeasti, koska työläisten osallistuttua hyökkäykseen pelaajalla ei
329ole mitään mahdollisuutta kerätä resursseja, mikäli hyökkäys
330epäonnistuu. Vaikka työläisiä ei olisikaan käytetty hyökkäykseen, on
331aggressiivinen pelaaja heikossa asemassa pelin jatkuessa pidempään.
332Hän ei ole käyttänyt resurssejaan työläisten ja tukikohtien
333rakentamiseen, ja siksi hänen tulovirtansa on matala. Tällaisen
334strategian vastakohta on rakennusten rakentaminen
335suojaavaksi muuriksi ja keskittyminen alkupelin ajan pelkkien
336työläisten rakentamiseen ja resurssien keräämiseen. Usein käytettävä
337strategia on jonkinlaista tasapainottelua näiden kahden ääripään
338välillä.
339
340Monesti strategia tähtää johonkin tiettyy hetkeen, jolloin hyökkäys on
341tarkoitus tehdä. Tällaisessa ajoitushyökkäykseksi kutsutussa
342strategiassa voidaan keskittää jossain vaiheessa investoinnit
343yksiköiden rakentamiseen ja niiden päivittämiseen ja jättää resurssien
344kerääminen taka-alalle. Tällaisen hyökkäyksen on vähintäänkin
345onnistuttava tekemään riittävästi vahinkoa korvaamaan oman talouden
346jälkeen jääminen, muuten vastustaja on etulyöntiasemassa mikäli hän on
347kyennyt keskittymään enemmän resurssien keräämiseen.
348
349Strategiatason päätöksentekoon liittyy resurssien tuotannon ja
350hyökkäysyksiköiden välillä tasapainottelun lisäksi päätös siitä, mitä
351sotilasyksiköitä rakennetaan. Päätöksenteossa tärkeää on yrittää pysyä
352selvillä siitä, mitä yksiköitä vastustajalla on ja mitä yksiköitä hän
353on aikeissa tehdä. Tämä vaatii tiedustelua esimerkiksi halvoilla
354yksiköillä tai työläisillä. RTS-peleissä ei yleensä ole
355ylivoimaisesti parasta yksikköä, vaan jokaiselle yksikölle löytyy
356vastayksikkö, jonka avulla se voidaan torjua. StarCraftissa
357esimerkiksi osa yksiköistä lentää ja osa yksiköistä voi tehdä vahinkoa
358ainoastaan lentäviin tai ainoastaan maassa kulkeviin yksiköihin.
359Yksiköistä osa on myös näkymättömiä, jolloin niihin voi tehdä vahinkoa
360ainoastaan jos lähettyvillä on yksikkö, joka kykenee paljastamaan
361näkymättömät yksiköt. Lisäksi yksiköiden tekemä vahinko on jaettu
362kolmeen eri tyyppiin. Aiheutettu vahinko riippuu hyökkäystyypistä ja
363kohteena olevan yksikön koosta taulukon \ref{tab:kokoJaVahinko}
364mukaisesti.
365
366\begin{table}[h]
367\begin{center}
368 \begin{tabular}{|c|l|l|l|}
369 \hline
370 \textbf{Yksikön koko} & \textbf{Isku} & \textbf{Normaali} &
371 \textbf{Räjähdys} \\ \hline
372 Pieni & 100 \% & 100 \% & 50 \% \\ \hline
373 Keskisuuri & 50 \% & 100 \% & 75 \% \\ \hline
374 Suuri & 25 \% & 100 \% & 100 \% \\ \hline
375
376 \end{tabular}
377 \caption{Eri tyyppisen vahingon vaikutus eri kokoisiin yksiköihin
378 \parencite{starcraft-compendium}}
379 \label{tab:kokoJaVahinko}
380\end{center}
381\end{table}
382
383
384Taktiikkatasolla on tehtävä päätöksiä siitä, millä tavalla olemassa
385olevia yksiköitä käytetään. On pelaajan armeijalle edullista, jos
386vastustaja joutuu taistelemaan maaston tai rakennusten muodostamassa
387pullonkaulassa tai korkeammalle sijoittuneita yksiköitä vastaan. On
388myös edullista taistella suurella armeijalla pientä vastaan.
389Välttämättä kaikkia yksiköitä ei kuitenkaan kannata pitää yhdessä
390ryhmässä: voi olla edullista viedä osa yksiköistä lentävällä
391kuljetusaluksella vihollisen tukikohtaan tuhoamaan vihollisen
392resursseja kerääviä työläisiä. Mikäli vastustaja yrittää tällaista
393liikettä, pitäisi omassa tukikohdassa olla joukkoja puolustamassa.
394Taistelutilanteessa yksiköiden ryhmittelyllä on väliä. Halvat, vähän
395vahinkoa tekevät yksiköt kannattaa sijoittaa etulinjaan suojelemaan
396kalliita, paljon vahinkoa tekeviä yksiköitä.
397
398Ihmispelaajien peleissä varsinkin pelin alkuvaiheessa korostuu
399yksiköiden \textit{mikromanagerointi}, eli yksittäisten yksiköiden
400hallinta. Jos yksiköt määrää hyökkäämään tiettyyn pisteeseen, eikä
401anna tarkempia komentoja, ne useimmiten hyökkäävät vain lähimmän
402yksikön kimppuun. Yksiköistä voi saada enemmän irti monella tapaa.
403Tuli kannattaa keskittää tiettyyn vastustajaan, sillä tyypillisesti
404RTS-peleissä yksiköiden tekemä vahinko ei riipu niiden kunnosta. Tämä
405tarkoittaa sitä, että vihollisen kykyä tehdä vahinkoa voi vähentää
406tehokkaimmin yksittäisiä yksiköitä mahdollisimman nopeasti tuhoamalla.
407Vastaavasti omien yksiköiden elinikää on yritettävä pidentää
408esimerkiksi liikuttamalla eniten vahinkoa kärsiyttä yksikköä hetkeksi
409kauemmaksi. Tällöin vihollisen yksiköt vaihtavat kohdetta, ellei
410vastustaja ole erikseen käskenyt niiden hyökätä juuri pakenevan
411yksikön kimppuun. Vihollisen yksiköiden vaihdettua kohdetta
412vetäytyneen yksikön voi tuoda takaisin taisteluun.
413
414Eräs toinen tapa saada enemmän hyötyä liittyy aseiden
415\textit{jäähtymisajan} (engl. cooldown) hyödyntämiseen. RTS-peleissä
416yksiköiden hyökkäyksillä on yleensä jäähtymisaika, joka tarkoittaa
417aikaa, jonka yksikkö joutuu ampumisen tai lyömisen jälkeen odottamaan,
418ennen kuin se voi hyökätä uudestaan. Aikaa voi käyttää hyödyksi
419liikkumalla vihollisesta pois päin, jos vihollisyksiköt ovat
420lähitaisteluyksiköitä tai niiden aseiden kantomatka on lyhyempi kuin
421omilla yksiköillä.
422
423\section{Tutkimuskysymys}
424
425\section{Aiheeseen liittyvää tutkimusta}
426
427\textit{Rakennusjärjestykseksi} (engl. build order) kutsutaan
428RTS-pelissä pelin alussa tehtäviä päätöksiä siitä, mitä rakennuksia
429rakennetaan ja missä järjestyksessä. Pelin alussa vastustaja on vielä
430kaukana, joten pelitilanteet ovat samanlaisia joka pelissä. Tietty
431rakennusjärjestys johtaa tietynlaiseen tilanteeseen keskipelissä.
432Rakennusjärjestyksiä voi verrata shakin avauksiin.
433\textcite{churchill2011build} kehittivät StarCraftiin
434rakennusjärjestyssuunnittelijan, joka kykenee suunnittelemaan
435rakennusjärjestyksiä annettujen tavoitteiden saavuttamiseen.
436Suunnittelijalle annetaan tavoitteeksi tietty kokoonpano yksiköitä ja
437se etsii nopeinta tapaa tavoiteeen saavuttamiseen.
438\textcite{churchill2011build} käyttivät Depth-First Branch-And-Bound
439-hakua ratkaisun hakemiseen. Lisäksi he käyttivät ongelmassa useita
440abstrahointeja monimutkaisuuden vähentämiseksi. Toteutettu ratkaisu
441tuotti reaaliajassa rakennusjärjestyksiä, joiden toteuttamiskesto oli
442lähellä samaa tasoa kuin ammattilaispelaajilla.
443
444\chapter{Menetelmät}
445
446\chapter{Toteutus}
447
448\chapter{Tulokset ja tulosten analysointi}
449
450\chapter{Johtopäätökset}
451
452\printbibliography
453
454\end{document}
Latex/2013 syksy/gradu3.cls
(618 / 0)
  
1% Originally written by Antti-Juhani Kaijanaho on December 2002.
2% You may treat this file as if it were in the public domain.
3% Subsequently modified by Matthieu Weber and Antti-Juhani Kaijanaho.
4% Currently maintained by Antti-Juhani Kaijanaho <antti-juhani.kaijanaho@jyu.fi>
5
6%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7%% PLEASE READ THE MANUAL! %%
8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9
10%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11%% CLASS DECLARATION
12
13\def\graduclsdate{2014/03/19}
14\def\graduclsversion{3.4}
15\def\gradu@fileinfo{JY MIT Gradut}
16\NeedsTeXFormat{LaTeX2e}
17\ProvidesClass{gradu3}[\graduclsdate\space\graduclsversion\space\gradu@fileinfo]
18\typeout{gradu3 <\graduclsdate:\graduclsversion> - Tietotekniikan laitoksen graduille}
19
20%%
21%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22%% CLASS OPTIONS
23
24\newif\ifgradu@stdbib
25\gradu@stdbibtrue
26
27\def\gradu@default@@type{\gradu@default@type}
28\DeclareOption{bachelor}{\gdef\gradu@default@@type{\gradu@bachelortype}}
29\DeclareOption{manualbib}{\gradu@stdbibfalse}
30
31\DeclareOption{finnish}{\def\selectdefaultlanguage{\selectlanguage{finnish}}}
32\DeclareOption{english}{\def\selectdefaultlanguage{\selectlanguage{english}}}
33\def\selectdefaultlanguage{\selectlanguage{finnish}}
34
35\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{inputenc}}
36
37%%
38%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39%% LOAD BASE CLASS
40
41\DeclareOption{draft}{\PassOptionsToClass{\CurrentOption}{report}}
42\DeclareOption{final}{\PassOptionsToClass{\CurrentOption}{report}}
43\ProcessOptions
44\LoadClass[a4paper,12pt]{report}
45
46%%
47%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48%% REQUIRED PACKAGES
49
50\RequirePackage{fixltx2e}
51\RequirePackage{ifthen}
52\RequirePackage{chngcntr}
53\RequirePackage{everyshi}[1994/12/09]
54\RequirePackage{inputenc}
55\RequirePackage[T1]{fontenc}
56\RequirePackage[left=35mm,right=20mm,top=35mm,bottom=35mm,nohead]{geometry}
57\RequirePackage[finnish,english]{babel}
58\RequirePackage{mathptmx}
59\RequirePackage[scaled=.92]{helvet}
60\RequirePackage{courier}
61\ifgradu@stdbib
62\RequirePackage[authordate,backend=biber,noibid]{biblatex-chicago}
63\fi
64
65%%
66%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67%% INTERNAL HELPER COMMANDS
68
69% Generic list support
70\let\gradu@listitem\relax
71\def\gradu@appendlist#1#2{%
72 \expandafter\gdef\expandafter#1\expandafter{#1\gradu@listitem{#2}}}
73\def\gradu@map#1#2{{\let\gradu@listitem#1#2}}
74
75% use this instead of \vspace* on the top of a page
76\def\gradu@topvspace#1{%
77 \vspace*{-\topskip}%
78 \vspace{#1}%
79 \vspace{-\parskip}%
80 \nointerlineskip%
81}
82
83%%
84%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85%% METADATA COMMANDS
86
87\def\gradu@muistitko#1{\textit{\gradu@msg@muistitko} \texttt{\textbackslash #1}\textit{\gradu@msg@komentoa}}
88
89\def\gradu@metadatacommands{}
90\def\gradu@DeclareMetadataCommand#1#2{%
91 \gradu@appendlist\gradu@metadatacommands{#1}%
92 \expandafter\def\csname#1\endcsname##1{%
93 \expandafter\gdef\csname gradu@#1\endcsname{##1}%
94 }%
95 \ifthenelse{\equal{\noexpand #2}{}}{%
96 \expandafter\def\csname gradu@#1\endcsname{%
97 \gradu@muistitko{#1}
98 }%
99 }{%
100 \expandafter\def\csname gradu@#1\endcsname{#2}
101 }%
102}
103\newcounter{gradu@listrender@count}
104\def\gradu@DeclareMetadataListCommand#1{%
105 \newcounter{gradu@#1@count}%
106 \gradu@appendlist\gradu@metadatacommands{#1}%
107 \expandafter\def\csname#1\endcsname##1{%
108 \expandafter\gradu@appendlist\csname gradu@#1\endcsname{##1}%
109 \addtocounter{gradu@#1@count}{1}%
110 }%
111 \expandafter\def\csname gradu@#1\endcsname{}%
112 \expandafter\def\csname gradu@#1@render\endcsname##1##2{%
113 \ifthenelse{\value{gradu@#1@count} = 0}{%
114 \gradu@muistitko{#1}%
115 }{%
116 \setcounter{gradu@listrender@count}{\value{gradu@#1@count}}%
117 {%
118 \def\gradu@f####1{%
119 \addtocounter{gradu@listrender@count}{-1}%
120 ####1%
121 \ifthenelse{\value{gradu@listrender@count} = 0}{%
122 }{%
123 \ifthenelse{\value{gradu@listrender@count} = 1}{%
124 ##2%
125 }{%
126 ##1%
127 }%
128 }%
129 }%
130 \expandafter\gradu@map\expandafter\gradu@f\csname gradu@#1\endcsname%
131 }%
132 }%
133 }%
134}
135\gradu@DeclareMetadataCommand{title}{}
136\gradu@DeclareMetadataCommand{translatedtitle}{}
137\gradu@DeclareMetadataCommand{university}{\gradu@default@university}
138\gradu@DeclareMetadataCommand{department}{\gradu@default@department}
139\gradu@DeclareMetadataCommand{subject}{\gradu@default@subject}
140\gradu@DeclareMetadataCommand{studyline}{}
141\gradu@DeclareMetadataCommand{type}{\gradu@default@@type}
142%\gradu@DeclareMetadataCommand{tiivistelma} -- needs \long
143%\gradu@DeclareMetadataCommand{abstract} -- needs \long
144\gradu@DeclareMetadataCommand{avainsanat}{}
145\gradu@DeclareMetadataCommand{keywords}{}
146\gradu@DeclareMetadataListCommand{author}
147\gradu@DeclareMetadataListCommand{supervisor}
148\gradu@DeclareMetadataListCommand{contactinformation}
149
150\def\gradu@date{\today}
151\renewcommand{\date}[1]{%
152 \ClassWarning{gradu3}{\noexpand\date is deprecated!}%
153 \gdef\gradu@date{#1}%
154}
155\newcommand{\setdate}[3]{\gdef\day{#1}\gdef\month{#2}\year=#3}
156
157\def\gradu@tiivistelma{\gradu@muistitko{tiivistelma}}
158\long\def\tiivistelma#1{\gdef\gradu@tiivistelma{\begin{foreignlanguage}{finnish}#1\end{foreignlanguage}}}
159\def\gradu@abstract{\gradu@muistitko{abstract}}
160\long\def\abstract#1{\gdef\gradu@abstract{\begin{foreignlanguage}{english}#1\end{foreignlanguage}}}
161
162%%
163%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164%% BASIC FORMATTING
165
166% This matches Word 1.5 line spacing in our empirical tests.
167\renewcommand{\baselinestretch}{1.43}
168
169\setlength\parindent{0pt}
170\setlength\parskip{10pt}
171\ifgradu@stdbib
172\setlength\bibhang{0pt}
173\fi
174
175\def\@listi{%
176 \leftmargin\leftmargini%
177 \parsep 10pt%
178 \topsep 0pt%
179 \itemsep -10pt%
180}
181\let\@listI\listi
182\@listi
183\def\@listii{%
184 \leftmargin\leftmarginii%
185 \labelwidth\leftmarginii%
186 \advance\labelwidth-\labelsep%
187 \topsep 0pt%
188 \parsep 10pt%
189 \itemsep -10pt%
190}
191\def\@listiii{%
192 \leftmargin\leftmarginiii%
193 \labelwidth\leftmarginiii%
194 \advance\labelwidth-\labelsep%
195 \topsep 0pt%
196 \parsep 10pt%
197 \itemsep -10pt%
198}
199\def\@listiv{%
200 \leftmargin\leftmarginiv%
201 \labelwidth\leftmarginiv%
202 \advance\labelwidth-\labelsep%
203}
204\def\@listv{%
205 \leftmargin\leftmarginv%
206 \labelwidth\leftmarginv%
207 \advance\labelwidth-\labelsep%
208}
209\def\@listvi{%
210 \leftmargin\leftmarginvi%
211 \labelwidth\leftmarginvi%
212 \advance\labelwidth-\labelsep%
213}
214
215\long\def\@makecaption#1#2{%
216 \vskip\abovecaptionskip%
217 \sbox\@tempboxa{#1. #2}%
218 \ifdim \wd\@tempboxa >\hsize%
219 #1. #2\par%
220 \else
221 \global \@minipagefalse%
222 \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
223 \fi%
224 \vskip\belowcaptionskip%
225}
226
227%%
228%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
229%% LOCALIZATION
230
231\ifgradu@stdbib
232\DefineBibliographyStrings{finnish}{%
233 bibliography={L\"ahteet},%
234 andothers={ym\adddot}%
235}
236\fi
237
238\addto\captionsfinnish{%
239 \def\gradu@msg@muistitko{Muistitko k\"aytt\"a\"a}%
240 \def\gradu@msg@komentoa{-komentoa?}%
241 \def\termlistname{Termiluettelo}%
242 \def\appendicesname{Liitteet}%
243 \def\listfigurename{Kuviot}%
244 \def\listtablename{Taulukot}%
245 \def\figurename{Kuvio}%
246 \def\gradu@default@university{Jyv\"askyl\"an yliopisto}%
247 \def\gradu@default@department{Tietotekniikan laitos}%
248 \def\gradu@default@subject{Tietotekniikan}%
249 \def\gradu@default@type{pro gradu -tutkielma}%
250 \def\gradu@bachelortype{kandidaatintutkielma}%
251}
252\addto\captionsenglish{%
253 \def\gradu@msg@muistitko{Did you remember to use the}%
254 \def\gradu@msg@komentoa{ command?}%
255 \def\termlistname{Glossary}%
256 \def\appendicesname{Appendices}%
257 \def\gradu@default@university{University of Jyv\"askyl\"a}%
258 \def\gradu@default@department{Department of Mathematical Information Technology}%
259 \def\gradu@default@subject{in Information Technology}%
260 \def\gradu@default@type{Master's Thesis}%
261 \def\gradu@bachelortype{Bachelor's Thesis}%
262}
263\AtBeginDocument{\selectdefaultlanguage}
264
265%%
266%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
267%% COUNTING THE NUMBER OF PAGES
268
269\newcounter{gradu@pagecount@main}
270\newcounter{gradu@pagecount@app}
271\def\gradu@pagecount@curr{gradu@pagecount@main}
272\EveryShipout{%
273 \addtocounter{\gradu@pagecount@curr}{1}%
274}
275\AtEndDocument{%
276 \clearpage%
277 \immediate\write\@auxout%
278 {\string\gdef\string\gradu@MainPageCount{\thegradu@pagecount@main}}%
279 \immediate\write\@auxout%
280 {\string\gdef\string\gradu@AppPageCount{\thegradu@pagecount@app}}%
281}
282\def\gradu@AppPageCount{\textbf{?}}
283\def\gradu@MainPageCount{\textbf{?}}
284
285%%
286%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
287%% FORMATTING THE TITLE PAGE
288
289\newcommand{\gradu@toolate}{%
290 \ClassError{gradu3}{%
291 \iflanguage{finnish}{%
292 Bibliografiatietoja ei voi antaa enaa otsikkosivun jalkeen.%
293 }{%
294 Bibliographical data cannot be given after the title page.%
295 }
296 }{%
297 \iflanguage{finnish}{%
298 Komennot kuten \string\title voi antaa vain ennen
299 \string\maketitle-komentoa.
300 }{%
301 You can give commands like title only before
302 the \string\maketitle command.
303 }%
304 }%
305}
306
307% Converts the first character of the (expanded) argument to upper case.
308\def\gradu@HeadToUpper#1{%
309 \edef\fooA{#1}%
310 \def\fooB##1{##1}%
311 \def\fooC##1##2\relax{\uppercase{\fooB{##1}}##2}%
312 \expandafter\fooC\fooA\relax%
313}
314\pagenumbering{Roman}
315\renewcommand{\maketitle}{%
316 {%
317 \def\ps@titlepage{%
318 \let\@mkboth\@gobbletwo%
319 \let\@oddhead\@empty%
320 \def\@oddfoot{\hfill%
321 \begin{minipage}{\textwidth}%
322 \mbox{}\hfill\gradu@university\hfill\mbox{}\\[10pt]%
323 \mbox{}\hfill\gradu@department\hfill\mbox{}%
324 \end{minipage}\hfill%
325 }%
326 \let\@evenhead\@empty%
327 \let\@evenfoot\@empty%
328 }
329 %%%% TITLE PAGE
330 \begin{titlepage}%
331 \thispagestyle{titlepage}%
332 \gradu@topvspace{164pt}%
333 {%
334 \def\gradu@f##1{\centerline{\textbf{##1}}}%
335 \gradu@map\gradu@f\gradu@author\par%
336 }%
337 \vspace{36pt}%
338 \centerline{%
339 \Large\textbf{\parbox[top][\height][c]{\textwidth}{%
340 \centering \gradu@title%
341 }}%
342 }%
343 \vspace{164pt}%
344 \par%
345 \raggedleft%
346 \iflanguage{finnish}{%
347 \gradu@subject{} \gradu@type%
348 }{%
349 \gradu@type{} \gradu@subject%
350 }%
351 \par%
352 \raggedleft
353 \gradu@date%
354 \end{titlepage}%
355 \pagenumbering{roman}
356 \newpage%
357 %%% METADATA PAGE
358 \noindent%
359 \iflanguage{finnish}{%
360 \textbf{Tekij\"a\ifthenelse{\value{gradu@author@count}>1}{t}{}:} %
361 \gradu@author@render{,\space}{\space ja\space}\par%
362 }{%
363 \noindent\textbf{Author\ifthenelse{\value{gradu@author@count}>1}{s}{}:} %
364 \gradu@author@render{,\space}{,\space and\space}\par%
365 }%
366 \iflanguage{finnish}{%
367 \noindent\textbf{Yhteystiedot:} %
368 \gradu@contactinformation@render{,\space}{\space ja\space}\par%
369 }{%
370 \noindent\textbf{Contact information:}
371 \gradu@contactinformation@render{,\space}{,\space and\space}\par%
372 }%
373 \noindent{%
374 \textbf{%
375 \iflanguage{finnish}{%
376 Ohjaaja\ifthenelse{\value{gradu@supervisor@count}>1}{t}{}:%
377 }{%
378 Supervisor\ifthenelse{\value{gradu@supervisor@count}>1}{s}{}:%
379 }%
380 }\space%
381 \iflanguage{finnish}{%
382 \gradu@supervisor@render{,\space}{\space ja\space}\par%
383 }{%
384 \gradu@supervisor@render{,\space}{,\space and\space}\par%
385 }%
386 }\par%
387 \iflanguage{finnish}{%
388 \noindent\textbf{Ty\"on nimi:} {\let\\\relax \gradu@title\par}%
389 \noindent\textbf{Title in English:} \gradu@translatedtitle\par%
390 \noindent\textbf{Ty\"o:} {%
391 \gradu@HeadToUpper\gradu@type%
392 }\par%
393 \noindent\textbf{Suuntautumisvaihtoehto:} \gradu@studyline\par%
394 \noindent\textbf{Sivum\"a\"ar\"a:} \gradu@MainPageCount+\gradu@AppPageCount\par%
395 \noindent\textbf{Tiivistelm\"a:} \gradu@tiivistelma\par%
396 \noindent\textbf{Avainsanat:} \gradu@avainsanat\par%
397 \noindent\textbf{Abstract:} \gradu@abstract\par%
398 \noindent\textbf{Keywords:} \begin{foreignlanguage}{english}\gradu@keywords\end{foreignlanguage}\par%
399 }{%
400 \noindent\textbf{Title:} {\let\\\relax \gradu@title\par}%
401 \noindent\textbf{Ty\"on nimi:} \gradu@translatedtitle\par%
402 \noindent\textbf{Project:} \gradu@type\par%
403 \noindent\textbf{Study line:} \gradu@studyline\par%
404 \noindent\textbf{Page count:} \gradu@MainPageCount+\gradu@AppPageCount\par%
405 \noindent\textbf{Abstract:} \gradu@abstract\par%
406 \noindent\textbf{Keywords:} \gradu@keywords\par%
407 \noindent\textbf{Suomenkielinen tiivistelm\"a:} \gradu@tiivistelma\par%
408 \noindent\textbf{Avainsanat:} \gradu@avainsanat\par%
409 }%
410 %%% POSTPROCESSING
411 \def\gradu@f##1{%
412 \expandafter\gdef\csname##1\endcsname{\gradu@toolate}%
413 }%
414 \gradu@map\gradu@f\gradu@metadatacommands%
415 }%
416 \global\let\author\gradu@toolate%
417 \global\let\date\gradu@toolate%
418 \global\let\tiivistelma\gradu@toolate%
419 \global\let\abstract\gradu@toolate%
420}
421
422%%
423%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
424%% LIST OF FIGURES AND TABLES; THE TABLE OF CONTENTS
425
426\counterwithout{figure}{chapter}
427\counterwithout{table}{chapter}
428
429\setcounter{tocdepth}{3}
430\renewcommand{\@dotsep}{1}
431\renewcommand{\@pnumwidth}{2ex}
432\def\l@chapter#1{%
433 \vspace{10pt}%
434 \@dottedtocline{2}{0cm}{1cm}{\uppercase{#1}}%
435}
436\renewcommand{\l@section} {\@dottedtocline{2}{1cm}{1cm}}
437\renewcommand{\l@subsection}{\@dottedtocline{3}{2cm}{1cm}}
438\renewcommand{\l@figure} {\@dottedtocline{1}{0cm}{1cm}}
439\renewcommand{\l@table} {\@dottedtocline{1}{0cm}{1cm}}
440% The lists are automatically generated by the class, no user commands needed
441\let\listoftables\@undefined
442\let\listoffigures\@undefined
443\let\tableofcontents\@undefined
444
445\newcommand{\mainmatter}{%
446 % lists of figures and tables and contents
447 {%
448 \setlength\parskip{0pt}%
449 \def\addvspace##1{}%
450 \ifthenelse{\gradu@FigureCount = 0 \and \gradu@TableCount = 0}{}{%
451 \clearpage%
452 \gradu@topvspace{12pt}%
453 }
454 \ifthenelse{\gradu@FigureCount = 0}{%
455 \gradu@opentocfile{lof}%
456 }{%
457 {%
458 \gradu@chapterheadline{\listfigurename}%
459 \renewcommand{\baselinestretch}{1}\normalfont%
460 \def\numberline##1{\figurename~##1.~}%
461 \@starttoc{lof}%
462 }%
463 \vspace{24pt}%
464 }%
465 \ifthenelse{\gradu@TableCount = 0}{%
466 \gradu@opentocfile{lot}%
467 }{%
468 {%
469 \gradu@chapterheadline{\listtablename}%
470 \renewcommand{\baselinestretch}{1}\normalfont%
471 \def\numberline##1{\tablename~##1.~}%
472 \@starttoc{lot}%
473 }%
474 }%
475 \clearpage%
476 \@makeschapterhead{\contentsname}%
477 \vspace{-10pt}%
478 \renewcommand{\baselinestretch}{1}\normalfont%
479 \@starttoc{toc}%
480 }%
481 \clearpage%
482 \pagenumbering{arabic}%
483 \setcounter{chapter}{0}%
484}
485
486% This is automatically done by \@starttoc, but we need to do it
487% manually when we don't actually call \@starttoc, so that the
488% corresponding file is written to. Otherwise, we'd first get an
489% empty list with a section title and then, on the third run, would
490% the list be actually there.
491\def\gradu@opentocfile#1{%
492 \if@filesw%
493 \expandafter\newwrite\csname tf@#1\endcsname%
494 \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax%
495 \fi%
496}
497\def\gradu@FigureCount{0}
498\def\gradu@TableCount{0}
499\AtEndDocument{%
500 \clearpage%
501 \immediate\write\@auxout%
502 {\string\gdef\string\gradu@FigureCount{\the\c@figure}}%
503 \immediate\write\@auxout%
504 {\string\gdef\string\gradu@TableCount{\the\c@table}}%
505}
506
507%%
508%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
509%% CHAPTERS AND SECTIONS
510
511\def\gradu@chapterheadline#1{%
512 {%
513 \parindent \z@ \raggedright%
514 \normalfont%
515 \interlinepenalty\@M%
516 \Large \bfseries%
517 #1\par\nobreak%
518 \vskip 10pt%
519 }%
520}
521
522\setcounter{secnumdepth}{2}
523\def\@makechapterhead#1{%
524 \gradu@topvspace{12pt}%
525 \gradu@chapterheadline{%
526 \ifnum \c@secnumdepth >\m@ne%
527 \thechapter\hskip2ex%
528 \fi%
529 #1%
530 }%
531}
532\def\@makeschapterhead#1{%
533 \gradu@topvspace{12pt}%
534 \gradu@chapterheadline{#1}%
535 \ifthenelse{\equal{\thepage}{\arabic{page}}}{%
536 \phantomsection%
537 \addcontentsline{toc}{chapter}{#1}%
538 }{}%
539}
540
541\renewcommand\section{\@startsection%
542 {section}%
543 {1}%
544 {\z@}%
545 {-14pt}%
546 {0.01pt}%
547 {\normalfont\bfseries\large}%
548}
549
550\renewcommand\subsection{\@startsection%
551 {subsection}%
552 {2}%
553 {\z@}%
554 {-14pt}%
555 {0.01pt}%
556 {\normalfont\bfseries\normalsize}%
557}
558
559\def\gradu@forbiddensection{\ClassError{gradu3}{Don't use sectioning below subsection}{}}
560\let\subsubsection\gradu@forbiddensection
561\let\paragraph\gradu@forbiddensection
562\let\subparagraph\gradu@forbiddensection
563
564\newcommand{\preface}{\chapter*{\prefacename}}
565
566\newenvironment{thetermlist}{% begin
567 \chapter*{\termlistname}%
568 \begin{list}{% default label
569 \texttt{\string\item[\textrm{\textit{%
570 \iflanguage{finnish}{%
571 T\"am\"a jäi tyhjäksi!%
572 }{%
573 You left this blank!%
574 }%
575 }}]}%
576 }{%declarations
577 \renewcommand{\makelabel}[1]{##1\hfill}%
578 \setlength{\labelwidth}{4.8cm}%
579 \setlength{\labelsep}{0.2cm}%
580 \setlength{\leftmargin}{5cm}%
581 }
582}{% end
583 \end{list}
584}
585
586\renewcommand\appendix{\par\clearpage%
587 \gdef\gradu@pagecount@curr{gradu@pagecount@app}%
588 \chapter*{\appendicesname}%
589 \setcounter{section}{0}%
590 \gdef\thesection{\@Alph\c@section}%
591 \renewcommand{\chapter}{%
592 \ClassError{gradu3}{%
593 \iflanguage{finnish}{%
594 \string\chapter-komentoa ei saa kayttaa liitteissa%
595 }{%
596 The \string\chapter command cannot be used in the appendices%
597 }%
598 }{%
599 \iflanguage{finnish}{%
600 Kayta sen sijasta \string\section-komentoa.%
601 }{%
602 Use the \string\section command instead.%
603 }%
604 }%
605 }%
606}
607
608\newenvironment{chapterquote}[1]{%
609 \begin{quote}\em%
610 \def\gradu@quoteattr{#1}%
611}{%
612 \\\mbox{}\hfill---~\gradu@quoteattr%
613 \end{quote}%
614 \@endparenv%
615}
616
617%%
618%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Latex/Kuvat/LostTemple.jpg
(0 / 3084)
Binary files differ
Latex/Kuvat/LostTempleEdited.png
(0 / 5447)
Binary files differ