From 36e4bd4023fd8fc2f73a7618708a723d11095786 Mon Sep 17 00:00:00 2001 From: dP Date: Fri, 3 May 2019 02:50:24 +0300 Subject: [PATCH 01/23] Fix: Make GSGoal.QuestionClient work correctly at least for clients with ID < 2**16 --- src/goal.cpp | 27 +++++++++++++++------------ src/script/api/script_goal.cpp | 9 +++++---- src/script/api/script_goal.hpp | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/goal.cpp b/src/goal.cpp index 30f640b4ce..407b3a398b 100644 --- a/src/goal.cpp +++ b/src/goal.cpp @@ -236,10 +236,11 @@ CommandCost CmdSetGoalCompleted(TileIndex tile, DoCommandFlag flags, uint32 p1, * @param flags type of operation * @param p1 various bitstuffed elements * - p1 = (bit 0 - 15) - Unique ID to use for this question. - * - p1 = (bit 16 - 23) - Company or client for which this question is. - * - p1 = (bit 24 - 25) - Question type. - * - p1 = (bit 31) - Question target: 0 - company, 1 - client. - * @param p2 Buttons of the question. + * - p1 = (bit 16 - 31) - Company or client for which this question is. + * @param p2 various bitstuffed elements + * - p2 = (bit 0 - 17) - Buttons of the question. + * - p2 = (bit 29 - 30) - Question type. + * - p2 = (bit 31) - Question target: 0 - company, 1 - client. * @param text Text of the question. * @return the cost of this operation or an error */ @@ -247,29 +248,31 @@ CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint { uint16 uniqueid = (GoalType)GB(p1, 0, 16); CompanyID company = (CompanyID)GB(p1, 16, 8); - ClientIndex client = (ClientIndex)GB(p1, 16, 8); - byte type = GB(p1, 24, 2); - bool is_client = HasBit(p1, 31); + ClientID client = (ClientID)GB(p1, 16, 16); + + assert_compile(GOAL_QUESTION_BUTTON_COUNT < 29); + uint32 button_mask = GB(p2, 0, GOAL_QUESTION_BUTTON_COUNT); + byte type = GB(p2, 29, 2); + bool is_client = HasBit(p2, 31); if (_current_company != OWNER_DEITY) return CMD_ERROR; if (StrEmpty(text)) return CMD_ERROR; if (is_client) { - if (!NetworkClientInfo::IsValidID(client)) return CMD_ERROR; + if (NetworkClientInfo::GetByClientID(client) == nullptr) return CMD_ERROR; } else { if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR; } - if (CountBits(p2) < 1 || CountBits(p2) > 3) return CMD_ERROR; - if (p2 >= (1 << GOAL_QUESTION_BUTTON_COUNT)) return CMD_ERROR; + if (CountBits(button_mask) < 1 || CountBits(button_mask) > 3) return CMD_ERROR; if (type >= GOAL_QUESTION_TYPE_COUNT) return CMD_ERROR; if (flags & DC_EXEC) { if (is_client) { - if (NetworkClientInfo::Get(client)->client_id != _network_own_client_id) return CommandCost(); + if (client != _network_own_client_id) return CommandCost(); } else { if (company == INVALID_COMPANY && !Company::IsValidID(_local_company)) return CommandCost(); if (company != INVALID_COMPANY && company != _local_company) return CommandCost(); } - ShowGoalQuestion(uniqueid, type, p2, text); + ShowGoalQuestion(uniqueid, type, button_mask, text); } return CommandCost(); diff --git a/src/script/api/script_goal.cpp b/src/script/api/script_goal.cpp index b5f6ccef25..461911d3c5 100644 --- a/src/script/api/script_goal.cpp +++ b/src/script/api/script_goal.cpp @@ -109,7 +109,7 @@ return g != nullptr && g->completed; } -/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons) +/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint32 target, bool is_client, Text *question, QuestionType type, uint32 buttons) { CCountedPtr counter(question); @@ -121,7 +121,7 @@ EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT)); EnforcePrecondition(false, (int)type < ::GOAL_QUESTION_TYPE_COUNT); - return ScriptObject::DoCommand(0, uniqueid | (target << 16) | (type << 24) | (is_client ? (1 << 31) : 0), buttons, CMD_GOAL_QUESTION, text); + return ScriptObject::DoCommand(0, uniqueid | (target << 16), buttons | (type << 29) | (is_client ? (1 << 31) : 0), CMD_GOAL_QUESTION, text); } /* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons) @@ -137,8 +137,9 @@ { EnforcePrecondition(false, ScriptGame::IsMultiplayer()); EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID); - ClientIndex c = NetworkClientInfo::GetByClientID((::ClientID)client)->index; - return DoQuestion(uniqueid, c, true, question, type, buttons); + /* Can only send 16 bits of client_id before proper fix is implemented */ + EnforcePrecondition(false, client < (1 << 16)); + return DoQuestion(uniqueid, client, true, question, type, buttons); } /* static */ bool ScriptGoal::CloseQuestion(uint16 uniqueid) diff --git a/src/script/api/script_goal.hpp b/src/script/api/script_goal.hpp index b8c0873a21..30f7df1257 100644 --- a/src/script/api/script_goal.hpp +++ b/src/script/api/script_goal.hpp @@ -211,7 +211,7 @@ protected: /** * Does common checks and asks the question. */ - static bool DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons); + static bool DoQuestion(uint16 uniqueid, uint32 target, bool is_client, Text *question, QuestionType type, uint32 buttons); }; #endif /* SCRIPT_GOAL_HPP */ From 24cec63a3d8b9a37c682366372b6894a5eabdac5 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 14 Jul 2019 19:45:46 +0200 Subject: [PATCH 02/23] Update: Translations from eints welsh: 13 changes by kazzie spanish: 35 changes by lpenap --- src/lang/spanish.txt | 35 +++++++++++++++++++++++++++++++++++ src/lang/welsh.txt | 14 +++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 97cac76def..d0c858759f 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -191,6 +191,7 @@ STR_COLOUR_BROWN :Marrón STR_COLOUR_GREY :Gris STR_COLOUR_WHITE :Blanco STR_COLOUR_RANDOM :Aleatorio +STR_COLOUR_DEFAULT :Por Defecto # Units used in OpenTTD STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph @@ -237,6 +238,7 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Seleccio STR_BUTTON_SORT_BY :{BLACK}Ordenar por STR_BUTTON_LOCATION :{BLACK}Sitio STR_BUTTON_RENAME :{BLACK}Renombrar +STR_BUTTON_CATCHMENT :{BLACK}Cobertura STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Cerrar ventana STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título de la ventana - arrastre para moverla @@ -265,6 +267,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Al activ STR_BUTTON_DEFAULT :{BLACK}Por defecto STR_BUTTON_CANCEL :{BLACK}Cancelar STR_BUTTON_OK :{BLACK}OK +STR_WARNING_PASSWORD_SECURITY :{YELLOW}Advertencia: Los administradores del servidor podrían ser capaz de leer cualquier texto introducido aquí. # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :º1234567890'¡\qwertyuiop`+asdfghjklñ´ç @@ -3305,6 +3330,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Trozos de ferrocarril: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Señales STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Trozos de carretera: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Piezas de tranvía: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Casillas de agua: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canales STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estaciones: @@ -3413,6 +3439,7 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nuevos Vehícul ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Nuevos Vehículos de Ferrocarril +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Vehículos de Carretera Nuevos STR_BUY_VEHICLE_SHIP_CAPTION :Nuevos Barcos STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nueva Aeronave ############ range for vehicle availability ends @@ -3449,12 +3476,17 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar barco STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar aeronave +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Vehículo +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Barco +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Aeronave STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Compra el vehículo de ferrocarril resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el vehículo de carretera resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el barco resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar la aeronave resaltada. Shift+Click muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el vehículo resaltado. Shift+Click muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}}Comprar y reformar la aeronave resaltada. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renombrar STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Renombrar @@ -3619,6 +3651,7 @@ STR_REPLACE_ELRAIL_VEHICLES :Vehículos de F STR_REPLACE_MONORAIL_VEHICLES :Vehículos de Monorraíl STR_REPLACE_MAGLEV_VEHICLES :Vehículos Maglev +STR_REPLACE_ROAD_VEHICLES :Vehículos Terrestres STR_REPLACE_REMOVE_WAGON :{BLACK}Retirar vagón: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Hacer que el reemplazo automático mantenga la longitud del tren quitando vagones (empezando por el frente), si el cambio de locomotora produce un tren más largo @@ -4361,6 +4394,7 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}No se pu STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}No se puede retirar tranvía de aquí... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... no hay carretera STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... no hay tranvía +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}No hay un tranvía adecuado # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}No pueden construirse canales aquí... @@ -4413,6 +4447,7 @@ STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}No se pu STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}No se puede borrar grupo... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}No se puede renombrar grupo... STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}No se puede establecer la jerarquía de grupos... +STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... No se permiten bucles en la jerarquía del grupo STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}No se pueden quitar todos los vehículos de este grupo... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}No se puede añadir el vehículo a este grupo... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}No se pueden añadir vehículos compartidos al grupo... diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 6f4b9bf993..75ede9e957 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -674,6 +674,7 @@ STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTB STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Indecs Traciau STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Rhaglen - '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Clirio +STR_PLAYLIST_CHANGE_SET :{BLACK}Newid set STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Clirio'r rhaglen gyfredol (Cyfaddas 1 neu Cyfaddas 2) STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliciwch i ychwanegu trac cerddoriaeth i'r rhaglen gyfredol (Cyfaddas 1 Neu Cyfaddas 2 yn unig) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliciwch i dynnu trac cerddoriaeth o'r rhaglen gyfredol (Cyfaddas 1 Neu Cyfaddas 2 yn unig) @@ -922,6 +923,8 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand De Affrica STR_GAME_OPTIONS_CURRENCY_CUSTOM :Addasedig... STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgia (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iran (IRR) +STR_GAME_OPTIONS_CURRENCY_RUB :Rwbl Rwsaidd Newydd (RUB) +STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Tseina (CNY) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Cerbydau Ffordd @@ -2686,9 +2689,13 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Nifer o fframiau fideo a lunir bob eiliad. +STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Pa mor gyflym mae'r gêm yn rhedeg, o gymharu a'r cyflymder i'w ddisgwyl ar gyfradd efelychu arferol. +STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} frâm yr eiliad ############ Leave those lines in this order!! +STR_FRAMERATE_GL_ECONOMY :{BLACK} Trin cargo: ############ End of leave-in-this-order ############ Leave those lines in this order!! +STR_FRAMETIME_CAPTION_VIDEO :Allbwn fideo ############ End of leave-in-this-order @@ -2943,6 +2950,7 @@ STR_NEWGRF_BUGGY :{WHITE}Mae NewG STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Mae'r wybodaeth llwyth/ailffitio ar gyfer '{1:ENGINE}' yn wahanol i'r rhestr brynu wedi'r adeiladu. Gall hyn beri i awtoadnewyddu/-ddisodli fethu ag ailfitio'n gywir STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' wedi creu lŵp diddiwedd yn y system adalw cynhyrchu STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Dychwelodd adalwad {1:HEX} ganlyniad anhysbys/annilys {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' wedi dychwelyd math cargo annilys yn yr adalwad cynhyrchu yn {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO : @@ -3404,6 +3412,8 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Prynu Ce STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Prynu Llong STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Prynu Awyren +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Prynu ac Ailffitio Cerbyd +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Prynu ac Ailffitio Llong STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Adeiladu'r cerbyd trên sydd wedi'i amlygu. Mae Shift+Clic yn dangos amcangyfrif o'r gost STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Adeiladu'r cerbyd ffordd sydd wedi'i amlygu. Mae Shift+Clic yn dangos amcangyfrif o'r gost @@ -4316,6 +4326,7 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Methu cl STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Methu dileu tramffordd oddi yma... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... nid oes ffordd yno STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... nid oes tramffordd yno +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Dim lôn addas # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Methu adeiladu camlesi yma... @@ -4478,7 +4489,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Effeithiau sain STR_BASESOUNDS_WIN_DESCRIPTION :Effeithiau sain gwreiddiol fersiwn Windows o Transport Tycoon Deluxe. STR_BASESOUNDS_NONE_DESCRIPTION :Pecyn sain heb unrhyw effeithiau sain ynddo. STR_BASEMUSIC_WIN_DESCRIPTION :Cerddoriaeth gwreiddiol fersion Windows o Transport Tycoon Deluxe. -STR_BASEMUSIC_DOS_DESCRIPTION :Cerddoriaeth gwreiddiol Transport Tycoon Deluxe (fersiwn DOS). +STR_BASEMUSIC_DOS_DESCRIPTION :Cerddoriaeth gwreiddiol fersiwn DOS o Transport Tycoon Deluxe. +STR_BASEMUSIC_TTO_DESCRIPTION :Cerddoriaeth gwreiddiol fersion DOS o Transport Tycoon Deluxe (Gwreiddiol/Golygydd Byd). STR_BASEMUSIC_NONE_DESCRIPTION :Pecyn cerddoriaeth heb unrhyw gerddoriaeth ynddo. ##id 0x2000 From 88950d8f2337e680fc7622318a9f18f77e84a341 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 15 Jul 2019 19:45:44 +0200 Subject: [PATCH 03/23] Update: Translations from eints swedish: 49 changes by daishan spanish: 80 changes by lpenap --- src/lang/spanish.txt | 88 ++++++++++++++++++++++++++++++++++++++++---- src/lang/swedish.txt | 49 ++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 8 deletions(-) diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index d0c858759f..f4f5447095 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -239,6 +239,7 @@ STR_BUTTON_SORT_BY :{BLACK}Ordenar STR_BUTTON_LOCATION :{BLACK}Sitio STR_BUTTON_RENAME :{BLACK}Renombrar STR_BUTTON_CATCHMENT :{BLACK}Cobertura +STR_TOOLTIP_CATCHMENT :{BLACK}Mostrar u ocultar área de cobertura STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Cerrar ventana STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título de la ventana - arrastre para moverla @@ -471,6 +472,7 @@ STR_TOOLBAR_SOUND_MUSIC :Sonido/música ############ range for message menu starts STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Último mensaje/noticia STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Historial de mensajes +STR_NEWS_MENU_DELETE_ALL_MESSAGES :Borrar todos los mensajes ############ range ends here ############ range for about menu starts @@ -937,7 +939,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgiano STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraní (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Nuevo Rublo Ruso (RUB) STR_GAME_OPTIONS_CURRENCY_MXN :Peso mexicano (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :Nuevo Dólar de Taiwan (NTD) STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Chino (CNY) +STR_GAME_OPTIONS_CURRENCY_HKD :Dólar de Hong Kong (HKD) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehículos de carretera @@ -1001,8 +1005,10 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Tamaño doble STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaño cuádruple STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Tamaño de letra +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecciona el tamaño de letra a utilizar en la interfaz STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Tamaño doble STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Tamaño cuádruple STR_GAME_OPTIONS_BASE_GRF :{BLACK}Conjunto de gráficos base @@ -1187,6 +1193,8 @@ STR_CONFIG_SETTING_AUTOSLOPE :Permitir modifi STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir modificar el terreno debajo de edificios y raíles sin eliminarlos STR_CONFIG_SETTING_CATCHMENT :Tamaño del área de captación realista: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Permite tener diferentes áreas de captación para distintos tipos de estaciones y aeropuertos +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Las estaciones de la compañía pueden servir industrias con las estaciones neutrales adheridas: {STRING} +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Al habilitarse esta opción, las industrias con estaciones anexas (como las Plataformas Petroleras) pueden ser atentidas por estaciones propiedad de una empresa que se construyan en la cercanía. Al deshabilitarse, estas industrias sólo pueden ser atendidas por sus respectivas estaciones anexas. Cualquier estación cercana propiedad de una empresa, no podrá atenderlas y las estaciones anexas podrán servir a la industria solamente STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir eliminar más propiedades de los municipios: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hace que sea más fácil eliminar infraestructuras y edificios de los municipios STR_CONFIG_SETTING_TRAIN_LENGTH :Longitud máxima de trenes: {STRING} @@ -1203,8 +1211,8 @@ STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Pendiente de la STR_CONFIG_SETTING_PERCENTAGE :{COMMA}% STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Inclinación de cuestas para vehículos de carretera: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Pendiente de las casillas con cuesta para los vehículos de carretera. Los valores altos hacen que sea más difícil subir las colinas -STR_CONFIG_SETTING_FORBID_90_DEG :Prohibir a trenes y barcos realizar giros de 90 grados: {STRING} -STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Los giros de 90 grados ocurren cuando una vía en sentido horizontal está seguida por una vía en sentido vertical, haciendo que el tren gire 90 grados al pasar de una a otra en lugar de los 45 grados habituales en otras combinaciones. Esto también se aplica al radio de giro de los barcos +STR_CONFIG_SETTING_FORBID_90_DEG :Prohibir a trenes realizar giros de 90°: {STRING} +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Los giros de 90 grados ocurren cuando una vía en sentido horizontal está seguida por una vía en sentido vertical, haciendo que el tren gire 90 grados al pasar de una a otra en lugar de los 45 grados habituales en otras combinaciones. STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Permitir unir estaciones no adyacentes: {STRING} STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Permite añadir partes a una estación sin tener que estar en contacto directamente con las partes existentes. Necesita pulsar Ctrl+Click al añadir las nuevas partes STR_CONFIG_SETTING_INFLATION :Inflación: {STRING} @@ -1260,8 +1268,8 @@ STR_CONFIG_SETTING_PLANE_SPEED :Factor de veloc STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Permite fijar la velocidad relativa de las aeronaves en comparación con otros vehículos, para reducir los beneficios del transporte aéreo STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Cantidad de aviones estrellados: {STRING} -STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Fija la probabilidad de que ocurran accidentes aéreos -STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno +STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Fija la probabilidad de que ocurran aleatoriamente accidentes aéreos.{}* Aeronaves grandes siempre corren el riesgo de sufrir un accidente cuando aterrizan en aeropuertos pequeños +STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir construir paradas sobre carreteras de los municipios: {STRING} @@ -1272,6 +1280,8 @@ STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Cambiar STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Mantenimiento de infraestructuras: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Cuando se activa, las infraestructuras tienen costes de mantenimiento. Los costes de la infraestructura aumentan con el tamaño de la red, con lo cual afectan a compañías grandes en mayor grado que a las pequeñas +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la empresa: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Selecciona el color inicial de la empresa STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeropuertos nunca caducan: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Permite a todos los aeropuertos estar disponibles permanentemente una vez han sido introducidos @@ -1356,7 +1366,10 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color a usar pa STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde oscuro STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violeta +STR_CONFIG_SETTING_SCROLLMODE :Desplazamiento de vista: {STRING} STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamiento al desplazar el mapa +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Desplazar la vista con clic derecho, ratón en posición fija +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Recorrer mapa con clic derecho, ratón en posición fija STR_CONFIG_SETTING_SCROLLMODE_RMB :Mueve el mapa con el botón derecho del ratón STR_CONFIG_SETTING_SCROLLMODE_LMB :Mueve el mapa con el botón izquierdo del ratón STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desplazamiento de vista suavizado: {STRING} @@ -1479,6 +1492,7 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permitir IA en STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permite a los jugadores controlados por el ordenador participar en partidas multijugador STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes antes de que los scripts sean suspendidos: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Número máximo de operaciones de computación que un script puede realizar por turno +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Memoria máxima utilizada por script: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Qué tanta memoria puede consumir una secuencia de instrucciones (script) antes de que sea finalizada forzosamente. Puede que necesite ser incrementado para mapas grandes. STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB @@ -1574,7 +1588,7 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :rejilla 3x3 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatorio STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Permitir que los municipios construyan carreteras: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite a los municipios construir carreteras para crecer. Si se deshabilita, las autoridades municipales no podrán construir ninguna carretera -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a las ciudades construir pasos a nivel: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a los municipios construir pasos a nivel: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Permite a los municipios construir pasos a nivel STR_CONFIG_SETTING_NOISE_LEVEL :Permitir al municipio controlar el nivel de ruido de los aeropuertos: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Con esta opción desactivada, solamente puede haber dos aeropuertos por municipio. Si se activa, el número de aeropuertos en el municipio depende del nivel de aceptación de ruido del mismo, el cual depende de la población, del tamaño de los aeropuertos y de la distancia a la que estén @@ -1583,7 +1597,10 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Permite a los j STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Prohibido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permitido, patrón de carreteras personalizado +STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Generación de cargamento en municipios: {STRING} +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Qué tanta carga es producida por las casas del municipio, en relación a la población general del municipio.{}Crecimiento cuadrático: Un municipio de doble tamaño genera el cuádruple de pasajeros.{}Crecimiento lineal: Un municipio de doble tamaño genera el doble de pasajeros. STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Cuadrático (original) +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineal STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Crecimiento de árboles durante el juego: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla la aparición aleatoria de árboles durante la partida. Esto puede afectar a industrias que dependen del crecimiento de árboles, como los aserraderos @@ -1621,7 +1638,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Normal STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Rápida STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Muy rápida STR_CONFIG_SETTING_LARGER_TOWNS :Proporción de municipios que se convertirán en ciudades: {STRING} -STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de pueblos que se convertirán en ciudades. Las ciudades comienzan siendo más grandes y crecen más rápido +STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de municipios que se convertirán en ciudades. Las ciudades comienzan siendo más grandes y crecen más rápido STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 de cada {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguna STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial del tamaño de ciudad: {STRING} @@ -2085,6 +2102,7 @@ STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Desconec STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegido. Introduzca la contraseña STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Empresa protegida. Introduzca la contraseña +STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION :{WHITE}Lista de Clientes # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Lista de clientes @@ -2133,7 +2151,7 @@ STR_NETWORK_CHAT_ALL :[Todos] {STRING STR_NETWORK_CHAT_OSKTITLE :{BLACK}Introduce el texto para el chat en red # Network messages -STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}No se han encontrado dispositivos de red o juego compilado sin soporte de red +STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}No se han encontrado dispositivos de red STR_NETWORK_ERROR_NOSERVER :{WHITE}No se pudo encontrar ningún juego en red STR_NETWORK_ERROR_NOCONNECTION :{WHITE}El servidor no responde a la petición STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}No se pudo conectar debido a incompatibilidad de NewGRF @@ -2426,7 +2444,9 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Cambiar entre construir/retirar carretera STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Activar construir/quitar para construcciones de tranvía STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Convertir/Actualizar tipo de carretera. Shift permite mostrar una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convertir/Actualizar tipo de tranvía. Shift permite mostrar una estimación del precio +STR_ROAD_NAME_ROAD :Carretera STR_ROAD_NAME_TRAM :Tranvía # Road depot construction window @@ -2552,7 +2572,7 @@ STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Grande STR_FOUND_TOWN_SIZE_RANDOM :{BLACK}Aleatorio STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Seleccione el tamaño del municipio STR_FOUND_TOWN_CITY :{BLACK}Ciudad -STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Las ciudades crecen más rápido que los pueblos{}Dependiendo de los ajustes, son mayores al ser fundadas +STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Las ciudades crecen más rápido que los municipios{}Dependiendo de los ajustes, son mayores al ser fundadas STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Patrón de carretera: STR_FOUND_TOWN_SELECT_TOWN_ROAD_LAYOUT :{BLACK}Seleccionar patrón de carreteras para este municipio @@ -2612,9 +2632,11 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceptada: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de ferrocarril: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Tipo de carretera: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Tipo de tranvía: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Límite de velocidad del ferrocarril: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Límite de velocidad de carretera: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Límite de velocidad del tranvía: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Rocas @@ -2715,10 +2737,16 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_CAPTION :{WHITE}Fotogramas por segundo - FPS +STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) +STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Tasa de Simulación: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Número de ticks de juego simulados por segundo. +STR_FRAMERATE_RATE_BLITTER :{BLACK}FPS de gráficos: {STRING} STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de fotogramas renderizados por segundo. +STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factor de velocidad de juego actual: {DECIMAL}x +STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Rapidez actual del juego comparada con la esperada durante una simulación normal. STR_FRAMERATE_CURRENT :{WHITE}Actual STR_FRAMERATE_AVERAGE :{WHITE}Medio +STR_FRAMERATE_MEMORYUSE :{WHITE}Memoria STR_FRAMERATE_DATA_POINTS :{BLACK}Datos basados en {COMMA} medidas STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms @@ -2726,27 +2754,44 @@ STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} frames/s STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} frames/s STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} frames/s +STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} +STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! +STR_FRAMERATE_GAMELOOP :{BLACK}Bucles de juego totales: +STR_FRAMERATE_GL_ECONOMY :{BLACK} Manejo de cargamento STR_FRAMERATE_GL_TRAINS :{BLACK} Ticks de trenes: STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera: STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos: STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Ticks de aeronaves: +STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Ticks de mapa: +STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Retraso del gráfico de distribución: STR_FRAMERATE_DRAWING :{BLACK}Renderizado gráfico: +STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Ventanas de vista generales: STR_FRAMERATE_VIDEO :{BLACK}Salida de vídeo: STR_FRAMERATE_SOUND :{BLACK}Mezcla de sonido: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} Total de scripts: +STR_FRAMERATE_GAMESCRIPT :{BLACK} Script de juego: +STR_FRAMERATE_AI :{BLACK} IA {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! +STR_FRAMETIME_CAPTION_GAMELOOP :Bucle de juego +STR_FRAMETIME_CAPTION_GL_ECONOMY :Manejo de cargamento STR_FRAMETIME_CAPTION_GL_TRAINS :Ticks de trenes STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de vehículo de carretera STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks de barcos STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks de aeronaves +STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks de mapa +STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Retraso del gráfico de distribución STR_FRAMETIME_CAPTION_DRAWING :Renderizado gráfico +STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Representación de la vista del Mundo STR_FRAMETIME_CAPTION_VIDEO :Salida de vídeo STR_FRAMETIME_CAPTION_SOUND :Mezcla de sonido +STR_FRAMETIME_CAPTION_ALLSCRIPTS :Scripts de juego e IA en total STR_FRAMETIME_CAPTION_GAMESCRIPT :Script de juego +STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING} ############ End of leave-in-this-order @@ -2894,6 +2939,8 @@ STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Paleta: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Por Defecto (D) STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Por Defecto (D) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_LEGACY :Viejo (W) +STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :Viejo (W) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Parámetros: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PARAMETER_NONE :Ninguno @@ -2977,6 +3024,7 @@ STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF so STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} fue desactivado por {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de colocación de sprites inválido o desconocido (sprite {3:NUM}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Demasiados elementos en la lista de valores de propiedad (sprite {3:NUM}, propiedad {4:HEX}) +STR_NEWGRF_ERROR_INDPROD_CALLBACK :Llamada de producción de industria no válida (sprite {3:NUM}, "{2:STRING}") # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}¡Precaución! @@ -3103,6 +3151,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Soborna # Goal window STR_GOALS_CAPTION :{WHITE}Metas de {COMPANY} STR_GOALS_SPECTATOR_CAPTION :{WHITE}Metas Globales +STR_GOALS_SPECTATOR :Metas Globales STR_GOALS_GLOBAL_TITLE :{BLACK}Metas globales: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Ninguna - @@ -3151,6 +3200,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click so # Story book window STR_STORY_BOOK_CAPTION :{WHITE}Historial de {COMPANY} STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Historial Global +STR_STORY_BOOK_SPECTATOR :Historial Global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Página {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Permite saltar a una página específica al seleccionarla en esta lista desplegable @@ -3356,6 +3406,7 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}La indu STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesita: STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} @@ -3409,11 +3460,13 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Vehículos de c STR_GROUP_DEFAULT_SHIPS :Barcos sin agrupar STR_GROUP_DEFAULT_AIRCRAFTS :Aeronaves sin agrupar +STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA}) STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupos - Click en un grupo para ver la lista de sus vehículos. Es posible arrastrar grupos para modificar su jerarquía. STR_GROUP_CREATE_TOOLTIP :{BLACK}Click para crear un grupo STR_GROUP_DELETE_TOOLTIP :{BLACK}Borrar el grupo seleccionado STR_GROUP_RENAME_TOOLTIP :{BLACK}Renombrar el grupo seleccionado +STR_GROUP_LIVERY_TOOLTIP :{BLACK}Cambiar el color del grupo seleccionado STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Click para proteger este grupo del auto reemplazado global STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Borrar Grupo @@ -3436,6 +3489,7 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nuevos Vehícul STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nuevos Vehículos Maglev STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nuevos Vehículos de Carretera +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Vehículos de Tranvía Nuevos ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Nuevos Vehículos de Ferrocarril @@ -3445,6 +3499,7 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nueva Aeronave ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Coste: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Precio: {GOLD}{CURRENCY_LONG}{BLACK} (Costo de Reforma: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Velocidad: {GOLD}{VELOCITY}{BLACK} Potencia: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Velocidad: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Velocidad en el océano: {GOLD}{VELOCITY} @@ -3455,12 +3510,15 @@ STR_PURCHASE_INFO_REFITTABLE :(reformable) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Diseñado: {GOLD}{NUM}{BLACK} Vida: {GOLD}{COMMA} año{P "" s} STR_PURCHASE_INFO_RELIABILITY :{BLACK}Fiabilidad máxima: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Coste: {GOLD}{CURRENCY_LONG} +STR_PURCHASE_INFO_COST_REFIT :{BLACK}Precio: {GOLD}{CURRENCY_LONG}{BLACK} (Costo de Reforma: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Peso: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Coste: {GOLD}{CURRENCY_LONG}{BLACK} Velocidad: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Precio: {GOLD}{CURRENCY_LONG}{BLACK} (Costo de Reforma: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidad: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacidad: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagones con motor: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Reformable a: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Todos los tipos de carga +STR_PURCHASE_INFO_NONE :Sin carga STR_PURCHASE_INFO_ALL_BUT :Todo excepto {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}F.T máxima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} casillas @@ -3476,6 +3534,7 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar barco STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar aeronave +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Vehículo STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Vehículo STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Barco STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar y Reformar Aeronave @@ -3485,7 +3544,9 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el barco resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar la aeronave resaltada. Shift+Click muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el vehículo de ferrocarril resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el vehículo resaltado. Shift+Click muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar y reformar el barco resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}}Comprar y reformar la aeronave resaltada. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renombrar @@ -3598,10 +3659,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Mensaje STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Hemos diseñado un{G "" a} nuev{G o a} {STRING} - ¿estaría interesado en el uso exclusivo por un año de este vehículo, para que podamos comprobar cómo rinde antes de que esté universalmente disponible? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=f}locomotora +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :Locomotora de ferrocarril eléctrico STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}locomotora de monorraíl STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotora maglev STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=m}vehículo de carretera +STR_ENGINE_PREVIEW_TRAM_VEHICLE :vehículo de tranvía STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave STR_ENGINE_PREVIEW_SHIP :{G=m}barco @@ -3643,8 +3706,10 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Cambia e STR_REPLACE_ENGINES :Locomotoras STR_REPLACE_WAGONS :Vagones STR_REPLACE_ALL_RAILTYPE :Todos los vehículos ferroviarios +STR_REPLACE_ALL_ROADTYPE :Todos los vehículos de carretera STR_REPLACE_HELP_RAILTYPE :{BLACK}Seleccione tipo de ferrocarril para el que desea reemplazar locomotoras +STR_REPLACE_HELP_ROADTYPE :{BLACK}Selecciona el tipo de carretera para el que se desea reemplazar vehículos STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Muestra con qué vehículo está siendo reemplazado el vehículo de la izquierda STR_REPLACE_RAIL_VEHICLES :Vehículos de Ferrocarril STR_REPLACE_ELRAIL_VEHICLES :Vehículos de Ferrocarril Eléctrico @@ -3652,6 +3717,7 @@ STR_REPLACE_MONORAIL_VEHICLES :Vehículos de M STR_REPLACE_MAGLEV_VEHICLES :Vehículos Maglev STR_REPLACE_ROAD_VEHICLES :Vehículos Terrestres +STR_REPLACE_TRAM_VEHICLES :Vehículos de Tranvía STR_REPLACE_REMOVE_WAGON :{BLACK}Retirar vagón: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Hacer que el reemplazo automático mantenga la longitud del tren quitando vagones (empezando por el frente), si el cambio de locomotora produce un tren más largo @@ -4375,6 +4441,7 @@ STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tramo de STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Primero se debe retirar tramo de ferrocarril STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Carretera de un solo sentido o bloqueada STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}No se permiten pasos a nivel para este tipo de ferrocarril +STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}No se permiten pasos a nivel para este tipo de carretera STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}No se pueden construir señales aquí... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}No se pueden construir ferrocarriles aquí... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}No se pueden retirar ferrocarriles aquí... @@ -4394,7 +4461,12 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}No se pu STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}No se puede retirar tranvía de aquí... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... no hay carretera STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... no hay tranvía +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}No es posible transformar esta carretera... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}No se puede convertir el tipo de tranvía aquí... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}No hay carretera adecuada STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}No hay un tranvía adecuado +STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... carretera incompatible +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... tranvía incompatible # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}No pueden construirse canales aquí... diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 6f09523d61..de316f7963 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -237,6 +237,7 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Angre kr STR_BUTTON_SORT_BY :{BLACK}Sortera efter STR_BUTTON_LOCATION :{BLACK}Plats STR_BUTTON_RENAME :{BLACK}Byt namn +STR_BUTTON_CATCHMENT :{BLACK}Upptagningsområde STR_TOOLTIP_CATCHMENT :{BLACK}Växla visning av upptagningsområde STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Stäng fönster @@ -340,6 +341,7 @@ STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Zooma in STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Zooma ut vyn STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Bygg järnväg STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Bygg vägar +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Bygg spårvagnar STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Bygg hamnar STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Bygg flygplatser STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Öppna landskapsarkitektursverktygen för att höja/sänka land, plantera träd, etc. @@ -360,6 +362,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Generera STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generera städer STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generera industrier STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Bygg vägar +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Spårvägskonstruktion STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantera träd. Shift växlar mellan att bygga/visa beräknad kostnad STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Placera skylt STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Placera objekt. Shift växlar mellan att bygga/visa beräknad kostnad @@ -935,6 +938,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Georgisk lari ( STR_GAME_OPTIONS_CURRENCY_IRR :Iransk rial (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Ny rysk rubel (RUB) STR_GAME_OPTIONS_CURRENCY_MXN :Mexikansk peso (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :Nya Taiwanesisk dollar (NTD) +STR_GAME_OPTIONS_CURRENCY_CNY :Kinesisk Renminbi (CNY) +STR_GAME_OPTIONS_CURRENCY_HKD :Hongkongdollar (HKD) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vägfordon @@ -1000,7 +1006,9 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Fyrdubbel storl STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Storlek på typsnitt STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Välj vilken storlek som ska användas på gränssnittets typsnitt +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbel storlek +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Kvadrupel storlek STR_GAME_OPTIONS_BASE_GRF :{BLACK}Grafikpaket som standard STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Välj vilket grafikpaket som ska användas som standard @@ -1184,6 +1192,8 @@ STR_CONFIG_SETTING_AUTOSLOPE :Tillåt landska STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Tillåt landskapsarkitektur under byggnader och spår utan att ta bort dem STR_CONFIG_SETTING_CATCHMENT :Tillåt mer realistiska uppsamlingsområden för stationer: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Ha olika stora uppsamlingsområden för olika typer av stationer och flygplatser +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Företagsstationerna kan betjäna industrier med tillhörande neutrala stationer: {STRING} +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :När aktiverat, kan industrier med tillhörande stationer (t.ex. oljeplattformar) också betjänas av företagsägda stationer som är byggda i närheten. När inaktiverat kan dessa industrier endast betjänas av deras tillhörande stationer. Några närliggande företagsstationer kommer inte att kunna tjäna dem, inte heller kommer den tillhörande stationen att tjäna något annat än industrin STR_CONFIG_SETTING_EXTRADYNAMITE :Tillåt borttagning av fler stadsägda vägar, broar och tunnlar: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Underlätta borttagning av stadsägd infrastruktur och byggnader STR_CONFIG_SETTING_TRAIN_LENGTH :Maximal tåglängd: {STRING} @@ -1481,6 +1491,9 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Tillåt datorsp STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Tillåt datorstyrda AI-spelare att delta i spel för flera spelare STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes innan skript sätts i viloläge: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximalt antal beräkningssteg ett skript kan utföra i en omgång +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maximalt minnesanvändning per skript: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Hur mycket minne ett enda skript kan konsumera innan det tvingas avslutas. Det kan behöva ökas för stora kartor. +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Visa serviceintervall i procent: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Välj om fordonsservice ska triggas av hur lång tid som har gått sedan senaste service eller av att tillförlitligheten faller med en viss procentsats av den maximala tillförlitligheten @@ -1583,6 +1596,9 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Om denna instä STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Förbjuden STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Tillåten STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Tillåten, vanlig stads-layout +STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Fraktgods som genereras i staden: {STRING} +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Hur mycket fraktgods produceras av hus i städer, i förhållande till den totala befolkningen i staden.{}Kvadratisk tillväxt: En stad dubbelt så stor genererar fyra gånger så många passagerare.{}Linjär tillväxt: En stad dubbelt så stor genererar dubbelt så många passagerare. +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Kvadratisk (original) STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linjär STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Placering av träd i spelläge: {STRING} @@ -2426,8 +2442,11 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Bygg vä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Bygg spårvägstunnel. Shift växlar mellan att bygga/visa beräknad kostnad STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Växla mellan att bygga/riva väg STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Växla mellan att bygga/riva spårväg +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Konvertera/Uppgradera vägtyp. Shift växlar mellan att bygga/visa beräknad kostnad STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Konvertera/Uppgradera spårvagnstyp. Shift växlar mellan att bygga/visa beräknad kostnad +STR_ROAD_NAME_ROAD :Väg +STR_ROAD_NAME_TRAM :Spårväg # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Riktning för vägfordonsdepå @@ -2612,6 +2631,8 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Accepterat gods: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Spårtyp: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Vägtyp: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Spårvagnstyp: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Hastighetsgräns för järnvägsspår: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Hastighetsbegränsning på väg: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Hastighetsgräns för spårvagnar: {LTBLUE}{VELOCITY} @@ -2724,6 +2745,7 @@ STR_FRAMERATE_SPEED_FACTOR :{BLACK}Spelets STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Hur snabbt spelet för närvarande körs, jämfört med förväntad hastighet vid normal simulationsfrekvens. STR_FRAMERATE_CURRENT :{WHITE}Nuvarande STR_FRAMERATE_AVERAGE :{WHITE}Genomsnittlig +STR_FRAMERATE_MEMORYUSE :{WHITE}Minne STR_FRAMERATE_DATA_POINTS :{BLACK}Data baseras på {COMMA} mätvärden STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms @@ -2731,6 +2753,9 @@ STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} bildrutor/s STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} bildrutor/s STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} bildrutor/s +STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} +STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} +STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! @@ -2746,7 +2771,9 @@ STR_FRAMERATE_DRAWING :{BLACK}Grafikå STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Vyfönster: STR_FRAMERATE_VIDEO :{BLACK}Videoutmatning: STR_FRAMERATE_SOUND :{BLACK}Ljudmixning: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} GS/AI totalt: STR_FRAMERATE_GAMESCRIPT :{BLACK} Spelskript: +STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Spel-loop @@ -2761,7 +2788,9 @@ STR_FRAMETIME_CAPTION_DRAWING :Grafikåtergivn STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Återgivning av vyer STR_FRAMETIME_CAPTION_VIDEO :Videoutmatning STR_FRAMETIME_CAPTION_SOUND :Ljudmixning +STR_FRAMETIME_CAPTION_ALLSCRIPTS :GS/AI skripts totalt STR_FRAMETIME_CAPTION_GAMESCRIPT :Spelskript +STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} ############ End of leave-in-this-order @@ -3026,6 +3055,7 @@ STR_NEWGRF_BUGGY :{WHITE}NewGRF ' STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Last/återställnings information för '{1:ENGINE}' är skilld ifrån köp lista efter konstruktion. Detta kan leda till att utomatisk förnyelse/uppgradering misslyckas med att anpassa fordonen/vagnarna korrekt STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' skapade en oändlig loop i en produktions-callback-funktion STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback-funktion {1:HEX} returnerade ett okänt/ogiltligt resultat {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' returnerade ogiltig lasttyp i produktions-callback vid {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO : @@ -3169,6 +3199,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klicka f # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} berättelsebok STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Global berättelsebok +STR_STORY_BOOK_SPECTATOR :Global berättelsebok STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Sida {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Hoppa till valfri sida genom att välja sidan i denna lista @@ -3348,6 +3379,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Järnvägsbitar: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vägbitar: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Spårvagnsdelar: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vattenrutor: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanaler STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationer: @@ -3427,6 +3459,7 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Ogrupperade vä STR_GROUP_DEFAULT_SHIPS :Ogrupperade skepp STR_GROUP_DEFAULT_AIRCRAFTS :Ogrupperade flygmaskiner +STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA}) STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupper - klicka på en grupp för att lista alla fordon i gruppen. Dra och släpp grupper för att ordna hierarkin. STR_GROUP_CREATE_TOOLTIP :{BLACK}Klicka för att skapa en grupp @@ -3455,6 +3488,7 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nytt monorailfo STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nytt maglevfordon STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nytt Vägfordon +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nya spårvägsfordon ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Nya rälsfordon @@ -3464,6 +3498,7 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nytt flygplan ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Kostnad: {GOLD}{CURRENCY_LONG}{BLACK} Vikt: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Kostnad: {GOLD}{CURRENCY_LONG}{BLACK} (Kostnad för anpassning: {GOLD}{CURRENCY_LONG}{BLACK}) Vikt: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Hastighet: {GOLD}{VELOCITY}{BLACK} Kraft: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Hastighet: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Hastighet i hav: {GOLD}{VELOCITY} @@ -3477,6 +3512,7 @@ STR_PURCHASE_INFO_COST :{BLACK}Kostnad: STR_PURCHASE_INFO_COST_REFIT :{BLACK}Kostnad: {GOLD}{CURRENCY_LONG}{BLACK} (Anpassningskostnad: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Vikt: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Kostnad: {GOLD}{CURRENCY_LONG}{BLACK} Hastighet: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Kostnad: {GOLD}{CURRENCY_LONG}{BLACK} (Kostnad för anpassning: {GOLD}{CURRENCY_LONG}{BLACK}) Hastighet: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapacitet: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Motoriserade vagnar: {GOLD}+{POWER}{BLACK} Vikt: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Anpassningsbar till: {GOLD}{STRING} @@ -3499,6 +3535,7 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Köp fly STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Köp och anpassa fordon STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Köp och anpassa fordon +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Köp och anpassa skepp STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Köp och anpassa flygplan STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Köp markerad tågvagn. Shift+klick visar kostnad utan att köpa @@ -3506,6 +3543,9 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Köp mar STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Köp markerat skepp. Shift+klick visar kostnad utan att köpa STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Köp markerat flygplan. Shift+klick visar kostnad utan att köpa +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Köp och anpassa markerat tåg. Shift+klick visar kostnad utan att köpa +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Köp och anpassa markerat vägfordon. Shift+klick visar kostnad utan att köpa +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Köp och anpassa markerat skepp. Shift+klick visar kostnad utan att köpa STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Köp och anpassa markerat flygplan. Shift+klick visar kostnad utan att köpa STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Byt namn på @@ -3623,6 +3663,7 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monorail-lok STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-lok STR_ENGINE_PREVIEW_ROAD_VEHICLE :vägfordon +STR_ENGINE_PREVIEW_TRAM_VEHICLE :spårvägsfordon STR_ENGINE_PREVIEW_AIRCRAFT :flygplan STR_ENGINE_PREVIEW_SHIP :skepp @@ -3667,6 +3708,7 @@ STR_REPLACE_ALL_RAILTYPE :Alla järnvägs STR_REPLACE_ALL_ROADTYPE :Alla vägfordon STR_REPLACE_HELP_RAILTYPE :{BLACK}Välj vilken järnvägstyp du vill byta ut lok för +STR_REPLACE_HELP_ROADTYPE :{BLACK}Välj vilken vägtyp du vill byta ut motorer för STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Visa vilket fordon det vänstra fordonet byts ut till, om något STR_REPLACE_RAIL_VEHICLES :Järnvägsfordon STR_REPLACE_ELRAIL_VEHICLES :Elektriska järnvägsfordon @@ -3674,6 +3716,7 @@ STR_REPLACE_MONORAIL_VEHICLES :Monorail-fordon STR_REPLACE_MAGLEV_VEHICLES :Maglevfordon STR_REPLACE_ROAD_VEHICLES :Vägfordon +STR_REPLACE_TRAM_VEHICLES :Spårvägsfordon STR_REPLACE_REMOVE_WAGON :{BLACK}Vagnborttagning: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Gör så att automatiskt utbyte behåller ett tågs längd genom att ta bort vagnar (med början längst fram) om utbytandet av loket skulle göra tåget längre @@ -4418,6 +4461,11 @@ STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Kan inte STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... det finns ingen väg STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... det finns ingen spårvagnsräls STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Kan inte konvertera vägtyp här... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Kan inte konvertera spårvagnstyp här... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Ingen lämplig väg +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Ingen passande spårväg +STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... oförenlig väg +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... oförenlig spårväg # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Kan inte bygga kanaler här... @@ -4470,6 +4518,7 @@ STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Kan inte STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Kan inte ta bort denna grupp... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Kan inte döpa om grupp... STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Kan inte ställa in föräldragrupp ... +STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... loopar i grupphierarkin är inte tillåtna STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Kan inte ta bort alla fordon i denna grupp... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Kan inte lägga till fordon i denna grupp... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Kan inte lägga till delade fordon i denna grupp... From 331eba544a4d87ef269043d41951e289a8a16a32 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Wed, 17 Jul 2019 22:08:41 +0200 Subject: [PATCH 04/23] Fix: Narrowing cast in one storybook command CompanyID is 8 bit wide, so this incorrect cast would make it impossible to create story page elements for pages past 255. --- src/story.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/story.cpp b/src/story.cpp index 38faafd2f5..4c7063cf0c 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -154,7 +154,7 @@ CommandCost CmdCreateStoryPageElement(TileIndex tile, DoCommandFlag flags, uint3 { if (!StoryPageElement::CanAllocateItem()) return CMD_ERROR; - StoryPageID page_id = (CompanyID)GB(p1, 0, 16); + StoryPageID page_id = (StoryPageID)GB(p1, 0, 16); StoryPageElementType type = Extract(p1); /* Allow at most 128 elements per page. */ From 5981ed248a9971ab3df683652fc6a0ec5a3fd11c Mon Sep 17 00:00:00 2001 From: Alberth Date: Sun, 21 Jul 2019 11:53:07 +0200 Subject: [PATCH 05/23] Codechange: Remove unused FioTarFirstDir and FioTarAddLink functions --- src/fileio.cpp | 17 ----------------- src/fileio_func.h | 2 -- 2 files changed, 19 deletions(-) diff --git a/src/fileio.cpp b/src/fileio.cpp index 6980e6d8f8..a1a8db8d32 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -565,18 +565,6 @@ bool AppendPathSeparator(char *buf, const char *last) return true; } -/** - * Find the first directory in a tar archive. - * @param tarname the name of the tar archive to look in. - * @param subdir the subdirectory to look in. - */ -const char *FioTarFirstDir(const char *tarname, Subdirectory subdir) -{ - TarList::iterator it = _tar_list[subdir].find(tarname); - if (it == _tar_list[subdir].end()) return nullptr; - return (*it).second.dirname; -} - static void TarAddLink(const std::string &srcParam, const std::string &destParam, Subdirectory subdir) { std::string src = srcParam; @@ -598,11 +586,6 @@ static void TarAddLink(const std::string &srcParam, const std::string &destParam } } -void FioTarAddLink(const char *src, const char *dest, Subdirectory subdir) -{ - TarAddLink(src, dest, subdir); -} - /** * Simplify filenames from tars. * Replace '/' by #PATHSEPCHAR, and force 'name' to lowercase. diff --git a/src/fileio_func.h b/src/fileio_func.h index dd3727df0f..9c287d12c9 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -64,8 +64,6 @@ bool AppendPathSeparator(char *buf, const char *last); void DeterminePaths(const char *exe); void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); bool FileExists(const char *filename); -const char *FioTarFirstDir(const char *tarname, Subdirectory subdir); -void FioTarAddLink(const char *src, const char *dest, Subdirectory subdir); bool ExtractTar(const char *tar_filename, Subdirectory subdir); extern const char *_personal_dir; ///< custom directory for personal settings, saves, newgrf, etc. From d71a7c21da27e5f99e48b8ad21b669d078932e35 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 23 May 2019 22:40:34 +0100 Subject: [PATCH 06/23] Fix #7593: Crash in ScriptOrder::GetOrderDistance in VT_AIR mode Null pointer dereference occurred when either origin_tile or dest_tile were waypoint tiles. --- src/script/api/script_order.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index a72245d04d..045968874c 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -669,8 +669,14 @@ static void _DoCommandReturnSetOrderFlags(class ScriptInstance *instance) /* static */ uint ScriptOrder::GetOrderDistance(ScriptVehicle::VehicleType vehicle_type, TileIndex origin_tile, TileIndex dest_tile) { if (vehicle_type == ScriptVehicle::VT_AIR) { - if (ScriptTile::IsStationTile(origin_tile) && ::Station::GetByTile(origin_tile)->airport.tile != INVALID_TILE) origin_tile = ::Station::GetByTile(origin_tile)->airport.tile; - if (ScriptTile::IsStationTile(dest_tile) && ::Station::GetByTile(dest_tile)->airport.tile != INVALID_TILE) dest_tile = ::Station::GetByTile(dest_tile)->airport.tile; + if (ScriptTile::IsStationTile(origin_tile)) { + Station *orig_station = ::Station::GetByTile(origin_tile); + if (orig_station != nullptr && orig_station->airport.tile != INVALID_TILE) origin_tile = orig_station->airport.tile; + } + if (ScriptTile::IsStationTile(dest_tile)) { + Station *dest_station = ::Station::GetByTile(dest_tile); + if (dest_station != nullptr && dest_station->airport.tile != INVALID_TILE) dest_tile = dest_station->airport.tile; + } return ScriptMap::DistanceSquare(origin_tile, dest_tile); } else { From 196d586849684e62aa9a40093f2a1ce60e1cd53f Mon Sep 17 00:00:00 2001 From: TELK Date: Tue, 23 Jul 2019 04:27:39 +0900 Subject: [PATCH 07/23] Feature: Town name filtering (#7621) --- src/script/api/game/game_window.hpp.sq | 1 + src/script/api/script_window.hpp | 1 + src/town.h | 6 +++ src/town_gui.cpp | 63 ++++++++++++++++++++++---- src/widgets/town_widget.h | 1 + 5 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/script/api/game/game_window.hpp.sq b/src/script/api/game/game_window.hpp.sq index da1d30dde5..fe665a4ad0 100644 --- a/src/script/api/game/game_window.hpp.sq +++ b/src/script/api/game/game_window.hpp.sq @@ -1254,6 +1254,7 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TE_SWITCH_BAR, "WID_TE_SWITCH_BAR"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_SORT_ORDER, "WID_TD_SORT_ORDER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_SORT_CRITERIA, "WID_TD_SORT_CRITERIA"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_FILTER, "WID_TD_FILTER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_LIST, "WID_TD_LIST"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_SCROLLBAR, "WID_TD_SCROLLBAR"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TD_WORLD_POPULATION, "WID_TD_WORLD_POPULATION"); diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp index 902b19244a..3abc091d68 100644 --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -2486,6 +2486,7 @@ public: enum TownDirectoryWidgets { WID_TD_SORT_ORDER = ::WID_TD_SORT_ORDER, ///< Direction of sort dropdown. WID_TD_SORT_CRITERIA = ::WID_TD_SORT_CRITERIA, ///< Criteria of sort dropdown. + WID_TD_FILTER = ::WID_TD_FILTER, ///< Filter of name. WID_TD_LIST = ::WID_TD_LIST, ///< List of towns. WID_TD_SCROLLBAR = ::WID_TD_SCROLLBAR, ///< Scrollbar for the town list. WID_TD_WORLD_POPULATION = ::WID_TD_WORLD_POPULATION, ///< The world's population. diff --git a/src/town.h b/src/town.h index d669ccafb4..ce938ea065 100644 --- a/src/town.h +++ b/src/town.h @@ -158,6 +158,12 @@ enum TownRatingCheckType { TOWN_RATING_CHECK_TYPE_COUNT, ///< Number of town checking action types. }; +/** Special values for town list window for the data parameter of #InvalidateWindowData. */ +enum TownDirectoryInvalidateWindowData { + TDIWD_FORCE_REBUILD, + TDIWD_FILTER_CHANGES, ///< The filename filter has changed (via the editbox) +}; + /** * This enum is used in conjunction with town->flags. * IT simply states what bit is used for. diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 5cb589d31f..f9670e84ea 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -31,6 +31,7 @@ #include "townname_func.h" #include "core/geometry_func.hpp" #include "genworld.h" +#include "stringfilter_type.h" #include "widgets/dropdown_func.h" #include "widgets/town_widget.h" @@ -636,7 +637,7 @@ static const NWidgetPart _nested_town_directory_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TD_SORT_ORDER), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_TD_SORT_CRITERIA), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA), - NWidget(WWT_PANEL, COLOUR_BROWN), SetResize(1, 0), EndContainer(), + NWidget(WWT_EDITBOX, COLOUR_BROWN, WID_TD_FILTER), SetFill(35, 12), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP), EndContainer(), NWidget(WWT_PANEL, COLOUR_BROWN, WID_TD_LIST), SetMinimalSize(196, 0), SetDataTip(0x0, STR_TOWN_DIRECTORY_LIST_TOOLTIP), SetFill(1, 0), SetResize(0, 10), SetScrollbar(WID_TD_SCROLLBAR), EndContainer(), @@ -662,6 +663,9 @@ private: static const StringID sorter_names[]; static GUITownList::SortFunction * const sorter_funcs[]; + StringFilter string_filter; ///< Filter for towns + QueryString townname_editbox; ///< Filter editbox + GUITownList towns; Scrollbar *vscroll; @@ -689,8 +693,8 @@ private: /** Sort by town name */ static bool TownNameSorter(const Town * const &a, const Town * const &b) { - static char buf_cache[64]; - char buf[64]; + static char buf_cache[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; + char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; SetDParam(0, a->index); GetString(buf, STR_TOWN_NAME, lastof(buf)); @@ -739,7 +743,7 @@ private: } public: - TownDirectoryWindow(WindowDesc *desc) : Window(desc) + TownDirectoryWindow(WindowDesc *desc) : Window(desc), townname_editbox(MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH, MAX_LENGTH_TOWN_NAME_CHARS) { this->CreateNestedTree(); @@ -751,6 +755,9 @@ public: this->BuildSortTownList(); this->FinishInitNested(0); + + this->querystrings[WID_TD_FILTER] = &this->townname_editbox; + this->townname_editbox.cancel_button = QueryString::ACTION_CLEAR; } void SetStringParameters(int widget) const override @@ -941,6 +948,14 @@ public: this->vscroll->SetCapacityFromWidget(this, WID_TD_LIST); } + virtual void OnEditboxChanged(int wid) + { + if (wid == WID_TD_FILTER) { + this->string_filter.SetFilterTerm(this->townname_editbox.text.buf); + this->InvalidateData(TDIWD_FILTER_CHANGES); + } + } + /** * Some data on this window has become invalid. * @param data Information about the changed data. @@ -948,11 +963,41 @@ public: */ void OnInvalidateData(int data = 0, bool gui_scope = true) override { - if (data == 0) { - /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ - this->towns.ForceRebuild(); - } else { - this->towns.ForceResort(); + char buf[MAX_LENGTH_TOWN_NAME_CHARS * MAX_CHAR_LENGTH]; + + switch (data) { + case TDIWD_FORCE_REBUILD: + /* This needs to be done in command-scope to enforce rebuilding before resorting invalid data */ + this->towns.ForceRebuild(); + break; + + case TDIWD_FILTER_CHANGES: + if (this->string_filter.IsEmpty()) { + this->towns.ForceRebuild(); + } else { + this->towns.clear(); + + const Town *t; + FOR_ALL_TOWNS(t) { + this->string_filter.ResetState(); + + SetDParam(0, t->index); + GetString(buf, STR_TOWN_NAME, lastof(buf)); + + this->string_filter.AddLine(buf); + if (this->string_filter.GetState()) this->towns.push_back(t); + } + + this->towns.SetListing(this->last_sorting); + this->towns.ForceResort(); + this->towns.Sort(); + this->towns.shrink_to_fit(); + this->towns.RebuildDone(); + this->vscroll->SetCount(this->towns.size()); // Update scrollbar as well. + } + break; + default: + this->towns.ForceResort(); } } }; diff --git a/src/widgets/town_widget.h b/src/widgets/town_widget.h index 2559423cea..e5ac66184d 100644 --- a/src/widgets/town_widget.h +++ b/src/widgets/town_widget.h @@ -16,6 +16,7 @@ enum TownDirectoryWidgets { WID_TD_SORT_ORDER, ///< Direction of sort dropdown. WID_TD_SORT_CRITERIA, ///< Criteria of sort dropdown. + WID_TD_FILTER, ///< Filter of name. WID_TD_LIST, ///< List of towns. WID_TD_SCROLLBAR, ///< Scrollbar for the town list. WID_TD_WORLD_POPULATION, ///< The world's population. From 2817cd41f1b42a7d3901a92c6cda85a90765600a Mon Sep 17 00:00:00 2001 From: stormcone <48624099+stormcone@users.noreply.github.com> Date: Sun, 7 Jul 2019 19:44:08 +0200 Subject: [PATCH 08/23] Fix #7250: Viewport kdtree not being updated for waypoints when sign moved. Code based on the patch by JGRennison. JGRennison/OpenTTD-patches@ac84f34062ef1f3ffcdee49dc595d574e4efb4d5 --- src/waypoint_base.h | 2 ++ src/waypoint_cmd.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/waypoint_base.h b/src/waypoint_base.h index c11c2f2b2f..be1d0bd0df 100644 --- a/src/waypoint_base.h +++ b/src/waypoint_base.h @@ -27,6 +27,8 @@ struct Waypoint FINAL : SpecializedStation { void UpdateVirtCoord() override; + void MoveSign(TileIndex new_xy) override; + inline bool TileBelongsToRailStation(TileIndex tile) const override { return IsRailWaypointTile(tile) && GetStationIndex(tile) == this->index; diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 20e600b5ee..652173a947 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -47,6 +47,21 @@ void Waypoint::UpdateVirtCoord() InvalidateWindowData(WC_WAYPOINT_VIEW, this->index); } +/** + * Move the waypoint main coordinate somewhere else. + * @param new_xy new tile location of the sign + */ +void Waypoint::MoveSign(TileIndex new_xy) +{ + if (this->xy == new_xy) return; + + _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); + + this->BaseStation::MoveSign(new_xy); + + _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index)); +} + /** * Find a deleted waypoint close to a tile. * @param tile to search from From 2e686ad5d5cb3ae0a3e50b79050af74f672e7854 Mon Sep 17 00:00:00 2001 From: stormcone <48624099+stormcone@users.noreply.github.com> Date: Tue, 23 Jul 2019 21:31:45 +0200 Subject: [PATCH 09/23] Fix #7667: Buying an engine after buying wagons doesn't give a complete train. --- src/vehicle_cmd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 94492e3442..a1ea3590a3 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -139,10 +139,10 @@ CommandCost CmdBuildVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint Vehicle *v = nullptr; switch (type) { - case VEH_TRAIN: value.AddCost(CmdBuildRailVehicle(tile, subflags, e, GB(p1, 24, 8), &v)); break; - case VEH_ROAD: value.AddCost(CmdBuildRoadVehicle(tile, subflags, e, GB(p1, 24, 8), &v)); break; - case VEH_SHIP: value.AddCost(CmdBuildShip (tile, subflags, e, GB(p1, 24, 8), &v)); break; - case VEH_AIRCRAFT: value.AddCost(CmdBuildAircraft (tile, subflags, e, GB(p1, 24, 8), &v)); break; + case VEH_TRAIN: value.AddCost(CmdBuildRailVehicle(tile, subflags, e, GB(p1, 16, 8), &v)); break; + case VEH_ROAD: value.AddCost(CmdBuildRoadVehicle(tile, subflags, e, GB(p1, 16, 8), &v)); break; + case VEH_SHIP: value.AddCost(CmdBuildShip (tile, subflags, e, GB(p1, 16, 8), &v)); break; + case VEH_AIRCRAFT: value.AddCost(CmdBuildAircraft (tile, subflags, e, GB(p1, 16, 8), &v)); break; default: NOT_REACHED(); // Safe due to IsDepotTile() } From 425cd3e4ca8cf6812bdf015c649a7bf4b76a71a1 Mon Sep 17 00:00:00 2001 From: TTrebron Date: Sat, 27 Jul 2019 00:32:43 +0200 Subject: [PATCH 10/23] Fix #7655: Decrease buttons in cheat window do not work properly --- src/cheat_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 2cd8b90f00..3d338e91a6 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -370,7 +370,7 @@ struct CheatWindow : Window { default: /* Take whatever the function returns */ - value = ce->proc(value + ((x >= 20 + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1); + value = ce->proc(value + ((x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1); /* The first cheat (money), doesn't return a different value. */ if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0); From 8cccb158e98a4a5c93d85fe2e09d3937855c4675 Mon Sep 17 00:00:00 2001 From: glx Date: Sun, 28 Jul 2019 17:02:41 +0200 Subject: [PATCH 11/23] Fix #7672: more than 32 resolutions may be available --- src/strings.cpp | 2 +- src/strings_type.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index 5d186e7177..5593f6ba05 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1673,7 +1673,7 @@ static char *GetSpecialNameString(char *buff, int ind, StringParameters *args, c } /* resolution size? */ - if (IsInsideMM(ind, (SPECSTR_RESOLUTION_START - 0x70E4), (SPECSTR_RESOLUTION_END - 0x70E4) + 1)) { + if (IsInsideBS(ind, (SPECSTR_RESOLUTION_START - 0x70E4), _resolutions.size())) { int i = ind - (SPECSTR_RESOLUTION_START - 0x70E4); buff += seprintf( buff, last, "%ux%u", _resolutions[i].width, _resolutions[i].height diff --git a/src/strings_type.h b/src/strings_type.h index aa3ed788c3..11eeef1532 100644 --- a/src/strings_type.h +++ b/src/strings_type.h @@ -93,9 +93,8 @@ enum SpecialStrings { SPECSTR_LANGUAGE_START = 0x7100, SPECSTR_LANGUAGE_END = SPECSTR_LANGUAGE_START + MAX_LANG - 1, - /* reserve 32 strings for various screen resolutions */ + /* reserve strings for various screen resolutions MUST BE THE LAST VALUE IN THIS ENUM */ SPECSTR_RESOLUTION_START = SPECSTR_LANGUAGE_END + 1, - SPECSTR_RESOLUTION_END = SPECSTR_RESOLUTION_START + 0x1F, }; #endif /* STRINGS_TYPE_H */ From afbf6a59182d9b1ca36b9dab9bd391ad0ae6222f Mon Sep 17 00:00:00 2001 From: "Johannes E. Krause" Date: Thu, 30 May 2019 00:11:20 +0200 Subject: [PATCH 12/23] Feature: Allow showing Newspaper and Ticker messages in parallel --- src/news_gui.cpp | 82 ++++++++++++++++++++++++++++++++++--------- src/statusbar_gui.cpp | 2 +- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 7e99939b17..34cfa7a589 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -593,38 +593,46 @@ void InitNewsItemStructs() } /** - * Are we ready to show another news item? - * Only if nothing is in the newsticker and no newspaper is displayed + * Are we ready to show another ticker item? + * Only if nothing is in the newsticker is displayed */ -static bool ReadyForNextItem() +static bool ReadyForNextTickerItem() { - const NewsItem *ni = _forced_news == nullptr ? _current_news : _forced_news; + const NewsItem *ni = _statusbar_news_item; if (ni == nullptr) return true; /* Ticker message * Check if the status bar message is still being displayed? */ if (IsNewsTickerShown()) return false; + return true; +} + +/** + * Are we ready to show another news item? + * Only if no newspaper is displayed + */ +static bool ReadyForNextNewsItem() +{ + const NewsItem *ni = _forced_news == nullptr ? _current_news : _forced_news; + if (ni == nullptr) return true; /* neither newsticker nor newspaper are running */ return (NewsWindow::duration <= 0 || FindWindowById(WC_NEWS_WINDOW, 0) == nullptr); } -/** Move to the next news item */ -static void MoveToNextItem() +/** Move to the next ticker item */ +static void MoveToNextTickerItem() { InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); // invalidate the statusbar - DeleteWindowById(WC_NEWS_WINDOW, 0); // close the newspapers window if shown - _forced_news = nullptr; - _statusbar_news_item = nullptr; /* if we're not at the last item, then move on */ - if (_current_news != _latest_news) { - _current_news = (_current_news == nullptr) ? _oldest_news : _current_news->next; - const NewsItem *ni = _current_news; + while (_statusbar_news_item != _latest_news) { + _statusbar_news_item = (_statusbar_news_item == nullptr) ? _oldest_news : _statusbar_news_item->next; + const NewsItem *ni = _statusbar_news_item; const NewsType type = ni->type; /* check the date, don't show too old items */ - if (_date - _news_type_data[type].age > ni->date) return; + if (_date - _news_type_data[type].age > ni->date) continue; switch (_news_type_data[type].GetDisplay()) { default: NOT_REACHED(); @@ -636,6 +644,36 @@ static void MoveToNextItem() ShowTicker(ni); break; + case ND_FULL: // Full - show newspaper, skipped here + continue; + } + return; + } +} + +/** Move to the next news item */ +static void MoveToNextNewsItem() +{ + DeleteWindowById(WC_NEWS_WINDOW, 0); // close the newspapers window if shown + _forced_news = nullptr; + + /* if we're not at the last item, then move on */ + while (_current_news != _latest_news) { + _current_news = (_current_news == nullptr) ? _oldest_news : _current_news->next; + const NewsItem *ni = _current_news; + const NewsType type = ni->type; + + /* check the date, don't show too old items */ + if (_date - _news_type_data[type].age > ni->date) continue; + + switch (_news_type_data[type].GetDisplay()) { + default: NOT_REACHED(); + case ND_OFF: // Off - show nothing only a small reminder in the status bar, skipped here + continue; + + case ND_SUMMARY: // Summary - show ticker, skipped here + continue; + case ND_FULL: // Full - show newspaper ShowNewspaper(ni); break; @@ -778,14 +816,23 @@ static void DeleteNewsItem(NewsItem *ni) _total_news--; - if (_forced_news == ni || _current_news == ni || _statusbar_news_item == ni) { + if (_forced_news == ni || _current_news == ni) { /* When we're the current news, go to the previous item first; * we just possibly made that the last news item. */ if (_current_news == ni) _current_news = ni->prev; /* About to remove the currently forced item (shown as newspapers) || - * about to remove the currently displayed item (newspapers, ticker, or just a reminder) */ - MoveToNextItem(); + * about to remove the currently displayed item (newspapers) */ + MoveToNextNewsItem(); + } + + if (_statusbar_news_item == ni) { + /* When we're the current news, go to the previous item first; + * we just possibly made that the last news item. */ + _statusbar_news_item = ni->prev; + + /* About to remove the currently displayed item (ticker, or just a reminder) */ + MoveToNextTickerItem(); } delete ni; @@ -906,7 +953,8 @@ void NewsLoop() _last_clean_month = _cur_month; } - if (ReadyForNextItem()) MoveToNextItem(); + if (ReadyForNextTickerItem()) MoveToNextTickerItem(); + if (ReadyForNextNewsItem()) MoveToNextNewsItem(); } /** Do a forced show of a specific message */ diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index a3a9e2c424..82939e8961 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -165,7 +165,7 @@ struct StatusBarWindow : Window { DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_AUTOSAVE, TC_FROMSTRING, SA_HOR_CENTER); } else if (_pause_mode != PM_UNPAUSED) { DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_PAUSED, TC_FROMSTRING, SA_HOR_CENTER); - } else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == nullptr && _statusbar_news_item != nullptr && _statusbar_news_item->string_id != 0) { + } else if (this->ticker_scroll < TICKER_STOP && _statusbar_news_item != nullptr && _statusbar_news_item->string_id != 0) { /* Draw the scrolling news text */ if (!DrawScrollingStatusText(_statusbar_news_item, ScaleGUITrad(this->ticker_scroll), r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) { InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); From bcc73bd40dc9ac2b48f9982871b9befc970cbb91 Mon Sep 17 00:00:00 2001 From: TELK Date: Mon, 5 Aug 2019 03:35:56 +0900 Subject: [PATCH 13/23] Add: 'getsysdate' console command (#7658) Add `getsysdate` console command to display system's local time, which is might be useful to check current time in script logging. --- src/console_cmds.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 740bbdde88..13784178f5 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -39,6 +39,7 @@ #include "engine_base.h" #include "game/game.hpp" #include "table/strings.h" +#include #include "safeguards.h" @@ -1302,13 +1303,27 @@ DEF_CONSOLE_CMD(ConGetSeed) DEF_CONSOLE_CMD(ConGetDate) { if (argc == 0) { - IConsoleHelp("Returns the current date (day-month-year) of the game. Usage: 'getdate'"); + IConsoleHelp("Returns the current date (year-month-day) of the game. Usage: 'getdate'"); return true; } YearMonthDay ymd; ConvertDateToYMD(_date, &ymd); - IConsolePrintF(CC_DEFAULT, "Date: %d-%d-%d", ymd.day, ymd.month + 1, ymd.year); + IConsolePrintF(CC_DEFAULT, "Date: %04d-%02d-%02d", ymd.year, ymd.month + 1, ymd.day); + return true; +} + +DEF_CONSOLE_CMD(ConGetSysDate) +{ + if (argc == 0) { + IConsoleHelp("Returns the current date (year-month-day) of your system. Usage: 'getsysdate'"); + return true; + } + + time_t t; + time(&t); + auto timeinfo = localtime(&t); + IConsolePrintF(CC_DEFAULT, "System Date: %04d-%02d-%02d %02d:%02d:%02d", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); return true; } @@ -1925,6 +1940,7 @@ void IConsoleStdLibRegister() IConsoleCmdRegister("restart", ConRestart); IConsoleCmdRegister("getseed", ConGetSeed); IConsoleCmdRegister("getdate", ConGetDate); + IConsoleCmdRegister("getsysdate", ConGetSysDate); IConsoleCmdRegister("quit", ConExit); IConsoleCmdRegister("resetengines", ConResetEngines, ConHookNoNetwork); IConsoleCmdRegister("reset_enginepool", ConResetEnginePool, ConHookNoNetwork); From 9d6fb257c3cae7c26e3ed18a4ae495762f562d56 Mon Sep 17 00:00:00 2001 From: nikolas Date: Tue, 6 Aug 2019 02:43:00 -0400 Subject: [PATCH 14/23] Cleanup: Remove duplicate thread.h include (#7683) --- src/video/dedicated_v.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp index 8d767ce4d9..c29fd5fd1b 100644 --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -74,7 +74,7 @@ static void DedicatedSignalHandler(int sig) # include # include # include "../os/windows/win32.h" -# include "../thread.h" + static HANDLE _hInputReady, _hWaitForInputHandling; static HANDLE _hThread; // Thread to close static char _win_console_thread_buffer[200]; From 9fd91f9b69a60e6cd9380f7671b5c5256075dbb7 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 6 Aug 2019 19:45:43 +0200 Subject: [PATCH 15/23] Update: Translations from eints english (us): 2 changes by njn --- src/lang/english_US.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 6bf3ba3dd0..52c53b6b28 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1167,7 +1167,7 @@ STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount STR_CONFIG_SETTING_INTEREST_RATE :Interest rate: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Loan interest rate; also controls inflation, if enabled STR_CONFIG_SETTING_RUNNING_COSTS :Running costs: {STRING} -STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Set level of maintainance and running costs of vehicles and infrastructure +STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Set level of maintenance and running costs of vehicles and infrastructure STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Construction speed: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limit the amount of construction actions for AIs STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Vehicle breakdowns: {STRING} @@ -1665,7 +1665,7 @@ STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :If you set this STR_CONFIG_SETTING_DEMAND_SIZE :Amount of returning cargo for symmetric mode: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Setting this to less than 100% makes the symmetric distribution behave more like the asymmetric one. Less cargo will be forcibly sent back if a certain amount is sent to a station. If you set it to 0% the symmetric distribution behaves just like the asymmetric one. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturation of short paths before using high-capacity paths: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequently there are multiple paths between two given stations. Cargodist will saturate the shortest path first, then use the second shortest path until that is saturated and so on. Saturation is determined by an estimation of capacity and planned usage. Once it has saturated all paths, if there is still demand left, it will overload all paths, prefering the ones with high capacity. Most of the time the algorithm will not estimate the capacity accurately, though. This setting allows you to specify up to which percentage a shorter path must be saturated in the first pass before choosing the next longer one. Set it to less than 100% to avoid overcrowded stations in case of overestimated capacity. +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequently there are multiple paths between two given stations. Cargodist will saturate the shortest path first, then use the second shortest path until that is saturated and so on. Saturation is determined by an estimation of capacity and planned usage. Once it has saturated all paths, if there is still demand left, it will overload all paths, preferring the ones with high capacity. Most of the time the algorithm will not estimate the capacity accurately, though. This setting allows you to specify up to which percentage a shorter path must be saturated in the first pass before choosing the next longer one. Set it to less than 100% to avoid overcrowded stations in case of overestimated capacity. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Speed units: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Whenever a speed is shown in the user interface, show it in the selected units From 7a709002270a904843a81a846f22b53921cfcad1 Mon Sep 17 00:00:00 2001 From: nikolas Date: Tue, 6 Aug 2019 14:57:53 -0400 Subject: [PATCH 16/23] Fix: Typo in running costs help text --- src/lang/english.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 5115a0eb5f..e6e4bb9305 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1167,7 +1167,7 @@ STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount STR_CONFIG_SETTING_INTEREST_RATE :Interest rate: {STRING2} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Loan interest rate; also controls inflation, if enabled STR_CONFIG_SETTING_RUNNING_COSTS :Running costs: {STRING2} -STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Set level of maintainance and running costs of vehicles and infrastructure +STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Set level of maintenance and running costs of vehicles and infrastructure STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Construction speed: {STRING2} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limit the amount of construction actions for AIs STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Vehicle breakdowns: {STRING2} From 10fe568f0888fe51b8f2570eb93e1cdc96f227f8 Mon Sep 17 00:00:00 2001 From: nikolas Date: Wed, 7 Aug 2019 15:15:53 -0400 Subject: [PATCH 17/23] Fix: typo in ScriptList::Valuate param error (#7687) --- src/script/api/script_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 13545c4220..fe747028f8 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -845,7 +845,7 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) int nparam = sq_gettop(vm) - 1; if (nparam < 1) { - return sq_throwerror(vm, "You need to give a least a Valuator as parameter to ScriptList::Valuate"); + return sq_throwerror(vm, "You need to give at least a Valuator as parameter to ScriptList::Valuate"); } /* Make sure the valuator function is really a function, and not any From 27d676e17a85f611ed0fe58735df1bc250182af2 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 8 Aug 2019 19:45:45 +0200 Subject: [PATCH 18/23] Update: Translations from eints danish: 2 changes by njn --- src/lang/danish.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index deb41bef25..090997d49f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -358,6 +358,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Landskab STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Bygenerering STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrigenerering STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Bygning af vej +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Sporvejskonstruktion STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant træer. Shift skifter mellem at bygge og vise prisoverslag. STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Placér skilt STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Placér objekt. Shift viser tidsestimat @@ -2432,6 +2433,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Byg en s STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Skift mellem bygning/fjernelse af veje STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Skift mellem bygning/fjernelse af sporveje +STR_ROAD_NAME_TRAM :Sporvej # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Retning af værksted From f0aea2d24631cd77036ed287a5457a5f03d789a1 Mon Sep 17 00:00:00 2001 From: Juriy Petrochenkov Date: Fri, 9 Aug 2019 13:13:34 +0300 Subject: [PATCH 19/23] Fix: RemoveAirport function now returns with 'Aircraft in the way' error message as it should be. --- src/station_cmd.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 546aecc269..46ded9a1dd 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2389,7 +2389,9 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) const Aircraft *a; FOR_ALL_AIRCRAFT(a) { if (!a->IsNormalAircraft()) continue; - if (a->targetairport == st->index && a->state != FLYING) return CMD_ERROR; + if (a->targetairport == st->index && a->state != FLYING) { + return_cmd_error(STR_ERROR_AIRCRAFT_IN_THE_WAY); + } } if (flags & DC_EXEC) { From d986f01d078553640528e2d334627bf552a60931 Mon Sep 17 00:00:00 2001 From: Juriy Petrochenkov Date: Wed, 14 Aug 2019 13:13:11 +0300 Subject: [PATCH 20/23] Codechange: Reduced indentation in SaveLoadWindow::OnClick --- src/fios_gui.cpp | 99 ++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 1a8e7fdebb..754dc45350 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -605,24 +605,24 @@ public: this->InvalidateData(SLIWD_RESCAN_FILES); break; - case WID_SL_LOAD_BUTTON: - if (this->selected != nullptr && !_load_check_data.HasErrors()) { - const char *name = FiosBrowseTo(this->selected); - _file_to_saveload.SetMode(this->selected->type); - _file_to_saveload.SetName(name); - _file_to_saveload.SetTitle(this->selected->title); + case WID_SL_LOAD_BUTTON: { + if (this->selected == nullptr || _load_check_data.HasErrors()) break; - if (this->abstract_filetype == FT_HEIGHTMAP) { - delete this; - ShowHeightmapLoad(); + const char *name = FiosBrowseTo(this->selected); + _file_to_saveload.SetMode(this->selected->type); + _file_to_saveload.SetName(name); + _file_to_saveload.SetTitle(this->selected->title); - } else if (!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()) { - _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD_GAME; - ClearErrorMessages(); - delete this; - } + if (this->abstract_filetype == FT_HEIGHTMAP) { + delete this; + ShowHeightmapLoad(); + } else if (!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()) { + _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD_GAME; + ClearErrorMessages(); + delete this; } break; + } case WID_SL_NEWGRF_INFO: if (_load_check_data.HasNewGrfs()) { @@ -651,43 +651,44 @@ public: const FiosItem *file = this->fios_items.Get(y); const char *name = FiosBrowseTo(file); - if (name != nullptr) { - if (click_count == 1) { - if (this->selected != file) { - this->selected = file; - _load_check_data.Clear(); - - if (GetDetailedFileType(file->type) == DFT_GAME_FILE) { - /* Other detailed file types cannot be checked before. */ - SaveOrLoad(name, SLO_CHECK, DFT_GAME_FILE, NO_DIRECTORY, false); - } - - this->InvalidateData(SLIWD_SELECTION_CHANGES); - } - if (this->fop == SLO_SAVE) { - /* Copy clicked name to editbox */ - this->filename_editbox.text.Assign(file->title); - this->SetWidgetDirty(WID_SL_SAVE_OSK_TITLE); - } - } else if (!_load_check_data.HasErrors()) { - this->selected = file; - if (this->fop == SLO_LOAD) { - if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { - this->OnClick(pt, WID_SL_LOAD_BUTTON, 1); - } else { - assert(this->abstract_filetype == FT_HEIGHTMAP); - _file_to_saveload.SetMode(file->type); - _file_to_saveload.SetName(name); - _file_to_saveload.SetTitle(file->title); - - delete this; - ShowHeightmapLoad(); - } - } - } - } else { + if (name == nullptr) { /* Changed directory, need refresh. */ this->InvalidateData(SLIWD_RESCAN_FILES); + break; + } + + if (click_count == 1) { + if (this->selected != file) { + this->selected = file; + _load_check_data.Clear(); + + if (GetDetailedFileType(file->type) == DFT_GAME_FILE) { + /* Other detailed file types cannot be checked before. */ + SaveOrLoad(name, SLO_CHECK, DFT_GAME_FILE, NO_DIRECTORY, false); + } + + this->InvalidateData(SLIWD_SELECTION_CHANGES); + } + if (this->fop == SLO_SAVE) { + /* Copy clicked name to editbox */ + this->filename_editbox.text.Assign(file->title); + this->SetWidgetDirty(WID_SL_SAVE_OSK_TITLE); + } + } else if (!_load_check_data.HasErrors()) { + this->selected = file; + if (this->fop == SLO_LOAD) { + if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { + this->OnClick(pt, WID_SL_LOAD_BUTTON, 1); + } else { + assert(this->abstract_filetype == FT_HEIGHTMAP); + _file_to_saveload.SetMode(file->type); + _file_to_saveload.SetName(name); + _file_to_saveload.SetTitle(file->title); + + delete this; + ShowHeightmapLoad(); + } + } } break; } From b870596f153c17d9aa915ca67b8f6414d73cb31f Mon Sep 17 00:00:00 2001 From: Gabda Date: Sat, 5 Jan 2019 14:22:07 +0100 Subject: [PATCH 21/23] Add #6887: Option to show zone inside local authority boundary of towns Can be found at town information > local authority window Layout for button is same as Graph Keys Turn on/off for every town individually --- src/core/kdtree.hpp | 11 +++++++++ src/lang/english.txt | 2 ++ src/misc.cpp | 2 ++ src/script/api/script_window.hpp | 1 + src/town.h | 2 ++ src/town_cmd.cpp | 1 + src/town_gui.cpp | 22 ++++++++++++++++++ src/town_kdtree.h | 2 ++ src/viewport.cpp | 38 ++++++++++++++++++++++++++++++++ src/widgets/town_widget.h | 1 + 10 files changed, 82 insertions(+) diff --git a/src/core/kdtree.hpp b/src/core/kdtree.hpp index c7f66ebff9..59f3da8101 100644 --- a/src/core/kdtree.hpp +++ b/src/core/kdtree.hpp @@ -372,6 +372,17 @@ public: CheckInvariant(); } + /** + * Clear the tree. + */ + void Clear() + { + this->nodes.clear(); + this->free_list.clear(); + this->unbalanced = 0; + return; + } + /** * Reconstruct the tree with the same elements, letting it be fully balanced. */ diff --git a/src/lang/english.txt b/src/lang/english.txt index e6e4bb9305..8d13ee1966 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3122,6 +3122,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Rename Town # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} local authority +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zone +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Show zone within local authority boundaries STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Transport company ratings: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Actions available: diff --git a/src/misc.cpp b/src/misc.cpp index 3d09f26f26..ffdadecd3b 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -47,6 +47,7 @@ void InitializeAirportGui(); void InitializeDockGui(); void InitializeGraphGui(); void InitializeObjectGui(); +void InitializeTownGui(); void InitializeIndustries(); void InitializeObjects(); void InitializeTrees(); @@ -97,6 +98,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin InitializeDockGui(); InitializeGraphGui(); InitializeObjectGui(); + InitializeTownGui(); InitializeAIGui(); InitializeTrees(); InitializeIndustries(); diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp index 3abc091d68..252cb3e54f 100644 --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -2495,6 +2495,7 @@ public: /** Widgets of the #TownAuthorityWindow class. */ enum TownAuthorityWidgets { WID_TA_CAPTION = ::WID_TA_CAPTION, ///< Caption of window. + WID_TA_ZONE_BUTTON = ::WID_TA_ZONE_BUTTON, ///< Turn on/off showing local authority zone. WID_TA_RATING_INFO = ::WID_TA_RATING_INFO, ///< Overview with ratings for each company. WID_TA_COMMAND_LIST = ::WID_TA_COMMAND_LIST, ///< List of commands for the player. WID_TA_SCROLLBAR = ::WID_TA_SCROLLBAR, ///< Scrollbar of the list of commands. diff --git a/src/town.h b/src/town.h index ce938ea065..b0f4a5c72c 100644 --- a/src/town.h +++ b/src/town.h @@ -101,6 +101,8 @@ struct Town : TownPool::PoolItem<&_town_pool> { bool larger_town; ///< if this is a larger town and should grow more quickly TownLayout layout; ///< town specific road layout + bool show_zone; ///< NOSAVE: mark town to show the local authority zone in the viewports + std::list psa_list; /** diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 65032c1fb2..2049cbddcc 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1746,6 +1746,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize * similar towns they're unlikely to grow all in one tick */ t->grow_counter = t->index % TOWN_GROWTH_TICKS; t->growth_rate = TownTicksToGameTicks(250); + t->show_zone = false; _town_kdtree.Insert(t->index); diff --git a/src/town_gui.cpp b/src/town_gui.cpp index f9670e84ea..0436e87e09 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -33,6 +33,7 @@ #include "genworld.h" #include "stringfilter_type.h" #include "widgets/dropdown_func.h" +#include "town_kdtree.h" #include "widgets/town_widget.h" @@ -40,12 +41,15 @@ #include "safeguards.h" +TownKdtree _town_local_authority_kdtree(&Kdtree_TownXYFunc); + typedef GUIList GUITownList; static const NWidgetPart _nested_town_authority_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TA_CAPTION), SetDataTip(STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetMinimalTextLines(1, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM + 2), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_BROWN), NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN), NWidget(WWT_STICKYBOX, COLOUR_BROWN), @@ -113,6 +117,7 @@ public: this->sel_index = -1; } + this->SetWidgetLoweredState(WID_TA_ZONE_BUTTON, this->town->show_zone); this->SetWidgetDisabledState(WID_TA_EXECUTE, this->sel_index == -1); this->DrawWidgets(); @@ -258,6 +263,18 @@ public: void OnClick(Point pt, int widget, int click_count) override { switch (widget) { + case WID_TA_ZONE_BUTTON: { + bool new_show_state = !this->town->show_zone; + TownID index = this->town->index; + + new_show_state ? _town_local_authority_kdtree.Insert(index) : _town_local_authority_kdtree.Remove(index); + + this->town->show_zone = new_show_state; + this->SetWidgetLoweredState(widget, new_show_state); + MarkWholeScreenDirty(); + break; + } + case WID_TA_COMMAND_LIST: { int y = this->GetRowFromWidget(pt.y, WID_TA_COMMAND_LIST, 1, FONT_HEIGHT_NORMAL); if (!IsInsideMM(y, 0, 5)) return; @@ -1274,3 +1291,8 @@ void ShowFoundTownWindow() if (_game_mode != GM_EDITOR && !Company::IsValidID(_local_company)) return; AllocateWindowDescFront(&_found_town_desc, 0); } + +void InitializeTownGui() +{ + _town_local_authority_kdtree.Clear(); +} diff --git a/src/town_kdtree.h b/src/town_kdtree.h index ae6b9e4eac..9241655854 100644 --- a/src/town_kdtree.h +++ b/src/town_kdtree.h @@ -15,6 +15,8 @@ inline uint16 Kdtree_TownXYFunc(TownID tid, int dim) { return (dim == 0) ? TileX(Town::Get(tid)->xy) : TileY(Town::Get(tid)->xy); } typedef Kdtree TownKdtree; + extern TownKdtree _town_kdtree; +extern TownKdtree _town_local_authority_kdtree; #endif diff --git a/src/viewport.cpp b/src/viewport.cpp index 534de090b5..5a5756dfea 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -83,6 +83,7 @@ #include "window_gui.h" #include "linkgraph/linkgraph_gui.h" #include "viewport_kdtree.h" +#include "town_kdtree.h" #include "viewport_sprite_sorter.h" #include "bridge_map.h" #include "company_base.h" @@ -1038,12 +1039,49 @@ static void DrawTileHighlightType(const TileInfo *ti, TileHighlightType tht) } } +/** + * Highlights tiles insede local authority of selected towns. + * @param *ti TileInfo Tile that is being drawn + */ +static void HighlightTownLocalAuthorityTiles(const TileInfo *ti) +{ + /* Going through cases in order of computational time. */ + + if (_town_local_authority_kdtree.Count() == 0) return; + + /* Tile belongs to town regardless of distance from town. */ + if (GetTileType(ti->tile) == MP_HOUSE) { + if (!Town::GetByTile(ti->tile)->show_zone) return; + + DrawTileSelectionRect(ti, PALETTE_CRASH); + return; + } + + /* If the closest town in the highlighted list is far, we can stop searching. */ + TownID tid = _town_local_authority_kdtree.FindNearest(TileX(ti->tile), TileY(ti->tile)); + Town *closest_highlighted_town = Town::Get(tid); + + if (DistanceManhattan(ti->tile, closest_highlighted_town->xy) >= _settings_game.economy.dist_local_authority) return; + + /* Tile is inside of the local autrhority distance of a highlighted town, + but it is possible that a non-highlighted town is even closer. */ + Town *closest_town = ClosestTownFromTile(ti->tile, _settings_game.economy.dist_local_authority); + + if (closest_town->show_zone) { + DrawTileSelectionRect(ti, PALETTE_CRASH); + } + +} + /** * Checks if the specified tile is selected and if so draws selection using correct selectionstyle. * @param *ti TileInfo Tile that is being drawn */ static void DrawTileSelection(const TileInfo *ti) { + /* Highlight tiles insede local authority of selected towns. */ + HighlightTownLocalAuthorityTiles(ti); + /* Draw a red error square? */ bool is_redsq = _thd.redsq == ti->tile; if (is_redsq) DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING); diff --git a/src/widgets/town_widget.h b/src/widgets/town_widget.h index e5ac66184d..bd6e0b954f 100644 --- a/src/widgets/town_widget.h +++ b/src/widgets/town_widget.h @@ -25,6 +25,7 @@ enum TownDirectoryWidgets { /** Widgets of the #TownAuthorityWindow class. */ enum TownAuthorityWidgets { WID_TA_CAPTION, ///< Caption of window. + WID_TA_ZONE_BUTTON, ///< Turn on/off showing local authority zone. WID_TA_RATING_INFO, ///< Overview with ratings for each company. WID_TA_COMMAND_LIST, ///< List of commands for the player. WID_TA_SCROLLBAR, ///< Scrollbar of the list of commands. From 5feb06e3f3495b1ee5dde4387b6b491c9f72f859 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Mon, 15 Apr 2019 18:06:25 +0200 Subject: [PATCH 22/23] Add: Scale oil refinery edge distance up by map size Also scales oil rig distance up, since they use the same algorithm. --- src/industry_cmd.cpp | 29 +++++++++++++++++++++++++++-- src/lang/english.txt | 4 ++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 4e4ff5c82f..38edc0835a 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1225,6 +1225,29 @@ static CommandCost CheckNewIndustry_Forest(TileIndex tile) return CommandCost(); } +/** + * Check if a tile is within a distance from map edges, scaled by map dimensions independently. + * Each dimension is checked independently, and dimensions smaller than 256 are not scaled. + * @param tile Which tile to check distance of. + * @param maxdist Normal distance on a 256x256 map. + * @return True if the tile is near the map edge. + */ +static bool CheckScaledDistanceFromEdge(TileIndex tile, uint maxdist) +{ + uint maxdist_x = maxdist; + uint maxdist_y = maxdist; + + if (MapSizeX() > 256) maxdist_x *= MapSizeX() / 256; + if (MapSizeY() > 256) maxdist_y *= MapSizeY() / 256; + + if (DistanceFromEdgeDir(tile, DIAGDIR_NE) < maxdist_x) return true; + if (DistanceFromEdgeDir(tile, DIAGDIR_NW) < maxdist_y) return true; + if (DistanceFromEdgeDir(tile, DIAGDIR_SW) < maxdist_x) return true; + if (DistanceFromEdgeDir(tile, DIAGDIR_SE) < maxdist_y) return true; + + return false; +} + /** * Check the conditions of #CHECK_REFINERY (Industry should be positioned near edge of the map). * @param tile %Tile to perform the checking. @@ -1233,7 +1256,8 @@ static CommandCost CheckNewIndustry_Forest(TileIndex tile) static CommandCost CheckNewIndustry_OilRefinery(TileIndex tile) { if (_game_mode == GM_EDITOR) return CommandCost(); - if (DistanceFromEdge(TILE_ADDXY(tile, 1, 1)) < _settings_game.game_creation.oil_refinery_limit) return CommandCost(); + + if (CheckScaledDistanceFromEdge(TILE_ADDXY(tile, 1, 1), _settings_game.game_creation.oil_refinery_limit)) return CommandCost(); return_cmd_error(STR_ERROR_CAN_ONLY_BE_POSITIONED); } @@ -1248,8 +1272,9 @@ extern bool _ignore_restrictions; static CommandCost CheckNewIndustry_OilRig(TileIndex tile) { if (_game_mode == GM_EDITOR && _ignore_restrictions) return CommandCost(); + if (TileHeight(tile) == 0 && - DistanceFromEdge(TILE_ADDXY(tile, 1, 1)) < _settings_game.game_creation.oil_refinery_limit) return CommandCost(); + CheckScaledDistanceFromEdge(TILE_ADDXY(tile, 1, 1), _settings_game.game_creation.oil_refinery_limit)) return CommandCost(); return_cmd_error(STR_ERROR_CAN_ONLY_BE_POSITIONED); } diff --git a/src/lang/english.txt b/src/lang/english.txt index 8d13ee1966..8651639fdc 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1326,8 +1326,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Terrain type: { STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis only) Hilliness of the landscape STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industry density: {STRING2} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Set how many industries should be generated and what level should be maintained during the game -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distance from edge for Oil refineries: {STRING2} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Oil refineries are only constructed near the map border, that is at the coast for island maps +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum distance from edge for Oil industries: {STRING2} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limit for how far from the map border oil refineries and oil rigs can be constructed. On island maps this ensures they are near the coast. On maps larger than 256 tiles, this value is scaled up. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snow line height: {STRING2} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Control at what height snow starts in sub-arctic landscape. Snow also affects industry generation and town growth requirements STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Roughness of terrain: {STRING2} From dabccf70b4c02f68ebf51aca807376ca4f2a0e15 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 18 Aug 2019 19:45:40 +0200 Subject: [PATCH 23/23] Update: Translations from eints dutch: 2 changes by JanWillem russian: 7 changes by Lone_Wolf --- src/lang/dutch.txt | 2 ++ src/lang/russian.txt | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 951b2d0236..1d5470583c 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3122,6 +3122,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Plaats hernoeme # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE} Gemeenteraad van {TOWN} +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zone +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Zone weergeven binnen de gemeentegrenzen STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Reputatie van transportbedrijven: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Beschikbare acties: diff --git a/src/lang/russian.txt b/src/lang/russian.txt index ef03ace5b0..41724f6b05 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -363,8 +363,8 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Выбе STR_BUTTON_SORT_BY :{BLACK}Сортировка STR_BUTTON_LOCATION :{BLACK}Обзор STR_BUTTON_RENAME :{BLACK}Переименовать -STR_BUTTON_CATCHMENT :{BLACK}Покрытие -STR_TOOLTIP_CATCHMENT :{BLACK}Переключить видимость области покрытия +STR_BUTTON_CATCHMENT :{BLACK}Охват +STR_TOOLTIP_CATCHMENT :{BLACK}Переключить подсветку участков, находящихся в зонах обслуживания станциями игрока, а также не попадающих в эти зоны. STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закрыть окно STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Окна можно перетаскивать, схватив за заголовок @@ -1478,8 +1478,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Тип ланд STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Только для TerraGenesis){}Холмистость ландшафта STR_CONFIG_SETTING_INDUSTRY_DENSITY :Количество предприятий: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Выберите, сколько предприятий создавать в начале и на каком уровне поддерживать их количество в процессе игры. -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Максимальное расстояние от края карты до нефтезаводов: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Нефтеперерабатывающие заводы всегда строятся у краёв карты или на берегах островов, находящихся недалеко от края +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. расстояние от края карты до предприятий нефтяной индустрии: {STRING} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Эта настройка ограничивает расстояние от края карты до нефтяных платформ и нефтеперерабатывающих заводов. Таким образом, на краях карты, оканчивающихся водой, они будут строиться у берега. На картах размером более 256 это значение будет соответственно увеличено. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Высота снеговой линии: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Укажите, на какой высоте в субарктическом климате устанавливается снеговой покров. Наличие снега влияет на расстановку предприятий и на условия роста городов. STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Грубость ландшафта: {STRING} @@ -3302,6 +3302,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Переиме # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Администрация г.{NBSP}{TOWN} +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Граница +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Показать область, находящуюся под управлением местной администрации. STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Рейтинг транспортных компаний STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Доступные действия: @@ -3325,7 +3327,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Про STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Установить статую в честь вашей компании.{}Цена: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Профинансировать строительство новых коммерческих зданий в городе.{}Цена: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Купить годовые эксклюзивные права на транспортные перевозки в городе. Администрация разрешит пользоваться ТОЛЬКО вашими станциями.{}Цена: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Дать взятку городской администрации для повышения рейтинга. Существует риск санкций, если факт взятки раскроется.{}Цена: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Дать взятку городской администрации для повышения рейтинга. Существует риск санкций, если факт подкупа раскроется.{}Цена: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Задачи компании «{COMPANY}»