Contents |
Kody ciągów
Teksty w TTD są głównie w zestawie znaków Latin-1 (ISO-8859-1) (z wyjątkiem kodowania UTF-8; patrz poniżej), jednak kilka znaków jest różnych. Ponadto niektóre postacie mają specjalne znaczenie. Zostały one wyjaśnione w poniższej tabeli.
Zakres, hex | Version | Znaczenie |
---|---|---|
00..1F | Znaki sterujące, nieużywane, z wyjątkiem następujących: | |
0.6-1.3.1 2.0 | 01 X przesunięcie w następnym bajcie ciągu (zmienna przestrzeń). Usunięto z OpenTTD od 1.3.2. | |
0.6 2.0 | 0D New line | |
0.6 2.0 | 0E Set small font size | |
0.6 2.0 | 0F Set large font size | |
0.6-1.3.1 2.0 | 1F X i Y przesunięcia w następnych dwóch bajtów ciągu. Usunięto z OpenTTD od 1.3.2. | |
20..7A | 0.6 2.0 | Znaki Latin-1/ASCII, od spacji " " do małe litery "z" |
7B..87 | Instrukcje formatowania, wszystkie wziąć ich argument ze stosu, jeśli nie określono inaczej | |
0.6 2.0 | 7B Print signed dword | |
0.6 2.0 | 7C Print signed word | |
0.6 2.0 | 7D Print signed byte | |
0.6 2.0 | 7E Print unsigned word | |
0.6 2.0 | 7F Print dword in currency units | |
0.6 2.0 | 80 Print substring (text ID from stack) | |
0.6 2.0 | 81 Print substring (text ID in next 2 bytes of string) | |
0.6 2.0 | 82 Print date (day, month, year) (based on year 1920) | |
0.6 2.0 | 83 Print short date (month and year) (based on year 1920) | |
0.6 2.0 | 84 Print signed word in speed units | |
0.6 2.0 | 85 Discard next word from stack | |
0.6 2.0 | 86 Rotate down top 4 words on stack | |
0.6 2.0 | 87 Print signed word in litres | |
88..98 | Colour codes | |
0.6 2.0 | 88 Blue | |
0.6 2.0 | 89 Light Gray | |
0.6 2.0 | 8A Light Orange ("Gold") | |
0.6 2.0 | 8B Red | |
0.6 2.0 | 8C Purple | |
0.6 2.0 | 8D Gray-Green | |
0.6 2.0 | 8E Orange | |
0.6 2.0 | 8F Green | |
0.6 2.0 | 90 Yellow | |
0.6 2.0 | 91 Light Green | |
0.6 2.0 | 92 Red-Brown | |
0.6 2.0 | 93 Brown | |
0.6 2.0 | 94 White | |
0.6 2.0 | 95 Light Blue | |
0.6 2.0 | 96 Dark Gray | |
0.6 2.0 | 97 Mauve (grayish purple) | |
0.6 2.0 | 98 Black | |
99 | 2.5 | Przełącz się na kolor firmy, który następuje w następnym bajcie (włączone przez enhancegui) |
9A | Rozszerzony kod formatu w następnym bajcie: | |
0.6 2.5 | 9A 00 -lub- 9A 01 Wyświetlanie 64-bitowej wartości ze stosu w jednostkach walutowych | |
2.6 | 9A 02 Ignoruj następny bajt kolorystyczny. Wiele wystąpień pominie wiele bajtów kolorów. | |
0.6 2.6 | 9A 03 WORD Push WORD na stosie odnośnika (textref) | |
0.6 2.6 | 9A 04 BYTE Un-print poprzednie znaki BAJTów. | |
2.6 | 9A 05 Tylko do użytku wewnętrznego. Nieprawidłowe w plikach GRF. | |
0.7 2.6 | 9A 06 Print byte in hex | |
0.7 2.6 | 9A 07 Print word in hex | |
0.7 2.6 | 9A 08 Print dword in hex | |
2.6 | 9A 09 Tylko do użytku wewnętrznego. Użycie w NewGRFs najprawdopodobniej crash TTDPatch. | |
2.6 | 9A 0A Tylko do użytku wewnętrznego. Użycie w NewGRFs najprawdopodobniej crash TTDPatch. | |
1.0 2.6 | 9A 0B Print 64-bit value in hex | |
1.1 2.6 | 9A 0C Print name of station with id in next textrefstack word | |
1.1 | 9A 0D Print unsigned word in tonnes | |
1.1 | 9A 0E Ustaw płeć ciągu, wewnętrzny identyfikator NewGRF w następnym bajcie. Musi być pierwszy w ciągu.[1] | |
1.1 | 9A 0F Wybierz przypadek dla następnego podciągacza, wewnętrzny identyfikator NewGRF w następnym bajcie. [1] | |
1.1 | 9A 10 Rozpocznij wartość listy wyboru, wewnętrzny identyfikator NewGRF w następnym bajcie. [2] | |
1.1 | 9A 11 Domyślna lista rozpoczynania wyboru [2] | |
1.1 | 9A 12 Lista wyboru końcowego [2] | |
1.1 | 9A 13 Rozpocznij listę wyboru płci, przesunięcie stosu podciągów, aby uzyskać płeć z następnego bajtu. [2] | |
1.1 | 9A 14 Rozpoczyna lista wyboru przypadków [2] | |
1.1 | 9A 15 Rozpocznij listę wyboru liczby mnogiej, przesunięcie stosu wartości, aby uzyskać liczbę mnogą w następnym bajcie. [3] | |
1.2 | 9A 16 Print dword as date (day, month, year) (based on year 0) | |
1.2 | 9A 17 Print dword as short date (month and year) (based on year 0) | |
1.2 | 9A 18 Print unsigned word in horse power | |
1.2 | 9A 19 Print unsigned word as short volume | |
1.2 | 9A 1A Print unsigned word as short weight | |
1.4 | 9A 1B Użyj dwóch słów, aby wydrukować ilość ładunku (długa forma: "10 worków poczty"). Pierwsze słowo to typ ładunku (przetłumaczony dla wersji GRF >= 7), drugie słowo to kwota. Kwota jest automatycznie konwertowana zgodnie z ustawieniami jednostki/ustawień regionalnych. | |
1.4 | 9A 1C Użyj dwóch słów, aby wydrukować ilość ładunku (krótka forma: "10 worków"). Pierwsze słowo to typ ładunku (przetłumaczony dla wersji GRF >= 7), drugie słowo to kwota. Kwota jest automatycznie konwertowana zgodnie z ustawieniami jednostki/ustawień regionalnych. | |
1.4 | 9A 1D Użyj dwóch słów, aby wydrukować ilość ładunku (mała forma: "10"). Pierwsze słowo to typ ładunku (przetłumaczony dla wersji GRF >= 7), drugie słowo to kwota. Kwota jest automatycznie konwertowana zgodnie z ustawieniami jednostki/ustawień regionalnych. | |
1.7 | 9A 1E Drukowanie niepodpisanego wyrazu jako nazwy typu ładunku (przetłumaczone dla GRF wersji >= 7). | |
1.10 | 9A 1F Wsuń bieżący kolor na stos kolorów. Użyj tego, jeśli chcesz przełączyć kolor i przywrócić później. | |
1.10 | 9A 20 Pop ostatni kolor z stosu kolorów. Użyj tego, aby przywrócić poprzedni kolor. | |
9B..9D | Reserved | |
9E..FF | 0.6 2.0 | Znaki łacińskie-1, z wyjątkiem następujących: |
0.6 2.0 | 9E Euro character "€" | |
0.6 2.0 | 9F Capital Y umlaut "Ÿ" | |
0.6 2.0 | A0 Scroll button up | |
0.6 2.0 | AA Scroll button down | |
0.6 2.0 | AC Tick mark | |
0.6 2.0 | AD X mark | |
0.6 2.0 | AF Scroll button right | |
0.6 2.0 | B4 Train symbol | |
0.6 2.0 | B5 Truck symbol | |
0.6 2.0 | B6 Bus symbol | |
0.6 2.0 | B7 Plane symbol | |
0.6 2.0 | B8 Ship symbol | |
0.6 2.0 | B9 Superscript -1 | |
0.6 2.0 | BC Small scroll button up | |
0.6 2.0 | BD Small scroll button down |
- ↑ 1.0 1.1 Zerknij Setting genders and cases.
- ↑ 2.0 2.1 2.2 2.3 2.4 Zerknij Choosing strings depending on required gender or case.
- ↑ Zerknij Using plural forms.
Instrukcje formatowania nie mogą być używane z wyjątkiem ciągów, które ich oczekują, a następnie mogą nie być w porządku (z możliwym wyjątkiem kodu 86 tasowania wewnętrznego stosu). Przy niewłaściwym użyciu najprawdopodobniej spowodują awarię TTD. Kod 81 jest zawsze bezpieczny w użyciu (pod warunkiem, że przywoływany tekstowy ID również nie używa niebezpiecznych instrukcji formatowania) i wstawi podany tekstowy ID (np. "\81\3D\A0" wstawi tekstowy ID A03D, "\98Refit Aircraft" ). Pamiętaj jednak, że jeśli chcesz dołączyć np. ID D000/D400, bajt 00 będzie uważany za koniec łańcucha, a zatem zostanie zerwany, jeśli w akcji mają pojawiać się dodatkowe teksty 4. Nie należy dołączać ID`ów DCxx; ani kody 80, ani 81 nie mają prawidłowego dostępu do ID`ów DCxx.
Każda instrukcja formatowania usuwa swój argument ze stosu, dzięki czemu następna otrzyma następujące bajty jako argumenty. Kod 86 pobiera cztery pierwsze słowa ze stosu, nazwijmy je W1 do W4 i zmieniam ich kolejność na W4 W1 W2 W3. Jest to używane w przypadku języków, w których gałęzie przemysłu lub stacje powinny być nazywane nie "Flinfingbury Power Plant" , ale "Power Plant Flinfingbury" .
Using genders and cases
1.1 Gdy wiele ciągów jest łączonych w jedno zdanie, części wpływają na siebie w różnych językach. Na przykład. możesz mieć ciąg "The <industrytype> closes due to next month." (zamyka się z powodu następnego miesiąca) , gdzie <industrytype> jest zastąpiony nazwą jakiegoś przemysłu (np. "brewery" , "textile mill" ). Jednak w języku niemieckim płeć <industrytype> wpływa na ciąg, do którego jest wstawiany. W przypadku "brewery" ("Brauerei") artykuł "The" przetłumaczono za pomocą "Die", a "textile mill" ("Textilwerk") "The" przetłumaczono za pomocą "Das".
W OpenTTD te interakcje ciągów nazywane są "rodzajami" (genders) i "przypadkami" (cases) . Chociaż nazwy te odnoszą się do popularnych konstrukcji gramatycznych w różnych językach, istnieje techniczna definicja tego terminu wrt. OpenTTD. Mogą one odpowiadać gramatycznym zastosowaniom płci i przypadków w niektórych językach lub mogą być używane do radzenia sobie z innymi konstrukcjami gramatycznymi.
Ogólnie, gdy ciąg I jest wstawiany do ciągu O:
-
Jeśli wewnętrzny ciąg I wpływa na zewnętrzny O:
- Mówi się, że mam płeć i
- O wybiera różne teksty w zależności od płci.
-
Jeśli zewnętrzny ciąg O wpływa na wewnętrzny I:
- O ustawia przypadek dla I, i
- Wybieram różne teksty w zależności od wymaganego przypadku.
Setting genders and cases
1.1 Kody ciągów 9A 0E i 9A 0F mapują wewnętrzny płeć lub ID NewGRF na płeć lub przypadek OpenTTD. ID wewnętrzny jest rozpoznawany do odpowiedniej płci lub przypadku OpenTTD w czasie ładowania za pomocą mapowania. Pobierany jest pierwszy wewnętrzny ID w odwzorowaniu, który pasuje do ID z łańcucha i ma istniejącą płeć lub wielkość liter OpenTTD, tj. Lista mapowań jest filtrowana według wewnętrznego ID i istnienia płci/wielkości liter OpenTTD, a następnie używany jest element górny . Jeśli ID płci lub sprawy nie jest znany lub nie istnieje płeć lub sprawa OpenTTD z nazwami odwzorowanymi, całe mapowanie jest ignorowane i przyjmowana jest domyślna płeć lub sprawa.
Example of gender translation table
// Gender translation table // Current OpenTTD German translation uses m, w, n and p but // support a (fictitious) previous version that used masculine, // feminine, neuter and plural as gender names. 0 * 56 00 08 01 01 02 13 01 "m" 00 01 "masculine" 00 02 "w" 00 02 "feminine" 00 03 "n" 00 03 "neuter" 00 04 "p" 00 04 "plural" 00 00 // Brauerei is a female word in German; this sets it as female. 1 * 40 04 0A 82 01 73 DC C3 9E 9A 0E 02 "Brauerei" 00
W takim przypadku OpenTTD szuka wewnętrznego ID 2 NewGRF w tabeli płci. To dałoby "w" i "kobiecy" (feminine) jako imiona płciowe OpenTTD. W obecnym OpenTTD pasowałoby to do "w" , w fikcyjnej starszej wersji OpenTTD pasowałoby do "żeńskiego" (feminine) .
Choosing strings depending on required gender or case
1.1 Kody ciągów od 9A 10 do 9A 14 odwzorowują płeć lub przypadek OpenTTD na wewnętrzny ID lub płeć NewGRF. Mapowanie jest rozwiązywane w czasie ładowania poprzez przeglądanie wszystkich przypadków lub płci Tłumaczenie OpenTTD zna mapowanie na wewnętrzne ID`y NewGRF. Jeśli mapowanie zostanie znalezione, wybierany jest domyślny element listy wyboru. Dzieje się tak, filtrując mapowanie według płci lub nazwy sprawy, a następnie używany jest wewnętrzny ID NewGRF górnego elementu.
Kody ciągów list wyboru są powiązane i muszą być używane w określony sposób:
Genders: 9A 13 <offset> (9A 10 <index> <string>)+ 9A 11 <default> 9A 12
Cases: 9A 14 (9A 10 <ndex> <string>)+ 9A 11 <default> 9A 12
Plurals: 9A 13 <offset> (9A 10 <index> <string>)+ 9A 11 <default> 9A 12
Przesunięcie (offset) to lokalizacja stosu (substring) podłańcucha/wartości, dla której chcesz uzyskać płeć/liczbę mnogą (plural) . Jest to rzeczywiste przesunięcie plus 80, tzn. Przesunięcie (offset) 0 staje się 80, a przesunięcie (offset) 1 staje się 81 w NFO.
Example of gender-dependent string
// Assuming the translation table of the previous example // A string with a gender choice list and a stack item that gets resolved 2 * 29 04 0A FF 01 1A DC "D" 9A 13 80 9A 10 1 "er" 9A 10 3 "as" 9A 11 "ie" 9A 12 " " 80 00
Wyobraź sobie, że "Brauerei" z poprzedniego przykładu znajduje się jako stos na stosie. Następnie ten ciąg znaków przekształciłby się w "Die Brauerei" .
To, co dzieje się w OpenTTD, polega na tym, że za każdym razem, gdy zostanie znaleziony kod "Rozpocznij listę wyboru płci" , rozpozna ciąg w danym miejscu stosu. Z tego rozstrzygniętego ciągu pierwszy znak jest porównywany z kodem ciągu "ustaw płeć" , a jeśli tak, to pobierana jest (odwzorowana) płeć OpenTTD. Gdy występuje ciąg znaków "ustaw płeć" , używana jest pierwsza płeć OpenTTD. Po rozstrzygnięciu płci OpenTTD płeć jest odwzorowywana odwrotnie na wewnętrzny ID NewGRF. Jeśli ten wewnętrzny ID NewGRF istnieje w jednej z "wartości listy wyboru" , to brany jest (pod) ciąg znaków (aż do następnej wartości listy wyboru/wartość domyślna). Jeśli nie ma odwrotnego odwzorowania łańcucha przy "domyślnej liście wyboru" , używany jest kod ciągu aż do łańcucha "końcowej listy wyboru" . Dalsze przetwarzanie ciągu następuje po liście wyboru, tzn. (Pod) ~Sub ciągi na liście wyboru nie mogą zawierać żadnych specjalnych kodów ciągów oprócz kodów kolorów.
Listy wyboru wielkości liter działają w podobnej sprawie, z tą różnicą, że zamiast rozstrzygania wielkości liter z (pod) łańcucha znaków "jesteśmy" podciągiem; ciąg zawierający ten podciąg ustawił wielkość liter przy użyciu kodu łańcucha "wybierz wielkość liter" (select case) . W związku z tym nie trzeba przesuwać listy wyboru, ale reszta działa w taki sam sposób jak listy wyboru płci.
Using plural forms
1.1 Lista mnoga działa jak lista płci, jednak musisz wybrać jedno "mapowanie" (mapping) od wartości do indeksu liczby mnogiej, ustawiając formę liczby mnogiej za pomocą Action0/Global Settings property 15.
Jeśli na przykład wybrano liczbę mnogą 0 za pomocą właściwości Action0/Global Settings 15, wówczas istnieją 2 wskaźniki liczby mnogiej. Jeśli wartość na stosie z danym przesunięciem wynosi 1, otrzymasz indeks liczby mnogiej 1, w przeciwnym razie indeks liczby mnogiej 2. Te wskaźniki liczby mnogiej są wskaźnikami używanymi na listach wyboru.
Plural form | Plural index | Description |
---|---|---|
0 | Two forms: | |
1 | 1 | |
2 | rest | |
1 | Only one form: | |
1 | every form | |
2 | Two forms: | |
1 | 0 or 1 | |
2 | rest | |
3 | Three forms: | |
1 | ending in 1, but not ending in 11 | |
2 | 0 | |
3 | rest | |
4 | Five forms: | |
1 | 1 | |
2 | 2 | |
3 | 3-6 | |
4 | 7-10 | |
5 | rest | |
5 | Three forms: | |
1 | ending in 1, but not ending in 11 | |
2 | ending in 2-9, but not ending in 1[2-9] | |
3 | rest | |
6 | Three forms: | |
1 | ending in 1, but not ending in 11 | |
2 | ending in 2-4, but not ending in 1[2-4] | |
3 | rest | |
7 | Three forms: | |
1 | 0 | |
2 | ending in 2-4, but not ending in 1[2-4] | |
3 | rest | |
8 | Four forms: | |
1 | ending in 01 | |
2 | ending in 02 | |
3 | ending in 03 or ending in 04 | |
4 | rest | |
9 | Two forms: | |
1 | ending in 1, but not ending in 11 | |
2 | ret | |
10 | Three forms: | |
1 | 1 | |
2 | 2-4 | |
3 | rest | |
11 | Two forms: | |
1 | ending in 0, 1, 3, 6, 7 and 8 | |
2 | ending in 2, 4, 5 and 9 | |
12 | Four forms: | |
1 | 1 | |
2 | 0 or ending in 02-10 | |
3 | ending in 11-19 | |
4 | rest | |
13 | Four forms: | |
1 | 1, 11 | |
2 | 2, 12 | |
3 | 3..10, 13..19 | |
4 | rest |
Example of string using plural forms
// Set the plural type to type 0 0 * 7 00 08 01 01 02 15 00 // In case of the first stack item being 1 use "Tonne", otherwise use "Tonnen" 1 * 34 04 0B 82 01 1A DC C3 9E "\UE07C Tonne" 9A 15 80 9A 10 01 "" 9A 11 "n" 9A 12 " Sand" 00
UTF-8 support
0.6 2.5 Od TTDPatch 2.0.1 alpha 68, TTDPatch obsługuje łańcuchy wejściowe zakodowane w UTF-8. Użyj action 12 , aby zdefiniować glify dla znaków, które nie istnieją w plikach .grf TTD (możliwe od wersji TTDPatch 2.0.1 alpha 73).
Aby wskazać, że dany ciąg ma kodowanie UTF-8, zacznij go od dużego 'ciernia' ↔ (U+00DE, "Þ"), zakodowane w UTF-8 jak zwykle bajtami C3 9E. Zakłada się, że wszystko w tym ciągu ma kodowanie UTF-8, z następującym wyjątkiem: jeśli pojawią się znaki, które nie są prawidłowymi sekwencjami UTF-8, zakłada się, że są one jednym z powyższych kodów sterujących. W ten sposób nadal można pisać, np. "ÞPojemność (Capacity): " 87 "litrów" (litres), bez kodowania 87 w UTF-8 (co zamiast tego oznaczałoby znak zainstalowany w punkcie kodowym U+0087).
Ponadto pozwala to na stosowanie znaków innych niż Unicode 9E, 9F, A0, AA, AC, AD, AF, B4..B9, BC i BD z powyższej listy, które po zakodowaniu za pomocą UTF-8 odnosiłyby się do ich odpowiednich Zamiast tego znaki Unicode. Aby użyć znaków TTD, po prostu nie koduj ich za pomocą UTF-8, ale wprowadź je bezpośrednio jako bajty. To powoduje, że są one nieprawidłową sekwencją UTF-8 i pozwalają TTDPatch na użycie poprawnego symbolu z czcionek TTD.
Alternatywnie, te symbole (w rzeczywistości zestaw znaków TTD od 20 do FF) są również odwzorowane w prywatnym obszarze użytkowania Unicode w U+E0xx, więc aby zakodować symbol ciężarówki, możesz również użyć znaku U+E0B5, chociaż to będzie prawdopodobnie postacią niedrukowalną w większości edytorów tekstu.
Wreszcie, znaki 7B..7F nie działają już jak powyższe instrukcje formatowania, ale zamiast tego będą wyświetlać regularne glify (pod warunkiem, że są zainstalowane; domyślnie TTD nie ma w tych punktach kodowych). Zamiast tego, aby skorzystać z instrukcji formatowania w trybie UTF-8, musisz użyć ich punktu kodowego Prywatnego Obszaru Użytkowania w U+E0xx.
Zasadniczo istnieją trzy możliwości:
- Znaki U+E020..U+E0FF w prywatnym obszarze użytkowania E0xx robią to, co ich znak xx zrobiłby w TTD, podobnie jak znaki kontrolne poniżej U+0020
- Wszystkie inne prawidłowe sekwencje UTF-8 wyświetlają rzeczywiste glify (glyphs), jeśli są dostępne
- Wszystkie niepoprawne sekwencje UTF-8 robią to, co robią ich poszczególne bajty w TTD
Podsumowując, oto przydatna tabela:
'Znak' | Kodowanie w trybie UTF-8 | Znaczenie |
---|---|---|
7E | 7E | Unicode 'Znak' 'TILDE' (~) |
82 | 82 ('nieprawidłowy' UTF-8) | 'Wydrukuj datę (dzień, miesiąc, rok)' |
82 | C2 82 | Wyświetl 'glif' dla U+0082 |
AC | AC (nieprawidłowy UTF-8) | 'Tick mark' |
AC | C2 AC | Unicode 'Znak' 'NOT SIGN' (¬) |
E07E | EE 81 BE | 'Drukuj słowo bez znaku' |
E082 | EE 82 82 | Wydrukuj datę (dzień, miesiąc, rok) |
E0AC | EE 82 AC | 'Tick mark' |