AddSetting
Dokumentacja programistyczna OpenTTD
Linki zewnętrzne

OpenTTD GitHub
Wkład w OpenTTD - wytyczne
OpenTTD Doxygen

Informacje Ogólne

Styl kodowania
Kompilowanie OpenTTD
Debugowanie
Dodanie ustawienia
Dodanie funkcji squirrel
Zrozumienie obsługi SaveGame
Wyznaczenie wersji gry zapisanej
Wykonanie wydania OpenTTD

Języki i Ciągi znaków

Podręcznik stylu
Format plików lang
Użycie ciągów OpenTTD
Lista ciągów specjalnych

System Okna

Użycie systemu okna
Kody kolorów istniejących w OpenTTD
Dodawanie pola tekstowego
Zrozumienie widget focus system
Przewodnik stylu GUI

Tryb wieloosobowy

OpenTTD TCP protokół
OpenTTD UDP protokół
Debugowanie desynchronizacji
Rozwój Portu Administratora Serwera

Konsola (w grze)

Okno konsoli
Komendy konsoli
Zmienne konsoli
Używanie skryptu konsoli
Dodanie funkcji/komend do konsoli
Dodanie zmiennych do konsoli
Historia rozwoju Konsoli

Interfejsy API (ramy modowania)

Grafika i podobne (NewGRFy)
Środowisko AI (NoAI)
Framework GS (NoGO)

Inne odniesienia

Tablica map (siatka pozioma)
Pojazdy
Wyszukiwanie trasy
Przyspieszenie pociągu

/File/en/Outdated content.png
Nieaktualizowane
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 :

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:

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:

[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

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

Robienie swojego budowania ('build') kompatybilnym ze starszymi zapisami ('savegames')

Rezultat Finalny

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.