summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ai/ai.hpp2
-rw-r--r--src/ai/ai_config.cpp11
-rw-r--r--src/ai/ai_config.hpp1
-rw-r--r--src/company_cmd.cpp18
-rw-r--r--src/script/script_config.hpp2
5 files changed, 26 insertions, 8 deletions
diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp
index 065367d03..1b5b6c07d 100644
--- a/src/ai/ai.hpp
+++ b/src/ai/ai.hpp
@@ -32,7 +32,7 @@ public:
START_NEXT_EASY = DAYS_IN_YEAR * 2,
START_NEXT_MEDIUM = DAYS_IN_YEAR,
START_NEXT_HARD = DAYS_IN_YEAR / 2,
- START_NEXT_MIN = 1,
+ START_NEXT_MIN = 0,
START_NEXT_MAX = 3600,
START_NEXT_DEVIATION = 60,
};
diff --git a/src/ai/ai_config.cpp b/src/ai/ai_config.cpp
index f920d3101..20e913c2e 100644
--- a/src/ai/ai_config.cpp
+++ b/src/ai/ai_config.cpp
@@ -118,3 +118,14 @@ void AIConfig::SetSetting(const char *name, int value)
ScriptConfig::SetSetting(name, value);
}
+
+void AIConfig::AddRandomDeviation()
+{
+ int start_date = this->GetSetting("start_date");
+
+ ScriptConfig::AddRandomDeviation();
+
+ /* start_date = 0 is a special case, where random deviation does not occur.
+ * If start_date was not already 0, then a minimum value of 1 must apply. */
+ this->SetSetting("start_date", start_date != 0 ? max(1, this->GetSetting("start_date")) : 0);
+}
diff --git a/src/ai/ai_config.hpp b/src/ai/ai_config.hpp
index b02935902..600ae1af9 100644
--- a/src/ai/ai_config.hpp
+++ b/src/ai/ai_config.hpp
@@ -34,6 +34,7 @@ public:
/* virtual */ int GetSetting(const char *name) const;
/* virtual */ void SetSetting(const char *name, int value);
+ /* virtual */ void AddRandomDeviation();
/**
* When ever the AI Scanner is reloaded, all infos become invalid. This
diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp
index be75d94c8..cf66690f4 100644
--- a/src/company_cmd.cpp
+++ b/src/company_cmd.cpp
@@ -595,10 +595,10 @@ void StartupCompanies()
}
/** Start a new competitor company if possible. */
-static void MaybeStartNewCompany()
+static bool MaybeStartNewCompany()
{
#ifdef ENABLE_NETWORK
- if (_networking && Company::GetNumItems() >= _settings_client.network.max_companies) return;
+ if (_networking && Company::GetNumItems() >= _settings_client.network.max_companies) return false;
#endif /* ENABLE_NETWORK */
Company *c;
@@ -612,8 +612,10 @@ static void MaybeStartNewCompany()
if (n < (uint)_settings_game.difficulty.max_no_competitors) {
/* Send a command to all clients to start up a new AI.
* Works fine for Multiplayer and Singleplayer */
- DoCommandP(0, 1 | INVALID_COMPANY << 16, 0, CMD_COMPANY_CTRL);
+ return DoCommandP(0, 1 | INVALID_COMPANY << 16, 0, CMD_COMPANY_CTRL);
}
+
+ return false;
}
/** Initialize the pool of companies. */
@@ -714,11 +716,15 @@ void OnTick_Companies()
}
if (_next_competitor_start == 0) {
- _next_competitor_start = AI::GetStartNextTime() * DAY_TICKS;
+ /* AI::GetStartNextTime() can return 0. */
+ _next_competitor_start = max(1, AI::GetStartNextTime() * DAY_TICKS);
}
- if (AI::CanStartNew() && _game_mode != GM_MENU && --_next_competitor_start == 0) {
- MaybeStartNewCompany();
+ if (_game_mode != GM_MENU && AI::CanStartNew() && --_next_competitor_start == 0) {
+ /* Allow multiple AIs to possibly start in the same tick. */
+ do {
+ if (!MaybeStartNewCompany()) break;
+ } while (AI::GetStartNextTime() == 0);
}
_cur_company_tick_index = (_cur_company_tick_index + 1) % MAX_COMPANIES;
diff --git a/src/script/script_config.hpp b/src/script/script_config.hpp
index dfc675473..3dfd6bb0b 100644
--- a/src/script/script_config.hpp
+++ b/src/script/script_config.hpp
@@ -139,7 +139,7 @@ public:
/**
* Randomize all settings the Script requested to be randomized.
*/
- void AddRandomDeviation();
+ virtual void AddRandomDeviation();
/**
* Is this config attached to an Script? In other words, is there a Script