Spis treści
Hej, dawno się tutaj nie spotkaliśmy. Mam nadzieję, że jakoś się tam trzymacie na tej kwarantannie. Rave i Axer przypomnieli mi o okienku, o którym zapomniałem napisać w poprzedniej części tutoriala. Ale to nawet dobrze, bo dzięki temu mogę poświęcić na nie zdecydowanie więcej miejsca. Jest okazja, aby nauczyć się czegoś, co przyda się każdemu ambitnemu dłubaczowi w RM 2k3. Tak właśnie sądzę, więc przygotujcie wasze płaty ciemieniowe na nową porcję informacji!
Jak to włączyć??!!
Najważniejszym aspektem nowego okna, oprócz oczywistej przebudowy interfejsu, w której wszystko znajduje się na jednej karcie, jest dodanie opcji Expression. Opcja ta pozwala nam zapisać operacje matematyczne i logiczne w elegancki sposób, za jednym zamachem. Przy większych systemach w RM2k3 często spotykamy się z tym, że musimy wyklikiwać Control Variables dziesiątki razy, co męczy nasze drogocenne nadgarstki i palce. Teraz to już przeszłość. Wystarczy w edytorze, na którego wcześniej został nałożony Maniacs patch, zaznaczyć tę opcję z górnego menu:
I już! Okno Control Variables jest po tuningu!
Mięsko, czyli kotlecik drobiowy
Dwa przykłady, które widzicie mają zupełnie to samo działanie. Ustawiają zmiennej o numerze 1 wartość 2+3 czyli 5.
Okienko V[expr] oznacza, że wynik naszych obliczeń w tym polu zostanie użyty do określenia numeru zmiennej, na której chcemy operować. Obliczenia w tym polu są wykonywane wcześniej.
Jest to moim zdaniem trochę mylące, ponieważ w okienku expr możemy operować na wielu zmiennych na raz. Natomiast jeżeli zostawimy pole V[expr] puste, to musimy pamiętać, że komenda w oknie zdarzeń będzie wyglądać tak:
To też nie jest zbyt czytelne. W tym przypadku też nie ma znaczenia, co wybierzemy w Operations, czy będzie to Set, Add, Sub itd. Bo i tak operacja jest zdefiniowana niżej, a zmienna o numerze 0 nie istnieje.
W dalszej części tutoriala wszelkie operacje będę przeprowadzał tylko w polu expr. Jest to czytelniejsze, przynajmniej na potrzeby tutoriala, przy normalnej pracy możliwe, że jest zupełnie odwrotnie.
Jeszcze warto wspomnieć o takim przypadku:
Tutaj zmienna o numerze 1 zostanie ustawiona na 5, a na zmiennej o numerze 2 zostanie wykonana operacja v[2] -= v[1]. Czyli od zmiennej 2 zostanie odjęte 5 (wartość na jaką ustawiliśmy v[1]).
Wcześniej pojawił się zapis: v[1] = 2 + 3. v[] oznacza, że odwołujemy się do jakiejś zmiennej. W tym przypadku do zmiennej o numerze 1. No i ustawiamy ją na wynik działania 2 + 3, czyli 5.
Jeszcze warto wspomnieć o przycisku Test. W przypadku, jeżeli popełniliśmy jakieś błędy składniowe przy wpisywaniu wyrażenia to otrzymamy komunikat (po angielsku) o tym, co jest nie tak.
Możemy tez się odwoływać do przełączników. W tym przypadku ustawiamy przełącznik o numerze 2 na wartość True. (True to 1, a False to 0).
Istnieje też i ma się dobrze operator zasięgu, czyli dwie kropeczki. Na tym przykładzie ustawiam zmienne 1, 2 i 3 na wartość 8.
Jakby ktoś nie uwierzył, to wstawiam screen z okna debug (F9).
Tutaj przypisujemy trzy różne liczby do trzech różnych zmiennych:
Robimy to za pomocą tak zwanej „tymczasowej tablicy”, która przechowuje kilka wartości. Jest to właśnie to, co zapisaliśmy jako [2, 4, 6].
Zagadka
A teraz, Drodzy Czytelnicy, zagadka!
Jaką wartość przyjmie v[1]?
v[1] = [v[2] = 3, v[3] = 6, 3][2] + v[2] + v[3]
v[1] przyjmie wartość równą 12. Dzieje się tak, ponieważ indeksy „tymczasowej tablicy” numerowane są od 0. Pod indeksem 0 jest v[2], pod 1 v[3], a pod 2 jest liczba 3. To [2] oznacza, że z tablicy wybieramy właśnie element pod indeksem 2.
Możecie pomyśleć, no dobra, ale po co to stosować? Otóż, w Expression, możemy wpisać tylko jedno wyrażenie. Przedstawiony sposób to swojego rodzaju oszukanie tego systemu i takim sposobem od razu ustalamy wartości zmiennych v[2] = 3 i v[3] = 6 a w dodatku wykonujemy działanie i jego wynik wstawiamy do v[1] – (12).
Kolejny ficzur, który na pewno warto znać, to fakt iż możemy dowolnie zagnieżdżać w sobie v[].
Pozwala to uzyskać ten sam efekt, co użycie Variable ID. Czyli nie odwołujemy się bezpośrednio do wartości zmiennej, ale pobieramy wartość ze zmiennej o tym indeksie. Co ważne, działa to tylko w najnowszej wersji Maniacs Patcha, więc jak zpatchowaliście swoje projekty wcześniej, to możliwe, że będzie trzeba to zrobić jeszcze raz.
Operator && (operator i)
Tutaj ponownie używamy tricku z „tymczasową tablicą”, aby poustawiać zmienne do przykładu. Operator && działa w taki sposób, że jeżeli wartość po lewej jest różna od 0 to wynikiem jest wartość po prawej, natomiast jeżeli wartość po lewej jest równa 0 to wynikiem jest 0. Czyli jako całość to wyrażenie zwróci 0 bo v[2] + v[2] to 0.
Operator || (operator lub)
Operator || działa inaczej. Jeżeli wartość po lewej jest różna od 0, to zwraca wartość po lewej, jeżeli wartość po lewej jest równa 0 to zwraca wartość po prawej. W tym przypadku wynikiem będzie 1.
Dodatkowe mięsko na dokładkę
Teraz już mniej logiki i działań, a więcej przydatnych funkcji:
- – zmienia znak liczby lub odejmuje, jeżeli użyty pomiędzy dwoma liczbami/zmiennymi;
- ! zmienia dowolną zmienną różną 0 na 0, a zmienną równą 0 zmienia na 1.Podobnie działa dla przełączników( 0 na 1, 1 na 0);
- ~ negacja bitowa;
- + dodawanie;
- * mnożenie;
- / dzielenie całkowite;
- % reszta z dzielenia całkowitego;
- | bitowe „lub”;
- & bitowe „i”;
- ^ bitowe „XOR”;
- << bitowe przeniesienie w lewo;
- >> bitowe przeniesienie w prawo;
- == równe;
- != różne;
- < mniejsze;
- > większe;
- >= większe lub równe;
- <= mniejsze lub równe.
Enemy (id, typ). Zwraca informacje o przeciwniku o danym id:
- 00: HP;
- 01: MP;
- 02: Max HP;
- 03: Max MP;
- 04: Atak;
- 05: Obrona;
- 06: Magia;
- 07: Zręczność;
- 08: ID (z bazy danych);
- 09: stan paska ATB.
Misc (typ):
- 00: Pieniądze;
- 01: Pozostały czas licznika czasu 1;
- 02: Ilość bohaterów w drużynie;
- 03: Ilość zapisów;
- 04: Ilość walk;
- 05: Ilość wygranych;
- 06: Ilość porażek;
- 07: Ilość ucieczek;
- 08: MIDI czas ticku;
- 09: Pozostały czas licznika czasu 2;
- 10: Data;
- 11: Czas;
- 12: Ilość klatek, które upłynęły (łącznie);
- 13: Wersja patcha.
Math:
- Pow (a, b) – podnosi a do potęgi b;
- Min (a, b) – mniejsza z dwóch liczb;
- Max (a, b) – większa z dwóch liczb;
- Abs (a) – wartość bezwzględna;
- Sqrt (a, b) – pierwiastek z a pomnożony razy b;
- Sin (a, b, c) – sinus a/b pomnożony razy c;
- Cos (a, b, c) – cosinus a/b pomnożony razy c;
- Atan2 (a, b, c) – atan2 a/b pomnożony raz c;
- Clamp (a, b, c) – jeżeli a < b to ustawia a na b, jeżeli a > c to ustawia a na c;
- Warunek? Wartość jak spełniony:wartość jak niespełniony – zwraca jedną z dwóch wartości zależnie od warunku;
- Rnd (a, b) – zwraca losową liczbę między a i b.
Item (id, typ):
- 00: Czy posiadany;
- 01: Ilość.
Actor (id, typ):
- 00: Poziom;
- 01: Doświadczenie;
- 02: HP;
- 03: MP;
- 04: Max HP;
- 05: Max MP;
- 06: Atak;
- 07: Obrona;
- 08: Magia;
- 09: Zręczność;
- 10: Broń ID;
- 11: Tarcza ID;
- 12: Hełm ID;
- 13: Zbroja ID;
- 14: Akcesoria ID;
- 15: ID z bazy danych;
- 16: poziom paska ATB.
Event (id, typ):
- 00: ID mapy;
- 01: X kratki;
- 02: Y kratki;
- 03: Orientacja;
- 04: X ekranu;
- 05: Y ekranu;
- 06: ID zdarzenia.
Deserek
Tutorial został opracowany na podstawie pliku tekstowego vexpr.txt z folderu z patchem i własnych doświadczeń. W następnej części zajmiemy się czymś ciekawszym, wykorzystamy poznane do tej pory rzeczy w zbudowaniu pewnej mechaniki może np. pola widzenia wrogów. Za pomocą odpowiednich tricków jesteśmy w stanie zawrzeć wszystkie potrzebne operacje na zmiennych w jednym polu Expression. Czy jest to czytelne? No raczej nie. Natomiast dla osób, które ogarniają matematykę i logikę, na pewno to przyśpieszy pracę. Co nie oznacza, że dla zwykłych użytkowników programu jest to nieprzydatne. Czasem krótkim, jednolinijkowym wyrażeniem jesteśmy w stanie wykonać tyle obliczeń, na ile potrzebowalibyśmy normalnie użyć z 5-10 Control Variables. Uważajcie na tego konradowirusa!
Soul
Wersja angielska: Maniacs Patch Won’t Bite You # 2 – New Control Variables
Wersja francuska: Le patch Maniacs ne mord pas ! Partie 2 : Le nouveau Control Variables