GCM – Maj: Angular RPG. Używanie przedmiotów i ekwipunek.

W ostatniej aktualizacji, do gry doszły przedmioty. Mogą one znajdować się na mapie od początku gry, lub pojawić się w trakcie rozgrywki jako łup z potworów.

Gracz do tej pory mógł jedynie podnosić i upuszczać przedmioty. Teraz może ich również używać. Jeżeli dany przedmiot jest częścią ekwipunku (broń lub pancerz), użycie go polega na założeniu tego przedmiotu do odpowiedniego ‚slota’. Jeżeli użyty przedmiot to przedmiot specjalny, wynik skorzystania z oniego może być przeróżny.

Jak stworzyć grę w JavaScript

Aby przetestować aktualną wersję gry, wystarczy kliknąć w obrazek powyżej. Jak zawsze, pełny kod dostępny jest na moim koncie github. Zachęcam do przejrzenia całości na własną rękę, ponieważ tak jak ostatnim razem, nie będę omawiał wszystkich zmian. Jeśli coś będzie nie jasne, daj znać w komentarzach, chętnie rozwieję wszelkie wątpliwości.

To tyle jeśli chodzi o wstęp, czas na konkrety. Zacznę od zawartości nowego pliku itemService.js. Jak łatwo się domyślić, zawiera on serwis z danymi o przedmiotach. Oto jego treść:

Dla czytelności usunąłem część kodu. Nie ma potrzeby opisywania każdej linijki. Serwis zawiera tylko jeden obiekt: items. Wartości tego obiektu reprezentują wszystkie dostępne w grze przedmioty. Są one opisane kilkoma polami, które definiują ich zachowanie podczas rozgrywki. Serwis ma też wstrzyknięte dwie zależności: główny serwis oraz serwis lokacji.

Obiekty wewnątrz items, przypisane są do kluczy równych nazwie przedmiotu. Ich wartości zawierają następujące informacje: typ przedmiotu (ekwipunek lub nie), miejsce w ekwipunku (pancerz, broń itp), w jakiej lokacji można użyć tego przedmiotu (all oznacza wszystkie lokacje), czy przedmiot jest jednorazowego użytku, teksty jakie wyświetlą się, gdy przedmiot zostanie użyty w odpowiednim i nieodpowiednim miejscu, funkcje jakie zostaną wywołane gdy przedmiot zostanie użyty w odpowiednim i nieodpowiednim miejscu.

Nie wszystkie z tych pól nie są wymagana dla każdego typu przedmiotów. Jeżeli pole jest zbędne, jego wartość równa jest undefined.

Na chwilę zostawię serwis przedmiotów i przejdę do kolejnej nowości, czyli widoku ekwipunku. W tym widoku gracz może zobaczyć te przedmioty, które ma aktualnie ‚na sobie’. Zanim jednak przedstawię treść odpowiednich plików, muszę omówić nowy element znajdujący się w serwisie gracza:

To tutaj definiuję co takiego ma wyekwipowanego gracz. Jak widać, istnieją cztery ‚sloty’ na ekwipunek: broń, pancerz, amulet i pierścień. każdy z tych slotów jest kluczem w obiekcie. Wartość pola to aktualnie używany przedmiot. Jeżeli jest ona równa undefined oznacza to, że ‚slot’ ten jest pusty.

Ok, w takim razie mogę przejść do widoku zawartego w pliku equipment.html:

A oto obsługujący ten widok kontroler znajdujący się w pliku equipmentCtrl.js:

Oba pliki są dość niewielkie. Widok po prostu wyświetla wszystkie sloty oraz przypisane do nich elementy rynsztunku. Jeżeli obiekt items z serwisu gracza, w którymś polu zawiera wartość undefined (sprawdza to metoda kontrolera hasEquiped), w widoku wyświetli się wartość ’empty’.

