Merge branch 'master' into jgrpp

# Conflicts:
#	src/build_vehicle_gui.cpp
#	src/disaster_vehicle.cpp
#	src/music/dmusic.cpp
#	src/newgrf.cpp
#	src/newgrf.h
#	src/newgrf_spritegroup.h
#	src/os/windows/crashlog_win.cpp
#	src/os/windows/win32.cpp
#	src/saveload/saveload.cpp
#	src/saveload/settings_sl.cpp
#	src/settings_table.cpp
#	src/stdafx.h
#	src/strgen/strgen.cpp
#	src/string.cpp
#	src/string_func.h
#	src/table/newgrf_debug_data.h
#	src/town_cmd.cpp
#	src/train_cmd.cpp
#	src/video/win32_v.cpp
jgrpp
Jonathan G Rennison 4 days ago
commit 27c06f9737

@ -1414,10 +1414,10 @@ void Aircraft::MarkDirty()
uint Aircraft::Crash(bool flooded) uint Aircraft::Crash(bool flooded)
{ {
uint pass = Vehicle::Crash(flooded) + 2; // pilots uint victims = Vehicle::Crash(flooded) + 2; // pilots
this->crashed_counter = flooded ? 9000 : 0; // max 10000, disappear pretty fast when flooded this->crashed_counter = flooded ? 9000 : 0; // max 10000, disappear pretty fast when flooded
return pass; return victims;
} }
/** /**
@ -1428,8 +1428,8 @@ static void CrashAirplane(Aircraft *v)
{ {
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE); CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
uint pass = v->Crash(); uint victims = v->Crash();
SetDParam(0, pass); SetDParam(0, victims);
v->cargo.Truncate(); v->cargo.Truncate();
v->Next()->cargo.Truncate(); v->Next()->cargo.Truncate();
@ -1443,8 +1443,8 @@ static void CrashAirplane(Aircraft *v)
newsitem = STR_NEWS_AIRCRAFT_CRASH; newsitem = STR_NEWS_AIRCRAFT_CRASH;
} }
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING, victims));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING, victims));
NewsType newstype = NT_ACCIDENT; NewsType newstype = NT_ACCIDENT;
if (v->owner != _local_company) { if (v->owner != _local_company) {

@ -375,13 +375,14 @@ public:
case WID_AP_AIRPORT_LIST: { case WID_AP_AIRPORT_LIST: {
Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel); Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel);
Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix); Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix);
AirportClass *apclass = AirportClass::Get(_selected_airport_class); const auto specs = AirportClass::Get(_selected_airport_class)->Specs();
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) { auto [first, last] = this->vscroll->GetVisibleRangeIterators(specs);
const AirportSpec *as = apclass->GetSpec(i); for (auto it = first; it != last; ++it) {
const AirportSpec *as = *it;
if (!as->IsAvailable()) { if (!as->IsAvailable()) {
GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER); GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER);
} }
DrawString(text, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); DrawString(text, as->name, (static_cast<int>(as->index) == _selected_airport_index) ? TC_WHITE : TC_BLACK);
row = row.Translate(0, this->line_height); row = row.Translate(0, this->line_height);
text = text.Translate(0, this->line_height); text = text.Translate(0, this->line_height);
} }
@ -527,10 +528,9 @@ public:
{ {
/* First try to select an airport in the selected class. */ /* First try to select an airport in the selected class. */
AirportClass *sel_apclass = AirportClass::Get(_selected_airport_class); AirportClass *sel_apclass = AirportClass::Get(_selected_airport_class);
for (uint i = 0; i < sel_apclass->GetSpecCount(); i++) { for (const AirportSpec *as : sel_apclass->Specs()) {
const AirportSpec *as = sel_apclass->GetSpec(i);
if (as->IsAvailable()) { if (as->IsAvailable()) {
this->SelectOtherAirport(i); this->SelectOtherAirport(as->index);
return; return;
} }
} }

@ -1960,6 +1960,41 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
this->eng_list.RebuildDone(); this->eng_list.RebuildDone();
} }
void BuildVehicle()
{
EngineID sel_eng = this->sel_engine;
if (sel_eng == INVALID_ENGINE) return;
CommandCallback *callback;
uint32_t cmd;
if (this->virtual_train_mode) {
callback = CcAddVirtualEngine;
cmd = CMD_BUILD_VIRTUAL_RAIL_VEHICLE;
} else {
callback = (this->vehicle_type == VEH_TRAIN && RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON)
? CcBuildWagon : CcBuildPrimaryVehicle;
cmd = GetCmdBuildVeh(this->vehicle_type);
}
CargoID cargo = this->cargo_filter_criteria;
if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO;
DoCommandP(this->window_number, sel_eng | (cargo << 24), 0, cmd, callback);
/* Update last used variant in hierarchy and refresh if necessary. */
bool refresh = false;
EngineID parent = sel_eng;
while (parent != INVALID_ENGINE) {
Engine *e = Engine::Get(parent);
refresh |= (e->display_last_variant != sel_eng);
e->display_last_variant = sel_eng;
parent = e->info.variant_id;
}
if (refresh) {
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
InvalidateWindowClassesData(WC_BUILD_VIRTUAL_TRAIN);
}
}
void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
{ {
switch (widget) { switch (widget) {
@ -2023,41 +2058,9 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
break; break;
} }
case WID_BV_BUILD: { case WID_BV_BUILD:
EngineID sel_eng = this->sel_engine; this->BuildVehicle();
if (sel_eng != INVALID_ENGINE) {
CommandCallback *callback;
uint32_t cmd;
if (this->virtual_train_mode) {
callback = CcAddVirtualEngine;
cmd = CMD_BUILD_VIRTUAL_RAIL_VEHICLE;
} else {
callback = (this->vehicle_type == VEH_TRAIN && RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON)
? CcBuildWagon : CcBuildPrimaryVehicle;
cmd = GetCmdBuildVeh(this->vehicle_type);
}
CargoID cargo = this->cargo_filter_criteria;
if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO;
DoCommandP(this->window_number, sel_eng | (cargo << 24), 0, cmd, callback);
/* Update last used variant in hierarchy and refresh if necessary. */
bool refresh = false;
EngineID parent = sel_eng;
while (parent != INVALID_ENGINE) {
Engine *e = Engine::Get(parent);
refresh |= (e->display_last_variant != sel_eng);
e->display_last_variant = sel_eng;
parent = e->info.variant_id;
}
if (refresh) {
InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
InvalidateWindowClassesData(WC_BUILD_VIRTUAL_TRAIN);
return;
}
}
break; break;
}
case WID_BV_RENAME: { case WID_BV_RENAME: {
EngineID sel_eng = this->sel_engine; EngineID sel_eng = this->sel_engine;

@ -407,12 +407,12 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN) == 0) { if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN) == 0) {
v->age++; v->age++;
if (u->crashed_ctr == 0) { if (u->crashed_ctr == 0) {
u->Crash(); uint victims = u->Crash();
AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile); AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile);
AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO)); AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO, victims));
Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO)); Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO, victims));
} }
} }

