-
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.
Každý předmět bude reprezentován jedním blueprintem, který bude dědit od třídy AdventureGameItem. Na něm budou definovány vlastnosti toho předmětu, ale nebudou na něm informace o tom, kde je na scéně, jak je na scéně reprezentován etc. Konkrétně na něm budou tyto metody vlastnosti:
-
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.
-
Examine – Defaultní implementace spustí ExamineDialogue, ale bude možné toto chování overridenout.
-
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.
-
UseActionName – Lokalizovatelný string, název Use akce, defaultně nil.
-
Use – Use akce tohoto předmětu – Defaultně nedělá nic, pokud je IsUsable true, bude potřeba vytvořit vlastní implementaci.
-
Categories – 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 předmětů, 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. Každá kombinace bude mít tyto argumenty
-
CombinationName – Jméno akce, co se vykoná, defaultně nil. Například nůž a 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 a mluvicí meč může být TalkAction.
-
Combine – akce, co se má provést při této kombinaci. Defaultně nil, je třeba vytvořit vlasntí implementaci.
-
-
GetCombinationWithItem – Jako argument bere další předmět, vrátí kombinaci, pokud existuje, nebo nil, pokud neexistuje.
-
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.
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 vývojáři vytvoří vlastní. Implementace totiž jen musí za určitých podmínek volat metody z příslušné AdventureGameItem 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.