Jeżeli natomiast w danym ‚slocie’ znajduje się przedmiot, widok pokaże jego nazwę oraz przycisk o wartości ‚unequip’. Wciśnięcie przycisku wywoła funkcję unequip. Jako parametr przyjmuje ona przypisany do przycisku slot. W efekcie wywołana zostanie funkcja o takiej samej nazwie z serwisu gracza, która spowoduje rozpoczęcie prostej akcji. Po zakończeniu akcji, przedmiot we wskazanym slocie trafi do inwentarza a slot zwolni się.

Teraz powinno być już widać jak prosty jest system stojący za działaniem ekwipunku. Wystarczy dodać do elementów rynsztunku jakieś statystyki i będzie gotowe 🙂 . Ale to dopiero w przyszłej aktualizacji. Tymczasem przejdę do prezentacji mechanizmów używania przedmiotów. Jest to trochę bardziej skomplikowane niż akcja zdjęcia elementu rynsztunku. Głównie dlatego, że efekty takiej akcji mogą być różne, zależnie od użytego przedmiotu.

Akcja użycia wywoływana jest po kliknięciu przycisku use w widoku inwentarza. Wywoła to metodę use kontrolera widoku, która z kolei wywoła metodę use ( 🙂 ) serwisu gracza. Serwis gracza wykona standardową procedurę akcji (czyli odroczy czas efektu o określony czas, system ten opisywałem przy okazji poruszania się po świecie gry). W wyniku akcji do pola using serwisu gracza trafi tekst równy nazwie przedmiotu, a pole usingReady przyjmie wartość true.

Tak jak w przypadku innych akcji, tak podniesiona flaga zostanie sprawdzona w metodzie update serwisu gracza. Przytoczę tu cały interesujący nas fragment tej metody:

Jeżeli wartość usingReady równe będzie true, oznacza to, że gracz właśnie skończył akcje używania przedmiotu. Przedmiot ten (jego nazwa) znajduje się w polu using, skąd przypisuje go do tymczasowej zmiennej. Najpierw sprawdzam, czy przedmiot jest ekwipunkiem. Jeżeli tak pobieram do zmiennej tymczasowej informacje to jakiego slotu należy ten przedmiot. Następnie sprawdzam czy slot ten jest wolny. Jeżeli tak, przypisuje do niego przedmiot i usuwam go z inwentarza. Jeżeli slot jest zajęty, nic nie robię, oprócz wyświetlenia odpowiedniej informacji. Aby móc coś wyekwipować, trzeba najpierw zwolnić slot 🙂 .

Jeżeli przedmiot nie jest częścią rynsztunku, oznacza to, że jest przedmiotem specjalnym. Najpierw sprawdzam, czy może być on używany w każdej lokacji. Jeżeli tak i jest jednorazowy usuwam go z inwentarza i wywołuje przypisaną mu funkcję użycia (której treść pobierana jest z serwisu przedmiotów). Jeżeli nie jest jednorazowy, robię to samo ale przedmiot pozostaje w plecaku gracza.

Jeżeli użyty przedmiot specjalny może być użyty tylko w jednej lokacji, muszę wykonać dodatkowe sprawdzenie. Jeżeli gracz znajduje się w tej lokacji, wywoływana jest funkcja dobrego użycia, jeżeli postać znajduje się w innym miejscu, wywołuję funkcję złego użycia.

No i to z grubsza wszystkie zmiany w tej aktualizacji. Tak jak napisałem wyżej, jeżeli coś będzie nie jasne, pytajcie w komentarzach. Postaram się odpowiedzieć na wszystkie pytania :).

Kolejny krok to dodanie do gry statystyk, oraz pełnego systemu walki. No i powiększyć świat i zapełnić go potworami 🙂

Tymczasem, jeżeli chcesz być na bieżąco z postami na blogu zachęcam do polubienia mojej strony na facebooku. Zawsze zamieszczam tam informacje o wszystkich nowościach. Jest to też dobre miejsce na kontakt ze mną. Na wszystkie pytania zawsze odpowiem :).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *