Skip to content

generalFunctions

extrazi edited this page May 31, 2021 · 5 revisions
original    original
EN     PL

Manual   M4nfo  i  Raport  Techniczny

Funkcje Ogólne

Korzystanie z funkcji ogólnych

Introduction

Funkcje ogólne są funkcjami niezależnymi od funkcji, np. do obsługi parametrów i błędów, rozgałęziania wewnątrz newGRF, definiowania ciągów tekstowych itp. W przeciwieństwie do funkcji globalnych, nigdy nie są używane w łańcuchu sterowania, ale są samodzielne lub jako parametry innych funkcji:

Funkcja Opis
Initialisation Funkcje inicjalizacyjne
Flow of control Przebieg funkcji kontrolnych i obsługa parametrów
Error handling Ffunkcje obsługi błędów i dezaktywacji newGRF
Auxiliary functions Funkcje pomocnicze
Callback helper functions Funkcje pomocnicze 'cb'
Sound handling Funkcje obsługi dźwięku
Recolouring Funkcje do ponownego kolorowania
Price and cost handling Funkcje uwzględniające 'real' ceny i koszty
basecost(<List::(<Label>,<Byte>)>) Ustalanie kosztów 'bazowych'
grf_override(<block>) Ddefiniuje 'nadpisania' newGRF
insertcomment(<String>) Wstawia trwały komentarz do wygenerowanego kodu nfo
random_[im]pair(<range>) uzyskać parzystą/nieparzystą liczbę losową z zakresu
readregister(<register>, <reference>) odczyta rejestr i 'łańcuch'
setproperties(<ID> | <Range::ID>) Zastosuje pojedynczą funkcję właściwości do ID funkcji
setrefreshbox(<block>) setrefreshbox
setregisters(<register>, <List::value>, <reference>) ustawia rejestr(y) i 'łańcuch'
snowlinetable(<Byte*12*32>) Ustawi dane dotyczące wysokości linii śniegu
Opis

basecost(<List::(<Label>,<Byte>))

Ta funkcja pozwala na ustawienie kosztów bazowych, które określają ile wszystko kosztuje w grze. Każdy koszt jest obliczany na podstawie (stałego) współczynnika pomnożonego przez koszt podstawowy, który jest korygowany co miesiąc o inflację.

Funkcja przyjmuje jako parametr listę par pozycji kosztów i współczynników. Domyślnym współczynnikiem wpisu kosztu podstawowego jest '1' , co powoduje, że koszt podstawowy pozostaje niezmieniony. Podwojenie współczynnika podwaja koszt bazowy, czynniki ujemne zmniejszają go o połowę (tj. -64,-32,-16,-8,-4,-2,1,2,4,8,16,32,64,128).

Dostępne wpisy kosztu podstawowego to:

