Pod kapotu strachu: Jak funguje umělá inteligence v legendárním hororu FEAR?
zdroj: Foto: Monolith

Pod kapotu strachu: Jak funguje umělá inteligence v legendárním hororu FEAR?

24. 9. 2022 11:00 | Téma | autor: Jakub Žežule |

Umělá inteligence (Artificial Intelligence neboli AI) patří k herním atributům, na něž recenze i samotní hráči v debatách často upozorňují. Jen málokdy však systém AI patří k lákadlům, kterými autoři a vydavatelé vábí zájemce v rámci svých marketingových kampaní.

Výjimky se přesto najdou. V poslední dekádě generovala zájem publika zajímavě se chovající umělá inteligence ve hrách jako Resident Evil 2, The Last of Us: Part IIAlien: Isolation nebo Middle-Earth: Shadow of Mordor. Tým Monolith Productions zodpovědný za poslední ze zmíněných titulů, ale také například za Aliens vs Predator 2 nebo kultovní série Condemned a No One Lives Forever, se těší pověsti velmi úspěšných experimentátorů, kteří se opakovaně pokouší herní AI posunout do dosud neprobádaných míst a neváhají přitom testovat nové systémy a originální postupy.

Perfektním příkladem je další perla z portfolia Monolithu – hororová střílečka FEAR z roku 2006. Dynamické chování a chytrá umělá inteligence zdejších nepřátel se nesmazatelně zapsaly do paměti všech, kteří si FEAR měli možnost zahrát. A nejde o relikt minulosti: Systém AI zvaný GOAP, který Monolith do hry implementoval, vzbuzuje zájem a obdiv ještě dnes.

Jak umělá inteligence ve FEAR vlastně funguje, čím se liší od svých současníků a předchůdců a proč se autoři rozhodli pro její implementaci? Na to vám odpoví tento článek.

O AI obecně

Hned zkraje je třeba si uvědomit, proč v souvislosti s herními postavami mluvíme o AI a proč je to vlastně trochu zavádějící termín. Postava se nám zdá inteligentní, když v rámci herního světa provádí nějakou akci. Tuto akci zpravidla doprovází specifická animace. Vedle plánování cesty po mapě systém umělé inteligence určuje, jaké konkrétní aktivity, tedy specifické součásti kódu, se mají spouštět. Mezi tyto součásti často patří právě přehrávání animací.

Zmíněné aktivity mohou ovlivňovat další kusy kódu, mezi které patří třeba přehrávání souvisejícího zvuku (kroky, výstřely) anebo další dílčí systémy, které mohou mít na starost například zbraně a střelbu nebo jinou formu interakce s herním světem.

FEAR zdroj: Foto: Monolith

FEAR byl chválen především za nezvykle realistické chování nepřátel, jejich nápadně cílevědomý pohyb a překvapivě inteligentní a realistické reakce. Systém zkrátka na hráče okamžitě působil dobrým dojmem. Proto je v kontextu tohoto článku důležité zdůraznit hlavně onu sice nepřímou, ale zásadní souvislost AI s animacemi.

Co to je FSM?

Tak jako v nespočtu dalších titulů byl při programování FEAR použit výpočetní model, kterému se v češtině říká Konečný automat (Finite-State Machine – dále jen FSM).  Ten se hojně používá ještě dnes, byť řada her spoléhá spíš na jeho modifikované verze.

FSM v podstatě spočívá v tom, že konkrétně definovaných stavů (states) pro AI postavy je vždy konečné množství (finite). Programátorem předem nadefinované konkrétní stavy dané AI říkají, jak se má chovat, tedy i to, jaké animace se mají u postavy v určitém stavu přehrávat.

Pokud nastane vlivem hry změna, dojde mezi stavy FSM k přechodu (transition). Postava tak dostane od AI nový příkaz a změní se její chování. Změna přitom nemusí být vždy nutně způsobena chováním hráče a jeho zásahem do herního světa, může ji například spustit i fakt, že postava dosáhla určité pozice na mapě.