@ -327,11 +327,11 @@ struct DropdownWindow : Window {
} }
this->click_delay = 2; this->click_delay = 2;
} else { } else {
if (_cursor.pos.y <= this->top + 2) { if (_cursor.pos.y <= this->top + WidgetDimensions::scaled.dropdownlist.top) {
/* Cursor is above the list, set scroll up */ /* Cursor is above the list, set scroll up */
this->scrolling = -1; this->scrolling = -1;
return; return;
} else if (_cursor.pos.y >= this->top + this->height - 2) { } else if (_cursor.pos.y >= this->top + this->height - WidgetDimensions::scaled.dropdownlist.bottom) {
/* Cursor is below list, set scroll down */ /* Cursor is below list, set scroll down */
this->scrolling = 1; this->scrolling = 1;
return; return;

@ -540,18 +540,18 @@ struct FramerateWindow : Window {
switch (widget) { switch (widget) {
case WID_FRW_RATE_GAMELOOP: case WID_FRW_RATE_GAMELOOP:
SetDParam(0, STR_FRAMERATE_FPS_GOOD); SetDParam(0, STR_FRAMERATE_FPS_GOOD);
SetDParam(1, 999999); SetDParamMaxDigits(1, 6);
SetDParam(2, 2); SetDParam(2, 2);
size = GetStringBoundingBox(STR_FRAMERATE_RATE_GAMELOOP); size = GetStringBoundingBox(STR_FRAMERATE_RATE_GAMELOOP);
break; break;
case WID_FRW_RATE_DRAWING: case WID_FRW_RATE_DRAWING:
SetDParam(0, STR_FRAMERATE_FPS_GOOD); SetDParam(0, STR_FRAMERATE_FPS_GOOD);
SetDParam(1, 999999); SetDParamMaxDigits(1, 6);
SetDParam(2, 2); SetDParam(2, 2);
size = GetStringBoundingBox(STR_FRAMERATE_RATE_BLITTER); size = GetStringBoundingBox(STR_FRAMERATE_RATE_BLITTER);
break; break;
case WID_FRW_RATE_FACTOR: case WID_FRW_RATE_FACTOR:
SetDParam(0, 999999); SetDParamMaxDigits(0, 6);
SetDParam(1, 2); SetDParam(1, 2);
size = GetStringBoundingBox(STR_FRAMERATE_SPEED_FACTOR); size = GetStringBoundingBox(STR_FRAMERATE_SPEED_FACTOR);
break; break;
@ -580,7 +580,7 @@ struct FramerateWindow : Window {
case WID_FRW_TIMES_AVERAGE: case WID_FRW_TIMES_AVERAGE:
case WID_FRW_ALLOCSIZE: { case WID_FRW_ALLOCSIZE: {
size = GetStringBoundingBox(STR_FRAMERATE_CURRENT + (widget - WID_FRW_TIMES_CURRENT)); size = GetStringBoundingBox(STR_FRAMERATE_CURRENT + (widget - WID_FRW_TIMES_CURRENT));
SetDParam(0, 999999); SetDParamMaxDigits(0, 6);
SetDParam(1, 2); SetDParam(1, 2);
Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD); Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD);
size.width = std::max(size.width, item_size.width); size.width = std::max(size.width, item_size.width);

@ -185,11 +185,6 @@ struct GSConfigWindow : public Window {
break; break;
} }
case WID_GSC_SETTINGS: { case WID_GSC_SETTINGS: {
ScriptConfig *config = this->gs_config;
VisibleSettingsList::const_iterator it = this->visible_settings.begin();
int i = 0;
for (; !this->vscroll->IsVisible(i); i++) it++;
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
bool rtl = _current_text_dir == TD_RTL; bool rtl = _current_text_dir == TD_RTL;
Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl);
@ -198,9 +193,11 @@ struct GSConfigWindow : public Window {
int y = r.top; int y = r.top;
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2; int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2;
for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) {
const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings);
for (auto it = first; it != last; ++it) {
const ScriptConfigItem &config_item = **it; const ScriptConfigItem &config_item = **it;
int current_value = config->GetSetting((config_item).name); int current_value = this->gs_config->GetSetting(config_item.name);
bool editable = this->IsEditableItem(config_item); bool editable = this->IsEditableItem(config_item);
StringID str; StringID str;
@ -219,6 +216,7 @@ struct GSConfigWindow : public Window {
DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable);
SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
} else { } else {
int i = static_cast<int>(std::distance(std::begin(this->visible_settings), it));
if (config_item.complete_labels) { if (config_item.complete_labels) {
DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
} else { } else {

@ -408,7 +408,7 @@ static Foundation GetFoundation_Industry(TileIndex tile, Slope tileh)
return FlatteningFoundation(tileh); return FlatteningFoundation(tileh);
} }
static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
{ {
IndustryGfx gfx = GetIndustryGfx(tile); IndustryGfx gfx = GetIndustryGfx(tile);
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx); const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
@ -458,13 +458,13 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca
acceptance[a] += cargo_acceptance[i]; acceptance[a] += cargo_acceptance[i];
/* Maybe set 'always accepted' bit (if it's not set already) */ /* Maybe set 'always accepted' bit (if it's not set already) */
if (HasBit(*always_accepted, a)) continue; if (HasBit(always_accepted, a)) continue;
/* Test whether the industry itself accepts the cargo type */ /* Test whether the industry itself accepts the cargo type */
if (ind->IsCargoAccepted(a)) continue; if (ind->IsCargoAccepted(a)) continue;
/* If the industry itself doesn't accept this cargo, set 'always accepted' bit */ /* If the industry itself doesn't accept this cargo, set 'always accepted' bit */
SetBit(*always_accepted, a); SetBit(always_accepted, a);
} }
} }

@ -433,7 +433,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Tallenna skenaa
STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Lataa skenaario STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Lataa skenaario
STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Tallenna korkeuskartta STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Tallenna korkeuskartta
STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Lataa korkeuskartta STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Lataa korkeuskartta
STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Sulje skenaariomuokkain STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Hylkää skenaariomuokkain
STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :Lopeta STR_SCENEDIT_FILE_MENU_QUIT :Lopeta
@ -463,7 +463,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Läpinäkyvät
STR_FILE_MENU_SAVE_GAME :Tallenna peli STR_FILE_MENU_SAVE_GAME :Tallenna peli
STR_FILE_MENU_LOAD_GAME :Lataa peli STR_FILE_MENU_LOAD_GAME :Lataa peli
STR_FILE_MENU_QUIT_GAME :Lopeta peli STR_FILE_MENU_QUIT_GAME :Lopeta peli
STR_FILE_MENU_EXIT :Sulje STR_FILE_MENU_EXIT :Poistu
# Map menu # Map menu
STR_MAP_MENU_MAP_OF_WORLD :Maailmankartta STR_MAP_MENU_MAP_OF_WORLD :Maailmankartta
@ -2186,7 +2186,7 @@ STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-a
STR_INTRO_ONLINE_CONTENT :{BLACK}Tarkista online-sisältö STR_INTRO_ONLINE_CONTENT :{BLACK}Tarkista online-sisältö
STR_INTRO_AI_SETTINGS :{BLACK}Tekoälyasetukset STR_INTRO_AI_SETTINGS :{BLACK}Tekoälyasetukset
STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Peliskriptiasetukset STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Peliskriptiasetukset
STR_INTRO_QUIT :{BLACK}Sulje STR_INTRO_QUIT :{BLACK}Poistu
STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Aloita uusi peli. Ctrl+napsautus ohittaa kartan asetusten valinnan. STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Aloita uusi peli. Ctrl+napsautus ohittaa kartan asetusten valinnan.
STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Lataa tallennettu peli STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Lataa tallennettu peli
@ -2214,14 +2214,14 @@ STR_INTRO_BASESET :{BLACK}Valitust
STR_INTRO_TRANSLATION :{BLACK}Tästä käännöksestä puuttuu {NUM} merkkijono{P "" a}. Auta tekemään OpenTTD:stä parempi ryhtymällä kääntäjäksi. Lisätietoja readme.txt:ssä. STR_INTRO_TRANSLATION :{BLACK}Tästä käännöksestä puuttuu {NUM} merkkijono{P "" a}. Auta tekemään OpenTTD:stä parempi ryhtymällä kääntäjäksi. Lisätietoja readme.txt:ssä.
# Quit window # Quit window
STR_QUIT_CAPTION :{WHITE}Sulje STR_QUIT_CAPTION :{WHITE}Poistu
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Haluatko varmasti poistua OpenTTD:stä? STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Haluatko varmasti poistua OpenTTD:stä?
STR_QUIT_YES :{BLACK}Kyllä STR_QUIT_YES :{BLACK}Kyllä
STR_QUIT_NO :{BLACK}Ei STR_QUIT_NO :{BLACK}Ei
# Abandon game # Abandon game
STR_ABANDON_GAME_CAPTION :{WHITE}Pelin lopetus STR_ABANDON_GAME_CAPTION :{WHITE}Hylkää peli
STR_ABANDON_GAME_QUERY :{YELLOW}Lopetetaanko peli? STR_ABANDON_GAME_QUERY :{YELLOW}Haluatko varmasti hylätä tämän pelin?
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Haluatko varmasti hylätä tämän skenaarion? STR_ABANDON_SCENARIO_QUERY :{YELLOW}Haluatko varmasti hylätä tämän skenaarion?
# Help window # Help window

@ -2589,6 +2589,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :revisión erró
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :o nome xa está en uso STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :o nome xa está en uso
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :contrasinal incorrecto STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :contrasinal incorrecto
STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :non na lista permitida STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :non na lista permitida
STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :ningún dos métodos de autenticación solicitados está disponible
STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :compañía errónea nun DoCommand STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :compañía errónea nun DoCommand
STR_NETWORK_ERROR_CLIENT_KICKED :chimpado polo servidor STR_NETWORK_ERROR_CLIENT_KICKED :chimpado polo servidor
STR_NETWORK_ERROR_CLIENT_CHEATER :intentaba usar unha trampa STR_NETWORK_ERROR_CLIENT_CHEATER :intentaba usar unha trampa

@ -624,14 +624,14 @@ STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLA
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Alle abwählen STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Alle abwählen
STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Zeige alle Frachtarten im Frachtraten-Diagramm an STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Zeige alle Frachtarten im Frachtraten-Diagramm an
STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Zeige keine Fracht im Frachtraten-Diagramm an STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Zeige keine Fracht im Frachtraten-Diagramm an
STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Diagrammschalter für Frachttyp ein/aus STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Diagramm für diesen Frachttyp ein/aus
STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING}
STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Zeige detailierte Leistungsaufschlüsselung STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Zeige detailierte Leistungsaufschlüsselung
# Graph key window # Graph key window
STR_GRAPH_KEY_CAPTION :{WHITE}Legende des Firmendiagramms STR_GRAPH_KEY_CAPTION :{WHITE}Legende des Firmendiagramms
STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph der Firma ein-/ausblenden STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph dieser Firma ein-/ausblenden
# Company league window # Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Firmentabelle STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Firmentabelle
@ -803,9 +803,11 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI
STR_SMALLMAP_DISABLE_ALL :{BLACK}Alles ausblenden STR_SMALLMAP_DISABLE_ALL :{BLACK}Alles ausblenden
STR_SMALLMAP_ENABLE_ALL :{BLACK}Alles einblenden STR_SMALLMAP_ENABLE_ALL :{BLACK}Alles einblenden
STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Zeige Höhe STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Zeige Höhe
STR_SMALLMAP_SHOW_INDUSTRY_NAMES :{BLACK}Industrienamen anzeigen
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Industrien ausblenden STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Industrien ausblenden
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Industrien einblenden STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Industrien einblenden
STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Anzeige des Höhenreliefs umschalten STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Anzeige des Höhenreliefs umschalten
STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRY_NAMES :{BLACK}Industrienamen anzeigen ein/aus
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Zeige kein Eigentum des Unternehmens auf der Karte STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Zeige kein Eigentum des Unternehmens auf der Karte
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Zeige das ganze Eigentum des Unternehmens auf der Karte STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Zeige das ganze Eigentum des Unternehmens auf der Karte
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Zeige keine Frachtarten auf der Karte STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Zeige keine Frachtarten auf der Karte
@ -2587,6 +2589,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :Falsche Version
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :Name wird bereits verwendet STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :Name wird bereits verwendet
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :Falsches Spielpasswort STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :Falsches Spielpasswort
STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :nicht auf Erlaubnisliste STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :nicht auf Erlaubnisliste
STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :keine der angeforderten Authentifizierungsmethoden ist verfügbar
STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :Falsche Firmen-ID in DoCommand STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :Falsche Firmen-ID in DoCommand
STR_NETWORK_ERROR_CLIENT_KICKED :vom Server hinausgeworfen STR_NETWORK_ERROR_CLIENT_KICKED :vom Server hinausgeworfen
STR_NETWORK_ERROR_CLIENT_CHEATER :hat versucht zu mogeln STR_NETWORK_ERROR_CLIENT_CHEATER :hat versucht zu mogeln
@ -2885,6 +2888,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Straße
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Straßenbahngleis mit automatischer Wahl der Ausrichtung bauen. Strg+Klick, um Straßenbahngleisabschnitt zu entfernen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Straßenbahngleis mit automatischer Wahl der Ausrichtung bauen. Strg+Klick, um Straßenbahngleisabschnitt zu entfernen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Fahrzeugdepot bauen (zum Kauf und zur Wartung von Fahrzeugen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Fahrzeugdepot bauen (zum Kauf und zur Wartung von Fahrzeugen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Straßenbahndepot bauen (zum Kauf und zur Wartung von Straßenbahnen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Straßenbahndepot bauen (zum Kauf und zur Wartung von Straßenbahnen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}Wegpunkt auf Straße bauen. Strg+Klick, um einen anderen Wegpunkt zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Wegpunkt auf Straßenbahngleis bauen. Strg+Klick, um einen anderen Wegpunkt zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bushaltestelle bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bushaltestelle bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Straßenbahnhaltestelle bauen. Strg+Klick, um einen andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Straßenbahnhaltestelle bauen. Strg+Klick, um einen andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Lkw-Ladeplatz bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Lkw-Ladeplatz bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen
@ -3617,6 +3622,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Zum vorh
STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Text für dieses Schild eingeben STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Text für dieses Schild eingeben
# Town directory window # Town directory window
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Städte ({COMMA} von {COMMA})
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keine - STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keine -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Großstadt){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Großstadt){BLACK} ({COMMA})
@ -3950,6 +3956,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/Zyklus STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/Zyklus
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrien ({COMMA} von {COMMA})
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Keine - STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Keine -
STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transportiert){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transportiert){BLACK}
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
@ -5091,11 +5098,14 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Grenzt a
STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Zu nahe an einem anderen Wegpunkt STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Zu nahe an einem anderen Wegpunkt
STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht gebaut werden ... STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht gebaut werden ...
STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Straßenwegpunkt kann hier nicht gebaut werden …
STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Boje kann hier nicht platziert werden ... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Boje kann hier nicht platziert werden ...
STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Wegpunktname kann nicht geändert werden ... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Wegpunktname kann nicht geändert werden ...
STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht entfernt werden ... STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht entfernt werden ...
STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Straßenwegpunkt kann hier nicht entfernt werden …
STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Wegpunkt muss erst abgerissen werden STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Wegpunkt muss erst abgerissen werden
STR_ERROR_MUST_REMOVE_ROADWAYPOINT_FIRST :{WHITE}Straßenwegpunkt muss erst entfernt werden
STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... Boje ist im Weg STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... Boje ist im Weg
STR_ERROR_BUOY_IS_IN_USE :{WHITE}... Boje wird von einer anderen Firma benutzt! STR_ERROR_BUOY_IS_IN_USE :{WHITE}... Boje wird von einer anderen Firma benutzt!
@ -5343,6 +5353,7 @@ STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}Es gibt
STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Dieses Flugzeug kann nicht auf diesen Hubschrauberlandeplatz landen STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Dieses Flugzeug kann nicht auf diesen Hubschrauberlandeplatz landen
STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Dieser Helikopter kann auf diesen Flughafen nicht landen STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Dieser Helikopter kann auf diesen Flughafen nicht landen
STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Es gibt keinen Gleiswegpunkt STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Es gibt keinen Gleiswegpunkt
STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}Es gibt keinen Straßenwegpunkt
STR_ERROR_NO_BUOY :{WHITE}Es gibt keine Boje STR_ERROR_NO_BUOY :{WHITE}Es gibt keine Boje
# Timetable related errors # Timetable related errors

@ -500,6 +500,8 @@ STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Pályaszerkeszt
STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :Kilépés az OpenTTD-ből STR_SCENEDIT_FILE_MENU_QUIT :Kilépés az OpenTTD-ből
STR_SCENEDIT_TOWN_MENU_BUILD_TOWN :Városok generálása
STR_SCENEDIT_TOWN_MENU_PACE_HOUSE :Házak elhelyezése
# Settings menu # Settings menu
###length 16 ###length 16
@ -1116,6 +1118,7 @@ STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Jelöld
STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}Betűtípusok simítása STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}Betűtípusok simítása
STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}Jelöld be ezt, ha lesimított betűket akarsz. STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}Jelöld be ezt, ha lesimított betűket akarsz.
STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Automata felmérés STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Automata felmérés
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Részvétel automata felmérésben STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Részvétel automata felmérésben
@ -1545,6 +1548,8 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS :Figyelmeztetés
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy év alatt STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy év alatt
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy időszakon belül STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy időszakon belül
STR_CONFIG_SETTING_WARN_OLD_VEHICLE :Jelezzen, ha egy jármű elöregedett: {STRING}
STR_CONFIG_SETTING_WARN_OLD_VEHICLE_HELPTEXT :Ha engedélyezve van, a rendszer üzenetet küld, amikor egy jármű elöregszik
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Járművek sosem avulnak el: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Járművek sosem avulnak el: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Bekapcsolva minden járműmodell örökké elérhető marad bevezetése után STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Bekapcsolva minden járműmodell örökké elérhető marad bevezetése után
@ -2608,6 +2613,7 @@ STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}A játé
STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}A szerver neve nem lett megadva. A szerver nevét az ablak tetején tudod beállítani. STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}A szerver neve nem lett megadva. A szerver nevét az ablak tetején tudod beállítani.
STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}A gépeden és a szerveren lévő programnak nem egyezik meg a verziója STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}A gépeden és a szerveren lévő programnak nem egyezik meg a verziója
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Rossz jelszó STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Rossz jelszó
STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST :{WHITE}Nem szerepelsz az engedélyezett felhasználók listáján!
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}A szerver tele van STR_NETWORK_ERROR_SERVER_FULL :{WHITE}A szerver tele van
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Ki vagy tiltva erről a szerverről STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Ki vagy tiltva erről a szerverről
STR_NETWORK_ERROR_KICKED :{WHITE}Ki lettél rúgva a szerverről STR_NETWORK_ERROR_KICKED :{WHITE}Ki lettél rúgva a szerverről
@ -2635,6 +2641,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :ismeretlen vagy
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :rossz verzió STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :rossz verzió
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :a név már használva van STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :a név már használva van
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :rossz jelszó STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :rossz jelszó
STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :a kért hitelesítési módok egyike sem elérhető
STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :hibás vállalat azonosító (wrong company in DoCommand) STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :hibás vállalat azonosító (wrong company in DoCommand)
STR_NETWORK_ERROR_CLIENT_KICKED :a szerver kirúgott STR_NETWORK_ERROR_CLIENT_KICKED :a szerver kirúgott
STR_NETWORK_ERROR_CLIENT_CHEATER :csalni próbált STR_NETWORK_ERROR_CLIENT_CHEATER :csalni próbált
@ -2852,9 +2859,26 @@ STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}A vasút
STR_STATION_BUILD_DRAG_DROP :{BLACK}Fogd és dobd STR_STATION_BUILD_DRAG_DROP :{BLACK}Fogd és dobd
STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Állomás építése fogd és dobd módon STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Állomás építése fogd és dobd módon
STR_PICKER_MODE_ALL :Összes
STR_PICKER_MODE_ALL_TOOLTIP :Kapcsolja be az összes csoport elemeinek megjelenítését
STR_PICKER_MODE_USED :Használt
STR_PICKER_MODE_USED_TOOLTIP :Csak a meglévő elemek megjelenítése
STR_PICKER_MODE_SAVED :Mentve
STR_PICKER_MODE_SAVED_TOOLTIP :Csak a mentett elemek megjelenítése
STR_PICKER_STATION_CLASS_TOOLTIP :Válaszd ki a megjeleníteni kívánt állomástípust
STR_PICKER_STATION_TYPE_TOOLTIP :Válassz ki egy állomástípust az építéshez. Ctrl+kattintás a mentett elemek hozzáadásához vagy eltávolításához
STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :Válaszd ki a megjeleníteni kívánt buszállomás-típust
STR_PICKER_OBJECT_CLASS_TOOLTIP :Válaszd ki a megjelenítendő elemcsoportot
STR_PICKER_OBJECT_TYPE_TOOLTIP :Válaszd ki az építendő elem típusát. Ctrl+kattintás a mentett elemek hozzáadásához vagy eltávolításához. Ctrl+kattintás+húzás a terület átlós kijelöléséhez. Nyomd meg a Shift billentyűt is, ha csak a költségbecslést szeretnéd megjeleníteni
STR_HOUSE_PICKER_CAPTION :Ház kiválasztása
STR_HOUSE_PICKER_CLASS_ZONE1 :Szél
STR_HOUSE_PICKER_CLASS_ZONE2 :Külváros
STR_HOUSE_PICKER_CLASS_ZONE3 :Külső kertváros
STR_HOUSE_PICKER_CLASS_ZONE4 :Belső kertváros
STR_HOUSE_PICKER_CLASS_ZONE5 :Városközpont
STR_STATION_CLASS_DFLT :Alapértelmezett STR_STATION_CLASS_DFLT :Alapértelmezett
STR_STATION_CLASS_DFLT_STATION :Alapértelmezett állomás STR_STATION_CLASS_DFLT_STATION :Alapértelmezett állomás
@ -2909,6 +2933,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Közút
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Villamospálya építése egyszerűsített módon. Ctrl+kattintás a pálya lerombolásához. Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Villamospálya építése egyszerűsített módon. Ctrl+kattintás a pálya lerombolásához. Shift+kattintással csak a becsült költséget jeleníti meg
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Garázs építése (járművek vételére és karbantartására). Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Garázs építése (járművek vételére és karbantartására). Shift+kattintással csak a becsült költséget jeleníti meg
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Villamos remíz építése (járművek megépítésére és javítására). Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Villamos remíz építése (járművek megépítésére és javítására). Shift+kattintással csak a becsült költséget jeleníti meg
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Útpont építése a villamosvonalon. Ctrl+kattintás másik csatlakozási pont kiválasztásához. Nyomd meg a Shift billentyűt is, ha csak a költségbecslést szeretnéd megjeleníteni
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Buszmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Buszmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Villamosmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. SShift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Villamosmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. SShift+kattintással csak a becsült költséget jeleníti meg
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Teherautó-állomás építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Teherautó-állomás építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg
@ -3638,6 +3663,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Előző
STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Felirat szövegének szerkesztése STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Felirat szövegének szerkesztése
# Town directory window # Town directory window
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Városok ({COMMA}, {COMMA})
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nincs - STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nincs -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Város){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Város){BLACK} ({COMMA})
@ -3971,6 +3997,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/időszak STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/időszak
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Gazdasági épületek ({COMMA}, {COMMA})
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs - STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs -
STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% elszállítva){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% elszállítva){BLACK}
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
@ -4930,7 +4957,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Becsült
STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}A mentés még tart,{}kérlek várd meg a végét! STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}A mentés még tart,{}kérlek várd meg a végét!
STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatikus mentés sikertelen STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatikus mentés sikertelen
STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nem olvasható a meghajtó STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nem olvasható a meghajtó
STR_ERROR_GAME_SAVE_FAILED :{WHITE}A mentés sikertelen
STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nem sikerült törölni a fájlt STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nem sikerült törölni a fájlt
STR_ERROR_GAME_LOAD_FAILED :{WHITE}A betöltés sikertelen
STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Belső hiba: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Belső hiba: {STRING}
STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Hibás játékállás-mentés - {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Hibás játékállás-mentés - {STRING}
STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :A játékállást újabb verzió mentette el STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :A játékállást újabb verzió mentette el
@ -5035,6 +5064,7 @@ STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ninc
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Útkarbantartás folyamatban STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Útkarbantartás folyamatban
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nem törölheted ezt a várost...{}Egy állomás vagy járműtelep hivatkozik a városra, vagy egy városi tulajdonú mező nem eltávolítható STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nem törölheted ezt a várost...{}Egy állomás vagy járműtelep hivatkozik a városra, vagy egy városi tulajdonú mező nem eltávolítható
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nincs megfelelő hely egy szobornak a város központjában STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nincs megfelelő hely egy szobornak a város központjában
STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}A házépítés nem lehetséges
# Industry related errors # Industry related errors
STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... túl sok a gazdasági épület STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... túl sok a gazdasági épület
@ -5107,6 +5137,7 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Több l
STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Túl közel van egy másik ellenőrző ponthoz STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Túl közel van egy másik ellenőrző ponthoz
STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Ide nem lehet vonat ellenőrző pontot építeni... STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Ide nem lehet vonat ellenőrző pontot építeni...
STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Ide nem lehet útpontot építeni...
STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nem rakhatsz ide bóját... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nem rakhatsz ide bóját...
STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nem lehet megváltoztatni az ellenőrző pont nevét... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nem lehet megváltoztatni az ellenőrző pont nevét...
@ -5315,6 +5346,7 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Indíts
STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL :{WHITE}Nincs városban építhető út-típus STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL :{WHITE}Nincs városban építhető út-típus
STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Saját NewGRF konfiguráció módosítása STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Saját NewGRF konfiguráció módosítása
STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET :{WHITE}Még nem érhető el városban építhető úttípus STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET :{WHITE}Még nem érhető el városban építhető úttípus
STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET_EXPLANATION :{WHITE}Indítson új játékot {DATE_SHORT} után, vagy használjon olyan NewGRF-et, amely korai városépítési úttípusokat biztosít
# Specific vehicle errors # Specific vehicle errors
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Nem haladhatja meg a vonat a megállj jelzést... STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Nem haladhatja meg a vonat a megállj jelzést...
@ -5907,6 +5939,7 @@ STR_JUST_DATE_ISO :{DATE_ISO}
STR_JUST_STRING :{STRING} STR_JUST_STRING :{STRING}
STR_JUST_STRING1 :{STRING} STR_JUST_STRING1 :{STRING}
STR_JUST_STRING2 :{STRING} STR_JUST_STRING2 :{STRING}
STR_JUST_STRING4 :{STRING}
STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_STRING_STRING :{STRING}{STRING}
STR_JUST_RAW_STRING :{STRING} STR_JUST_RAW_STRING :{STRING}
STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING}

