diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -61,6 +61,9 @@ void AIInstance::Died() { ScriptInstance::Died(); + /* Intro is not supposed to use AI, but it may have 'dummy' AI which instant dies. */ + if (_game_mode == GM_MENU) return; + ShowAIDebugWindow(_current_company); const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo(); diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../debug.h" #include "../network/network.h" +#include "../openttd.h" #include "../core/random_func.hpp" #include "../script/squirrel_class.hpp" @@ -59,6 +60,11 @@ void AIScannerInfo::RegisterAPI(class Sq AIInfo *AIScannerInfo::SelectRandomAI() const { + if (_game_mode == GM_MENU) { + Debug(script, 0, "The intro game should not use AI, loading 'dummy' AI."); + return this->info_dummy; + } + uint num_random_ais = 0; for (const auto &item : info_single_list) { AIInfo *i = static_cast(item.second); diff --git a/src/saveload/ai_sl.cpp b/src/saveload/ai_sl.cpp --- a/src/saveload/ai_sl.cpp +++ b/src/saveload/ai_sl.cpp @@ -77,7 +77,7 @@ struct AIPLChunkHandler : ChunkHandler { _ai_saveload_version = -1; SlObject(nullptr, slt); - if (_networking && !_network_server) { + if (_game_mode == GM_MENU || (_networking && !_network_server)) { if (Company::IsValidAiID(index)) AIInstance::LoadEmpty(); continue; } diff --git a/src/saveload/game_sl.cpp b/src/saveload/game_sl.cpp --- a/src/saveload/game_sl.cpp +++ b/src/saveload/game_sl.cpp @@ -69,7 +69,7 @@ struct GSDTChunkHandler : ChunkHandler { _game_saveload_version = -1; SlObject(nullptr, slt); - if (_networking && !_network_server) { + if (_game_mode == GM_MENU || (_networking && !_network_server)) { GameInstance::LoadEmpty(); if (SlIterateArray() != -1) SlErrorCorrupt("Too many GameScript configs"); return;