Úvod
Nazdar čtenáři. Řádky, které právě čtete začínají sérii neformálních článků, které vám (samozřejmě pokud vás to bude zajímat), přiblíží aktuální dění při vývoji hry El Matador. Jmenuji se Petr Smílek a pracuji na Matadorovi jako hlavní programátor (tohle bohužel není moje jediná role v teamu, ale o tom budu psát radši až někdy příště, zatím si můžete myslet, že jsme zcela standardní firma :-))
Nikdy jsem žádné developer diary nepsal (zatím), takže si zvolím formu, které mě právě napadla a připadá mi originální. Budu sám sobě klást otázky, na které si záhy budu sám odpovídat, takže to bude celé vypadat jako F.A.Q. Bude to mít jednu výhodu a to tu, že pokud vás otázka nebude zajímat, tak ji prostě přeskočíte a půjdete na další. Dobrá, můžeme začít.
Kolik programátorů na El Matadorovi dělá? Na čem konkrétně kdo pracuje?
Na El Matadorovi od začátku až doposud dělají tři programátoři. Já, Honza a Petr. Celou programátorskou práci máme rozdělenou na poměrně nezávislé oblasti, takže si nelezeme do zelí. Honza pracuje na většině kódu týkajícího se high-level AI (to co nepřátelé vidí, slyší a co na základě toho dělají) a implementuje front-end část hry (user interface, invenory management, implementing various entity types). Taky je primárním autorem skriptovacího systému, který používáme. Petr řeší fyzikální simulátor, detekce kolizí, low-level motion planning & obstacle avoidance + vehikly (auta, vrtulníky apod.). Já jsem implementoval engine, který tvoří jádro našich her.
Kolik má program El Matadora řádků?
No, ne že by to něco znamenalo, ale lidé se občas na takovéto věci ptají. Kvalitu programu ovšem neurčuje počet řádků, spíš to funguje tak, že čím více řádků, tím více prostoru pro chyby. Podle toho, co zobrazí program Line Counter (http://noeld.com/programs.asp?cat=misc), máme prostoru poměrně dost :-).
Global Summary (42.5 MB, actual: 36.4 MB)
--------------------------------------------------------
Total number of lines: 1663728
Total number of lines of code: 950566
Total number of empty lines: 329478
Total number of comment lines: 199224
Total number of empty comment lines: 184460
--------------------------------------------------------
5349 file(s) processed.
Můžem vědět něco o AI ve hře?
Když se řekne AI nepřátel je buď dobré nebo špatné, obvykle se tím myslí dojem, jakým na hráče nepřátelští agenti působí. V žádném případě nelze mluvit o nějaké skutečné inteligenci (i když vám to budou všichni vývojáři ve svých prohlášeních vehementně tvrdit). Ve skutečnosti totiž u akčních her nezáleží ani tak na tom co a proč který agent dělá (což jsou samo o sobě taktická rozhodnutí, která inteligenci vyžadují), ale především na tom, jakým způsobem to dělá (žádoucí je samozřejmě způsob co nejefektnější).
V El Matadorovi pro AI používáme poměrně standardní techniky a algoritmy. K implementaci takzvaného terrain-reasoningu (schopnost AI rozumět světu ve kterém existuje), využíváme sítě tzv. waypointů. Waypointy jsou body v prostoru, které mají v sobě a mezi sebou vypočítány informace potřebné pro pohyb agentů v prostoru a pro získávání taktických informací o okolním prostředí. (viditelnost mezi waypointy apod.) Waypointů je v levelu několik tisíc (N), takže abychom mohli udržovat informace pro NxN waypointů musí být tato informace značně komprimována.
Pro samotnou implementaci nepřátelských agentů používáme Finite State Machines (FSMs). Tyto FSM mají přímou podporu v našem skriptovacím systému, takže jejich zápis a práce s nimi je velice jednoduchá a efektivní. Každý agent se může nacházet v jednom z mnoha stavů (idle, search target, fight apod.) a určitému stavu odpovídá určité chování. Určité (low-level) části AI agentů jsou psány přímo v C++, ale určitá část je naprogramována ve skriptovacím jazyku, takže některé modifikace a zásahy do AI nevyžadují změnu hlavního programu.
Posledním prvkem, který využíváme a o kterém se zmíním jsou takzvané rule-based systémy. Tento systém nám umožňuje nadefinovat soubory pravidel (opět ve skriptu), pomocí kterých potom AI provádí rozhodování v určitých situacích.
Pro ilustraci výňatek ze souboru definice pravidel:
//#include "rules_defines.h"
OnSee
{
// See opponent ?
{
(in.ai_game_event_relationship == 1) && //
E_CG_RELATIONSHIP_OPPONENT
(!(in.ai_game_event_obj_flags & 1)) && //dead flag is not set
(in.ai_game_event_status == 1) && //
E_MEM_REC_STATUS_RECOGNIZED
(in.ai_game_event_last_tact_event != 20) //
E_TACTICAL_EVENT_ON_SEE_OPPONENT
:
out.ai_tactical_event_type = 20; //
E_TACTICAL_EVENT_ON_SEE_OPPONENT
out.ai_tactical_event_obj = in.ai_game_event_obj;
}
// See fighting friend ?
{
(in.ai_game_event_relationship == 2) && //
E_CG_RELATIONSHIP_FRIEND
(in.ai_game_event_obj_flags & 2) && //fight flag is set
(in.ai_game_event_status == 1) && //
E_MEM_REC_STATUS_RECOGNIZED
(in.ai_game_event_last_tact_event != 23) //
E_TACTICAL_EVENT_ON_SEE_FIGHTING_COLLEAGUE
out.ai_tactical_event_type = 23; //
E_TACTICAL_EVENT_ON_SEE_FIGHTING_COLLEAGUE
out.ai_tactical_event_obj = in.ai_game_event_obj;
}
…
Co skriptování? Kdo a jak skriptování realizuje?
Skriptovací systém je v dnešní době součástí každého vyspělého herního enginu. Některé enginy používají dostupné skriptovací systémy jako např. LUA, PYTHON apod., některé enginy včetně našeho používají vlastní skriptovací systém. Syntakticky je náš skriptovací jazyk odnož C++, s různými omezeními a naopak rozšířeními důležitými pro programování her (podpora FSM apod.).
V předchozím projektu byli nuceni level designéři v podstatě přímo k programování a to se všemi problémy, které k programování patří. Prvním problémem bylo zvládnutí syntaxe a osvojení si programátorského způsobu myšlení. Dalším a mnohem fatálnějším problémem byla délka cyklu “write - test – modify”. Pokud například chtěl designér změnit chování určitého agenta v levelu, musel otevřít příslušný skript, napsat část programu odpovídajícího novému chování. V tomto programu samozřejmě udělal nějakou syntaktickou chybu, což se dozvěděl až při opětovném spuštění hry, které trvalo minimálně 30 sekund :-(. Asi si dovedete představit, že pokud bylo v levelu 50 agentů, každý měl skript s pár stovkami řádků, na kterých často čekaly chyby, které bylo možné odhalit až v určitém momentu při hře, byla práce s tímto systémem velmi frustrující.
Během vývoje El Matadora jsme přešli na zcela nový přístup ke skriptování. Základem současného skriptování event-based entitový systém. Každý objekt, který se nějakým aktivním způsobem podílí na hře má dle své funkce přiřazen tzv. entity class. Tato entita potom definuje množinu parametrů a události (events) objektu. Tento systém je velice podobný tomu, jaký používá Half Life 2.
Veškerá editace pro designéry potom probíhá vizuálně a zcela odstraňuje problémy se syntaktickými chybami a chybnými referencemi ve skriptech, protože designéři žádné skripty nepíšou. Efektivita skriptování se touto cestou mnohonásobně zvýšila. Stále existuje určitá část hry, která je psána přímo ve skriptovacím jazyku, ale tu udržují programátoři. Systém umožňuje rozšiřitelnost funkčnosti hry (přidání nových entit, rozšíření funkce entit apod.) bez nutnosti zásahu do programu. Naším cílem je vytvořit pokud možno co nejvíce data-driven architekturu, ale o tom jaké výhody přináší a jak konkrétně je realizována možná napíšeme zase příště.
To je pro dnešek všechno. S některými se možná uvidíme příště :-).