@ -192,12 +192,12 @@ STR_COLOUR_WHITE :Balta
STR_COLOUR_RANDOM :Nejaušs STR_COLOUR_RANDOM :Nejaušs
###length 17 ###length 17
STR_COLOUR_SECONDARY_DARK_BLUE :Tumši Zila STR_COLOUR_SECONDARY_DARK_BLUE :Tumši zila
STR_COLOUR_SECONDARY_PALE_GREEN :Gaiši Zaļa STR_COLOUR_SECONDARY_PALE_GREEN :Gaiši Zaļa
STR_COLOUR_SECONDARY_SECONDARY_PINK :Rozā STR_COLOUR_SECONDARY_SECONDARY_PINK :Rozā
STR_COLOUR_SECONDARY_YELLOW :Dzeltena STR_COLOUR_SECONDARY_YELLOW :Dzeltena
STR_COLOUR_SECONDARY_RED :Sarkana STR_COLOUR_SECONDARY_RED :Sarkana
STR_COLOUR_SECONDARY_LIGHT_BLUE :Gaiši Zila STR_COLOUR_SECONDARY_LIGHT_BLUE :Gaiši zila
STR_COLOUR_SECONDARY_GREEN :Zaļa STR_COLOUR_SECONDARY_GREEN :Zaļa
STR_COLOUR_SECONDARY_DARK_GREEN :Tumši zaļa STR_COLOUR_SECONDARY_DARK_GREEN :Tumši zaļa
STR_COLOUR_SECONDARY_BLUE :Zila STR_COLOUR_SECONDARY_BLUE :Zila
@ -1205,7 +1205,7 @@ STR_TERRAIN_TYPE_CUSTOM_VALUE :Pielāgots augs
STR_CITY_APPROVAL_LENIENT :Mīksts STR_CITY_APPROVAL_LENIENT :Mīksts
STR_CITY_APPROVAL_TOLERANT :iecietīga STR_CITY_APPROVAL_TOLERANT :iecietīga
STR_CITY_APPROVAL_HOSTILE :naidīga STR_CITY_APPROVAL_HOSTILE :naidīga
STR_CITY_APPROVAL_PERMISSIVE :Pieļaujoša (nav efekta kompānijas darbībām) STR_CITY_APPROVAL_PERMISSIVE :Pieļaujoša (neietekmē uzņēmuma darbības)
STR_WARNING_NO_SUITABLE_AI :{WHITE}Nav pieejami derīgi MI...{}Jūs varat lejuplādēt dažādus MI, izmantojot sistēmu 'Tiešsaistes saturs' STR_WARNING_NO_SUITABLE_AI :{WHITE}Nav pieejami derīgi MI...{}Jūs varat lejuplādēt dažādus MI, izmantojot sistēmu 'Tiešsaistes saturs'
@ -1450,7 +1450,7 @@ STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Iestatīt lidma
STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA}
STR_CONFIG_SETTING_PLANE_CRASHES :Lidmašīnu avāriju daudzums: {STRING} STR_CONFIG_SETTING_PLANE_CRASHES :Lidmašīnu avāriju daudzums: {STRING}
STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Iestatīt nejaušu lidaparātu avāriju iespējamību.{}* Lielām lidmašīnām vienmēr ir risks avarēt, kad piezemējas mazās lidostās STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Iestatīt nejaušu lidaparātu avāriju iespējamību.{}* Lielām lidmašīnām vienmēr ir risks avarēt, kad tās nolaižas mazās lidostās
###length 3 ###length 3
STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Nav* STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Nav*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :samazināts STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :samazināts
@ -2242,7 +2242,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Ziņot p
STR_HELP_WINDOW_COMMUNITY :{BLACK}Kopiena STR_HELP_WINDOW_COMMUNITY :{BLACK}Kopiena
# Cheat window # Cheat window
STR_CHEATS :{WHITE}Smilškastes Opcijas STR_CHEATS :{WHITE}Smilškastes opcijas
STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG} STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING}
@ -2808,7 +2808,7 @@ STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Izvēlē
STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Platformas garums STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Platformas garums
STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Izvēlēties dzelzceļa stacijas garumu STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Izvēlēties dzelzceļa stacijas garumu
STR_STATION_BUILD_DRAG_DROP :{BLACK}Vilkt un nomest STR_STATION_BUILD_DRAG_DROP :{BLACK}Vilkt un nomest
STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Būvēt staciju izmantojot "vilkt un nomest" STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Būvēt staciju, izmantojot "vilkt un nomest"
STR_PICKER_MODE_ALL :Visi STR_PICKER_MODE_ALL :Visi
STR_PICKER_MODE_ALL_TOOLTIP :Pārslēgt visu klašu vienumu rādīšanu STR_PICKER_MODE_ALL_TOOLTIP :Pārslēgt visu klašu vienumu rādīšanu
@ -3512,7 +3512,7 @@ STR_SPRITE_ALIGNER_CAPTION_ACTION5 :{WHITE}Gariņu
STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Nākamais gariņš STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Nākamais gariņš
STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Pāriet uz nākamo parasto gariņu, izlaižot visus pseido/pārkrāsotos/fonta gariņus STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Pāriet uz nākamo parasto gariņu, izlaižot visus pseido/pārkrāsotos/fonta gariņus
STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Iet pie gariņa STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Iet pie gariņa
STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Iet pie dotā gariņa. Ja tas nav parastais gariņš, tad pāriet pie nākamā STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Iet pie esošā gariņa. Ja tas nav parastais gariņš, tad pāriet pie nākamā, parastā
STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Iepriekšējais gariņš STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Iepriekšējais gariņš
STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Iet pie iepriekšējā parastā gariņa, izlaižot visus pseido/pārkrāsotos/fonta gariņus STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Iet pie iepriekšējā parastā gariņa, izlaižot visus pseido/pārkrāsotos/fonta gariņus
STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Atlasītā gariņa attēlojums. To attēlojot, izkārtojums netiek ievērots STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Atlasītā gariņa attēlojums. To attēlojot, izkārtojums netiek ievērots
@ -3521,7 +3521,7 @@ STR_SPRITE_ALIGNER_SPRITE :{STRING}:{NUM}
###length 2 ###length 2
STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Nobīde centrēta STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Nobīde centrēta
STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Spraits centrēts STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Gariņš ir centrēts
STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Krustpunkts STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Krustpunkts
@ -3759,7 +3759,7 @@ STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Globāl
STR_STORY_BOOK_SPECTATOR :Globālā stāstu grāmata STR_STORY_BOOK_SPECTATOR :Globālā stāstu grāmata
STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
STR_STORY_BOOK_GENERIC_PAGE_ITEM :{NUM} lapa STR_STORY_BOOK_GENERIC_PAGE_ITEM :{NUM} lapa
STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Pārlēkt uz konkrētu lapu spiežot to zemāk esošajā sarakstā STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Pārlēkt uz konkrētu lapu, atlasot to zemāk esošajā sarakstā
STR_STORY_BOOK_PREV_PAGE :{BLACK}Iepriekšējā STR_STORY_BOOK_PREV_PAGE :{BLACK}Iepriekšējā
STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Doties uz iepriekšējo lapu STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Doties uz iepriekšējo lapu
STR_STORY_BOOK_NEXT_PAGE :{BLACK}Nākamā STR_STORY_BOOK_NEXT_PAGE :{BLACK}Nākamā
@ -4338,7 +4338,7 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Parslēg
STR_REPLACE_ENGINES :Lokomotīves STR_REPLACE_ENGINES :Lokomotīves
STR_REPLACE_WAGONS :Vagoni STR_REPLACE_WAGONS :Vagoni
STR_REPLACE_ALL_RAILTYPE :Visi dzelzceļa transporta līdzekļi STR_REPLACE_ALL_RAILTYPE :Visi dzelzceļa transporta līdzekļi
STR_REPLACE_ALL_ROADTYPE :Visi ceļu transportlīdzekļi STR_REPLACE_ALL_ROADTYPE :Visi ceļa transportlīdzekļi
###length 2 ###length 2
STR_REPLACE_HELP_RAILTYPE :{BLACK}Izvēlēties sliežu veidu, kuram vēlaties nomainīt lokomotīves STR_REPLACE_HELP_RAILTYPE :{BLACK}Izvēlēties sliežu veidu, kuram vēlaties nomainīt lokomotīves
@ -4757,13 +4757,13 @@ STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet
STR_TIMETABLE_START_SECONDS_QUERY :Sekundes līdz grafika sākumam STR_TIMETABLE_START_SECONDS_QUERY :Sekundes līdz grafika sākumam
STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainīt laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem
STR_TIMETABLE_CLEAR_TIME :{BLACK}Notīrīt laiku STR_TIMETABLE_CLEAR_TIME :{BLACK}Notīrīt laiku
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma laiku. Ctrl+klikšķis notīra laiku visiem pasūtījumiem STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma laiku. Ctrl+klikšķis notīra laiku visiem pasūtījumiem
STR_TIMETABLE_CHANGE_SPEED :{BLACK}Mainīt ātruma ierobežojumu STR_TIMETABLE_CHANGE_SPEED :{BLACK}Mainīt ātruma ierobežojumu
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainīt izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Nodzēst ātruma ierobežojumu STR_TIMETABLE_CLEAR_SPEED :{BLACK}Nodzēst ātruma ierobežojumu
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis notīra ātrumu visiem pasūtījumiem STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis notīra ātrumu visiem pasūtījumiem
@ -4819,7 +4819,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}MI/spē
# AI configuration window # AI configuration window
STR_AI_CONFIG_CAPTION_AI :{WHITE}MI iestatījumi STR_AI_CONFIG_CAPTION_AI :{WHITE}MI iestatījumi
STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spēles Skripta Iestatījumi STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spēles skripta Iestatījumi
STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spēles skripts, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spēles skripts, kas tiks ielādēts nākamajā spēlē
STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}MI, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}MI, kas tiks ielādēts nākamajā spēlē
STR_AI_CONFIG_HUMAN_PLAYER :Spēlētājs (cilvēks) STR_AI_CONFIG_HUMAN_PLAYER :Spēlētājs (cilvēks)
@ -4839,7 +4839,7 @@ STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Paramet
STR_AI_CONFIG_AI :{SILVER}MI STR_AI_CONFIG_AI :{SILVER}MI
STR_AI_CONFIG_CHANGE_AI :{BLACK}Izvēlēties MI STR_AI_CONFIG_CHANGE_AI :{BLACK}Izvēlēties MI
STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Izvētaties spēles skriptu STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}AtlasĪt spēles skriptu
STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Ielādēt citu skriptu. Ctrl+klikšķis, lai parādītu visas pieejamās versijas STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Ielādēt citu skriptu. Ctrl+klikšķis, lai parādītu visas pieejamās versijas
STR_AI_CONFIG_CONFIGURE :{BLACK}Konfigurēt STR_AI_CONFIG_CONFIGURE :{BLACK}Konfigurēt
STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Konfigurēt skripta parametrus STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Konfigurēt skripta parametrus
@ -4860,7 +4860,7 @@ STR_AI_LIST_CANCEL :{BLACK}Atcelt
STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemainīt skriptu STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemainīt skriptu
STR_SCREENSHOT_CAPTION :{WHITE}Uzņemt ekrānuzņēmumu STR_SCREENSHOT_CAPTION :{WHITE}Uzņemt ekrānuzņēmumu
STR_SCREENSHOT_SCREENSHOT :{BLACK}Normāls ekrānuzņēmums STR_SCREENSHOT_SCREENSHOT :{BLACK}Parasts ekrānuzņēmums
STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Pilnībā pietuvināts ekrānuzņēmums STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Pilnībā pietuvināts ekrānuzņēmums
STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Noklusējuma tuvinājuma ekrānuzņēmums STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Noklusējuma tuvinājuma ekrānuzņēmums
STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Visas kartes ekrānuzņēmums STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Visas kartes ekrānuzņēmums
@ -4884,8 +4884,8 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Atgriezt
STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Atgriezties uz priekšu navigācijas vēsturē STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Atgriezties uz priekšu navigācijas vēsturē
STR_TEXTFILE_WRAP_TEXT :{WHITE}Aplauzt tekstu STR_TEXTFILE_WRAP_TEXT :{WHITE}Aplauzt tekstu
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Aplauzt tekstu logā, lai tas viss iekļautos un nevajadzētu ritināt STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Aplauzt tekstu logā, lai tas viss iekļautos un nevajadzētu ritināt
STR_TEXTFILE_VIEW_README :{BLACK}Lasi_Mani STR_TEXTFILE_VIEW_README :{BLACK}Lasi_mani
STR_TEXTFILE_VIEW_README_TOOLTIP :Skatīt šī satura readme STR_TEXTFILE_VIEW_README_TOOLTIP :Skatīt šī satura failu Lasi_mani
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Izmaiņu žurnāls STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Izmaiņu žurnāls
STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Skatīt šī satura izmaiņu žurnālu STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Skatīt šī satura izmaiņu žurnālu
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licence STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licence