ID Etykieta Default Opis
0x01 BUILD_TRACK 100 build track tile
0x02 BUILD_ROAD 95 build road tile
0x03 BUILD_SIGNAL 65 place signal
0x04 BUILD_BRIDGE 275 build bridge tile
0x05 BUILD_DEPOT 600 build rail depot
0x06 BUILD_RVDEPOT 500 build road vehicle depot
0x07 BUILD_SHIPDEPOT 700 build ship depot
0x08 BUILD_TUNNEL 450 build tunnel unit
0x09 BUILD_PLAT 200 build station platform tile
0x0B BUILD_AIRPORT 600 build airport tile
0x0C BUILD_BUS 200 build bus station
0x0D BUILD_LORRY 200 build lorry loading area
0x0E BUILD_DOCK 350 build dock
0x0F BUILD_ENGINE 400,000 locomotive purchase
0x10 BUILD_WAGON 2000 wagon purchase
0x11 BUILD_PLANE 700,000 build aircraft
0x12 BUILD_RV 14,000 road vehicle purchase
0x13 BUILD_SHIP 65,000 ship purchase
0x14 BUILD_TREE 20 plant tree
0x15 BUILD_LAND 250 raise/lower land
0x16 CLEAR_GRASS 20 clear grass tile
0x17 CLEAR_ROUGH 40 clear rough land tile
0x18 CLEAR_ROCK 200 clear rocky tile
0x19 CLEAR_FIELD 500 clear field tile
0x1A DEL_TREE 20 remove tree
0x1B DEL_TRACK -70 remove track tile
0x1C DEL_SIGNAL 10 remove signal
0x1D DEL_BRIDGE 50 remove bridge tile
0x1E DEL_DEPOT 80 remove rail depot
0x1F DEL_RVDEPOT 80 remove road vehicle depot
0x20 DEL_SHIPDEPOT 90 remove ship depot
0x21 DEL_TUNNEL 30 remove tunnel tile
0x22 CLEAR_WATER 10,000 clear water tile
0x23 DEL_PLAT 50 remove station platform tile
0x24 DEL_AIRPORT 30 remove airport tile
0x25 DEL_BUS 50 remove bus station
0x26 DEL_LORRY 50 remove lorry loading area
0x27 DEL_DOCK 55 remove dock
0x28 DEL_HOUSE 1600 remove house
0x29 DEL_ROAD 40 remove road tile
0x2A RUN_STEAM 5600 steam engine running cost
0x2B RUN_DIESEL 5200 diesel engine running cost
0x2C RUN_ELECTRIC 4800 electric engine running cost
0x2C RUN_ENGINE 4800 locomotive running cost
0x2D RUN_PLANE 9600 aircraft running cost
0x2E RUN_RV 1600 road vehicle running cost
0x2E RUN_WAGON 1600 wagon/coach running cost
0x2F RUN_SHIP 5600 ship running cost
0x30 BUILD_INDUSTRY 1,000,000 fund industry
0x31 DEL_INDUSTRY 1600 remove industry
0x32 BUILD_OBJECT 40 build object
0x33 DEL_OBJECT 40 remove object
0x34 BUILD_WAYP 600 build waypoint
0x35 DEL_WAYP 80 remove waypoint
0x36 BUILD_BUOY 350 build buoy
0x37 DEL_BUOY 50 remove buoy
0x3C BUILD_CANAL 5000 build canal
0x3D DEL_CANAL 5000 remove canal
0x3E BUILD_ACQUAE 10,000 build aquaeduct
0x3F DEL_ACQUAE 2000 remove aquaeduct
0x40 BUILD_LOCK 7500 build lock
0x41 DEL_LOCK 2000 remove lock
 Przykład (ustalone koszty bazowe 'train'):
 
 basecost(
 	{BUILD_SIGNAL,4},
 	{BUILD_BRIDGE,2},
 	{BUILD_DEPOT,4},
 	{BUILD_TUNNEL,8},
 	{BUILD_ENGINES,2},
 	{BUILD_WAGGONS,4},
 	{DEL_SIGNAL,2},
 	{DEL_BRIDGE,4},
 	{DEL_DEPOT,2},
 	{DEL_TUNNEL,8},
 )

Należy pamiętać, że użycie funkcji basecost() z wieloma parametrami da taką samą liczbę 'spriteów' kodu nfo. Dlatego jeśli trzeba pominąć funkcję basecost() , w funkcji skipif() należy użyć tej samej liczby, a nie tylko "1" . Aby zapoznać się z przykładem, zobacz tutaj .

grf_override(<block>)

Ta funkcja musi być używana, aby umożliwić newGRF modyfikowanie danych innego newGRF w OpenTTD. Zawiera listę 'źródłowych' i 'docelowych' nowych identyfikatorów GRF, aby umożliwić silnikom w źródłowym newGRF "nadpisanie" (override) tych w docelowym newGRF, ale tylko wtedy, gdy włączona jest funkcja "silników dynamicznych" OpenTTD.

Blok parametrów jest ustawiany przez jeden lub więcej wpisów funkcji maymodify() .

Można użyć wielu wpisów, a różne elementy newGRF można ustawić tak, aby przesłaniały ten sam 'docelowy' newGRF, ale aktywna jest tylko ostatnia instancja 'źródłowego' newGRF. Nowe identyfikatory GRF, które nie są obecne, nie będą miały żadnego efektu.

Zakres tej funkcji jest dość ograniczony i należy jej używać tylko dla zestawów modyfikujących dane innego zestawu, na przykład dodatku DBSetXL ECS do DBSetXL lub ocenzurowanej wersji LV4.

