Skip to content

m4nfoInternalFunctions

extrazi edited this page Jun 1, 2021 · 4 revisions
original    original
EN     PL

Manual  m4nfo  &  Raport  Techniczny

funkcje wewnętrzne m4nfo

Funkcje do administrowania plikami źródłowymi m4nfo
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
W przeciwieństwie do setfeature(), te funkcje mogą być używane wielokrotnie.

Opis

export(m4_<String>)/import(m4_<String>) - Interfejs między plikami źródłowymi

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

forloop(<variable>, <m4nfo-expression>, <List> | <Range>)

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 .

import()

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

import_ctt()

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' .

include(<String>)

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.

setbaselabel(<Word>)

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

setfeature(<Feature>)

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.

setgrfversion(<version>)

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)
Ponieważ wersja GRF wpływa na zachowanie różnych funkcji newGRF, dotyczy to również m4nfo. Niektóre z tych różnic są obsługiwane automatycznie, ale inne, głównie wtedy, gdy użytkownicy dostarczają własne makra do wyników wywołania zwrotnego, muszą zostać uwzględnione. Kolejną ważną zmianą w wersji 8 jest usunięcie CB_LOAD i CB_WLEN (wywołania zwrotne nfo 12 i 11). Ich funkcjonalność została zastąpiona przez CB_PROP i użycie funkcji właściwości loadamount() i Vehlen(). Domyślnie dla m4nfo jest wersja 8. W przypadku, gdy potrzebujesz wersji 7, należy to ustawić przed funkcją grfinit().

setpath()

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

textmode_on()/textmode_off()

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.

word()

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