From 8f22d13fd9d28c7a2a5b65ec1d10239615e9fa80 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Wed, 23 Nov 2022 21:59:27 +0200 Subject: [PATCH] Cache result of evaluating strategicmap.lua (#32) --- Strategic/LuaInitNPCs.cpp | 57 ++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index d91243ba7..ce739e3ff 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -13633,43 +13633,58 @@ static int l_GetNumHostilesInSector( lua_State *L ) void LuaGetIntelAndQuestMapData( INT32 aLevel ) { - const char* filename = "scripts\\strategicmap.lua"; + static LuaScopeState _LS(true); + static bool isInitialized = false; - LuaScopeState _LS( true ); - - IniFunction( _LS.L(), TRUE ); - IniGlobalGameSetting( _LS.L() ); - - SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget ); + // Initialize only once during lifetime of program + if (!isInitialized) + { + isInitialized = true; + IniFunction(_LS.L(), TRUE); + IniGlobalGameSetting(_LS.L()); + const char* filename = "scripts\\strategicmap.lua"; + SGP_THROW_IFFALSE(_LS.L.EvalFile(filename), _BS("Cannot open file: ") << filename << _BS::cget); + } + IniGlobalGameSetting(_LS.L()); LuaFunction( _LS.L, "GetIntelAndQuestMapData" ).Param( aLevel ).Call( 1 ); } void SetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, INT32 sProgressLeft ) { - const char* filename = "scripts\\strategicmap.lua"; + static LuaScopeState _LS(true); + static bool isInitialized = false; - LuaScopeState _LS( true ); - - IniFunction( _LS.L(), TRUE ); - IniGlobalGameSetting( _LS.L() ); - - SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget ); + // Initialize only once during lifetime of program + if (!isInitialized) + { + isInitialized = true; + IniFunction(_LS.L(), TRUE); + IniGlobalGameSetting(_LS.L()); + const char* filename = "scripts\\strategicmap.lua"; + SGP_THROW_IFFALSE(_LS.L.EvalFile(filename), _BS("Cannot open file: ") << filename << _BS::cget); + } + IniGlobalGameSetting(_LS.L()); LuaFunction( _LS.L, "SetFactoryLeftoverProgress" ).Param( sSectorX ).Param( sSectorY ).Param( bSectorZ ).Param( usFacilityType ).Param( usProductionNumber ).Param( sProgressLeft ).Call( 6 ); } INT32 GetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber ) { - const char* filename = "scripts\\strategicmap.lua"; + static LuaScopeState _LS( true ); + static bool isInitialized = false; - LuaScopeState _LS( true ); - - IniFunction( _LS.L(), TRUE ); - IniGlobalGameSetting( _LS.L() ); - - SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget ); + // Initialize only once during lifetime of program + if (!isInitialized) + { + isInitialized = true; + IniFunction( _LS.L(), TRUE ); + IniGlobalGameSetting(_LS.L()); + const char* filename = "scripts\\strategicmap.lua"; + SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget ); + } + IniGlobalGameSetting(_LS.L()); LuaFunction( _LS.L, "GetFactoryLeftoverProgress" ).Param( sSectorX ).Param( sSectorY ).Param( bSectorZ ).Param( usFacilityType ).Param( usProductionNumber ).Call( 5 ); if ( lua_gettop( _LS.L() ) >= 0 )