Maniacs Patch nie gryzie #3 – Nowe funkcje programu

Witam ponownie w kolejnej części tutoriala dotyczącego Maniacs Patcha. Ostatnio było bardzo technicznie i myślę, że łatwo można było się w tym wszystkim pogubić (teraz już może być tylko lepiej!). Do zrozumienia drugiej części nie jest potrzebna żadna wiedza z części pierwszej. Dziś omówię kolejną porcję mięcha z którego składa się patch. Nie spodziewajcie się odgrzewanych kotletów, będzie to raczej krwisty stek. Skupimy się na komendach zdarzeń, których nie było wcześniej. Dzięki nim możemy uzyskać kontrolę nad grą jakiej nigdy do tej pory nie mieliśmy. Od razu podam parę porad dotyczących użycia poszczególnych funkcji, bo okazuje się, że mogą spowodować kłopoty i ból głowy.

Get Save Info…

Komenda pozwala nam pobrać wszelkie informacje, które widzimy w ekranie odczytu/zapisu gry oprócz imienia bohatera. Możemy wybrać do których zmiennych mają zostać powpisywane poszczególne informacje. Pole Picture for Face Graphics pozwala nam określić ręcznie lub przed zmienną do których numerów obrazków mają zostać przypisane twarze. No dobra, użyliśmy funkcji, przypisaliśmy wszystko, ale dlaczego w takim razie wyświetla nam się jakaś twarz w lewym-górnym rogu ekranu!!!???

