-
Notifications
You must be signed in to change notification settings - Fork 0
Inventory management Analysis
V adventurách se většinou vyskytuje mnoho předmětů, které hráč může sbírat, prohlížet, používat a kombinovat s jinými předměty. Pro snadnější implementaci této práce s předměty náš plugin nabídne několik tříd.
TODO: Zamyšlení – vyčlenit práci s kombinacemi jako separe třídu?
InventoryRegistry bude typ data assetu, který bude obsahovat záznamy o předmětech ve hře. Může jich existovat více, například můžou být rozděleny podle kapitoly. Budou zde uloženy všechny informace, které jsou platné pro předmět bez ohledu na to, kde se zrovna nachází. V levé části editoru bude seznam všech předmětů, které jsou v současné době zaregistrovány, tedy všech předmětů ve hře. A půjde v něm i nové předměty přidávat. Po vybrání předmětu se v pravé části obrazovky zobrazí detaily daného předmětu. Těmto datům říkáme Item Data. Každý předmět bude mít následující vlastnosti:
-
Class – Blueprint třída, která řídí chování tohoto předmětu. Defaultně třída definovaná ve World Settings (TODO: LINK). Půjde snadno vygenerovat podtřídu, která bude definovat vlastní chování (vlastní akce atd.).
-
Name – Lokalizovatelný string – název tohoto předmětu.
-
ExamineDialogue – Bude obsahovat dvě podproměnné – DialogueGraph a EntryPoint, které společně definují dialog, který se má spustit při prozkoumání předmětu.
-
IsExaminable – Pokud je true, tento předmět lze prozkoumat a má na něm smysl volat akci Examine.
-
IsUsable – Pokud je true, předmět lze použít sám o sobě, Use akce má něco dělat.
-
UseActionType – Má smysl pouze v případě, že Usable je true, defaultně nil. Pokud je nil, bere se default z World Settings. Definuje akci, která je pro tento předmět ekvivalentem použití. Například normálně použití může být jeden typ akce, ale pro mluvící meč může být použití promluvení si s mečem, tedy jiný typ akce.
-
Category – Kategorie předmětu, například zbraň, kniha, mapa atd. Definovány v rámci World Settings (odkaz), zde se vybírají všechny kategorie, které předmětu lze přiřadit.
-
Combinations – seznam všech entit, se kterými lze předmět kombinovat. Pokud zde přidám nějakou kombinaci s nějakým dalším předmětem, zobrazí se tato kombinace i u toho druhého předmětu. Tam ji ale nebude možné modifikovat, jakákoliv modifikace musí proběhnout na tom předmětu, kde byla kombinace založena. Ke každé kombinaci půjde přiřadit jméno jako lokalizovatelný string. Kombinace nebudou jen s předměty – defaultně se v tomto seznamu budou zobrazovat i postavy a kategorie. Mělo by být snadné modifikovat kód tak, aby nabízel více možností kombinací. Příklad kombinace s kategorií - například provázek může jít přeříznout libovolným předmětem z kategorie ostrých předmětů. Kombinace lze přidávat pouze v případě, že je pro předmět vygenerována vlastní třída, v takovém případě automaticky do blueprintu přidá event, že daná kombinace byla spuštěna (TODO: Možná by bylo fajn mít i možnost vytvořit i kombinace kategorií – třeba kategorie zvíře + zbraň udělá hlášku o týrání zvířat – a kombinace kategorií s postavami. Vymyslet, kde je definovat…). Každá kombinace ještě bude mít tyto argumenty
-
CombinationName – Jméno akce, co se vykoná, defaultně nil. Například nůž + lano může mít název „Přeříznout lano“
-
CombinationActionType – Akce, co tato kombinace představuje. Například nůž + lano může být UseAction, zatímco slovník + postava může být TalkAction.
-
-
InventoryIcon – ikona tohoto předmětu v inventáři.
-
OnPickup – Event Dispatcher, který se vykoná v okamžik, kdy je tento předmět přidán do inventáře.
-
OnRemoved – Event Dispatcher, který se vykoná, když je tento předmět z inventáře odebrán.
Na této třídě budou definovány všechny metody, které pak předměty mohou overridenout, aby daly předmětům vlastní chování. Vývojář ji bude moci overridenout, udělat vlastní defaultní chování – která třída pak bude opravdu tou defaultní půjde zjistit ve World Settings (TODO: Odkaz). Bude mít zároveň referenci na Item Data daného předmětu v Inventory Registry. Jedná se o tyto metody:
-
GetName – vrátí název předmětu, defaultně vezme Name z Item Data.
-
ExamineAction – akce examine defaultně spustí ExamineDialogue z Item Data, ale třídy mohou implementovat i vlastní chování.
-
UseAction – použití předmětu, žádné defaultní chování, třídy musí implementovat vlastní chování.
-
IsUsable – defaultně vrátí hodnotu z Item Data. True znamená, že předmět lze použít.
-
OnPickup – zavolá se, když postava předmět přidá do inventáře. Defaultně žádné chování.
-
OnClick – zavolá se, když uživatel klikne na předmět. Default: Pokud nemá předmět isUsable, zavolá se DescriptionAction. Pokud má isUsable, zavolá se UseAction.
-
GetInventoryIcon – vrátí ikonu, která se má zobrazit v inventáři. Defaultně vrací InventoryIcon z Item Data
-
IsCombinableWith – Bere jeden argument, vrátí true, pokud je tento předmět kombinovatelný s danou entitou.
-
GetCombinationWith – Bere jeden argument, vrátí kombinaci s daným předmětem nebo nil.
Inventář je označení pro všechny předměty, co právě herní postava vlastní. Většinou ho lze nějak zobrazit hráči, lze v něm vidět všechny posbírané předměty a lze je používat, prohlížet, manipulovat s nimi atd. Práce s ním během hry bude rozdělena na dvě části – Inventory Manager, který bude umět pracovat s tím, které předměty v inventáři jsou, bude umět další předměty přidávat atd., a Inventory Presenter, který bude inventář zobrazovat hráči a dovolí mu s předměty manipulovat. K oběma těmto třídám bude přístup skrze naši GameInstance (TODO: Link).
Tato třída bude spravovat, které předměty má v dané chvíli která postava. Bude podporovat serializaci během ukládání hry. Bude mít tyto metody:
-
GetInventory – Vrátí třídu pro práci s inventářem. Používá se, když existuje jen jedna herní postava.
-
GetInventoryForPlayerCharacter – Vrátí třídu pro práci s inventářem dané postavy. Používá se, když existuje více herních postav.
Samotný inventář bude reprezentován třídou Inventory, která bude mít následující metody:
-
GetItems – vrátí seznam všech předmětů, které jsou v daném inventáři.
-
AddItem – Přidá daný předmět do inventáře.
-
RemoveItem – Odebere daný předmět z inventáře.
-
InventoryChanged – Event Dispatcher, který se zavolá v případě změny tohoto inventáře.
Tato třída dokáže vizuálně zobrazit daný inventář. Bude se jednat o interface s dvěma metodami – ShowInventory (zobrazí daný inventář) a HideInventory (skryje daný inventář). V našem pluginu bude vzorová implementace, která bude mít následující funkce:
-
Zobrazení ikon všech předmětů v daném inventáři.
-
Kombinování předmětů přetáhnutím ikony jednoho předmětu na další předmět.
-
Zavolání UseAction po kliknutí, pokud má předmět IsUse na true, jinak zavolání ExamineAction po kliknutí.
-
Update inventáře po přidání nebo odebrání předmětu.
Další funkcionality, jako například automatické skrývání inventáře za nějakých podmínek, už jsou specifické pro danou hru a vývojář si je bude muset implementovat sám.
Předměty na scéně musí umět s výše definovanými daty o předmětech pracovat. Neboť ovšem tato práce s předměty už je velice specifická pro danou hru, bude k dispozici jednoduchá implementace pro rychlé prototypování, ale očekáváme, že si hry vytvoří vlastní. Implementace totiž jen musí za určitých podmínek volat metody ze třídy, ale ty podmínky jsou už příliš specifické – jinak se aktivují předměty ve 2D a 3D, v některé hře může být klik pravým tlačítkem prozkoumání a klik levým tlačítkem použití, v jiné hře může být první klik prozkoumání a druhý klik použití atd. Naše vzorová implementace bude pouze mít následující funkci:
- Po prvním kliknutí na předmět zavolá akci Examine, po druhém předmět přidá do inventáře a odebere ze scény.