Cieľom tejto stránky je opísať proces spracovania high skillov a low skillov (spravidla býva jeden low skill na jeden XML súbor, čiže to čo my voláme “pohyb” je low skill) od načítania až po vykonanie plánovačom. Kód ktorý sa na tom podieľa je dosť roztrúsený a veľmi zle alebo vôbec okomentovaný. Tento dokument by mal tvoriť základ pre návrh procesu plánovania a tvorby zložitejších pohybov - high skillov.
Určité veci sa od napísania tohto dokumentu zmenili a nestihol byť ešte updatnutý. Konkrétne sa jedná o:
Niektoré z tried existujú aj v Jave a rovnaké alebo podobné triedy sú aj v Ruby skriptoch. Preto u každej z tried pri prvom spomenutí uvediem, v akom jazyku je napísaná. Pri triedach LowSkill a HighSkill to budem uvádzať vždy. V nasledovnom zozname vidno čo budem písať a čo tým myslím:
Diagram týchto a niektorých ďalších tried vidno na nasledovnom obrázku
Nevidno tu kompletné diagramy tried, sú vybrané len časti (metódy atď.) relevantné pre tento dokument.
Z XML sú načítané Java-LowSkill a Phase, pričom sa k nim dá dostať pomocou ich jedinečného mena.
Ako vidno, abstraktná (prakticky, nechcem teraz riešiť detaily ohľadom jazyka) trieda Ruby-HighSkill dedí abstraktnú triedu Java-HighSkill. Okrem toho že obsahuje metódu na získanie Java-LowSkillu skillu podľa mena (volá sa get_skill, to potom v obrázku fixnem) je to len veľmi tenký obal okolo Java-HighSkill triedy - nič iné navyše v nej nie je.
Túto triedu dedia konkrétne high skilly, ktoré sú implementované v ruby, napríklad Beam, ktorá sa používa na počiatočné umiestnenie hráča.
Z pohľadu tohto dokumentu je najzaujímavejší z týchto “high skillov” ten v triede Ruby-LowSkill. Jedná sa o high skill, ktorého jedinou úlohou je vykonať vybraný Java-LowSkill. Opäť obsahuje veľmi malé množstvo kódu - jediné čo robí je, že vyberie Java-LowSkill v konštruktore a zabezpečí aby sa vykonal len raz.
Tieto podmienky sa kontrolujú pri načítavaní z XML
Hlavný cyklus, bežiaci po inicializácii a načítaní všetkých potrebných vecí, prebieha zjednodušene nejak takto
Všetko spracovanie pohybov je tak volané z metódy control v triede Plan.
XML súbory s low skillmi a fázami musia pre použitie v high skilloch okrem vyššie uvedených požiadaviek spĺňať nasledovné
Pri skončení každej isFinal fázy sa volá pickLowSkill. V prípade, že sa vráti null (čo značí koniec celého high skillu), alebo iný než súčasný low skill, finalizuje sa súčasný low skill a následne sa vyberie nový. V prípade že pickLowSkill vráti súčasný low skill, pokračuje sa next fázou a finalizácia sa nevykoná.
Ruby-LowSkill vždy pri druhom a ďalšom volaní pickLowSkill vracia null, takže vždy finalizuje pohyb pri prvej príležitosti. Toto dokonca viedlo k odtráneniu isFinal vlastností z mnohých XML súborov - tie tam treba vrátiť.
Na testovanie cyklických pohybov ako je chôdza bol vytvorený nový HighSkill s názvom CyclicHighSkill, ktorého metóda pickLowSkill vždy vracia ten istý lowSkill. Tiež som vytvoril testovací high skill s názvom LinkedHighSkill, ktorý používa pole pohybov.
walk.rb bol upravený aby využíval nové pohyby
High skilly sa dajú písať v ruby aj v jave. Musia dediť triedu Java-HighSkill
Hlavou úlohou je implementácia metódy pickLowSkill. Tá sa bude volať na začiatku vykonávania pohybu a zakaždým, keď skončí fáza s isFinal=true.
Vrátiť musí objekt triedy Java-LowSkill.
Metóda checkProgress sa volá aj počas priebehu fázy, ak fáza ešte neskončila. Vyhodením výnimky by mala môcť ukončiť high skill bez čakania na finalizáciu fázy low skillu. To je použíteľné napríklad ak agent spadol.
Nasledovný diagram znázorňuje zjednodušený hlavný cyklus agenta so zameraním na vykonávanie naplánovaných high skillov. Prerušovaná čiara znamená, že high skill prejde do nového stavu. Kód v tomto novom stave sa však nevykoná ihneď, ale až v nasledovnom cykle. Metódy pickLowSkill a checkProgress, ktoré treba pre high skilly implementovať, sú zvýraznené. Notácia je viacmenej vymyslená, ale snáď je jasné, čo ktorá časť znamená.