diff --git a/sfall/Modules/ScriptExtender.cpp b/sfall/Modules/ScriptExtender.cpp index 42682be8..51f23cf0 100644 --- a/sfall/Modules/ScriptExtender.cpp +++ b/sfall/Modules/ScriptExtender.cpp @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -//#include +#include #include #include @@ -72,10 +72,9 @@ struct GlobalScript { int count; int repeat; int mode; // 0 - local map loop, 1 - input loop, 2 - world map loop, 3 - local and world map loops - int isLoading; // used for the return value of the game_loaded function //GlobalScript() {} - GlobalScript(ScriptProgram script) : prog(script), startProc(-1), count(0), repeat(0), mode(0), isLoading(1) {} + GlobalScript(ScriptProgram script) : prog(script), startProc(-1), count(0), repeat(0), mode(0) {} }; struct ExportedVar { @@ -115,6 +114,7 @@ static std::list timerEventScripts; static std::vector globalScriptFilesList; static std::vector globalScripts; +static std::unordered_set checkedScripts; // a map of all sfall programs (global and hook scripts) by thier scriptPtr typedef std::unordered_map SfallProgsMap; @@ -675,6 +675,8 @@ static void PrepareGlobalScriptsList() { } fo::func::db_free_file_list(&filenames, 0); globalScripts.reserve(globalScriptFilesList.size()); + float bCount = globalScriptFilesList.size() / checkedScripts.max_load_factor(); + checkedScripts.rehash(static_cast(bCount) + (bCount > static_cast(bCount) ? 1 : 0)); // ceil } // this runs before the game was loaded/started @@ -697,20 +699,10 @@ static struct { } lastProgram = {nullptr}; int __stdcall ScriptExtender::ScriptHasLoaded(fo::Program* script) { - if (lastProgram.script == script) { // fast check - return globalScripts[lastProgram.index].isLoading; + if (checkedScripts.find(script) != checkedScripts.end()) { + return 0; // has already been called from the script } - for (size_t i = 0; i < globalScripts.size(); i++) { - if (globalScripts[i].prog.ptr == script) { - int loaded = globalScripts[i].isLoading; - if (loaded) globalScripts[i].isLoading = 0; - - lastProgram.script = script; - lastProgram.index = i; - return loaded; - } - } - // error: global script not found + checkedScripts.insert(script); return 1; } @@ -718,9 +710,9 @@ int __stdcall ScriptExtender::ScriptHasLoaded(fo::Program* script) { static void ClearGlobalScripts() { devlog_f("\nReset global scripts.", DL_MAIN); isGameReset = true; - lastProgram.script = nullptr; sfallProgsMap.clear(); globalScripts.clear(); + checkedScripts.clear(); selfOverrideMap.clear(); globalExportedVars.clear(); timerEventScripts.clear(); diff --git a/sfall/stdafx.h b/sfall/stdafx.h index 3f239d8b..44e77f4f 100644 --- a/sfall/stdafx.h +++ b/sfall/stdafx.h @@ -7,8 +7,10 @@ #include #include #include +#include #include #include +#include //#define WIN32_LEAN_AND_MEAN #define NOCRYPT