@ -2425,6 +2425,7 @@ STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Pasirink
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Pasirinkite antrinę spalvą pasirinktai schemai. Spustelėjus laikant nuspaustą Ctrl klavišą, pasirinkta spava bus nustatyta visoms schemoms STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Pasirinkite antrinę spalvą pasirinktai schemai. Spustelėjus laikant nuspaustą Ctrl klavišą, pasirinkta spava bus nustatyta visoms schemoms
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Pasirinkite objektą, kurio spalvas norite pakeisti. Spragsint laikant nuspaustą Ctrl klavišą, galėsite pasirinkti iškart kelis objektus. STR_LIVERY_PANEL_TOOLTIP :{BLACK}Pasirinkite objektą, kurio spalvas norite pakeisti. Spragsint laikant nuspaustą Ctrl klavišą, galėsite pasirinkti iškart kelis objektus.
STR_LIVERY_TRAIN_GROUP_EMPTY :Nėra nustatytų traukinių grupių STR_LIVERY_TRAIN_GROUP_EMPTY :Nėra nustatytų traukinių grupių
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Nėra sukurtų automobilių grupių
STR_LIVERY_SHIP_GROUP_EMPTY :Nėra nustatytų laivų grupių STR_LIVERY_SHIP_GROUP_EMPTY :Nėra nustatytų laivų grupių
STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Lėktuvų grupės nesudarytos STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Lėktuvų grupės nesudarytos
@ -2922,7 +2923,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Statyti
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Paversti bėgius į kontrolės punktą. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująjį kontrolės punktą sujungti su jau egzistuojančiu. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Paversti bėgius į kontrolės punktą. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująjį kontrolės punktą sujungti su jau egzistuojančiu. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Statyti traukinių stotelę. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująją stotelę sujungti su jau egzistuojančia. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Statyti traukinių stotelę. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująją stotelę sujungti su jau egzistuojančia. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Statyti geležinkelio signalus. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus statomi semaforai.{}Velkant signalai bus statomi vienodais atstumais išilgai tiesios bėgių linijos. Velkant ir laikant nuspaustą Ctrl klavišą, signalai bus automatiškai pastatyti iki artimiausios sankryžos. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos. Šį mygtuką spragtelėjus laikant nuspaustą Ctrl klavišą, nebus atvertas signalų pasirinkimo langas (jeigu toks yra aktyvintas nuostatose) STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Statyti geležinkelio signalus. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus statomi semaforai.{}Velkant signalai bus statomi vienodais atstumais išilgai tiesios bėgių linijos. Velkant ir laikant nuspaustą Ctrl klavišą, signalai bus automatiškai pastatyti iki artimiausios sankryžos. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos. Šį mygtuką spragtelėjus laikant nuspaustą Ctrl klavišą, nebus atvertas signalų pasirinkimo langas (jeigu toks yra aktyvintas nuostatose)
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Statyti geležinkelio tiltą. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Statyti geležinkelio tiltą. Spragtelėkite laikydami Shift klavišą, kad būtų parodomos apytikslės išlaidos
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Statyti geležinkelio tunelį. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Statyti geležinkelio tunelį. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Aktyvinti bėgių, signalų, kontrolės punktų ir stotelių šalinimo veikseną. Spragtelėjus stotelę laikant nuspaustą Ctrl klavišą, bus pašalinti ir bėgiai, ne tik stotelės elementas STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Aktyvinti bėgių, signalų, kontrolės punktų ir stotelių šalinimo veikseną. Spragtelėjus stotelę laikant nuspaustą Ctrl klavišą, bus pašalinti ir bėgiai, ne tik stotelės elementas
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pakeisti geležinkelio bėgių tipą. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pakeisti geležinkelio bėgių tipą. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos
@ -5186,6 +5187,7 @@ STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Negalima
STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Ribojasi su daugiau nei viena stotele/pakrovimo aikštele STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Ribojasi su daugiau nei viena stotele/pakrovimo aikštele
STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... stotelė per daug išsiplėtusi STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... stotelė per daug išsiplėtusi
STR_ERROR_STATION_DISALLOWED_NUMBER_TRACKS :{WHITE}... toks kiekis bėgių nėra palaikomas
STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Per daug stotelių STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Per daug stotelių
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Perdaug traukinių stoties dalių STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Perdaug traukinių stoties dalių
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Per daug autobusų stotelių STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Per daug autobusų stotelių
@ -5462,6 +5464,9 @@ STR_ERROR_NO_DOCK :{WHITE}Nėra do
STR_ERROR_NO_AIRPORT :{WHITE}Nėra jokio oro ar sraigtasparnio uosto STR_ERROR_NO_AIRPORT :{WHITE}Nėra jokio oro ar sraigtasparnio uosto
STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu keliu (tipu) STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu keliu (tipu)
STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu tramvajaus tipu STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu tramvajaus tipu
STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Šis lėktuvas negali nusileisti šiame sraigtasparnių oro uoste
STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Šis sraigtasparnis negali nusileisti šiame oro uoste
STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Nėra geležinkelio tarpinio taško
STR_ERROR_NO_BUOY :{WHITE}Nėra plūduro STR_ERROR_NO_BUOY :{WHITE}Nėra plūduro
# Timetable related errors # Timetable related errors
@ -6215,7 +6220,9 @@ STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}tūkst. STR_CURRENCY_SHORT_KILO :{NBSP}tūkst.
STR_CURRENCY_SHORT_MEGA :{NBSP}M
STR_CURRENCY_SHORT_GIGA :{NBSP}mlrd. STR_CURRENCY_SHORT_GIGA :{NBSP}mlrd.
STR_CURRENCY_SHORT_TERA :{NBSP}tr
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

@ -2590,6 +2590,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :feil versjon
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :navnet er allerede i bruk STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :navnet er allerede i bruk
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :feil passord STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :feil passord
STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :ikke på tillattliste STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :ikke på tillattliste
STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :ingen av de ønskede autentiseringsmetodene er tilgjengelige
STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :feil selskap i DoCommand STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :feil selskap i DoCommand
STR_NETWORK_ERROR_CLIENT_KICKED :kastet ut av tjeneren STR_NETWORK_ERROR_CLIENT_KICKED :kastet ut av tjeneren
STR_NETWORK_ERROR_CLIENT_CHEATER :prøvde å jukse STR_NETWORK_ERROR_CLIENT_CHEATER :prøvde å jukse

@ -4704,9 +4704,9 @@ STR_ORDER_STOP_LOCATION_FAR_END :[远端]
STR_ORDER_OUT_OF_RANGE :{RED}(下一个目的地距离过远) STR_ORDER_OUT_OF_RANGE :{RED}(下一个目的地距离过远)
STR_ORDER_CONDITIONAL_UNCONDITIONAL :跳至 {COMMA} STR_ORDER_CONDITIONAL_UNCONDITIONAL :跳至 #{COMMA}
STR_ORDER_CONDITIONAL_NUM :跳至 {COMMA} [ 当 {STRING} {STRING} {COMMA} ] STR_ORDER_CONDITIONAL_NUM :跳至 #{COMMA} [如果{STRING}{STRING}{COMMA}]
STR_ORDER_CONDITIONAL_TRUE_FALSE :跳至 {COMMA} [ 当 {STRING} {STRING}] STR_ORDER_CONDITIONAL_TRUE_FALSE :跳至 #{COMMA} [如果{STRING}{STRING}]
STR_INVALID_ORDER :{RED}(非法的调度计划) STR_INVALID_ORDER :{RED}(非法的调度计划)

@ -1503,7 +1503,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalender
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Väggklocka STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Väggklocka
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuter per år: {STRING} STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuter per år: {STRING}
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Välj antalet minuter som går i ett kalenderår. Standard är 12 minuter. Sätt till 0 för att stoppa kalendertiden från att ändras. Denna inställning påverkar inte spelets ekonomiska simulering, och är endast tillgänglig för tidhållning medelst väggklocka STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Välj antalet minuter som går i ett kalenderår. Standard är 12 minuter. Sätt till 0 för att stoppa kalendertiden från att ändras. Ökning av kalenderårets längd fördröjer introduceringen av fordon, byggnader, och annan infrastruktur. Detta påverkar inte fordonshastigheter eller spelets ekonomiska simulering, med undantag för inflationen. Denna inställning är endast tillgänglig för tidhållning medelst väggklocka
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
@ -2887,6 +2887,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Bygg vä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Bygg spårvägssektion med Autospårvägläget. Ctrl+Klick för att ta bort spårvägssektion. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Bygg spårvägssektion med Autospårvägläget. Ctrl+Klick för att ta bort spårvägssektion. Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bygg vägfordonsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bygg vägfordonsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Bygg spårvagnsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Bygg spårvagnsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}Bygg riktmärke på väg. Ctrl+Klick för att välja ett annat riktmärke att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Bygg riktmärke på spårvagnsräls. Ctrl+Klick för att välja ett annat riktmärke att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bygg busshållplats. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bygg busshållplats. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bygg passagerarspårvagnsstation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bygg passagerarspårvagnsstation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Bygg laststation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Bygg laststation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad

File diff suppressed because it is too large Load Diff

@ -623,14 +623,14 @@ STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLA
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Bỏ toàn bộ STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Bỏ toàn bộ
STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Hiển thị toàn bộ loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Hiển thị toàn bộ loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng
STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Không hiển thị các loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Không hiển thị các loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng
STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Bật/tắt đồ thị hàng hóa STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Bật/tắt đồ thị cho hàng hóa này
STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING}
STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Hiện chi tiết đánh giá chỉ số năng suất STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Hiện chi tiết đánh giá chỉ số năng suất
# Graph key window # Graph key window
STR_GRAPH_KEY_CAPTION :{WHITE}Nút bật biểu đồ công ty STR_GRAPH_KEY_CAPTION :{WHITE}Nút bật biểu đồ công ty
STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Click vào đây để bật/tắt thông tin công ty trên biểu đồ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Click vào đây để bật/tắt biểu đồ của công ty này
# Company league window # Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Bảng Tầm Cỡ Công Ty STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Bảng Tầm Cỡ Công Ty
@ -3592,6 +3592,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Biển h
STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Nhập tên của biển hiệu STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Nhập tên của biển hiệu
# Town directory window # Town directory window
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Đô Thị ({COMMA} đến {COMMA})
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Không Có - STR_TOWN_DIRECTORY_NONE :{ORANGE}- Không Có -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (đô thị){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (đô thị){BLACK} ({COMMA})
@ -3925,6 +3926,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/chu kỳ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/chu kỳ
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Nhà máy ({COMMA} đến {COMMA})
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Không Có - STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Không Có -
STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% đã vận chuyển){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% đã vận chuyển){BLACK}
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}