Już wyjaśniam – funkcja ta najwidoczniej z automatu wywołuje Show Picture w pozycji 0, 0 ekranu. Obrazki w 2k3 wyświetlane są względem środka, więc dlatego widzimy tylko prawą-dolną część obrazka. Poza tym obrazki o wyższych indeksach nakrywają te niższe, co właśnie powoduje to że widzimy tylko twarz (fragment) ostatniej postaci w pliku zapisu (tej do której numer obrazka przypisaliśmy 4 (czyli największy numer). Teraz jeżeli chcemy uniknąć pokazywania graczowi mordek postaci z pliku zapisu wystarczy wcześniej wywołać Show Picture z pustym obrazkiem 1, 2, 3, 4 i ustawić Transparency na 100% (reszta parametrów dowolna) lub Move Picture 1, 2, 3, 4 z Transparency na 100%. Tak samo jeżeli chcemy pokazać je w jakimś bardziej sensownym miejscu wystarczy analogicznie użyć Show lub Move Picture z odpowiednimi parametrami PRZED wywołaniem Get Save Info…

Save

Jest to prosta funkcja, powoduje (tutaj zaskoczenie) zapis gry. Wybieramy slot 1-15 na którym ma dokonać się zapis i opcjonalnie możemy przypisać do jakiejś zmiennej informacje o tym, czy Save powiódł się czy nie (1 w przypadku powodzenia, 0 w przypadku niepowodzenia). Co ważne, komenda ta działa niezależnie od tego czy Change Save Access jest ustawiony na Disable czy Enable. Samo użycie tej funkcji nie powiadamia gracza w żaden sposób o dokonanym zapisie, więc jest niewidoczna dla gracza (można zrobić na tej podstawie system np. autosave).

Load

Tutaj też nie ma za dużo do gadania. Po prostu wczytujemy plik. Jest to zauważalna operacja, ekran na chwilę znika. Jeżeli wczytywany plik nie istnieje, to komenda jest ignorowana. Chyba że  zaznaczymy opcję Disable File Check i wczytamy nieistniejący plik, wtedy no cóż, lepiej niech siła wyższa ma w opiece naszego gracza. Mogą dziać się niewyjaśniane rzeczy (np. pojazdy z bazy danych pojawiające się w losowym miejscu). Zdecydowanie lepiej tego nie robić.

End Load Process

Funkcja ta dosłownie nie ma żadnego zastosowania <kraken>.

Get Mouse Position…

Kolejna prosta funkcja. Zapisuje położenie myszy do zmiennych. Dzięki tej funkcji można bardzo łatwo zrobić kursor – wystarczy wyświetlać obrazek (lub użyć Move Picture) względem tych zmiennych w równoległym zdarzeniu i używać wyżej wymienionej funkcji. Też dzięki temu możemy sprawdzać gdzie myszka gracza się znajduje (np. do zrobienia przygotówki point&click).

Set Mouse Position

Też również nie ma za dużo do gadania, wystarczy powiedzieć, że pozycja myszki jest ustawiana na podanym punkcie względem okna gry (podane przeze mnie współrzędne 160, 120 zawsze ustawią myszkę na środek okna).

Show String Picture

Ta komenda jest wybawieniem dla osób robiących własne menusy. Każdy kto je tworzył zna ten problem -trzeba tworzyć dziesiątki obrazków, w których zawieramy różne opisy i napisy. Teraz ta komenda sama wygeneruje nam odpowiednie obrazki, wystarczy podać do niej tekst. Z odpowiednim samozaparciem można by nawet stworzyć na jej podstawie Message system z wiadomościami nad głowami postaci. Minusem jest to, że jeżeli chcielibyśmy zrobić pisanie wiadomości litera po literce, a nie wyświetlanie całej treści wiadomości od razu to chyba jedynym sposobem będzie tworzenie dziesiątek obrazków z poszczególnymi literkami co jest bardzo niepraktyczne.

Get Picture Info

Komenda pozwala nam pobrać informacje o wyświetlanym obrazku. Informacje jakie możemy pobrać to wysokość, szerokość i współrzędne obrazka.

Control Battle

[Autor tutoriala nie ponosi żadnej odpowiedzialności za krzywdy psychiczne związane z korzystaniem z Control Battle. Serio, uważajcie!]

Funkcja działa w taki sposób, że wywołujemy ją w jakimś momencie walki. Sposób użycia zalecany przed samego autora to użycie Common Event z nowo dodanym warunkiem Begin Battle. A następnie w przypadku zajścia jakiegoś zdarzenia uruchamiany jest wybrany przez nas Common Event.

Teraz mamy do wyboru jedną z pięciu opcji:

ATB Increment – wybrane przez nas typowe zdarzenie będzie uruchamiane w trakcie walki zawsze, kiedy zmieni się pasek ATB jednej z naszych postaci.

Informacje zwracane:

  • Unit Type – typ postaci (0 – bohater, 1 –potwór)
  • Unit Index – index naszej postaci z drużyny (liczone od 0)
  • Current Gauge – aktualna wartość paska ATB
  • Gauge Increase – o ile pasek ATB się powiększył

Damage Pop – zdarzenie uruchamiane w momencie odniesienia obrażeń. Uruchamiane i dla przeciwników, i dla bohaterów.

  • Unit Type – 0 dla bohaterów, 1 dla przeciwników
  • Unit Index – index postaci lub wroga

Ta funkcja jest bardzo myląca, ponieważ index dla przeciwników jest liczony od 0 a nie od 1 tak jak w okienku bazy danych Troops! Musimy pamiętać żeby odjąć 1.

  • X, Y – współrzędne na których pokazane zostały liczby oznaczające otrzymane obrażenia
  • Value Type – jest to parametr, którego przyznam się, nie udało mi się w pełni rozgryźć. Przyjmuje wartości 0 dla zwykłych ataków, magicznych ataków, zdolności i krytyków, a 2 dla ataków, które zostały uniknięte. Kto wie w jakich okolicznościach Value Type jest równe 1 i czy w ogóle istnieje taki przypadek
  • Value  – ilość otrzymanych obrażeń

Targeting – uruchamia się w momencie obrania jakiegoś obiektu na cel. Nie będę się rozpisywać, co oznaczają wszystkie Action Index, bo jest ich dużo.

User Type i User Index oznaczają wykonującego akcję, a Target Type i Target Index oznaczają osobę, na której wykonywana jest akcja. Action Type określa typ akcji, 0 dla akcji podstawowych i 1 dla umiejętności. Action Index określa Index umiejętności w przypadku Action Type 1, a w przypadku podstawowych akcji to udało mi się ustalić:

  • Action Index 0 – zwykły atak
  • Action Index 1 – podwójny atak
  • Action Index 2 – obrona

Co jest dziwne, to to, że w tej opcji User Type i Target Type działa inaczej niż w innych opcjach. Tutaj nie przyjmuje wartości 0 dla bohaterów i 1 dla potworów.

Set State – opcja uruchamiająca zdarzenie w momencie zmiany stanu przeciwnika/bohatera. User Index i User Type wcale nie określają osoby, która używa zaklęcia zmieniającego stan, tylko cel. Dziwną sprawą jest State ID, w teorii raczej powinien zwracać ID stanu z bazy danych, ale w moich testach zawsze zwracał 1 (co jest dziwne, bo to ID stanu śmierci).

MP/ATK/DEF/MND/AGI Changed – opcja działa analogicznie do Damage Pop, tylko zamiast aktywacji podczas odniesienia obrażeń HP, aktywuje zdarzenie podczas obrażeń MP lub zmiany jednej z pozostałych statystyk.

P.S. Nie testowałem tej funkcji jakoś super długo, a i tak natrafiłem na parę bardzo kontrowersyjnych sytuacji. Np. jeżeli cel jakiegoś ataku umrze, to informacje, które otrzymamy o celu ataku mogą być zniekształcone w nieokreślony sposób (wygląda na losowe liczby). Chyba dla własnego zdrowia psychicznego radziłbym trzymać się od tej funkcji z daleka. Tylko dla hardkorów, którzy chcą naprawdę poświęcić swój czas na odpicowanie podstawowego systemu walki.

Change Battle Command Ex

Pozwala nam aktywować/dezaktywować odpowiednie opcje do wyboru w menu walki. Ta komenda działa jedynie podczas walki, więc wywołanie jej bezpośrednio na mapie nie daje żadnych efektów

Możemy dodać opcję bezpośredniego wygrania/przegrania potyczki, co chyba jest przydatne wyłącznie podczas testowania gry.

Get Battle Info..

Funkcja zwracająca tablice danych (w następnym paragrafie dokładniej jest to opisane), które chcemy odczytać. Do wyboru mamy informacje o tym, czy na postaci znajdują się jakieś buffy/debuffy parametrów, tablica stanów, która ma informacje o tym, pod jakimi stanami znajduje się dana postać (0 lub 1 dla każdego stanu z bazy danych), odporności na elementy, X i Y postaci oraz to czy dana postać aktualnie się broni, czy może się poruszać itd.

Control Var Array

Po pierwsze, żeby użyć tej funkcji trzeba zrozumieć czym jest tablica (Array) w RM2k3.

W najprostszy sposób możemy nazwać tablicą zestaw zmiennych, które znajdują się w swoim sąsiedztwie. Na podanym przykładzie mamy tablicę 1 o rozmiarze dziesięciu zmiennych, o indeksach od 101 do 110. Tablice są bardzo przydatne, kiedy chcemy utworzyć pojemnik na informacje tego samego typu. Dobry przykładem by było to gdybyśmy mieli dziesięciu wrogów na planszy i wtedy w tablicy znajdowało by się dziesięć wartości ich poziomu życia.

Użycie tej funkcji polega na tym, że wybieramy operację, którą chcemy wykonać na całej tablicy (w tym przypadku Copy, czyli kopiujemy zawartość jednej tablicy do drugiej. Target 1 określa zmienną od której rozpoczyna się tablica 1, Target 2 określa zmienną od której rozpoczyna się tablica 2. Size to po prostu rozmiar obu tablic.

Tutaj kawałek zdarzenia, który uzupełnia nam tablicę 1 losowymi wartościami. Operacją Copy kopiujemy te wartości do tablicy nr 2. Tutaj potwierdzenie działania (w trybie testowym RM klikamy F9):

Oprócz operacji matematycznych, na tablicach możemy wykonać ciekawsze operacje takie jak:

  • Shuffle – miesza losowo wartości w tablicy, może być przydatne np. podczas tworzenia mini gier, gdzie chcemy przetasować karty
  • Enumeration – wypełnia tablicę kolejnymi liczbami od wartości, którą podamy. Jest to przydatne w tym względzie, że nie musimy wypełniać zmiennych ręcznie, gdy potrzebujemy kolejne liczby
  • Sort (Ascending/Descending) – jest to sortowanie rosnące/malejące tablicy
  • Swap – zmienia wartości w dwóch tablicach parami

Key Input Processing EX

Jest to bardziej zaawansowana funkcja do obsługi klawiatury. Działa ona inaczej niż podstawowa funkcja Key Input Processing. W podstawowej funkcji wybrana przez nas zmienna jest ustawiana na kod klawisza, który został wciśnięty. Ta funkcja ustawia 50 zmiennych na wartości 0 lub 1 w zależności czy dany klawisz jest wciśnięty (0 – nie wciśnięty, 1 – wciśnięty). Co jest przydatne, gdy chcemy sprawdzać czy gracz np. wcisnął parę przycisków na raz. Przy używaniu tej funkcji warto sobie ponazywać wszystkie 50 zmiennych nazwami klawiszy, by pamiętać o jakim klawiszu dana zmienna przechowuje informację. Przy użyciu wybieramy tylko ID pierwszej zmiennej, do której zostanie przypisana informacja o wciśnięciu przycisku A. Kolejne 49 zawiera informacje o reszcie klawiszy. Pozwala również na obsługę Joypada.

Rewrite Map

Jeżeli ktoś chciał dynamiczne zmienianie fragmentów tilesetu podczas gry – proszę bardzo! Możemy wybrać, czy chcemy zmieniać górę czy dół tilesetu. Tilesy po prawej są ponumerowane unikalnymi liczbami. Tile, na który chcemy podmieniać wybieramy w Tile Type. Single oznacza, że cały obszar, który wskażemy w position zostanie wypełniony jednym typem. Możemy tam też podać zmienną.

Range wskazuje na tablicę zmiennych i każda kolejna zmienna z tej tablicy wskazuje na typ tila.

Tutaj przykład dla Range ustawionego na pierwszą zmienną i Position X = 5, Y = 5, W = 2, H = 2.

Wypełniamy więc kwadrat 2×2 wartościami z tablicy. Lewy górny róg kwadratu będzie wypełniony tilesem, którego numer jest zawarty w zmiennej nr 1. Prawy górny róg – zmienna nr 2. Lewy dolny róg – zmienna nr 3 i prawy dolny róg – zmienna nr 4. W przypadku, gdybyśmy mieli np. W = 3 i H = 2 to potrzebujemy 6 ustawionych zmiennych.

X i Y wskazuje nam lewy-górny róg obszaru. Możemy też zaznaczyć opcję, aby autotilesy nie działały.

Change Picture ID

Normalnie gdybyśmy chcieli odwrócić poziom głębokości obrazków (czyli to, który nakrywa który), na którym znajdują się dwa obrazki, musielibyśmy wykonać dwa Show Picture ze zmienionymi numerami obrazka, bo te z mniejszymi numerami zawsze są nakrywane przez te z wyższymi. Od teraz mamy funkcję, która rozwiązuje ten problem i możemy dowolnie zmieniać ID obrazków. Są na to trzy sposoby.

Move po prostu zmienia numer obrazka o numerze podanym w Target 1 na numer podany w Target 2. Swap zamienia numery obrazków w Target 1 i Target 2. Slide przesuwa obrazek o wartość ujemną (w dół) lub dodatnią (w górę) a obrazki przez które się on przesunie będą miały przesunięte numery w przeciwnym kierunku o wartość Size. Co ciekawe w polu Size możemy podać wartość większą niż 1. Wtedy te operacje będą wykonywane na tablicach obrazków. Na przykład wybierając opcję Move i takie parametry:

  • Target 1: 1
  • Target 2: 3
  • Size: 2

Przeniesiemy obrazek o numerze 1 na pozycję 3, a obrazek o numerze 2 na pozycję 4. Można też się zastanawiać, co się stanie, jak Size będzie większe niż różnica pomiędzy Target 1 a Target 2. Śpieszę z wyjaśnieniem. Możemy sobie wyobrazić to w taki sposób, że funkcja najpierw bierze 3 obrazki o numerach z Target 1, Target 1 + 1 i Target 1 + 2, a potem je ustawia na pozycjach Target 2, Target 2 + 1 i Target 2 + 2. Więc nie musimy się martwić tym, że obrazek o numerze 1 najpierw zostanie przeniesiony na pozycję 3, a potem ten obrazek z pozycji 3 zostanie przeniesiony na pozycję 5.

Ostatnia rzecz to opcja Ignore out of range error. Ma ona znaczenie, gdy przez przypadek nadamy obrazkowi ujemny numer. Wtedy gra całkowicie się wywala. Chyba, że zaznaczymy tą opcję, wtedy gra ignoruje błąd i obrazek po prostu znika.

By the way, ważne jest zrozumienie, że ta funkcja tylko i wyłącznie podmienia numery obrazków, a nie same obrazki. Wszelkie informacje o danym obrazku, jak jego pozycja, przezroczystość itd. zostają zachowane.

Set Game Option

Pozwala skonfigurować parę szczegółów w naszej grze. Behavior When Inactive określa, jak powinna zachować się nasza gra, gdy okno gry w trybie okienkowym nie jest sfocusowane. Jak jest ustawione na wait, gra czeka aż fokus zostanie przywrócony. Active sprawia, że gra działa dalej. Może to być swego rodzaju zabezpieczeniem przed cheatami w niektórych grach, w których na przykład jest ograniczony czas na rozwiązanie zagadki logicznej.

Fatal Mix określa maksymalną liczbę FPS w grze. Można też ustawić czy ta opcja powinna być również aktywna w trybie testowym. Można też dać graczowi opcję na pomijanie wiadomości za pomocą prawego Shifta.

Maximum number of pictures – zmienia limit obrazków w grze.

Frame Skip – jaki % klatek gra ma pomijać.

Control Global Save

Jest to bez dwóch zdań jedna z najciekawszych opcji dodanych w Maniacs Patchu. Pozwala zapisać dowolne zmienne/przełączniki do pliku i odczytać je niezależnie czy wczytaliśmy grę z jakiegoś innego sejwa, czy kliknęliśmy nowa gra. Ważne jest to, że te dane są przechowywane w pliku Save.lsd, więc jak użytkownik usunie ten plik to może być straszna bieda. Oczywiście są sposoby żeby sprawdzić czy ten plik istnieje np. bazowo wpisujemy do niego jakąś zmienną (już przed wydaniem gry) i sprawdzamy czy odczytana wartość jest równa tej wpisanej, czy też równa się zero, a potem nigdy tej wartości w pliku nie ruszamy.

Poza tym opcja ta pozwala na stworzenie systemu osiągnięć, które są globalne i niezależne od save slotów. Pewnie znajdą się też osoby, które potrafiłby zrobić w tym cały system zapisu w grze i w ogóle nie korzystać ze standardowych opcji zapisz/wczytaj.

Tak prezentuje się okno zapisu i wczytywania.

Mamy 6 operacji:

  • Open – otwiera plik Save.lsd
  • Close – zamyka plik Save.lsd (dla osób, które nigdy nie operowały na plikach zapisu: ta opcja w żadnym razie nie usuwa pliku, tylko usuwa uchwyt do niego, czyli takie jakby wiązanie pomiędzy plikiem a programem i program nie może już dłużej z niego odczytywać. Można się zastanowić w takim razie czemu plik nie mógłby być cały czas otwarty. Odpowiedzią jest to, że istnieje prawdopodobieństwo, iż plik zostanie uszkodzony, jeśli nie zostanie poprawnie zamknięty).
  • Save – zapisuje stan pliku.
  • Save Then Close – zapisuje stan pliku i zamyka.
  • Copy From Global Save – odczytuje wybrany przełącznik, zmienną, grupę przełączników lub zmiennych.
  • Copy To Global Save – zapisuje do pliku wybrany przełącznik, zmienną, grupę przełączników lub zmiennych.

W Type określamy czy chcemy odczytać/zapisać zmienne lub przełączniki.

Current Save Data wskazuje na przełącznik/zmienną, którą chcemy odczytać/zapisać.

Global Save Data – wskazuje na slot, w którym zapisana jest dana w pliku Save.lsd. W każdym slocie mieści się jedna zmienna lub przełącznik.

Size – jeżeli chcemy odczytać lub zapisać grupę zmiennych/przełączników, które znajdują się obok siebie (stanowią tablicę) to możemy od razu to załatwić w jednej komendzie. Logika działania jest taka sama jak w przypadku zamiany ID obrazków w funkcji Change Picture ID, czyli to co wskażemy w Current/Global Save Data jest pierwszym odczytywanym/zapisywanym elementem, a po nich znajdują się następne elementy.

Wydaje mi się, że w dalszym ciągu użycie może nie być oczywiste, więc pokaże przykład zdarzeń, które zapisują i odczytują dwie zmienne.

To zdarzenie odpowiada za zapis zmiennych o ID 15 i 16. Ustawiamy je na wartości 5 i 8.

Następnie otwieramy plik zapisu zaznaczając Open.

Potem znowu używamy komendy Control Global Save i teraz zaznaczamy opcję Copy To Global Save z taką samą konfiguracją, jaka była na poprzednim obrazku. I znowu dajemy tą komendę, ale tym razem zaznaczamy Save&Close.

Teraz zajmiemy się zdarzeniem wczytywania zmiennych.

Dajemy Control Global Save z opcją Open.

Następnie ponawiamy komendę, tylko teraz z opcją Copy From Global Save.

Nie musimy używać teraz opcji Save, gdyż nie zmieniliśmy żadnych danych w pliku. Wystarczy wybrać Close.

Jeśli teraz zamkniemy grę i ponownie ją otworzymy, a następnie wejdziemy w interakcje ze zdarzeniem odczytu danych i sprawdzimy stan zmiennych (F9 w trybie testowym!), to okaże się, że zmienne mają swoje wartości, które im wcześniej przydzieliliśmy. (5 i 8).

Podsumowanie

To tyle z ważniejszych funkcji Maniacs Patcha. Mam nadzieję, że komuś uda się je kreatywnie wykorzystać. Możliwe, że powstanie jeszcze kiedyś jakaś dodatkowa część poradnika, w której będzie opisany jakiś ciekawy system stworzony za pomocą patcha. Co prawda miało to być już teraz, ale pojawiły się pewne, hmmm, komplikacje. Ja na razie wracam do piwnicy robić swój własny projekt. Życzcie mi powodzenia. Pa!

Soul

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.