-
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 takovém assetu 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 editorem assetů typu DialogueGraph. Bude podporovat grafický návrh dialogů. V následujícím mockupu lze vidět příklad hotového grafu pro jednoduchý dialog. Zelené vrcholy reprezentují něco, co říká hlavní postava, červené vrcholy reprezentují něco, co říká NPC. Fialkový vrchol je komentář a šedé vrcholy ovládají průběh dialogu.

Upozorňujeme, že se jedná pouze po mockup, finální editor může vypadat zcela odlišně. Vrcholy jsou mnoha různých typů, ale mají dvě věci společné – každý může obsahovat komentář pro podrobnější pospá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 může obsahovat název (v horní části vrcholu, v příkladu text „Main hub“ u výběru odpovědi). Pokud není řečeno, vrcholy mohou mít více vstupních a jen 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 pont – jako main entry point, ale není v grafu defaultně, může jich být víc a musí mít jméno. Reprezentují další místa, ve kterých může dialog začít.
-
Player line – reprezentuje něco, co říká hlavní postava. Barevně odlišena 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 vybrat si, 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ý tento potomek musí být buď typu Player line, Player line option. nebo to musí být vrchol typu podmínka. Ta podmínka má pak stejná omezení na typ potomků, jako Player line selection. Při vyhodnocování tohoto vrcholu se pak prozkoumají všichni potomci. Vyberou se všichni potomci typu Player line a Player line option. Podmínky se vyhodnotí, po té větvi, která platí, 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 typu Player line nebo Player line option 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.
-
Increment/Decrement/AddConstant/MultiplyConstant/SubtractConstant/DivideConstant/Add/Multiply/Subtract/Divide Int/Float/ property – Pro každou operaci a každý typ je definován vlastní typ vrcholu. Jako proměnné umí využívat pouze proměnné z nějakého questu ve storyenginu. Umi je nastavit na určitou hodnotu, inkrementovat, dekrementovat, dělat základní aritmetiku s konstantami a základní aritmetiku s dalšími story engine proměnnými.
-
Set Int/Float/Bool/String to Constant/Variable – Pro každý typ proměnné a pro Constant/Variable je definován vlastní typ vrcholu. Nastaví proměnnou ze story enginu na danou hodnotu, buď konstantu, nebo na hodnotu jiné proměnné ze story engine.
-
Invert bool property – Nastaví bool proměnnou na true pokud byla false nebo na false, pokud byla true.
-
Set quest flag – Nastaví flag v nějakým 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, jen může pořádně vysvětlit, 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ů etc.
-
Fire event. – vyvolá nějakou událost definovanou na nějakém Story engine questu. Předpokládá se, že nějaký blueprint ji poté vyřeší,
-
Set Player/NPC animation state – Změní animační stav buď hráče nebo NPC.
-
Reset Player/NPC animation state – Vráti animační stav hráče či NPC na defaultní stav.
Zřejmě jste si všimli, že zde nejsou definovány žádné složitější animační funkce. Pokud potřebujete uprostřed dialogu udělat něco složitějšího, v mockupu se například spustí rvačka s obchodníkem, musíte vyvolat nějakou událost, ukončit dialog a handling té události pak na konci toho všeho 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á, počítá se, že v tomto souboru budou jen monology hlavní postavy
-
LabelsAreEntryPoints – Bool, defaultně false. Pokud je true, každý vrchol z názvem je zároveň i entry pointem a dialog editor může začít dialog v tom daném bodě.
-
ForceExplicitExitNodes – Bool, defaultně true. Pokud je true, graf by měl vždy končit vrcholem typu Exit. Nesmí se dát jakýmkoliv způsobem do situace, že evaluace grafu skončila jinak než dojitím do Exit vrcholu.
Graf také bude podporovat validaci. Validace projde celý graf, ověří, že všechny vrcholy jsou propojeny s nějakým entry pointem (či vrcholem s názvem, pokud LabelsAreEntryPoints je true), že se nejde dostat ven z grafu jinak než exit pointem, pokud ForceExplicitExitNodes je true, že jsou definováný všechny konstanty, které mají 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. Bude přístupný přes Game instance (LINK TO ARTICLE ABOUT OUR GAME INSTANCE). Blueprint skripty pak budou moci spustit dialogy přes Dialogue Controller. Vyberou DialogueGraph, co se má pustit, entry point, ze kterého se má začít a zbytek už obstará Dialogue Controller.
Dialogue Controller se bude dělit 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 projití 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. Bude podporovat 2 hlavní metody:
-
ShowDialogueLine, metoda, co zobrazí část dialogu uživatel. Argumenty:
-
Dialogue Line Data: Strukltura, 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 bylo audio nil. 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, co dá hráčovi možnost vybrat si, jak pokračovat v dialogu. Argumenty:
-
Options: Uspořádané pole stringů, které definuje, v 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, bere jeden argument, index možnosti, co si hráč vybral
-
Součástí pluginu bude jednoduchá implementace, které při implementaci půjde navolit některé proměnné, například obrázek pozadí dialogue boxu, font, barvy pro dialogy hráče a NPC. Vše, co nás napadne, že je jednoduše nastavitelné, bude nastavitelné. 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.