@ -1122,7 +1122,7 @@ const char *MusicDriver_DMusic::Start(const StringList &parm)
DEBUG(driver, 1, "Detected DirectMusic ports:"); DEBUG(driver, 1, "Detected DirectMusic ports:");
for (int i = 0; _music->EnumPort(i, &caps) == S_OK; i++) { for (int i = 0; _music->EnumPort(i, &caps) == S_OK; i++) {
if (caps.dwClass == DMUS_PC_OUTPUTCLASS) { if (caps.dwClass == DMUS_PC_OUTPUTCLASS) {
DEBUG(driver, 1, " %d: %s%s", i, convert_from_fs(caps.wszDescription, desc, lengthof(desc)), i == pIdx ? " (selected)" : ""); DEBUG(driver, 1, " %d: %s%s", i, convert_from_fs(caps.wszDescription, desc), i == pIdx ? " (selected)" : "");
} }
} }
} }

@ -383,7 +383,7 @@ const char *MusicDriver_Win32::Start(const StringList &parm)
MIDIOUTCAPS moc{}; MIDIOUTCAPS moc{};
if (midiOutGetDevCaps(tryport, &moc, sizeof(moc)) == MMSYSERR_NOERROR) { if (midiOutGetDevCaps(tryport, &moc, sizeof(moc)) == MMSYSERR_NOERROR) {
char tryportname[128]; char tryportname[128];
convert_from_fs(moc.szPname, tryportname, lengthof(tryportname)); convert_from_fs(moc.szPname, tryportname);
/* Compare requested and detected port name. /* Compare requested and detected port name.
* If multiple ports have the same name, this will select the last matching port, and the debug output will be confusing. */ * If multiple ports have the same name, this will select the last matching port, and the debug output will be confusing. */

@ -1430,7 +1430,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P
_network_server_max_companies = p.Recv_uint8(); _network_server_max_companies = p.Recv_uint8();
_network_server_name = p.Recv_string(NETWORK_NAME_LENGTH); _network_server_name = p.Recv_string(NETWORK_NAME_LENGTH);
SetWindowClassesDirty(WC_CLIENT_LIST);
InvalidateWindowData(WC_CLIENT_LIST, 0);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }

@ -585,7 +585,7 @@ public:
void OnInit() override void OnInit() override
{ {
this->checkbox_size = maxdim(maxdim(GetSpriteSize(SPR_BOX_EMPTY), GetSpriteSize(SPR_BOX_CHECKED)), GetSpriteSize(SPR_BLOT)); this->checkbox_size = maxdim(maxdim(GetScaledSpriteSize(SPR_BOX_EMPTY), GetScaledSpriteSize(SPR_BOX_CHECKED)), GetScaledSpriteSize(SPR_BLOT));
} }
void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
@ -648,15 +648,15 @@ public:
*/ */
void DrawMatrix(const Rect &r) const void DrawMatrix(const Rect &r) const
{ {
Rect checkbox = this->GetWidget<NWidgetBase>(WID_NCL_CHECKBOX)->GetCurrentRect(); const Rect checkbox = this->GetWidget<NWidgetBase>(WID_NCL_CHECKBOX)->GetCurrentRect();
Rect name = this->GetWidget<NWidgetBase>(WID_NCL_NAME)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); const Rect name = this->GetWidget<NWidgetBase>(WID_NCL_NAME)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
Rect type = this->GetWidget<NWidgetBase>(WID_NCL_TYPE)->GetCurrentRect(); const Rect type = this->GetWidget<NWidgetBase>(WID_NCL_TYPE)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
/* Fill the matrix with the information */ /* Fill the matrix with the information */
int sprite_y_offset = (this->resize.step_height - this->checkbox_size.height) / 2; const uint step_height = this->GetWidget<NWidgetBase>(WID_NCL_MATRIX)->resize_y;
int text_y_offset = (this->resize.step_height - GetCharacterHeight(FS_NORMAL)) / 2; const int text_y_offset = WidgetDimensions::scaled.matrix.top + (step_height - WidgetDimensions::scaled.matrix.Vertical() - GetCharacterHeight(FS_NORMAL)) / 2;
Rect mr = r.WithHeight(this->resize.step_height); Rect mr = r.WithHeight(step_height);
auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->content); auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->content);
for (auto iter = first; iter != last; iter++) { for (auto iter = first; iter != last; iter++) {
const ContentInfo *ci = *iter; const ContentInfo *ci = *iter;
@ -673,13 +673,13 @@ public:
case ContentInfo::DOES_NOT_EXIST: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break; case ContentInfo::DOES_NOT_EXIST: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break;
default: NOT_REACHED(); default: NOT_REACHED();
} }
DrawSprite(sprite, pal, checkbox.left + (sprite == SPR_BLOT ? 3 : 2), mr.top + sprite_y_offset + (sprite == SPR_BLOT ? 0 : 1)); DrawSpriteIgnorePadding(sprite, pal, {checkbox.left, mr.top, checkbox.right, mr.bottom}, SA_CENTER);
StringID str = STR_CONTENT_TYPE_BASE_GRAPHICS + ci->type - CONTENT_TYPE_BASE_GRAPHICS; StringID str = STR_CONTENT_TYPE_BASE_GRAPHICS + ci->type - CONTENT_TYPE_BASE_GRAPHICS;
DrawString(type.left, type.right, mr.top + text_y_offset, str, TC_BLACK, SA_HOR_CENTER); DrawString(type.left, type.right, mr.top + text_y_offset, str, TC_BLACK, SA_HOR_CENTER);
DrawString(name.left, name.right, mr.top + text_y_offset, ci->name, TC_BLACK); DrawString(name.left, name.right, mr.top + text_y_offset, ci->name, TC_BLACK);
mr = mr.Translate(0, this->resize.step_height); mr = mr.Translate(0, step_height);
} }
} }
@ -1058,13 +1058,13 @@ static constexpr NWidgetPart _nested_network_content_list_widgets[] = {
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(NWID_VERTICAL), NWidget(NWID_VERTICAL),
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_CHECKBOX), SetMinimalSize(13, 1), SetDataTip(STR_EMPTY, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_CHECKBOX), SetDataTip(STR_EMPTY, STR_NULL),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TYPE), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TYPE),
SetDataTip(STR_CONTENT_TYPE_CAPTION, STR_CONTENT_TYPE_CAPTION_TOOLTIP), SetDataTip(STR_CONTENT_TYPE_CAPTION, STR_CONTENT_TYPE_CAPTION_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_NAME), SetResize(1, 0), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_NAME), SetResize(1, 0), SetFill(1, 0),
SetDataTip(STR_CONTENT_NAME_CAPTION, STR_CONTENT_NAME_CAPTION_TOOLTIP), SetDataTip(STR_CONTENT_NAME_CAPTION, STR_CONTENT_NAME_CAPTION_TOOLTIP),
EndContainer(), EndContainer(),
NWidget(WWT_MATRIX, COLOUR_LIGHT_BLUE, WID_NCL_MATRIX), SetResize(1, 14), SetFill(1, 1), SetScrollbar(WID_NCL_SCROLLBAR), SetMatrixDataTip(1, 0, STR_CONTENT_MATRIX_TOOLTIP), NWidget(WWT_MATRIX, COLOUR_LIGHT_BLUE, WID_NCL_MATRIX), SetResize(1, 1), SetFill(1, 1), SetScrollbar(WID_NCL_SCROLLBAR), SetMatrixDataTip(1, 0, STR_CONTENT_MATRIX_TOOLTIP),
EndContainer(), EndContainer(),
NWidget(NWID_VSCROLLBAR, COLOUR_LIGHT_BLUE, WID_NCL_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_LIGHT_BLUE, WID_NCL_SCROLLBAR),
EndContainer(), EndContainer(),

@ -105,8 +105,6 @@ public:
this->Add(std::make_unique<NWidgetLeaf>(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_YEARS, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP)); this->Add(std::make_unique<NWidgetLeaf>(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_YEARS, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP));
leaf = std::make_unique<NWidgetLeaf>(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_INFO, STR_EMPTY, STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP); leaf = std::make_unique<NWidgetLeaf>(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_INFO, STR_EMPTY, STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP);
leaf->SetMinimalSize(14 + GetSpriteSize(SPR_LOCK, nullptr, ZOOM_LVL_NORMAL).width
+ GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_NORMAL).width, 12);
leaf->SetFill(0, 1); leaf->SetFill(0, 1);
this->Add(std::move(leaf)); this->Add(std::move(leaf));
} }
@ -199,9 +197,8 @@ protected:
GUITimer requery_timer; ///< Timer for network requery. GUITimer requery_timer; ///< Timer for network requery.
bool searched_internet = false; ///< Did we ever press "Search Internet" button? bool searched_internet = false; ///< Did we ever press "Search Internet" button?
int lock_offset; ///< Left offset for lock icon. Dimension lock; /// Dimension of lock icon.
int blot_offset; ///< Left offset for green/yellow/red compatibility icon. Dimension blot; /// Dimension of compatibility icon.
int flag_offset; ///< Left offset for language flag icon.
/** /**
* (Re)build the GUI network game list (a.k.a. this->servers) as some * (Re)build the GUI network game list (a.k.a. this->servers) as some
@ -370,11 +367,10 @@ protected:
GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_GREY); GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_GREY);
} }
/* offsets to vertically centre text and icons */ /* Offset to vertically position text. */
int text_y_offset = (this->resize.step_height - GetCharacterHeight(FS_NORMAL)) / 2 + 1; int text_y_offset = WidgetDimensions::scaled.matrix.top + (this->resize.step_height - WidgetDimensions::scaled.matrix.Vertical() - GetCharacterHeight(FS_NORMAL)) / 2;
int icon_y_offset = (this->resize.step_height - GetSpriteSize(SPR_BLOT).height) / 2;
int lock_y_offset = (this->resize.step_height - GetSpriteSize(SPR_LOCK).height) / 2;
info = info.Shrink(WidgetDimensions::scaled.framerect);
name = name.Shrink(WidgetDimensions::scaled.framerect); name = name.Shrink(WidgetDimensions::scaled.framerect);
DrawString(name.left, name.right, y + text_y_offset, cur_item->info.server_name, TC_BLACK); DrawString(name.left, name.right, y + text_y_offset, cur_item->info.server_name, TC_BLACK);
@ -414,11 +410,18 @@ protected:
DrawString(years.left, years.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT, TC_BLACK, SA_HOR_CENTER); DrawString(years.left, years.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT, TC_BLACK, SA_HOR_CENTER);
} }
/* Set top and bottom of info rect to current row. */
info.top = y;
info.bottom = y + this->resize.step_height - 1;
bool rtl = _current_text_dir == TD_RTL;
/* draw a lock if the server is password protected */ /* draw a lock if the server is password protected */
if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, info.left + this->lock_offset, y + lock_y_offset); if (cur_item->info.use_password) DrawSpriteIgnorePadding(SPR_LOCK, PAL_NONE, info.WithWidth(this->lock.width, rtl), SA_CENTER);
/* draw red or green icon, depending on compatibility with server */ /* draw red or green icon, depending on compatibility with server */
DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), info.left + this->blot_offset, y + icon_y_offset + 1); PaletteID pal = cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED);
DrawSpriteIgnorePadding(SPR_BLOT, pal, info.WithWidth(this->blot.width, !rtl), SA_CENTER);
} }
} }
@ -479,9 +482,8 @@ public:
void OnInit() override void OnInit() override
{ {
this->lock_offset = ScaleGUITrad(5); this->lock = GetScaledSpriteSize(SPR_LOCK);
this->blot_offset = this->lock_offset + ScaleGUITrad(3) + GetSpriteSize(SPR_LOCK).width; this->blot = GetScaledSpriteSize(SPR_BLOT);
this->flag_offset = this->blot_offset + ScaleGUITrad(2) + GetSpriteSize(SPR_BLOT).width;
} }
void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
@ -527,6 +529,11 @@ public:
SetDParamMaxValue(0, 5); SetDParamMaxValue(0, 5);
size = maxdim(size, GetStringBoundingBox(STR_JUST_INT)); size = maxdim(size, GetStringBoundingBox(STR_JUST_INT));
break; break;
case WID_NG_INFO:
size.width = this->lock.width + WidgetDimensions::scaled.hsep_normal + this->blot.width + padding.width;
size.height = std::max(this->lock.height, this->blot.height) + padding.height;
break;
} }
} }