maymodify(<Label>, <Label>)

Ta funkcja przyjmuje parę identyfikatorów newGRF (1. source-ID, 2. dest-ID) i musi być używana w kontekście grf_override() , patrz wyżej.

 Przykład (DBXL_ECS may override DBXL):
 
 // "enginepool" only available in OTTD
 skipif(1, PLATFORM, ==, PATCH)
 
 // if OTTD: DBXL_ECS may override DBXL
 grf_override(
 	maymodify(GRF_DBXLECS, GRF_DBXL)
 )

random_[im]pair(<range>)

Są to dwie funkcje, które zwracają parzyste lub nieparzyste liczby losowe dla danego zakresu. Wartość zwracana to wywołanie zwrotne, które ma być używane jako dane wejściowe dla innych funkcji.

Np. Możliwe wyniki z

random_pair(4 .. 11) może wynosić 4, 6, 8 lub 10 i
random_impair(4 .. 11) może wynosić 5, 7, 9 lub 11.

Przyjemnym przypadkiem użycia byłoby włączenie randomizacji do funkcji setregisters () podczas pracy z ASL :

 def(_PAIR) random_pair(4 .. 35) // return even random numbers
 
 def(10) setregisters(5, sub(_PAIR), ref(RESOLVE))

który zastąpiłby ten jawny kod:

 Przykład:
 
 def(1) setregisters(5,4, ref(RESOLVE))
 def(2) setregisters(5,6, ref(RESOLVE))
 def(3) setregisters(5,8, ref(RESOLVE))
 def(4) setregisters(5,10, ref(RESOLVE))
 def(5) setregisters(5,12, ref(RESOLVE))
 def(6) setregisters(5,14, ref(RESOLVE))
 def(7) setregisters(5,16, ref(RESOLVE))
 def(8) setregisters(5,18, ref(RESOLVE))
 def(9) setregisters(5,20, ref(RESOLVE))
 def(10) setregisters(5,22, ref(RESOLVE))
 def(11) setregisters(5,24, ref(RESOLVE))
 def(12) setregisters(5,26, ref(RESOLVE))
 def(13) setregisters(5,28, ref(RESOLVE))
 def(14) setregisters(5,30, ref(RESOLVE))
 def(15) setregisters(5,32, ref(RESOLVE))
 def(16) setregisters(5,34, ref(RESOLVE))
 
 def(10) random(BUILT,16, ref(1),ref(2),ref(3),ref(4),ref(5),ref(6),ref(7),ref(8),
 	ref(9),ref(10),ref(11),ref(12),ref(13),ref(14),ref(15),ref(16))

Lub jeszcze lepiej, ustawienie rejestrów 5 (dla x-) i rejestru 6 (dla kierunku y) za jednym razem:

 def(_PAIR) random_pair(4 .. 35) // return even random numbers
 def(_IMPAIR) random_impair(4 .. 35) // return odd random numbers
 
 def(10) setregisters(5,{sub(_PAIR), sub(_IMPAIR)}, ref(RESOLVE))

Należy odnotować, że w przypadku stacji dostępne są tylko 4 losowe bity na płytkę. Aby więc uzyskać losowość opartą na kafelkach, nie używaj zakresów większych niż 16.

setproperties(<ID> | <Range::ID>)

Ta funkcja służy do ustawiania (lub nadpisywania) pojedynczej funkcji właściwości, albo dla pojedynczego ID , albo dla ciągłego zakresu ID. Jest to przydatne w przypadkach, gdy jedna właściwość musi zostać zmodyfikowana z przyczyn zewnętrznych, na przykład na podstawie wartości parametru.

ID mogą dotyczyć dowolnej funkcji TTD (pojazdy, stacje, domy, ...).

 Przykład 1 (ustaw właściwość typu kolei ze względu na wartość parametru):
 
 // main line electrified
 setproperties(_BR111,
 	railtype(SACE)
 )
 
 // branch line
 setproperties(_BR92 .. _BR38, 
 	railtype(SABN)
 )
 Przykład 2 (w przypadku NMF ustaw prześwit dla stacji na poziomy 3):
 
 skipif(1, PLATFORM, !=, NMF)
 setproperties(ANDRAE .. BUIR,
 	bridge_height({3,3,3,3})
 )

