diff options
author | yexo <yexo@openttd.org> | 2011-06-03 19:18:39 +0000 |
---|---|---|
committer | yexo <yexo@openttd.org> | 2011-06-03 19:18:39 +0000 |
commit | cf11a1e98e4d5a4bfc6929b78a9fb28108f763a8 (patch) | |
tree | 92917d8ce904d002e0b034df3d0df6db2d27f49b /src/ai/ai_core.cpp | |
parent | b1812c9b02a3975f0d3f9a12e23f961717df22a0 (diff) | |
download | openttd-cf11a1e98e4d5a4bfc6929b78a9fb28108f763a8.tar.xz |
(svn r22534) -Fix [FS#4631] (r21250): doing rescan_ai in a game with running AIs caused a crash
Diffstat (limited to 'src/ai/ai_core.cpp')
-rw-r--r-- | src/ai/ai_core.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index 1c7005b74..f92d511c2 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -170,13 +170,24 @@ * a random new AI on reload). */ for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { if (_settings_game.ai_config[c] != NULL && _settings_game.ai_config[c]->HasAI()) { - if (!_settings_game.ai_config[c]->ResetInfo()) { + if (!_settings_game.ai_config[c]->ResetInfo(true)) { DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_game.ai_config[c]->GetName()); _settings_game.ai_config[c]->ChangeAI(NULL); + if (Company::IsValidAiID(c)) { + /* The code belonging to an already running AI was deleted. We can only do + * one thing here to keep everything sane and that is kill the AI. After + * killing the offending AI we start a random other one in it's place, just + * like what would happen if the AI was missing during loading. */ + AI::Stop(c); + AI::StartNew(c, false); + } + } else if (Company::IsValidAiID(c)) { + /* Update the reference in the Company struct. */ + Company::Get(c)->ai_info = _settings_game.ai_config[c]->GetInfo(); } } if (_settings_newgame.ai_config[c] != NULL && _settings_newgame.ai_config[c]->HasAI()) { - if (!_settings_newgame.ai_config[c]->ResetInfo()) { + if (!_settings_newgame.ai_config[c]->ResetInfo(false)) { DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_newgame.ai_config[c]->GetName()); _settings_newgame.ai_config[c]->ChangeAI(NULL); } |