@ -7989,7 +7989,7 @@ static void ScanInfo(ByteReader &buf)
if (grf_version < 2 || grf_version > 8) { if (grf_version < 2 || grf_version > 8) {
SetBit(_cur.grfconfig->flags, GCF_INVALID); SetBit(_cur.grfconfig->flags, GCF_INVALID);
Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID %08X) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->GetDisplayPath(), StrMakeValid(name), BSWAP32(grfid), grf_version); Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID {:08X}) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->GetDisplayPath(), StrMakeValid(name), BSWAP32(grfid), grf_version);
} }
/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */ /* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
@ -11848,13 +11848,13 @@ void LoadNewGRF(uint load_index, uint num_baseset)
} }
if (stage == GLS_RESERVE) { if (stage == GLS_RESERVE) {
static const uint32_t overrides[][2] = { static const std::pair<uint32_t, uint32_t> default_grf_overrides[] = {
{ 0x44442202, 0x44440111 }, // UKRS addons modifies UKRS { BSWAP32(0x44442202), BSWAP32(0x44440111) }, // UKRS addons modifies UKRS
{ 0x6D620402, 0x6D620401 }, // DBSetXL ECS extension modifies DBSetXL { BSWAP32(0x6D620402), BSWAP32(0x6D620401) }, // DBSetXL ECS extension modifies DBSetXL
{ 0x4D656f20, 0x4D656F17 }, // LV4cut modifies LV4 { BSWAP32(0x4D656f20), BSWAP32(0x4D656F17) }, // LV4cut modifies LV4
}; };
for (size_t i = 0; i < lengthof(overrides); i++) { for (const auto &grf_override : default_grf_overrides) {
SetNewGRFOverride(BSWAP32(overrides[i][0]), BSWAP32(overrides[i][1])); SetNewGRFOverride(grf_override.first, grf_override.second);
} }
} }

@ -183,7 +183,7 @@ GrfSpecFeature AirportResolverObject::GetFeature() const
uint32_t AirportResolverObject::GetDebugID() const uint32_t AirportResolverObject::GetDebugID() const
{ {
return AirportSpec::Get(this->airport_scope.airport_id)->grf_prop.local_id; return this->airport_scope.spec->grf_prop.local_id;
} }
/* virtual */ uint32_t AirportScopeResolver::GetRandomBits() const /* virtual */ uint32_t AirportScopeResolver::GetRandomBits() const
@ -236,22 +236,22 @@ TownScopeResolver *AirportResolverObject::GetTown()
* Constructor of the airport resolver. * Constructor of the airport resolver.
* @param tile %Tile for the callback, only valid for airporttile callbacks. * @param tile %Tile for the callback, only valid for airporttile callbacks.
* @param st %Station of the airport for which the callback is run, or \c nullptr for build gui. * @param st %Station of the airport for which the callback is run, or \c nullptr for build gui.
* @param airport_id Type of airport for which the callback is run. * @param spec AirportSpec for which the callback is run.
* @param layout Layout of the airport to build. * @param layout Layout of the airport to build.
* @param callback Callback ID. * @param callback Callback ID.
* @param param1 First parameter (var 10) of the callback. * @param param1 First parameter (var 10) of the callback.
* @param param2 Second parameter (var 18) of the callback. * @param param2 Second parameter (var 18) of the callback.
*/ */
AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout, AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout,
CallbackID callback, uint32_t param1, uint32_t param2) CallbackID callback, uint32_t param1, uint32_t param2)
: ResolverObject(AirportSpec::Get(airport_id)->grf_prop.grffile, callback, param1, param2), airport_scope(*this, tile, st, airport_id, layout) : ResolverObject(spec->grf_prop.grffile, callback, param1, param2), airport_scope(*this, tile, st, spec, layout)
{ {
this->root_spritegroup = AirportSpec::Get(airport_id)->grf_prop.spritegroup[0]; this->root_spritegroup = spec->grf_prop.spritegroup[0];
} }
SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout) SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout)
{ {
AirportResolverObject object(INVALID_TILE, nullptr, as->GetIndex(), layout); AirportResolverObject object(INVALID_TILE, nullptr, as, layout);
const SpriteGroup *group = object.Resolve(); const SpriteGroup *group = object.Resolve();
if (group == nullptr) return as->preview_sprite; if (group == nullptr) return as->preview_sprite;
@ -260,7 +260,7 @@ SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout)
uint16_t GetAirportCallback(CallbackID callback, uint32_t param1, uint32_t param2, Station *st, TileIndex tile) uint16_t GetAirportCallback(CallbackID callback, uint32_t param1, uint32_t param2, Station *st, TileIndex tile)
{ {
AirportResolverObject object(tile, st, st->airport.type, st->airport.layout, callback, param1, param2); AirportResolverObject object(tile, st, AirportSpec::Get(st->airport.type), st->airport.layout, callback, param1, param2);
return object.ResolveCallback(); return object.ResolveCallback();
} }
@ -273,7 +273,7 @@ uint16_t GetAirportCallback(CallbackID callback, uint32_t param1, uint32_t param
*/ */
StringID GetAirportTextCallback(const AirportSpec *as, uint8_t layout, uint16_t callback) StringID GetAirportTextCallback(const AirportSpec *as, uint8_t layout, uint16_t callback)
{ {
AirportResolverObject object(INVALID_TILE, nullptr, as->GetIndex(), layout, (CallbackID)callback); AirportResolverObject object(INVALID_TILE, nullptr, as, layout, (CallbackID)callback);
uint16_t cb_res = object.ResolveCallback(); uint16_t cb_res = object.ResolveCallback();
if (cb_res == CALLBACK_FAILED || cb_res == 0x400) return STR_UNDEFINED; if (cb_res == CALLBACK_FAILED || cb_res == 0x400) return STR_UNDEFINED;
if (cb_res > 0x400) { if (cb_res > 0x400) {

@ -149,7 +149,7 @@ void BindAirportSpecs();
/** Resolver for the airport scope. */ /** Resolver for the airport scope. */
struct AirportScopeResolver : public ScopeResolver { struct AirportScopeResolver : public ScopeResolver {
struct Station *st; ///< Station of the airport for which the callback is run, or \c nullptr for build gui. struct Station *st; ///< Station of the airport for which the callback is run, or \c nullptr for build gui.
uint8_t airport_id; ///< Type of airport for which the callback is run. const AirportSpec *spec; ///< AirportSpec for which the callback is run.
uint8_t layout; ///< Layout of the airport to build. uint8_t layout; ///< Layout of the airport to build.
TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks. TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks.
@ -158,11 +158,11 @@ struct AirportScopeResolver : public ScopeResolver {
* @param ro Surrounding resolver. * @param ro Surrounding resolver.
* @param tile %Tile for the callback, only valid for airporttile callbacks. * @param tile %Tile for the callback, only valid for airporttile callbacks.
* @param st %Station of the airport for which the callback is run, or \c nullptr for build gui. * @param st %Station of the airport for which the callback is run, or \c nullptr for build gui.
* @param airport_id Type of airport for which the callback is run. * @param spec AirportSpec for which the callback is run.
* @param layout Layout of the airport to build. * @param layout Layout of the airport to build.
*/ */
AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout) AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout)
: ScopeResolver(ro), st(st), airport_id(airport_id), layout(layout), tile(tile) : ScopeResolver(ro), st(st), spec(spec), layout(layout), tile(tile)
{ {
} }
@ -177,7 +177,7 @@ struct AirportResolverObject : public ResolverObject {
AirportScopeResolver airport_scope; AirportScopeResolver airport_scope;
std::optional<TownScopeResolver> town_scope = std::nullopt; ///< The town scope resolver (created on the first call). std::optional<TownScopeResolver> town_scope = std::nullopt; ///< The town scope resolver (created on the first call).
AirportResolverObject(TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout, AirportResolverObject(TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout,
CallbackID callback = CBID_NO_CALLBACK, uint32_t callback_param1 = 0, uint32_t callback_param2 = 0); CallbackID callback = CBID_NO_CALLBACK, uint32_t callback_param1 = 0, uint32_t callback_param2 = 0);
TownScopeResolver *GetTown(); TownScopeResolver *GetTown();

@ -225,7 +225,7 @@ AirportTileResolverObject::AirportTileResolverObject(const AirportTileSpec *ats,
CallbackID callback, uint32_t callback_param1, uint32_t callback_param2) CallbackID callback, uint32_t callback_param1, uint32_t callback_param2)
: ResolverObject(ats->grf_prop.grffile, callback, callback_param1, callback_param2), : ResolverObject(ats->grf_prop.grffile, callback, callback_param1, callback_param2),
tiles_scope(*this, ats, tile, st), tiles_scope(*this, ats, tile, st),
airport_scope(*this, tile, st, st != nullptr ? st->airport.type : (uint8_t)AT_DUMMY, st != nullptr ? st->airport.layout : 0) airport_scope(*this, tile, st, st != nullptr ? AirportSpec::Get(st->airport.type) : nullptr, st != nullptr ? st->airport.layout : 0)
{ {
this->root_spritegroup = ats->grf_prop.spritegroup[0]; this->root_spritegroup = ats->grf_prop.spritegroup[0];
} }

@ -574,13 +574,14 @@ struct ResultSpriteGroup : SpriteGroup {
*/ */
ResultSpriteGroup(SpriteID sprite, uint8_t num_sprites) : ResultSpriteGroup(SpriteID sprite, uint8_t num_sprites) :
SpriteGroup(SGT_RESULT), SpriteGroup(SGT_RESULT),
sprite(sprite), num_sprites(num_sprites),
num_sprites(num_sprites) sprite(sprite)
{ {
} }
SpriteID sprite;
uint8_t num_sprites; uint8_t num_sprites;
SpriteID sprite;
SpriteID GetResult() const override { return this->sprite; } SpriteID GetResult() const override { return this->sprite; }
uint8_t GetNumResults() const override { return this->num_sprites; } uint8_t GetNumResults() const override { return this->num_sprites; }
}; };

@ -808,7 +808,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
return cost; return cost;
} }
static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
{ {
if (!IsObjectType(tile, OBJECT_HQ)) return; if (!IsObjectType(tile, OBJECT_HQ)) return;
@ -823,7 +823,7 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg
CargoID pass = GetCargoIDByLabel(CT_PASSENGERS); CargoID pass = GetCargoIDByLabel(CT_PASSENGERS);
if (IsValidCargoID(pass)) { if (IsValidCargoID(pass)) {
acceptance[pass] += std::max(1U, level); acceptance[pass] += std::max(1U, level);
SetBit(*always_accepted, pass); SetBit(always_accepted, pass);
} }
/* Top town building generates 4, HQ can make up to 8. The /* Top town building generates 4, HQ can make up to 8. The
@ -833,7 +833,7 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg
CargoID mail = GetCargoIDByLabel(CT_MAIL); CargoID mail = GetCargoIDByLabel(CT_MAIL);
if (IsValidCargoID(mail)) { if (IsValidCargoID(mail)) {
acceptance[mail] += std::max(1U, level / 2); acceptance[mail] += std::max(1U, level / 2);
SetBit(*always_accepted, mail); SetBit(always_accepted, mail);
} }
} }

@ -949,7 +949,7 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA
} }
SetDlgItemText(wnd, 10, crash_desc_buf); SetDlgItemText(wnd, 10, crash_desc_buf);
SetDlgItemText(wnd, 11, convert_to_fs(dos_nl, crash_msgW, crash_msgW_length)); SetDlgItemText(wnd, 11, convert_to_fs(dos_nl, {crash_msgW, crash_msgW_length}));
SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE); SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE);
SetWndSize(wnd, -1); SetWndSize(wnd, -1);
} return TRUE; } return TRUE;

@ -68,7 +68,7 @@ static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXT
if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1; if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1;
char font_name[MAX_PATH]; char font_name[MAX_PATH];
convert_from_fs((const wchar_t *)logfont->elfFullName, font_name, lengthof(font_name)); convert_from_fs(logfont->elfFullName, font_name);
info->callback->SetFontNames(info->settings, font_name, &logfont->elfLogFont); info->callback->SetFontNames(info->settings, font_name, &logfont->elfLogFont);
if (info->callback->FindMissingGlyphs()) return 1; if (info->callback->FindMissingGlyphs()) return 1;
@ -290,12 +290,12 @@ static bool TryLoadFontFromFile(const std::string &font_name, LOGFONT &logfont)
/* See if this is an absolute path. */ /* See if this is an absolute path. */
if (FileExists(font_name)) { if (FileExists(font_name)) {
convert_to_fs(font_name, fontPath, lengthof(fontPath)); convert_to_fs(font_name, fontPath);
} else { } else {
/* Scan the search-paths to see if it can be found. */ /* Scan the search-paths to see if it can be found. */
std::string full_font = FioFindFullPath(BASE_DIR, font_name); std::string full_font = FioFindFullPath(BASE_DIR, font_name);
if (!full_font.empty()) { if (!full_font.empty()) {
convert_to_fs(font_name, fontPath, lengthof(fontPath)); convert_to_fs(font_name, fontPath);
} }
} }
@ -376,7 +376,7 @@ void LoadWin32Font(FontSize fs)
if (logfont.lfFaceName[0] == 0) { if (logfont.lfFaceName[0] == 0) {
logfont.lfWeight = strcasestr(font_name, " bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts. logfont.lfWeight = strcasestr(font_name, " bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts.
convert_to_fs(font_name, logfont.lfFaceName, lengthof(logfont.lfFaceName)); convert_to_fs(font_name, logfont.lfFaceName);
} }
LoadWin32Font(fs, logfont, GetFontCacheFontSize(fs), font_name); LoadWin32Font(fs, logfont, GetFontCacheFontSize(fs), font_name);

@ -148,7 +148,7 @@ static HFONT HFontFromFont(Font *font)
logfont.lfHeight = font->fc->GetHeight(); logfont.lfHeight = font->fc->GetHeight();
logfont.lfWeight = FW_NORMAL; logfont.lfWeight = FW_NORMAL;
logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfCharSet = DEFAULT_CHARSET;
convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName, lengthof(logfont.lfFaceName)); convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName);
return CreateFontIndirect(&logfont); return CreateFontIndirect(&logfont);
} }

@ -331,7 +331,7 @@ static INT_PTR CALLBACK HelpDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARAM
* buffer in OTTD2FS might not be large enough (512 chars). */ * buffer in OTTD2FS might not be large enough (512 chars). */
const size_t help_msg_buf_size = ((q - help_msg.get()) * 3) / 2; const size_t help_msg_buf_size = ((q - help_msg.get()) * 3) / 2;
auto help_msg_buf = std::make_unique<wchar_t[]>(help_msg_buf_size); auto help_msg_buf = std::make_unique<wchar_t[]>(help_msg_buf_size);
SetDlgItemText(wnd, 11, convert_to_fs(help_msg.get(), help_msg_buf.get(), help_msg_buf_size)); SetDlgItemText(wnd, 11, convert_to_fs(help_msg.get(), {help_msg_buf.get(), help_msg_buf_size}));
SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE); SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE);
} return TRUE; } return TRUE;
@ -365,7 +365,7 @@ void ShowInfoI(const char *str)
/* We need to put the text in a separate buffer because the default /* We need to put the text in a separate buffer because the default
* buffer in OTTD2FS might not be large enough (512 chars). */ * buffer in OTTD2FS might not be large enough (512 chars). */
wchar_t help_msg_buf[8192]; wchar_t help_msg_buf[8192];
MessageBox(GetActiveWindow(), convert_to_fs(str, help_msg_buf, lengthof(help_msg_buf)), L"OpenTTD", MB_ICONINFORMATION | MB_OK); MessageBox(GetActiveWindow(), convert_to_fs(str, help_msg_buf), L"OpenTTD", MB_ICONINFORMATION | MB_OK);
} }
MyShowCursor(old); MyShowCursor(old);
} }
@ -375,7 +375,7 @@ char *getcwd(char *buf, size_t size)
{ {
wchar_t path[MAX_PATH]; wchar_t path[MAX_PATH];
GetCurrentDirectory(MAX_PATH - 1, path); GetCurrentDirectory(MAX_PATH - 1, path);
convert_from_fs(path, buf, size); convert_from_fs(path, {buf, size});
return buf; return buf;
} }
@ -424,7 +424,7 @@ void DetermineBasePaths(const char *exe)
} else { } else {
/* Use the folder of the config file as working directory. */ /* Use the folder of the config file as working directory. */
wchar_t config_dir[MAX_PATH]; wchar_t config_dir[MAX_PATH];
wcsncpy(path, convert_to_fs(_config_file, path, lengthof(path)), lengthof(path)); convert_to_fs(_config_file, path);
if (!GetFullPathName(path, static_cast<DWORD>(std::size(config_dir)), config_dir, nullptr)) { if (!GetFullPathName(path, static_cast<DWORD>(std::size(config_dir)), config_dir, nullptr)) {
DEBUG(misc, 0, "GetFullPathName failed (%lu)\n", GetLastError()); DEBUG(misc, 0, "GetFullPathName failed (%lu)\n", GetLastError());
_searchpaths[SP_WORKING_DIR].clear(); _searchpaths[SP_WORKING_DIR].clear();
@ -442,7 +442,7 @@ void DetermineBasePaths(const char *exe)
_searchpaths[SP_BINARY_DIR].clear(); _searchpaths[SP_BINARY_DIR].clear();
} else { } else {
wchar_t exec_dir[MAX_PATH]; wchar_t exec_dir[MAX_PATH];
wcsncpy(path, convert_to_fs(exe, path, std::size(path)), lengthof(path)); convert_to_fs(exe, path);
if (!GetFullPathName(path, static_cast<DWORD>(std::size(exec_dir)), exec_dir, nullptr)) { if (!GetFullPathName(path, static_cast<DWORD>(std::size(exec_dir)), exec_dir, nullptr)) {
DEBUG(misc, 0, "GetFullPathName failed (%lu)\n", GetLastError()); DEBUG(misc, 0, "GetFullPathName failed (%lu)\n", GetLastError());
_searchpaths[SP_BINARY_DIR].clear(); _searchpaths[SP_BINARY_DIR].clear();
@ -517,37 +517,33 @@ std::wstring OTTD2FS(const std::string &name)
/** /**
* Convert to OpenTTD's encoding from that of the environment in * Convert to OpenTTD's encoding from that of the environment in
* UNICODE. OpenTTD encoding is UTF8, local is wide. * UNICODE. OpenTTD encoding is UTF8, local is wide.
* @param name pointer to a valid string that will be converted * @param src wide string that will be converted
* @param utf8_buf pointer to a valid buffer that will receive the converted string * @param dst_buf span of valid char buffer that will receive the converted string
* @param buflen length in characters of the receiving buffer * @return pointer to dst_buf. If conversion fails the string is of zero-length
* @return pointer to utf8_buf. If conversion fails the string is of zero-length
*/ */
char *convert_from_fs(const wchar_t *name, char *utf8_buf, size_t buflen) char *convert_from_fs(const std::wstring_view src, std::span<char> dst_buf)
{ {
/* Convert UTF-16 string to UTF-8. */ /* Convert UTF-16 string to UTF-8. */
int len = WideCharToMultiByte(CP_UTF8, 0, name, -1, utf8_buf, (int)buflen, nullptr, nullptr); int len = WideCharToMultiByte(CP_UTF8, 0, src.data(), static_cast<int>(src.size()), dst_buf.data(), static_cast<int>(dst_buf.size() - 1U), nullptr, nullptr);
if (len == 0) utf8_buf[0] = '\0'; dst_buf[len] = '\0';
return utf8_buf; return dst_buf.data();
} }
/** /**
* Convert from OpenTTD's encoding to that of the environment in * Convert from OpenTTD's encoding to that of the environment in
* UNICODE. OpenTTD encoding is UTF8, local is wide. * UNICODE. OpenTTD encoding is UTF8, local is wide.
* @param name pointer to a valid string that will be converted * @param src string that will be converted
* @param system_buf pointer to a valid wide-char buffer that will receive the * @param dst_buf span of valid wide-char buffer that will receive the converted string
* converted string * @return pointer to dst_buf. If conversion fails the string is of zero-length
* @param buflen length in wide characters of the receiving buffer
* @param console_cp convert to the console encoding instead of the normal system encoding.
* @return pointer to system_buf. If conversion fails the string is of zero-length
*/ */
wchar_t *convert_to_fs(const std::string_view name, wchar_t *system_buf, size_t buflen) wchar_t *convert_to_fs(const std::string_view src, std::span<wchar_t> dst_buf)
{ {
int len = MultiByteToWideChar(CP_UTF8, 0, name.data(), (int)name.size(), system_buf, (int)buflen); int len = MultiByteToWideChar(CP_UTF8, 0, src.data(), static_cast<int>(src.size()), dst_buf.data(), static_cast<int>(dst_buf.size() - 1U));
system_buf[len] = '\0'; dst_buf[len] = '\0';
return system_buf; return dst_buf.data();
} }
/** Determine the current user's locale. */ /** Determine the current user's locale. */
@ -624,8 +620,8 @@ int OTTDStringCompare(std::string_view s1, std::string_view s2)
} }
wchar_t s1_buf[512], s2_buf[512]; wchar_t s1_buf[512], s2_buf[512];
convert_to_fs(s1, s1_buf, lengthof(s1_buf)); convert_to_fs(s1, s1_buf);
convert_to_fs(s2, s2_buf, lengthof(s2_buf)); convert_to_fs(s2, s2_buf);
return CompareString(MAKELCID(_current_language->winlangid, SORT_DEFAULT), NORM_IGNORECASE, s1_buf, -1, s2_buf, -1); return CompareString(MAKELCID(_current_language->winlangid, SORT_DEFAULT), NORM_IGNORECASE, s1_buf, -1, s2_buf, -1);
} }

@ -12,8 +12,8 @@
bool MyShowCursor(bool show, bool toggle = false); bool MyShowCursor(bool show, bool toggle = false);
char *convert_from_fs(const wchar_t *name, char *utf8_buf, size_t buflen); char *convert_from_fs(const std::wstring_view src, std::span<char> dst_buf);
wchar_t *convert_to_fs(const std::string_view name, wchar_t *utf16_buf, size_t buflen); wchar_t *convert_to_fs(const std::string_view src, std::span<wchar_t> dst_buf);
void Win32SetCurrentLocaleName(const char *iso_code); void Win32SetCurrentLocaleName(const char *iso_code);
int OTTDStringCompare(std::string_view s1, std::string_view s2); int OTTDStringCompare(std::string_view s1, std::string_view s2);

@ -560,7 +560,7 @@ public:
/* set origin (tile, trackdir) */ /* set origin (tile, trackdir) */
TileIndex src_tile = v->tile; TileIndex src_tile = v->tile;
Trackdir src_td = v->GetVehicleTrackdir(); Trackdir src_td = v->GetVehicleTrackdir();
if (!HasTrackdir(GetTrackdirBitsForRoad(src_tile, this->IsTram() ? RTT_TRAM : RTT_ROAD), src_td)) { if (!HasTrackdir(GetTrackdirBitsForRoad(src_tile, Yapf().IsTram() ? RTT_TRAM : RTT_ROAD), src_td)) {
/* sometimes the roadveh is not on the road (it resides on non-existing track) /* sometimes the roadveh is not on the road (it resides on non-existing track)
* how should we handle that situation? */ * how should we handle that situation? */
return false; return false;

@ -600,9 +600,9 @@ static Vehicle *EnumCheckRoadVehCrashTrain(Vehicle *v, void *data)
uint RoadVehicle::Crash(bool flooded) uint RoadVehicle::Crash(bool flooded)
{ {
uint pass = this->GroundVehicleBase::Crash(flooded); uint victims = this->GroundVehicleBase::Crash(flooded);
if (this->IsFrontEngine()) { if (this->IsFrontEngine()) {
pass += 1; // driver victims += 1; // driver
/* If we're in a drive through road stop we ought to leave it */ /* If we're in a drive through road stop we ought to leave it */
if (IsInsideMM(this->state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END)) { if (IsInsideMM(this->state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END)) {
@ -611,18 +611,18 @@ uint RoadVehicle::Crash(bool flooded)
} }
} }
this->crashed_ctr = flooded ? 2000 : 1; // max 2220, disappear pretty fast when flooded this->crashed_ctr = flooded ? 2000 : 1; // max 2220, disappear pretty fast when flooded
return pass; return victims;
} }
static void RoadVehCrash(RoadVehicle *v) static void RoadVehCrash(RoadVehicle *v)
{ {
uint pass = v->Crash(); uint victims = v->Crash();
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING)); AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING, victims));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING)); Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING, victims));
SetDParam(0, pass); SetDParam(0, victims);
StringID newsitem = (pass == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH; StringID newsitem = (victims == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH;
NewsType newstype = NT_ACCIDENT; NewsType newstype = NT_ACCIDENT;
if (v->owner != _local_company) { if (v->owner != _local_company) {

@ -17,6 +17,9 @@
* *
* This version is not yet released. The following changes are not set in stone yet. * This version is not yet released. The following changes are not set in stone yet.
* *
* API additions:
* \li AIEventVehicleCrashed::GetVictims
*
* \b 14.0 * \b 14.0
* *
* API additions: * API additions:

@ -17,6 +17,9 @@
* *
* This version is not yet released. The following changes are not set in stone yet. * This version is not yet released. The following changes are not set in stone yet.
* *
* API additions:
* \li GSEventVehicleCrashed::GetVictims
*
* \b 14.0 * \b 14.0
* *
* API additions: * API additions:

@ -39,12 +39,14 @@ public:
* @param vehicle The vehicle that crashed. * @param vehicle The vehicle that crashed.
* @param crash_site Where the vehicle crashed. * @param crash_site Where the vehicle crashed.
* @param crash_reason The reason why the vehicle crashed. * @param crash_reason The reason why the vehicle crashed.
* @param victims The number of victims caused by the crash.
*/ */
ScriptEventVehicleCrashed(VehicleID vehicle, TileIndex crash_site, CrashReason crash_reason) : ScriptEventVehicleCrashed(VehicleID vehicle, TileIndex crash_site, CrashReason crash_reason, uint victims) :
ScriptEvent(ET_VEHICLE_CRASHED), ScriptEvent(ET_VEHICLE_CRASHED),
crash_site(crash_site), crash_site(crash_site),
vehicle(vehicle), vehicle(vehicle),
crash_reason(crash_reason) crash_reason(crash_reason),
victims(victims)
{} {}
#endif /* DOXYGEN_API */ #endif /* DOXYGEN_API */
@ -73,10 +75,17 @@ public:
*/ */
CrashReason GetCrashReason() { return this->crash_reason; } CrashReason GetCrashReason() { return this->crash_reason; }
/**
* Get the number of victims
* @return The number of victims
*/
SQInteger GetVictims() { return this->victims; }
private: private:
TileIndex crash_site; ///< The location of the crash. TileIndex crash_site; ///< The location of the crash.
VehicleID vehicle; ///< The crashed vehicle. VehicleID vehicle; ///< The crashed vehicle.
CrashReason crash_reason; ///< The reason for crashing. CrashReason crash_reason; ///< The reason for crashing.
uint victims; ///< The number of victims.
}; };
/** /**

@ -372,11 +372,6 @@ struct ScriptSettingsWindow : public Window {
{ {
if (widget != WID_SCRS_BACKGROUND) return; if (widget != WID_SCRS_BACKGROUND) return;
ScriptConfig *config = this->script_config;
VisibleSettingsList::const_iterator it = this->visible_settings.begin();
int i = 0;
for (; !this->vscroll->IsVisible(i); i++) it++;
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
bool rtl = _current_text_dir == TD_RTL; bool rtl = _current_text_dir == TD_RTL;
Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl);
@ -385,9 +380,11 @@ struct ScriptSettingsWindow : public Window {
int y = r.top; int y = r.top;
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2; int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2;
for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) {
const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings);
for (auto it = first; it != last; ++it) {
const ScriptConfigItem &config_item = **it; const ScriptConfigItem &config_item = **it;
int current_value = config->GetSetting((config_item).name); int current_value = this->script_config->GetSetting(config_item.name);
bool editable = this->IsEditableItem(config_item); bool editable = this->IsEditableItem(config_item);
StringID str; StringID str;
@ -406,6 +403,7 @@ struct ScriptSettingsWindow : public Window {
DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable);
SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
} else { } else {
int i = static_cast<int>(std::distance(std::begin(this->visible_settings), it));
if (config_item.complete_labels) { if (config_item.complete_labels) {
DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
} else { } else {

@ -2179,9 +2179,11 @@ static void ParseCompanyPasswordStorageSecret(const std::string &value)
static void UpdateClientConfigValues() static void UpdateClientConfigValues()
{ {
NetworkServerUpdateGameInfo(); NetworkServerUpdateGameInfo();
InvalidateWindowData(WC_CLIENT_LIST, 0);
if (_network_server) { if (_network_server) {
NetworkServerSendConfigUpdate(); NetworkServerSendConfigUpdate();
SetWindowClassesDirty(WC_CLIENT_LIST);
} }
} }

@ -84,14 +84,9 @@ void MoveWaypointsToBaseStations()
/* As of version 17, we recalculate the custom graphic ID of waypoints /* As of version 17, we recalculate the custom graphic ID of waypoints
* from the GRF ID / station index. */ * from the GRF ID / station index. */
for (OldWaypoint &wp : _old_waypoints) { for (OldWaypoint &wp : _old_waypoints) {
StationClass *stclass = StationClass::Get(STAT_CLASS_WAYP); const auto specs = StationClass::Get(STAT_CLASS_WAYP)->Specs();
for (uint i = 0; i < stclass->GetSpecCount(); i++) { auto found = std::find_if(std::begin(specs), std::end(specs), [&wp](const StationSpec *spec) { return spec != nullptr && spec->grf_prop.grffile->grfid == wp.grfid && spec->grf_prop.local_id == wp.localidx; });
const StationSpec *statspec = stclass->GetSpec(i); if (found != std::end(specs)) wp.spec = *found;
if (statspec != nullptr && statspec->grf_prop.grffile->grfid == wp.grfid && statspec->grf_prop.local_id == wp.localidx) {
wp.spec = statspec;
break;
}
}
} }
} }