FSM je velice starý systém, který hry používaly už od svých začátků. Perfektním a často citovaným příkladem je FSM určující chování AI duchů v Pac-Manovi. Pokud bloudící duchové v labyrintu spatří Pac-Mana, přejdou do nového stavu, který jim říká, že mají Pac-Mana pronásledovat. Pokud Pac-Man pozře pilulku (moment značící přechod mezi stavy), AI duchů přejde do stavu, kdy začnou utíkat. Poté mohou přijít dva možné přechody: Buď Pac-Man zakousne ducha, který se vrátí na základnu (další stav), po jejímž dosažení (přechod) začne Pac-Mana zase nahánět. Nebo pilulka přestane působit (přechod) a duchové se vrací do stavu, kdy bloudí po labyrintu.

Pacman zdroj: Vlastní

Schéma FSM se vkládá do kódu hry, ale zdaleka to nebývá tak jednoduché jako v případě stařičké klasiky. Každý jednotlivý stav totiž musí mít přesně definováno, jaké přechody ho spojují s jakými stavy. Jak rostly požadavky na zajímavější chování a interakce postav v herním světě, FSM začaly být čím dál komplikovanější (více k tématu zde).

Jako příklad může posloužit velmi promyšlený model ve hře Half-Life, jehož výstupem bylo na svou dobu poměrně inteligentní a racionální chování vojáků. Potíž je v tom, že jak rostla komplexnost a variabilita chování jednotlivých postav, rostla i obava vývojářů z jeho dalších modifikací, které ohrožují stabilitu a správné fungování celého systému. To ale nebylo vše.

Motivace pro zjednodušení FSM ve FEAR

V Monolith Productions si po zkušenostech se sérií No One Lives Forever a Tron 2.0 uvědomovali, že jejich komplexní model FSM povážlivě nabobtnal a systém se jim při dalších modifikacích může zhroutit. Nezanedbatelný problém navíc představovaly další lidské, finanční a časové náklady na testování a ladění.

Záleželo i na náročnosti výpočtu. Při programování hry bývá velký problém, aby se vše stačilo spočítat x-krát do sekundy. Například snaha o dosažení 60 FPS znamená, že grafika, AI a všechno ostatní se musí spočítat za jednu šedesátinu sekundy. Co se implementace týče, jde vždy o obchod s časem.

Proto je enormně náročné věci optimalizovat tak, aby se všechny výpočty stihly. Grafika si typicky vezme většinu výkonu a na AI a další systémy často mohou zbýt v konečném součtu jen drobky. Grafici neustále řeší s AI specialisty, kolik má kdo k dispozici milisekund. Když jedni čas nepotřebují, věnují ho těm druhým. Upřednostnění grafiky před potřebami AI vedlo například ke změně celého AI systému v Halo 3, což mnohým fanouškům jedničky a dvojky nebylo po chuti.

Ale zpátky k FEAR. Z výše uvedeného vyplývá, že čím jednodušší AI výpočet, tím lépe. Proto na to tým šel úplně jinak, než bývalo zvykem. Umělá inteligence tu zná v rámci FSM pouze tři stavy: Jdi (Goto), Animuj (Animate) a Použij chytrý objekt (UseSmartObject), přičemž všechny jsou spolu vzájemně propojeny.

3states zdroj: Vlastní

Animace nejsou samozřejmě vyhrazeny pouze pro jeden z těchto stavů. V případě stavu UseSmartObject diktuje animaci informace přiřazená objektu v databázi, jedná se tedy vlastně z určitého úhlu pohledu o podobný stav (state) jako Animate. Někdo možná namítne: Vždyť i pohyb postavy doprovází animace! Anebo naopak: Animace jako skoky a pády jsou vlastně pohyb! Ano, ale rozdíl je v tom, že stav Goto zde definuje pohyb postavy na konkrétní místo, zatímco stav Animate má primárně za cíl některou z akcí, jejímž vedlejším efektem je změna pozice dané postavy.

GOAP: Jak funguje pod kapotou

