auxFunctions
EN PL |
Korzystanie z funkcji pomocniczych
etykieta
W m4nfo funkcje 'pomocnicze' są używane w kontekście funkcji wydajnościowych, najprawdopodobniej wewnątrz ich list parametrów, w celu dostosowania ich wyników lub uporządkowania parametrów specjalnych.
'Zasięg' | Funkcja | Opis |
---|---|---|
Blok | engine/industry/town | Oznaczanie hierarchii w blokach funkcji wydajności |
Lista parametrów | label | obrót 4-char <Label> w DWORD |
little/lots | Ocena zestawu 'sprites' stacji | |
load/move | Ocena zestawu sprite'ów pojazdu | |
nibble/pos | Pakowanie i rozpakowywanie współrzędnych | |
signed | Wprowadzanie liczb ujemnych za pomocą uzupełnienia dwóch | |
shiftmask/shiftmask_add_div/shiftmask_add_mod | dostosowanie wyników funkcji wydajności |
Te funkcje definiują poziom hierarchii. Większość funkcji TTD ma powiązany lub "macierzysty" obiekt:
'Cecha' | Powiązany obiekt | Funkcja |
---|---|---|
_TRAIN /_ROADVEHICLE /_SHIP /_AIRCRAFT | Pierwszy pojazd 'składu' (jeśli istnieje) | engine() |
_STATION | Miejscowość, do której należy ta stacja | town() |
_BRIDGE | Miejscowość mostu | |
_HOUSE | 'Miejscowość budowli' | |
_INDUSTRYTILE | Przemysł zawierający ten kafel | industry() |
_INDUSTRY | Miejscowość, do którego należy ta branża | town() |
_OBJECT | Miejscowość obiektu |
Oznacza to, że "umieszczanie w nawiasach" bloku w m4nfo przez dowolną z tych funkcji oznacza adresowanie obiektu powiązanego z funkcjami zamiast bieżącego. Oznacza to, że w przypadku funkcji _TRAIN użycie funkcji engine() spowodowałoby zapytanie o dane nie z bieżącego pojazdu w składzie pociągu, ale z lokomotywy, a w przypadku domu użycie polecenia town() zapyta o miejscowośc dom 'należy' do.
Przykład (sprawdzenie wieku silnika
'consist'):
def(6) yearbuilt( engine( ref(4) if(< 1922) ref(5) else ) )
Funkcja ta przekształca liczbę ujemną w jej uzupełnienie.Do użycia w funkcji if(), w przypadku, gdy funkcja bloku zwraca wynik ujemny, np. funkcja działania stacji plt_midpos():
Przykład (sprawdzenie wieku silnika składu ):
def(9) plt_midpos( self( ref(6) if(signed(-2)) ref(7) if(signed(-1)) ref(8) if(0) ref(9) if(1) ref(0) else ) )
Funkcja ta służy do przekształcenia etykiety 4-char, np. grf ID, w słowo Dword :
Przykład (sprawdzenie grf ID dla przyległych kafli stacji ):
def(11) tinfo_grfid(pos(1,0), ref(1) if(label(6D 62 06 01)) // or 6D620601 or GRF_NEWSTATIONS ref(0) else )
Znaki etykiety muszą być podane jako kody ascii, a nie jako znaki rzeczywiste.
Ta funkcja służy do sprawdzania zwróconej wartości współrzędnych spakowanych-bajtami w zwykłej postaci (<x></x>, <y></y>). Zakres parametrów to [-8], zarówno dla przesunięć x, jak i y. Zobacz przykład:
Przykład (sprawdzenie położenia kafla w obiekcie):
def(51) position( ref(47) if(nibble(0,0)) // upper part ref(46) else // lower part )
Ta funkcja dostarcza podane współrzędne w postaci upakowanej-bajtami do innej funkcji. Zakres parametrów to [-8], zarówno dla współrzędnych x, jak i y. Należy pamiętać, że współrzędna (0,0) odnosi się do samego bieżącego kafla. Zobacz przykład:
Przykład (sprawdzanie typu sąsiadującego (x = 0, y = -1) kafla obiektu):
def(1) objinfo_type(pos(0,-1), cbr(1) if(_MOLE,_QUAY,_QUAYEXT1 .. _QUAYEXT4) cbr(0) else )
Ta funkcja służy do definiowania zestawu stanów obciążenia pojazdu. Liczby na podanej liście muszą odnosić się do numerów zestawów sprite z poprzedniej funkcji spriteblock(). Liczby przedstawiające grafikę, którą pojazd powinien pokazywać podczas załadunku lub rozładunku. Na przykład, jeśli ma dwa stany, pełny lub pusty, wymagałoby to dwóch parametrów. Jeśli ma trzy stany, pełny, w połowie pełny lub pusty, potrzebowałby trzech.
Ta funkcja służy do definiowania zestawu stanów ruchu pojazdu. Liczby na podanej liście muszą odnosić się do numerów zestawów sprite z poprzedniej funkcji spriteblock(). Znaczenie jest takie samo jak powyżej.
Przykład 1 (wagon os.):
spriteset(move(0),load(0))
Przykład 2 (freight wagon): spriteset(move(0,1,2,3),load(0,1,2,3)) Przykład 3 (freight wagon): spriteset(move(0,9,11),load(0,8,10))
W przykładzie 1 'powóz' używa tego samego sprite'a (numer 0, pierwszy sprite w bloku sprite) zarówno dla swojego jedynego stanu ruchu, jak i dla jedynego stanu ładowania. W przykładzie 2, wagon towarowy używa 4 różnych 'sprites' dla swoich stanów ruchu i używa tych samych 'sprites' dla swoich stanów załadunku. W przykładzie 3 wagon towarowy używa 3 różnych 'sprites' dla swoich stanów ruchu i używa 3 różnych 'sprites' dla swoich stanów załadunku.
Te dwie funkcje pomocnicze służą do definiowania zestawów stanów ładowania dla kafli stacji. Liczby na podanych listach muszą odnosić się do numerów zestawów sprite z poprzedniej funkcji spriteblock().
Podobnie w przypadku pojazdów, decyduje to o ustawieniu grafiki w zależności od ilości oczekującego ładunku. Są jednak dwa zastrzeżenia. Po pierwsze, na stacji może czekać 12 różnych ładunków, a nie tylko jeden. Po drugie, maksymalna kwota to 4095 dla wszystkich stacji i wszystkich rodzajów ładunków.
Jeśli chodzi o pierwszą kwestię, ilość ładunku, do którego się to odnosi, zależy od funkcji makestation(), która uruchomiła ten zestaw sprites():
- jeśli typ ładunku jest dokładnie dopasowany, jest to ilość pasującego ładunku (np. makestation() powiedziane "w przypadku węgla użyj tego zestawu spriteset()")
- jeśli użyto wartości domyślnej, jest to suma wszystkich typów ładunków
- jeśli stacja jest wyświetlana do 'budowy', wyświetlana jest kwota maksymalna
Przykład 1 (użyj zestawu sprite grafiki):
def(ALL_NORMAL) spriteset(little(0),lots(0))
Przykład 2 (wybierz wyniki 'callback' reprezentujące losowe sprites): def(1) cbset(little(0,0,8,16,24,32,40,48),lots(56)) def(2) cbset(little(0,8,16,24,32,40,48,56),lots(64)) def(3) cbset(little(0,16,24,32,40,48,56,64),lots(64)) def(4) randomcb(__roofs, ARRIVE,16,ref(1),ref(2),ref(2),ref(3))
Ta funkcja dostosowuje wynik funkcji wydajności do bardziej użytecznego zakresu. Jego pierwszy parametr definiuje wartość do przesunięcia w prawo wyniku funkcji, a drugi parametr oznacza wartość, z jaką należy wykonać ORAZ wynik po przesunięciu.
Zwróć uwagę, że parametr <mask> może mieć rozmiar WORD w danym kontekście. Zobacz przykład:
Przykład 1 (bity użytkownika pojazdu):
// check if only bit 0 set (long-distance only) def(6) getubits(shiftmask(0,UB_ALL), attach(ATT_OK) if(UB_F) // Fernverkehr ref(5) else ) Przykład 2 (sprawdź własne nachylenie kafla): def(8) tinfo_slope(pos(0,0),shiftmask(0,NORTH+SOUTH), ref(5) if(NORTH) ref(6) if(SOUTH) ref(7) else ) Przykład 3 (dostosuj wynik licznika animacji, aby losowo wstrzymywać animację): def(22) anim_counter(shiftmask(0,0x1FF), animframe(A_NEXT) if(0) // proceed - 'kontynuowanie' animframe(1) else // pozostanie w pauzie )
Jak wyżej, ta funkcja dostosowuje wynik funkcji wydajności do bardziej użytecznego zakresu. Jego pierwszy parametr definiuje wartość do przesunięcia w prawo wyniku funkcji, a drugi parametr oznacza wartość, z jaką należy wykonać ORAZ wynik po przesunięciu.
Ponadto trzeci i czwarty parametr określają wartości, aby jeszcze bardziej dostosować poprzedni wynik, dodając do niego i/lub dzieląc.
Podobnie, ta funkcja działa jak powyżej, tylko poprzez zastosowanie funkcji modulo zamiast dzielenia.