@ -162,11 +162,11 @@ void FileStringReader::HandlePragma(char *str)
if (!memcmp(str, "id ", 3)) { if (!memcmp(str, "id ", 3)) {
this->data.next_string_id = std::strtoul(str + 3, nullptr, 0); this->data.next_string_id = std::strtoul(str + 3, nullptr, 0);
} else if (!memcmp(str, "name ", 5)) { } else if (!memcmp(str, "name ", 5)) {
strecpy(_lang.name, str + 5, lastof(_lang.name)); strecpy(_lang.name, str + 5);
} else if (!memcmp(str, "ownname ", 8)) { } else if (!memcmp(str, "ownname ", 8)) {
strecpy(_lang.own_name, str + 8, lastof(_lang.own_name)); strecpy(_lang.own_name, str + 8);
} else if (!memcmp(str, "isocode ", 8)) { } else if (!memcmp(str, "isocode ", 8)) {
strecpy(_lang.isocode, str + 8, lastof(_lang.isocode)); strecpy(_lang.isocode, str + 8);
} else if (!memcmp(str, "textdir ", 8)) { } else if (!memcmp(str, "textdir ", 8)) {
if (!memcmp(str + 8, "ltr", 3)) { if (!memcmp(str + 8, "ltr", 3)) {
_lang.text_dir = TD_LTR; _lang.text_dir = TD_LTR;
@ -177,13 +177,13 @@ void FileStringReader::HandlePragma(char *str)
} }
} else if (!memcmp(str, "digitsep ", 9)) { } else if (!memcmp(str, "digitsep ", 9)) {
str += 9; str += 9;
strecpy(_lang.digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator)); strecpy(_lang.digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str);
} else if (!memcmp(str, "digitsepcur ", 12)) { } else if (!memcmp(str, "digitsepcur ", 12)) {
str += 12; str += 12;
strecpy(_lang.digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator_currency)); strecpy(_lang.digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str);
} else if (!memcmp(str, "decimalsep ", 11)) { } else if (!memcmp(str, "decimalsep ", 11)) {
str += 11; str += 11;
strecpy(_lang.digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_decimal_separator)); strecpy(_lang.digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str);
} else if (!memcmp(str, "winlangid ", 10)) { } else if (!memcmp(str, "winlangid ", 10)) {
const char *buf = str + 10; const char *buf = str + 10;
long langid = std::strtol(buf, nullptr, 16); long langid = std::strtol(buf, nullptr, 16);
@ -207,7 +207,7 @@ void FileStringReader::HandlePragma(char *str)
if (s == nullptr) break; if (s == nullptr) break;
if (_lang.num_genders >= MAX_NUM_GENDERS) error("Too many genders, max %d", MAX_NUM_GENDERS); if (_lang.num_genders >= MAX_NUM_GENDERS) error("Too many genders, max %d", MAX_NUM_GENDERS);
strecpy(_lang.genders[_lang.num_genders], s, lastof(_lang.genders[_lang.num_genders])); strecpy(_lang.genders[_lang.num_genders], s);
_lang.num_genders++; _lang.num_genders++;
} }
} else if (!memcmp(str, "case ", 5)) { } else if (!memcmp(str, "case ", 5)) {
@ -219,7 +219,7 @@ void FileStringReader::HandlePragma(char *str)
if (s == nullptr) break; if (s == nullptr) break;
if (_lang.num_cases >= MAX_NUM_CASES) error("Too many cases, max %d", MAX_NUM_CASES); if (_lang.num_cases >= MAX_NUM_CASES) error("Too many cases, max %d", MAX_NUM_CASES);
strecpy(_lang.cases[_lang.num_cases], s, lastof(_lang.cases[_lang.num_cases])); strecpy(_lang.cases[_lang.num_cases], s);
_lang.num_cases++; _lang.num_cases++;
} }
} else if (!memcmp(str, "override ", 9)) { } else if (!memcmp(str, "override ", 9)) {
@ -372,8 +372,8 @@ struct HeaderFileWriter : HeaderWriter, FileWriter {
{ {
/* Find the plural form with the most amount of cases. */ /* Find the plural form with the most amount of cases. */
int max_plural_forms = 0; int max_plural_forms = 0;
for (uint i = 0; i < lengthof(_plural_forms); i++) { for (const auto &pf : _plural_forms) {
max_plural_forms = std::max(max_plural_forms, _plural_forms[i].plural_count); max_plural_forms = std::max(max_plural_forms, pf.plural_count);
} }
fprintf(this->fh, fprintf(this->fh,
@ -383,7 +383,7 @@ struct HeaderFileWriter : HeaderWriter, FileWriter {
"static const uint LANGUAGE_MAX_PLURAL_FORMS = %d;\n" "static const uint LANGUAGE_MAX_PLURAL_FORMS = %d;\n"
"static const uint LANGUAGE_TOTAL_STRINGS = %u;\n" "static const uint LANGUAGE_TOTAL_STRINGS = %u;\n"
"\n", "\n",
(uint)data.Version(), (uint)lengthof(_plural_forms), max_plural_forms, total_strings (uint)data.Version(), (uint)std::size(_plural_forms), max_plural_forms, total_strings
); );
fprintf(this->fh, "#endif /* TABLE_STRINGS_H */\n"); fprintf(this->fh, "#endif /* TABLE_STRINGS_H */\n");

@ -791,9 +791,9 @@ void StringReader::ParseFile()
/* For each new file we parse, reset the genders, and language codes. */ /* For each new file we parse, reset the genders, and language codes. */
MemSetT(&_lang, 0); MemSetT(&_lang, 0);
strecpy(_lang.digit_group_separator, ",", lastof(_lang.digit_group_separator)); strecpy(_lang.digit_group_separator, ",");
strecpy(_lang.digit_group_separator_currency, ",", lastof(_lang.digit_group_separator_currency)); strecpy(_lang.digit_group_separator_currency, ",");
strecpy(_lang.digit_decimal_separator, ".", lastof(_lang.digit_decimal_separator)); strecpy(_lang.digit_decimal_separator, ".");
_cur_line = 1; _cur_line = 1;
while (this->ReadLine(buf, lastof(buf)) != nullptr) { while (this->ReadLine(buf, lastof(buf)) != nullptr) {

@ -128,6 +128,33 @@ char *strecpy(char *dst, const char *src, const char *last, bool quiet_mode)
return dst; return dst;
} }
/**
* Copies characters from one buffer to another.
*
* Copies the source string to the destination buffer with respect of the
* terminating null-character and the size of the destination buffer.
*
* @note usage: strecpy(dst, src);
*
* @param dst The destination buffer
* @param src The buffer containing the string to copy
*/
void strecpy(std::span<char> dst, std::string_view src)
{
/* Ensure source string fits with NUL terminator; dst must be at least 1 character longer than src. */
if (std::empty(dst) || std::size(src) >= std::size(dst) - 1U) {
#if defined(STRGEN) || defined(SETTINGSGEN)
error("String too long for destination buffer");
#else /* STRGEN || SETTINGSGEN */
DEBUG(misc, 0, "String too long for destination buffer");
src = src.substr(0, std::size(dst) - 1U);
#endif /* STRGEN || SETTINGSGEN */
}
auto it = std::copy(std::begin(src), std::end(src), std::begin(dst));
*it = '\0';
}
/** /**
* Create a duplicate of the given string. * Create a duplicate of the given string.
* @param s The string to duplicate. * @param s The string to duplicate.

@ -35,6 +35,8 @@ char *strecat(char *dst, const char *src, const char *last) NOACCESS(3);
char *strecpy(char *dst, const char *src, const char *last, bool quiet_mode = false) NOACCESS(3); char *strecpy(char *dst, const char *src, const char *last, bool quiet_mode = false) NOACCESS(3);
char *stredup(const char *src, const char *last = nullptr) NOACCESS(2); char *stredup(const char *src, const char *last = nullptr) NOACCESS(2);
void strecpy(std::span<char> dst, std::string_view src);
int CDECL seprintf(char *str, const char *last, const char *format, ...) WARN_FORMAT(3, 4) NOACCESS(2); int CDECL seprintf(char *str, const char *last, const char *format, ...) WARN_FORMAT(3, 4) NOACCESS(2);
int CDECL vseprintf(char *str, const char *last, const char *format, va_list ap) WARN_FORMAT(3, 0) NOACCESS(2); int CDECL vseprintf(char *str, const char *last, const char *format, va_list ap) WARN_FORMAT(3, 0) NOACCESS(2);

@ -1922,7 +1922,7 @@ class NIHAirport : public NIHelper {
uint Resolve(uint index, uint var, uint param, GetVariableExtra &extra) const override uint Resolve(uint index, uint var, uint param, GetVariableExtra &extra) const override
{ {
Station *st = Station::Get(index); Station *st = Station::Get(index);
AirportResolverObject ro(st->airport.tile, st, st->airport.type, st->airport.layout); AirportResolverObject ro(st->airport.tile, st, AirportSpec::Get(st->airport.type), st->airport.layout);
return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, extra); return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, extra);
} }

@ -103,7 +103,7 @@ typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags);
* @param acceptance Storage destination of the cargo acceptance in 1/8 * @param acceptance Storage destination of the cargo acceptance in 1/8
* @param always_accepted Bitmask of always accepted cargo types * @param always_accepted Bitmask of always accepted cargo types
*/ */
typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted); typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted);
/** /**
* Tile callback function signature for obtaining a tile description * Tile callback function signature for obtaining a tile description
@ -204,7 +204,7 @@ inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, CargoTypes
AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc; AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc;
if (proc == nullptr) return; if (proc == nullptr) return;
CargoTypes dummy = 0; // use dummy bitmask so there don't need to be several 'always_accepted != nullptr' checks CargoTypes dummy = 0; // use dummy bitmask so there don't need to be several 'always_accepted != nullptr' checks
proc(tile, acceptance, always_accepted == nullptr ? &dummy : always_accepted); proc(tile, acceptance, always_accepted == nullptr ? dummy : *always_accepted);
} }
inline void AddProducedCargo(TileIndex tile, CargoArray &produced) inline void AddProducedCargo(TileIndex tile, CargoArray &produced)

@ -1577,7 +1577,7 @@ public:
uint spacer_i = 0; uint spacer_i = 0;
uint button_i = 0; uint button_i = 0;
/* Index into the arrangement indices. The macro lastof cannot be used here! */ /* Index into the arrangement indices. */
const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement; const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement;
for (uint i = 0; i < arrangable_count; i++) { for (uint i = 0; i < arrangable_count; i++) {
uint slot = lookup[*slotp]; uint slot = lookup[*slotp];

@ -837,14 +837,21 @@ static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced)
AddProducedHouseCargo(GetHouseType(tile), tile, produced); AddProducedHouseCargo(GetHouseType(tile), tile, produced);
} }
static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted) /**
* Fill cargo acceptance array and always_accepted mask, if cargo ID is valid.
* @param cargo Cargo type to add.
* @param amount Amount of cargo to add.
* @param[out] acceptance Output array containing amount of cargo accepted.
* @param[out] always_accepted Output mask of accepted cargo types.
*/
static void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes &always_accepted)
{ {
if (cargo == INVALID_CARGO || amount == 0) return; if (cargo == INVALID_CARGO || amount == 0) return;
acceptance[cargo] += amount; acceptance[cargo] += amount;
SetBit(*always_accepted, cargo); SetBit(always_accepted, cargo);
} }
static void AddAcceptedHouseCargo(HouseID house_id, TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) static void AddAcceptedHouseCargo(HouseID house_id, TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
{ {
const HouseSpec *hs = HouseSpec::Get(house_id); const HouseSpec *hs = HouseSpec::Get(house_id);
Town *t = (tile == INVALID_TILE) ? nullptr : Town::GetByTile(tile); Town *t = (tile == INVALID_TILE) ? nullptr : Town::GetByTile(tile);
@ -888,7 +895,7 @@ static void AddAcceptedHouseCargo(HouseID house_id, TileIndex tile, CargoArray &
} }
} }
static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
{ {
AddAcceptedHouseCargo(GetHouseType(tile), tile, acceptance, always_accepted); AddAcceptedHouseCargo(GetHouseType(tile), tile, acceptance, always_accepted);
} }

