From b3bd1bb5adfb6e9b819deb647d4976752be15009 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 21 Feb 2024 17:56:57 +0000 Subject: [PATCH] Use upstream load for non-table script chunks --- src/sl/ai_sl.cpp | 77 +----------------------------- src/sl/game_sl.cpp | 116 +-------------------------------------------- 2 files changed, 3 insertions(+), 190 deletions(-) diff --git a/src/sl/ai_sl.cpp b/src/sl/ai_sl.cpp index 01d4ff861e..56bebf4299 100644 --- a/src/sl/ai_sl.cpp +++ b/src/sl/ai_sl.cpp @@ -8,87 +8,12 @@ /** @file ai_sl.cpp Handles the saveload part of the AIs */ #include "../stdafx.h" -#include "../company_base.h" -#include "../debug.h" #include "saveload.h" -#include "../string_func.h" - -#include "../ai/ai.hpp" -#include "../ai/ai_config.hpp" -#include "../network/network.h" -#include "../ai/ai_instance.hpp" #include "../safeguards.h" -static std::string _ai_saveload_name; -static int _ai_saveload_version; -static std::string _ai_saveload_settings; -static bool _ai_saveload_is_random; - -static const SaveLoad _ai_company[] = { - SLEG_SSTR(_ai_saveload_name, SLE_STR), - SLEG_SSTR(_ai_saveload_settings, SLE_STR), - SLEG_CONDVAR(_ai_saveload_version, SLE_UINT32, SLV_108, SL_MAX_VERSION), - SLEG_CONDVAR(_ai_saveload_is_random, SLE_BOOL, SLV_136, SLV_AI_LOCAL_CONFIG), -}; - -static void Load_AIPL() -{ - /* Free all current data */ - for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { - AIConfig::GetConfig(c, AIConfig::SSS_FORCE_GAME)->Change(std::nullopt); - } - - CompanyID index; - while ((index = (CompanyID)SlIterateArray()) != (CompanyID)-1) { - if (index >= MAX_COMPANIES) SlErrorCorrupt("Too many AI configs"); - - _ai_saveload_is_random = false; - _ai_saveload_version = -1; - SlObject(nullptr, _ai_company); - - if (_game_mode == GM_MENU || (_networking && !_network_server)) { - if (Company::IsValidAiID(index)) AIInstance::LoadEmpty(); - continue; - } - - AIConfig *config = AIConfig::GetConfig(index, AIConfig::SSS_FORCE_GAME); - if (_ai_saveload_name.empty() || _ai_saveload_is_random) { - /* A random AI. */ - config->Change(std::nullopt, -1, false); - } else { - config->Change(_ai_saveload_name, _ai_saveload_version, false); - if (!config->HasScript()) { - /* No version of the AI available that can load the data. Try to load the - * latest version of the AI instead. */ - config->Change(_ai_saveload_name, -1, false); - if (!config->HasScript()) { - if (_ai_saveload_name.compare("%_dummy") != 0) { - DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name.c_str(), _ai_saveload_version); - DEBUG(script, 0, "A random other AI will be loaded in its place."); - } else { - DEBUG(script, 0, "The savegame had no AIs available at the time of saving."); - DEBUG(script, 0, "A random available AI will be loaded now."); - } - } else { - DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name.c_str(), _ai_saveload_version); - DEBUG(script, 0, "The latest version of that AI has been loaded instead, but it'll not get the savegame data as it's incompatible."); - } - /* Make sure the AI doesn't get the saveload data, as it was not the - * writer of the saveload data in the first place */ - _ai_saveload_version = -1; - } - } - - config->StringToSettings(_ai_saveload_settings); - - /* Load the AI saved data */ - if (Company::IsValidAiID(index)) config->SetToLoadData(AIInstance::Load(_ai_saveload_version)); - } -} - static const ChunkHandler ai_chunk_handlers[] = { - MakeSaveUpstreamFeatureConditionalLoadUpstreamChunkHandler<'AIPL', XSLFI_TABLE_SCRIPT_SL>(Load_AIPL, nullptr, nullptr), + MakeUpstreamChunkHandler<'AIPL', GeneralUpstreamChunkLoadInfo>(), }; extern const ChunkHandlerTable _ai_chunk_handlers(ai_chunk_handlers); diff --git a/src/sl/game_sl.cpp b/src/sl/game_sl.cpp index 162f0b19bc..dc69625d3a 100644 --- a/src/sl/game_sl.cpp +++ b/src/sl/game_sl.cpp @@ -8,125 +8,13 @@ /** @file game_sl.cpp Handles the saveload part of the GameScripts */ #include "../stdafx.h" -#include "../debug.h" #include "saveload.h" -#include "../string_func.h" - -#include "../game/game.hpp" -#include "../game/game_config.hpp" -#include "../network/network.h" -#include "../game/game_instance.hpp" -#include "../game/game_text.hpp" #include "../safeguards.h" -static std::string _game_saveload_name; -static int _game_saveload_version; -static std::string _game_saveload_settings; -static bool _game_saveload_is_random; - -static const SaveLoad _game_script[] = { - SLEG_SSTR(_game_saveload_name, SLE_STR), - SLEG_SSTR(_game_saveload_settings, SLE_STR), - SLEG_VAR(_game_saveload_version, SLE_UINT32), - SLEG_VAR(_game_saveload_is_random, SLE_BOOL), -}; - -static void Load_GSDT() -{ - /* Free all current data */ - GameConfig::GetConfig(GameConfig::SSS_FORCE_GAME)->Change(std::nullopt); - - if ((CompanyID)SlIterateArray() == (CompanyID)-1) return; - - _game_saveload_version = -1; - SlObject(nullptr, _game_script); - - if (_game_mode == GM_MENU || (_networking && !_network_server)) { - GameInstance::LoadEmpty(); - if ((CompanyID)SlIterateArray() != (CompanyID)-1) SlErrorCorrupt("Too many GameScript configs"); - return; - } - - GameConfig *config = GameConfig::GetConfig(GameConfig::SSS_FORCE_GAME); - if (!_game_saveload_name.empty()) { - config->Change(_game_saveload_name, _game_saveload_version, false); - if (!config->HasScript()) { - /* No version of the GameScript available that can load the data. Try to load the - * latest version of the GameScript instead. */ - config->Change(_game_saveload_name, -1, false); - if (!config->HasScript()) { - if (_game_saveload_name.compare("%_dummy") != 0) { - DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name.c_str(), _game_saveload_version); - DEBUG(script, 0, "This game will continue to run without GameScript."); - } else { - DEBUG(script, 0, "The savegame had no GameScript available at the time of saving."); - DEBUG(script, 0, "This game will continue to run without GameScript."); - } - } else { - DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name.c_str(), _game_saveload_version); - DEBUG(script, 0, "The latest version of that GameScript has been loaded instead, but it'll not get the savegame data as it's incompatible."); - } - /* Make sure the GameScript doesn't get the saveload data, as it was not the - * writer of the saveload data in the first place */ - _game_saveload_version = -1; - } - } - - config->StringToSettings(_game_saveload_settings); - - /* Load the GameScript saved data */ - config->SetToLoadData(GameInstance::Load(_game_saveload_version)); - - if ((CompanyID)SlIterateArray() != (CompanyID)-1) SlErrorCorrupt("Too many GameScript configs"); -} - -extern GameStrings *_current_data; - -static std::string _game_saveload_string; -static uint _game_saveload_strings; - -static const SaveLoad _game_language_header[] = { - SLEG_SSTR(_game_saveload_string, SLE_STR), - SLEG_VAR(_game_saveload_strings, SLE_UINT32), -}; - -static const SaveLoad _game_language_string[] = { - SLEG_SSTR(_game_saveload_string, SLE_STR | SLF_ALLOW_CONTROL), -}; - -static void Load_GSTR() -{ - delete _current_data; - _current_data = new GameStrings(); - - while (SlIterateArray() != -1) { - _game_saveload_string.clear(); - SlObject(nullptr, _game_language_header); - - LanguageStrings ls(_game_saveload_string); - for (uint i = 0; i < _game_saveload_strings; i++) { - SlObject(nullptr, _game_language_string); - ls.lines.emplace_back(_game_saveload_string); - } - - _current_data->raw_strings.push_back(std::move(ls)); - } - - /* If there were no strings in the savegame, set GameStrings to nullptr */ - if (_current_data->raw_strings.size() == 0) { - delete _current_data; - _current_data = nullptr; - return; - } - - _current_data->Compile(); - ReconsiderGameScriptLanguage(); -} - static const ChunkHandler game_chunk_handlers[] = { - MakeSaveUpstreamFeatureConditionalLoadUpstreamChunkHandler<'GSTR', XSLFI_TABLE_SCRIPT_SL>(Load_GSTR, nullptr, nullptr), - MakeSaveUpstreamFeatureConditionalLoadUpstreamChunkHandler<'GSDT', XSLFI_TABLE_SCRIPT_SL>(Load_GSDT, nullptr, nullptr), + MakeUpstreamChunkHandler<'GSTR', GeneralUpstreamChunkLoadInfo>(), + MakeUpstreamChunkHandler<'GSDT', GeneralUpstreamChunkLoadInfo>(), }; extern const ChunkHandlerTable _game_chunk_handlers(game_chunk_handlers);