11 KiB
MATRIX
Plansza złożona z prostokątnej siatki pól z prostym systemem fizyki kamieni i prymitywnym wyznaczaniem ruchu przeciwników. Zaprojektowany pod jeden, konkretny przypadek użycia — minigrę z podkopem (sekcje Kretesa w Reksio i Ufo: mur na Indorze oraz podkop do więzienia na Kuranie).
Dane planszy są przechowywane jako jednowymiarowa tablica liczb całkowitych — adres pola wyznacza się ze wzoru index = y * width + x. Stąd obecność metod konwertujących indeks na pozycję 2D i odwrotnie.
Kody pól
Wartości używane przez metody GET, GETCELLSNO, SET, SETROW i wewnętrzny system fizyki:
| Kod | Znaczenie |
|---|---|
0 |
puste pole |
1 |
grunt |
2 |
kamień |
3 |
laska dynamitu |
4 |
wyburzalna ściana |
5 |
przeciwnik |
6 |
nierozbijalna ściana |
7 |
odpalona laska dynamitu |
8 |
pole w zasięgu eksplozji |
9 |
wyjście |
99 |
pozycja Kretesa |
Kody kierunku ruchu
Wartości używane przez TICK, NEXT i CALCENEMYMOVEDIR:
| Kod | Kierunek |
|---|---|
0 |
w lewo |
1 |
w górę |
2 |
w prawo |
3 |
w dół |
Wewnętrzny system fizyki używa dodatkowych kodów zwracanych przez TICK i odczytywanych przez NEXT:
| Kod | Operacja |
|---|---|
1 |
kamień spada w dół |
2 |
kamień spada w lewo po skosie |
3 |
kamień spada w prawo po skosie |
4 |
kamień z przeciwnikiem eksplodują |
Pola
BASEPOS
INTEGER, INTEGER BASEPOS
Pozycja lewego górnego rogu planszy na ekranie w pikselach (X,Y).
CELLHEIGHT
INTEGER CELLHEIGHT
Wysokość pojedynczego pola w pikselach.
CELLWIDTH
INTEGER CELLWIDTH
Szerokość pojedynczego pola w pikselach.
SIZE
INTEGER, INTEGER SIZE
Wymiary planszy w polach (szerokość,wysokość). Wartość wyznacza również rozmiar wewnętrznej tablicy z kodami pól.
Metody
CALCENEMYMOVEDEST
INTEGER CALCENEMYMOVEDEST(INTEGER oldCell, INTEGER direction)
Wylicza indeks pola, na które przeciwnik przejdzie z pola oldCell przy ruchu w kierunku direction. Jeśli pole docelowe znajduje się poza planszą lub nie jest puste, zwracany jest niezmieniony oldCell.
Parametry
oldCell— bieżąca pozycja przeciwnika (indeks pola).direction— kierunek ruchu (0–3, zobacz Kody kierunku ruchu).
Zwraca: INTEGER — indeks pola docelowego.
Przykłady
MAT^CALCENEMYMOVEDEST(IENOLDCELL,IENNEWDIR);
CALCENEMYMOVEDIR
INTEGER CALCENEMYMOVEDIR(INTEGER oldCell, INTEGER oldDir)
Wylicza kierunek ruchu przeciwnika. Algorytm preferuje skręt w lewo: w pierwszej kolejności sprawdzany jest kierunek (oldDir+3) MOD 4, następnie oldDir, dalej w prawo i wreszcie do tyłu. Zwracany jest pierwszy kierunek, dla którego pole docelowe jest puste; jeżeli żaden nie jest dostępny — preferowany skręt w lewo.
Parametry
oldCell— bieżąca pozycja przeciwnika.oldDir— kierunek ruchu z poprzedniego kroku.
Zwraca: INTEGER — nowy kierunek ruchu.
Przykłady
MAT^CALCENEMYMOVEDIR(IENOLDCELL,IENOLDDIR);
CANHEROGOTO
BOOL CANHEROGOTO(INTEGER cellNo)
Sprawdza, czy główny bohater może wejść na podane pole. Pole jest przejezdne, jeżeli nie zawiera słabej ściany, mocnej ściany, przeciwnika ani kamienia, a także nie należy do obszaru bramy ustawionej metodą SETGATE.
Parametry
cellNo— indeks sprawdzanego pola.
Zwraca: BOOL — TRUE, jeżeli pole jest przejezdne.
Przykłady
MAT^CANHEROGOTO(I_0);
GET
INTEGER GET(INTEGER cellNo)
Zwraca kod pola o podanym indeksie. Dla indeksów spoza zakresu zwraca 0.
Parametry
cellNo— indeks pola.
Zwraca: INTEGER — kod pola (zobacz Kody pól).
Przykłady
MAT^GET(I_ITERATOR);
MAT^GET(I_MOLE_FIELD_CURR);
GETCELLOFFSET
INTEGER GETCELLOFFSET(INTEGER x, INTEGER y)
Zwraca indeks pola na podstawie współrzędnych (x, y). Dla współrzędnych spoza planszy zwracane jest -1.
Parametry
x,y— koordynaty pola.
Zwraca: INTEGER — indeks pola lub -1.
Przykłady
MAT^GETCELLOFFSET(ISSRCX,ISSRCY);
MAT^GETCELLOFFSET(ISTRGX,ISTRGY);
GETCELLPOSX
INTEGER GETCELLPOSX(INTEGER cellNo)
Zwraca pozycję X pola w pikselach (BASEPOS.X + col * CELLWIDTH).
Parametry
cellNo— indeks pola.
Zwraca: INTEGER — koordynata X w pikselach.
GETCELLPOSY
INTEGER GETCELLPOSY(INTEGER cellNo)
Zwraca pozycję Y pola w pikselach (BASEPOS.Y + row * CELLHEIGHT).
Parametry
cellNo— indeks pola.
Zwraca: INTEGER — koordynata Y w pikselach.
GETCELLSNO
INTEGER GETCELLSNO(INTEGER cellCode)
Zwraca liczbę pól z podanym kodem.
Parametry
cellCode— kod pola, którego wystąpienia mają zostać policzone.
Zwraca: INTEGER — liczba pól o podanym kodzie.
Przykłady
MAT^GETCELLSNO(IC_FIELD_CODE_EXIT);
MAT^GETCELLSNO(IC_FIELD_CODE_ENEMY);
GETFIELDPOSX
INTEGER GETFIELDPOSX(INTEGER cellNo)
Alias GETCELLPOSX używany w Reksio i Ufo z silnikiem Piklib 7.1. W Piklib 8 metoda nie jest już udostępniana — próba jej wywołania w nowszej wersji powoduje awarię silnika.
Parametry
cellNo— indeks pola.
Zwraca: INTEGER — koordynata X w pikselach.
GETFIELDPOSY
INTEGER GETFIELDPOSY(INTEGER cellNo)
Alias GETCELLPOSY używany w Reksio i Ufo z silnikiem Piklib 7.1. W Piklib 8 metoda nie jest już udostępniana — próba jej wywołania w nowszej wersji powoduje awarię silnika.
Parametry
cellNo— indeks pola.
Zwraca: INTEGER — koordynata Y w pikselach.
GETOFFSET
INTEGER GETOFFSET(INTEGER x, INTEGER y)
Alias GETCELLOFFSET używany w Reksio i Ufo z silnikiem Piklib 7.1. W Piklib 8 metoda została zastąpiona przez GETCELLOFFSET.
Parametry
x,y— koordynaty pola.
Zwraca: INTEGER — indeks pola lub -1.
ISGATEEMPTY
BOOL ISGATEEMPTY()
Sprawdza, czy wszystkie pola w obszarze bramy ustawionej metodą SETGATE mają kod 0 (puste). Jeśli brama nie została ustawiona, zwracane jest FALSE.
Zwraca: BOOL — TRUE, jeżeli wszystkie pola bramy są puste.
Przykłady
MAT^ISGATEEMPTY();
ISINGATE
BOOL ISINGATE(INTEGER cellNo)
Sprawdza, czy pole o podanym indeksie należy do obszaru bramy ustawionej metodą SETGATE.
Parametry
cellNo— indeks pola.
Zwraca: BOOL — TRUE, jeżeli pole znajduje się w obszarze bramy.
MOVE
void MOVE(INTEGER oldCell, INTEGER newCell)
Przesuwa zawartość pola źródłowego na pole docelowe; pole źródłowe pozostaje puste (kod 0).
Parametry
oldCell— indeks pola źródłowego.newCell— indeks pola docelowego.
Przykłady
MAT^MOVE(I_0,I_1);
NEXT
INTEGER NEXT()
Wykonuje kolejny zaplanowany ruch z kolejki wygenerowanej przez TICK. Pole źródłowe jest czyszczone, a pole docelowe otrzymuje kod kamienia. Po wykonaniu ruchu emitowany jest sygnał ONNEXT (dla wszystkich ruchów oprócz ostatniego) lub ONLATEST (dla ostatniego ruchu z kolejki).
Zwraca: INTEGER — 0, jeżeli kolejka jest pusta; 1 przy zwykłym ruchu kamienia; 2, jeśli kamień wylądował dwa pola nad Kretesem (kolizja).
Przykłady
MAT^NEXT();
SET
void SET(INTEGER cellNo, INTEGER cellCode)
void SET(INTEGER x, INTEGER y, INTEGER cellCode)
Ustawia kod pola. Metoda ma dwie formy: pierwsza przyjmuje gotowy indeks pola, druga — współrzędne (x, y).
Parametry
cellNo— indeks pola (forma 1).x,y— koordynaty pola (forma 2).cellCode— nowa wartość pola (zobacz Kody pól).
Przykłady
MAT^SET(I_MOLE_FIELD_CURR,IC_FIELD_CODE_EMPTY);
MAT^SET([I_FIELD_INDEX%I_LEVEL_WIDTH],[I_FIELD_INDEX@I_LEVEL_WIDTH],IC_FIELD_CODE_EMPTY);
SETGATE
void SETGATE(INTEGER startX, INTEGER startY, INTEGER endX, INTEGER endY)
Wyznacza prostokątny obszar bramy określony przez współrzędne początkowego i końcowego pola (włącznie). Brama wpływa na działanie metod CANHEROGOTO, ISGATEEMPTY oraz ISINGATE.
Parametry
startX,startY— koordynaty lewego górnego rogu obszaru bramy.endX,endY— koordynaty prawego dolnego rogu obszaru bramy.
Przykłady
MAT^SETGATE(3,1,16,4);
SETROW
void SETROW(INTEGER row, INTEGER cellCode1, [INTEGER cellCode2, ...])
Ustawia kody pól w podanym wierszu. Kolejne argumenty są wpisywane do pól od kolumny 0 w prawo; nadmiarowe argumenty (więcej niż szerokość planszy) są ignorowane.
Parametry
row— indeks wiersza.cellCode1,cellCode2, … — kolejne kody pól w wierszu.
Przykłady
MAT^SETROW(0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6);
MAT^SETROW(1,6,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,6,6);
TICK
void TICK()
Wykonuje jedno tyknięcie wewnętrznego systemu fizyki. Plansza jest skanowana od dołu do góry, od lewej do prawej. Dla każdego kamienia sprawdzane są kolejno:
- Czy pod kamieniem jest puste pole — zaplanowanie ruchu w dół.
- Czy pod kamieniem znajduje się przeciwnik — zaplanowanie eksplozji.
- Czy obok kamienia leży inny kamień, a pola na ukos w lewo lub w prawo są puste — zaplanowanie zsuwu po skosie.
Ruchy są zapisywane do wewnętrznej kolejki i wykonywane kolejno przez wywołania NEXT. Każdy wpis zawiera koordynatę X i Y pola źródłowego oraz kod operacji.
Przykłady
MAT^TICK();
Sygnały
ONINIT
Wywoływany w momencie inicjalizacji obiektu.
ONNEXT
Wywoływany przez NEXT po wykonaniu ruchu, który nie był ostatnim w bieżącej kolejce. Argumentami sygnału są: koordynata X ($1), koordynata Y ($2) i kod operacji ($3) pola źródłowego.
ONLATEST
Wywoływany przez NEXT po wykonaniu ostatniego ruchu z bieżącej kolejki. Argumenty sygnału są identyczne jak w ONNEXT.
ONSIGNAL
Wywoływany po otrzymaniu sygnału (zobacz Zdarzenia i sygnały).