- en
- pl
OpenTTD GitHub
Wkład w OpenTTD - wytyczne
OpenTTD Doxygen
Styl kodowania
Kompilowanie OpenTTD
Debugowanie
Dodanie ustawienia
Dodanie funkcji squirrel
Zrozumienie obsługi SaveGame
Wyznaczenie wersji gry zapisanej
Wykonanie wydania OpenTTD
Podręcznik stylu
Format plików lang
Użycie ciągów OpenTTD
Lista ciągów specjalnych
Użycie systemu okna
Kody kolorów istniejących w OpenTTD
Dodawanie pola tekstowego
Zrozumienie widget focus system
Przewodnik stylu GUI
OpenTTD TCP protokół
OpenTTD UDP protokół
Debugowanie desynchronizacji
Rozwój Portu Administratora Serwera
Okno konsoli
Komendy konsoli
Zmienne konsoli
Używanie skryptu konsoli
Dodanie funkcji/komend do konsoli
Dodanie zmiennych do konsoli
Historia rozwoju Konsoli
Grafika i podobne (NewGRFy)
Środowisko AI (NoAI)
Framework GS (NoGO)
Tablica map (siatka pozioma)
Pojazdy
Wyszukiwanie trasy
Przyspieszenie pociągu
Ten artykuł lub sekcja jest nieaktualizowany. Niektóre z jego treści mogą nie być już dokładne z powodu zmian w najnowszej wersji. Artykuł do zaktualizowania.
Ustawienia Zaawansowane zostały zastąpione Ustawieniami
W tym artykule krótko wyjaśniono, jak można utworzyć niestandardową zmienną ustawień, zmieniając kod źródłowy OpenTTD. Tutorial opisuje proces dodawania dwóch dodatkowych opcji do okna dialogowego Ustawienia zaawansowane - jednej opcji liczby całkowitej i jednej wartości logicznej.
Contents |
Sekcje
Różne kategorie ustawień można zobaczyć w oknie Ustawienia zaawansowane :
- Interface _ _ lub Interfejs (pl)
- Construction -"- Konstrukcja
- Vehicles _ _ __ Pojazdy
- Stations _ _ __ Stacje
- Economy _ _ _ Ekonomia
- Competitors , _ Współzawodnik
Podczas dodawania zmiennych, drobne ustawienia pojedynczej linii są ściśnięte w odpowiednie miejsce na liście, podczas gdy większe grupy ustawień są dodawane na końcu sekcji. W tym samouczku dodamy dwa atrybuty do sekcji Ekonomia-> Miasto:
- Enable Godzilla-mode (bool)
- Number of Godzilla's (integer)
Zdecydowanie zaleca się korzystanie z dokumentacji doxygen w celach informacyjnych podczas interakcji z kodem źródłowym.
Przegląd
Podczas tego samouczka liczba plików zostanie zmieniona:
Aby to dokładnie zrozumieć - radzimy rozejrzeć się po wszystkich tych plikach i spróbować poczuć, jak są one zbudowane i jak ogólnie się to robi..
Plik tłumaczenia - english.txt
Wszystkie ciągi tekstowe w OpenTTD są zapisywane w plikach językowych. Jedynym wymaganym tłumaczeniem jest Angielski - ale jeśli znasz więcej języków, możesz również dodawać tłumaczenia.
Chcemy dodać 4 ciągi: 2 nazwy zmiennych i 2 opisy tych zmiennych. Pamiętaj, że wszystkie ciągi ustawień powinny mieć prefiks 'STR_CONFIG_SETTING_. rozszerzenie.
STR_CONFIG_SETTING_ENABLE_GODZILLA :{LTBLUE}Enable Godzilla mode {ORANGE}{STRING2} STR_CONFIG_SETTING_ENABLE_GODZILLA_HELPTEXT :Enable/disable Godzilla mode STR_CONFIG_SETTING_NUMBER_GODZILLAS :{LTBLUE}Number of Godzillas: {ORANGE}{STRING2} STR_CONFIG_SETTING_NUMBER_GODZILLAS_HELPTEXT :Enter how many Godzillas that should be present in the game (0-100)
(spójrz na dokumentacja biblioteki Eints, jeśli chcesz dowiedzieć się więcej o systemie ciągów)
Te zmienne powinny być umieszczone w naturalnym miejscu - umieszczam je zaraz po STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT
. Zauważ, że w tym pliku nie ma zakładek, tylko spacje.
Deklaracja zmiennej i sekcja ustawień - settings_type.h
Deklaracja zmiennych znajduje się w settings_type.h. Musimy znaleźć odpowiednią kategorię - to są wybory:
struct GameSettings {
DifficultySettings difficulty; ///< settings related to the difficulty
GameCreationSettings game_creation; ///< settings used during the creation of a game (map)
ConstructionSettings construction; ///< construction of things in-game
AISettings ai; ///< what may the AI do?
ScriptSettings script; ///< settings for scripts
class AIConfig *ai_config[MAX_COMPANIES]; ///< settings per company
class GameConfig *game_config; ///< settings for gamescript
PathfinderSettings pf; ///< settings for all pathfinders
OrderSettings order; ///< settings related to orders
VehicleSettings vehicle; ///< options for vehicles
EconomySettings economy; ///< settings to change the economy
LinkGraphSettings linkgraph; ///< settings for link graph calculations
StationSettings station; ///< settings related to station management
LocaleSettings locale; ///< settings related to used currency/unit system in the current game
};
EconomySettings
wygląda dobrze - wyszukaj struct EconomySettings
i dodaj deklaracje dwóch zmiennych:
/** Settings related to the economy. */
struct EconomySettings {
// lots of other variables
bool godzilla_mode; ///< Enables Godzilla mode
uint8 number_godzillas; ///< Number of Godzillas
}
Należy odnotować, że komentarze mają /<
prefix (przedrostek) do tworzenia dokumentacji za pomocą doxygen.
Nazwa zmiennej w pliku konfiguracyjnym - settings_gui.cpp
Nazwa, w której będzie miała zmienna openttd.cfg są zdefiniowane w settings_gui.cpp. Tutaj wybrana jest również konkretna podstrona, na której będzie wyświetlana zmienna.
Ekonomia->Miejscowość wygląda na dobre dopasowanie, więc dodamy te wpisy do _settings_economy_towns[]
:
SettingsPage *towns = environment->Add(new SettingsPage(STR_CONFIG_SETTING_ENVIRONMENT_TOWNS));
{
\\ lots of other entries
towns->Add(new SettingEntry("economy.godzilla_mode"));
towns->Add(new SettingEntry("economy.number_godzillas"));
}
Variable specifics - settings.ini
Musimy dodać zestaw instrukcji do OpenTTD, aby obsługiwał dane we właściwy sposób. W ten sposób dodajemy bloki danych settings.ini - każdy blok reprezentuje jedną zmienną.
Istnieją różne struktury danych i zaawansowane tematy w tym obszarze, ale na tym się skupimy SDT_VAR i SDT_BOOL - dwa najczęściej używane. Poniżej znajduje się przykładowa konfiguracja naszych zmiennych:
[SDT_VAR]
base = GameSettings
var = economy.number_godzillas
type = SLE_UINT8
from = 189
to = SL_MAX_VERSION
flags = 0
guiflags = SGF_NEWGAME_ONLY
def = 10
min = 0
max = 100
interval = 5
str = STR_CONFIG_SETTING_NUMBER_GODZILLAS
strhelp = STR_CONFIG_SETTING_NUMBER_GODZILLAS_HELPTEXT
strval = STR_JUST_INT
Fundamentalne:
- mamy zmienną należącą do EconomySettings, która z kolei należy do GameSettings
- zmienna nosi nazwę number_godzillas i jest 8-bitową liczbą całkowitą bez znaku
- ustawienie można zmienić tylko przed rozpoczęciem gry (stąd guiflag newgame )
- wartość domyślna to 10, min->max to 0-100, a każdy krok to 5.
- STR_JUST_INT informuje grę, jak reprezentować dane na ekranie.
[SDT_BOOL] base = GameSettings var = economy.godzilla_mode from = 189 to = SL_MAX_VERSION guiflags = 0 def = false str = STR_CONFIG_SETTING_ENABLE_GODZILLA strhelp = STR_CONFIG_SETTING_ENABLE_GODZILLA_HELPTEXT
Jedyną zmianą z góry jest to, że nie ma flagi gui - to ustawienie może zostać zmienione w grze.
W przeciwnym razie, jeśli nie zostaną określone, zostaną użyte wartości domyślne:
[defaults] flags = 0 guiflags = 0 interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL proc = NULL load = NULL from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED
Spróbuj znaleźć naturalne miejsce w pliku dla swoich ustawień. Umieściłem go tuż pod economy.initial_city_size blok.
Poniżej znajduje się szczegółowe wyjaśnienie niektórych atrybutów:
Variable konfiguracji opcje
- base: GameSettings
- var: Nazwa zmiennej
- type: rozmiar danych dla zmiennej - nie jest wymagany dla BOOL, ale może mieć różne rozmiary; SLE_UINT8, SLE_INT16, SLE_UINT32, etc. etc... wybierz to, czego potrzebujesz
- flags: Gdzie do zapisu ('save') data/network sync:
SLF_NOT_IN_SAVE - nie zapisuj za pomocą gry zapisanej, w zasadzie opartej na kliencie |
SLF_NOT_IN_CONFIG - nie zapisuj do pliku konfiguracyjnego |
SLF_NO_NETWORK_SYNC - nie synchronizuj przez sieć (ale jest zapisywane, jeśli SLF_NOT_IN_SAVE nie jest ustawiony) |
SLF_ALLOW_CONTROL - zezwalaj na kody kontrolne w ciągach |
SLF_ALLOW_NEWLINE - zezwalaj na nowe linie w "łańcuchach" |
- guiflags: Wpływa na sposób wyświetlania opcji
SGF_0ISDISABLED - Funkcja jest wyłączona (wyszarzona) |
SGF_DISPLAY_ABS - wyświetlać wartość bezwzględną ustawienia |
SGF_MULTISTRING - wartość reprezentuje ograniczoną liczbę opcji ciągu (wewnętrznie całkowita) |
SGF_NETWORK_ONLY - to ustawienie dotyczy tylko gier sieciowych |
SGF_CURRENCY - liczba reprezentuje pieniądze, więc podczas odczytywania wartości pomnóż ją przez kurs wymiany |
SGF_NO_NETWORK - to ustawienie nie dotyczy gier sieciowych; nie można go zmienić w trakcie gry |
SGF_NEWGAME_ONLY - tego ustawienia nie można zmienić w grze |
SGF_SCENEDIT_TOO - to ustawienie można zmienić w edytorze scenariuszy (ma sens tylko wtedy, gdy ustawiony jest SGF_NEWGAME_ONLY) |
SGF_PER_COMPANY - to ustawienie może być różne dla każdej firmy (zapisane w strukturze firmy) |
- def: wartość domyślna (true lub false dla BOOL, dowolna poprawna wartość dla VAR)
- min, max, interval: minimalna wartość, maksymalna wartość i interwał, o które wartość całkowita rośnie/maleje przy użyciu żółtych strzałek (oczywiście dotyczy tylko VAR)
- str: ciąg używany w pliku językowym dla ustawienia poprawki, gdy jest wyświetlany w panelu sterowania Ustawienia poprawki. Jeśli nie musisz go wyświetlać, zostaw go jako NULL.
- strhelp: ciąg pomocy wyświetlany podczas wybierania opcji z menu.
-
strval: Jaką wartością jest SDT_VAL. Istnieje kilka opcji, ale najczęściej są to:
- STR_JUST_INT - liczba całkowita
- STR_JUST_COMMA - float
- proc: procedura wywoływania po zmianie wartości.
- from, to: Zakres wersji OpenTTD, dla których ustawienie jest prawidłowe (patrz poniżej)
-
cat: Do której kategorii należy ustawienie. Określa, czy ustawienie ma być wyświetlane na podstawie tego, czy w filtrowaniu w menu ustawień zaawansowanych wybrano filtrowanie podstawowe, zaawansowane lub eksperckie.
- SC_BASIC
- SC_ADVANCED
- SC_EXPERT
Robienie swojego budowania ('build') kompatybilnym ze starszymi zapisami ('savegames')
Jeśli nie użyjesz flagi SLF_NOT_IN_SAVE
, OpenTTD spodziewa się znaleźć twoją zmienną w każdej zapisanej grze. Dlatego ważne jest, aby powiedzieć grze, z której wersji zostało dodane to ustawienie. Numer wersji zapisanej gry znajduje się na początku saveload.cpp .
Gdy OpenTTD ładuje fragment danych, porównuje wersję, w której został skompilowany, z wersją w zapisanej grze. Sprawdzając atrybuty to
i from
w ustawieniach, można sprawdzić, czy obsługuje tę funkcję, czy nie.
W ten sposób możesz kontrolować, czy twoja funkcja jest zapisywana, a jeśli tak, to czy zapisywanie jest zgodne z poprzednimi wersjami.
Note: Jeśli zdefiniujesz dowolne zmienne bez flagi SLF_NOT_IN_SAVE
w ustawieniach, wszystkie zapisy dokonane na twojej kompilacji będą niezgodne ze wszystkimi innymi wersjami OpenTTD.
Aby pozwolić na coś przeciwnego (ładuj stare gry przy użyciu swojej kompilacji), powiesz OpenTTD, że wprowadziłeś nową funkcję i zwiększysz wersję zapisu gry ('increase the savegame version') . Jeśli bieżący bagażnik ('trunk') jest w wersji 160 i masz nową funkcję, którą należy zapisać wraz z plikiem zapisu, po prostu zwiększ wersję zapisu. Jest to znane jako nierówność zapisu ('savegame bump') .
Kiedy normalna wersja OpenTTD próbuje załadować zapisaną grę z twojego systemu, zauważy zapadkę zapisu i z wdziękiem powie „Przepraszam, nie mogę załadować - to dla mnie zbyt nowe”.
Jednak podczas ładowania gry z wersją zapisu niższą niż określona w atrybucie from ('z') w twoim ustawieniu - OpenTTD będzie wiedział, że nie znajdzie tego ustawienia w pliku zapisu i ładowanie powinno się powieść.
Tak więc w powyższym przykładzie podbiliśmy grę do 189 w saveload.cpp i ustawiliśmy from
na 161 i to
do SL_MAX_VERSION
w obu naszych blokach w settings.ini .
Teraz pozostaje tylko jedna rzecz do zrobienia - kompilacja! Jeśli wszystko jest w porządku, powinieneś zobaczyć coś podobnego do tego po prawej stronie.