From fed04d0a0340e225a12059285a6dd6c6e3f5eff1 Mon Sep 17 00:00:00 2001 From: EmperorJake <68182631+EmperorJake@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:51:12 +1000 Subject: [PATCH] Add: Setting to disable aircraft range limit (#15433) --- src/aircraft_cmd.cpp | 2 +- src/engine.cpp | 1 + src/lang/english.txt | 3 +++ src/settingentry_gui.cpp | 1 + src/settings_table.cpp | 20 ++++++++++++++++++++ src/settings_type.h | 1 + src/table/settings/game_settings.ini | 10 ++++++++++ 7 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index ad1784aeef..052c749420 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -615,7 +615,7 @@ void UpdateAircraftCache(Aircraft *v, bool update_range) /* Update aircraft range. */ if (update_range) { - v->acache.cached_max_range = GetVehicleProperty(v, PROP_AIRCRAFT_RANGE, AircraftVehInfo(v->engine_type)->max_range); + v->acache.cached_max_range = Engine::Get(v->engine_type)->GetRange(); /* Squared it now so we don't have to do it later all the time. */ v->acache.cached_max_range_sqr = v->acache.cached_max_range * v->acache.cached_max_range; } diff --git a/src/engine.cpp b/src/engine.cpp index 31c3d0a117..2c622bed3c 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -455,6 +455,7 @@ TimerGameCalendar::Date Engine::GetLifeLengthInDays() const */ uint16_t Engine::GetRange() const { + if (!_settings_game.vehicle.aircraft_range) return 0; switch (this->type) { case VEH_AIRCRAFT: return GetEngineProperty(this->index, PROP_AIRCRAFT_RANGE, this->VehInfo().max_range); diff --git a/src/lang/english.txt b/src/lang/english.txt index 14bf29d512..2b9887e43e 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1905,6 +1905,9 @@ STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :When enabled, t STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable wagon speed limits: {STRING2} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train +STR_CONFIG_SETTING_AIRCRAFT_RANGE :Enable aircraft maximum range: {STRING2} +STR_CONFIG_SETTING_AIRCRAFT_RANGE_HELPTEXT :When enabled, NewGRFs will be able to limit maximum range of aircraft + STR_CONFIG_SETTING_DISABLE_ELRAILS :Disable electric rails: {STRING2} STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Enabling this setting disables the requirement to electrify tracks to make electric engines run on them diff --git a/src/settingentry_gui.cpp b/src/settingentry_gui.cpp index 64cf7d09e0..6fa4be6fa6 100644 --- a/src/settingentry_gui.cpp +++ b/src/settingentry_gui.cpp @@ -731,6 +731,7 @@ SettingsContainer &GetSettingsTree() physics->Add(new SettingEntry("vehicle.roadveh_slope_steepness")); physics->Add(new SettingEntry("vehicle.smoke_amount")); physics->Add(new SettingEntry("vehicle.plane_speed")); + physics->Add(new SettingEntry("vehicle.aircraft_range")); } SettingsPage *routing = vehicles->Add(new SettingsPage(STR_CONFIG_SETTING_VEHICLES_ROUTING)); diff --git a/src/settings_table.cpp b/src/settings_table.cpp index b634946200..a393527fad 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -50,6 +50,8 @@ #include "void_map.h" #include "station_func.h" #include "station_base.h" +#include "aircraft.h" +#include "aircraft_cmd.h" #include "table/strings.h" #include "table/settings.h" @@ -364,6 +366,24 @@ static void RoadVehSlopeSteepnessChanged(int32_t) } } +/** + * This function updates the aircraft cache when the aircraft range setting is changed. + */ +static void AircraftRangeChanged(int32_t) +{ + for (Aircraft *v : Aircraft::Iterate()) { + v->acache.cached_max_range = Engine::Get(v->engine_type)->GetRange(); + v->acache.cached_max_range_sqr = v->acache.cached_max_range * v->acache.cached_max_range; + + /* Reset destination is too far state */ + if (v->flags.Test(VehicleAirFlag::DestinationTooFar)) { + v->flags.Reset(VehicleAirFlag::DestinationTooFar); + SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); + DeleteVehicleNews(v->index, AdviceType::AircraftDestinationTooFar); + } + } +} + static void TownFoundingChanged(int32_t) { if (_game_mode != GM_EDITOR && _settings_game.economy.found_town == TF_FORBIDDEN) { diff --git a/src/settings_type.h b/src/settings_type.h index ebadd297c2..62085435e7 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -562,6 +562,7 @@ struct VehicleSettings { uint8_t extend_vehicle_life; ///< extend vehicle life by this many years uint8_t road_side; ///< the side of the road vehicles drive on uint8_t plane_crashes; ///< number of plane crashes, 0 = none, 1 = reduced, 2 = normal + bool aircraft_range; ///< enable range limits for aircraft }; /** Settings related to the economy. */ diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index 291cec4b6d..d273dd04bf 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -21,6 +21,7 @@ static bool CheckRoadSide(int32_t &new_value); static bool CheckDynamicEngines(int32_t &new_value); static void StationCatchmentChanged(int32_t new_value); static void MaxVehiclesChanged(int32_t new_value); +static void AircraftRangeChanged(int32_t new_value); static const SettingVariant _game_settings_table[] = { [post-amble] @@ -355,6 +356,15 @@ strhelp = STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT strval = STR_CONFIG_SETTING_PLANE_CRASHES_NONE cat = SC_BASIC +[SDT_BOOL] +var = vehicle.aircraft_range +flags = SettingFlag::NoNetwork +def = true +str = STR_CONFIG_SETTING_AIRCRAFT_RANGE +strhelp = STR_CONFIG_SETTING_AIRCRAFT_RANGE_HELPTEXT +post_cb = AircraftRangeChanged +cat = SC_EXPERT + [SDT_VAR] var = vehicle.extend_vehicle_life type = SLE_UINT8