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