-
Notifications
You must be signed in to change notification settings - Fork 0
m4nfoInternalFunctions
EN PL |
Introduction |
Są to funkcje wewnętrzne, które nie kompilują żadnych źródeł m4nfo do plików newGRF, ale służą do zarządzania różnymi aspektami obsługi plików źródłowych m4nfo.
Funkcja | Opis |
---|---|
asl_on()/asl_off() | Przełącznik na 'Advanced Sprite Layout' |
export(m4_<String>)/import(m4_<String>) | Interfejs między plikami źródłowymi |
forloop(<variable>, <m4nfo-expression>, <List> | <Range>) | Ogólna iteracyjna funkcja tworzenia szablonów |
include(<String>) | dołącz inny plik źródłowy (M4) |
setbaselabel(<Word>) | Ustaw bazowy sprite zgodnie z blokiem sprite'ów |
setfeature(<Feature>) | Przypisz "funkcję" TTD |
setgrfversion(<version>) | Ustawia wersję GRF do użycia |
setpath(<String>) | Przypisz ścieżkę do katalogu graficznych 'sprites' |
textmode_on()/textmode_off() | Tymczasowo wyłącz przetwarzanie makr |
word(<Byte>) | Wymuś wartość rozmiaru WORD |
zoom32_on()/zoom32_off() | specjalna obsługa dla sprite'ów 32 bpp i/lub powiększonych, zobacz tutaj i tutorial |
Opis |
Aby skrócić czas kompilacji i poprawić przejrzystość kodera, m4nfo obsługuje rozproszone pliki źródłowe, a nawet łączenie wstępnie skompilowanych plików części grf. Dlatego potrzebny jest interfejs między plikami źródłowymi, który zapewniają funkcje export() i import().
W tej chwili dostępne są cztery moduły:
- m4_sys - automatycznie utworzony plik systemowy, ATM zawierający tylko specjalną zmienną "__parcount" , która przechowuje liczbę użytych dotychczas parametrów,
- m4_ctt - automatycznie utworzony plik zawierający zdefiniowaną przez użytkownika "tabelę translacji ładunku",
- m4_cost - automatycznie utworzony plik zawierający wszystkie vars potrzebne do rzeczywistych cen i schematu kosztów,
- m4_* - zapisywalny plik(i) zawierające ID-tekstowe (używane głównie dla newobjects )
Przykład 1 (initializing "real" price and cost): // file "dbxl90_0.nfx" setfeature(_TRAIN) import(m4_sys) setcurrency(DEM) // init vehicle prices & running costs basecost( ... {BUILD_ENGINES, maxengineprice(3'000'000)}, {BUILD_WAGONS, maxwagonprice(500'000)}, ) cargotranslationtable( {"PASS"}, {"MAIL"}, {"OIL_"}, {"LVST"}, ... {"BRCK"} )
Przykład 2 (defining vehicles): // file "dbxl90_3.nfx" // file "dbxl90_3.nfx" setfeature(_TRAIN) import(m4_sys) import(m4_ctt) import(m4_cost) definevehicle(_SLOW, {STR_LOW}, newgraphics() climate(TEMPERATE, ARCTIC) enginetype(WAGON) railtype(RAIL) lifecycle(1-1-1900, 1940, 1960) price(3000) runningcost(60) cargoclasses(+BULK, +PGOODS, +EXPRESS, -LIQUID, -REEF, -TRVL) cargolist(+FRUT, -LVST, -WOOL, -VEHI, -COPR, -BEAN, -NUTS, -JAVA) ... )
Przykład 3 (exporting user-defined text labels in MariCo): deftxt(warn_water, US, T_BLACK "Mole lights can only be built on water. Lights will be positioned automatically.", ... RUS, UTF8 T_BLACK "Маяки могут быть построены только на открытой воде. Позиция для маяка будет выбрана автоматически." ) ... export(m4_text, {warn_water}, {warn_coast}, {moles}, {molelight}, {specialquaytiles})
Należy pamiętać, że ID-ciągów w funkcji export() muszą być cytowane! Zobacz też deftxt() .
Ta funkcja wypisuje <m4nfo-expression> dla każdego ze swoich argumentów, podanych jako zakres (1 .. 3) lub lista (1,2,3). <variable> określa symbol używany w <m4nfo-expression>, który ma być zastąpiony przez bieżące argumenty, przy czym sama <variable> może zostać użyta wewnątrz wyrażenia algebraicznego. Zobacz przykłady tutaj .
Ta funkcja służy do "importu" wcześniej zdefiniowanych i wyeksportowanych etykiet do bieżącego pliku źródłowego. W tej chwili nie jest możliwy import tylko określonych etykiet, zawsze trzeba importować wszystkie etykiety.
Przykład (importing text labels in MariCo): include(mbobjects.m4) setfeature(_OBJECT) import() ...
Ta funkcja importuje ID-ładunku wcześniej zdefiniowane przez funkcję cargotranslationtable() w innym pliku źródłowym. Jest to potrzebne tylko w przypadku rozproszonych plików źródłowych i należy mieć na uwadze zależność między ID ładunku zdefiniowanymi przez CTT w jednym pliku, a ID-ładunku używanymi w innych, zarządzając nim np. za pomocą narzędzia do budowania śledzącego zależności, takiego jak 'Make' .
To makro M4 zawiera plik w bieżącej pozycji. Plik może zawierać dowolny prawidłowy kod m4nfo, prywatne stałe i/lub definicje makr.
Ta funkcja ustawia 'sprite bazowe' jako odniesienie dla etykiet, które mają być zdefiniowane w bloku sprite o rozszerzonym formacie . Jego parametr musi zgadzać się z parametrem podanym w następnym bloku 'sprites', identyfikującym pierwszy zestaw w bloku. Zobacz przykład:
Przykład (ustawianie etykiety podstawowej w blokach sprite'ów w rozszerzonym formacie): setbaselabel(333) spriteblock(+333, forloop(X, {set(sp_tomb_vi_guer0_{}X,template({NG_6p6M},tombereau.png,x(LAYOUT_SYMMETRIC),y(10)))}, 3 .. 5) ) def(0) spriteset(move(sp_tomb_vi_guer0_3), load(sp_tomb_vi_guer0_4)) def(1) spriteset(move(sp_tomb_vi_guer0_3), load(sp_tomb_vi_guer0_5))
Ta funkcja ustawia "funkcję" TTD (pojazd, stacja, dom, przemysł, ...), która ma być używana dla wszystkich funkcji w tym konkretnym pliku źródłowym. Musi być ustawiony na początku pliku (patrz przykład powyżej), przed użyciem którejkolwiek z funkcji m4nfo. Podczas pracy z rozproszonymi plikami źródłowymi należy to ustawić w każdym pliku. Listę zaimplementowanych funkcji można znaleźć tutaj .
Pamiętaj, że możesz ustawić (i używać) tylko jedną funkcję na plik. W przypadku, gdybyś musiał użyć więcej niż jednej funkcji w newGRF (np. Kafle branżowe, branże i ładunki), musisz podzielić je na różne pliki źródłowe.
Ta funkcja ustawia wersję GRF, która ma być używana dla nowego GRF. Parametr <version> musi mieć wartość '7' lub '8' , w zależności od używanej wersji GRF. Wersja 7 to ostatnia wersja GRF TTDPatch, a wersja 8 to aktualna wersja GRF OpenTTD.
Główne różnice między tymi wersjami to:
- wszystkie wyniki wywołań zwrotnych są 15-bitowe w v8
- w wersji 8 zmieniono znaczenie niektórych wyników wywołań zwrotnych (np. w celu sprawdzenia dostępności)
- wywołania zwrotne CB_WLEN i CB_LOAD zostały usunięte w wersji 8
- sloty ładunkowe (poza definicjami ładunku ) zostały usunięte w v8
- wysokości kafli w v8 są teraz mierzone w pikselach zamiast w poziomach wysokości (8 px)
Ta funkcja ustawia ścieżkę do katalogu dla używanych ikonek graficznych. Może to być ścieżka absolutna lub względna, w zależności od tego, co uzna za stosowne. Jest to wymagane tylko w plikach określających grafikę, czyli za pomocą funkcji sprite() .
Przykład (ustawienie ścieżki dla graficznych sprites): setfeature(_TRAIN) setpath(C:\eigene~1\mb\ttdlx\sprites\newvehicles\DBXL09\sprites) ... spriteblock( set( sprite(db_br18.pcx 226 30 01 13 48 -23 -9) ) )
Ustawienie ścieżki jest wymagane tylko dla plików źródłowych zawierających prawdziwe (graficzne) sprite'y, aw przypadku, gdy funkcja sprite() określa tylko nazwę pliku (co jest zalecane).
Alternatywnie, możesz bezpośrednio ustawić wewnętrzną zmienną PATH m4nfo:
define(PATH,{__NUMBER C:\eigene~1\mb\ttdlx\sprites\newvehicles\DBXL09\sprites})
Ponieważ makroprocesor M4 używa przecinka (",") jako separatora parametrów, przecinki w łańcuchach tekstowych mogą być problematyczne. Ponadto nazwy makr M4 i m4nfo w ciągach tekstowych również stanowią problem, ponieważ M4 lubi je rozszerzać również w tym kontekście. Zazwyczaj warto je cytować (np. "Specjalne kafle nabrzeża: kasa biletowa{,} ławki{,} marina{,} delfiny przy nabrzeżu"), ale zagnieżdżone wywołania funkcji mogą wymagać wielu cudzysłowów w zależności od poziomu zagnieżdżenia (np. "Wagon z platformą (ciężki {{load}} )").
Aby uchronić programistę przed liczeniem poziomów cytowania, funkcje textmode_on() i textmode_off() są używane do wyłączania przetwarzania makr M4 w ciągach m4nfo (" ... ") . Odbywa się to poprzez tymczasową zamianę znaku cudzysłowu (") na znak komentarza (//). W konsekwencji nie możesz używać normalnego komentarza wewnątrz bloku textmode_on() .. textmode_off(). Zamiast tego możesz użyć "#" jako rozwiązanie awaryjne, jeśli potrzebujesz komentarza wewnątrz takiego bloku.
Ogólnie, bloki funkcyjne m4nfo używają automatycznej oceny wielkości bajtów, słów lub podwójnych słów. Odbywa się to poprzez sprawdzenie pierwszego parametru w pierwszej funkcji if() i wzięcie pod uwagę typu wyniku funkcji (BYTE, WORD lub DWORD). Jednak mogą wystąpić sytuacje, w których nie działa to zgodnie z zamierzeniami, a w niektórych z tych przypadków funkcja word() może być używana do wymuszania oceny przy użyciu wartości o rozmiarze WORD. Pamiętaj, że jest to już nieaktualne i może zostać wycofane w przyszłości.
Przykład (użycie funkcji word() w celu wymuszenia oceny rozmiaru słowa): // ostatnia konserwacja po 1930 roku? def(8) lastmaintenance( engine( ref(4) if(word(0) .. 3653) // wciąż bawarski brąz ref(5) else // kontynuuj z DRG brown ) )