Monolith pojmenoval svůj systém umělé inteligence GOAP neboli Goal-Oriented Action Planning. Jak už sám název napovídá, postavy v něm mají zadaný konkrétní cíl a podle toho jsou schopné plánovat, jaké akce jsou pro jeho dosažení nejvhodnější.

Tvůrci opřeli svůj systém o teorii STRIPS (Stanford Research Institute Problem Solver) vyvinutou v sedmdesátých letech. Teorie spočívá v tom, že chceme-li dosáhnout konkrétního cíle (goal), je k jeho naplnění třeba podniknout určité akce (actions). Akce má předem nadefinované předpoklady (preconditions) podmiňující její splnění a také důsledky (effects), které po provedení akce nastanou.

Jak si něco takového představit v kontextu programu počítačové hry? Cíle postav ve FEAR jako Hlídkuj (Patrol), Zabij nepřítele (KillEnemy), Kryj se (Cover), Uskoč (Dodge) a mnohé další jsou poměrně krátkodobé a neustále se mění. Termín „cíl“ se používá proto, že cíle představují výsledné stavy nacházející se na konci akcí. Zjednodušeně řečeno, AI tu dokáže na základě vzniklé situace sama prioritizovat jednotlivé cíle a efektivně vybírat z databáze akcí ty, které jsou k dosažení cíle potřeba.

Chcete vědět, co se odehrává pod kapotou? Systém prioritně vybere cíl, který má v daný moment vyšší číslo. Pokud například není v dohledu hráč, bude mít cíl Hlídkuj vyšší číselnou hodnotu než Zabij nepřítele. To se změní, pokud vás postava zmerčí.

K naplnění cíle potřebuje postava vykonat akce. Při výběru akcí (celkem jich je asi 120) vybírá AI z databáze, kde jsou akce přiřazené specifické třídě postav. Logika se tu řídí naopak nejnižším číslem (cenou), které je akcím přiřazeno – systém tu vlastně doslova hledá nejsnazší cestu k cíli. Autoři tu na data chytře aplikovali vyhledávací algoritmus A*, který se mimochodem ve FEAR a v dalších hrách obvykle používá pro pathfinding, tedy pro vyhledávání nejkratší cesty. Více o tom, jak takový algoritmus vypadá, jak je do kódu implementován a jak funguje, se můžete česky dočíst například zde.

Vojáky, asasíny vyzbrojené mečem i obyčejné krysy ovládá stejná AI. Tyto třídy postav mohou sdílet i stejné cíle (celkem jich je téměř 70). Jak už jsem uvedl, rozdílné třídy postav nemají v databázi hry přiřazeny stejné akce, z čehož plyne, že je nemohou vykonávat. Z toho pramení i jejich odlišné chování. Striktně vzato, pokud narazíte na krysu, její AI může během plánování zvážit cíl Zabij nepřítele, ale jelikož tato třída postrádá přístup k jakékoliv akci nutné k naplnění cíle, vrátí se k cíli s nižší hodnotou, tedy například Hlídkuj.

Jak plánování souvisí s FSM? AI nejprve naplánuje danou sekvenci a postupně aktivuje akce v kódu hry vedoucí k danému cíli. FSM díky tomu ví, do jakého stavu se má přesunout a jaká data (například animace) aktivovat. Kupříkladu akce Úprk nastaví ve FSM stav Jdi (Goto) a přesně určí, kam že to má postava utéct. Je důležité si uvědomit, že tohle všechno se děje mnohem rychleji, než vidíme na obrazovce. AI logicky zadá příkazy předtím, než činnost vidíme na obrazovce a uvolní pak místo provedení animaci, hotovo ale úplně nemá.

Je totiž důležité dodat, že kromě samotného plánování musí AI ještě kontrolovat, zda je provedení naplánované akce opravdu možné. Kontrola zahrnuje vše: cíle (goals), akce (actions) s jejich předpoklady (preconditions) a důsledky (effects). Pokud něco nefunguje, zvolí plánovač jiný postup. Příklad? Když postava plánuje otevřít dveře a mezitím je otevře někdo jiný, vrhne se raději na jinou aktivitu.

Výsledný efekt systému GOAP