setregisters(<register>, <List::value>, <reference>)

Ta funkcja ustawia rejestry, zaczynając od <register> , na wartości podane na liście i łańcuchy do <reference> . Podanie '-' jako wartości powoduje zawieszenie ustawień powiązanych rejestrów, co może być przydatne w niektórych aplikacjach. Zamiast wartości można również dołączyć wywołanie podprogramu, używając funkcji pomocniczej sub (<Byte>). Jak zwykle, listę zawierającą więcej niż jedną wartość należy podać.

 // set registers "4 .. 6" to values "1,2,3" and chain
 def(6) setregisters(4, {1,2,3}, ref(0x14))
 
 // set registers "4 .. 6" to values "1,2,3" and register "8" to "4",
 // leave register "7" untouched
 def(6) setregisters(4, {1,2,3,-,4}, ref(0x14))
 
 // set register "4" to result of subroutine "5"
 def(6) setregisters(4, sub(5), ref(0x14))
 
 // set registers "4 .. 6" to values "1,2,3" and register "8" to
 // result of subroutine "__randomsprite", leave register "7" untouched
 def(6) setregisters(4, {1,2,3,-,sub(__randomsprite)}, ref(0x14))

Ta funkcja prawdopodobnie będzie używana w połączeniu z zaawansowanymi układami sprite (ASL). Zobacz przykład lub tutoriale .

snowlinetable(<Byte*12*32>)

Funkcja ta instaluje tzw. "tabelę wysokości linii śniegu" , która pozwala określić wysokość linii śniegu na każdy dzień roku. Tabela musi zawierać 12*32 = 384 bajtów, wartości będą odczytywane jako liczby szesnastkowe.

Aby uprościć sprawę TTDPatch, każdy miesiąc ma 32 wpisy, a niemożliwe kombinacje (takie jak 32 stycznia lub 31 kwietnia) nigdy nie zostaną odczytane. Wpisy powinny być wielokrotnością 8 lub mogą pojawić się pewne wizualne usterki. Wartości poniżej "10" (szesnastkowo!) I powyżej "EF" mogą powodować przepełnienie i nie należy ich używać. Ponieważ najwyższa możliwa ziemia ma wysokość 0x78, podanie „"88" lub więcej skutecznie wyłączy linię śniegu.

Jeśli włączona jest linia śniegu umiarkowanego , ta tabela ma również zastosowanie do temperatury umiarkowanej.

Uwaga:

W niektórych kodach w TTD zakłada się, że linia śniegu pozostanie stała:
niektóre gałęzie przemysłu są budowane tylko powyżej/poniżej linii śniegu i zakładają,
że linia śniegu nie będzie się poruszać, gdy są już zbudowane. Podobnie, zaśnieżone domy na Arktyce
nadal będą wyglądać na zaśnieżone, nawet jeśli wokół nich zniknie śnieg. Jeśli chcesz korzystać
z tej funkcji, pamiętaj, aby przeciwdziałać tym efektom, zastępując arktyczne domy i gałęzie
przemysłu wersjami uwzględniającymi śnieg.
 snowlinetable(
 	20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
 	20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 // jan
 	20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
 	20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 // feb
 	20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 28
 	28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 // mar
 	28 28 30 30 30 30 30 30 30 30 30 30 30 30 30 30
 	30 30 38 38 38 38 38 38 38 38 38 38 38 38 38 38 // apr
 	38 38 40 40 40 40 40 40 40 40 40 40 40 40 40 40
 	48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 // may
 	48 48 50 50 50 50 50 50 50 50 50 50 50 50 50 50
 	50 50 50 50 50 58 58 58 58 58 58 58 58 58 58 58 // jun
 	58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58
 	58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 // jul
 	58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58
 	58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 // aug
 	58 58 58 58 58 58 58 58 58 58 58 58 58 50 50 50
 	50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 // sep
 	50 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
 	48 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 // oct
 	40 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
 	30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 // nov
 	30 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
 	28 28 28 28 20 20 20 20 20 20 20 20 20 20 20 20 // dec
 )