Spis treści
19 maja w końcu pojawiła się długo wyczekiwana, coroczna aktualizacja Maniacs Patcha – nie bez powodu, nowa wersja przyniosła jeszcze więcej nowych funkcji i zmian. Zmian tak dużych, że BingShan musiał przepisać część systemów Makera, aby umożliwić dalszy ich rozwój i w konsekwencji, niestety, otworzyć furtkę na potencjalne problemy z kompatibylnością. Sam autor wyraźnie zaznacza, żeby zrobić kopie zapasowe projektu, gdyż nowa wersja jest swego rodzaju eksperymentalną, wypuszczoną w celu wyłapania nieprzewidzianych błędów.
Pierwsze uruchomienie może wprawić w zakłopotanie, gdyż nowych i zmienionych funkcji nie uświadczymy w okienku wstawiania komendy. Na tę chwilę zmiany są zaimplementowanie tylko w silniku programu, na klikalne opcje trzeba jeszcze trochę poczekać. Jak w takim razie wykorzystać nowe funkcjonalności? Odpowiedź na szczęście jest prosta – za pomocą TPC.
TPC
A dokładniej TkoolPartialCompiler, to program stworzony również przez BingShana, który w zamyśle miał przyspieszyć i usprawnić eventowanie bardziej zaawansowanym użytkownikom 2k3. Aplikacja tłumaczy język pośredniczący na rozkaz zrozumiały dla silnika gry. TPC to potężne narzędzie – pozwala na modyfikowanie ustawień komend, na które edytor (jak narazie) nie pozwala. Gorąco polecam każdemu, kto kiedyś liznął programowania.
Okej, ale jak tego użyć do nowych komend? Otóż ta wersja wprowadza integrację edytora z TPC poprzez dodanie dwóch nowych opcji obecnych przy wstawianiu komendy. Jednak przedtem trzeba pobrać program ze strony autora…
…a następnie wrzucić go do folderu, gdzie znajduje się zpatchowany plik exe edytora. U użytkowników Steamowej wersji ścieżka do folderu powinna przypominać tą widoczną na poniższym zrzucie ekranu.
Jeśli robiliśmy przy otwartym makerze, należy go zamknąć i otworzyć ponownie. Voilà, od teraz kliknięcie Create with tpc i Edit with tpc powinno otwierać duże, puste okno TPC, gdzie można wprowadzać komendy.
Chwila, moment, Axer, czy to oznacza, że muszę nauczyć się programować? Bynajmniej – lwią część nowych ficzerów można zaimplementować po prostu kopiując tekst prosto do okienka TPC i ewentualnej zmianie jasno opisanych parametrów. Dodatkowo, przy opisach postaram się dołączyć skrin przedstawiający przykładowe użycie. Zaczniemy od najbardziej istotnych (a przynajmniej według mnie) i przydatnych funkcjonalności, dlatego na pierwszy ogień idzie…
Odświeżony debugger
Tak, proszę państwa, nareszcie! Debugger przeszedł solidny lifting i oprócz wyświetlania się w nowym oknie został wzbogacony o dokładne informacje o eventach na obecnej mapie, a nawet o obrazkach! Zbawienie dla wszystkich tworzących bardziej zaawansowane systemy.
Ci bardziej spostrzegawczy pewnie zauważyli, że pominąłem drugą kartę opatrzoną tajemniczą nazwą Strvar. Zawiera ona informacje o nowym rodzaju zmiennych, a mianowicie…
Zmienne tekstowe
Funkcja, która otwiera furtkę do stworzenia rzeczy wcześniej niemożliwych bądź niemożebnie trudnych: tworzenia plików ustawień, przystępnej obsługi wielu wersji językowych (tutorial już niedługo!), systemów rozumienia wprowadzanego pisma i wiele, wiele więcej! Mało tego, BingShan wyposażył zmienne tekstowe w szeroki wachlarz najróżniejszych manipulacji. Zapnijcie pasy, bo jest tego sporo!
Do zmiennych tekstowych odnosi się podobnie jak w przypadku zwykłych zmiennych – skoro do zmiennych liczbowych w tekście używamy \v[numer], analogicznie dla zmiennych tekstowych stosuje się \t[numer]. Przy konstruowaniu komend poprzez TPC sprawa ma się niemal tak samo, jedynie pomijamy ukośnik. Z tą wiedzą możemy już poznać podstawowe operatory:
- .asg „text” – zwykłe przypisanie jakiegoś tekstu do zmiennej. Przykładowo, żeby przypisać tekst „test zmiennych” do zmiennej tekstowej o numerze 1 należy kolejno w wybranym miejscu kliknąć prawym i wybrać Create with tpc, po czym w okienku TPC wpisać poniższą komendę i wcisnąć OK. Zauważcie, że wpisane polecenie jest już wyświetlane w mniej enigmatycznej formie. Zaraz po tym możemy wywołać okienko wiadomości z treścią „\t[1]„, żeby sprawdzić działanie. Za pomocą .asg można przypisać wiele różnych wartości, o czym trochę niżej.
- .cat „tekst1”, t[numer], „tekst2” … – dokleja jeden lub więcej tekstów na koniec. Teksty można podawać „na sztywno” lub poprzez wskazanie innych zmiennych tekstowych.
- .toNum v[numer] – konwertuje tekst na liczbę i przypisuje ją zmiennej numer. Jeśli jest to niemożliwe, np. kiedy tekst nie składa się tylko z cyfr, do zmiennej liczbowej trafia 0. Jeśli w tekście jest kilka liczb oddzielanych spacjami, brana jest tylko pierwsza z brzegu.
- .getLen v[numer] – przypisuje zmiennej numer ilość znaków w tekście, wliczając w to znaki białe (spacja i enter).
- .inStr „ciag”, v[numer], beg X – znajduje w tekście dany ciąg znaków, począwszy od pozycji X i zapisuje jego pozycję w zmiennej numer. Jeśli takiego ciągu nie ma w tekście, do zmiennej liczbowej trafia -1. Jeśli ciąg występuje wielokrotnie, zwracana jest pozycja pierwszego wystąpienia. Uwaga: pozycja jest liczona od 0, tj. pierwsza litera tekstu ma pozycję 0, druga 1, itd. Parametr beg jest opcjonalny i można go pominąć, doda się automatycznie.
- .split „ciag”, t[numer], v[innyNumer] – rozdziela tekst na mniejsze części według wskazanego przez nas znaku/ciągu znaków i umieszcza je w zmiennych tekstowych począwszy od numer, do maksymalnie innyNumer części. Określanie ilości jest opcjonalne, domyślnie do zmiennych tekstowych trafią wszystkie części pociętego tekstu. Jak można zauważyć na screenach: określiliśmy, że części tekstu zaczynają się od t[2], zatem pierwsza część trafi do t[2], kolejna do t[3], następna do t[4], itd.
- .popLine t[numer] – wyciąga i usuwa pierwszą linię tekstu i wstawia ją do numer. Przydatne przy czytaniu np. pliku konfiguracyjnego.
- .toFile „plik”, .utf8 – zapisuje zawartość zmiennej tekstowej do wskazanego pliku w folderze Text, w wybranym kodowaniu (jeśli nie wiesz o co chodzi, po prostu zostaw .utf8). Jeśli plik o takiej nazwie nie istnieje, zostanie on stworzony. Inaczej jest w przypadku folderu Text, trzeba uprzednio stworzyć go w katalogu projektu. Uwaga: jeśli plik już istnieje, komenda nadpisuje całą jego zawartość.
Oprócz tego wszystkiego, operator .asg ma kilka dodatkowych narzędzi do dyspozycji:
- odwoływanie się do zmiennych liczbowych i przełączników – zmiennej tekstowej można przypisać wartość jakiejś zmiennej liczbowej (automatycznie konwertowanej na tekst) lub przełącznika (na tekst „ON” lub „OFF”) za pomocą odpowiednio v[] i s[].
- wyciąganie nazw z bazy danych – i to chyba każdej istotnej:
- .actor[ID] .name – imię bohatera
- .skill[ID] .name – nazwa umiejętności
- .item[ID] .name – nazwa przedmiotu
- .enemy[ID] .name – nazwa przeciwnika
- .troop[ID] .name – nazwa grupy przeciwników
- .terrain[ID] .name – nazwa terenu
- .element[ID] .name – nazwa atrybutu (elementu)
- .state[ID] .name – nazwa stanu
- .anim[ID] .name – nazwa animacji ataku
- .tileset[ID] .name – nazwa tilesetu
- .s[ID] .name – nazwa przełącznika
- .v[ID] .name – nazwa zmiennej liczbowej
- .t[ID] .name – nazwa zmiennej tekstowej
- .cev[ID] .name – nazwa common eventu
- .class[ID] .name – nazwa klasy
- .anim2[ID] .name – nazwa animacji walki bohatera
- .map[ID] .name – nazwa mapy
- .mev[ID] .name – nazwa eventu na mapie
- .member[N] .name – imię N-tego bohatera w drużynie
- .join „ciag”, t[numer] / v[numer], X – łączy X kolejnych tekstów lub zmiennych liczbowych (począwszy od numer) w jeden i wstawia między nimi wybrany ciąg znaków.
- .ins T1, X, T2 – wstawia w miejsce X (licząc od 0) tekstu T1 inny znak lub tekst T2. X może być zwykłą liczbą bądź zmienną, T1 i T2 mogą być zwykłym tekstem bądź zmiennymi tekstowymi.
- .rep T1, T2, T3 – zamienia w tekście T1 wszystkie wystąpienia T2 na T3. T1, T2 i T3 mogą być zwykłym tekstem bądź zmiennymi tekstowymi.
- .subs T1, X, Y – wyciąga z tekstu T1, ciąg Y znaków zaczynając od pozycji X. X i Y mogą być zwykłymi liczbami bądź zmiennymi, T1 może być zwykłym tekstem bądź zmienną tekstową.
- .file „plik”, .utf8 – ładuje do zmiennej całą zawartość pliku w danym kodowaniu (podobnie jak przy .toFile, polecam zostawić .utf8). Jeśli plik nie istnieje, zmienna staje się pusta.
Na pierwszy rzut oka może wydawać się skomplikowane, ale jest wprost przeciwnie. Ewentualnie można zaczekać, aż autor wypuści wersję „klikalną”, która nieco uprości cały proces. BingShan nie zapomniał też o możliwości tworzenia warunków ze zmiennymi tekstowymi, ale o tym za chwilę.
Zmiana rozmiaru i czcionki wiadomości
Podstawowe wiadomości również otrzymały kilka ciekawych zmian. Pierwszą z nich jest możliwość ustalenia rozmiarów okna co do piksela. Tycia wiadomość do tekstów o levelupie? Można, jak najbardziej! Gigantyczne okno, w którym można zmieścić więcej niż 4 linie tekstu? Jeszcze jak!
@msg.opt {
.size X, Y – gdzie X to szerokość, a Y wysokość okna w pikselach
}
Niestety, jak na razie brakuje możliwości ustalenia dokładnego miejsca, w którym pojawia się okno oraz automatycznego dostosowywania rozmiarów okna do tekstu, jednak BingShan mocno sugeruje, że pojawią się w jednej z przyszłych aktualizacji.
Ale to nie koniec! Nareszcie można w locie zmieniać czcionkę używaną przy wyświetlaniu wiadomości oraz jej rozmiar. A co najlepsze – font ten nie musi być zainstalowany u gracza, wystarczy wrzucić go do folderu Font w katalogu gry.
@msg.opt {
.font „ABC”, X – gdzie ABC to nazwa czcionki, a X to jej wielkość w pikselach
}
Obecnie występują problemy z poprawnym kolorowaniem liter przy wielkościach ~30 pikseli i większych, ale poza tym działa bez zarzutu.
Dokładniejsze wait
Czasem bywa tak, że wait 0.0 jest za krótki, a wait 0.1 zbyt długi. Z pomocą przychodzi możliwość ustawienia waita na dokładną ilość klatek, określanej zarówno na sztywno, jak i przez zmienną:
- @wait X .frame – dla stałej liczby klatek X
- @wait v[numer] .frame – dla liczby klatek określanej przez zmienną numer
Przesuwanie ekranu z dokładnością co do piksela
Kolejna długo wyczekiwana opcja – z pewnością zainteresuje twórców zaawansowanych systemów. Może okazać się nieoceniona przy tworzeniu m.in.: inteligentnej kamery, lepszego scrollowania w platformówkach, umiejętności dalekiego widzenia w skradankach czy też po prostu do precyzyjniejszego ustalania co ma widzieć gracz.
- @scr .scroll .pxShift X, Y .speed Z – przesuwa ekran o X pikseli poziomo i Y pikseli pionowo z prędkością Z pikseli na klatkę
- @scr .scroll .set X, Y . speed Z – przesuwa ekran do miejsca o koordynatach X i Y (w pikselach) z prędkością 0.001*Z pikseli na klatkę
Jeszcze więcej opcji obrazków
Rozpieszczania ciąg dalszy, w kwestii wyświetlania obrazków dochodzi kilka, zaryzykuję stwierdzenie, rewolucyjnych dodatków:
- relatywne Move Picture – czyli przesuwanie obrazkiem względem obecnej pozycji, ale nie tylko! Tyczy się to także rozmiaru i przezroczystości, można też określić, który z pozostałych parametrów (kolor, efekt, blend, itd.) zachować, a który zmienić. Aby skorzystać z tej opcji, najprościej jest stworzyć w evencie komendę Move Picture podając w parametrach liczbę, o jakie chcemy je zmienić, a następnie edytować ją przy użyciu TPC i w środku dorzucić .relative. Do zachowywania pozostałych parametrów mamy do dyspozycji takie operatory:
- .keepRgbs – zachowuje kolor
- .keepEffect – zachowuje efekty typu rotacja, falowanie, etc.
- .keepBlend – zachowuje ustawienia miksowania obrazka z tłem (stosowane przy efektach świetlnych)
- .keepTime – zachowuje czas przesunięcia (jeśli wykonamy kilka Move Picture pod rząd)
- .keepFlip – zachowuje odbicie obrazka
- @pic[ID].getInfo .pixel X, Y, W, H .dst v[numer] – pobiera informacje o kolorze pikseli na obrazku ID w obszarze o wymiarach W na H o początku w punkcie o koordynatach X i Y. Dane są umieszczane w zmiennych począwszy od numer. Najprościej odczytywać i podawać informacje o kolorze używając systemu szesnastkowego – wtedy wartość piksela przechowywana w zmiennej wygląda następująco:
- @pic[ID].setPixel .xywh X, Y, W, H .src v[numer] – chyba najciekawsza opcja. Działa analogicznie to powyższej, tylko zamiast pobierać te wartości, ustawia je. Tak, to znaczy, że obrazki można edytować w locie! Co ciekawe, działa to z przezroczystością – dzięki temu w połączeniu z opcją wyżej można tworzyć paski np. zdrowia bez potrzeby użycia dziesiątek obrazków.
- @img.save.screen.dst „PLIK” – zapisuje ekran gry do PLIKU .png
- @img.save.pic ID .dst „PLIK” – zapisuje obrazek o danym ID do PLIKU .png w katalogu gry
Rozszerzone Conditional Branch
Tworzenie warunków w RM jest dość prymitywne i momentami potrafi działać na nerwy. Nierzadko trzeba tworzyć tymczasowe zmienne, z których po Conditional Branchu nawet się nie skorzysta. Używając TPC możemy te warunki rozszerzyć o możliwości Expression z Maniacsowego Control Variables – służy do tego operator @if` (tak, razem z grawisem, tym „dzyndzelkiem”). Jeśli nie wiecie czym jest lub jak używać Expression, zapraszam do lektury części poradnika napisanej przez Soula, gdzie omawia te i inne aspekty nowego CV.
Okej, ale co jeśli chcemy jakoś porównać dodane w tej aktualizacji zmienne tekstowe? Autor oczywiście nie zapomniał o nowych ficzerach i dał do dyspozycji 4 kolejne operatory:
- .eq „tekst” / t[numer] – sprawdzenie, czy zmienna jest taka sama jak dany tekst lub inna zmienna numer
- .neq „tekst” / t[numer] – sprawdzenie, czy zmienna jest różna od danego tekstu lub innej zmiennej numer
- .contains „tekst” / t[numer] – sprawdzenie, czy zmienna zawiera dany tekst lub inną zmienną numer
- .notContains „tekst” / t[numer] – sprawdzenie, czy zmienna nie zawiera danego tekstu lub inna zmiennej numer
Add Move Route
Nazwa brzmi znajomo, czym właściwie to się różni od Set Move Route? Ano tym, że zamiast ustawiać zupełnie nową ścieżkę dla zdarzenia, Add Move Route dodaje ruch do obecnej ścieżki. Świetne narzędzie do dynamicznego generowania tras eventów.
Zasada użycia jest bardzo prosta: wklepujemy do TPC @ev.addAction, a następnie określamy ruchu, jaki ma zaplanować event:
- .moveUp(X) – X kroków w górę
- .moveRight(X) – X kroków w prawo
- .moveDown(X) – X kroków w dół
- .moveLeft(X) – X kroków w lewo
- .moveUpperRight(X) – X kroków do góry w prawo
- .moveLowerRight(X) – X kroków na dół w prawo
- .moveUpperLeft(X) – X kroków do góry w lewo
- .moveLowerLeft(X) – X kroków na skos na dół w lewo
- .moveRandom(X) – X kroków w losowym kierunku
- .moveToward(X) – X kroków w stronę bohatera
- .moveAway(X) – X kroków od bohatera
- .moveForward(X) – X kroków w przód
- .move(X, K)
- gdzie X to liczba kroków, a K to kierunek (2 – dół, 4 – lewo, 6 – prawo, 8 – góra)
- .faceUp – obrót w górę
- .faceRight – obrót w prawo
- .faceDown – obrót w dół
- .faceLeft – obrót w lewo
- .turnRight – obrót o 90 stopni w prawo
- .turnLeft – obrót o 90 stopni w lewo
- .turnBack – obrót w tył
- .turnSide – losowy obrót o 90 stopni w lewo lub w prawo
- .turnRandom – losowy obrót
- .turnToward – obrót w stronę gracza
- .turnAway – odwrócenie się od gracza
- .face(K) – obrót w danym kierunku
- gdzie K to kierunek (2 – dół, 4 – lewo, 6 – prawo, 8 – góra)
- .pause – czeka
- .beginJump – rozpoczęcie skoku
- .endJump – zakończenie skoku
- .fixDir – blokuje możliwość obrotu
- .unfixDir – odblokowuje możliwość obrotu
- .speed(X) – ustawia prędkość ruchu
- X – wartość prędkości widoczna w edytorze, w zakresie 1 – 6
- .freq(X) – ustawia częstotliwość ruchu
- X – wartość częstotliwości widoczna w edytorze, w zakresie 1 – 8
- .trans(X) – ustawia przezroczystość eventu
- X – wartość zakresie 1 – 8
- .switch(ID, W) – ustawia przełącznik
- ID – ID przełącznika
- W – jego wartość (1 – ON, 0 – OFF)
- .setBody(„PLIK”, idx) – zmienia grafikę eventu
- .se(„PLIK”, VOL, PITCH, BALANCE) – odtwarza dźwięk o danych parametrach
- PLIK – nazwa dźwięku
- VOL – głośność w zakresie 0 – 100
- PITCH – tempo w zakresie 0 – 150
- BALANCE – kierunek, z którego dochodzi dźwięk, w zakresie 0 – 100
- .beginThrough – włącza przechodzenie przez ściany i eventy
- .endThrough – wyłącza przechodzenie przez ściany i eventy
- .pauseAnim – wyłącza animację podczas ruchu
- .resumeAnim – włącza animację podczas ruchu
Należy pamiętać, że Add Move Route w ramach jednej komendy może dodać tylko jeden ruch. Żeby uzyskać więcej, wystarczy po prostu dodawać komendy AMR jedna po drugiej. Kolejna sprawa jest taka, że jeśli wywołamy AMR podczas gdy event nie porusza się według żadnej ścieżki, to ta komenda zostanie zignorowana. Jeśli dopiero chcemy przygotować całą ścieżkę od zera, można to sprytnie obejść poprzez wcześniejsze wstawienie pustego Set Move Route.
Zmiana rozdzielczości
I to na zupełnie dowolną, od pionowych imitujących grę mobilną po HD+! Aby ją zmienić, należy otworzyć plik RPG_RT.ini znajdujący się w folderze z grą i na samym dole dopisać następujące linijki:
- WinW=X, gdzie X to szerokość okna gry w pikselach
- WinH=X, gdzie X to wysokość okna gry w pikselach
Wywoływanie funkcji systemowych
Otwieranie wbudowanych okien (menu, zapis, itp.) zostało usystematyzowane Za dodano możliwość otworzenia kilku innych, już istniejących. Dokonuje się tego za pomocą @sys.call i podanie pożądanej funkcji do wywołania:
- .saveMenu – otwiera okno zapisu
- .loadMenu – otwiera okno wczytania
- .partyMenu – otwiera menu
- .optionMenu – wywołuje menu opcji graficznych dostępne pod F6
- .licenseMenu – wywołuje menu licencji
- .debugMenu – wywołuje debugger dostępny pod F9
- .toggleFullscreen – przełącza między trybem okienkowym i pełnoekranowym
- .f12 – restartuje grę
Jeśli z jakiegoś powodu chcemy zablokować możliwość wywołania danego okna – nic prostego, postępujemy tak samo, zmieniając jedynie @sys.call na @sys.limitation.
BingShan nie byłby sobą, gdyby nie sypnął garścią nowych ficzerów. Dochodzi kilka ciekawych funkcji systemowych:
- @sys.getInfo.mapSize.dst v[numer] – pobiera szerokość i wysokość mapy (w kafelkach) i umieszcza je odpowiednio w zmiennych numer i vnumer+1
- @sys.getInfo.tiles X, Y, W, H .lower/.upper .dst v[numer] – pobiera obszar kafelków mapy o wymiarach W na H, z górnym lewym rogiem w punkcie o koordynatach X i Y. Jeśli chcemy uzyskać informacje o kafelkach z dolnej warstwy, używamy .lower. Jeśli z górnej – .upper. Informacje o ID kafli zaczynają się od zmiennej numer. Przyporządkowanie ID do kafli znajduje się w oknie komendy Rewrite Map:
- @sys.getInfo.winSize.dst v[numer] – pobiera nieprzeskalowaną szerokość i wysokość okna gry (w pikselach) i umieszcza je odpowiednio w zmiennych numer i numer+1.
- @sys.getInfo.pixel X, Y, W, H .dst v[numer] – opcja analogiczna do tej z operacji na obrazkach: pobiera informacje o kolorze pikseli w obszarze o wymiarach W na H o początku w punkcie o koordynatach X i Y. Dane są umieszczane w zmiennych począwszy od numer.
- @sys.gameOpt.mouse.disableMsgProcession(X) – przełącza obsługę okien wiadomości za pomocą myszki: LPM – OK, PPM – Anuluj. Wstawienie 0 za X wyłącza, a 1 włącza tę opcję.
- @sys.gameOpt.btlOrigin – ustawia pozycję walki na ekranie w domyślnym systemie walki. Przy użyciu domyślnej rozdzielczości opcja nie zmienia nic, jej działanie widać dopiero w wyższych niż 320×240. Istnieje kilka operatorów lokacji:
- .topLeft – lewy górny róg
- .top – góra po środku
- .topRight – prawy górny róg
- .left – lewo po środku
- .center – sam środek
- .right – prawo po środku
- .bottomLeft – lewy dolny róg
- .bottom – dół po środku
- .bottomRight – prawy dolny róg
Pętla For Each
Mały, aczkolwiek mile widziany dodatek do obecnych pętli. For Each przechodzi przez każdy wpis w danej tablicy po kolei, umożliwiając działania na obecnym elemencie. Elementami tablicy mogą być nie tylko zwykłe liczby (1, 2, 3…), ale też zmienne liczbowe (\v[1], \v[2]…). Na tę chwilę nie obsługuje zmiennych tekstowych.
- @foreach TABLICA .dst v[obecnyElement] – gdzie obecnyElement to zmienna, do której trafia wartość obecnego elementu pętli
Większa customizacja wbudowanych komend
TPC oprócz wstawiania nowych komend umożliwia edytowanie tych dodanych już wcześniej. W ten sposób można sparametryzować za pomocą zmiennych rzeczy, dla których wcześniej nie było to możliwe. Dzięki temu da radę ustawić za pomocą zmiennej m.in.:
- głośność/tempo/balans dźwięków lub muzyki oraz odtworzyć plik o nazwie zawartej w zmiennej tekstowej
- event, który ma wykonać Move Route (!)
- przeciwnika w Battle Events, na którym ma zostać wykonana komenda
…i dużo więcej (chociaż jeszcze nie wszystko), dlatego zachęcam do poeksperymentowania.
Pomniejsze nowości/zmiany zbyt małe na osobny paragraf
- @shop.goods v[numer], v[innyNumer]
- wywołanie sklepu zawierającego przedmioty o ID od numer do innyNumer
- @break .level N
- przeznaczone do używania w zagnieżdżonych pętlach – wyłamywanie się z pętli N-tego poziomu
- @continue
- przeznaczone do używania w pętlach, pomija obecne wykonanie pętli i od razu przechodzi do kolejnego
- @save[ID].getInfo .name t[numer]
- wyciąga z save ID imię pierwszego bohatera do zmiennej tekstowej numer
Axer
Z każdym poradnikiem o Maniacsie coraz bardziej czuję jak przytłacza mnie mnogość możliwości tego rozszerzenia xD Tym bardziej rośnie moje uznanie do Axera za szybkie i skuteczne orientowanie się w tym wszystkim. Szczerze mówiąc z moimi możliwościami dopiero zaczynam ogarniać tak naprawdę używanie podstawowego RMa, jednak zawsze czytając te poradniki jestem zafascynowany i chciałbym zobaczyć jakiś duży, dopracowany i rozległy projekt korzystający z wszystkich ficzerów Maniacsa. To dość karkołomne zadanie, ale myślę, że mniejsze gierki, z ciekawymi skryptami opartymi na nowych funkcjach mogą zacząć się pojawiać, zwłaszcza, że poradniki Axera faktycznie motywują do wykorzystywania ich w grach i dają swego rodzaju inspirację.
Co za dawka wiedzy! Zaskakuje mnie, ile można osiągnąć w starych Makerach za pomocą tego patchu, które (pomimo przerażającego na pierwszy rzut oku kodu) potrafią znacząco ułatwić nam pracę jako twórcom. Najbardziej w oko wpadło mi personalizowanie wielkości okna oraz używanie zmiennych stringów – ile zaoszczedzi to warunków i pamiętania, która wartość odpowiada za ręcznie przypisane słowo… <3 świetna robota, Axer, dzięki za przetestowanie i przetłumaczenie na polski mnogości tych funkcji!
Póki co dla mnie to jest temat jeszcze nie do ogarnięcia, ale powoli zmierzam w jego kierunku. Myślę, że przydałoby się trochę mniejszych tutoriali, które pozwoliłyby zobaczyć, jak wykorzystywać wszystkie te nowe ficzery w praktyce. Robota jest świetna i chętnie zobaczę kolejne części tego kursu!
„systemów rozumienia wprowadzanego pisma” – czekam aż jakiś świr zaimplementuje w maniacsie sieci neuronowe i legendarne generowanie fabuły do gry będzie w całości możliwe XD Tylko z wydajnością może być kiepsko.
Możliwości RM 2k3 z maniacsem są w tym momencie ogromne, jak BingShanowi uda się poprawić drażniące detale to będzie na znacznie lepszej pozycji w stosunku do innych silników niż w oryginalnej wersji. Czekam na kolejne części, bo Axur pokazał, że sprawdza się w roli maniacsowego mentora :>
„Jeśli robiliśmy przy otwartym makerze, należy go zamknąć i otworzyć ponownie. Voilà, od teraz kliknięcie Create with tpc i Edit with tpc powinno otwierać duże, puste okno TPC, gdzie można wprowadzać komendy.”
Trochę się zamotałem w tym fragmencie, bo próbowałem otworzyć TPC nie w obiekcie, a „na mapie”, możliwe że to przez godzinę, o której to robię, ale ten screen trochę mnie zmylił. Sam materiał super, aż mnie skłonił żeby zobaczyć co daje ten Maniacs i daje dużo, na razie mam frajdę z samej eksploracji, dobre polecenie, dobra robota.
.toNum v[numer] działa tylko na liczby dodatnie – zapisuję to jako komentarz na wypadek, gdyby ktoś wpadł na równie głupi pomysł co ja, próbując zapisać liczbę ujemną z pliku… [*]
Teraz już dla ujemnych też działa.