Kromě toho, že systém GOAP tvůrcům v řadě ohledů rozvázal ruce, umožnil i mnohem dynamičtější chování nepřátel, kteří jsou ve FEAR schopni vyhodnocovat situaci a zvolit nejvhodnější akci. Přepínání mezi jednotlivými cíli má za následek i na první pohled racionálnější chování nepřátel.

Umělá inteligence se ve FEAR chová na pohled rozumně právě z toho důvodu, že vyhodnocuje priority aktuálních cílů. S výjimkou skriptovaných postav, jako je děsivá dívenka Alma nebo ostatní hlavní aktéři, nedělá AI nic bezdůvodně. Autoři proto přidávali do kódu hry pro jednotlivé postavy rozmanité cíle a akce k jejich dosažení.

FEAR zdroj: Foto: Monolith

Primárním cílem tu vždy rozhodně není Zabij nepřítele ani akce Střílej. Když zamíříte na vojáka, zvolí si cíl Uskoč a provede nejlogičtější sérii akcí (tedy ty s nejnižšími čísly podle algoritmu A*) k jeho dosažení. Nepřátelé se často schovávají v zákrytu, proto má cíl Kryj se před Zabij nepřítele většinou prioritu. Když se vám ukrytého vojáka podaří zasáhnout, začne na vás pálit skrze další naprogramovanou akci. Pokud mu jeho kryt zničíte, odebere se v rámci dalšího cíle na místo, které mu jakožto možný úkryt označili designéři.

Hlavním pozitivem celého systému je, že AI situaci vyhodnocuje na základě cílů a akcí. Normální situace je, že voják vejde do místnosti, uvidí hráče a začne střílet. Pokud se hráč postaví těsně před dveře, které voják nemůže snadno otevřít, pokusí se je vykopnout. Pokud i to selže, proskočí oknem. Opět tak můžeme vidět, že se AI snaží splnit určitý cíl pomocí akcí majících konkrétní předpoklady a důsledky.

Problémy s FSM v No One Lives Forever 2

Monolith vyřešil problém, který měly FSM v jejich předchozích hrách. V No One Lives Forever 2 GOAP aplikován ještě nebyl. Cíle jsou oddělené a rozdělení na třídy postav nebylo v programování AI řešeno efektivně.

Jeff Orkin, který programoval AI pro NOLF 2 i FEAR, vzpomíná ve své studii na pasáže, kdy vás v NOLF 2 naháněli policisté, kteří se po pár sekundách měli zadýchávat. Ačkoliv to platilo jen pro jeden typ postav, v rámci FSM to znamenalo, že v rámci stavu Pronásleduj muselo být uvedeno, aby systém zkontroloval, zda je úplně každá postava ve stavu Pronásleduj schopna honičku udýchat.

Podobný bolehlav způsobovalo programátorům i to, když se nepřátelé měli naučit rozsvěcet v místnosti zhasnutá světla. Implementace podobného detailu ve chvíli, kdy máte už tak košatý systém chování sestrojený v rámci FSM, byla velice složitá a potenciálně nebezpečná.

Orkin vzpomíná i na problém, kdy jste v NOLF 2 zastřelili NPC pracující u stolu. Výsledné stavy (říkejme jim klidně cíle) Smrt a Práce nebyly v rámci tehdejšího systému nijak propojeny. Výsledkem bylo, že postavička po zastřelení vstala od stolu a pak se dramaticky sesunula k podlaze.

Skupinová umělá inteligence ve FEAR

Vraťme se ale k FEAR. Jeho AI byla chválená mimo jiné i z toho důvodu, že se vaši nepřátelé chovají koordinovaně. Plánovač chování tu průběžně vyhodnocuje, jak jsou si jednotliví nepřátelé vzdálení. Pokud jsou dostatečně blízko, může jim dát v jednu chvíli maximálně jeden mód chování. 

