Skip to content

auxFunctions

extrazi edited this page Jun 25, 2023 · 11 revisions
original    original
EN     PL

Manual użytkownika m4nfo i Raport Techniczny

Funkcje pomocnicze

Korzystanie z funkcji pomocniczych

etykieta

Introduction

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
Opis

engine/industry/town(<block>)

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
 	)
 )

signed(- <Byte>)

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
 	)
 )

label(<Label>)

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.

nibble(<Coordinate>)

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
 )

pos(<Coordinate>)

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
 )

load(<List>)

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.

move(<List>)

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.

little(<List>), lots(<List>)

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
Jeśli chodzi o drugą kwestię, TTDPatch wprowadza rozróżnienie między ładunkiem "małym" a "dużym". Kwota, w której to nastąpi, jest ustawiana przez funkcję właściwości threshold() , która domyślnie wynosi zero. Ale jeśli jest ustawiona na wartość niezerową, na przykład 200, wówczas zakres od 0 do 199 jest dzielony przez <numlittlesets></numlittlesets>, a pozostały zakres od 200 do 4095 jest dzielony przez <numlotssets></numlotssets>. Jeśli threshold() jest ustawiona na zero, "małe" zestawy nigdy nie są używane, więc <numlittlesets></numlittlesets> może wynosić zero. Jednak <numlotssets></numlotssets> nigdy nie może mieć wartości zero.
 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))

shiftmask(<shift>,<mask>)

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
 )

shiftmask_add_div(<shift>,<mask>,<add>,<div>)

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.

shiftmask_add_mod(<shift>,<mask>,<add>,<mod>)

Podobnie, ta funkcja działa jak powyżej, tylko poprzez zastosowanie funkcji modulo zamiast dzielenia.