Machinations Tutorial II. – Feedback loop
Vydal Michal Roch v Game design, Machinations, Top, Tutoriály, workshopyDnes se podíváme na prvky Machinations podporující herní mechanismus zvaný Feedback Loop. Ukážeme si, jak pomocí bran a modifikátorů dynamicky měnit výsledky grafu a povíme si také něco o rozhodčích a vrátíme se k druhé části modelu z předchozího dílu, simulující umělou inteligenci. |
State(Stavový modifikátor)
Jedním ze základních herních mechanik je takzvaný feedback loop. Zjednodušeně řečeno se jedná o mechaniku, kdy množství jedné suroviny má přímý nebo nepřímý dopad na surovinu jinou. Například čím více dělníků hráč bude mít, tím více zlata vytěží. Nebo naopak: čím více koulí v kulečníku potopí, tím obtížnější je pro něj trefit další a získat více bodů. Je vidět, že surovinou nemusí být jen body nebo zlato, ale i počet koulí na hracím stole.
Například když má hráč hodně dělníků, počet přijímaného zlata se zvýší. Jak si jistě vzpomínáte, příjem se znázorňuje pomocí proudů. Existuje tedy přímá vazba mezi hodnotou proudu (počet surovin, které proudí) a počtem surovin ve skladu (počet dělníků). K vyjádření této vazby slouží stavový modifikátor. Existuje mnoho typů smyček, ovšem většina z nich je docílena právě pomocí tohoto nástroje.
Stavový modifikátor rozlišujeme podle funkce na 4 typy:
- Modifikátor elementu (Node modifier)
- Modifikátor hodnoty (Value modifier)
- Spouštěč (Trigger)
- Aktivátor (Activator)
Každý z nich se liší formátem labelu podobně, jako se liší proud.
Modifikátor elementu
Modifikátor elementu je takový modifikátor, který propojuje dva sklady. Zde vzniká přímá vazba, kde jakákoli změna surovin v jednom skladu ovlivní přímo počet surovin ve skladu druhém.
Typ | Hodnota | Příklad | Efekt |
Modififkátor | +x,-x | +5, +1, -3 | Cílovému skladu je přičteno x surovin za každou surovinu ve zdroji |
Zlomek | +x/y, -x/y | + 5/4, +3/2, -1/3 | Počet surovin cílového skladu je vynásoben počtem surovin zdrojového skladu a hodnotou modifikátoru |
Pozn.: doporučuji se vyhýbat situacím kdy v cyklu přičítáte prvky skladům v nekonečném kruhu. Aplikace vám spadne 🙂
Modifikátor hodnoty
Modifikátorem hodnoty je takový modifikátor, který propojuje sklad s proudem, nebo sklad s modifikátorem. Vzniká tak přímá vazba mezi počtem surovin a rychlostí proudění.
Všimněte si, že lze propojit i sklad s modifikátorem. Lze tak vytvořit několika úrovňová vazba mezi elementy. Toho se využívá i v našem prvním modelu v kombinaci s bránou.
Tip: pozorujte jak se mění hodnota proudu který je ovlivněn modifikátorem.
Vtah mezi skladem a proudem je definován labelem modifikátoru a může být těchto tvarů:
Typ | Hodnota | Příklad | Efekt |
Modifikátor | +x, -x, +x%, -x% | +2, -3, +0.2, -18%, 182% | Přičte k hodnotě labelu hodnotu modifikátoru |
Zlomek | +x/y, -x/y | + 5/4, +3/2, -1/3 | K cili je pricten dany zlomek surovin zdroje |
Interval | +xi, -xi | +2i, -3i | Přičte x za každou surovinu ve skladu k intervalu cíle (tedy jedná-li se o zlomek zvysuje jmenovatel) |
Trigger
Triggerem lze spojit takřka cokoli. Jeho účelem je vyvolávat akce ostatních elementů za určitých podmínek a je definovaný formátem labelu modifikátoru. Ten může být dvou tvarů:
Typ | Hodnota | Příklad | Efekt |
Trigger marker | * | * | Pakliže do zdrojového skladu přijde surovina, je trigger aktivován |
Pravděpodobnost | x% | 25%, 18% | Pakliže do zdrojového skladu přijde surovina, je trigger aktivován s pravděpodobností x |
Co znamená, že je trigger aktivován? Nic jiného, než že spustí akci cílového elementu. Například:
Kliknutím na sklad A dojde k přesunu suroviny do skladu B, čímž je uspokojen trigger a spouští akci skladu C. Mód skladu C je push any, tedy předá jednu surovinu do skladu D. Vzpomínáte, jak jsem psal, že i u pasivních skladů může záležet na jejich módu?
Kdybyste místo hvězdičky napsali např. 20%, nejprve by se náhodně vypočítala 20% šance a pokud by byla splněna, teprve pak by byl trigger uspokojen.
Aktivátor
Aktivátory jsou definovány formátem svého labelu v podobě podmínky. Ta může být dvou tvarů:
Podmínka | ==x, !=x,x, >=x | ==4, !=1,-2, >=-3 | Levá strana podmínky je počet surovin ve zdrojovém elementu. Je-li podmínka splněna, cílový prvek je aktivován |
Interval | x-y | 1-3,2-4,5-6 | Je-li počet surovin ve zdrojovém elementu v daném intervalu, cílový prvek je aktivován |
Mějte na paměti, že pokud v nějakém okruhu diagramu není a nemůže být přístupná ani jedna surovina, kaskádově se celá část diagramu zablokuje(je „mrtvá“). Odříznutím jednoho elementu diagramu, tak můžete odříznout i větší celky modelu.Co znamená, že je aktivován? Nic jiného, než že může a bude vykonávat své akce. Jde-li o automatický prvek, začne pravidelně vykonávat svou akci(push, pull, produkce zdrojů apod.). Jde-li o interaktivní prvek, hráči je umožněno jej ovládat. Jakmile se suroviny ve skladu změní tak, že podmínka není splněna, je cílový element opět zablokován.
A aby toho nebylo málo, máme tu jednu výjimku. Pakliže je zdrojem modifikátor brána (viz. níže), která ze své podstaty nemůže fungovat jako aktivátor protože nikdy neuchovává žádné zdroje, v případě formátu labelu ve tvaru podmínky nebo intervalu je namísto aktivace elementu pouze vyvolána jeho akce (tzn. nefunguje jako aktivátor ale jako trigger).
Aktivátory a triggery společně s bránou jsou nejzamotanější prvky celého frameworku. Doporučuji jim tedy věnovat velkou pozornost a pořádně si jejich možnosti vyzkoušet.
Více příkladů, jak modifikátory používat, najdete na oficiální wiki Machinations.
To je k modifikátorům stavu vše. Mimo jiné lze nastavit i barvu, tloušťku a minimální a maximální hodnotu. Tyto vlastnosti se však ničím neliší od stejnojmenných atributů zdrojového proudu a proto se přesuneme rovnou k dalšímu prvku: bráně.
Gate (Brána)
Brána je velmi důležitý a multifunkční prvek Machinations. Jeho základní vlastností je, že nikdy neshromažďuje suroviny a pouze je okamžitě redistribuuje do svých výstupních proudů. V případě, že je výstupem modifikátor stavu, funguje brána společně s modifikátorem jako takzvaný trigger.
Bránu definují čtyři základní vlastnosti:
Typ
Brána může být buďto pasivní, interaktivní, automatická či v módu OnStart. Princip těchto módů se ničím neliší od stejnojmenné skladu.
Mód
Na rozdíl od skladu, brána nabízí pouze dva módy: pull any a pull all. Přesto jsou z nějakého důvodu v nabídce módu brány i další dva. Ty se ovšem berou jako by brána byla v módu pull any. Funkce těchto modů se jinak v ničem neliší od skladu.
Výstupy
Každý výstup může pomocí labelu definovat podmínku, za jaké surovina projde danou cestou. Výstupem z brány může být buďto zdrojový proud, nebo stavový modifikátor. Je-li výstupem stavový modifikátor, surovina je zahozena a namísto toho je spuštěna akce cílového prvku (trigger, viz. výjimka uvedená výše). Při určování labelu rozlišujeme mezi pravděpodobností a podmínkou:
Typ | Hodnota | Příklad | Efekt |
Žádný | Bere se jako by byla hodnota labelu “1” | ||
Pravděpodobnost | x%, x | 10%, 4, 3, 6 | Definuje šanci, za jaké surovina projde danou cestou |
Výraz | ==x, !=x,x, >=x | ==2, !=2, >8 | Pokud vygenerovaná hodnota brány vyhovuje podmínce, surovina projde skrz |
Interval | x-y | 1-2, 3-5 | Pokud se vygenerovaná hodnota brány nachází v daném intervalu, surovina projde skrz |
Ostatní | else | else | Pokud vygenerovaná hodnota brány nevyhoví ani jedné podmínce, surovina je poslána cestou označenou jako else |
Distribuční mód
určuje, jakým způsobem je generována hodnota brány při průchodu suroviny. Může být dvou typů:
- Deterministická – v případě pravděpodobnostních výstupů rozděluje suroviny rovnoměrně s ohledem na jejich relativní váhu tak, že při každém průběhu diagramu vždy rozdělí suroviny stejným způsobem. V případě podmíněných výstupů při každém průchodu suroviny branou zvýší hodnotu brány o jedna a tato hodnota je použita pro vyhodnocení podmíněného výrazu určeného labelem. Při každém intervalu se přitom hodnota brány vynuluje a začne se opět zvyšovat od nuly. Je zřejmé, že se podmíněné výrazy mohou překrývat, nebo může nastat situace, kdy podmínku nesplní žádný proud. V takovém případě je surovina buďto rozmnožena nebo zahozena. Pokud součet pravděpodobností výstupních proudů nedá dohromady 100%, zbytek součtu určuje pravděpodobnost zahození suroviny.
- Náhodná – náhodná brána je definována náhodnou formulí jednoho ze 4 základních symbolů určených v nastavení diagramu. Tato hodnota může být dále upravována pomocí vstupního stavového modifikátoru. V případě pravděpodobnostních výstupů je výstup zvolen náhodně s ohledem na jejich relativní pravděpodobnost.
Zásadní rozdíl mezi deterministickým a náhodným distribučním módem je ten, že při deterministickém způsobu každé spuštění diagramu vyvolá stejný výsledek. U náhodného však nikoliv.
Všechno dohromady
Brána je vůbec nejzamotanější prvek celého frameworku. Umožňuje obrovské množství kombinací, ale pokud se v nich dokážete zorientovat, přijde vám velmi vhod. Zde je pár příkladů, jak bránu používat:
Více příkladů, jak bránu používat, najdete na oficiální wiki Machinations.
Tip pro zajímavost
Doporučuji se držet jen uvedených možností brány a nijak je vzájemně nekombinovat, brána se začne chovat silně nepředvídatelně.
Pokud chcete použít pravděpodobnost, použijte pravděpodobnost u všech výstupů. Chcete-li ji definovat pomocí váhy, definujte všechny výstupy jen pomocí váhy. A chcete-li používat podmínky a intervaly, používejte jen podmínky a intervaly a nepleťte do toho pravděpodobnost. Jednak k tomu není ani důvod a jednak si můžete být takřka jisti, že to nebude fungovat. Stejně tak nedoporučuji udávat pravděpodobnosti, jejichž součet přesahuje 100% a používat pravděpodobnost u deterministických bran.
Strávil jsem několik hodin zkoušením všech možných variant ale ať jsem se snažil sebevíc, nepodařilo se mi odhalit, jakým způsobem je při těchto bizardních kombinacích rozhodováno o průchodnosti brány.
EndCondition(Rozhodčí)
Vstupem rozhodčího může být libovolné množství stavových modifikátorů, přičemž všechny musejí být typu aktivátor (resp. jejich label musí být ve tvaru podmínky). Jakmile jsou všechny podmínky rozhodčího splněny, automaticky se ukončí diagram. Takto můžete jednoduše do svých diagramů zahrnout i podmínky určující vítězství té či oné strany.
Nyní se ohlédněme zpět k příkladu s distribucí surovin a zaměřme se na část s umělou inteligencí:
Prohlédněte si opět celý diagram a pokuste se identifikovat co nejvíc prvků a vlastností. Poté se vraťte a porovnejte si své poznatky s následujícím popisem diagramu.
Nejprve prozkoumáme brány. V diagramu jsou tři a všechny mají naprosto stejný účel a vlastnosti – simulovat stejná rozhodnutí, jaká by pravděpodobně učinil hráč. Všimněte si její konfigurace:
- Je automatická – v každém časovém intervalu (konec tahu) vygeneruje hodnotu brány a spustí svou akci.
- Její výstup je stavový modifikátor – společně s ním funguje brána jako trigger. Při každém úspěchu spustí akci cílového elementu.
- Je náhodná – generuje hodnotu náhodného výrazu definovaného symbolem hrací kostky.
- Její výstup je udán pravděpodobností – má vždy 50% pravděpodobnost na průchod.
Nyní si je všechny prohlédněte. Nevidíte na nich něco zvláštního? Pokud tipujete žádný vstupní proud, vyhráli jste. Za normálních okolností by automatická brána v každém tahu vyvolala akci specifikovanou módem brány (např. pull any). Skrze něj by natáhla surovinu a tu proměnila v šanci na spuštění triggeru. Tato brána ale žádný vstupní proud nemá. Namísto toho tedy vygeneruje hodnotu brány a pokusí se spustit alespoň triggery, zatímco výstupní surovinové proudy jsou ignorovány. Doporučuji ale dávat v takovém případě bránu vždy náhodnou. Pro deterministickou bránu nikde není napsáno, jak se bude za těchto okolností chovat a přestože produkuje zdánlivě náhodné hodnoty, není zaručeno, že jsou 100% náhodné.
Tímto mechanizmem můžete částečně simulovat umělou inteligenci hráče (mnohem lepší je použití scriptu ovšem o tom až později). Každá oblast má určenou určitou pravděpodobnost na investici, ke které dojde, má-li dost peněz a uspěje proti náhodě. Rozložením pravděpodobností pak dáte každé oblasti váhu, přičemž ty s největší vahou jsou nejdůležitější a je do nich tedy nejčastěji investováno.
Pro větší dynamiku rozhodování jsem přivedl ještě jeden stavový modifikátor, který ovlivňuje pravděpodobnost investice do výzkumu. Hodnota „-20%“ znamená, že s každou surovinou v majetku hráče se šance na investici do výzkumu sníží o 20%. Tím lze simulovat strategii, kdy v případě, že má hráč našetřeno dost peněz, mnohem více bude uvažovat o investici do dražší oblasti (zdroje) na úkor výzkumu. Pravděpodobnost investice do ekonomie ovlivněna není, neboť je tak důležitá, že do ní hráč investuje s určitou pravidelností (1x za kolo).
Jako poslední prvek si všimněte rozhodčího. Ten detekuje, kdo z hráčů jako první získal populaci větší než 30. Jakmile se ve skladu Population objeví 31 surovin, jsou uspokojeny všechny podmínky vstupních modifikátorů rozhodčího a ten tak ukončí diagram a rozbliká se na znamení svého rozhodnutí.
Brána společně s modifikátory jsou vůbec tou největší slabinou celého frameworku. Obrovské množství kombinací pro ně není nijak definováno, snadno se ve všech těch výjimkách a rozdílech ztratíte a občas dokážou být pěkně matoucí. Přesto jsou nedílnou součástí frameworku a při práci s ním se bez nich neobejdete. Proto si doporučuju je pořádně vyzkoušet, než se pustíte v tutorialu dál.
Příště se podíváme na ekonomiku ve hrách a 4 elementy Machinations pro jejich implementaci.
Nazdar, mne nefunguje ten triger kde namiesto * dam pravdepodobnost… napriklad 90%. Ani v priklade Warcraftu v Machinations Tutorial III. – Ekonomika ve hrách, kde sa ten trigger pouziva na attacked by enemy nefunguje. Pouzivam updatovany Chrome, flash je verzia 11,5,31,137 a je to na MacOSX 10.8.2. Ani v tomto clanku som o tej pravdepodobnosti nic nenasiel .. http://www.jorisdormans.nl/machinations/wiki/index.php?title=Trigger , kde moze byt chyba?
Ahoj, máš pravdu. Model v Machinations Tutorial III. obsahuje chybu kde daný trigger není v automatic ale passive módu. To znamená, že se náhoda generuje pouze při aktivaci brány, což se ale v tomto modelu neděje nikdy, tudíž výsledkem je, že se neděje nic. Pokud bych danou bránu nastavil na automatic, začala by se náhoda generovat v každém intervalu.
Napadají mě dva důvody, proč nefunguje i u tebe:
– Brána je nastavená na deterministickou – pak se nejedná o náhodu ale o procentuální poměr přerozdělování zdrojů (tzn. např. nejprve jde 40% do levé větve, poté 10% do prostřední a poté 50% do pravé). V případě, že je výstupním vztahem modifikátor (tedy jedná se o trigger), znamenalo by to, že 40% surovin je zužitkováno na spuštění triggeru atd. Tím, že ji nastavíš na náhodnou se dané procento stane náhodnou pravděpodobností
– Není automatic a ani triggerován jiným prvkem – viz můj případ.
Snad to pomůže:) Díky za zájem!
Diki, takze druhy pripad 😛 A inak super tutorial 🙂