Univerzita Karlova v Praze Matematicko-fyzikální fakulta
BAKALÁŘSKÁ PRÁCE
Lukáš Meduna Terra-Settler vesmírná real-time strategie Katedra teoretické informatiky a matematické logiky
Vedoucí bakalářské práce: Mgr. Martin Pilát, Ph.D. Studijní program: Informatika Studijní obor: IPSS
Praha 2016
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně a výhradně s použitím citovaných pramenů, literatury a dalších odborných zdrojů. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona v platném znění, zejména skutečnost, že Univerzita Karlova v Praze má právo na uzavření licenční smlouvy o užití této práce jako školního díla podle §60 odst. 1 autorského zákona.
V . . . . . . . . dne . . . . . . . . . . . .
Podpis autora
i
Název práce: Terra-Settler vesmírná real-time strategie Autor: Lukáš Meduna Katedra: Katedra teoretické informatiky a matematické logiky Vedoucí bakalářské práce: Mgr. Martin Pilát, Ph.D., KTIML Abstrakt: Terra-Settler je real-time 3D vesmírná strategická hra pro jednoho hráče, kde je kladen důraz na ekonomickou simulaci, nutnou k dosažení cílů hry. Cílem hry jsou různé scénáře (např. obsazení zvolené lokace), hráč těchto cílů dosahuje pomocí postupného rozšiřování ze startovní lokace. Hra obsahuje API pro jednodušší psaní umělé inteligence a ukázkovou implementaci. Hra je multiplatformní včetně některých mobilních platforem. Klíčová slova: Strategie Real-time Unity Umělá inteligence C# Multiplatformní Simulace
Title: Terra-Settler space real-time strategy Author: Lukáš Meduna Department: Department of Theoretical Computer Science and Mathematical Logic Supervisor: Mgr. Martin Pilát, Ph.D., KTIML Abstract: Terra-Settler is a real-time 3D single player space strategy game. Main focus is on economic simulation, whitch is necessary for achieving game goals. Different scenarios (e.g. conquering planet) are used in game. It is necessary to expand and colonize surrounding planets to achieve victory. API for artificial intelligence is included in the game with sample implementation. This game is multi-platform with support of some mobile platforms. Keywords: Strategy Real-time Unity Artificial intelligence C# Multi-platform Simulation
ii
Rád bych poděkoval svému vedoucímu práce Mgr. Martinovi Pilátovi, Ph.D. za jeho pomoc, rady a čas, který mi věnoval během celé tvorby této bakalářské práce.
iii
Obsah Úvod
3
1 Real-Time strategie 1.1 Základy Real-time strategií . . . . . . . . . . . . . . . . . . . . . .
4 4
2 Herní svět 2.1 Objekty ve hře a jejich vlastnosti 2.1.1 Vesmír . . . . . . . . . . . 2.1.2 Vesmírná plavidla . . . . . 2.1.3 Vylepšení planet a lodí . . 2.1.4 Suroviny . . . . . . . . . . 2.2 Další herní mechaniky . . . . . . 2.3 Uživatelské rozhraní . . . . . . . 2.4 Cíle hry . . . . . . . . . . . . . . 2.5 Průběh hry . . . . . . . . . . . .
. . . . . . . . .
8 8 8 9 10 10 11 11 12 13
3 Umělá inteligence 3.1 API pro AI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Ukázková umělá inteligence . . . . . . . . . . . . . . . . . . . . .
14 14 15
4 Podpora mobilních platforem 4.1 Koncepty pro podporu . . . 4.2 Možnosti Unity . . . . . . . 4.3 Podporované platformy . . . 4.4 Implementace . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
17 17 18 18 18
5 Vývoj a implementace 5.1 Popis frameworku Unity . . . . 5.2 Model uchování dat . . . . . . . 5.2.1 Uložení dat . . . . . . . 5.2.2 Rekonstrukce světa . . . 5.3 Levely . . . . . . . . . . . . . . 5.4 Implementace AI . . . . . . . . 5.5 Dynamická volba parametrů hry 5.5.1 Konzole v Terra-Settler . 5.5.2 Uchování nastavení . . . 5.6 Textury . . . . . . . . . . . . . 5.6.1 Perlinův šum . . . . . . 5.6.2 Mapování textur . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
20 20 23 23 24 25 25 26 26 28 28 29 29
. . . .
Závěr
31
Seznam použité literatury
32
Seznam obrázků
34
1
Seznam tabulek
35
Uživatelská dokumentace
36
2
Úvod Počítačové hry jako celek prošly od jejich vzniku před více než šedesáti lety[14] dynamickým vývojem. V počátcích většího rozšiřování video her, za kterým stál především úspěch herních automatů, byl hardware spjat přímo s konkrétní hrou a jeho tvorba byla součástí vývoje hry, jako například v arkádě Space Invaders[8]. V následujícím období došlo k rozmachu domácích herních konzolí, zmiňme Atari 2600 a Nintendo Entertainment System, kde herní ROM byly ve formě catridgí. Současně se vyvíjely i osobní počítače s širším využitím oproti konzolím, mezi zástupce lze zařadit jeden z nejrozšířenější počítačů své doby Commodore 64. V témže roce (1982) vznikla také jedna z prvních real-time strategií Galactic Wars[5] pro osobní počítač NEC PC-8801. Doménou real-time strategií pak zůstaly především osobní počítače díky vhodnějšímu uživatelskému rozhraní, klávesnici a myši. V současné době však s rostoucí popularitou mobilních dotykových zařízení proniká tento žánr i na jiné platformy kromě PC. Při tvorbě hry Terra-Settler jsem chtěl navrhnout realtime strategii s takovými pravidly a koncepty, aby bylo možné hru hrát na více platformách a zároveň zhodnotit možnosti takového vývoje po stránce herní a hardwarové. U návrhu hry Terra-Settler bylo jednou z hlavních motivací vytvořit 3D vesmírnou strategii s odlišnými pravidly od ostatních real-time strategií, s důrazem na ekonomickou část strategických her, kde různou obtížností a zvolenými parametry bude hra mít prvky nejen budovatelské, ale i prvky boje o přežití civilizace. Třetím cílem při tvorbě této práce bylo umožnit skriptování a tvorbu vlastní umělé inteligence pomocí příslušného API, většina současných herních projektů nemá žádné možnosti pro tvorbu umělé inteligence nebo jsou API tvořeny jako projekty třetích stran (například The Brood War API [9]). Volba real-time oproti tahové strategii byla dána především větší dynamikou tohoto typu hry, ale i možností hru více ovlivnit proměnlivým prostředím pro složitější volbu akcí hráče nebo umělé inteligence. Ekonomická orientace hry naopak podpořila tvorbu hry ve 3D pro větší variabilitu postupů a i díky jednoduššímu systému soubojů mohla zůstat hra přehledná. V práci se nejdříve seznámíme se základy a obecnými principy real-time strategií. Jednotlivé aspekty strategií znázorním na několika existujících příkladech a zároveň popíši jejich vliv na hru Terra-Settler. Po popisu hry samotné se budu věnovat tvorbě umělé inteligence ve hře a konceptům nutným pro vývoj multiplatformní hry. V závěru pak nastíním některé detaily samotné implementace. Výsledkem práce je rozbor a funkční řešení navržených herních principů, umělá inteligence programovatelná pomocí vytvořeného API, včetně ukázkové implementace a verze hry pro operační systémy Android a Windows.
3
1. Real-Time strategie Strategické hry, kategorie, která se dá považovat za nadmnožinu real-time strategií, se vyznačují oproti ostatním žánrům her především velkým důrazem na rozhodovací schopnosti hráče a logické uvažování nad komplexními problémy. Přesto některé prvky mohou být přejaty z jiných žánrů, jako například reflexy a přesnost z akčních počítačových her. Strategie rozdělujeme především na dvě kategorie. • Prvním zástupcem jsou tahové (turn-based) strategie, kde hráč má zpravidla určité množství času na promyšlení dalšího postupu a volbu tahu. Protihráči mohou tvořit tahy buď zároveň v daném časovém rámci nebo postupně v určitém pořadí. Tento druh strategie umožňuje hlubší analýzu stavu hry, ale zároveň zvyšuje váhu provedeného tahu. Známým příkladem mohou být například šachy, z oblasti počítačových her pak Heroes of Might and Magic [16] a Civilization [2]. • Druhým typem jsou takzvané real-time strategie, u kterých hráči hrají simultánně v reálném čase, to přináší větší dynamiku a rychlost her. Zároveň je tvorba rozhodnutí znesnadněna časovým omezením a množstvím úkolů nutných vyřešit v jednom okamžiku. Hledání správného řešení umělou inteligencí nebo člověkem bývá obvykle náročnější [15], především kvůli většímu stavovému prostoru a limitovanému času. V další části většinu prvků realtime strategií ukáži především na dvou odlišných hrách Starcraft II [6] a Knights and Merchants[17]
1.1
Základy Real-time strategií
Strategie se skládají z mnoha různých objektů a mechanizmů, pro TerraSettler popíši na příkladech jiných her a u některých z nich a vysvětlím, jak byly využity v mém projektu. Základem je mapa nebo hranice samotného herního světa, zde závisí v kolika rozměrech má být hra umístěna. Nejtypičtější variantou jsou dvoudimenzionální hry, jako například Knights and Merchants. Zde se veškeré jednotky pohybují v jedné vrstvě v rámci 2D mapy, která sice tvoří iluzi výškového rozměru, ale z hlediska hratelnosti hru nijak neovlivňuje, navíc je mapa rozdělena do čtverců a na každém čtverci může být pouze jedna jednotka a budovy zabírají několik polí. Zajímavostí je, že mapa není neměnná, protože pro pohyb některých počítačem ovládaných jednotek, které tvořily ekonomický růst, je potřeba zbudování cest nebo je nutné vytvořit pole pro pěstování obilí . V moderních real-time strategiích je původní 2D rozměr mapy rozšířen o další vrstvy, dal by se tedy označit za 2.5D, to je například hra Warcraft III [12]. V této hře se využívají dvě vrstvy mapy, kde v jedné se nachází veškeré budovy a pozemní jednotky a ve druhé tzv. vzdušné jednotky, které mohou ignorovat 4
Obrázek 1.1: Knight and Merchants [17], světle zeleně jsou označeny čtverce na které mohou vstoupit jednotky, horizontální linie s body tvoří herní mřížku a k budovám jsou postaveny cesty. překážky ve vrstvě první. Terén zároveň ovlivňuje strategie, protože se využívá koncept tzv. high ground, ve kterém protivník, který je výše, získává výhody často měnící výsledek souboje. Ve hře Warcraft III tak například jednotky pod vyvýšeninou mají 25% šanci, že minou útok a zároveň ztrácejí rozhled, nevidí tedy nepřítele a nemohou na něj útočit dokud alespoň jedna jednotka není na stejné úrovni jako protivník. Hra Starcraft II má navíc jednu vrstvu pod zemí, která je sice využitelná pouze u jedné ze tří ras, ale díky ní se mohou některé jednotky pohybovat pod nepřítelem nebo se před ním ukrýt, jako zajímavost můžeme označit, že existuje i jednotka která se nachází ve více vrstvách a může být napadena ze vzduchu i země. Real-time strategie často obsahují dva klíčové prvky, ekonomický rozvoj a armádu k poražení nepřítele. Klíčem k porážce protivníka je odhadnout mix síly nepřátelské ekonomiky a armády pro zvolení nejlepší strategie. Pro fungující ekonomiku jsou základem suroviny, které je nejprve nutné z herního světa dobýt. Množství typů surovin se liší, hra Starcraft II [6] tak má pouze dva typy surovin, které jsou těženy speciálními jednotkami a poté jsou dostupné v jakékoliv hráčově budově na mapě pro stavbu jednotek nebo budov. Naproti tomu v Knights and Merchants je typů surovin více než 25 a jejich získávání je mnohem komplexnější. Nejprve je třeba natěžit základní suroviny, speciálními jednotkami je přenést k dalšímu zpracování a až v konečné fázi je využít ke stavbě armády. Zároveň pokud dojdou některé suroviny, tak může hráč prohrát bez přičinění soupeře. Při tvorbě Terra-Settler jsem volil více ekonomicky zaměřený přístup, suroviny jsou proto vázané k planetě, kde byly získány a musí být dopraveny na planety, kde se mohou využít. Množství surovin je jedním z prvků, kterým lze určit délku hry a její obtížnost. Výše zmíněný Starcraft II má omezený počet surovin, což hráče nutí expandovat v závislosti na strategii přibližně každých pět minut. Tento přístup 5
zvyšuje dynamiku hry a nedochází tak ke vzniku patových situací, kdy ani jeden z hráčů není nucen ke střetu. Toto rozvržení jsem využil i ve své strategii a hráč je tak nucen osidlovat nové planety. Existuje několik postupů při tvorbě nových jednotek. Ve hře Knights and Merchants tak například jednotky vznikají okamžitě v jedné budově, avšak je nutné mít několik různých surovin pro jejich tvorbu. V této hře, ale není implementován jakýkoliv technologický strom, na rozdíl od Starcraft II, kde pro tvorbu určitého typu jednotky je potřeba splnit požadované podmínky, jako je stavba určitých budov nebo vylepšení. Ve mé hře kombinuji některé vlastnosti stavby jednotek, a tak jsou lodě stavěny vždy na konkrétní planetě z tam dostupných surovin, například je tedy nutné transportovat suroviny z více planet na jednu konkrétní, aby jich zde bylo dostatek pro tvorbu zvolené lodi. Stavba trvá určitou dobu, která ale může být ovlivněna vylepšeními planety, a existuje stavební fronta pro každou planetu.
Obrázek 1.2: Starcraft II, modré minerály a zelený plyn (v orig. Minerals a Vespene Gas), pro jehož těžbu je potřeba specializovaná budova, jsou suroviny, které těží základní jednotky (drony). Hlavní budova (uprostřed) slouží pro tvorbu dronů a výzkum některých vylepšení. Každá jednotka ve strategických hrách má svůj účel a svoje vlastnosti. Účely se liší, ale zpravidla jsou buď ekonomické nebo vojenské. Jednotky sloužící pro těžbu, přenos surovin a stavbu budov patří do první kategorie. Cílem těchto jednotek je umožnit získat ekonomickou převahu a následně vytvořit potřebnou armádu pro poražení soupeře. Hry jako Starcraft II a Command & Conquer Generals mají maximálně dvě těžební jednotky a zbytek slouží pro souboj s nepřítelem, je to dáno orientací těchto her na bojový aspekt hry, a protože cílem mojí strategie bylo klást důraz na ekonomickou stránku hry, je v Terra-Settler více ekonomických jednotek než bojových.
6
Budovy ve strategických hrách mají také různé role, od technologické, přes ekonomickou až po obrannou, ale slouží jako startovní bod hráče. V mé hře jsem koncept budov částečně nahradil planetami, pro zjednodušení hratelnosti. Další mechanikou ve strategických hrách je takzvaný Fog of war [4]. Tento termín popisuje možnosti hráče sledovat nepřátelské akce. Neznalost strategie, kterou zvolil nepřítel, zvyšuje moment překvapení a znesnadňuje hráči nalezení nejlepší možné odpovědi. Pokud je Fog of war implementovaný, pak často v jedné ze dvou základních variant. První variantou je počáteční zakrytí celé mapy kromě startovní pozice a postupným prozkoumáváním pomocí jednotek se odhalují ty části mapy, které jsou pak viditelné po zbytek úrovně, jako například ve hře Dune II [3]. Druhým případem použitým i ve zmíněném Starcraftu II je viditelnost pouze kolem jednotek a budov hráče v určitém rozsahu, pokud jednotka lokaci opustí, ztrácí hráč informace o dění v daném místě. Zároveň, jak bylo zmíněno výše, může tvořit rozhled výhodu i během soubojů kdy vyvýšená místa jsou pro níže položené jednotky zahalena v mlze (Fog of war ). V Terra-Settler byl Fog of war využit pro omezení informací hráče o planetách a nutnost objevovat planety k zjištění dostupných surovin. Po objevení zůstává planeta do konce hry objevená.
7
2. Herní svět Hra vznikala jako 3D strategie a tomu odpovídá i tématické zasazení do vesmíru. Návrh prostředí se nesnaží kopírovat jakékoliv fyzikální skutečnosti, ale odráží hlavně koncepty hry. Hlavním motivem jsou sluneční soustavy ve kterých hráč postupně rozvíjí svoji civilizaci a její expanzí se snaží nejen přežít, ale i porazit protivníka ve formě umělé inteligence.
2.1
Objekty ve hře a jejich vlastnosti
V této části se v návaznosti na předchozí kapitolu seznámíme se všemi objekty ve hře, mechanikami důležitými pro tvorbu strategií ve hře a cíli jednotlivých variant hry.
2.1.1
Vesmír
Vesmír je tvořen náhodně rozmístěnými slunečními soustavami, kde každá soustava je tvořena ve středu umístěným sluncem a náhodným počtem orbit (mezi šesti až patnácti), po kterých se různě rychle pohybují planety. Zároveň jsou jednotlivé soustavy vůči sobě v pohybu, avšak pomaleji. Ačkoliv jsou planety dynamické, jejich pohyb je neměnný a hráčem neovlivnitelný, hráč tak nemá možnost měnit směr a rychlost pohybu planet a ani slunečních soustav. Planety jsou na začátku hry zahaleny v mlze (viz 1.1) a informace o nich jsou pro hráče skryty, dokud planetu neprozkoumá. Poté planeta svojí barvou reprezentuje převažující surovinu. Dynamické prostředí ovlivňuje průběh hry, změna vzdálenosti planet může značně zpomalit těžbu a dopravu surovin. V delším časovém horizontu se sluneční soustavy, které se původně nacházely u sebe, mohou vzdálit natolik, že způsobí hráči ekonomickou újmu. Planety se navzájem liší nejen velikostí, která není důležitá pro herní mechaniky, ale především množstvím surovin, které se na nich nachází. • Civilizované planety jsou obývány některým hráčem, respektive jeho civilizací. Planeta má svoji populaci a je možné na ní těžit suroviny, stavět lodě a vyzkoumat vylepšení. Vlastník (hráč) má možnost ovládat dění na planetě, zároveň má planeta pro všechny hráče viditelnou barvu svého vlastníka. Populace planety je na počátku malá, ale hráč má možnost změnit rychlost jejího růstu. V rámci populace hráč volí jak velká její část těží danou surovinu a tím ovlivňuje rychlost těžby. • Obyvatelné planety jsou vhodné pro život civilizace. Startovní planeta hráče je vždy tohoto typu. Na planetě se nachází především dostatek základních surovin pro přežití populace (viz 2.1.4) a i malé množství ostatních surovin. • Na nerostných planetách nalezneme převážně suroviny nutné pro vylepšení lodí nebo planet a stavbu nových plavidel. K dobývání nerostů a plynů slouží hráči těžařské lodě. • Pusté planety nejčastěji nemají využití a to proto, že na nich lze nalézt pouze malé množství surovin, ale mohou být vhodné k těžbě v počáteční 8
fázi, například protože budou blízko startovní planety hráče. Vznikají také vymřením civilizované planety, pokud ji zničí nepřítel nebo dojdou základní suroviny a populace postupně zahyne.
2.1.2
Vesmírná plavidla
Klíčovou součástí postupu hráče hrou jsou lodě, díky kterým může například objevovat vesmír nebo ničit nepřátelské lodě. Stavba lodí probíhá na civilizovaných planetách po natěžení dostatku surovin pro její stavbu, avšak pokud na planetě není dostatek potřebných surovin, lze je dopravit z jiných planet nebo natěžit na okolních objevených planetách. Doba pro tvorbu lodi závisí na planetě a jejích vylepšeních. Plavidla mají svoje vlastnosti, ale základní společnou vlastností pro všechny lodě je jejich zdraví, respektive kolik poškození vydrží než budou zničeny. Poškozené lodě mohou být opraveny na hráčem vlastněné planetě a jejich zdraví je znázorněno graficky v přehledu lodí (viz. 2.3). Dalším společným parametrem je palivo, které je automaticky doplněno na civilizované planetě, ale pokud lodi dojde uprostřed vesmíru, je loď nenávratně ztracena. To zvyšuje důležitost postupné expanze civilizace. Společnou schopností lodí je cestovat na libovolnou objevenou planetu, avšak ne nepřátelskou. Při návrhu hry jsem se snažil vyhnout některým repetitivním činnostem a zároveň umožnit častější napadání nepřátelských lodí, proto jsou některé akce automaticky opakovány. Zbytek vlastností a akcí je specifický pro jednotlivé typy lodí, které dále popíši. • Průzkumná loď je nejlevnější plavidlo, avšak je nezbytná pro každého hráče. S touto lodí je možné prozkoumávat okolní planety a tím zjišťovat dostupné množství surovin. Objevení planety je nezbytné pro ostatní lodě, protože na neobjevených planetách není možné těžit, přistávat s ostatními loděmi nebo je kolonizovat. Loď nemá žádné další speciální vlastnosti, je oproti ostatním lodím rychlá avšak nevydrží tolik poškození. • Těžební loď umožňuje na prozkoumaných planetách těžit suroviny. Planeta musí být nejprve objevena a poté hráč zvolí jaké množství surovin má být natěženo a vyšle loď těžit. Kapacita lodi je omezená, ale je možné kapacitu vylepšit na některé civilizované planetě, a po naplnění kapacity lodě letí zpět na planetu, ze které odstartovala. Těžba na planetě se opakuje dokud hráč tuto akci nepřeruší, není tedy nutné loď opakovaně vysílat na tu samou planetu. • Transportní loď je určená pro přepravu surovin mezi planetami patřícími jednomu hráči. Na většině obyvatelných planet není dostatek některých surovin pro stavbu více lodí nebo kolonizační lodě, a proto je nutné suroviny shromáždit na jedné planetě, k tomuto účelu slouží transportní loď, druhým důvodem pro převoz může být zajištění přežití civilizace na některé planetě, k čemuž je nutné ji v pozdějších fázích zásobovat surovinami pro přežití populace. Transport probíhá mezi dvěma planetami patřícími stejnému hráči, který vybere počáteční a koncovou planetu a množství surovin převážených v jednotlivých směrech (například výměna surovin mezi planetami). 9
Transport je opět automatický, dokud jej hráč neukončí. Počáteční velikost transportního prostoru je větší než u těžařské lodě a může být zvětšena pomocí vylepšení na některé hráčově planetě. • Kolonizační loď je nezbytná k osidlování dalších planet a k postupnému rozšiřovaní civilizace. Planeta musí být nejdříve objevena, aby mohla být kolonizována. Není levné ji vyrobit a pro její stavbu je potřeba nejprve vybudovat doky na civilizované planetě. Ztráta kolonizační lodi způsobí velkou ekonomickou ránu a i kvůli její pomalé rychlosti je vhodným terčem útoků. Stavba této lodi je možná pouze na planetě s již vybudovaným speciálním dokem (viz 2.1.3). • Útočná loď slouží jako prostředek hráče pro napadání nepřátelských lodí a poškozování protivníkovy ekonomiky. Oproti obranným lodím je rychlejší a silnější, avšak za cenu menšího počtu životů. • Obraná loď létá pomaleji, ale má silnější útok a je schopna letět v konvoji s ostatními loděmi a chránit je proti případným útokům.
2.1.3
Vylepšení planet a lodí
Vylepšení umožňují hráči investovat natěžené suroviny do zlepšení lodí a planet, přičemž je pro hráče většinou výhodnější zlepšovat současné lodě než jich mít více, díky tomu se také vyplatí hráči udržet si stávající planety a nenechat civilizaci na nich zahynout. Planeta tak může stavět nebo vylepšovat více než jednu loď najednou, zvýšit rychlost vylepšování lodě, opravovat lodě efektivněji nebo může vybudovat doky pro stavbu kolonizační lodě. Jednotlivá plavidla mohou být na planetě vylepšena několika způsoby v závislosti na typu lodě, pro začátek vylepšování lodi je nutné, aby byla na planetě patřící hráči. Všem lodím může být zvýšeno jejich zdraví a rychlost, transportním a těžebním lodím může být zvětšena kapacita úložného prostoru a útočným a obranným lodím může být zvětšena síla jejich zbraní. Během vylepšování není možné loď používat.
2.1.4
Suroviny
Suroviny jsou základem hráčovy ekonomiky a musí být nejprve vytěženy, aby mohly být použity na různá vylepšení a stavbu lodí. Ve hře Terra-Settler jsou natěžené suroviny vázány k místu, kde byly natěženy, ať už k planetě nebo těžařské lodi, která je natěžila. Rychlost těžby závisí na typu suroviny a velikosti populace, která ji těží, viz 2.1.1) a každá planeta má omezené množství surovin. • Biomasa a voda jsou důležitými surovinami, které jsou nutné pro přežití civilizace. Jejich těžba je oproti ostatním typům surovin rychlá. • Kovy jsou nutná základní surovina pro stavbu jakékoliv lodi. • Krystaly a plyn jsou suroviny, které se těží nejpomaleji, slouží pro stavbu lodí a vylepšení na planetách. Jejich množství je ale na obyvatelných planetách omezené.
10
2.2
Další herní mechaniky
Ekonomika hry je založena na postupném získávání surovin z planet a udržování jejich populace naživu, protože civilizace potřebuje pro svoje přežití určité množství surovin v závislosti na její velikosti. Populace tak spotřebovává neustále biomasu a ještě větší množství vody, zároveň i zvětšování populace stojí určité zdroje navíc ke spotřebovanému množství. Pokud na planetě dojdou suroviny nutné k přežití, začne planeta postupně umírat, dokud nevymře, tím ji hráč ztratí, nebo nezačne být planeta zásobována z jiných planet. Každá planeta má frontu úkolů, které se postupně podle jejich přidání dokončují.
2.3
Uživatelské rozhraní
Obrázek 2.1: Uživatelské rozhraní Uživatelské rozhraní vznikalo s maximální snahou o přehlednost a srozumitelnost pro uživatele. Některé informace musely být zvýrazněny kvůli horší orientaci hráče v trojdimenzionální hře oproti běžnějším 2D real-time strategiím. Popis uživatelského rozhraní v této kapitole se vztahuje k obrázku 2.1.
Herní prostředí Hráč má ve hře volný pohyb kamery ve vesmíru pomocí klávesnice nebo virtuálních tlačítek (D-padů). Hlavní část herní plochy zabírá samotný vesmír a jednotlivé sluneční soustavy s planetami. Hráč se může přiblížit libovolně k jednotlivým objektům. Na obrázku je nalevo nejbližší soustava, v pravé části jsou v mlze vzdálené soustavy, které se detailněji zobrazí při přiblížení kamery. Pro
11
lepší orientaci slunce osvětluje jednotlivé planety. V modrých čtvercích jsou vyznačeny dvě planety, vlevo je modrá planeta, která je prozkoumaná a převažující surovinou je voda, a vpravo je hráčova úvodní planeta, která má červenou barvu. Ve spodní žluté části se nachází informace a možnosti akcí k označené planetě nebo lodi. Planeta je označena kliknutím myší nebo dotykem podle platformy a dostupných vstupních perifériích (více viz kap. 4). Po označení se kamera otočí a přiblíží k vybrané lodi nebo planetě. Během vývoje bylo patrné, že toto chování kamery pomůže v orientaci uprostřed simulovaného vesmíru. Jméno planety nebo lodi se nachází nad informační oblastí. Zleva pak informační panel obsahuje název suroviny, její dostupné zbývající množství na planetě a kolik už bylo natěženo. Další sloupec informuje uživatele jaká část populace je přidělena k těžbě dané suroviny, v horní části sloupce napravo je velikost populace nepřidělená k těžbě. Pomocí znaků ”+”a ”-”mění uživatel velikost přidělené populace k těžbě. Ve zbývající části se odshora dolů nachází nejprve posuvník na určení růstu populace (nově vytvořená populace je automaticky přidělena k těžbě vody a biomasy), kde pokud je posuvník zcela vlevo, tak populace neroste. Dále se zde nachází tlačítka pro nabídku vylepšení planety a tlačítko pro menu s postavitelnými loděmi. V pravém dolním rohu je aktuálně prováděný úkon, tedy stavba lodi nebo vylepšení. Růžově je označena oblast s informací pro hráče o cíli hry. V ukázkovém obrázku se po kliknutí přesune kamera na cílovou planetu, kterou je nutné obsadit. Červené oblasti dávají přehled hráči o všech planetách a lodích. Po kliknutí na jednotlivé položky se kamera přesune k danému objektu a v informačním panelu se o něm zobrazí informace. Panely zároveň obsahují dodatečné herní informace, například hráč ihned uvidí pokud mu planeta začne umírat kvůli nedostatku surovin, protože její tlačítko v seznamu zčervená. Barva položky s lodí hráče naopak informuje o zdraví lodi, kde je rozsah od červené (téměř zničená loď) po zelenou (loď s plným zdravím). Vývojové prostředí Ke standardnímu rozhraní má hra ještě prvky pro snazší vývoj a ladění hry. Během hraní jsou vypnuty a vývojář je může v případě potřeby zapnout. Na obrázku v zeleném bloku se nachází konzole pro modifikaci herních proměnných, zasílání zpráv umělé inteligenci nebo úpravu některých souborů. Informace o úspěšném příkazu se zobrazují pod konzolou, více informací se nachází v 5.5. V levém horním rohu je zobrazen aktuální počet snímků za vteřinu a stav hry.
2.4
Cíle hry
Hráč si v hlavním menu vybere z několika variant hry. Varianty byly navrženy jako určitá verze misí a v každé je pro vítězství nutné zvolit jinou strategii. Typy hry ovlivňují parametry prostředí a cíle nutné pro dosažení vítězství ve hře. • Hra proti počítačem ovládanému hráči, k vítěství je potřeba zničit nepřátelskou flotilu a obsadit jeho planety. Hráč si na začátku vybere z všech vytvořených protihráčů. 12
• Dobývání vesmíru je varianta, kde cílem je v určitém časovém limitu obsadit vzdálenou planetu. Pro její obsazení musí hráč postupně obsazovat planety směrem k cílové planetě. • Mód přežití je založen na parametrech hry, kde planety mají omezené množství zdrojů a udržet populaci na živu stojí více surovin. Cílem je aby civilizace vydržela určité období.
2.5
Průběh hry
Hráč začíná výběrem své domovské planety. Po startu hry nejprve zvyšuje populaci a těží potřebné suroviny pro základní průzkumnou loď, se kterou poté prozkoumá okolní planety, aby zjistil jaká zásoba surovin se na nich nachází. Na prozkoumané planety pak může vyslat těžařské lodě k získání vzácných surovin nutných k stavbě dalších plavidel. Podle typu hry poté hráč buďto expanduje na nové planety nebo napadá protihráče. K expanzi je potřeba nejprve na domovské planetě vybudovat doky pro stavbu kolonizační lodě a loď samotnou. Pokud jde o hru proti umělé inteligenci, pak je potřeba výstavba útočných lodí pro zničení nepřítele a obranných lodí pro ochranu těžařských, transportních a kolonizačních lodí. V další fázi po obsazení nových planet hráč vytvoří koridory transportních lodí pro zásobování. Takto hráč postupuje k dokončení vybraného cíle hry.
13
3. Umělá inteligence Umělá inteligence ve hrách slouží ve většině případů jako protivník ve hře pro jednoho hráče, například v kampani ve hře Starcraft II. V této hře lze i hrát souboje proti AI, která začíná stejně jako hráč a může volit z různých strategií připravených tvůrci hry. Může tak například být agresivní od začátku hry nebo se soustředit na ekonomický rozvoj a silnou armádu v pozdní fázi hry. Hráč má také možnost nastavit obtížnost nepřítele, ale u nejtěžších obtížností už umělá inteligence podvádí, protože těží více surovin a má odkrytou celou mapu a volí nejvhodnější jednotky proti hráčově kompozici 1 . Naproti tomu ve hře Knights and Merchants[17] je umělá inteligence v jednotlivých úrovních poměrně jednoduchá. Umělá inteligence neřeší rozvoj ekonomiky a pouze staví jednotky a umisťuje je na konkrétní místo mapy, pokud množství jednotek převýší určitý počet, zaútočí jednotky na startovní pozici lidského hráče, při obraně je pasivní a brání pouze určené místo, je možné ji proto porazit, pokud se hráči podaří dostat do týlu protivníkovy armády a poté zaútočí ze dvou stran na jeho armádu. Při návrhu hry Terra-Settler byla snaha o nativní podporu tvorby umělé inteligence, například na rozdíl od výše zmíněných her, kde tvorba umělé inteligence není autory podporována.
3.1
API pro AI
API pro umělou inteligenci by mělo nabízet sadu nástrojů ekvivalentních k možnostem lidského hráče. Umělá inteligence by tedy měla mít možnost získat stejné informace, které má hráč. Získávání informací může být rozdílné protože člověk pro zisk informací využívá především vizuální stránku hry. Zároveň záleží na koncepci umělé inteligence, jestli má mít možnost získat více informací než hráč v její situaci, respektive jestli je jí umožněno podvádět. V Terra-Settler jsem se snažil o omezení podvádění, implementační detaily jsou v sekci5.4. Po získání informací je další oblastí zadávání příkazů jednotkám. Opět by zde měla mít umělá inteligence stejné možnosti jako hráč a naopak. V tabulce 3.1 je ukázka několika příkazů dostupných v API, úplný seznam je pak v programátorské dokumentaci.
1
http://starcraft.wikia.com/wiki/AI_script#cite_note-1PFacts-3
14
API funkce
Popis
GetEnemyPosition GetPlanetsAround GetShips PlanetAI.UpgradePlanet PlanetAI.ShipPrice PlanetAI.AssignWorkers PlanetAI.IsDiscovered PlanetAI.GetTasks PlanetAI.position PlanetAI.BuildShip ShipAI.health ShipAI.Discover ShipAI.Discover ShipAI.HasActionRunning
Vrátí startovní planetu nepřítele Vrátí planety okolo bodu nebo objektu Vrátí vlastněné lodě Vylepší zvolenou vlastnost planety Vrátí cenu zvolené lodě Přiřadí populaci k těžbě dané suroviny Vrátí informaci jestli je planeta objevená Vrátí seznam úkolů planety Vrátí pozici planety Pokusí se postavit loď, vrátí úspěšnost Vrátí zdraví lodě Vyšle průzkumnou loď prozkoumat planetu Vyšle kolonizační loď obsadit planetu Vrátí jestli loď koná nějakou akci
Tabulka 3.1: Část rozhraní umělé inteligence
3.2
Ukázková umělá inteligence
Jednoduchá implementace umělé inteligence slouží jako ukázka funkčnosti rozhraní a že je možné s umělou inteligencí vykonávat stejné úkony, jako může hráč. Tato jednoduchá inteligence se řídí jednoduchým stavovým automatem, který je přiložen v obrázku 3.1. Cílem umělé inteligence je nastřádat dostatek surovin pro expanzi a poté se snaží transportovat veškeré surovinu na domovskou planetu a zde buduje další lodě. Po expanzi začne napadat nepřátelské lodě a to prioritně lodě transportní, pokud protihráč nebude mít žádné lodě pokusí se dobýt jeho planety. Umělá inteligence nejprve vytvoří průzkumnou loď. V dalším kroku se pokusí objevit okolní planety a začne těžit suroviny nutné pro vybudování těžařské lodi. Po jejím vybudování s ní začne těžit a šetří na kolonizační dok. Až jej postaví, tak obdobně čeká až bude mít dostatek surovin pro kolonizační loď. Po kolonizování planety vytvoří transportní loď, se kterou začne poté přenášet suroviny na hlavní planetu. Pokud je až v tomto stavu, pokusí se zaútočit na hráče. Kromě tohoto dlouhodobějšího cíle kontroluje umělá inteligence v určitých intervalech volání (například každé sté volání), jestli její lodě provádí nějaké akce a pokud ne, tak jim vytvoří akci (například útočná loď bude napadat). Pravidelně také bude v určitém intervalu kontrolovat, zda-li neumírá nějaká planeta a případně tak změní velikost populace těžící suroviny nutné pro přežití planety.
15
Obrázek 3.1: Stavový automat ukázkové umělé inteligence
16
4. Podpora mobilních platforem Desktopy, notebooky a konzole zůstávají i přes změnu trhu hlavním místem pro hráče, ale prudký růst mobilních platforem v čele s mobilním operačním systémem Android[1] umožňuje nabízet hry na dalším obrovském trhu, který podle některých statistik[19] přerostl trh s klasickými desktopovými operačními systémy. Moderní mobilní operační systémy nabízejí vývojářům nástroje pro usnadnění instalace hry veřejnosti, mezi to se řadí jednotný obchod s aplikacemi, který umožňuje snadné publikování aplikace bez nutnosti aplikaci umisťovat na vlastní server. Další výhodou je snadná možnost plateb u komerčních aplikací nebo doručení nových aktualizovaných verzí aplikace uživatelům bez nutnosti tvorby vlastního systému pro updaty.
4.1
Koncepty pro podporu
Pro tvorbu multiplatformní strategie je nutné zvážit několik různých oblastí vývoje, které jsou ovlivněny tímto požadavkem a další možná omezení. Při vývoji hry bylo nutné omezit některé prvky známé z jiných real-time strategií, protože by byly vykonatelné na dotykových displayích, zmíním například označování tahem myši nebo klávesové zkratky pro stavbu lodí nebo budov. Omezením byla také nutnost mít veškeré prvky dostatečně velké pro ovládání prsty. Hardwarové parametry Pro vývoj náročnějších 3D her je důležitý především výkon grafické karty zařízení. Výkon i dostupné API závisí na zvoleném hardwaru, v mobilních procesorech nalezneme například podporu odlehčeného OpenGL ES. Nejnovější procesory nabízí i moderní DirectX 12 a Vulkan, které nalezneme například i ve stolních počítačích a tím zlepšují přenositelnost kódu. Výkon hardwaru se liší u mobilních a notebookových grafických karet až o stovky procent. Vstupní a výstupní zařízení Obrazový výstup se liší fyzickou velikostí, rozlišením, poměrem stran a jemností zobrazovače (DPI), je proto nutné navrhnout responzivní uživatelské rozhraní, nezávislé na poměru stran, rozlišení a škálování. V návrhu hry je nutno počítat s různou dostupností vstupního hardwaru. Na mobilních zařízeních je třeba přizpůsobit prvky dotyku a vytvořit případné ovladače přímo ve hře, naopak na PC lze vyžít jiných periférií jako například myši, která je výrazně přesnější než dotyk, a klávesnice, která nabízí možnost využití klávesových zkratek. Operační systém a dostupné prostředí V závislosti na operačním systému máme dostupné různé API a jazyky pro vývoj. Rozdíly jsou především u iOS (Objective-C s frameworkem CocoaTouch) Android (Java) a Windows Phone (C# s .NET frameworkem). Jediným společným je vývoj v nativním kódu (C++), ale i zde se liší dostupná API a je nutno upravovat aplikaci pro každou z platforem. 17
4.2
Možnosti Unity
Framework Unity umožňuje tvorbu aplikací a her v jazyce C# a s využitím Mono frameworku, který překládá CIL kód (common intermediate language) do nativního kódu procesoru a obsahuje základní knihovny (Standard Libraries ). V současné době pracuje Unity s běhovým prostředím Mono, ale ve vývoji je kompilace v AOT (Ahead-of-time) pomocí IL2CPP. [18] a v budoucnu umožňuje generování kódu v následujících módech : • Just-in-time (JIT) kompilace CIL bytekód je překládán za běhu, tento typ překladu je standardní na většině platforem, například na platformě Windows. • Ahead-of-time (AOT) kompilace. Většina je přeložena před během aplikace. Pro běh aplikace není potřeba běhové prostředí (např. na iOS). Apple neumožňoval[13] na platformě iOS generování kódu za běhu aplikace (tedy i Just-in-time kompilaci) Tvorba uživatelského rozhraní v Unity umožňuje proporcionální rozložení prvků a tím i nezávislost na parametrech displeje, rovněž také nabízí využití specifického API různých platforem (akcelerometr aj.).
4.3
Podporované platformy
Unity nabízí celou škálu podporovaných platforem, avšak většina má svoje specifika pro vývoj. Například pokud je aplikace vyvíjena na platformě Windows, pak není možné hru zkompilovat pro zařízení iOS, protože je k tomu potřeba vývojové prostředí XCode, které je dostupné pouze na platformě Mac OS. Unity tak vytvoří projekt pro zmíněný XCode a ten je potřeba v něm zkompilovat. Terra-Settler byla testována a je funkční na Windows 8 a vyšší, Linuxu (Mint 17 a vyšší) a Androidu 4.4 a vyšším. Hratelnost se během testování jevila jako lepší na tabletu, kde větší displej byl vhodnější vzhledem k množství prvků rozhraní.
4.4
Implementace
Pro tvorbu specifického kódu pro danou platformu využívá hra Unity příznaky pro kompilátor. Specifické objekty existují pouze na určitých zařízeních. Takto jsou vytvořeny i virtuální D-pady pro dotykové displeje nebo využití akcelerometru. Při ovládání světa myší i dotyky je volána metoda pro oba vstupy stejné, a proto není nutné mít zdvojený kód pro dotyky a stisk tlačítka myši Uživatelské prostředí je tvořeno dynamicky s využitím komponenty Canvas Scaler (viz 5.1), díky které se rozhraní mění oproti výchozímu (1000px x 1000px, DPI 100)
18
Obrázek 4.1: Dynamické uživatelské rozhraní prvky informačního panelu jsou i při krajních poměrech stran (více než 21:9) plně funkční a přehledné.
Obrázek 4.2: Screenshot mobilní verze
19
5. Vývoj a implementace V této kapitole se seznámíme s některými klíčovými prvky při tvorbě hry Terra-Settler. Cílem je ukázat čtenáři některé z problémů při tvorbě real-time strategie ve frameworku Unity a jejich řešení. Seznámíme se také s prostředím Unity a vývojem v něm.
5.1
Popis frameworku Unity
Framework Unity se vyznačuje především velkým množstvím podporovaných platforem[10] Z desktopových to jsou Linux, Windows a Mac OS X, z mobilních platforem pak Android, BlackBerry 10, iOS a Windows Phone a ze světa konzolí to jsou PlayStation 3 a 4, Xbox 360, Xbox One a Wii U. Dnes rychle se rozvíjející virtuální realita je v Unity podporována také a to pro zařízení Oculus Rift1 , HTC Vive2 a GearVR3 . Mezi nejznámější projekty vytvořené v Unity enginu pro PC a konzole patří například Kerbal Space program 4 a Cities: Skyline 5 . Z her pro mobilní platformy zmiňme například Shadowgun 6 a Angry Birds 2 7 . Unity tedy skutečně umožňuje vyvíjet pro všechny platformy a to i vysoce kvalitní tituly. Výhodou pro vývoj v Unity je také možnost využít zdarma edici Personal 8 , která umožní plnohodnotný vývoj pro začínající uživatele a menší projekty. Vývoj v Unity probíhá v jazyce C# nebo v JavaScriptu. Pro svůj projekt jsem volil C# především z důvodu dřívějších zkušeností a možnosti využít některé pokročilejší prvky tohoto jazyka. Navíc může být kód v jazyce C# rychlejší9 . Základním prvkem enginu Unity je tzv. GameObject10 . Tato třída je základem všech objektů, skrze tuto třídu lze přímo v editoru Unity nebo v kódu hry objekt aktivovat nebo deaktivovat. Nejdůležitější vlastností však je, že slouží jako schránky pro Komponenty. Každý GameObject obsahuje komponentu Transform, která určuje polohu objektu v prostoru. Poloha objektu vždy závisí na jeho umístění v hierarchii objektů. Pokud je objekt v koření této hierarchie, pak je jeho poloha vázána k světovým souřadnicím. Naopak pokud je potomkem jiného objektu ve stromu objektů, pak je jeho pozice relativní vůči poloze rodiče. Například pokud je objekt A na pozici (0,0,2) a objekt B je jeho potomkem s pozicí (0,0,0), pak jsou světové souřadnice objektu B rovny (0,0,2). Mezi další komponenty, které využívá Unity a objevují se i v mém projektu, patří například komponenta Light. Tato komponenta pokrývá většinu typů osvět1
https://www.oculus.com/en-us/rift/ http://www.htcvive.com/eu/ 3 http://www.samsung.com/cz/promotions/galaxynote4/feature/gearvr/ 4 https://kerbalspaceprogram.com/en/ 5 http://www.citiesskylines.com/ 6 http://www.madfingergames.com/deadzone/ 7 https://www.angrybirds.com/games/angry-birds-2/ 8 https://unity3d.com/get-unity 9 http://dentedpixel.com/developer-diary/c-vs-unityscript-which-is-faster/ 10 http://docs.unity3d.com/ScriptReference/GameObject.html 2
20
lení ve hře, například bodové osvětlení (z jednoho bodu se šíří do všech směrů), kónické osvětlení, které odpovídá kulové výseči bodového osvětlení a směrové světlo, u kterého nezávisí na pozici, ale všechny objekty ve hře jsou v jeho směru osvětleny jeho intenzitou. Posledním typem osvětlení je globální osvětlení, díky kterému je v každém bodě alespoň určitá úroveň difuzního světla, bez tohoto osvětlení by například odvrácené strany planet byly kompletně černé, což není ideální pro herní zážitek. Jedním z parametrů globálního osvětlení je i Fog, čili mlha, která zahaluje vzdálené objekty. Poslední komponentou týkající se světla, kterou jsem využil v Terra-Settler je komponenta Halo, která tvoří v určitém rozmezí vzdálenosti od slunce ”kouli”světla kolem sluneční soustavy, jak je možné vidět například v hlavním menu. Při tvorbě strategie je velmi důležité uživatelské prostředí. V Unity je plocha pro tvorbu UI tvořena objektem s komponentou Canvas a všechny UI elementy jsou v hierarchii jejími potomky. Většina základních UI elementů je v Unity již implementována, uživatel tak může využít objekty Text, Button, Image a tak dále. Všechny tyto obsahují komponentu RectTransform, která je důležitá pro tvorbu dynamického UI. RectTransform reprezentuje obdélník ve 2D prostoru a vývojář pomocí této komponenty nastavuje její kotevní body (vždy dva jako protilehlé body obdélníka). Pokud tedy kotevní body nastavím jako o1 = [0,0] a o2 = [0.1,0.1], bude tento UI element vyplňovat levý spodní roh Canvasu a jeho velikost bude vždy 10% výšky a šířky okna. Díky této vlastnosti se podařilo vytvořit dynamické rozhraní. Pro automatickou velikost textu je vhodná komponenta CanvasScaler připojená k objektu Canvas. Unity nabízí i fyzikální simulaci, ale ta se v tomto projektu jevila jako zbytečná, ale využil jsem komponenty Collider, která umožňuje získat informace o kolizích mezi objekty. To jsem využil při soubojích lodí pro kontrolu, že jsou lodě v kolizní vzdálenosti. Nejdůležitější komponentou jsou však komponenty typu Script, které umožní připojit k objektu libovolný počet skriptů. Zde odbočím k životnímu cyklu každého snímku v Unity. Na obrázku 5.1 jsou jen některé fáze životního cyklu aplikace, ale tyto fáze byly v mé práci nejdůležitější a proto je detailněji popíši. Každý skript, který dědí od třídy MonoBehaviour má zaručeno, že pokud je aktivní, tak v daném pořadí budou zavolány jednotlivé metody. První metodou, která se zavolá pouze jednou za životní cyklus skriptu, je metoda Awake, ve chvíli volání této metody jsou již inicializovány veškeré objekty a je možné je referencovat. Další v pořadí je metoda OnEnable, která je volána pokud je objekt aktivován. Metoda Start je volána, pokud je objekt aktivní a to opět pouze jednou za život skriptu. FixedUpdate je volán nezávisle na snímkové frekvenci, v pravidelném intervalu. OnCollision je vyžito pro kontrolu kolizí objektů, slouží v soubojovém systému pro detekci nepřátelských lodí. Metoda Update je nejčastěji využívána v TerraSettler, v této metodě se odehrává pohyb lodí a planet. Důležité je, že doba mezi snímky není konstantní a proto je třeba využívat proměnné Time.deltaTime, která obsahuje délku posledního snímku a nedochází tak například ke zrychlení těžby v závislosti na vyšší snímkové frekvenci. Přeskočíme k LateUpdate, tuto metodu je vhodné volat pokud výpočty uvnitř ní zahrnují změny v jiných ob21
jektech během volání metody Update. Využití má například při pohybu kamery, jejíž pohyb závisí na stisknutí tlačítka nebo pohybu planety, což se odehrává ve zmíněné metodě Update. OnApplicationQuit je zaslána všem objektům těsně před ukončením aplikace a OnDestroy je volán těsně před zničením samotného objektu (ne nutně tedy pouze na konci aplikace). Skripty jsou poté psané ve standardním jazyce C#.
Obrázek 5.1: Zjednodušený životní cyklus aplikace Speciální konstrukcí v Unity jsou tzv. Coroutines, což jsou metody vracející typ IEnumerator. Jak překlad napovídá, jejich hlavním smyslem je opakování rutiny, ale přes více snímků. Využití takovýchto rutin umožňuje provést některé akce postupně během určitého období. Díky těmto rutinám je možné například udělit povel lodi, aby následovala jinou loď. Tělo metody odpovídá standardní metodě, ale pokud si uživatel přeje předat kontrolu zpět Unity, je nutné zavolat jeden z několika příkazů, například yield null zavolá v příští snímku příkaz ihned následující za tímto a v současném snímku předá kontrolu zpět Unity, tato volaní jsou využita například při cestě lodě a nebo při čekaní na uživatelovo rozhodnutí. yield WaitForSeconds se chová jak název napovídá tak, že příští zavolání rutiny proběhne po n sekundách, težba surovin tak probíhá každých 0.2 vteřiny, aby vytěžené množství surovin nebylo v malých objemech. Pořadí volaní jednotlivých rutin je vidět na obrázku 5.1. Posledním důležitým prvkem frameworku unity jsou objekty typu Prefab. Volně by se daly tyto objekty označit za prefabrikáty, ze kterých je možné skládat výslednou scénu. Jednotlivé díly scény můžeme vytvořit v prostředí frameworku Unity včetně všech komponent, skriptů a textur. Prefabrikáty mohou mít vlastní stromovou strukturu a může jich být více v jedné. V Terra-Settler jsou takto tvořeny sluneční soustavy, objekt MapGenerator má referenci na prefabrikát SolarSystem s potomkem Sun a na druhý prefabrikát Planet, za běhu pak tvoří jednotlivé sluneční soustavy instancializací prefabrikátů.
22
5.2
Model uchování dat
Terra-Settler je hra pro jednoho hráče s možnou herní dobou delší než deset minut a proto bylo při vývoji myšleno na možnost ukládat hry od počátku. Uložené pozice by měly vždy zachovat přesný stav hry a velikosti uložených dat by měly být v řádech maximálně jednotek megabajtů. Nakonec se během vývoje ukázalo, že ukládání a obnovování herního světa byl jeden z největších problémů při implementaci hry. Vzhledem k tomu, že hra je real-time strategie, je potřeba vždy zaznamenat přesný stav světa, i když se některé objekty nachází uprostřed akce. Framework Unity neobsahuje žádnou triviální metodu pro ukládání herního světa a tuto úlohu nechává na vývojáři. Pro ukládání dat se využívá binární serializace, čímž rozumíme převedení objektů v paměti do posloupnosti bitů a je následně uložena na disk. Největší překážkou serializace je zachování informací o referencích.
5.2.1
Uložení dat
Následující popis je ilustrován na obrázku 5.2. Pro uchování dat se při vývoji ukázala jako nejvhodnější tvorba pomocné třídy jako kontejneru pro každý GameObject, protože třídy dědící od MonoBehaviour nejsou serializovatelné. Výsledkem tedy je, že pro objekt Player máme třídu dat PlayerData, pro objekt Ship máme ShipData a tak dále. Tento vztah je v 5.2 naznačen modrými šipkami, které spojují samotné objekty typu GameObject s částečně serializovatelnými třídami.Serializace začíná v objektu DataHolder, který serializuje pomocnou třídu SaveDataPackage, do které se ukládají informace o všech slunečních soustavách, data o hráčích, informace o lodích a pozice s rotací kamery. Je nutné aby všechny tyto vnitřní položky byly rekurzivně serializovatelné a aby neobsahovaly cyklus referencí. Byl vytvořen například serializovatelný Vector3Serializable pro ukládání pozic objektů, protože standartní Vector3 není serializovatelný. Nejprve se tedy uloží pozice a rotace kamery uživatele a vloží se do obalovací třídy pro serializaci. Poté se na každého hráče zavolá metoda GetPlayerData, která rekurzivně do hloubky volá serializaci na svoje data a poté vrátí serializovatelnou třídu PlayerData, pole těchto dat se opět vloží SaveDataPackage. Během ukládání se serializuje případná umělá inteligence a její data (více o serializaci umělé inteligence je v 5.4). Obdobně se postupuje u lodí, kde jsou navíc serializovány probíhající akce a jejich stav, aby po načtení lodě pokračovaly v zadaných úkolech. Solární systémy si při ukládání serializují položky slunce a planet v soustavě, kde planety vrací typ PlanetTuple, který obsahuje pozici, rotaci a data planety. Každá planeta má zároveň seznam úloh zbývajících na planetě. Tímto jsme seserializovali veškerá data v černých blocích na obrázku 5.2. Zbývá vyřešit modré a zelené reference. Modré bloky reprezentují nějaký konkrétní GameObject a žádné informace navíc, které by bylo potřeba získat. Jediné podstatné a to pozici a rotaci jsme již získali pomocí pomocné třídy Vector3Serializable. Modré objekty tedy mohou být zničeny bez potřeby ukládat další data. Zelené čáry odkazují navzájem mezi třídami obsahujícími data objektů. Protože nelze uložit některé reference například na lodě, je uloženo jejich unikátní číslo ID, které je pak při zpětné konstrukci potřeba.
23
Obrázek 5.2: Model ukládání dat
5.2.2
Rekonstrukce světa
Při načítání hry je postup obrácený, nejprve jsou vytvořeny (v obrázku 5.2 modře) herní objekty včetně modelů, v další fázi jsou jim předány instance deserializovaných objektů s daty. Poté zbývá znovu vytvořit (v obrázku 5.2 zelené) reference mezi objekty. Pro vyšší rychlost je lepší informace o referencích tvořit tak, aby nebylo nutné hledat všechny objekty typu Planet ve hře, ale aby se planety ”přihlásily”u jejich vlastníka, protože počet hráčů je v jednotkách oproti stovkám planet. Planety také kromě referencí na vlastníka spustí znovu průběh předtím běžících úkolů. Lodě takto vytvoří reference na planety, pokud na nějaké jsou, a přihlásí se u svého vlastníka. Na závěr pak spustí průběh akce, kterou vykonávaly, pokud ji mají. V případě hráče je pouze nutné opět spustit běh umělé inteligence, pokud se jedná o počítačem řízeného hráče.
24
5.3
Levely
Ve frameworku Unity jsou jednotlivé úrovně řešeny pomocí scén. Scény je možné vytvořit přímo v editoru a připravit tak jednotlivé objekty scény. V tomto projektu jsem kvůli velkému otevřenému světu nevyužil úrovně jako herní mise, ale pouze jako oddělení hlavního menu od hry samotné. Hráč tedy přechází mezi scénami pokud jde do hlavního menu a zpět. Při změně scény je někdy nutné předat informace scéně, která se načítá. V Terra-Settler, je těchto informací více, mezi nimi velikost tvořeného vesmíru, typ spuštění herního světa, jestli jde o novou hru nebo načtení uloženého světa, a popřípadě jakou umělou inteligenci hráč zvolil jako soupeře. Během změny scény mohou být informace uloženy buď v herním objektu označeném DontDestroyOnLoad nebo ve statické proměnné třídy, protože v mém případě nešlo o velké množství dat, zvolil jsem druhou možnost a data jsou uložena jako instance pomocné třídy uložená v statické proměnné třídy SceneControll. Tato pomocná třída také v každou chvíli nese informaci o stavu hry, toto je důležité při změně úrovní a při interakci hráče s uživatelským rozhraním. Tyto stavy se využívají například pro rozdílné akce, při kliknutí na objekt, pokud je stav Running, pak se hráči zobrazí informace o planetě, pokud ovšem hráč na zvolené lodi zvolí nějakou akci lodě, například ji pošle těžit, změní se stav hry na WaitingForAction a kliknutí na planetu nezobrazí informace o ní, ale vyšle loď na vybranou planetu. Obdobně stav WaitingForResponse je stav, ve kterém se očekává odpověď uživatele na zobrazený dialog.
5.4
Implementace AI
Protože záleží jak velkou kontrolu a svobodu chce mít tvůrce umělé inteligence, proto implementace nabízí dvě různé možnosti tvorby umělé inteligence. Umělá inteligence při vytvoření dostane instanci třídy AIAPI, která interně obsahuje referenci na uživatele ke kterému patří, to zaručuje, že umělá inteligence bude mít správná práva k ovlivňování objektů a nestane se tedy například to, že by ovládala protihráčovo lodě. Umělá inteligence pak pouze využívá této instance jako rozhraní pro provádění herních činností a k získání informací o světu, interně pak volá samotné herní objekty. Pro odstínění vnitřních herních metod od objektů se kterými pracuje umělá inteligence slouží obalové třídy (wrappery) nad samotnými herními objekty, to slouží k omezení možných volání a k částečnému zabránění podvádění. Těmito obalovými třídami jsou PlanetAI, ShipAI, ResourcesAI, WorkersAI a TaskAI. Jednodušší variantou je tvorba umělé inteligence poděděním od abstraktní generické třídy AbstractSimpleAI
, kde typem T je třída pro ukládání dat označená jako serializovatelná. Ukázková třída ExampleAI má overridované (potlačené) metody ConsoleMessage, která slouží ke zpracování příkazů zaslaných z herní konzole (viz sekci 5.3), metodu GetAIName, která vrací pouze jméno vytvořené umělé inteligence, nejdůležitější metodu Call, ve které se provádí samotné úkony umělé inteligence. Metoda Call má garantováno, že bude zavolána každý snímek a uživatel zde může provést podle stavu hry rozhodnutí pro akce umělé inteligence, tato metoda je bezstavová a veškeré informace o stavu hry, které si chce tvůrce umělé inteligence ponechat musí uložit do datové položky 25
data, která je zvoleného typu T (což je v případě ExampleAI vytvořená třída typu ExampleAIData, obsahující pouze několik hodnotových položek), pokud si uživatel přeje zachovat možnost hru ukládat, je nutné, aby všechny tyto uložené informace byly serializovatelné. Po načtení hry pokračuje umělá inteligence se svými daty bez možnosti zjistit, že hra byla načtena. Druhou variantou je možnost vetší kontroly nad voláním umělé inteligence. Třída umělé inteligence musí implementovat rozhraní IAI, třída kromě metod pro zjištění jména a zpracování zprávy konzole musí mít počáteční metodu, kde je umělá inteligence spuštěna. V této verzi umělé inteligence, ale lze využít rutin Unity (viz 5.1), vývojář tedy sám určuje, kdy vrátí kontrolu zpět frameworku a kdy má být znovu zavolána. Je možné také vytvářet rutiny pro čekání na určitý stav světa nebo na dokončení akce. Uživatel také získává možnost aby byly získané informace dostupné napříč snímky bez nutnosti je ukládat do pomocného objektu. Nevýhodou ovšem je nutnost manuálního ukládání stavu umělé inteligence, pokud chce, aby bylo podporováno ukládání a načítání hry s touto umělou inteligencí.
5.5
Dynamická volba parametrů hry
Při vývoji počítačových her nebo herních enginů se využívá vývojářská konzole. Konzole je zpravidla objekt, který zobrazuje některé události ve hře formou textu a zároveň do ní lze zadat příkazy pro ovlivnění běžící hry. Obzvláště u velkých projektů je vhodné za běhu hry měnit parametry a proměnné prostředí. Jedním z příkladů využití je konzole v herním enginu Source [7] společnosti Valve [11] (viz obrázek 5.3), tato konzole je dostupná nejen vývojářům, ale i samotným hráčům a umožňuje změnit veškerá nastavení hry včetně jinak skrytých a nedostupných.
Obrázek 5.3: Vývojářská konzole Source enginu [7]
5.5.1
Konzole v Terra-Settler
Ve hře Terra-Settler původně nebyly plány pro tvorbu konzole, ale během testování se ukázalo, že její vytvoření značně zrychlí ladění hodnot. Díky možnosti 26
měnit za běhu hry rychle proměnné prostředí se usnadnilo balancování hry, tedy nastavení proměnných tak, aby hra nebyla příliš obtížná nebo lehká a fungovaly mechaniky hry, například bylo nutné nastavit správný poměr rychlosti těžby, ceny lodí a maximálního počtu surovin na planetě. Během testováni jsem tak například využil i okamžité zrychlení lodí a planet nebo instantní stavbu lodí. Parametry hry jsou automaticky ukládány při ukončení hry. Konzole má další možné příkazy, například vymazaní uložených her nebo nastavení, zaslání zprávy konkrétní umělé inteligenci a zobrazení FPS11 a stavu hry. Úplný seznam příkazů je v přiložené programátorské dokumentaci, níže je ukázka několika příkazů a jejich parametrů. Tabulka slouží jako představení možných konstrukcí příkazů pro určité proměnné. Uživatel zadává příkazy s parametry oddělené mezerou a formát hodnot je specifikován v programátorské dokumentaci. Příkaz
Parametry
Proměnná show survivalTime
float
startingResources
Resources
startingPopulation
int
MineSpeed gasminespeed
float
ai index
string
delete settings debug gameinfo
Akce Zobrazí hodnotu proměnné Nastaví čas v módu hry přežití na požadovanou hodnotu Změní startovní suroviny po obsazení planety Upraví počáteční velikost populace nebo po obsazení planety Nastaví rychlost těžby plynu Zašle zprávu indexem vybrané umělé inteligenci Odstraní uložené nastavení Zobrazí/schová FPS a stav hry
Tabulka 5.1: Některé příkazy konzole a jejich parametry Konzole ve finální verzi umí zpracovávat proměnné typu int (celá čísla), float (čísla s plovoucí řádovou čárkou) a Resources (herní typ pro reprezentaci surovin, více informací je v programátorské dokumentaci v samotném projektu). Konzole je rozšiřitelná o podporu případných dalších typů. Většina parametrů hry je uložena ve třídě GameVariables a jejích podtřídách. Zjednodušeně to znamená, že všechny herní konstanty jsou na jednom místě a je snadné přidat další. Implementační zajímavostí je snadná možnost přidání a odebrání parametrů, popřípadě vnitřních tříd. Díky návrhu konzole a možnostem programovacího jazyka C# v Unity odpovídají jména proměnných v konzole přímo konkrétním proměnným ve třídě GameVariables. Samotné přidání proměnné do této třídy nám stačí, abychom ji mohli využít ve hře. Například přidáme-li proměnnou Test typu Int do třídy GameVariables, pak zobrazíme hodnotu proměnné ve hře příkazem Test show” a změnu její hodnoty na 10 dosáhneme zadáním Test 10”. ” ” Zmíněného chování je docíleno pomocí reflexe na třídě GameVariables. 11
FPS je zkratka pro frames per second neboli počet snímků za vteřinu. Je to důležitý parametr pro ladění výkonu hry na různých zařízeních.
27
5.5.2
Uchování nastavení
Protože nastavení hry se s dalšími verzemi může měnit nebo je potřeba hru vybalancovat (z pohledu hratelnosti), proto bylo jako vhodné řešení zvoleno ukládat nastavení vedlejších souborů. K využití tohoto konceptu došlo například při tvorbě jednotlivých módů hry, kdy pro typ hry o přežití jsou podmínky ztíženy, kvůli absenci nepřítele. U módu hry proti umělé inteligenci jsou parametry volnější a planety mají více surovin, konzumace vody a biomasy je nižší a tak dále. Nastavení, které provedl hráč přes konzolu je také automaticky ukládáno a je možné jej opět nahrát. Pro snadnou srozumitelnost a možnost práce s nastavením i mimo hru je veškeré nastavení serializováno do formátu XML 12 , snadno se tedy parametry upravují před spuštěním hry. Kód 5.1: Ukázka části souboru nastavení 1 2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
0 . 0 6 <waterconsumption>0 . 1 2 <maxpopulationgrowth>4 <maxpopulationdeath>4 <s t a r t i n g R e s o u r c e s N o r m a l> 60000 <Water>60000 <Metals>10000 < C r y s t a l s s p e c i a l>3000 3000 3 3 3 <s u r v i v a l T i m e>1300
5.6
Textury
Hra Terra-Settler vznikala jako 3D vesmírná simulace a s využitím frameworku Unity, který umožňuje snadné texturování objektů. Textury se aplikují na 3D objekt, v našem případě na planety a lodě, a jejich cílem je přidat detaily objektu. Zdrojem textur jsou bitmapy (rastrové obrázky), které se mapují na objekt. Pro tvorbu textur planet ve hře, jsem se rozhodl zvolit generovaní sady bitmap jako textury pro planety, které jsou pak při spuštění hry náhodnou bitmapou ze sady otexturovány. Bitmapy jsem tvořil pomocí generování Perlinova šumu[20]. Tento šum je vhodný pro simulaci přírodních tvarů, jako jsou například oblaka nebo oheň (viz obrázek 5.4). 12
https://cs.wikipedia.org/wiki/Extensible_Markup_Language
28
5.6.1
Perlinův šum
Dále popíši princip tvorby Perlinova šumu. Cílem je spočítat pro každý bod o souřadnicích x,y,z hodnotu v rozmezí (−1,1), reprezentující intenzitu v daném bodě (například na barevné škále bílá až černá). Nejprve vytvoříme prostorovou mřížku (krychli) s gradienty (vektory různého směru, maximální delky 1), například v rozměrech 32 bodů v každém směru, celkem tedy 32786 vektorů. Vektory jsou od sebe v mřížce stejně vzdálené, pro jednoduchost ve vzdálenosti 1. Šum pak počítáme tak, že pro každý bod se souřadnicemi x,y,z uvnitř krychle s gradienty nalezneme nejbližší body, ve 3D je to 8 vektorů, označme je grad1 –grad8 . Máme tedy 8 bodů s vektory a mezi nimi se nachází naše souřadnice x,y,z. Nyní vytvoříme dalších 8 vektorů, které reprezentují vzdálenost bodu x,y,z od jednotlivých gradientů (grad1 –grad8 ), tyto vektory označíme jako dist1 –dist8 , kde dist1 odpovídá grad1 a tak dále. Nyní spočteme skalární součin odpovídajících si vektorů dot1 = dist1 · grad1 . Výsledkem této operace je 8 různých hodnot, ze kterých interpolací získáme výslednou hodnotu. Hodnoty získané skalárním součinem závisí na orientaci a délce zvolených dvou vektorů. Pokud jsou kolmé, pak je skalární součin roven 0. Pokud jsou vektory opačné, pak jde o záporný součin jejich velikostí. Pokud mají stejný směr je jejich skalár roven součinu délek. ~ 1 = [gx ,gy ,gz ], dist ~ 1 = [dx ,dy ,dz ] grad ~ 1 · dist ~ 1 = ||grad ~ 1 || ∗ ||dist ~ 1 || ∗ cos α dot1 = grad Π =⇒ cos α = 0 =⇒ dot1 = 0 α= 2 ~ 1 || ∗ ||dist ~ 1 || α = Π =⇒ cos α = −1 =⇒ dot1 = −1 ∗ ||grad ~ 1 || ∗ ||dist ~ 1 || α = 0 =⇒ cos α = 1 =⇒ dot1 = 1 ∗ ||grad Ze získaných hodnot potřebujeme vytvořit výslednou hodnotu bodu, nejjednodušší variantou zpracování výsledných skalárních součtů je lineární interpolace. x1 = lerp(dot1 ,dot2 ,x), x2 = lerp(dot3 ,dot4 ,x) x3 = lerp(dot5 ,dot6 ,x), x4 = lerp(dot7 ,dot8 ,x) y1 = lerp(x1 .x2 ,y), y2 = lerp(x3 .x4 ,y) valuexyz = lerp(y1 ,y2 ,z) Pro zjemnění výsledku jsem využil interpolační křivky interpolate(t) = t2 ∗ (3 − 2 ∗ t) Výsledné textury jsou v obrázku 5.4.
5.6.2
Mapování textur
Hotové textury jsou při tvorbě mapy náhodně vybírány pro jednotlivé planety z předem připravených 2D bitmap s Perlinovým šumem. V počítačové grafice se zároveň pro simulaci povrchu objektu používá Bump mapping ODKAZ, jde o iluzi nerovností na povrchu na jinak geometricky jednodušším tělese. K tomuto účelu se využívají normálové mapy ODKAZ, což jsou nejčastěji bitmapy, kde jednotlivé barevné složky reprezentují normálový vektor plochy v daném bodě. Zjednodušeně tedy určují směr odrazu světla v bodě a tím ve 3D scéně vytvářejí iluzi reliéfů. 29
Obrázek 5.4: Ukázky Perlinovo šumu 1: Simulace ohně pomocí šumu 2: Perlinův šum jako bitmapa pro texturu 3: Normálová mapa odpovídající textuře nalevo od ní
30
Závěr V práci jsme se nejprve seznámili se stručnou historií her a strategií. Na příkladech jsem ukázal důležité koncepty real-time strategií, jejich vliv na hratelnost a důvody využití některých z nich ve hře Terra-Settler. V další části práce jsem vysvětlil návrh hry. Popsal jsem herní objekty, jejich funkci a význam pro hru. Ukázal jsem jaké mechaniky a prvky strategie jsou ve hře Terra-Settler a co je jejím cílem. V další kapitole je popsán význam umělé inteligence pro počítačové hry a možnosti pro její tvorbu včetně ukázky rozhraní. Vysvětlil jsem fungování přiložené umělé inteligence a jak využívá vytvořené API. Dále jsme se seznámili s konceptem multiplatformního vývoje a jaká úskalí skrývá a jaké možnosti nabízí. V závěrečné kapitole se věnuji postupům při vývoji hry a jednotlivým zajímavým aspektům této tvorby. Vysvětlil jsem některé z prvků vývoje ve frameworku Unity. Je popsán i celý proces serializace dat, umožňující hru ukládat pro pozdější načtení. V části o implementaci API pro umělou inteligenci je popsáno jaké jsou možnosti její implementace. Pro ladění hodnot hry jsem využil konzolu, jejíž význam a funkce jsem v práci také uvedl. Z oblasti počítačové grafiky jsem přiblížil jak byly vytvořeny textury pro hru Terra-Settler. Budoucí možný rozvoj hry spatřuji v tvorbě inteligentnějších protivníků a vytvoření herního příběhu s různými úrovněmi, což ale nebylo cílem této práce. V návaznosti na tuto práci lze vést hlubší diskuzi o obecném tématu 3D versus 2D strategie a jak výběr počtu dimenzí ovlivňuje uživatelské rozhraní a ovládání. Po grafické stránce se dá Terra-Settler rozvíjet pomocí hlubšího využití grafických nástrojů frameworku. Volba Unity enginu se ukázala jako vhodná, protože nabízí veškeré prostředky pro vývoj her včetně kvalitní dokumentace a široké uživatelské základny. Výsledkem práce je plně funkční vesmírná strategie v trojdimenzionálním prostoru. Hra má různé módy a je hratelná na více platformách.Podařilo se vytvořit i ukázkovou umělou inteligenci pro hru Terra-Settler. Hra byla vytvořena s důrazem na podporu různého hardwaru, je tedy plně hratelná nejen na klasickém počítači se standardními periferiemi, ale i na mobilních zařízeních s dotykovým vstupem a různým DPI (jemností displeje) a poměrem stran. Hra nabízí možnost hru snadno rozšířit o nové umělé inteligence a možností si ve hře zvolit protivníka.
31
Seznam použité literatury [1] The Android Story. [online]. URL https://www.android.com/history/. [2] Civilization V. [online]. URL http://www.civilization5.com/?lang=us/ #/information/. [3] Dune 2 - Online. [online]. URL http://epicport.com/en/dune2. [4] Fog of war. [online]. URL http://en.wikipedia.org/wiki/Fog_of_war. [5] Galactic Wars. [online]. galactic-wars/3030-45283/.
URL
http://www.giantbomb.com/
[6] Starcraft II. [online]. URL http://wiki.teamliquid.net/starcraft2/ StarCraft. [7] Developer Console. [online]. URL http://developer.valvesoftware.com/ wiki/Developer_Console. [8] Space Invaders. [online]. Arcade/SpaceInvaders/.
URL http://www.computerarcheology.com/
[9] The Brood War API. [online]. URL http://bwapi.github.io/index.html. [10] HE LEADING GLOBAL GAME INDUSTRY SOFTWARE. [online]. URL https://unity3d.com/public-relations. [11] Valve. [online]. URL http://www.valvesoftware.com/. [12] Warcraft III. war3/.
[online].
URL http://us.blizzard.com/en-us/games/
[13] (9. 9. 2010). Apple iOS license term changes lift interpreted code and dynamic linking ban? (The overlooked implications). [online]. URL http://playcontrol.net/ewing/jibberjabber/ apple-ios-license-term-chan.html. [14] Bateman, C. (13. 8. 2014). Meet Bertie the Brain, the world’s first arcade game, built in Toronto. [online]. URL http://spacing.ca/toronto/2014/08/13/ meet-bertie-brain-worlds-first-arcade-game-built-toronto/. [15] Campbell, M. (Naposledy navštíveno 4. 5. 2016). Can a Machine Beat a Human at StarCraft? [online]. URL http://gizmodo.com/5679355/ can-artificial-intelligence-beat-humans-at-starcraft. [16] Cobbett, R. (4. 2. 2015). HEROES OF MIGHT AND MAGIC III HD REVIEW. [online]. URL http://www.pcgamer.com/ heroes-of-might-magic-iii-hd-review/.
32
[17] E., M. (21. 10. 1998). Knights and Merchants Review. [online]. URL http://www.gamespot.com/reviews/knights-and-merchants-review/ 1900-2535637/. [18] Hauwert, R. (20. 5. 2015). THE FUTURE OF SCRIPTING IN UNITY. [online]. URL http://blogs.unity3d.com/2014/05/20/ the-future-of-scripting-in-unity/. [19] Keizer, G. (1. 4. 2016). Windows comes up third in OS clash two years early. [online]. URL http://www. computerworld.com/article/3050931/microsoft-windows/ windows-comes-up-third-in-os-clash-two-years-early.html. [20] Tulleken, H. (25. 4. 2009). How to Use Perlin Noise in Your Games. [online]. URL http://devmag.org.za/2009/04/25/perlin-noise/.
33
Seznam obrázků 1.1
Knight and Merchants [17], světle zeleně jsou označeny čtverce na které mohou vstoupit jednotky, horizontální linie s body tvoří herní mřížku a k budovám jsou postaveny cesty. . . . . . . . . . . . . . Starcraft II, modré minerály a zelený plyn (v orig. Minerals a Vespene Gas), pro jehož těžbu je potřeba specializovaná budova, jsou suroviny, které těží základní jednotky (drony). Hlavní budova (uprostřed) slouží pro tvorbu dronů a výzkum některých vylepšení.
6
2.1
Uživatelské rozhraní . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.1
Stavový automat ukázkové umělé inteligence . . . . . . . . . . . .
16
4.1 4.2
Dynamické uživatelské rozhraní . . . . . . . . . . . . . . . . . . . Screenshot mobilní verze . . . . . . . . . . . . . . . . . . . . . . .
19 19
5.1 5.2 5.3 5.4
Zjednodušený životní cyklus aplikace . . . . . . . . . . . . . . . . Model ukládání dat . . . . . . . . . . . . . . . . . . . . . . . . . . Vývojářská konzole Source enginu [7] . . . . . . . . . . . . . . . . Ukázky Perlinovo šumu 1: Simulace ohně pomocí šumu 2: Perlinův šum jako bitmapa pro texturu 3: Normálová mapa odpovídající textuře nalevo od ní . . . . . . . . . . . . . . . . . . . . . . . . .
22 24 26
1.2
34
5
30
Seznam tabulek 3.1
Část rozhraní umělé inteligence . . . . . . . . . . . . . . . . . . .
15
5.1
Některé příkazy konzole a jejich parametry . . . . . . . . . . . . .
27
35
Uživatelská dokumentace V této dokumentaci se seznámíme s spuštěním hry, jejím ovládáním a průběhem hry.
Instalace a spuštění V přiložených souborech nalezneme zkompilovaný binární soubor pro naši platformu. na platformě Windows není nutná instalace, soubory pro spuštění se nalézají v přiloženém archivu ve složce Windows, zde spustíme soubor Terra-Settler.exe. Po spuštění máme možnost zvolit nastavení zobrazení hry.
V tomto nastavení lze nastavit rozlišení hry, kvalitu grafického zobrazení a případně displej. Pokud je hra spuštěna v okně, je možné jeho velikost díky dynamickému uživatelskému rozhraní libovolně měnit. Na platformě android je potřeba nejprve nainstalovat přiložený instalační soubor Terra-Settler.apk. Ten se nachází v přiloženém archivu ve složce Android. Instalační balíček není podepsán a proto je pro jeho instalaci potřeba povolit instalaci z neznámých zdrojů v zřízení Android. To lze změnit v Nastavení > Zapezpečení > Neznámé zdroje13 . Po instalaci je možné aplikaci rovnou spustit.
13
https://support.google.com/accounts/answer/2812853?hl=cs
36
Hlavní menu Hlavní menu je stejné na obou platformách. Je to startovní bod hry a hráč se do něj kdykoliv může během hry vrátit, ale pokud chce hráč zachovat stav musí hru nejprve předtím uložit. V hlavním menu nalezneme všechny herní scénáře dostupné ve hře.
Mód survival je typ hry, kdy cílem je udržet civilizaci naživu, ale v tomto scénáři jsou omezené zdroje a populace spotřebovává více vody a biomassy. Ve scénáři conquer začíná hráč na planetě a jeho cílem je kolonizovat vzdálenou planetu. Hráč tak postupně musí kolonizovat planety mezi počáteční a cílovou planetou. Pokud hráč v menu zvolí mód versus dostane z podnabídky výběr přiložených umělých inteligencí. Hráč má možnost si vybrat proti které bude chtít hrát. Cílem je poražení nepřítele, a to tak, že vymřou postupně všechny jeho planety. Poslední volbou je načtení uložený hry, pokud byla předtím uložena. Po spuštění hry v módu survival začínáme na náhodné planetě.
37
Prostředí hry
Po spuštění hry se hráč ocitá ve vesmíru. Pro pohyb vesmíru jsou v mobilní verzi dostupné virtuálních D-pady a pro ovládání s myší a klávesnicí není potřeba virtuálních tlačítek. Pro pohyb ve vesmíru se na počítači využívají následující klávesy. Klávesa
Akce
W Pohyb kamery dopředu A Pohyb kamery doleva S Pohyb kamery dozadu D Pohyb kamery doprava Mezerník Pohyb kamery nahoru Ctrl Pohyb kamery dolů Pravé tlačitko myši Rotace kamery ve směru pohybu myši Levé tlačitko myši Vybrání planety nebo lodě, kontrola UI Escape Pozastaví hru a zobrazí menu F1 Zobrazí vývojářskou konzolu V levém spodním rohu nalezneme tlačítko pro pozastavení hry s nabídkou na uložení hry, načtení hry a návrat do menu. Na levé straně se nachází panel s planetami. Pokud tlačítko planety zčervená, znamená to, že planeta začala vymírat. a hráč by ji měl začít zásobovat surovinami. Po dotyku nebo kliknutí na tlačítka se kamera automaticky přesune na vybranou planetu. Vedle seznamu planet se nachází cíl hry, v módu survival je to čas do úspěšného dokončení hry. Napravo je pak seznam lodí, kde každá loď ukazuje svoje životy, čím je červenější, tím jich má méně a zbývající zásobu paliva, pokud lodi palivo dojde, je loď zničena. Palivo 38
je doplněno vždy, když loď přistane na hráčovo planetě. Ve středním panelu má hráč možnost vidět její jméno, suroviny dostupné na planetě, suroviny natěžené a množství workerů těžící danou surovinu. Hráč může pomocí příslušných tlačítek odebírat nebo přidávat pracovníky na těžbu jednotlivých surovin. Napravo se poté nachází posuvník pro změnu rychlosti růstu populace. Pokud je posuvník vlevo, pak nepřibývá žádná populace. Největší tlačítko ukazuje současnou u stavební frontu a pokud je něco stavěno je zobrazen čas do dokončení. Nad tímto tlačítkem jsou podmenu pro vylepšení planety a stavbu lodí.
hráč má možnost postavit na začátku pouze pět typů lodí a nemůže postavit kolonizační loď. Pro stavbu kolonizační lodi je potřeba v nabídce vylepšení postavit kolonizační dok. Pokud je hráč postaví zpřístupní se mu na té planetě stavba kolonizačních lodí.
V přehledu vylepšení je kromě možnosti vylepšit parametry planety, také tabulka současného stavu planety. Kliknutím hráč vybere libovolné vylepšení a pokud má dostatek surovin, pak započne výzkum vylepšení.
Přehled lodi je podobný přehledu planety a zobrazuje se ve stejné oblasti, ale s jinými informacemi. Obsahuje informace o zdraví rychlosti a útoku u jiných typů, například u transportní lodě jsou přítomny ještě informace o kapacitě lodi a rychlosti přenášení surovin. Další možnosti lodě jsou oprava, pokud je loď přítomna na hráčovo planetě a vylepšení lodě, které je taky dostupné pouze pokud je loď také na hráčovo planetě. Zbylé příkazy se liší v závislosti na lodi a pro příklad v obrázku máme průzkumnou loď. Ta má akci prozkoumat planetu, kde po kliknutí hráč vybere planetu, kterou si přeje prozkoumat. Příkaz poslat loď ji pouze pošle na zvolenou planetu bez dalších akcí. 39
Pokud hráč vytvoří transportní loď, pak s ní může automaticky převážet suroviny mezi dvěma hráčovo planetami. Při zadávání příkazu využije hráč dialogu pro zvolení množství surovin které mají na jedné a druhé planetě naloženy a vyloženy. Stejný princip funguje i u těžařské lodě, kde hráč vybere kolik má být na cílové planetě natěženo surovin a dopraveno zpět na planetu, ze které odletěla. Pro souboje slouží útočné lodě, které mohou být vyslány na nepřátelskou loď a mohou ji zničit. Pro obranu lodí slouží obranné lodě, které mohou následovat transportní lodě a v případě napadení pomohou ubránit cenný náklad nebo kolonizační loď.
Pokud chce hráč využít vývojářských nástrojů, pak klávesou F1 otevře vývojovou konzolu. V ní lze zadat příkazy na změnu herních proměnných. Na obrázku tak například byla změněna cena za vylepšení počtu stavebních slotů na planetě. Pokud příkaz uspěje zobrazí se změněná hodnota pod ní.
40