-
Notifications
You must be signed in to change notification settings - Fork 0
Dialog editor Analysis
Náš toolset bude samozřejmě podporovat i tvorbu dialogů (či monologů). Pro práci s nimi vytvoříme vlastní typ assetů jménem DialogueGraph. Assetů tohoto typu může být v jednom projektu více, v každém z nich pak může být uloženo libovolně mnoho dialogů mezi hráčem a maximálně jednou postavou. Tvorbu dialogů s více NPC najednou náš editor zatím podporovat nebude. Komponentu pro tvorbu těchto assetů nazveme Dialogue Editor, komponentu jejich zobrazování během hry nazveme Dialogue Controller. Obě tyto komponenty budou popsány v následujících podsekcích.
Dialogue editor bude podporovat grafický návrh dialogů v assetech typu DialogueGraph. V následujícím mockupu lze vidět příklad hotového grafu pro jednoduchý dialog. Zelené vrcholy reprezentují repliky hlavní postavy, červené vrcholy reprezentují repliky NPC. Fialový vrchol je komentář a šedé vrcholy ovládají průběh dialogu.

Upozorňujeme, že se jedná pouze o mockup, finální editor může vypadat zcela odlišně. Existuje mnoho různých typů vrcholů, dvě věci však mají společné – každý může obsahovat komentář pro podrobnější popsání toho, o co v textu jde (ve spodní části vrcholu, v příkladu je to text „Výhružka“ u druhé volby zleva) a název (v horní části vrcholu, v příkladu text „Main hub“ u výběru odpovědi). Pokud není řečeno jinak, vrcholy mohou mít více vstupních a nejvýše jednu výstupní hranu. Graf může obsahovat tyto typy vrcholů:
-
Main entry point – může být v grafu pouze jeden, nelze smazat, je v grafu standardně po vytvoření nového grafu. Nemůže mít vstupní hrany a má právě jednu výstupní. Reprezentuje místo, ve kterém dialog začne, pokud není specifikováno jinak.
-
Entry point – jako main entry point, ale není v grafu defaultně, může jich být víc a musí být pojmenován. Reprezentují další místa, ve kterých může dialog začít.
-
Player line – reprezentuje repliku hlavní postavy. Je barevně odlišen od ostatních komponent. Musí obsahovat lokalizovatelný text. Následující vlastnosti pak mohou, ale nemusí být definovány:
-
Animation state – Postava automaticky při dialogu změní animační stav na jednu z defaultních mluvicích animací dané postavy. Touto vlastností lze specifikovat konkrétní animaci, která se má při dialogu pustit. Trvá pouze po dobu animace.
-
Sound – Reference na namluvený text postavy. V rámci tohoto projektu negarantujeme podporu lokalizace zvukových assetů.
-
Duration – Float v sekundách. Pokud není definován sound, Duration definuje, jak dlouho zůstane text na obrazovce, než sám zmizí. 0 znamená, že text sám nezmizí nikdy.
-
Option text – Lokalizovaný string: Když si hráč vybírá, co jeho postava řekne, defaultně se jako možnost nabídne hlavní text tohoto vrcholu. Pokud je OptionText definován, zobrazí se místo toho OptionText.
-
Skippable – Bool, default true. Pokud je true, uživatel má možnost text přeskočit, jinak musí počkat, než doběhne.
-
-
Player line option – Barevně by měl vypadat jako Player line, ale má pouze lokalizovaný text, žádné jiné vlastnosti. Má se použít v případě, že výběr této možnosti nemá vyvolat žádný dialog, ale akce (například rozpoutání rvačky). V mockupu je to vrchol „(Zaútočit na obchodníka!)“.
-
NPC line – všechny vlastnosti stejné jako Player line, barevně odlišen od všech ostatních komponent.
-
Player line selection – Dává hráči možnost zvolit, co jeho postava řekne. Může mít více vstupních i více výstupních hran. Vrcholům na výstupních hranách říkáme potomci. Potomci jsou uspořádaní. Každý z potomků musí být buď typu Player line, Player line option, nebo to musí být vrchol typu podmínka. Tato podmínka má pak stejná omezení na typ potomků jako Player line selection. Při vyhodnocování tohoto vrcholu se prozkoumají všichni potomci a vyberou se všichni typu Player line a Player line option. Podmínky se vyhodnotí a po platné větvi se pokračuje dále, dokud se nenarazí na vrchol typu Player line nebo Player line option nebo dokud potomek existuje. Všechny tyto vrcholy pak Dialogue Controller nabídne hráči jako možnosti, co jeho postava může říct. Tento vrchol může mít také definovaný fallback, což je vrchol, který se má vyhodnotit, pokud se nenajde žádný platný potomek.
-
Set quest flag – Nastaví flag nějakého Story engine questu na true.
-
Save state – Uloží hru.
-
Goto ID – Při vyhodnocení se hned přejde na vrchol s daným ID.
-
Exit – Explicitně ukončí dialog.
-
If property equal/less/greater than variable/constant or else – Budou existovat vrcholy pro každý typ proměnné a pro každou možnost z equal/less/greater than a pro porovnávání s konstantami a jinými proměnnými. Pracuje pouze s proměnnými z nějakého Story engine questu. Má dvě výchozí hrany, jednu označenou jako true a jednu jako false.
-
Once – Jako if podmínka. Měla by být true, dokud není poprvé skutečně vyhodnocena. Tím skutečně je myšleno, že se nepočítá vyhodnocování kvůli tomu, jestli nabídnout odpověď hráči v rámci vrcholu Player line selection, jako vyhodnocená se počítá teprve v okamžik, když hráč tu konkrétní možnost vybere.
-
Comment – Barevně odlišena od ostatních vrcholů, nemá žádnou funkci, pouze dovysvětluje, co se v tuto chvíli děje. Mělo by to fungovat tak, že komentáře u vrcholů komentují jen ten vrchol, komentáře v Comment vrcholu komentují více věci, například kde se dialog odehrává, co dělá nějaká složitější skupina aritmetických vrcholů atd.
-
Fire event – Vyvolá požadovanou událost definovanou na daném Story engine questu. Předpokládá se, že některý blueprint ji poté vyřeší.
Pokud je třeba uprostřed dialogu provést složitější akci (v mockupu se například spustí rvačka s obchodníkem), musí být vyvolána odpovídající událost přes Story engine, ukončen dialog a handling této události na jejím konci musí dialog zase pustit.
Kromě těchto typů vrcholů je možno i definovat několik vlastností na samotném grafu, které se týkají všech vrcholů v tomto assetu:
-
Player character – Hlavní postava, která mluví v tomto dialogu. Pokud je v celém projektu jen jedna, použije se právě tato postava.
-
NPC – Postava, se kterou hráč mluví. Pokud není definovaná, předpokládá se, že v tomto souboru budou jen monology hlavní postavy.
-
LabelsAreEntryPoints – Bool, defaultně false. Pokud je true, každý vrchol s názvem je zároveň i entry pointem a dialog editor může spustit dialog v daném bodě.
-
ForceExplicitExitNodes – Bool, defaultně true. Pokud je true, graf by měl vždy končit vrcholem typu Exit, neboli evaluace grafu nesmí nikdy skončit jinak než vyhodnocením Exit vrcholu.
Graf také bude podporovat validaci. Validace ověří, že všechny vrcholy jsou propojeny s nějakým entry pointem (či vrcholem s názvem, pokud LabelsAreEntryPoints je true), že není možné dostat se z grafu ven jinak než exit pointem, pokud ForceExplicitExitNodes je true, že jsou definovány všechny konstanty, které mají být splněné a že jsou všechny reference stále validní.
Bude kladen důraz na to, aby případné rozšíření Dialogue Editoru o nové typy vrcholů bylo co nejjednodušší.
Dialog Controller bude součástí runtime, přístupný přes GameInstance. Blueprint skripty pak budou moci spustit dialogy přes Dialogue Controller. Vyberou DialogueGraph, který se má pustit, entry point, ze kterého se má začít, a zbytek už obstará Dialogue Controller.
Dialogue Controller se dělí na dvě základní části: Dialogue Executor, který bude procházet graf, a Dialogue Presenter, který bude dialogy zobrazovat hráči.
Dialogue Executor bude mít na starosti průchod DialogueGraph assetu. Začne ve specifikovaném Entry pointu (nebo v Main entry pointu, pokud Entry point nebyl zadán) a po hranách bude procházet graf. Funkce jednotlivých vrcholů byla popsána v popisu Dialogue Editoru. Dialogue Executor bude napsán obecně, aby bylo rozšíření o nové typy vrcholů co nejjednodušší. Dialogue Executor pak bude na Dialogue Presenteru volat příslušné metody, když bude potřeba zobrazit nějaký text či dát hráči na výběr, jaký text chce zobrazit.
Dialogue Presenter bude mít na starosti zobrazení dialogu hráči. To zajistí 2 hlavní metody:
-
ShowDialogueLine - metoda, která zobrazí část dialogu uživateli. Argumenty:
-
Dialogue Line Data: Struktura, co obsahuje vše nutné ke spuštění části dialogu (TODO: K zamyšlení, měla by být definována přes template? Nebo by měla mít nějakou property void* UserInfo? Bylo by fajn, aby vývojáři mohli posílat argumenty navíc):
-
Text: Text, který se má zobrazit hráči.
-
Audio: Audio soubor, který se má pustit.
-
Duration: Jak dlouho má být text na obrazovce, pokud nebyl zadán audio soubor. 0 pro dialog, co sám od sebe nikdy neskončí.
-
Skippable: Bool, pokud je true, uživatel má mít možnost text přeskočit.
-
-
Callback: Zavolá se, když část dialogu z jakéhokoliv důvodu skončí.
-
-
ShowDialogueOptionSelection - metoda, která dá hráči možnost vybrat další repliku v dialogu. Argumenty:
-
Options: Uspořádané pole stringů definující, které možnosti a v jakém pořadí uživatel má. (TODO: Znovu se zamyslet nad user defined daty, pro naše potřeby toto stačí, ale třeba v ME by bylo potřeba ještě předávat barvičky, jestli lze možnost vybrat a pozici na kole).
-
Callback: Zavolá se, když si uživatel vybere, jako argument bere index zvolené možnosti.
-
Součástí pluginu bude jednoduchá implementace s možností konfigurace některých proměnných, například obrázku pozadí dialogue boxu, fontu, barvy pro dialogy hráče a NPC, a dalších snadno nastavitelných aspektů. Nicméně stejně předpokládáme, že vývojáři budou spíše využívat vlastní implementace této třídy a tuto generickou budou používat spíše jako referenci.