Na výběr jsou celkem čtyři. Get-to-Cover má za následek, že se všichni vojáci odeberou do krytu a jeden z nich přitom spustí krycí palbu. Advance-Cover jim řekne, aby se přesouvali směrem k vaší pozici, zatímco jeden z nich po vás bude pálit. Orderly-Advance jim přikáže organizovaný postup v řadě za sebou, kdy poslední voják kryje jednotce záda. A nakonec Search rozdělí jednotku do dvojic, kdy vojáci systematicky prohledávají okolí a navzájem se kryjí.

AI dostane cíl odpovědět na rozkazy, načež vyhodnocuje, zda je přijme, nebo bude následovat individuální cíl. Logika vychází z toho, že vojákům není vlastní život lhostejný, tudíž se mohou dát na ústup, pokud jejich pozice není výhodná, byť jim plánovač naopak přikazuje pohyb vpřed.

Modelový příklad: Na mapě se odehrává přestřelka mezi hráčem a jednotkou vojáků. Hráči se povede zneplatnit (zničit nebo obejít) kryt jednoho z vojáků. Automaticky se spustí první mód chování, který vybere vojáka, který spustí krycí palbu a ostatním příslušníkům jednotky nakáže odebrat se do krytu. Umělá inteligence má senzory, které jsou schopné detekovat potenciální možnosti krytu pro každého vojáka, na plánovači je pouze, aby zamezil tomu, že se na stejné místo vydá více vojáků. AI vezme v úvahu všechny dostupné cíle a vyhodnotí ten nejlepší. Plánovač situaci monitoruje. Pokud se ústup povede, jednotka splnila cíl zadaný plánovačem. Pokud hráč ale například zamýšlený kryt zničí granátem, vyhodnotí AI jako lepší cíl individuální ústup.

Zajímavé na tom je, že čtveřice módů chování, které plánovač zadává, často v kontextu prostředí vytváří poměrně zajímavé situace, které budí zdání ještě pokročilejších bojových taktik jako nadbíhání anebo sevření hráče ve formaci do kleští. Jedná se však o vedlejší efekt dynamické kombinace zmíněných typů chování, vlastní umělé inteligence, charakteru mapy a polohy hráče.

Komunikace pro zesílení efektu AI

Autorům bylo jasné, že aby hráčům lépe zprostředkovali zážitek pramenící z kvalitní umělé inteligence, je třeba, aby spolu vojáci verbálně komunikovali. Zmíněný plánovač chování tak zároveň rozhoduje o tom, co si mají vojáci v daný moment sdělovat. Komunikace v hráči posiluje falešný pocit, že bojuje proti skutečným, racionálním bytostem, jejichž chování neovlivňuje počítačový program.

Že komunikace slouží jako důležitý doprovodný efekt pro AI, dokazují na svou dobu inteligentní vojáci v původním Half-Life, z novější doby pak třeba The Last of Us: Part II, kde na sebe nepřátelé volají dokonce konkrétními jmény.

FEAR zdroj: Foto: Monolith

Monolith ve FEAR upřednostňoval mezi vojáky dialog, aby tak podtrhl jejich koordinované chování. Jiné hlášky zase hráče upozorňují na to, že postava si je vědoma konkrétní situace. Co se týče budování atmosféry, funguje to na výbornou.

Zdroje pro samostudium

Nejdůležitějším podkladem pro vznik článku byl už jednou citovaný příspěvek programátora FEAR PhD. Jeffa Orkina, který jej připravil pro GDC 2006. Kdo má zájem, může si dokument přečíst zde, zajímavé video a článek rozebírající umělou inteligenci v této hře připravil i Tommy Thompson pro kanál AI and Games.

V souvislosti se staršími hrami často slýcháváme o případech, kdy jejich ovládání, design nebo grafika příliš zestárly, jindy jsou naopak označovány za nadčasové. Je zajímavé, že se o tom příliš nemluví v souvislosti s AI.

Ačkoliv i umělá inteligence ve hrách urazila za dobu své existence nesporný kus cesty, často musela ustupovat potřebám grafiků. Jak postupně ubývá prostor nabízet stále detailnější, realističtější vizuál a čím dál rozlehlejší světy, mohly by to být právě zásadní pokroky v AI, které hry posunou o kus dál.

Nejnovější články