mirror of https://github.com/OpenTTD/OpenTTD
Change: Allow AI companies to start immediately.
Allow multiple AIs to possibly start in the same tick. start_date = 0 becomes a special case, where random deviation does not occur. If start_date was not already 0, then a minimum value of 1 must apply.pull/7163/head
parent
fa53abe864
commit
011257dc88
|
@ -32,7 +32,7 @@ public:
|
||||||
START_NEXT_EASY = DAYS_IN_YEAR * 2,
|
START_NEXT_EASY = DAYS_IN_YEAR * 2,
|
||||||
START_NEXT_MEDIUM = DAYS_IN_YEAR,
|
START_NEXT_MEDIUM = DAYS_IN_YEAR,
|
||||||
START_NEXT_HARD = DAYS_IN_YEAR / 2,
|
START_NEXT_HARD = DAYS_IN_YEAR / 2,
|
||||||
START_NEXT_MIN = 1,
|
START_NEXT_MIN = 0,
|
||||||
START_NEXT_MAX = 3600,
|
START_NEXT_MAX = 3600,
|
||||||
START_NEXT_DEVIATION = 60,
|
START_NEXT_DEVIATION = 60,
|
||||||
};
|
};
|
||||||
|
|
|
@ -118,3 +118,14 @@ void AIConfig::SetSetting(const char *name, int value)
|
||||||
|
|
||||||
ScriptConfig::SetSetting(name, 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);
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ int GetSetting(const char *name) const;
|
/* virtual */ int GetSetting(const char *name) const;
|
||||||
/* virtual */ void SetSetting(const char *name, int value);
|
/* virtual */ void SetSetting(const char *name, int value);
|
||||||
|
/* virtual */ void AddRandomDeviation();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When ever the AI Scanner is reloaded, all infos become invalid. This
|
* When ever the AI Scanner is reloaded, all infos become invalid. This
|
||||||
|
|
|
@ -595,10 +595,10 @@ void StartupCompanies()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Start a new competitor company if possible. */
|
/** Start a new competitor company if possible. */
|
||||||
static void MaybeStartNewCompany()
|
static bool MaybeStartNewCompany()
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_NETWORK
|
#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 */
|
#endif /* ENABLE_NETWORK */
|
||||||
|
|
||||||
Company *c;
|
Company *c;
|
||||||
|
@ -612,8 +612,10 @@ static void MaybeStartNewCompany()
|
||||||
if (n < (uint)_settings_game.difficulty.max_no_competitors) {
|
if (n < (uint)_settings_game.difficulty.max_no_competitors) {
|
||||||
/* Send a command to all clients to start up a new AI.
|
/* Send a command to all clients to start up a new AI.
|
||||||
* Works fine for Multiplayer and Singleplayer */
|
* 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. */
|
/** Initialize the pool of companies. */
|
||||||
|
@ -714,11 +716,15 @@ void OnTick_Companies()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_next_competitor_start == 0) {
|
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) {
|
if (_game_mode != GM_MENU && AI::CanStartNew() && --_next_competitor_start == 0) {
|
||||||
MaybeStartNewCompany();
|
/* 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;
|
_cur_company_tick_index = (_cur_company_tick_index + 1) % MAX_COMPANIES;
|
||||||
|
|
|
@ -139,7 +139,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Randomize all settings the Script requested to be randomized.
|
* 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
|
* Is this config attached to an Script? In other words, is there a Script
|
||||||
|
|
Loading…
Reference in New Issue