diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5398dde0c2..7046f5e40e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -137,6 +137,9 @@ if(WIN32)
list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc")
endif()
+# An empty target for the tools
+add_custom_target(tools)
+
include(SourceList)
include(Endian)
add_endian_definition()
@@ -226,7 +229,7 @@ include(LinkPackage)
link_package(PNG TARGET PNG::PNG ENCOURAGED)
link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED)
link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED)
-link_package(LZO ENCOURAGED)
+link_package(LZO)
link_package(XDG_basedir)
if(NOT OPTION_DEDICATED)
diff --git a/cmake/Options.cmake b/cmake/Options.cmake
index 0167ad0a6c..005bb19cae 100644
--- a/cmake/Options.cmake
+++ b/cmake/Options.cmake
@@ -35,6 +35,8 @@ function(set_directory_options)
set(GLOBAL_DIR "${DEFAULT_GLOBAL_DIR}" CACHE STRING "Global directory")
message(STATUS "Detecting Global Data directory - ${GLOBAL_DIR}")
endif()
+
+ set(HOST_BINARY_DIR "" CACHE PATH "Full path to native cmake build directory")
endfunction()
# Set some generic options that influence what is being build.
diff --git a/docs/landscape.html b/docs/landscape.html
index 0442a72ff1..07609d4a85 100644
--- a/docs/landscape.html
+++ b/docs/landscape.html
@@ -829,7 +829,7 @@
4 |
- on snow with rough land underneed |
+ on snow with rough land underneath |
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 8e1f36f0e5..9413a1898d 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -922,7 +922,11 @@ static bool AircraftController(Aircraft *v)
v->cur_speed = 0;
if (--u->cur_speed == 32) {
if (!PlayVehicleSound(v, VSE_START)) {
- SndPlayVehicleFx(SND_18_HELICOPTER, v);
+ SoundID sfx = AircraftVehInfo(v->engine_type)->sfx;
+ /* For compatibility with old NewGRF we ignore the sfx property, unless a NewGRF-defined sound is used.
+ * The baseset has only one helicopter sound, so this only limits using plane or cow sounds. */
+ if (sfx < ORIGINAL_SAMPLE_COUNT) sfx = SND_18_HELICOPTER;
+ SndPlayVehicleFx(sfx, v);
}
}
} else {
diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp
index 68d9e5b51a..a0f040d1aa 100644
--- a/src/bootstrap_gui.cpp
+++ b/src/bootstrap_gui.cpp
@@ -253,7 +253,7 @@ bool HandleBootstrap()
if (_exit_game) return false;
/* Try to probe the graphics. Should work this time. */
- if (!BaseGraphics::SetSet("")) goto failure;
+ if (!BaseGraphics::SetSet({})) goto failure;
/* Finally we can continue heading for the menu. */
_game_mode = GM_MENU;
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp
index 3df2b61734..4d1e9dc59f 100644
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -1903,10 +1903,10 @@ DEF_CONSOLE_CMD(ConContent)
}
if (argc <= 1) {
- IConsoleHelp("Query, select and download content. Usage: 'content update|upgrade|select [all|id]|unselect [all|id]|state [filter]|download'");
+ IConsoleHelp("Query, select and download content. Usage: 'content update|upgrade|select [id]|unselect [all|id]|state [filter]|download'");
IConsoleHelp(" update: get a new list of downloadable content; must be run first");
IConsoleHelp(" upgrade: select all items that are upgrades");
- IConsoleHelp(" select: select a specific item given by its id or 'all' to select all. If no parameter is given, all selected content will be listed");
+ IConsoleHelp(" select: select a specific item given by its id. If no parameter is given, all selected content will be listed");
IConsoleHelp(" unselect: unselect a specific item given by its id or 'all' to unselect all");
IConsoleHelp(" state: show the download/select state of all downloadable content. Optionally give a filter string");
IConsoleHelp(" download: download all content you've selected");
@@ -1932,7 +1932,13 @@ DEF_CONSOLE_CMD(ConContent)
OutputContentState(*iter);
}
} else if (strcasecmp(argv[2], "all") == 0) {
- _network_content_client.SelectAll();
+ /* The intention of this function was that you could download
+ * everything after a filter was applied; but this never really
+ * took off. Instead, a select few people used this functionality
+ * to download every available package on BaNaNaS. This is not in
+ * the spirit of this service. Additionally, these few people were
+ * good for 70% of the consumed bandwidth of BaNaNaS. */
+ IConsolePrintF(CC_ERROR, "'select all' is no longer supported since 1.11");
} else {
_network_content_client.Select((ContentID)atoi(argv[2]));
}
diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp
index a371305999..7efcb1abfc 100644
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -117,6 +117,7 @@ static void LoadGrfFileIndexed(const char *filename, const SpriteID *index_tbl,
do {
bool b = LoadNextSprite(start, file_index, sprite_id, container_ver);
+ (void)b; // Unused without asserts
assert(b);
sprite_id++;
} while (++start <= end);
diff --git a/src/lang/CMakeLists.txt b/src/lang/CMakeLists.txt
index 90ee22931d..1a8191f82e 100644
--- a/src/lang/CMakeLists.txt
+++ b/src/lang/CMakeLists.txt
@@ -59,6 +59,10 @@ set(LANG_SOURCE_FILES
set(LANG_BINARY_DIR ${CMAKE_BINARY_DIR}/lang)
+if (HOST_BINARY_DIR)
+ include(${HOST_BINARY_DIR}/strgen.cmake)
+endif()
+
# Walk over all the (finished) language files, and generate a command to compile them
foreach(LANG_SOURCE_FILE IN LISTS LANG_SOURCE_FILES)
get_filename_component(LANG_SOURCE_FILE_NAME_WE ${LANG_SOURCE_FILE} NAME_WE)
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
index e6580df72e..94c2032527 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -837,6 +837,7 @@ STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Nėra muzikos
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}„{STRING}“
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Takelis
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Pavadinimas
@@ -2790,6 +2791,7 @@ STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Krovinys
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Geležinkelių greičio limitas: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Kelio greičio limitas: {LTBLUE}{VELOCITY}
+STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Tramvajaus greičio limitas: {LTBLUE}{VELOCITY}
# Description of land area of different tiles
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Akmenys
@@ -2917,6 +2919,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Žaidimo
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nėra informacijos
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}Plėtiniai: {WHITE}{STRING}
+STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Perrašyti bylą
STR_SAVELOAD_OSKTITLE :{BLACK}Įveskite išsaugomo žaidimo vardą
@@ -3238,6 +3241,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Paperka
# Goal window
STR_GOALS_CAPTION :{WHITE}{COMPANY} Tikslai
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Globalūs tikslai
+STR_GOALS_SPECTATOR :Visuotiniai tikslai
STR_GOALS_GLOBAL_TITLE :{BLACK}Visuotiniai tikslai:
STR_GOALS_TEXT :{ORANGE}{STRING}
STR_GOALS_NONE :{ORANGE}- Nieko -
@@ -3553,6 +3557,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Iškelti visas
STR_GROUP_RENAME_CAPTION :{BLACK}Pervadinti grupę
+STR_GROUP_PROFIT_THIS_YEAR :Šio mėnesio pelnas:
# Build vehicle window
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nauji lokomotyvai
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
index d3a049cb33..34a8f93456 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
@@ -1553,11 +1553,13 @@ STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Året der avisa
STR_CONFIG_SETTING_STARTING_YEAR :Start spillet i år: {STRING}
STR_CONFIG_SETTING_ENDING_YEAR :Poengsum ved slutten av året: {STRING}
STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Året spillet slutter med tanke på poeng. På slutten av dette året, vil firmaets poengsum bli lagret og tavlen med høyeste poengsummer vil vises. Spilleren kan fortsette å spille etter dette.{}Hvis dette er før start året, vil tavlen med høyeste poengsummer aldri vises.
+STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldri
STR_CONFIG_SETTING_SMOOTH_ECONOMY :Jevn økonomi (flere, mindre endringer): {STRING}
STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Når denne er aktivert, endrer industriproduksjonen seg oftere, og i mindre trinn. Denne innstillingen har vanligvis ingen effekt hvis industriene er fra en NewGRF
STR_CONFIG_SETTING_ALLOW_SHARES :Tillat aksjekjøp i andre firmaer: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Når aktivert, tillates kjøp og salg av selskapers aksjer. Aksjer vil kun være tilgjengelig selskaper som når en viss alder
+STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Sett minimum levetid for et selskap, før andre kan kjøpe og selge aksjer fra dem.
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Prosentandel av etappe-overskudd som skal betales i innmatingssystem: {STRING}
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Andel av inntekten gitt til de mellomliggende etapper i et overføringssystem, noe som gir mer kontroll over inntektene
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Når du drar en linje, plasser signaler hver: {STRING}
@@ -2166,6 +2168,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Feil pas
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Tjeneren er full
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Du er bannlyst fra denne tjeneren
STR_NETWORK_ERROR_KICKED :{WHITE}Du ble kastet ut av spillet
+STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Grunn: {STRING}
STR_NETWORK_ERROR_CHEATER :{WHITE}Juksing er ikke tillatt på denne tjeneren
STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Du sendte for mange kommandoer til serveren
STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Du brukte for lang tid på å skrive inn passordet
@@ -3123,6 +3126,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Endre bynavnet
# Town local authority window
STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN}s bystyre
STR_LOCAL_AUTHORITY_ZONE :{BLACK}Område
+STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Vis zonene innenfor de lokale myndigheters grenser
STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Vurdering av transportfirma:
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Handlinger tilgjengelig:
@@ -3395,6 +3399,8 @@ STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industri
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ingen -
STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transportert){BLACK}
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
+STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING}
+STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} og {NUM} flere...
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrinavn - klikk på navn for å gå til industri. Ctrl+klikk åpner et nytt tilleggsvindu over industrien
@@ -4180,8 +4186,10 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ikke end
STR_SCREENSHOT_CAPTION :WHITE}Ta skjermbilde
STR_SCREENSHOT_SCREENSHOT :{BLACK}Normalt skjermbilde
STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Skjermbilde med maksimal zoom
+STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Standard zoomet skjermbilde
STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Skjermbilde av hele kartat
STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Høydekart skjermbilde
+STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Oversiktskart skjermbilde
# AI Parameters
STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre
diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp
index ba9f0e1b50..8bffc80fde 100644
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -446,7 +446,7 @@ static bool FixTTOEngines()
e->preview_company = INVALID_COMPANY;
e->preview_asked = (CompanyMask)-1;
e->preview_wait = 0;
- e->name = nullptr;
+ e->name = std::string{};
}
return true;
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index ae6615ed93..adfd10b2cf 100644
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -1941,7 +1941,7 @@ void SlObject(void *object, const SaveLoad *sld)
}
for (; sld->cmd != SL_END; sld++) {
- void *ptr = sld->global ? sld->address : GetVariableAddress(object, sld);
+ void *ptr = GetVariableAddress(object, sld);
SlObjectMember(ptr, sld);
}
}
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
index 07830ffb73..d5df5b47b9 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -1038,7 +1038,18 @@ static inline bool IsNumericType(VarType conv)
*/
static inline void *GetVariableAddress(const void *object, const SaveLoad *sld)
{
- return const_cast((const byte*)(sld->global ? nullptr : object) + (ptrdiff_t)sld->address);
+ /* Entry is a global address. */
+ if (sld->global) return sld->address;
+
+ /* Entry is a null-variable, mostly used to read old savegames etc. */
+ if (GetVarMemType(sld->conv) == SLE_VAR_NULL) {
+ assert(sld->address == nullptr);
+ return nullptr;
+ }
+
+ /* Everything else should be a non-null pointer. */
+ assert(object != nullptr);
+ return const_cast((const byte *)object + (ptrdiff_t)sld->address);
}
int64 ReadValue(const void *ptr, VarType conv);
diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp
index bea0edbc88..2250560110 100644
--- a/src/script/squirrel.cpp
+++ b/src/script/squirrel.cpp
@@ -485,7 +485,7 @@ void Squirrel::Initialize()
/* Handle compile-errors ourself, so we can display it nicely */
sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError);
- sq_notifyallexceptions(this->vm, SQTrue);
+ sq_notifyallexceptions(this->vm, _debug_script_level > 5);
/* Set a good print-function */
sq_setprintfunc(this->vm, &Squirrel::PrintFunc);
/* Handle runtime-errors ourself, so we can display it nicely */
diff --git a/src/settings.cpp b/src/settings.cpp
index 6600730e52..31d6180a55 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -2340,6 +2340,7 @@ uint GetCompanySettingIndex(const char *name)
{
uint i;
const SettingDesc *sd = GetSettingFromName(name, &i);
+ (void)sd; // Unused without asserts
assert(sd != nullptr && (sd->desc.flags & SGF_PER_COMPANY) != 0);
return i;
}
@@ -2450,6 +2451,7 @@ void IConsoleSetSetting(const char *name, int value)
{
uint index;
const SettingDesc *sd = GetSettingFromName(name, &index);
+ (void)sd; // Unused without asserts
assert(sd != nullptr);
SetSettingValue(index, value);
}
diff --git a/src/settingsgen/CMakeLists.txt b/src/settingsgen/CMakeLists.txt
index e17b8ad6bf..69b2092017 100644
--- a/src/settingsgen/CMakeLists.txt
+++ b/src/settingsgen/CMakeLists.txt
@@ -1,13 +1,18 @@
cmake_minimum_required(VERSION 3.5)
-project(settingsgen)
+if (NOT HOST_BINARY_DIR)
+ project(settingsgen)
-set(sourcefiles
- settingsgen.cpp
- ../core/alloc_func.cpp
- ../misc/getoptdata.cpp
- ../ini_load.cpp
- ../string.cpp
-)
-add_definitions(-DSETTINGSGEN)
-add_executable(settingsgen ${sourcefiles})
+ set(sourcefiles
+ settingsgen.cpp
+ ../core/alloc_func.cpp
+ ../misc/getoptdata.cpp
+ ../ini_load.cpp
+ ../string.cpp
+ )
+ add_definitions(-DSETTINGSGEN)
+ add_executable(settingsgen ${sourcefiles})
+
+ export(TARGETS settingsgen FILE ${CMAKE_BINARY_DIR}/settingsgen.cmake)
+ add_dependencies(tools settingsgen)
+endif()
diff --git a/src/strgen/CMakeLists.txt b/src/strgen/CMakeLists.txt
index b8f61cde3b..c638b5c6e7 100644
--- a/src/strgen/CMakeLists.txt
+++ b/src/strgen/CMakeLists.txt
@@ -1,22 +1,26 @@
cmake_minimum_required(VERSION 3.5)
-project(strgen)
+if (NOT HOST_BINARY_DIR)
+ project(strgen)
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
+ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
-set(sourcefiles
- strgen.cpp
- strgen_base.cpp
- ../core/alloc_func.cpp
- ../misc/getoptdata.cpp
- ../string.cpp
-)
-add_definitions(-DSTRGEN)
-add_executable(strgen ${sourcefiles})
+ set(sourcefiles
+ strgen.cpp
+ strgen_base.cpp
+ ../core/alloc_func.cpp
+ ../misc/getoptdata.cpp
+ ../string.cpp
+ )
+ add_definitions(-DSTRGEN)
+ add_executable(strgen ${sourcefiles})
-include(Endian)
-add_endian_definition()
+ include(Endian)
+ add_endian_definition()
+ export(TARGETS strgen FILE ${CMAKE_BINARY_DIR}/strgen.cmake)
+ add_dependencies(tools strgen)
+endif()
# Source Files
add_files(strgen_base.cpp)
diff --git a/src/table/CMakeLists.txt b/src/table/CMakeLists.txt
index ef0b32fdeb..eb76c53bcd 100644
--- a/src/table/CMakeLists.txt
+++ b/src/table/CMakeLists.txt
@@ -11,6 +11,10 @@ set(TABLE_INI_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini
)
+if (HOST_BINARY_DIR)
+ include(${HOST_BINARY_DIR}/settingsgen.cmake)
+endif()
+
# Generate a command and target to create the settings table
add_custom_command_timestamp(OUTPUT ${TABLE_BINARY_DIR}/settings.h
COMMAND ${CMAKE_COMMAND} -E make_directory ${TABLE_BINARY_DIR}
diff --git a/src/window.cpp b/src/window.cpp
index 1d940e338a..08d884f72f 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -1407,6 +1407,7 @@ static void AddWindowToZOrdering(Window *w)
/* Search down the z-ordering for its location. */
WindowBase *v = _z_front_window;
uint last_z_priority = UINT_MAX;
+ (void)last_z_priority; // Unused without asserts
while (v != nullptr && (v->window_class == WC_INVALID || GetWindowZPriority(v->window_class) > GetWindowZPriority(w->window_class))) {
if (v->window_class != WC_INVALID) {
/* Sanity check z-ordering, while we're at it. */