From 2bb5c9ac848d5ab3ebbe08ef82880ef406aad205 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 2 Mar 2024 11:34:40 +0000 Subject: [PATCH] Add setting to disable script parameter randomisation --- src/game/game_gui.cpp | 6 +++--- src/lang/extra/english.txt | 3 +++ src/script/script_config.cpp | 1 + src/script/script_gui.cpp | 6 +++--- src/settings_gui.cpp | 1 + src/settings_type.h | 1 + src/table/settings/script_settings.ini | 9 +++++++++ 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index a2f8f34646..ccf0b6b5ea 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -206,14 +206,14 @@ struct GSConfigWindow : public Window { TextColour colour; uint idx = 0; if (config_item.description.empty()) { - if (Game::GetInstance() == nullptr && config_item.random_deviation != 0) { + if (Game::GetInstance() == nullptr && config_item.random_deviation != 0 && !GetGameSettings().script.script_disable_param_randomisation) { str = STR_AI_SETTINGS_JUST_DEVIATION; } else { str = STR_JUST_STRING1; } colour = TC_ORANGE; } else { - if (Game::GetInstance() == nullptr && config_item.random_deviation != 0) { + if (Game::GetInstance() == nullptr && config_item.random_deviation != 0 && !GetGameSettings().script.script_disable_param_randomisation) { str = STR_AI_SETTINGS_SETTING_DEVIATION; } else { str = STR_AI_SETTINGS_SETTING; @@ -232,7 +232,7 @@ struct GSConfigWindow : public Window { DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); } - if (Game::GetInstance() != nullptr || config_item.random_deviation == 0) { + if (Game::GetInstance() != nullptr || config_item.random_deviation == 0 || GetGameSettings().script.script_disable_param_randomisation) { auto config_iterator = config_item.labels.find(current_value); if (config_iterator != config_item.labels.end()) { SetDParam(idx++, STR_JUST_RAW_STRING); diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 380f6aabb5..579d943c12 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -2298,6 +2298,9 @@ STR_CONFIG_SETTING_CITY_IN_LABEL_HELPTEXT :Display if a to STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Path signals only +STR_CONFIG_SETTING_SCRIPT_DISABLE_PARAM_RANDOM :Disable script parameter randomisation: {STRING2} +STR_CONFIG_SETTING_SCRIPT_DISABLE_PARAM_RANDOM_HELPTEXT :Disable the randomisation of AI/GS script paraneters. + STR_CONFIG_SETTING_RESTRICT_PATCH :Non-standard settings which are not in vanilla OpenTTD ###length 4 diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index 22d66c8d46..d3038d5592 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -126,6 +126,7 @@ void ScriptConfig::ResetEditableSettings(bool yet_to_start) void ScriptConfig::AddRandomDeviation(CompanyID owner) { + if (GetGameSettings().script.script_disable_param_randomisation) return; for (const auto &item : *this->GetConfigList()) { if (item.random_deviation != 0) { this->SetSetting(item.name, ScriptObject::GetRandomizer(owner).Next(item.random_deviation * 2 + 1) - item.random_deviation + this->GetSetting(item.name)); diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 13ba19a4a6..1bb84b5c57 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -393,14 +393,14 @@ struct ScriptSettingsWindow : public Window { TextColour colour; uint idx = 0; if (config_item.description.empty()) { - if (this->slot != OWNER_DEITY && !Company::IsValidID(this->slot) && config_item.random_deviation != 0) { + if (this->slot != OWNER_DEITY && !Company::IsValidID(this->slot) && config_item.random_deviation != 0 && !GetGameSettings().script.script_disable_param_randomisation) { str = STR_AI_SETTINGS_JUST_DEVIATION; } else { str = STR_JUST_STRING1; } colour = TC_ORANGE; } else { - if (this->slot != OWNER_DEITY && !Company::IsValidID(this->slot) && config_item.random_deviation != 0) { + if (this->slot != OWNER_DEITY && !Company::IsValidID(this->slot) && config_item.random_deviation != 0 && !GetGameSettings().script.script_disable_param_randomisation) { str = STR_AI_SETTINGS_SETTING_DEVIATION; } else { str = STR_AI_SETTINGS_SETTING; @@ -419,7 +419,7 @@ struct ScriptSettingsWindow : public Window { DrawArrowButtons(br.left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value); } - if (this->slot == OWNER_DEITY || Company::IsValidID(this->slot) || config_item.random_deviation == 0) { + if (this->slot == OWNER_DEITY || Company::IsValidID(this->slot) || config_item.random_deviation == 0 || GetGameSettings().script.script_disable_param_randomisation) { auto config_iterator = config_item.labels.find(current_value); if (config_iterator != config_item.labels.end()) { SetDParam(idx++, STR_JUST_RAW_STRING); diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 4bc3c3914a..1de70e6006 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2701,6 +2701,7 @@ static SettingsContainer &GetSettingsTree() { npc->Add(new SettingEntry("script.script_max_opcode_till_suspend")); npc->Add(new SettingEntry("script.script_max_memory_megabytes")); + npc->Add(new SettingEntry("script.script_disable_param_randomisation")); npc->Add(new SettingEntry("difficulty.competitor_speed")); npc->Add(new SettingEntry("ai.ai_in_multiplayer")); npc->Add(new SettingEntry("ai.ai_disable_veh_train")); diff --git a/src/settings_type.h b/src/settings_type.h index f0d971cde9..712578966f 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -568,6 +568,7 @@ struct AISettings { struct ScriptSettings { uint32_t script_max_opcode_till_suspend; ///< max opcode calls till scripts will suspend uint32_t script_max_memory_megabytes; ///< limit on memory a single script instance may have allocated + bool script_disable_param_randomisation; ///< disable script parameter randomisation }; /** Settings related to the new pathfinder. */ diff --git a/src/table/settings/script_settings.ini b/src/table/settings/script_settings.ini index c59c77e8e2..8f9904f9c7 100644 --- a/src/table/settings/script_settings.ini +++ b/src/table/settings/script_settings.ini @@ -76,6 +76,15 @@ pre_cb = CheckScriptMaxMemoryChange post_cb = ScriptMaxMemoryChange cat = SC_EXPERT +[SDT_BOOL] +var = script.script_disable_param_randomisation +flags = SF_PATCH +def = false +str = STR_CONFIG_SETTING_SCRIPT_DISABLE_PARAM_RANDOM +strhelp = STR_CONFIG_SETTING_SCRIPT_DISABLE_PARAM_RANDOM_HELPTEXT +post_cb = [](auto) { InvalidateWindowClassesData(WC_SCRIPT_SETTINGS); InvalidateWindowClassesData(WC_GAME_OPTIONS); } +cat = SC_ADVANCED + [SDT_BOOL] var = ai.ai_in_multiplayer def = true