@ -5041,9 +5041,9 @@ void Train::ReserveTrackUnderConsist() const
*/ */
uint Train::Crash(bool flooded) uint Train::Crash(bool flooded)
{ {
uint pass = 0; uint victims = 0;
if (this->IsFrontEngine()) { if (this->IsFrontEngine()) {
pass += 2; // driver victims += 2; // driver
/* Remove the reserved path in front of the train if it is not stuck. /* Remove the reserved path in front of the train if it is not stuck.
* Also clear all reserved tracks the train is currently on. */ * Also clear all reserved tracks the train is currently on. */
@ -5063,10 +5063,10 @@ uint Train::Crash(bool flooded)
RegisterGameEvents(GEF_TRAIN_CRASH); RegisterGameEvents(GEF_TRAIN_CRASH);
pass += this->GroundVehicleBase::Crash(flooded); victims += this->GroundVehicleBase::Crash(flooded);
this->crash_anim_pos = flooded ? 4000 : 1; // max 4440, disappear pretty fast when flooded this->crash_anim_pos = flooded ? 4000 : 1; // max 4440, disappear pretty fast when flooded
return pass; return victims;
} }
/** /**
@ -5077,20 +5077,20 @@ uint Train::Crash(bool flooded)
*/ */
static uint TrainCrashed(Train *v) static uint TrainCrashed(Train *v)
{ {
uint num = 0; uint victims = 0;
/* do not crash train twice */ /* do not crash train twice */
if (!(v->vehstatus & VS_CRASHED)) { if (!(v->vehstatus & VS_CRASHED)) {
num = v->Crash(); victims = v->Crash();
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN)); AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN, victims));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN)); Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN, victims));
} }
/* Try to re-reserve track under already crashed train too. /* Try to re-reserve track under already crashed train too.
* Crash() clears the reservation! */ * Crash() clears the reservation! */
v->ReserveTrackUnderConsist(); v->ReserveTrackUnderConsist();
return num; return victims;
} }
/** Temporary data storage for testing collisions. */ /** Temporary data storage for testing collisions. */

@ -362,7 +362,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam)
if (len > 0) { if (len > 0) {
static char utf8_buf[1024]; static char utf8_buf[1024];
convert_from_fs(str, utf8_buf, lengthof(utf8_buf)); convert_from_fs(str, utf8_buf);
/* Convert caret position from bytes in the input string to a position in the UTF-8 encoded string. */ /* Convert caret position from bytes in the input string to a position in the UTF-8 encoded string. */
LONG caret_bytes = ImmGetCompositionString(hIMC, GCS_CURSORPOS, nullptr, 0); LONG caret_bytes = ImmGetCompositionString(hIMC, GCS_CURSORPOS, nullptr, 0);

@ -1063,11 +1063,11 @@ static void GetTileDesc_Water(TileIndex tile, TileDesc *td)
*/ */
static void FloodVehicle(Vehicle *v) static void FloodVehicle(Vehicle *v)
{ {
uint pass = v->Crash(true); uint victims = v->Crash(true);
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED)); AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED, victims));
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED)); Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED, victims));
SetDParam(0, pass); SetDParam(0, victims);
AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->tile); AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->tile);
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE); CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v); if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);

Loading…
Cancel
Save