From 55fcd1b51328a0393c79c726de60f973d2749478 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Tue, 6 Feb 2024 23:04:15 -0800 Subject: [PATCH 01/61] exported functions for separate DLL use --- EmuAPI/emu/EmuBase.h | 20 ++++++++++++++++++++ EmuAPI/resources/ZooState.h | 17 ++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/EmuAPI/emu/EmuBase.h b/EmuAPI/emu/EmuBase.h index 95c6897..b8761da 100644 --- a/EmuAPI/emu/EmuBase.h +++ b/EmuAPI/emu/EmuBase.h @@ -1,12 +1,32 @@ #ifndef EMUBASE_H #define EMUBASE_H +#ifndef EMU_EXPORTS +#define EMU_API __declspec(dllexport) +#else +#define EMU_API __declspec(dllimport) +#endif + #include "Windows.h" #include #include #include #include +extern "C" { + EMU_API bool SingleKey(const int key) { + return EmuBase::SingleKey(key); + } + + EMU_API bool DoubleKey(const int key1, const int key2) { + return EmuBase::DoubleKey(key1, key2); + } + + EMU_API bool TripleKey(const int key1, const int key2, const int key3) { + return EmuBase::TripleKey(key1, key2, key3); + } +} + typedef __int32 uint32_t; class EmuBase diff --git a/EmuAPI/resources/ZooState.h b/EmuAPI/resources/ZooState.h index 8cd2262..f72eed1 100644 --- a/EmuAPI/resources/ZooState.h +++ b/EmuAPI/resources/ZooState.h @@ -1,6 +1,12 @@ #ifndef ZOOSTATE_H #define ZOOSTATE_H +#ifndef EMU_EXPORTS +#define EMU_API __declspec(dllexport) +#else +#define EMU_API __declspec(dllimport) +#endif + #include "EmuBase.h" #include #include @@ -11,7 +17,16 @@ #include "detours.h" #include "ZooModels.h" - +extern "C" { + EMU_API void FreezeGameState(bool); + EMU_API void PauseGame(bool); + EMU_API bool IsGamePaused(); + EMU_API void SetZooBudget(float); + EMU_API float GetZooBudget(); + EMU_API void AddToZooBudget(float); + EMU_API void EnableDevMode(bool); + EMU_API bool IsDevModeEnabled(); +} class ZooState { From 1a397a17eb1902c01dcac603d24fa08af0f9b979 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Thu, 29 Feb 2024 18:07:07 -0800 Subject: [PATCH 02/61] working reimplementation of ztgamemgr --- EmuAPI/EmuAPI.vcproj | 14 ++++++- EmuAPI/EmuLoader.cpp | 28 +++++++++++++ EmuAPI/emu/EmuBase.h | 32 +++++++------- EmuAPI/reimp/ZTGameMgr.cpp | 31 ++++++++++++++ EmuAPI/reimp/ZTGameMgr.h | 85 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 173 insertions(+), 17 deletions(-) create mode 100644 EmuAPI/reimp/ZTGameMgr.cpp create mode 100644 EmuAPI/reimp/ZTGameMgr.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 6c33326..7598156 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -115,7 +115,7 @@ Optimization="0" EnableIntrinsicFunctions="false" WholeProgramOptimization="false" - AdditionalIncludeDirectories=""$(ProjectDir)";"$(ProjectDir)\emu";"$(ProjectDir)\lua\include";"$(ProjectDir)\resources";"$(ProjectDir)\lua\";"$(ProjectDir)\detours\"" + AdditionalIncludeDirectories=""$(ProjectDir)";"$(ProjectDir)\emu";"$(ProjectDir)\lua\include";"$(ProjectDir)\resources";"$(ProjectDir)\lua\";"$(ProjectDir)\detours\";"$(ProjectDir)\reimp\"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EMUAPI_EXPORTS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" @@ -289,6 +289,18 @@ > + + + + + + diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 2b48bb0..4b75196 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -20,6 +20,7 @@ #include "EmuScriptMgr.h" #include #include "ZooModels.h" +#include "ZTGameMgr.h" //------ Flags for console bool IsConsoleRunning = false; @@ -36,6 +37,9 @@ DWORD WINAPI ZooConsole(LPVOID lpParameter); DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function +DWORD exitBuildingAddress = 0x4a75bb; // address of exit building function in the game +// typedef void* (__thiscall *_origexitBuildingAddress)(void* thisptr, int *param_1); // define original update function + //------ Namespace and class aliases #define fs std::filesystem @@ -47,6 +51,10 @@ EmuScriptMgr sm; // script manager object std::vector tokens; // contains tokens from console input EmuConsole console(tokens); // console object +DWORD addCashAddress = 0x40f018; // address of addCash function in the game +typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function + + //------ ZooModels object extern ZooModels* zoo_models; ZooModels* zoo_models = new ZooModels(); @@ -57,6 +65,11 @@ DWORD setGuestRatingAddress = 0x0041D15D; //------ Function definitions +void __fastcall addCash_Detour(void* ptr, float amount) { + // detour function for adding cash to the game + ZTGameMgr::shared_instance().addCash(amount); +} + void __fastcall RunEmu(void* thisptr) { // main loop @@ -148,6 +161,7 @@ typedef void (__cdecl *_setAnimalRating)(int); // define original setAnimalRatin typedef void (__cdecl *_setZooRating)(int); // define original setZooRating function typedef void (__cdecl *_setGuestRating)(int); // define original setGuestRating function + void __cdecl SetGuestRating(int rating) { _setGuestRating ogSetGuestRating = (_setGuestRating)setGuestRatingAddress; if (zoo_models->_emuGuestRatingSet == true) { @@ -172,6 +186,17 @@ void __cdecl SetAnimalRating(int rating) { ogSetAnimalRating(rating); } +// void* __fastcall exitBuilding(void* thisptr, unsigned int edx, int *param_1) { +// // std::ofstream f; +// // f.open("emu.log", std::ios_base::app); +// // f << "Exit building called!" << std::endl; +// // f << "thisptr: " << thisptr << std::endl; +// // f << "param_1: " << param_1 << std::endl; +// // f.close(); +// _origexitBuildingAddress ogexitBuilding = (_origexitBuildingAddress)exitBuildingAddress; +// return ogexitBuilding(thisptr, param_1); +// } + // ------ DllMain @@ -201,10 +226,13 @@ BOOL APIENTRY DllMain(HMODULE hModule, //------ Detour update function to run emu and sync with main game thread DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); + // ZTGameMgr::init(); DetourAttach((PVOID*)&updateAddress, (PVOID)&RunEmu); DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); + DetourAttach((PVOID*)&addCashAddress, (PVOID)&addCash_Detour); + //DetourAttach((PVOID*)&exitBuildingAddress, (PVOID)&exitBuilding); DetourTransactionCommit(); diff --git a/EmuAPI/emu/EmuBase.h b/EmuAPI/emu/EmuBase.h index b8761da..f3363ab 100644 --- a/EmuAPI/emu/EmuBase.h +++ b/EmuAPI/emu/EmuBase.h @@ -1,11 +1,11 @@ #ifndef EMUBASE_H #define EMUBASE_H -#ifndef EMU_EXPORTS -#define EMU_API __declspec(dllexport) -#else -#define EMU_API __declspec(dllimport) -#endif +// #ifndef EMU_EXPORTS +// #define EMU_API __declspec(dllexport) +// #else +// #define EMU_API __declspec(dllimport) +// #endif #include "Windows.h" #include @@ -13,19 +13,19 @@ #include #include -extern "C" { - EMU_API bool SingleKey(const int key) { - return EmuBase::SingleKey(key); - } +// extern "C" { +// EMU_API bool SingleKey(const int key) { +// return EmuBase::SingleKey(key); +// } - EMU_API bool DoubleKey(const int key1, const int key2) { - return EmuBase::DoubleKey(key1, key2); - } +// EMU_API bool DoubleKey(const int key1, const int key2) { +// return EmuBase::DoubleKey(key1, key2); +// } - EMU_API bool TripleKey(const int key1, const int key2, const int key3) { - return EmuBase::TripleKey(key1, key2, key3); - } -} +// EMU_API bool TripleKey(const int key1, const int key2, const int key3) { +// return EmuBase::TripleKey(key1, key2, key3); +// } +// } typedef __int32 uint32_t; diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp new file mode 100644 index 0000000..665c4ce --- /dev/null +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -0,0 +1,31 @@ +#include "ZTGameMgr.h" + + + +ZTGameMgr::ZTGameMgr() { + // constructor + this->zoo_budget = 0.0; + this->num_animals = 0; + this->num_species = 0; + this->guest_count = 0; + + // initialize detour function pointers + +} + +void ZTGameMgr::init() { + // initialize instance of ZTGameMgr + // initialize detour function pointers + DWORD addCashAddress = 0x40f018; // address of addCash function in the game + // DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); +} + +void ZTGameMgr::addCash(float amount) { + // add cash to the game + this->zoo_budget += amount; +} + +ZTGameMgr::~ZTGameMgr() { + // destructor + // clean up detour function pointers +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h new file mode 100644 index 0000000..a34f8e3 --- /dev/null +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -0,0 +1,85 @@ +#ifndef ZTGAMEMGR_h +#define ZTGAMEMGR_h + +#include // must always be above detours.h +#include +#include "EmuBase.h" + + +typedef __int32 int32_t; + +class ZTGameMgr +{ +public: + char pad_0000[12]; //0x0000 + float zoo_budget; //0x000C + char pad_0010[32]; //0x0010 + int num_animals; //0x0030 + char pad_0034[4]; //0x0034 + int num_species; //0x0038 + char pad_003C[24]; //0x003C + int guest_count; //0x0054 + char pad_0058[364]; //0x0058 + float animal_purchase_costs[12]; //0x01C4 + float construction_costs[12]; //0x01F4 + float N000000C2[12]; //0x0224 + float admissions_income[12]; //0x0254 + float concessions_benefits[12]; //0x0284 + float N000000C5[12]; //0x02B4 + float N000000C6[12]; //0x02E4 + float N000000C7[12]; //0x0314 + float N000000C8[12]; //0x0344 + float N000000C9[12]; //0x0374 + float N000000CA[12]; //0x03A4 + float N000000CB[12]; //0x03D4 + float zoo_profits[12]; //0x0404 + float zoo_values[12]; //0x0434 + float zoo_ratings[12]; //0x0464 + float N000000D0[12]; //0x0494 + float N000000D1[12]; //0x04C4 + float N000000D2[12]; //0x04F4 + float N000000D3[12]; //0x0524 + float N000000D4[12]; //0x0554 + float N000000D5[12]; //0x0584 + float N000000D6[12]; //0x05B4 + float N000000D7[12]; //0x05E4 + float number_of_guests[12][4]; //0x0614 + float N000000D9[12]; //0x0644 + float N000000DA[12]; //0x0674 + float N000000DB[12]; //0x06A4 + float N000000DC[12]; //0x06D4 + float N000000DD[12]; //0x0704 + float N000000DE[12]; //0x0734 + float N000000DF[12]; //0x0764 + float N000000E0[12]; //0x0794 + float N000000E1[12]; //0x07C4 + float N000000E2[12]; //0x07F4 + float N000000E3[12]; //0x0824 + float N000000F2[12]; //0x0854 + float N000000F3[12]; //0x0884 + float N000000F4[12]; //0x08B4 + float N000000F5[12]; //0x08E4 + float N000000F6[12]; //0x0914 + float N000000F7[12]; //0x0944 + float N000000F8[12]; //0x0974 + float N000000F9[12]; //0x09A4 + float N000000FA[12]; //0x09D4 + float N000000FB[12]; //0x0A04 + float N000000FC[12]; //0x0A34 + float N000000FD[12]; //0x0A64 + float N000000FE[12]; //0x0A94 + char pad_0AC4[1520]; //0x0AC4 + + ZTGameMgr(); + ~ZTGameMgr(); + void addCash(float); + + static void init(); + static ZTGameMgr &shared_instance() { + static ZTGameMgr instance; + return instance; + } + +}; //Size: 0x10B4 + +#endif // ZTGAMEMGR_h \ No newline at end of file From 0bfc16ef8c99b4be6005b2b8793caca158ec0220 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Thu, 29 Feb 2024 21:27:04 -0800 Subject: [PATCH 03/61] successfully moved addcash detour to ztgamemgr class --- EmuAPI/EmuLoader.cpp | 15 +++++++-------- EmuAPI/reimp/ZTGameMgr.cpp | 20 +++++++++++++++++++- EmuAPI/reimp/ZTGameMgr.h | 6 +++++- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 4b75196..f9b18b7 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -51,8 +51,6 @@ EmuScriptMgr sm; // script manager object std::vector tokens; // contains tokens from console input EmuConsole console(tokens); // console object -DWORD addCashAddress = 0x40f018; // address of addCash function in the game -typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function //------ ZooModels object @@ -65,10 +63,10 @@ DWORD setGuestRatingAddress = 0x0041D15D; //------ Function definitions -void __fastcall addCash_Detour(void* ptr, float amount) { - // detour function for adding cash to the game - ZTGameMgr::shared_instance().addCash(amount); -} +// void __fastcall addCash_Detour(void* ptr, float amount) { +// // detour function for adding cash to the game +// ZTGameMgr::shared_instance().addCash(amount); +// } void __fastcall RunEmu(void* thisptr) { @@ -226,15 +224,16 @@ BOOL APIENTRY DllMain(HMODULE hModule, //------ Detour update function to run emu and sync with main game thread DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - // ZTGameMgr::init(); + DetourAttach((PVOID*)&updateAddress, (PVOID)&RunEmu); DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); - DetourAttach((PVOID*)&addCashAddress, (PVOID)&addCash_Detour); + //DetourAttach((PVOID*)&addCashAddress, (PVOID)&addCash_Detour); //DetourAttach((PVOID*)&exitBuildingAddress, (PVOID)&exitBuilding); DetourTransactionCommit(); + ZTGameMgr::init(); break; case DLL_PROCESS_DETACH: diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 665c4ce..129a0bc 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -17,7 +17,10 @@ void ZTGameMgr::init() { // initialize instance of ZTGameMgr // initialize detour function pointers DWORD addCashAddress = 0x40f018; // address of addCash function in the game - // DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); + DetourTransactionCommit(); } void ZTGameMgr::addCash(float amount) { @@ -25,6 +28,21 @@ void ZTGameMgr::addCash(float amount) { this->zoo_budget += amount; } + +void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { + // detour function for adding cash to the game + ZTGameMgr::shared_instance().addCash(amount); +} + +void ZTGameMgr::ZTUIMainSetMoneyText() { + // set money text show in the UI + float money = this->zoo_budget; + DWORD uVar1; // local variable + + float money_to_display = (float)((int)money); // round down to nearest integer + +} + ZTGameMgr::~ZTGameMgr() { // destructor // clean up detour function pointers diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index a34f8e3..219b04c 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -7,6 +7,8 @@ typedef __int32 int32_t; +typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function + class ZTGameMgr { @@ -73,7 +75,9 @@ class ZTGameMgr ZTGameMgr(); ~ZTGameMgr(); void addCash(float); - + void ZTUIMainSetMoneyText(); + static void __fastcall addCash_Detour(void* ptr, float amount); + static void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, int32_t color); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; From d721597d5a33942fbb053c695793c809a5916507 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 2 Mar 2024 01:08:36 -0800 Subject: [PATCH 04/61] potential UIMessageQueue padded class --- EmuAPI/reimp/BFUIMgr.h | 0 EmuAPI/reimp/UIMessageQueue.h | 5 +++++ EmuAPI/reimp/ZTGameMgr.cpp | 35 +++++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTGameMgr.h | 10 +++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 EmuAPI/reimp/BFUIMgr.h create mode 100644 EmuAPI/reimp/UIMessageQueue.h diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h new file mode 100644 index 0000000..e69de29 diff --git a/EmuAPI/reimp/UIMessageQueue.h b/EmuAPI/reimp/UIMessageQueue.h new file mode 100644 index 0000000..a3ecd1c --- /dev/null +++ b/EmuAPI/reimp/UIMessageQueue.h @@ -0,0 +1,5 @@ +class UIMessageQueue { + UIMessageQueue(); + ~UIMessageQueue(); + char padding[200]; // assumption on size from 0x511054 +}; \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 129a0bc..6885fd5 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -20,12 +20,14 @@ void ZTGameMgr::init() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); + // DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&ZTGameMgr::BFUIMgrSetControlForeColor_Detour); DetourTransactionCommit(); } void ZTGameMgr::addCash(float amount) { // add cash to the game this->zoo_budget += amount; + ZTUIMainSetMoneyText(); // update money text in the UI } @@ -34,13 +36,46 @@ void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { ZTGameMgr::shared_instance().addCash(amount); } +void __fastcall ZTGameMgr::BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color) { + // detour function for setting control forecolor + // set control forecolor + _BFUIMgrSetControlForeColor og_BFUIMgrSetControlForeColor = (_BFUIMgrSetControlForeColor)0x0040ee08; + + // void* deref_ptr = *(void**)ptr; + + og_BFUIMgrSetControlForeColor(ptr, param_1, color); +} + +void __cdecl ZTGameMgr::BFInternatSetMoneyText_Detour(int param_1, float param_2, char param_3) { + // detour function for setting money text + // set money text + _BFInternatSetMoneyText og_BFInternatSetMoneyText = (_BFInternatSetMoneyText)0x0040ed88; + + og_BFInternatSetMoneyText(param_1, param_2, param_3); +} + void ZTGameMgr::ZTUIMainSetMoneyText() { // set money text show in the UI float money = this->zoo_budget; DWORD uVar1; // local variable + void* pBFUIMgr = *(void**)0x00638de0; + + // GXRGB color = {0, 0, 0}; // set color to black + DWORD color = 0x638fbc; // set color to black + DWORD BFInternatSetMoneyText_DetourAddress = 0x0040ed88; // address of BFUIMgrSetControlForeColor function in the game + DWORD BFUIMgrSetControlForeColorAddress = 0x0040ee08; // address of BFUIMgrSetControlForeColor function in the game + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&ZTGameMgr::BFUIMgrSetControlForeColor_Detour); + DetourAttach((PVOID*)&BFInternatSetMoneyText_DetourAddress, (PVOID)&ZTGameMgr::BFInternatSetMoneyText_Detour); + + float money_to_display = (float)((int)money); // round down to nearest integer + BFUIMgrSetControlForeColor_Detour(pBFUIMgr, 0x3f8, color); // set control forecolor + BFInternatSetMoneyText_Detour(0x3f8, money_to_display, '\x01'); // set money text + DetourTransactionCommit(); } ZTGameMgr::~ZTGameMgr() { diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 219b04c..ad6dcee 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -8,7 +8,14 @@ typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function +typedef void (__thiscall *_BFUIMgrSetControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function +typedef void (__cdecl *_BFInternatSetMoneyText)(int, float, char); // define original BFUIMgrSetControlForeColor function +struct GXRGB { + int r; + int g; + int b; +}; class ZTGameMgr { @@ -77,7 +84,8 @@ class ZTGameMgr void addCash(float); void ZTUIMainSetMoneyText(); static void __fastcall addCash_Detour(void* ptr, float amount); - static void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, int32_t color); + static void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color); + static void __cdecl BFInternatSetMoneyText_Detour(int, float, char); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; From ed8504fbe2259f131e70b2182f21e8568038580c Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 2 Mar 2024 19:19:26 -0800 Subject: [PATCH 05/61] simple reimplementations for BFUIMgr, ZTGameMgr, ZTHabitatMgr, ZTUI Some of the functions are rewrites, some are hooks. Below are ones added to the codebase: Rewrites: - BFUIMgr::getElement - BFUIMgr::clickSave - ZTGameMgr::addCash Hooks: - BFUIMgr::setControlForeColor - BFUIMgr::internat::setMoneyText - ZTUI::gameopts::saveGame --- EmuAPI/EmuAPI.vcproj | 28 +++++++++++++++++++++++++ EmuAPI/EmuLoader.cpp | 39 +++++++++++++++++++++++++++++++++-- EmuAPI/emu/EmuBase.cpp | 13 ++++++++++++ EmuAPI/emu/EmuBase.h | 3 +++ EmuAPI/reimp/BFUIMgr.cpp | 34 ++++++++++++++++++++++++++++++ EmuAPI/reimp/BFUIMgr.h | 23 +++++++++++++++++++++ EmuAPI/reimp/ZTGameMgr.cpp | 34 ++++++++++-------------------- EmuAPI/reimp/ZTGameMgr.h | 9 ++++---- EmuAPI/reimp/ZTHabitatMgr.cpp | 10 +++++++++ EmuAPI/reimp/ZTHabitatMgr.h | 15 ++++++++++++++ EmuAPI/reimp/ZTUI.cpp | 7 +++++++ EmuAPI/reimp/ZTUI.h | 13 ++++++++++++ 12 files changed, 199 insertions(+), 29 deletions(-) create mode 100644 EmuAPI/reimp/BFUIMgr.cpp create mode 100644 EmuAPI/reimp/ZTHabitatMgr.cpp create mode 100644 EmuAPI/reimp/ZTHabitatMgr.h create mode 100644 EmuAPI/reimp/ZTUI.cpp create mode 100644 EmuAPI/reimp/ZTUI.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 7598156..2536d81 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -292,6 +292,18 @@ + + + + + + @@ -300,6 +312,22 @@ RelativePath=".\reimp\ZTGameMgr.h" > + + + + + + + + diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index f9b18b7..e2f7c54 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -16,11 +16,11 @@ #include #include "ZooState.h" #include "RegZooState.h" -#include #include "EmuScriptMgr.h" #include #include "ZooModels.h" #include "ZTGameMgr.h" +#include "BFUIMgr.h" //------ Flags for console bool IsConsoleRunning = false; @@ -37,6 +37,11 @@ DWORD WINAPI ZooConsole(LPVOID lpParameter); DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function +DWORD BFUIMgrSetControlForeColorAddress = 0x0040ee08; // address of BFUIMgrSetControlForeColor function in the game +DWORD BFInternatSetMoneyTextAddress = 0x0040ed88; // address of BFInternatSetMoneyText function in the game + + + DWORD exitBuildingAddress = 0x4a75bb; // address of exit building function in the game // typedef void* (__thiscall *_origexitBuildingAddress)(void* thisptr, int *param_1); // define original update function @@ -72,8 +77,16 @@ void __fastcall RunEmu(void* thisptr) { // main loop + if (EmuBase::DoubleKey(0x11, 0x54) == true) { + // BFUIMgr::shared_instance().getElement(0x3f8); + BFUIMgr::clickSave(); - // f << "[" << timestamp << "] " << "EMU loop running..." << std::endl; + // std::ofstream f; + // f.open("getelement.log", std::ios_base::app); + // f << "x: " << x << std::endl; + // f.close(); + } + //---- CTRL + J if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { @@ -100,6 +113,8 @@ void __fastcall RunEmu(void* thisptr) { // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; *zoo_models = sm.executeScripts(); // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; + + } } @@ -122,6 +137,24 @@ void __fastcall RunEmu(void* thisptr) { } +// void __cdecl BFInternatSetMoneyText_Detour(int param_1, float param_2, char param_3) { +// // detour function for setting money text +// // set money text +// // ZTGameMgr::BFInternatSetMoneyText(0x3f8, param_2, '\x01'); +// _BFInternatSetMoneyText og_BFInternatSetMoneyText = (_BFInternatSetMoneyText)BFInternatSetMoneyTextAddress; +// og_BFInternatSetMoneyText(param_1, param_2, param_3); +// } + +// void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color) { +// // detour function for setting control forecolor +// // set control forecolor +// // ZTGameMgr::BFUIMgrSetControlForeColor(ptr, param_1, color); + +// _BFUIMgrSetControlForeColor og_BFUIMgrSetControlForeColor = (_BFUIMgrSetControlForeColor)BFUIMgrSetControlForeColorAddress; +// og_BFUIMgrSetControlForeColor(ptr, param_1, color); +// } + + DWORD WINAPI ZooConsole(LPVOID lpParameter) { @@ -231,6 +264,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); //DetourAttach((PVOID*)&addCashAddress, (PVOID)&addCash_Detour); //DetourAttach((PVOID*)&exitBuildingAddress, (PVOID)&exitBuilding); + // DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&BFUIMgrSetControlForeColor_Detour); + // DetourAttach((PVOID*)&BFInternatSetMoneyTextAddress, (PVOID)&BFInternatSetMoneyText_Detour); DetourTransactionCommit(); ZTGameMgr::init(); diff --git a/EmuAPI/emu/EmuBase.cpp b/EmuAPI/emu/EmuBase.cpp index c65ab95..33c54a4 100644 --- a/EmuAPI/emu/EmuBase.cpp +++ b/EmuAPI/emu/EmuBase.cpp @@ -126,4 +126,17 @@ bool EmuBase::TripleKey(const int VK_IKEY, const int VK_SKEY, const int VK_TKEY) return true; } return false; +} + +/// @brief Print out to log file +/// @param log +/// @param file +/// @return +void EmuBase::logToFile(std::string log, std::ios::openmode mode) +{ + std::ofstream f; + f.open("getelement.log", mode); + const char* cstr = log.c_str(); + f << "[" << __TIMESTAMP__ << "] " << cstr << std::endl; + f.close(); } \ No newline at end of file diff --git a/EmuAPI/emu/EmuBase.h b/EmuAPI/emu/EmuBase.h index f3363ab..5fd85ee 100644 --- a/EmuAPI/emu/EmuBase.h +++ b/EmuAPI/emu/EmuBase.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include // extern "C" { // EMU_API bool SingleKey(const int key) { @@ -45,6 +47,7 @@ class EmuBase static DWORD getModuleBaseAddress(); static DWORD callHook(DWORD hookAt, DWORD newFunc); + static void logToFile(std::string log, std::ios::openmode); static uint32_t floatToUint(float); static float uintToFloat(uint32_t); diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp new file mode 100644 index 0000000..b926d9a --- /dev/null +++ b/EmuAPI/reimp/BFUIMgr.cpp @@ -0,0 +1,34 @@ + +#include "BFUIMgr.h" + + +BFUIMgr::BFUIMgr() { + // constructor +} + +BFUIMgr::~BFUIMgr() { + // destructor +} + +int __cdecl BFUIMgr::__getElement(void* pThis, int param_1) { + + _getElement _getElementAdd = (_getElement)0x0040157d; + return _getElementAdd(pThis, param_1); +} + +int BFUIMgr::getElement(int param_1) { + // _getElement _oggetElement = (_getElement)0x0040147d; + // BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); + BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); + return __getElement(pBFUIMgr, param_1); +} + +void BFUIMgr::clickSave() { + if (BFUIMgr::getElement(1502) == 0) { + // click save button + if (ZTUI::gameopts::saveGame() != 0) { + BFUIMgr::getElement(5); + } + } +} + diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h index e69de29..dfef096 100644 --- a/EmuAPI/reimp/BFUIMgr.h +++ b/EmuAPI/reimp/BFUIMgr.h @@ -0,0 +1,23 @@ +#ifndef BFUIMGR_h +#define BFUIMGR_h +#include +#include "ZTUI.h" + +typedef int (__cdecl *_getElement)(void*, int); // define original getElement function + +class BFUIMgr { + public: + BFUIMgr(); + ~BFUIMgr(); + char padding[170]; // assumption on size. constructor not yet found. + static int getElement(int); + static int __cdecl __getElement(void* pThis, int param_1); + static void clickSave(); + + // static BFUIMgr &shared_instance() { + // static BFUIMgr instance; + // return instance; + // } +}; + +#endif /* BFUIMgr_h */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 6885fd5..3d0c410 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -20,7 +20,6 @@ void ZTGameMgr::init() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); - // DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&ZTGameMgr::BFUIMgrSetControlForeColor_Detour); DetourTransactionCommit(); } @@ -36,22 +35,20 @@ void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { ZTGameMgr::shared_instance().addCash(amount); } -void __fastcall ZTGameMgr::BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color) { - // detour function for setting control forecolor - // set control forecolor +void ZTGameMgr::BFUIMgrSetControlForeColor(void* ptr, int param_1, DWORD color) { _BFUIMgrSetControlForeColor og_BFUIMgrSetControlForeColor = (_BFUIMgrSetControlForeColor)0x0040ee08; // void* deref_ptr = *(void**)ptr; + // BFUIMgr *pBFUIMgr = reinterpret_cast(ptr); + og_BFUIMgrSetControlForeColor(ptr, param_1, color); -} -void __cdecl ZTGameMgr::BFInternatSetMoneyText_Detour(int param_1, float param_2, char param_3) { - // detour function for setting money text - // set money text +} +void ZTGameMgr::BFInternatSetMoneyText(int param_1, int param_2, char param_3) { _BFInternatSetMoneyText og_BFInternatSetMoneyText = (_BFInternatSetMoneyText)0x0040ed88; - og_BFInternatSetMoneyText(param_1, param_2, param_3); + og_BFInternatSetMoneyText(param_1, param_2, param_3); } void ZTGameMgr::ZTUIMainSetMoneyText() { @@ -59,23 +56,14 @@ void ZTGameMgr::ZTUIMainSetMoneyText() { float money = this->zoo_budget; DWORD uVar1; // local variable - void* pBFUIMgr = *(void**)0x00638de0; + // void* pBFUIMgr = *(void**)0x00638de0; + BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); // GXRGB color = {0, 0, 0}; // set color to black - DWORD color = 0x638fbc; // set color to black - DWORD BFInternatSetMoneyText_DetourAddress = 0x0040ed88; // address of BFUIMgrSetControlForeColor function in the game - DWORD BFUIMgrSetControlForeColorAddress = 0x0040ee08; // address of BFUIMgrSetControlForeColor function in the game - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&ZTGameMgr::BFUIMgrSetControlForeColor_Detour); - DetourAttach((PVOID*)&BFInternatSetMoneyText_DetourAddress, (PVOID)&ZTGameMgr::BFInternatSetMoneyText_Detour); - - float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgrSetControlForeColor_Detour(pBFUIMgr, 0x3f8, color); // set control forecolor - BFInternatSetMoneyText_Detour(0x3f8, money_to_display, '\x01'); // set money text - - DetourTransactionCommit(); + // float money_to_display = (float)((int)money); // round down to nearest integer + BFUIMgrSetControlForeColor(pBFUIMgr, 0x3f8, 0xf44bda); // set control forecolor + BFInternatSetMoneyText(0x3f8, (int)(this->zoo_budget), '\x01'); // set money text } ZTGameMgr::~ZTGameMgr() { diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index ad6dcee..c255ac8 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -4,12 +4,13 @@ #include // must always be above detours.h #include #include "EmuBase.h" - +#include "BFUIMgr.h" typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function typedef void (__thiscall *_BFUIMgrSetControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function -typedef void (__cdecl *_BFInternatSetMoneyText)(int, float, char); // define original BFUIMgrSetControlForeColor function +typedef void (__cdecl *_BFInternatSetMoneyText)(int, int, char); // define original BFUIMgrSetControlForeColor function + struct GXRGB { int r; @@ -84,8 +85,8 @@ class ZTGameMgr void addCash(float); void ZTUIMainSetMoneyText(); static void __fastcall addCash_Detour(void* ptr, float amount); - static void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color); - static void __cdecl BFInternatSetMoneyText_Detour(int, float, char); + static void BFUIMgrSetControlForeColor(void* ptr, int param_1, DWORD color); + static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; diff --git a/EmuAPI/reimp/ZTHabitatMgr.cpp b/EmuAPI/reimp/ZTHabitatMgr.cpp new file mode 100644 index 0000000..496df5b --- /dev/null +++ b/EmuAPI/reimp/ZTHabitatMgr.cpp @@ -0,0 +1,10 @@ +#include "ZTHabitatMgr.h" + +ZTHabitatMgr::ZTHabitatMgr() { + // constructor +} + +ZTHabitatMgr::~ZTHabitatMgr() { + // destructor +} + diff --git a/EmuAPI/reimp/ZTHabitatMgr.h b/EmuAPI/reimp/ZTHabitatMgr.h new file mode 100644 index 0000000..8a35333 --- /dev/null +++ b/EmuAPI/reimp/ZTHabitatMgr.h @@ -0,0 +1,15 @@ +#ifndef ZT_HABITATMGR_H +#define ZT_HABITATMGR_H + +class ZTHabitatMgr { +public: + ZTHabitatMgr(); + ~ZTHabitatMgr(); + char padding[112]; // assumption on size. constructor not yet found. + static ZTHabitatMgr &shared_instance() { + static ZTHabitatMgr instance; + return instance; + } +}; + +#endif // ZT_HABITATMGR_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp new file mode 100644 index 0000000..8a81cf5 --- /dev/null +++ b/EmuAPI/reimp/ZTUI.cpp @@ -0,0 +1,7 @@ +#include "ZTUI.h" + +unsigned int ZTUI::gameopts::saveGame(void) { + // call BFUIMgr::clickSave(); + _saveGame _ogsaveGame = (_saveGame)0x004769ac; + return _ogsaveGame(); +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h new file mode 100644 index 0000000..9e7c2e6 --- /dev/null +++ b/EmuAPI/reimp/ZTUI.h @@ -0,0 +1,13 @@ +#ifndef ZTUI_H +#define ZTUI_H + +typedef unsigned int (*_saveGame)(void); // define original saveGame function + +namespace ZTUI { + class gameopts { + public: + static unsigned int saveGame(); + }; +}; + +#endif /* ZTUI_H */ \ No newline at end of file From f3ffe9d2a0838b7d112fdae35b8a491e038d23ae Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sun, 3 Mar 2024 02:27:39 -0800 Subject: [PATCH 06/61] ztentitytype exploration --- EmuAPI/reimp/BFEntityType.h | 7 +++++++ EmuAPI/reimp/BFOverlayType.h | 15 +++++++++++++++ EmuAPI/reimp/BFUnitType.h | 13 +++++++++++++ EmuAPI/reimp/ZTAmbientType.h | 13 +++++++++++++ EmuAPI/reimp/ZTAnimalType.h | 13 +++++++++++++ EmuAPI/reimp/ZTBuildingType.cpp | 0 EmuAPI/reimp/ZTBuildingType.h | 13 +++++++++++++ EmuAPI/reimp/ZTFenceType.h | 13 +++++++++++++ EmuAPI/reimp/ZTFoodType.h | 14 ++++++++++++++ EmuAPI/reimp/ZTGuestType.h | 13 +++++++++++++ EmuAPI/reimp/ZTGuideType.h | 13 +++++++++++++ EmuAPI/reimp/ZTHelicopterType.h | 13 +++++++++++++ EmuAPI/reimp/ZTKeeperType.h | 13 +++++++++++++ EmuAPI/reimp/ZTMainType.h | 13 +++++++++++++ EmuAPI/reimp/ZTMapView.h | 14 ++++++++++++++ EmuAPI/reimp/ZTPathType.h | 15 +++++++++++++++ EmuAPI/reimp/ZTRubbleType.h | 13 +++++++++++++ EmuAPI/reimp/ZTSceneryType.h | 13 +++++++++++++ EmuAPI/reimp/ZTStaffType.h | 13 +++++++++++++ EmuAPI/reimp/ZTTankFilterType.h | 13 +++++++++++++ EmuAPI/reimp/ZTTankWallType.h | 13 +++++++++++++ EmuAPI/reimp/ZTUI.cpp | 22 ++++++++++++++++++++-- EmuAPI/reimp/ZTUI.h | 11 +++++++++++ EmuAPI/reimp/ZTUnitType.h | 13 +++++++++++++ 24 files changed, 304 insertions(+), 2 deletions(-) create mode 100644 EmuAPI/reimp/BFEntityType.h create mode 100644 EmuAPI/reimp/BFOverlayType.h create mode 100644 EmuAPI/reimp/BFUnitType.h create mode 100644 EmuAPI/reimp/ZTAmbientType.h create mode 100644 EmuAPI/reimp/ZTAnimalType.h create mode 100644 EmuAPI/reimp/ZTBuildingType.cpp create mode 100644 EmuAPI/reimp/ZTBuildingType.h create mode 100644 EmuAPI/reimp/ZTFenceType.h create mode 100644 EmuAPI/reimp/ZTFoodType.h create mode 100644 EmuAPI/reimp/ZTGuestType.h create mode 100644 EmuAPI/reimp/ZTGuideType.h create mode 100644 EmuAPI/reimp/ZTHelicopterType.h create mode 100644 EmuAPI/reimp/ZTKeeperType.h create mode 100644 EmuAPI/reimp/ZTMainType.h create mode 100644 EmuAPI/reimp/ZTMapView.h create mode 100644 EmuAPI/reimp/ZTPathType.h create mode 100644 EmuAPI/reimp/ZTRubbleType.h create mode 100644 EmuAPI/reimp/ZTSceneryType.h create mode 100644 EmuAPI/reimp/ZTStaffType.h create mode 100644 EmuAPI/reimp/ZTTankFilterType.h create mode 100644 EmuAPI/reimp/ZTTankWallType.h create mode 100644 EmuAPI/reimp/ZTUnitType.h diff --git a/EmuAPI/reimp/BFEntityType.h b/EmuAPI/reimp/BFEntityType.h new file mode 100644 index 0000000..56705ca --- /dev/null +++ b/EmuAPI/reimp/BFEntityType.h @@ -0,0 +1,7 @@ + +class BFEntityType { + public: + char padding[288]; + BFEntityType(); + ~BFEntityType(); +}; \ No newline at end of file diff --git a/EmuAPI/reimp/BFOverlayType.h b/EmuAPI/reimp/BFOverlayType.h new file mode 100644 index 0000000..21e0334 --- /dev/null +++ b/EmuAPI/reimp/BFOverlayType.h @@ -0,0 +1,15 @@ +#ifndef BFOVERLAYTYPE_H +#define BFOVERLAYTYPE_H + +#include "BFEntityType.h" + +// size: 288 +// no difference in size to BFEntityType + +class BFOverlayType : public BFEntityType { + public: + BFOverlayType(); + ~BFOverlayType(); +}; + +#endif // BFOVERLAYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFUnitType.h b/EmuAPI/reimp/BFUnitType.h new file mode 100644 index 0000000..37ea318 --- /dev/null +++ b/EmuAPI/reimp/BFUnitType.h @@ -0,0 +1,13 @@ +#ifndef BFUNITTYPE_H +#define BFUNITTYPE_H + +#include "BFEntityType.h" + +class BFUnitType : public BFEntityType { + public: + char padding[176]; // 464 + BFUnitType(); + ~BFUnitType(); +}; + +#endif // BFUNITTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTAmbientType.h b/EmuAPI/reimp/ZTAmbientType.h new file mode 100644 index 0000000..09c4a4b --- /dev/null +++ b/EmuAPI/reimp/ZTAmbientType.h @@ -0,0 +1,13 @@ +#ifndef ZTAMBIENTTYPE_H +#define ZTAMBIENTTYPE_H + +#include "BFOverlayType.h" + +class ZTAmbientType : public BFOverlayType { + public: + char padding[12]; // 300 + ZTAmbientType(); + ~ZTAmbientType(); +}; + +#endif // ZTAMBIENTTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTAnimalType.h b/EmuAPI/reimp/ZTAnimalType.h new file mode 100644 index 0000000..1338ad9 --- /dev/null +++ b/EmuAPI/reimp/ZTAnimalType.h @@ -0,0 +1,13 @@ +#ifndef ZTANIMALTYPE_H +#define ZTANIMALTYPE_H + +#include "ZTUnitType.h" + +class ZTAnimalType : public ZTUnitType { + public: + char padding[324]; // 864 + ZTAnimalType(); + ~ZTAnimalType(); +}; + +#endif // ZTANIMALTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.cpp b/EmuAPI/reimp/ZTBuildingType.cpp new file mode 100644 index 0000000..e69de29 diff --git a/EmuAPI/reimp/ZTBuildingType.h b/EmuAPI/reimp/ZTBuildingType.h new file mode 100644 index 0000000..3ef7941 --- /dev/null +++ b/EmuAPI/reimp/ZTBuildingType.h @@ -0,0 +1,13 @@ +#ifndef ZTBUILDINGTYPE_H +#define ZTBUILDINGTYPE_H + +#include "ZTSceneryType.h" + +class ZTBuildingType : public ZTSceneryType { + public: + char padding[112]; // 404 + ZTBuildingType(); + ~ZTBuildingType(); +}; + +#endif // ZTBUILDINGTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTFenceType.h b/EmuAPI/reimp/ZTFenceType.h new file mode 100644 index 0000000..21b078f --- /dev/null +++ b/EmuAPI/reimp/ZTFenceType.h @@ -0,0 +1,13 @@ +#ifndef ZTFENCETYPE_H +#define ZTFENCETYPE_H + +#include "ZTSceneryType.h" + +class ZTFenceType : public ZTSceneryType { + public: + char padding[32]; // 324 + ZTFenceType(); + ~ZTFenceType(); +}; + +#endif // ZTFENCETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTFoodType.h b/EmuAPI/reimp/ZTFoodType.h new file mode 100644 index 0000000..ce4eb4a --- /dev/null +++ b/EmuAPI/reimp/ZTFoodType.h @@ -0,0 +1,14 @@ +#ifndef ZTFOODTYPE_H +#define ZTFOODTYPE_H + +#include "ZTSceneryType.h" + +// no difference in byte space between ZTSceneryType and ZTFoodType + +class ZTFoodType : public ZTSceneryType { + public: + ZTFoodType(); + ~ZTFoodType(); +}; + +#endif // ZTFOODTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuestType.h b/EmuAPI/reimp/ZTGuestType.h new file mode 100644 index 0000000..fefc2f6 --- /dev/null +++ b/EmuAPI/reimp/ZTGuestType.h @@ -0,0 +1,13 @@ +#ifndef ZTGUESTTYPE_H +#define ZTGUESTTYPE_H + +#include "ZTUnitType.h" + +class ZTGuestType : public ZTUnitType { + public: + char padding[216]; // 756 + ZTGuestType(); + ~ZTGuestType(); +}; + +#endif // ZTGUESTTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuideType.h b/EmuAPI/reimp/ZTGuideType.h new file mode 100644 index 0000000..4755762 --- /dev/null +++ b/EmuAPI/reimp/ZTGuideType.h @@ -0,0 +1,13 @@ +#ifndef ZTGUIDETYPE_H +#define ZTGUIDETYPE_H + +#include "ZTStaffType.h" + +class ZTGuideType : public ZTStaffType { + public: + char padding[24]; // 624 + ZTGuideType(); + ~ZTGuideType(); +}; + +#endif // ZTGUIDETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTHelicopterType.h b/EmuAPI/reimp/ZTHelicopterType.h new file mode 100644 index 0000000..77e837d --- /dev/null +++ b/EmuAPI/reimp/ZTHelicopterType.h @@ -0,0 +1,13 @@ +#ifndef ZTHELICOPTERTYPE_H +#define ZTHELICOPTERTYPE_H + +#include "ZTStaffType.h" + +class ZTHelicopterType : public ZTStaffType { + public: + char padding[24]; // 624 + ZTHelicopterType(); + ~ZTHelicopterType(); +}; + +#endif // ZTHELICOPTERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTKeeperType.h b/EmuAPI/reimp/ZTKeeperType.h new file mode 100644 index 0000000..264656b --- /dev/null +++ b/EmuAPI/reimp/ZTKeeperType.h @@ -0,0 +1,13 @@ +#ifndef ZTKEEPERTYPE_H +#define ZTKEEPERTYPE_H + +#include "ZTStaffType.h" + +class ZTKeeperType : public ZTStaffType { + public: + char padding[24]; // 624 + ZTKeeperType(); + ~ZTKeeperType(); +}; + +#endif // ZTKEEPERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMainType.h b/EmuAPI/reimp/ZTMainType.h new file mode 100644 index 0000000..78a7099 --- /dev/null +++ b/EmuAPI/reimp/ZTMainType.h @@ -0,0 +1,13 @@ +#ifndef ZTMAINTYPE_H +#define ZTMAINTYPE_H + +#include "ZTUnitType.h" + +class ZTMainType : public ZTUnitType { + public: + char padding[40]; // 640 + ZTMainType(); + ~ZTMainType(); +}; + +#endif // ZTMAINTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h new file mode 100644 index 0000000..9095dfc --- /dev/null +++ b/EmuAPI/reimp/ZTMapView.h @@ -0,0 +1,14 @@ +#ifndef ZTMAPVIEW_H +#define ZTMAPVIEW_H + +class ZTMapView { + public: + char padding[1444]; + static ZTMapView &shared_instance() { + ZTMapView *ztmapview = reinterpret_cast(0x00511054); + static ZTMapView instance = *ztmapview; + return instance; + } +}; + +#endif // ZTMAPVIEW_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTPathType.h b/EmuAPI/reimp/ZTPathType.h new file mode 100644 index 0000000..6a0f397 --- /dev/null +++ b/EmuAPI/reimp/ZTPathType.h @@ -0,0 +1,15 @@ +#ifndef ZTPATHTYPE_H +#define ZTPATHTYPE_H + +#include "ZTSceneryType.h" + +// size: 296 +// no difference from ZTSceneryType in byte space + +class ZTPathType : public ZTSceneryType { + public: + ZTPathType(); + ~ZTPathType(); +}; + +#endif // ZTPATHTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTRubbleType.h b/EmuAPI/reimp/ZTRubbleType.h new file mode 100644 index 0000000..42ea8d3 --- /dev/null +++ b/EmuAPI/reimp/ZTRubbleType.h @@ -0,0 +1,13 @@ +#ifndef ZTRUBBLETYPE_H +#define ZTRUBBLETYPE_H + +#include "ZTSceneryType.h" + +class ZTRubbleType : public ZTSceneryType { + public: + char padding[12]; // 304 + ZTRubbleType(); + ~ZTRubbleType(); +}; + +#endif // ZTRUBBLETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.h b/EmuAPI/reimp/ZTSceneryType.h new file mode 100644 index 0000000..27c073e --- /dev/null +++ b/EmuAPI/reimp/ZTSceneryType.h @@ -0,0 +1,13 @@ +#ifndef ZTSCENERYTYPE_H +#define ZTSCENERYTYPE_H + +#include "BFEntityType.h" + +class ZTSceneryType : public BFEntityType { + public: + char padding[4]; // 292 + ZTSceneryType(); + ~ZTSceneryType(); +}; + +#endif // ZTSCENERYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTStaffType.h b/EmuAPI/reimp/ZTStaffType.h new file mode 100644 index 0000000..cf2dbbe --- /dev/null +++ b/EmuAPI/reimp/ZTStaffType.h @@ -0,0 +1,13 @@ +#ifndef ZTSTAFFTYPE_H +#define ZTSTAFFTYPE_H + +#include "ZTUnitType.h" + +class ZTStaffType : public ZTUnitType { + public: + char padding[60]; // 600 + ZTStaffType(); + ~ZTStaffType(); +}; + +#endif // ZTSTAFFTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTTankFilterType.h b/EmuAPI/reimp/ZTTankFilterType.h new file mode 100644 index 0000000..ec0511f --- /dev/null +++ b/EmuAPI/reimp/ZTTankFilterType.h @@ -0,0 +1,13 @@ +#ifndef ZTTANKFILTERTYPE_H +#define ZTTANKFILTERTYPE_H + +#include "ZTSceneryType.h" + +class ZTTankFilterType : public ZTSceneryType { + public: + char padding[72]; // 368 + ZTTankFilterType(); + ~ZTTankFilterType(); +}; + +#endif // ZTTANKFILTERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTTankWallType.h b/EmuAPI/reimp/ZTTankWallType.h new file mode 100644 index 0000000..1003ac6 --- /dev/null +++ b/EmuAPI/reimp/ZTTankWallType.h @@ -0,0 +1,13 @@ +#ifndef ZTTANKWALLTYPE_H +#define ZTTANKWALLTYPE_H + +#include "ZTFenceType.h" + +class ZTTankWallType : public ZTFenceType { + public: + char padding[652]; // 976 + ZTTankWallType(); + ~ZTTankWallType(); +}; + +#endif // ZTTANKWALLTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 8a81cf5..26e4008 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -1,7 +1,25 @@ #include "ZTUI.h" unsigned int ZTUI::gameopts::saveGame(void) { - // call BFUIMgr::clickSave(); _saveGame _ogsaveGame = (_saveGame)0x004769ac; return _ogsaveGame(); -} \ No newline at end of file +} + +ZTMapView* ZTUI::general::getMapView(void) { + ZTMapView *ztmapview = reinterpret_cast(0x00638068); + if (ztmapview == 0) { + ztmapview = (ZTMapView*)BFUIMgr::getElement(7000); + } + + return ztmapview; +} + +DWORD ZTUI::general::getSelectedEntity(void) { + ZTMapView *pZTMapView = ZTUI::general::getMapView(); + if (pZTMapView == 0) { + return 0; + } else { + return reinterpret_cast(pZTMapView[1084]); + } +} + diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 9e7c2e6..8fd8762 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -1,13 +1,24 @@ #ifndef ZTUI_H #define ZTUI_H +#include "ZTMapView.h" +#include "BFUIMgr.h" + typedef unsigned int (*_saveGame)(void); // define original saveGame function +typedef ZTMapView (*_getMapView)(void); // define original getMapView function +typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function namespace ZTUI { class gameopts { public: static unsigned int saveGame(); }; + + class general { + public: + static ZTMapView* getMapView(); + static DWORD getSelectedEntity(); + }; }; #endif /* ZTUI_H */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUnitType.h b/EmuAPI/reimp/ZTUnitType.h new file mode 100644 index 0000000..6b2cd26 --- /dev/null +++ b/EmuAPI/reimp/ZTUnitType.h @@ -0,0 +1,13 @@ +#ifndef ZTUNITTYPE_H +#define ZTUNITTYPE_H + +#include "BFUnitType.h" + +class ZTUnitType : public BFUnitType { + public: + char padding[76]; // 540 + ZTUnitType(); + ~ZTUnitType(); +}; + +#endif // ZTUNITTYPE_H \ No newline at end of file From fe3432fab85dd0a5b968e4a0e95389cbcde1ef9f Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sun, 3 Mar 2024 03:03:30 -0800 Subject: [PATCH 07/61] getSelectedEntity now returns address, but it's still not accurate - added getselentity to test getSelectedEntity - initial ZTMapView exploration --- EmuAPI/emu/EmuConsole.cpp | 4 ++++ EmuAPI/emu/EmuConsole.h | 1 + EmuAPI/reimp/ZTMapView.h | 2 ++ EmuAPI/reimp/ZTUI.cpp | 8 +++++--- EmuAPI/reimp/ZTUI.h | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 466264c..986e5f7 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -423,6 +423,10 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << "Err: Command <" << tokens[0] << "> requires a boolean." << std::endl; } } + else if (tokens[0] == "getselentity") { + // return selected entity + std::cout << "The selected entity is: " << ZTUI::general::getSelectedEntity() << std::endl; + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/emu/EmuConsole.h b/EmuAPI/emu/EmuConsole.h index e8e1e75..0e9bfa8 100644 --- a/EmuAPI/emu/EmuConsole.h +++ b/EmuAPI/emu/EmuConsole.h @@ -13,6 +13,7 @@ #include "ZooState.h" #include "ZooMiniMap.h" #include +#include "ZTUI.h" class EmuConsole { diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 9095dfc..7ed0864 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -9,6 +9,8 @@ class ZTMapView { static ZTMapView instance = *ztmapview; return instance; } + + static void zoomMap(int, int); }; #endif // ZTMAPVIEW_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 26e4008..0d38c25 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -14,12 +14,14 @@ ZTMapView* ZTUI::general::getMapView(void) { return ztmapview; } -DWORD ZTUI::general::getSelectedEntity(void) { - ZTMapView *pZTMapView = ZTUI::general::getMapView(); +DWORD* ZTUI::general::getSelectedEntity(void) { + ZTMapView *pZTMapView = (ZTUI::general::getMapView()); + unsigned char* baseAddr = reinterpret_cast(pZTMapView); + DWORD* addressAtOffset = reinterpret_cast(baseAddr + (1084 * sizeof(DWORD))); if (pZTMapView == 0) { return 0; } else { - return reinterpret_cast(pZTMapView[1084]); + return addressAtOffset; } } diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 8fd8762..503792f 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -17,7 +17,7 @@ namespace ZTUI { class general { public: static ZTMapView* getMapView(); - static DWORD getSelectedEntity(); + static DWORD* getSelectedEntity(); }; }; From e9a387c0207e248fabb3883fb879933a68e8f9cc Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sun, 3 Mar 2024 05:52:45 -0800 Subject: [PATCH 08/61] console commands for testing, new functions in BFUIMgr, ZTMapView --- EmuAPI/EmuAPI.vcproj | 100 ++++++++++++++++++++++++++++++++++++ EmuAPI/emu/EmuConsole.cpp | 13 +++++ EmuAPI/emu/EmuConsole.h | 1 + EmuAPI/reimp/BFUIMgr.cpp | 31 +++++++---- EmuAPI/reimp/BFUIMgr.h | 6 ++- EmuAPI/reimp/ZTMapView.cpp | 42 +++++++++++++++ EmuAPI/reimp/ZTMapView.h | 11 +++- EmuAPI/reimp/ZTUI.h | 4 +- EmuAPI/reimp/ZTWorldMgr.cpp | 12 +++++ EmuAPI/reimp/ZTWorldMgr.h | 17 ++++++ 10 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 EmuAPI/reimp/ZTMapView.cpp create mode 100644 EmuAPI/reimp/ZTWorldMgr.cpp create mode 100644 EmuAPI/reimp/ZTWorldMgr.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 2536d81..75365af 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -292,6 +292,14 @@ + + + + @@ -300,10 +308,38 @@ RelativePath=".\reimp\BFUIMgr.h" > + + + + + + + + + + + + + + @@ -312,6 +348,14 @@ RelativePath=".\reimp\ZTGameMgr.h" > + + + + @@ -320,6 +364,50 @@ RelativePath=".\reimp\ZTHabitatMgr.h" > + + + + + + + + + + + + + + + + + + + + + + @@ -328,6 +416,18 @@ RelativePath=".\reimp\ZTUI.h" > + + + + + + diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 986e5f7..c7fd16b 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -427,6 +427,19 @@ void EmuConsole::processInput(bool& IsConsoleRunning) // return selected entity std::cout << "The selected entity is: " << ZTUI::general::getSelectedEntity() << std::endl; } + else if (tokens[0] == "setmapzoom") { + if (tokens.size() < 2) + { + std::cout << "Err: Command <" << tokens[0] << "> requires a zoom level." << std::endl; + return; + } + ZTMapView::zoomMap(::atoi(tokens[1].c_str())); + std::cout << "Map zoom level set to: " << tokens[1] << std::endl; + } + else if (tokens[0] == "clickzoomout") { + ZTMapView::clickZoomOut(); + std::cout << "Clicked zoom out." << std::endl; + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/emu/EmuConsole.h b/EmuAPI/emu/EmuConsole.h index 0e9bfa8..a99b22a 100644 --- a/EmuAPI/emu/EmuConsole.h +++ b/EmuAPI/emu/EmuConsole.h @@ -14,6 +14,7 @@ #include "ZooMiniMap.h" #include #include "ZTUI.h" +#include "ZTMapView.h" class EmuConsole { diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp index b926d9a..be2f685 100644 --- a/EmuAPI/reimp/BFUIMgr.cpp +++ b/EmuAPI/reimp/BFUIMgr.cpp @@ -10,25 +10,34 @@ BFUIMgr::~BFUIMgr() { // destructor } -int __cdecl BFUIMgr::__getElement(void* pThis, int param_1) { +// int __cdecl BFUIMgr::__getElement(void* pThis, int param_1) { - _getElement _getElementAdd = (_getElement)0x0040157d; - return _getElementAdd(pThis, param_1); -} +// _getElement _getElementAdd = (_getElement)0x0040157d; +// return _getElementAdd(pThis, param_1); +// } + +int* BFUIMgr::getElement(int param_1) { + _getElement _oggetElement = (_getElement)0x0040157d; + // DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638de0)); -int BFUIMgr::getElement(int param_1) { - // _getElement _oggetElement = (_getElement)0x0040147d; - // BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); - BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); - return __getElement(pBFUIMgr, param_1); + BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); + //BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); + return _oggetElement((LPVOID)pBFUIMgr, param_1); } void BFUIMgr::clickSave() { - if (BFUIMgr::getElement(1502) == 0) { + //if (*(BFUIMgr::getElement(1502)) & 2 == 0) { // click save button if (ZTUI::gameopts::saveGame() != 0) { BFUIMgr::getElement(5); } - } + //} } +DWORD BFUIMgr::getUIMgr() { + return *((DWORD*)((LPVOID)0x00638de0)); +} + +DWORD BFUIMgr::getOffset(DWORD offset) { + return (*((DWORD*)((LPVOID)0x00638de0)) + offset); +} diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h index dfef096..836852e 100644 --- a/EmuAPI/reimp/BFUIMgr.h +++ b/EmuAPI/reimp/BFUIMgr.h @@ -3,16 +3,18 @@ #include #include "ZTUI.h" -typedef int (__cdecl *_getElement)(void*, int); // define original getElement function +typedef int* (__thiscall *_getElement)(void*, int); // define original getElement function class BFUIMgr { public: BFUIMgr(); ~BFUIMgr(); char padding[170]; // assumption on size. constructor not yet found. - static int getElement(int); + static int* getElement(int); static int __cdecl __getElement(void* pThis, int param_1); static void clickSave(); + static DWORD getUIMgr(); + static DWORD getOffset(DWORD); // static BFUIMgr &shared_instance() { // static BFUIMgr instance; diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp new file mode 100644 index 0000000..cd5756a --- /dev/null +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -0,0 +1,42 @@ +#include "ZTMapView.h" +#include "ZTUI.h" + +// ZTMapView::ZTMapView() { +// // constructor +// } + +// ZTMapView::~ZTMapView() { +// // destructor +// } + +void ZTMapView::zoomMap(int param_2) { + // zoom map + // void *pZTMapView = reinterpret_cast(0x00638068); + DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638068)); + // 004b072d + _zoomMap _ogzoomMap = (_zoomMap)0x004b072d; + _ogzoomMap((LPVOID)ptr_ZTMapView, param_2); +} + +DWORD getOffset(DWORD offset) +{ + return (*((DWORD*)((LPVOID)0x00638068)) + offset); +} + +// Live version of the ZTMapView state +DWORD ZTMapView::getMapView() { + return *((DWORD*)((LPVOID)0x00638068)); +} + +void ZTMapView::clickZoomOut() { + int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); + int* uiElem; + + if (getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0 && *currentZoom != -2) { + zoomMap(*currentZoom - 2); + uiElem = BFUIMgr::getElement(1007); + } + if (*currentZoom == -2) { + uiElem = BFUIMgr::getElement(1023); + } +} diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 7ed0864..0440c5e 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -1,6 +1,12 @@ #ifndef ZTMAPVIEW_H #define ZTMAPVIEW_H +#include "ZTWorldMgr.h" +#include "EmuBase.h" + + +typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function + class ZTMapView { public: char padding[1444]; @@ -9,8 +15,9 @@ class ZTMapView { static ZTMapView instance = *ztmapview; return instance; } - - static void zoomMap(int, int); + static DWORD getMapView(); + static void zoomMap(int); + static void clickZoomOut(); }; #endif // ZTMAPVIEW_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 503792f..8445868 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -5,8 +5,8 @@ #include "BFUIMgr.h" typedef unsigned int (*_saveGame)(void); // define original saveGame function -typedef ZTMapView (*_getMapView)(void); // define original getMapView function -typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function +// typedef ZTMapView (*_getMapView)(void); // define original getMapView function +// typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function namespace ZTUI { class gameopts { diff --git a/EmuAPI/reimp/ZTWorldMgr.cpp b/EmuAPI/reimp/ZTWorldMgr.cpp new file mode 100644 index 0000000..d7a899c --- /dev/null +++ b/EmuAPI/reimp/ZTWorldMgr.cpp @@ -0,0 +1,12 @@ + +#include "ZTWorldMgr.h" +#include "ZTMapView.h" + + +DWORD ZTWorldMgr::getWorldMgr() { + return *(DWORD*)((LPVOID)0x00638040); +} + +DWORD ZTWorldMgr::getOffset(DWORD offset) { + return (*((DWORD*)((LPVOID)0x00638040)) + offset); +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTWorldMgr.h b/EmuAPI/reimp/ZTWorldMgr.h new file mode 100644 index 0000000..4a457ff --- /dev/null +++ b/EmuAPI/reimp/ZTWorldMgr.h @@ -0,0 +1,17 @@ +#ifndef ZTWORDLMGR_H +#define ZTWORDLMGR_H + +#include "Windows.h" + + +class ZTWorldMgr { + public: + char padding[536]; + ZTWorldMgr(); + ~ZTWorldMgr(); + + static DWORD getWorldMgr(); + static DWORD getOffset(DWORD); +}; + +#endif // ZTWORDLMGR_H From fb09aa62a776702e49a51e4529236c4ec3514089 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 00:57:32 -0800 Subject: [PATCH 09/61] rerouted all calls to addcash to rewritten version --- EmuAPI/EmuAPI.vcproj | 8 +++++ EmuAPI/emu/EmuConsole.cpp | 8 +++++ EmuAPI/reimp/BFUIMgr.cpp | 8 ++++- EmuAPI/reimp/BFUIMgr.h | 10 ++++-- EmuAPI/reimp/ZTGameMgr.cpp | 53 ++++++++++++------------------ EmuAPI/reimp/ZTGameMgr.h | 65 +++++++++---------------------------- EmuAPI/reimp/ZTMapView.cpp | 17 ++++++---- EmuAPI/reimp/ZTMapView.h | 1 + EmuAPI/reimp/ZTUI.cpp | 17 ++++++++++ EmuAPI/reimp/ZTUI.h | 5 +++ EmuAPI/reimp/bfinternat.cpp | 7 ++++ EmuAPI/reimp/bfinternat.h | 11 +++++++ 12 files changed, 120 insertions(+), 90 deletions(-) create mode 100644 EmuAPI/reimp/bfinternat.cpp create mode 100644 EmuAPI/reimp/bfinternat.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 75365af..6515062 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -296,6 +296,14 @@ RelativePath=".\reimp\BFEntityType.h" > + + + + diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index c7fd16b..bff2717 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -1,5 +1,6 @@ #include "EmuConsole.h" #include +#include "ZTGameMgr.h" EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { @@ -440,6 +441,13 @@ void EmuConsole::processInput(bool& IsConsoleRunning) ZTMapView::clickZoomOut(); std::cout << "Clicked zoom out." << std::endl; } + else if (tokens[0] == "ztgr") { + std::cout << ZTGameMgr::shared_instance().zoo_budget << std::endl; + std::cout << ZTGameMgr::shared_instance().num_animals << std::endl; + std::cout << ZTGameMgr::shared_instance().num_species << std::endl; + std::cout << ZTGameMgr::shared_instance().guest_count << std::endl; + std::cout << ZTGameMgr::shared_instance().animal_purchase_costs[0] << std::endl; + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp index be2f685..2fa542c 100644 --- a/EmuAPI/reimp/BFUIMgr.cpp +++ b/EmuAPI/reimp/BFUIMgr.cpp @@ -16,7 +16,7 @@ BFUIMgr::~BFUIMgr() { // return _getElementAdd(pThis, param_1); // } -int* BFUIMgr::getElement(int param_1) { +BFUIMgr* BFUIMgr::getElement(int param_1) { _getElement _oggetElement = (_getElement)0x0040157d; // DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638de0)); @@ -41,3 +41,9 @@ DWORD BFUIMgr::getUIMgr() { DWORD BFUIMgr::getOffset(DWORD offset) { return (*((DWORD*)((LPVOID)0x00638de0)) + offset); } + +void BFUIMgr::setControlForeColor(void* ptr, int param_1, DWORD color) { + _setControlForeColor og_setControlForeColor = (_setControlForeColor)0x0040ee08; + + og_setControlForeColor(ptr, param_1, color); +} \ No newline at end of file diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h index 836852e..72e5108 100644 --- a/EmuAPI/reimp/BFUIMgr.h +++ b/EmuAPI/reimp/BFUIMgr.h @@ -3,18 +3,21 @@ #include #include "ZTUI.h" -typedef int* (__thiscall *_getElement)(void*, int); // define original getElement function +typedef void (__thiscall *_setControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function + class BFUIMgr { public: BFUIMgr(); ~BFUIMgr(); char padding[170]; // assumption on size. constructor not yet found. - static int* getElement(int); + static BFUIMgr* getElement(int); static int __cdecl __getElement(void* pThis, int param_1); static void clickSave(); static DWORD getUIMgr(); static DWORD getOffset(DWORD); + static void setControlForeColor(void*, int, DWORD); + // static BFUIMgr &shared_instance() { // static BFUIMgr instance; @@ -22,4 +25,7 @@ class BFUIMgr { // } }; +typedef BFUIMgr* (__thiscall *_getElement)(void*, int); // define original getElement function + + #endif /* BFUIMgr_h */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 3d0c410..61d7e88 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -21,12 +21,32 @@ void ZTGameMgr::init() { DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); DetourTransactionCommit(); + // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); + // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); + + EmuBase::callHook(0x0050A245, (DWORD)&ZTGameMgr::addCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::fGrantDonation + EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 + EmuBase::callHook(0x0060cccd, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433ae0 + EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433b00 + EmuBase::callHook(0x006089fc, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x40f018::meth_0x6089e8 + EmuBase::callHook(0x00607299, (DWORD)&ZTGameMgr::addCash_Detour); // from georgeW + EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 + EmuBase::callHook(0x005b0f2d, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 005b0f17 + EmuBase::callHook(0x005a1679, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTScenarioSimpleGoal::trigger03 + EmuBase::callHook(0x004f7031, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x41f881::meth_0x4f6e3c + EmuBase::callHook(0x004d920f , (DWORD)&ZTGameMgr::addCash_Detour); // from ZTMapView::placeEntityOnMap + EmuBase::callHook(0x004a2f97, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTGameMgr::removedZooDoo + EmuBase::callHook(0x00484047, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::financeChecks + EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation + EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser + EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser } void ZTGameMgr::addCash(float amount) { // add cash to the game this->zoo_budget += amount; - ZTUIMainSetMoneyText(); // update money text in the UI + ZTUI::main::setMoneyText(); // update money text in the UI } @@ -35,37 +55,6 @@ void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { ZTGameMgr::shared_instance().addCash(amount); } -void ZTGameMgr::BFUIMgrSetControlForeColor(void* ptr, int param_1, DWORD color) { - _BFUIMgrSetControlForeColor og_BFUIMgrSetControlForeColor = (_BFUIMgrSetControlForeColor)0x0040ee08; - - // void* deref_ptr = *(void**)ptr; - - // BFUIMgr *pBFUIMgr = reinterpret_cast(ptr); - - og_BFUIMgrSetControlForeColor(ptr, param_1, color); - -} -void ZTGameMgr::BFInternatSetMoneyText(int param_1, int param_2, char param_3) { - _BFInternatSetMoneyText og_BFInternatSetMoneyText = (_BFInternatSetMoneyText)0x0040ed88; - - og_BFInternatSetMoneyText(param_1, param_2, param_3); -} - -void ZTGameMgr::ZTUIMainSetMoneyText() { - // set money text show in the UI - float money = this->zoo_budget; - DWORD uVar1; // local variable - - // void* pBFUIMgr = *(void**)0x00638de0; - BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); - - // GXRGB color = {0, 0, 0}; // set color to black - - // float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgrSetControlForeColor(pBFUIMgr, 0x3f8, 0xf44bda); // set control forecolor - BFInternatSetMoneyText(0x3f8, (int)(this->zoo_budget), '\x01'); // set money text -} - ZTGameMgr::~ZTGameMgr() { // destructor // clean up detour function pointers diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index c255ac8..68ea349 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -6,11 +6,9 @@ #include "EmuBase.h" #include "BFUIMgr.h" + typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function -typedef void (__thiscall *_BFUIMgrSetControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function -typedef void (__cdecl *_BFInternatSetMoneyText)(int, int, char); // define original BFUIMgrSetControlForeColor function - struct GXRGB { int r; @@ -21,7 +19,7 @@ struct GXRGB { class ZTGameMgr { public: - char pad_0000[12]; //0x0000 + char pad_0004[12]; float zoo_budget; //0x000C char pad_0010[32]; //0x0010 int num_animals; //0x0030 @@ -32,67 +30,36 @@ class ZTGameMgr char pad_0058[364]; //0x0058 float animal_purchase_costs[12]; //0x01C4 float construction_costs[12]; //0x01F4 - float N000000C2[12]; //0x0224 + char pad_0224[48]; //0x0224 float admissions_income[12]; //0x0254 float concessions_benefits[12]; //0x0284 - float N000000C5[12]; //0x02B4 - float N000000C6[12]; //0x02E4 - float N000000C7[12]; //0x0314 - float N000000C8[12]; //0x0344 - float N000000C9[12]; //0x0374 - float N000000CA[12]; //0x03A4 - float N000000CB[12]; //0x03D4 + char pad_02B4[336]; //0x02B4 float zoo_profits[12]; //0x0404 float zoo_values[12]; //0x0434 float zoo_ratings[12]; //0x0464 - float N000000D0[12]; //0x0494 - float N000000D1[12]; //0x04C4 - float N000000D2[12]; //0x04F4 - float N000000D3[12]; //0x0524 - float N000000D4[12]; //0x0554 - float N000000D5[12]; //0x0584 - float N000000D6[12]; //0x05B4 - float N000000D7[12]; //0x05E4 - float number_of_guests[12][4]; //0x0614 - float N000000D9[12]; //0x0644 - float N000000DA[12]; //0x0674 - float N000000DB[12]; //0x06A4 - float N000000DC[12]; //0x06D4 - float N000000DD[12]; //0x0704 - float N000000DE[12]; //0x0734 - float N000000DF[12]; //0x0764 - float N000000E0[12]; //0x0794 - float N000000E1[12]; //0x07C4 - float N000000E2[12]; //0x07F4 - float N000000E3[12]; //0x0824 - float N000000F2[12]; //0x0854 - float N000000F3[12]; //0x0884 - float N000000F4[12]; //0x08B4 - float N000000F5[12]; //0x08E4 - float N000000F6[12]; //0x0914 - float N000000F7[12]; //0x0944 - float N000000F8[12]; //0x0974 - float N000000F9[12]; //0x09A4 - float N000000FA[12]; //0x09D4 - float N000000FB[12]; //0x0A04 - float N000000FC[12]; //0x0A34 - float N000000FD[12]; //0x0A64 - float N000000FE[12]; //0x0A94 - char pad_0AC4[1520]; //0x0AC4 + char pad_0494[384]; //0x0494 + float number_of_guests[12]; //0x0614 + char pad_0644[2928]; //0x0644 + // virtual ~ZTGameMgr(); + // virtual void setNewGameDefaults(void*, char) {}; + // virtual void save(char**) {}; + // virtual void load() {}; + // virtual void update(int) {}; + // virtual void updateSim(unsigned int) {}; + ZTGameMgr(); ~ZTGameMgr(); void addCash(float); - void ZTUIMainSetMoneyText(); static void __fastcall addCash_Detour(void* ptr, float amount); - static void BFUIMgrSetControlForeColor(void* ptr, int param_1, DWORD color); static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; return instance; } + -}; //Size: 0x10B4 +}; //Size: 0x10B4 4528 #endif // ZTGAMEMGR_h \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp index cd5756a..16bca11 100644 --- a/EmuAPI/reimp/ZTMapView.cpp +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -1,5 +1,6 @@ #include "ZTMapView.h" #include "ZTUI.h" +#include "BFUIMgr.h" // ZTMapView::ZTMapView() { // // constructor @@ -11,7 +12,7 @@ void ZTMapView::zoomMap(int param_2) { // zoom map - // void *pZTMapView = reinterpret_cast(0x00638068); + // DWORD *pZTMapView = reinterpret_cast(0x00638068); DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638068)); // 004b072d _zoomMap _ogzoomMap = (_zoomMap)0x004b072d; @@ -30,13 +31,17 @@ DWORD ZTMapView::getMapView() { void ZTMapView::clickZoomOut() { int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - int* uiElem; + BFUIMgr* uiElem; - if (getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0 && *currentZoom != -2) { + if (getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { zoomMap(*currentZoom - 2); uiElem = BFUIMgr::getElement(1007); + if (*currentZoom == -2) { + uiElem = BFUIMgr::getElement(1023); + //_timeTicker func = *reinterpret_cast<_timeTicker*>(reinterpret_cast(uiElem) + 0x6c); + _timeTicker _ogtimeTicker = (_timeTicker)(((DWORD)((LPVOID)uiElem)) + 0x6c); + _ogtimeTicker(); + } } - if (*currentZoom == -2) { - uiElem = BFUIMgr::getElement(1023); - } + } diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 0440c5e..9a821d4 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -6,6 +6,7 @@ typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function +typedef void (*_timeTicker)(); // define original timeTicker function class ZTMapView { public: diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 0d38c25..0e6292c 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -1,4 +1,6 @@ #include "ZTUI.h" +#include "ZTGameMgr.h" +#include "bfinternat.h" unsigned int ZTUI::gameopts::saveGame(void) { _saveGame _ogsaveGame = (_saveGame)0x004769ac; @@ -25,3 +27,18 @@ DWORD* ZTUI::general::getSelectedEntity(void) { } } +void ZTUI::main::setMoneyText() { + // set money text show in the UI + float money = ZTGameMgr::shared_instance().zoo_budget; + + // void* pBFUIMgr = *(void**)0x00638de0; + //DWORD pBFUIMgr = *(DWORD*)((LPVOID)0x00638de0); + //DWORD bfuimgr = *((DWORD*)((LPVOID)0x00638de0)); + BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); + // GXRGB color = {0, 0, 0}; // set color to black + + // float money_to_display = (float)((int)money); // round down to nearest integer + BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0xf44bda); // set control forecolor + bfinternat::setMoneyText(0x3f8, (int)money, '\x01'); // set money text +} + diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 8445868..b989a16 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -19,6 +19,11 @@ namespace ZTUI { static ZTMapView* getMapView(); static DWORD* getSelectedEntity(); }; + + class main { + public: + static void setMoneyText(); + }; }; #endif /* ZTUI_H */ \ No newline at end of file diff --git a/EmuAPI/reimp/bfinternat.cpp b/EmuAPI/reimp/bfinternat.cpp new file mode 100644 index 0000000..b8b4eec --- /dev/null +++ b/EmuAPI/reimp/bfinternat.cpp @@ -0,0 +1,7 @@ +#include "bfinternat.h" + +void bfinternat::setMoneyText(int param_1, int param_2, char param_3) { + _setMoneyText og_setMoneyText = (_setMoneyText)0x0040ed88; + + og_setMoneyText(param_1, param_2, param_3); +} \ No newline at end of file diff --git a/EmuAPI/reimp/bfinternat.h b/EmuAPI/reimp/bfinternat.h new file mode 100644 index 0000000..3af132f --- /dev/null +++ b/EmuAPI/reimp/bfinternat.h @@ -0,0 +1,11 @@ +#ifndef BFINTERNAT_H +#define BFINTERNAT_H + +typedef void (__cdecl *_setMoneyText)(int, int, char); // define original BFUIMgrSetControlForeColor function + +class bfinternat { + public: + static void setMoneyText(int, int, char); +}; + +#endif /* BFINTERNAT_H */ \ No newline at end of file From 7f36a1bea630bfa018060508f33810068b600394 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 01:14:26 -0800 Subject: [PATCH 10/61] added setcash function --- EmuAPI/reimp/ZTGameMgr.cpp | 23 ++++++++++++++++++++++- EmuAPI/reimp/ZTGameMgr.h | 5 ++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 61d7e88..e3c7949 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -1,5 +1,5 @@ #include "ZTGameMgr.h" - +#include ZTGameMgr::ZTGameMgr() { @@ -41,6 +41,11 @@ void ZTGameMgr::init() { EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser + EmuBase::callHook(0x004cb64f, (DWORD)&ZTGameMgr::setCash_Detour); // from showMapSelect + EmuBase::callHook(0x006163ab, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashUp + EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown + EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash + } void ZTGameMgr::addCash(float amount) { @@ -49,6 +54,22 @@ void ZTGameMgr::addCash(float amount) { ZTUI::main::setMoneyText(); // update money text in the UI } +void ZTGameMgr::setCash_Detour(int amount) { + // detour function for setting cash in the game + // Log the amount of cash being set + std::ofstream logfile("cash.txt", std::ios::app); + if (logfile.is_open()) { + logfile << "Setting cash to: " << amount << std::endl; + logfile.close(); + } + + ZTGameMgr::shared_instance().setCash(amount); +} + +void ZTGameMgr::setCash(int amount) { + _setCash _ogsetCash = (_setCash)0x004cb384; + _ogsetCash(amount); +} void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { // detour function for adding cash to the game diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 68ea349..83e85bd 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -9,6 +9,7 @@ typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function +typedef void (__cdecl *_setCash)(int); // define original setCash function struct GXRGB { int r; @@ -51,14 +52,16 @@ class ZTGameMgr ZTGameMgr(); ~ZTGameMgr(); void addCash(float); + void setCash(int); static void __fastcall addCash_Detour(void* ptr, float amount); + static void __cdecl setCash_Detour(int amount); static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; return instance; } - + }; //Size: 0x10B4 4528 From e442e6346283b85000ca01d1ad47a1d23e72b813 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 01:27:53 -0800 Subject: [PATCH 11/61] added subtractCash function and hooks to rewrite --- EmuAPI/reimp/ZTGameMgr.cpp | 34 ++++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTGameMgr.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index e3c7949..01025f5 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -41,11 +41,34 @@ void ZTGameMgr::init() { EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser + EmuBase::callHook(0x004cb64f, (DWORD)&ZTGameMgr::setCash_Detour); // from showMapSelect EmuBase::callHook(0x006163ab, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashUp EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash + EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from update + EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 + EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 + EmuBase::callHook(0x0046944c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0046944c + EmuBase::callHook(0x004702e3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 004702e3 + EmuBase::callHook(0x0047c043, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0047c043 + EmuBase::callHook(0x004841a3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks + EmuBase::callHook(0x00484230, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks + EmuBase::callHook(0x00488e9d, (DWORD)&ZTGameMgr::subtractCash_Detour); // from fn at virt_meth_0x4da252:00488e9d + EmuBase::callHook(0x0048a021, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x489fcd + EmuBase::callHook(0x0048f76c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x48f624 + EmuBase::callHook(0x0049befe, (DWORD)&ZTGameMgr::subtractCash_Detour); // from meth_0x49bec7 + EmuBase::callHook(0x004a099a, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x004d8eda, (DWORD)&ZTGameMgr::subtractCash_Detour); // from placeEntityOnMap + EmuBase::callHook(0x004deb1b, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_005b6710 + EmuBase::callHook(0x004efd66, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x005ce004, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x005ce042, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x005ce068, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + EmuBase::callHook(0x00611666, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_006115f2 + + } void ZTGameMgr::addCash(float amount) { @@ -54,6 +77,17 @@ void ZTGameMgr::addCash(float amount) { ZTUI::main::setMoneyText(); // update money text in the UI } +void ZTGameMgr::subtractCash(int amount) { + // subtract cash from the game + this->zoo_budget -= amount; + ZTUI::main::setMoneyText(); // update money text in the UI +} + +void ZTGameMgr::subtractCash_Detour(int amount) { + // detour function for subtracting cash from the game + ZTGameMgr::shared_instance().subtractCash(amount); +} + void ZTGameMgr::setCash_Detour(int amount) { // detour function for setting cash in the game // Log the amount of cash being set diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 83e85bd..83fa7ab 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -53,8 +53,10 @@ class ZTGameMgr ~ZTGameMgr(); void addCash(float); void setCash(int); + void subtractCash(int); static void __fastcall addCash_Detour(void* ptr, float amount); static void __cdecl setCash_Detour(int amount); + static void __fastcall subtractCash_Detour(int amount); static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { From e4ce81929ae5ed7f0aff44e30af7cbf0238bd70a Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 02:00:58 -0800 Subject: [PATCH 12/61] setMoneyText hooks --- EmuAPI/EmuLoader.cpp | 2 ++ EmuAPI/reimp/ZTGameMgr.cpp | 8 ++++---- EmuAPI/reimp/ZTGameMgr.h | 4 ++-- EmuAPI/reimp/ZTUI.cpp | 18 +++++++++++++++++- EmuAPI/reimp/ZTUI.h | 3 +++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index e2f7c54..47f59f4 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -21,6 +21,7 @@ #include "ZooModels.h" #include "ZTGameMgr.h" #include "BFUIMgr.h" +#include "ZTUI.h" //------ Flags for console bool IsConsoleRunning = false; @@ -269,6 +270,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DetourTransactionCommit(); ZTGameMgr::init(); + ZTUI::main::init(); break; case DLL_PROCESS_DETACH: diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 01025f5..2db22bd 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -47,8 +47,8 @@ void ZTGameMgr::init() { EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash - EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from update - EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 + // EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from ZTResearchBranch::update <--- crashes, not sure why + // EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 <--- crashes, not sure why EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 EmuBase::callHook(0x0046944c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0046944c EmuBase::callHook(0x004702e3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 004702e3 @@ -77,13 +77,13 @@ void ZTGameMgr::addCash(float amount) { ZTUI::main::setMoneyText(); // update money text in the UI } -void ZTGameMgr::subtractCash(int amount) { +void ZTGameMgr::subtractCash(float amount) { // subtract cash from the game this->zoo_budget -= amount; ZTUI::main::setMoneyText(); // update money text in the UI } -void ZTGameMgr::subtractCash_Detour(int amount) { +void ZTGameMgr::subtractCash_Detour(void* ptr, float amount) { // detour function for subtracting cash from the game ZTGameMgr::shared_instance().subtractCash(amount); } diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 83fa7ab..1883572 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -53,10 +53,10 @@ class ZTGameMgr ~ZTGameMgr(); void addCash(float); void setCash(int); - void subtractCash(int); + void subtractCash(float); static void __fastcall addCash_Detour(void* ptr, float amount); static void __cdecl setCash_Detour(int amount); - static void __fastcall subtractCash_Detour(int amount); + static void __fastcall subtractCash_Detour(void* ptr, float amount); static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 0e6292c..928502e 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -1,6 +1,7 @@ #include "ZTUI.h" #include "ZTGameMgr.h" #include "bfinternat.h" +#include "EmuBase.h" unsigned int ZTUI::gameopts::saveGame(void) { _saveGame _ogsaveGame = (_saveGame)0x004769ac; @@ -38,7 +39,22 @@ void ZTUI::main::setMoneyText() { // GXRGB color = {0, 0, 0}; // set color to black // float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0xf44bda); // set control forecolor + BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0x3fd2c7); // set control forecolor bfinternat::setMoneyText(0x3f8, (int)money, '\x01'); // set money text } +void ZTUI::main::init() { + // initialize the UI + // setMoneyText(); + + EmuBase::callHook(0x0040f02e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from addCash + EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim + EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash + EmuBase::callHook(0x00519c1c, (DWORD)&ZTUI::main::setMoneyText_Detour); // from init +} + +void ZTUI::main::setMoneyText_Detour() { + // detour function for setting money text in the UI + ZTUI::main::setMoneyText(); +} + diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index b989a16..9a2c7a3 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -23,6 +23,9 @@ namespace ZTUI { class main { public: static void setMoneyText(); + static void init(); + + static void __cdecl setMoneyText_Detour(); }; }; From 03eda76bc5f5c8a31576402a5ad675ff7bc232ac Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 02:06:46 -0800 Subject: [PATCH 13/61] simple color change for setcontrolforecolor --- EmuAPI/reimp/ZTUI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 928502e..e9f1fcb 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -39,7 +39,7 @@ void ZTUI::main::setMoneyText() { // GXRGB color = {0, 0, 0}; // set color to black // float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0x3fd2c7); // set control forecolor + BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0x001ac5ff); // set control forecolor bfinternat::setMoneyText(0x3f8, (int)money, '\x01'); // set money text } From 925038e3c0d8784d81d75b3510ecdd8df82065ff Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 02:56:44 -0800 Subject: [PATCH 14/61] first pass at a ZTGameMgr::getDate rewrite --- EmuAPI/reimp/ZTGameMgr.cpp | 15 ++++++++++++++- EmuAPI/reimp/ZTGameMgr.h | 7 +++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 2db22bd..cf5fbda 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -1,7 +1,6 @@ #include "ZTGameMgr.h" #include - ZTGameMgr::ZTGameMgr() { // constructor this->zoo_budget = 0.0; @@ -17,9 +16,11 @@ void ZTGameMgr::init() { // initialize instance of ZTGameMgr // initialize detour function pointers DWORD addCashAddress = 0x40f018; // address of addCash function in the game + DWORD getDateAddress = 0x0040e7e0; // address of getDate function in the game DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); + // DetourAttach((PVOID*)&getDateAddress, (PVOID)&ZTGameMgr::getDate_Detour); DetourTransactionCommit(); // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); @@ -83,6 +84,11 @@ void ZTGameMgr::subtractCash(float amount) { ZTUI::main::setMoneyText(); // update money text in the UI } +_FILETIME* ZTGameMgr::getDate_Detour(void* ptr, _FILETIME* date) { + // detour function for getting the current date from the game + return ZTGameMgr::shared_instance().getDate(date); +} + void ZTGameMgr::subtractCash_Detour(void* ptr, float amount) { // detour function for subtracting cash from the game ZTGameMgr::shared_instance().subtractCash(amount); @@ -113,4 +119,11 @@ void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { ZTGameMgr::~ZTGameMgr() { // destructor // clean up detour function pointers +} + +// address: 0x0040e7e0. _FILETIME* return value likely incorrect. +// game has it as a long long, which would have been the same number of bytes as a FILETIME +_FILETIME* ZTGameMgr::getDate(_FILETIME* date) { + SystemTimeToFileTime(¤t_date, date); + return date; } \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 1883572..c50fbef 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -6,7 +6,6 @@ #include "EmuBase.h" #include "BFUIMgr.h" - typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function typedef void (__cdecl *_setCash)(int); // define original setCash function @@ -40,7 +39,8 @@ class ZTGameMgr float zoo_ratings[12]; //0x0464 char pad_0494[384]; //0x0494 float number_of_guests[12]; //0x0614 - char pad_0644[2928]; //0x0644 + char pad_0644[2928]; //0x0644 TODO: subtract current date + SYSTEMTIME current_date; //0x1194 (8 bytes) // virtual ~ZTGameMgr(); // virtual void setNewGameDefaults(void*, char) {}; // virtual void save(char**) {}; @@ -54,6 +54,9 @@ class ZTGameMgr void addCash(float); void setCash(int); void subtractCash(float); + _FILETIME* getDate(_FILETIME* date); + + static _FILETIME* __fastcall getDate_Detour(void* ptr, _FILETIME* date); static void __fastcall addCash_Detour(void* ptr, float amount); static void __cdecl setCash_Detour(int amount); static void __fastcall subtractCash_Detour(void* ptr, float amount); From bccff539565e1261f9edff982e3e18ce024ab0b3 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 13:21:31 -0800 Subject: [PATCH 15/61] pause and resume console commands now use hooks to actual function calls --- EmuAPI/emu/EmuConsole.cpp | 4 ++-- EmuAPI/reimp/ZTGameMgr.h | 14 +++++++++++++- EmuAPI/reimp/ZTUI.cpp | 9 +++++++++ EmuAPI/reimp/ZTUI.h | 5 ++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index bff2717..fe72d2b 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -224,13 +224,13 @@ void EmuConsole::processInput(bool& IsConsoleRunning) { // number of animals hook std::cout << "Pausing..." << std::endl; - ZooState::PauseGame(true); + ZTUI::main::pauseGame(); } else if (tokens[0] == "resume") { // number of animals hook std::cout << "Resuming game..." << std::endl; - ZooState::PauseGame(false); + ZTUI::main::unpauseGame(); } else if (tokens[0] == "num-animals") { diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index c50fbef..36d53c1 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -18,6 +18,12 @@ struct GXRGB { class ZTGameMgr { + class MenuMusicHandler + { + // 20 bytes + void update(unsigned int); // 0x41a13a + + }; public: char pad_0004[12]; float zoo_budget; //0x000C @@ -55,12 +61,18 @@ class ZTGameMgr void setCash(int); void subtractCash(float); _FILETIME* getDate(_FILETIME* date); + void startMenuMusic(); // 0x004bded9 + void startMenuMusicFade(int); // 0x004cc59d + unsigned int save(char**); // 0x47acc5 + void setNewGameDefaults(void*, char); // 0x0058f39c + void stop(int); // 0x004fa123 + + static _FILETIME* __fastcall getDate_Detour(void* ptr, _FILETIME* date); static void __fastcall addCash_Detour(void* ptr, float amount); static void __cdecl setCash_Detour(int amount); static void __fastcall subtractCash_Detour(void* ptr, float amount); - static void BFInternatSetMoneyText(int, int, char); static void init(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index e9f1fcb..b157791 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -58,3 +58,12 @@ void ZTUI::main::setMoneyText_Detour() { ZTUI::main::setMoneyText(); } +void ZTUI::main::unpauseGame() { + _unpauseGame _ogunpauseGame = (_unpauseGame)0x0059c7a9; + _ogunpauseGame(); +} + +void ZTUI::main::pauseGame() { + _pauseGame _ogpauseGame = (_pauseGame)0x0059c6b8; + _ogpauseGame(); +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 9a2c7a3..b51b10d 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -5,6 +5,8 @@ #include "BFUIMgr.h" typedef unsigned int (*_saveGame)(void); // define original saveGame function +typedef void (*_unpauseGame)(void); // define original unpauseGame function +typedef void (*_pauseGame)(void); // define original pauseGame function // typedef ZTMapView (*_getMapView)(void); // define original getMapView function // typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function @@ -24,7 +26,8 @@ namespace ZTUI { public: static void setMoneyText(); static void init(); - + static void unpauseGame(); // hook + static void pauseGame(); // hook static void __cdecl setMoneyText_Detour(); }; }; From acc2959e3c8fbecbeaa7952dfa2db7d76e7e20ee Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 4 Mar 2024 15:28:47 -0800 Subject: [PATCH 16/61] setup for ztapp::init, handlekeydown, emuKeyshandlekeydown, ZTUI::main:loadfile --- EmuAPI/emu/EmuConsole.cpp | 5 ++++ EmuAPI/reimp/ZTApp.cpp | 50 ++++++++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTApp.h | 16 ++++++++++++ EmuAPI/reimp/ZTGameMgr.cpp | 15 ++++++++++++ EmuAPI/reimp/ZTGameMgr.h | 3 +++ EmuAPI/reimp/ZTUI.cpp | 22 ++++++++++++++++- EmuAPI/reimp/ZTUI.h | 2 ++ 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 EmuAPI/reimp/ZTApp.cpp create mode 100644 EmuAPI/reimp/ZTApp.h diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index fe72d2b..570149a 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -448,6 +448,11 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << ZTGameMgr::shared_instance().guest_count << std::endl; std::cout << ZTGameMgr::shared_instance().animal_purchase_costs[0] << std::endl; } + else if (tokens[0] == "playmenumusic") { + + ZTGameMgr::shared_instance().startMenuMusic(); + std::cout << "Menu music played." << std::endl; + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/reimp/ZTApp.cpp b/EmuAPI/reimp/ZTApp.cpp new file mode 100644 index 0000000..fb12b63 --- /dev/null +++ b/EmuAPI/reimp/ZTApp.cpp @@ -0,0 +1,50 @@ +#include "ZTApp.h" +#include "EmuBase.h" +#include "BFUIMgr.h" + +void ZTApp::init() { + EmuBase::callHook(0x004f0b72, (DWORD)&ZTApp::handleKeyDown); // from addCash +} + +void ZTApp::handleKeyDown(int key) { + // handle key down event + _handleKeyDown _oghandleKeyDown = (_handleKeyDown)0x004f0b72; + _oghandleKeyDown(key); +} + +void ZTApp::emuKeysHandleKeyDown(int key) { + + // if (key == 0x11) { + // EmuBase::setCtrlPressed(true); + // } + // // CTRL + T - for testing + // if (EmuBase::DoubleKey(0x11, 0x54) == true) { + // // BFUIMgr::shared_instance().getElement(0x3f8); + // BFUIMgr::clickSave(); + + // // std::ofstream f; + // // f.open("getelement.log", std::ios_base::app); + // // f << "x: " << x << std::endl; + // // f.close(); + // } + + + // //---- CTRL + J + // if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { + // // f << "[" << timestamp << "] " << "Opening console..." << std::endl; + // IsConsoleRunning = true; + // HANDLE thread = CreateThread(NULL, 0, &ZooConsole, NULL, 0, NULL); + // // f << "[" << timestamp << "] " << "Console opened!" << std::endl; + // CloseHandle(thread); + // } + + // //---- CTRL + M + // if (EmuBase::DoubleKey(0x11, 0x4D) == true && !ctrlMPressed) { + // ctrlMPressed = true; // Set the flag + // float mo_money = 1000000.00f; + // ZooState::AddToZooBudget(mo_money); + // } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { + // ctrlMPressed = false; // Reset the flag when the key is released + // } + +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTApp.h b/EmuAPI/reimp/ZTApp.h new file mode 100644 index 0000000..9e0a90d --- /dev/null +++ b/EmuAPI/reimp/ZTApp.h @@ -0,0 +1,16 @@ +#ifndef ZTAPP_H +#define ZTAPP_H + +#include + +typedef void (__cdecl *_handleKeyDown)(int); // define original handleKeyDown function + +class ZTApp +{ +public: + static void init(); + static void handleKeyDown(int); + static void emuKeysHandleKeyDown(int); +}; + +#endif /* ZTAPP_H */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index cf5fbda..ca6455b 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -17,6 +17,7 @@ void ZTGameMgr::init() { // initialize detour function pointers DWORD addCashAddress = 0x40f018; // address of addCash function in the game DWORD getDateAddress = 0x0040e7e0; // address of getDate function in the game + DWORD getStartMenuMusicAddress = 0x004bded9; // address of startMenuMusic function in the game DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); @@ -84,6 +85,19 @@ void ZTGameMgr::subtractCash(float amount) { ZTUI::main::setMoneyText(); // update money text in the UI } +// void ZTGameMgr::startMenuMusic() { +// // start the menu music +// _startMenuMusic _ogstartMenuMusic = (_startMenuMusic)0x004bded9; +// _ogstartMenuMusic(pZTGameMgr); +// } + + +DWORD ZTGameMgr::getZTGameMgr() { + // get the instance of ZTGameMgr + DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); + return *(DWORD*)(_ztGameMgr); +} + _FILETIME* ZTGameMgr::getDate_Detour(void* ptr, _FILETIME* date) { // detour function for getting the current date from the game return ZTGameMgr::shared_instance().getDate(date); @@ -116,6 +130,7 @@ void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { ZTGameMgr::shared_instance().addCash(amount); } + ZTGameMgr::~ZTGameMgr() { // destructor // clean up detour function pointers diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 36d53c1..bd0e7bb 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -9,6 +9,7 @@ typedef __int32 int32_t; typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function typedef void (__cdecl *_setCash)(int); // define original setCash function +typedef void (__fastcall *_startMenuMusic)(void*); // define original startMenuMusic function struct GXRGB { int r; @@ -73,7 +74,9 @@ class ZTGameMgr static void __fastcall addCash_Detour(void* ptr, float amount); static void __cdecl setCash_Detour(int amount); static void __fastcall subtractCash_Detour(void* ptr, float amount); + static void __fastcall startMenuMusic_Detour(int param_1); static void init(); + static DWORD getZTGameMgr(); static ZTGameMgr &shared_instance() { static ZTGameMgr instance; return instance; diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index b157791..34f9471 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -2,12 +2,26 @@ #include "ZTGameMgr.h" #include "bfinternat.h" #include "EmuBase.h" +#include +#include "Windows.h" +#include "detours.h" unsigned int ZTUI::gameopts::saveGame(void) { _saveGame _ogsaveGame = (_saveGame)0x004769ac; return _ogsaveGame(); } +// hooked but filestr is not readable yet +unsigned int ZTUI::gameopts::loadFile(char **filestr) { + _loadFile _ogloadFile = (_loadFile)0x00453000; + // std::ofstream logFile("filename.txt"); + // if (logFile.is_open()) { + // logFile << *filename << std::endl; + // logFile.close(); + // } + return _ogloadFile(filestr); +} + ZTMapView* ZTUI::general::getMapView(void) { ZTMapView *ztmapview = reinterpret_cast(0x00638068); if (ztmapview == 0) { @@ -51,6 +65,11 @@ void ZTUI::main::init() { EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash EmuBase::callHook(0x00519c1c, (DWORD)&ZTUI::main::setMoneyText_Detour); // from init + + EmuBase::callHook(0x00485d9c, (DWORD)&ZTUI::gameopts::loadFile); // from clickContinue + EmuBase::callHook(0x004c9a13, (DWORD)&ZTUI::gameopts::loadFile); // from beginScenario + EmuBase::callHook(0x004cc462, (DWORD)&ZTUI::gameopts::loadFile); // from loadGame + EmuBase::callHook(0x005c1d28, (DWORD)&ZTUI::gameopts::loadFile); // from ZTApp::iniInstance } void ZTUI::main::setMoneyText_Detour() { @@ -66,4 +85,5 @@ void ZTUI::main::unpauseGame() { void ZTUI::main::pauseGame() { _pauseGame _ogpauseGame = (_pauseGame)0x0059c6b8; _ogpauseGame(); -} \ No newline at end of file +} + diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index b51b10d..152f14e 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -7,6 +7,7 @@ typedef unsigned int (*_saveGame)(void); // define original saveGame function typedef void (*_unpauseGame)(void); // define original unpauseGame function typedef void (*_pauseGame)(void); // define original pauseGame function +typedef unsigned int (__cdecl *_loadFile)(char **filename); // define original loadFile function // typedef ZTMapView (*_getMapView)(void); // define original getMapView function // typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function @@ -14,6 +15,7 @@ namespace ZTUI { class gameopts { public: static unsigned int saveGame(); + static unsigned int loadFile(char **filename); }; class general { From bc1ec28f7193fc9babbf00221f728424e98890dd Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Thu, 7 Mar 2024 14:25:28 -0800 Subject: [PATCH 17/61] created getAllEntitiesOfType, makeInvisible functions, BFGameApp, BFMap experiments, disabled subtractCash --- EmuAPI/EmuAPI.vcproj | 16 +++++++++++++ EmuAPI/EmuLoader.cpp | 47 ++++++++++--------------------------- EmuAPI/emu/EmuConsole.cpp | 9 ++----- EmuAPI/reimp/BFGameApp.cpp | 32 +++++++++++++++++++++++++ EmuAPI/reimp/BFGameApp.h | 15 ++++++++++++ EmuAPI/reimp/BFMap.cpp | 22 +++++++++++++++++ EmuAPI/reimp/BFMap.h | 12 ++++++++++ EmuAPI/reimp/ZTGameMgr.cpp | 36 ++++++++++++++-------------- EmuAPI/reimp/ZTUI.cpp | 21 ++++++++++------- EmuAPI/reimp/ZTUI.h | 4 ++-- EmuAPI/reimp/ZTWorldMgr.cpp | 45 +++++++++++++++++++++++++++++++---- EmuAPI/reimp/ZTWorldMgr.h | 5 +++- 12 files changed, 188 insertions(+), 76 deletions(-) create mode 100644 EmuAPI/reimp/BFGameApp.cpp create mode 100644 EmuAPI/reimp/BFGameApp.h create mode 100644 EmuAPI/reimp/BFMap.cpp create mode 100644 EmuAPI/reimp/BFMap.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 6515062..ba45ce0 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -296,6 +296,14 @@ RelativePath=".\reimp\BFEntityType.h" > + + + + @@ -304,6 +312,14 @@ RelativePath=".\reimp\bfinternat.h" > + + + + diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 47f59f4..03595c0 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -22,6 +22,8 @@ #include "ZTGameMgr.h" #include "BFUIMgr.h" #include "ZTUI.h" +#include "BFMap.h" +#include "ZTWorldMgr.h" //------ Flags for console bool IsConsoleRunning = false; @@ -38,12 +40,8 @@ DWORD WINAPI ZooConsole(LPVOID lpParameter); DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function -DWORD BFUIMgrSetControlForeColorAddress = 0x0040ee08; // address of BFUIMgrSetControlForeColor function in the game -DWORD BFInternatSetMoneyTextAddress = 0x0040ed88; // address of BFInternatSetMoneyText function in the game - - -DWORD exitBuildingAddress = 0x4a75bb; // address of exit building function in the game +// DWORD exitBuildingAddress = 0x4a75bb; // address of exit building function in the game // typedef void* (__thiscall *_origexitBuildingAddress)(void* thisptr, int *param_1); // define original update function //------ Namespace and class aliases @@ -58,7 +56,6 @@ std::vector tokens; // contains tokens from console input EmuConsole console(tokens); // console object - //------ ZooModels object extern ZooModels* zoo_models; ZooModels* zoo_models = new ZooModels(); @@ -67,12 +64,6 @@ DWORD setAnimalRatingAddress = 0x0041D08B; DWORD setZooRatingAddress = 0x0041D22F; DWORD setGuestRatingAddress = 0x0041D15D; -//------ Function definitions - -// void __fastcall addCash_Detour(void* ptr, float amount) { -// // detour function for adding cash to the game -// ZTGameMgr::shared_instance().addCash(amount); -// } void __fastcall RunEmu(void* thisptr) { @@ -80,7 +71,13 @@ void __fastcall RunEmu(void* thisptr) { if (EmuBase::DoubleKey(0x11, 0x54) == true) { // BFUIMgr::shared_instance().getElement(0x3f8); - BFUIMgr::clickSave(); + // BFGameApp::incSimSpeed(); + DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); + DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); + int ids[] = {9313, 9314, NULL}; + + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); + ZTWorldMgr::makeInvisible(entities); // std::ofstream f; // f.open("getelement.log", std::ios_base::app); @@ -138,24 +135,6 @@ void __fastcall RunEmu(void* thisptr) { } -// void __cdecl BFInternatSetMoneyText_Detour(int param_1, float param_2, char param_3) { -// // detour function for setting money text -// // set money text -// // ZTGameMgr::BFInternatSetMoneyText(0x3f8, param_2, '\x01'); -// _BFInternatSetMoneyText og_BFInternatSetMoneyText = (_BFInternatSetMoneyText)BFInternatSetMoneyTextAddress; -// og_BFInternatSetMoneyText(param_1, param_2, param_3); -// } - -// void __fastcall BFUIMgrSetControlForeColor_Detour(void* ptr, int param_1, DWORD color) { -// // detour function for setting control forecolor -// // set control forecolor -// // ZTGameMgr::BFUIMgrSetControlForeColor(ptr, param_1, color); - -// _BFUIMgrSetControlForeColor og_BFUIMgrSetControlForeColor = (_BFUIMgrSetControlForeColor)BFUIMgrSetControlForeColorAddress; -// og_BFUIMgrSetControlForeColor(ptr, param_1, color); -// } - - DWORD WINAPI ZooConsole(LPVOID lpParameter) { @@ -263,14 +242,12 @@ BOOL APIENTRY DllMain(HMODULE hModule, DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); - //DetourAttach((PVOID*)&addCashAddress, (PVOID)&addCash_Detour); - //DetourAttach((PVOID*)&exitBuildingAddress, (PVOID)&exitBuilding); - // DetourAttach((PVOID*)&BFUIMgrSetControlForeColorAddress, (PVOID)&BFUIMgrSetControlForeColor_Detour); - // DetourAttach((PVOID*)&BFInternatSetMoneyTextAddress, (PVOID)&BFInternatSetMoneyText_Detour); DetourTransactionCommit(); ZTGameMgr::init(); ZTUI::main::init(); + // EmuBase::callHook(0x00452ea5, (DWORD)&generateMap); + // BFMap::init(); break; case DLL_PROCESS_DETACH: diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 570149a..ba6edcd 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -424,9 +424,9 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << "Err: Command <" << tokens[0] << "> requires a boolean." << std::endl; } } - else if (tokens[0] == "getselentity") { + else if (tokens[0] == "getent") { // return selected entity - std::cout << "The selected entity is: " << ZTUI::general::getSelectedEntity() << std::endl; + std::cout << "The selected entity is: " << std::hex << reinterpret_cast(ZTUI::general::getSelectedEntity()) << std::endl; } else if (tokens[0] == "setmapzoom") { if (tokens.size() < 2) @@ -448,11 +448,6 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << ZTGameMgr::shared_instance().guest_count << std::endl; std::cout << ZTGameMgr::shared_instance().animal_purchase_costs[0] << std::endl; } - else if (tokens[0] == "playmenumusic") { - - ZTGameMgr::shared_instance().startMenuMusic(); - std::cout << "Menu music played." << std::endl; - } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/reimp/BFGameApp.cpp b/EmuAPI/reimp/BFGameApp.cpp new file mode 100644 index 0000000..018b89b --- /dev/null +++ b/EmuAPI/reimp/BFGameApp.cpp @@ -0,0 +1,32 @@ +#include "BFGameApp.h" + + +void BFGameApp::init() { + // initialize instance of BFGameApp + // initialize detour function pointers + // EmuBase::callHook(0x0062075b, (DWORD)&); // from addCash +} + +DWORD BFGameApp::instance(DWORD offset) { + // return instance of BFGameApp + return (*((DWORD*)((LPVOID)0x00638148)) + offset); +} + +// not functional +void BFGameApp::incSimSpeed() { + // detour function for increasing simulation speed + // ZTGameMgr::shared_instance().incSimSpeed(); + + DWORD _thisptr = ((DWORD)((LPVOID)0x00638148)); + void* thisptr = (void*)(_thisptr); + + // char *cVar1 = (char*)(instance(0x442)); + // float *fVar2 = (float*)(instance(0x4e0)); + + // if (*cVar1 != '\0') { + // *fVar2 = *fVar2 + 0.1; + // } + + _incSimSpeed _ogincSimSpeed = (_incSimSpeed)0x00620745; + _ogincSimSpeed(thisptr); +} \ No newline at end of file diff --git a/EmuAPI/reimp/BFGameApp.h b/EmuAPI/reimp/BFGameApp.h new file mode 100644 index 0000000..f54e806 --- /dev/null +++ b/EmuAPI/reimp/BFGameApp.h @@ -0,0 +1,15 @@ +#ifndef BFGameApp_h +#define BFGameApp_h + +#include "EmuBase.h" + +typedef void (__thiscall *_incSimSpeed)(void* thisptr); + +class BFGameApp { + public: + void init(); + static DWORD instance(DWORD offset); + static void incSimSpeed(); +}; + +#endif \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.cpp b/EmuAPI/reimp/BFMap.cpp new file mode 100644 index 0000000..b6361c3 --- /dev/null +++ b/EmuAPI/reimp/BFMap.cpp @@ -0,0 +1,22 @@ +#include "BFMap.h" +#include "EmuBase.h" +#include "detours.h" + +DWORD originalGenerateMapAdd = 0x00452e13; + +void BFMap::init() { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + // DetourAttach((PVOID*)generateMapAdd, (PVOID)&BFMap::generateMap); + DetourAttach((PVOID*)&originalGenerateMapAdd, (PVOID)BFMap::generateMap); + DetourTransactionCommit(); + + // EmuBase::callHook(0x00630ce8, (DWORD)&BFMap::generateMap); + +} + +// not working +int __fastcall BFMap::generateMap(void* a2, int a3, int a4) { + ogGenerateMap original = (ogGenerateMap)originalGenerateMapAdd; + return original(a2, a3, a4); +} \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.h b/EmuAPI/reimp/BFMap.h new file mode 100644 index 0000000..9177f83 --- /dev/null +++ b/EmuAPI/reimp/BFMap.h @@ -0,0 +1,12 @@ +#ifndef BFMAP_H +#define BFMAP_H + +typedef int (__thiscall *ogGenerateMap)(void*, int, int); + +class BFMap { + public: + static void init(); + static int __fastcall generateMap(void*, int, int); +}; + +#endif // BFMAP_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index ca6455b..e3c818f 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -51,24 +51,24 @@ void ZTGameMgr::init() { // EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from ZTResearchBranch::update <--- crashes, not sure why // EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 <--- crashes, not sure why - EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 - EmuBase::callHook(0x0046944c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0046944c - EmuBase::callHook(0x004702e3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 004702e3 - EmuBase::callHook(0x0047c043, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0047c043 - EmuBase::callHook(0x004841a3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks - EmuBase::callHook(0x00484230, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks - EmuBase::callHook(0x00488e9d, (DWORD)&ZTGameMgr::subtractCash_Detour); // from fn at virt_meth_0x4da252:00488e9d - EmuBase::callHook(0x0048a021, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x489fcd - EmuBase::callHook(0x0048f76c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x48f624 - EmuBase::callHook(0x0049befe, (DWORD)&ZTGameMgr::subtractCash_Detour); // from meth_0x49bec7 - EmuBase::callHook(0x004a099a, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x004d8eda, (DWORD)&ZTGameMgr::subtractCash_Detour); // from placeEntityOnMap - EmuBase::callHook(0x004deb1b, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_005b6710 - EmuBase::callHook(0x004efd66, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x005ce004, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x005ce042, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x005ce068, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x00611666, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_006115f2 + // // EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 + // // EmuBase::callHook(0x0046944c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0046944c + // // EmuBase::callHook(0x004702e3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 004702e3 + // // EmuBase::callHook(0x0047c043, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0047c043 + // // EmuBase::callHook(0x004841a3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks + // // EmuBase::callHook(0x00484230, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks + // // EmuBase::callHook(0x00488e9d, (DWORD)&ZTGameMgr::subtractCash_Detour); // from fn at virt_meth_0x4da252:00488e9d + // // EmuBase::callHook(0x0048a021, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x489fcd + // // EmuBase::callHook(0x0048f76c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x48f624 + // // EmuBase::callHook(0x0049befe, (DWORD)&ZTGameMgr::subtractCash_Detour); // from meth_0x49bec7 + // // EmuBase::callHook(0x004a099a, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + // // EmuBase::callHook(0x004d8eda, (DWORD)&ZTGameMgr::subtractCash_Detour); // from placeEntityOnMap + // // EmuBase::callHook(0x004deb1b, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_005b6710 + // // EmuBase::callHook(0x004efd66, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + // // EmuBase::callHook(0x005ce004, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + // // EmuBase::callHook(0x005ce042, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + // // EmuBase::callHook(0x005ce068, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap + // // EmuBase::callHook(0x00611666, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_006115f2 } diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 34f9471..ab85d70 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -31,15 +31,18 @@ ZTMapView* ZTUI::general::getMapView(void) { return ztmapview; } -DWORD* ZTUI::general::getSelectedEntity(void) { - ZTMapView *pZTMapView = (ZTUI::general::getMapView()); - unsigned char* baseAddr = reinterpret_cast(pZTMapView); - DWORD* addressAtOffset = reinterpret_cast(baseAddr + (1084 * sizeof(DWORD))); - if (pZTMapView == 0) { - return 0; - } else { - return addressAtOffset; - } +void* ZTUI::general::getSelectedEntity(void) { + // ZTMapView *pZTMapView = (ZTUI::general::getMapView()); + // unsigned char* baseAddr = reinterpret_cast(pZTMapView); + // // DWORD* addressAtOffset = reinterpret_cast(baseAddr + (1084 * sizeof(DWORD))); + // if (pZTMapView == 0) { + // return 0; + // } else { + // return addressAtOffset; + // } + + _getSelectedEntity _oggetSelectedEntity = (_getSelectedEntity)0x00410f84; + return _oggetSelectedEntity(); } void ZTUI::main::setMoneyText() { diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 152f14e..267104b 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -9,7 +9,7 @@ typedef void (*_unpauseGame)(void); // define original unpauseGame function typedef void (*_pauseGame)(void); // define original pauseGame function typedef unsigned int (__cdecl *_loadFile)(char **filename); // define original loadFile function // typedef ZTMapView (*_getMapView)(void); // define original getMapView function -// typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function +typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function namespace ZTUI { class gameopts { @@ -21,7 +21,7 @@ namespace ZTUI { class general { public: static ZTMapView* getMapView(); - static DWORD* getSelectedEntity(); + static void* getSelectedEntity(); }; class main { diff --git a/EmuAPI/reimp/ZTWorldMgr.cpp b/EmuAPI/reimp/ZTWorldMgr.cpp index d7a899c..c190424 100644 --- a/EmuAPI/reimp/ZTWorldMgr.cpp +++ b/EmuAPI/reimp/ZTWorldMgr.cpp @@ -2,11 +2,48 @@ #include "ZTWorldMgr.h" #include "ZTMapView.h" - DWORD ZTWorldMgr::getWorldMgr() { - return *(DWORD*)((LPVOID)0x00638040); + return (DWORD)((LPVOID)0x00638040); } DWORD ZTWorldMgr::getOffset(DWORD offset) { - return (*((DWORD*)((LPVOID)0x00638040)) + offset); -} \ No newline at end of file + return (*(DWORD*)0x00638040) + offset; +} + +std::vector ZTWorldMgr::getAllEntitiesOfType(DWORD* begin, DWORD* end, int ids[]) { + // store the begin and end pointers of the entity list + + + std::vector entities; + + // iterate through the entity list + for (DWORD** current = reinterpret_cast(begin); current < reinterpret_cast(end); ++current) { + // get the first level pointer + DWORD* firstLevelPtr = *current; + if (!firstLevelPtr) continue; + + // get the second level pointer + DWORD* secondLevelPtr = *reinterpret_cast(reinterpret_cast(firstLevelPtr) + 0x128); + if (!secondLevelPtr) continue; + + // get second level pointer's entity ID + int entityID = *reinterpret_cast(reinterpret_cast(secondLevelPtr) + 0x104); + + for (size_t i = 0; ids[i] != NULL; i++) { + if (entityID == ids[i]) { + // store the pointer to the entity + entities.push_back(firstLevelPtr); + } + } + } + + return entities; +} + +void ZTWorldMgr::makeInvisible(std::vector entities) { + for (size_t i = 0; i < entities.size(); i++) { + // Correctly calculate the pointer to the visibility flag + bool* visibilityFlag = reinterpret_cast(reinterpret_cast(entities[i]) + 0x13f); + *visibilityFlag = false; + } +} diff --git a/EmuAPI/reimp/ZTWorldMgr.h b/EmuAPI/reimp/ZTWorldMgr.h index 4a457ff..65e4c4d 100644 --- a/EmuAPI/reimp/ZTWorldMgr.h +++ b/EmuAPI/reimp/ZTWorldMgr.h @@ -2,7 +2,7 @@ #define ZTWORDLMGR_H #include "Windows.h" - +#include class ZTWorldMgr { public: @@ -12,6 +12,9 @@ class ZTWorldMgr { static DWORD getWorldMgr(); static DWORD getOffset(DWORD); + + static std::vector getAllEntitiesOfType(DWORD*, DWORD*, int ids[]); + static void makeInvisible(std::vector); }; #endif // ZTWORDLMGR_H From 672a5ffcbb2e63d2e696450641e659e9a7ef9e94 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Fri, 8 Mar 2024 17:00:45 -0800 Subject: [PATCH 18/61] fixed incSimSpeed, getElement hooks. added console commands: getelem, zoomout, incspd --- EmuAPI/EmuLoader.cpp | 11 ++++++----- EmuAPI/emu/EmuConsole.cpp | 12 ++++++++++++ EmuAPI/reimp/BFGameApp.cpp | 7 +++---- EmuAPI/reimp/BFGameApp.h | 2 +- EmuAPI/reimp/BFMap.cpp | 4 ++-- EmuAPI/reimp/BFMap.h | 4 ++-- EmuAPI/reimp/BFUIMgr.cpp | 16 +++++++++------- EmuAPI/reimp/BFUIMgr.h | 9 +++++---- EmuAPI/reimp/ZTMapView.cpp | 30 ++++++++++++++++-------------- EmuAPI/reimp/ZTMapView.h | 3 +-- EmuAPI/reimp/ZTUI.cpp | 6 +++--- EmuAPI/reimp/ZTUI.h | 2 +- EmuAPI/reimp/ZTWorldMgr.cpp | 4 ++-- EmuAPI/reimp/ZTWorldMgr.h | 2 +- 14 files changed, 64 insertions(+), 48 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 03595c0..4c973af 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -72,13 +72,14 @@ void __fastcall RunEmu(void* thisptr) { if (EmuBase::DoubleKey(0x11, 0x54) == true) { // BFUIMgr::shared_instance().getElement(0x3f8); // BFGameApp::incSimSpeed(); - DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); - DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); - int ids[] = {9313, 9314, NULL}; + // DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); + // DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); + // int ids[] = {6101, 6111, NULL}; - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); - ZTWorldMgr::makeInvisible(entities); + // std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); + // ZTWorldMgr::makeInvisible(entities); + BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); // std::ofstream f; // f.open("getelement.log", std::ios_base::app); // f << "x: " << x << std::endl; diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index ba6edcd..d878fd7 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -1,6 +1,7 @@ #include "EmuConsole.h" #include #include "ZTGameMgr.h" +#include "BFGameApp.h" EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { @@ -448,6 +449,17 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << ZTGameMgr::shared_instance().guest_count << std::endl; std::cout << ZTGameMgr::shared_instance().animal_purchase_costs[0] << std::endl; } + else if (tokens[0] == "getelem") { + std::cout << BFUIMgr::getElement(::atoi(tokens[1].c_str())) << std::endl; + } + else if (tokens[0] == "zoomout") { + ZTMapView::clickZoomOut(); + std::cout << "Zoomed out." << std::endl; + } + else if (tokens[0] == "incspd") { + std::cout << "Increasing sim speed..." << std::endl; + BFGameApp::incSimSpeed(); + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/reimp/BFGameApp.cpp b/EmuAPI/reimp/BFGameApp.cpp index 018b89b..6e918fe 100644 --- a/EmuAPI/reimp/BFGameApp.cpp +++ b/EmuAPI/reimp/BFGameApp.cpp @@ -16,9 +16,8 @@ DWORD BFGameApp::instance(DWORD offset) { void BFGameApp::incSimSpeed() { // detour function for increasing simulation speed // ZTGameMgr::shared_instance().incSimSpeed(); - - DWORD _thisptr = ((DWORD)((LPVOID)0x00638148)); - void* thisptr = (void*)(_thisptr); + // 0063088c + void* _thisptr = (void*)0x00638148; // char *cVar1 = (char*)(instance(0x442)); // float *fVar2 = (float*)(instance(0x4e0)); @@ -28,5 +27,5 @@ void BFGameApp::incSimSpeed() { // } _incSimSpeed _ogincSimSpeed = (_incSimSpeed)0x00620745; - _ogincSimSpeed(thisptr); + _ogincSimSpeed(_thisptr); } \ No newline at end of file diff --git a/EmuAPI/reimp/BFGameApp.h b/EmuAPI/reimp/BFGameApp.h index f54e806..5f2d03f 100644 --- a/EmuAPI/reimp/BFGameApp.h +++ b/EmuAPI/reimp/BFGameApp.h @@ -3,7 +3,7 @@ #include "EmuBase.h" -typedef void (__thiscall *_incSimSpeed)(void* thisptr); +typedef void (__thiscall *_incSimSpeed)(void*); class BFGameApp { public: diff --git a/EmuAPI/reimp/BFMap.cpp b/EmuAPI/reimp/BFMap.cpp index b6361c3..ead796e 100644 --- a/EmuAPI/reimp/BFMap.cpp +++ b/EmuAPI/reimp/BFMap.cpp @@ -16,7 +16,7 @@ void BFMap::init() { } // not working -int __fastcall BFMap::generateMap(void* a2, int a3, int a4) { +void BFMap::generateMap(void* a2, int a3, int a4, char a5) { ogGenerateMap original = (ogGenerateMap)originalGenerateMapAdd; - return original(a2, a3, a4); + return original(a2, a3, a4, a5); } \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.h b/EmuAPI/reimp/BFMap.h index 9177f83..21b15df 100644 --- a/EmuAPI/reimp/BFMap.h +++ b/EmuAPI/reimp/BFMap.h @@ -1,12 +1,12 @@ #ifndef BFMAP_H #define BFMAP_H -typedef int (__thiscall *ogGenerateMap)(void*, int, int); +typedef void (__thiscall *ogGenerateMap)(void*, int, int, char); class BFMap { public: static void init(); - static int __fastcall generateMap(void*, int, int); + static void generateMap(void*, int, int, char); }; #endif // BFMAP_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp index 2fa542c..1a22dc0 100644 --- a/EmuAPI/reimp/BFUIMgr.cpp +++ b/EmuAPI/reimp/BFUIMgr.cpp @@ -16,13 +16,15 @@ BFUIMgr::~BFUIMgr() { // return _getElementAdd(pThis, param_1); // } -BFUIMgr* BFUIMgr::getElement(int param_1) { +void* BFUIMgr::getElement(int param_1) { _getElement _oggetElement = (_getElement)0x0040157d; - // DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638de0)); - BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); - //BFUIMgr *pBFUIMgr = reinterpret_cast(0x00638de0); - return _oggetElement((LPVOID)pBFUIMgr, param_1); + return _oggetElement(BFUIMgr::getUIMgr(), param_1); +} + +int BFUIMgr::confirmDialog(void* pThis, char param_1, int param_2, int param_3, std::string param_4, char param_5, char param_6, int param_7, int param_8) { + _confirmDialog _ogconfirmDialog = (_confirmDialog)0x004fff2c; + return _ogconfirmDialog(pThis, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8); } void BFUIMgr::clickSave() { @@ -34,8 +36,8 @@ void BFUIMgr::clickSave() { //} } -DWORD BFUIMgr::getUIMgr() { - return *((DWORD*)((LPVOID)0x00638de0)); +void* BFUIMgr::getUIMgr() { + return (void*)0x00638de0;; } DWORD BFUIMgr::getOffset(DWORD offset) { diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h index 72e5108..77e75cd 100644 --- a/EmuAPI/reimp/BFUIMgr.h +++ b/EmuAPI/reimp/BFUIMgr.h @@ -4,19 +4,20 @@ #include "ZTUI.h" typedef void (__thiscall *_setControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function - +typedef int (__thiscall *_confirmDialog)(void*, char, int, int, std::string, char, char, int, int); // define original BFUIMgrConfirmDialog function class BFUIMgr { public: BFUIMgr(); ~BFUIMgr(); char padding[170]; // assumption on size. constructor not yet found. - static BFUIMgr* getElement(int); + static void* getElement(int); static int __cdecl __getElement(void* pThis, int param_1); static void clickSave(); - static DWORD getUIMgr(); + static void* getUIMgr(); static DWORD getOffset(DWORD); static void setControlForeColor(void*, int, DWORD); + static int confirmDialog(void*, char, int, int, std::string, char, char, int, int); // static BFUIMgr &shared_instance() { @@ -25,7 +26,7 @@ class BFUIMgr { // } }; -typedef BFUIMgr* (__thiscall *_getElement)(void*, int); // define original getElement function +typedef void* (__thiscall *_getElement)(void*, int); // define original getElement function #endif /* BFUIMgr_h */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp index 16bca11..a31ba75 100644 --- a/EmuAPI/reimp/ZTMapView.cpp +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -2,6 +2,8 @@ #include "ZTUI.h" #include "BFUIMgr.h" +typedef void (__thiscall *_zoomMapWidgetCall)(void*); + // ZTMapView::ZTMapView() { // // constructor // } @@ -12,11 +14,8 @@ void ZTMapView::zoomMap(int param_2) { // zoom map - // DWORD *pZTMapView = reinterpret_cast(0x00638068); - DWORD ptr_ZTMapView = *((DWORD*)((LPVOID)0x00638068)); - // 004b072d - _zoomMap _ogzoomMap = (_zoomMap)0x004b072d; - _ogzoomMap((LPVOID)ptr_ZTMapView, param_2); + _zoomMap _ogzoomMap = (_zoomMap)0x004c85c0; + _ogzoomMap(getMapView(), param_2); } DWORD getOffset(DWORD offset) @@ -25,22 +24,25 @@ DWORD getOffset(DWORD offset) } // Live version of the ZTMapView state -DWORD ZTMapView::getMapView() { - return *((DWORD*)((LPVOID)0x00638068)); +void* ZTMapView::getMapView() { + return (void*)0x00638068; } +// doesn't do anything yet void ZTMapView::clickZoomOut() { int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - BFUIMgr* uiElem; - - if (getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { - zoomMap(*currentZoom - 2); + void* uiElem; + uiElem = BFUIMgr::getElement(1023); + _zoomMapWidgetCall func1 = (_zoomMapWidgetCall)0x0041914B; + func1(uiElem); + if (ZTMapView::getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { + int zoom = *currentZoom - 2; + ZTMapView::zoomMap(zoom); uiElem = BFUIMgr::getElement(1007); if (*currentZoom == -2) { uiElem = BFUIMgr::getElement(1023); - //_timeTicker func = *reinterpret_cast<_timeTicker*>(reinterpret_cast(uiElem) + 0x6c); - _timeTicker _ogtimeTicker = (_timeTicker)(((DWORD)((LPVOID)uiElem)) + 0x6c); - _ogtimeTicker(); + _zoomMapWidgetCall func2 = (_zoomMapWidgetCall)0x00419191; + func2(uiElem); } } diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 9a821d4..3033b52 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -6,7 +6,6 @@ typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function -typedef void (*_timeTicker)(); // define original timeTicker function class ZTMapView { public: @@ -16,7 +15,7 @@ class ZTMapView { static ZTMapView instance = *ztmapview; return instance; } - static DWORD getMapView(); + static void* getMapView(); static void zoomMap(int); static void clickZoomOut(); }; diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index ab85d70..a5172ed 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -22,10 +22,10 @@ unsigned int ZTUI::gameopts::loadFile(char **filestr) { return _ogloadFile(filestr); } -ZTMapView* ZTUI::general::getMapView(void) { - ZTMapView *ztmapview = reinterpret_cast(0x00638068); +void* ZTUI::general::getMapView(void) { + void* ztmapview = (void*)(0x00638068); if (ztmapview == 0) { - ztmapview = (ZTMapView*)BFUIMgr::getElement(7000); + ztmapview = (void*)BFUIMgr::getElement(7000); } return ztmapview; diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index 267104b..a2c65b2 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -20,7 +20,7 @@ namespace ZTUI { class general { public: - static ZTMapView* getMapView(); + static void* getMapView(); static void* getSelectedEntity(); }; diff --git a/EmuAPI/reimp/ZTWorldMgr.cpp b/EmuAPI/reimp/ZTWorldMgr.cpp index c190424..eb8a3ed 100644 --- a/EmuAPI/reimp/ZTWorldMgr.cpp +++ b/EmuAPI/reimp/ZTWorldMgr.cpp @@ -2,8 +2,8 @@ #include "ZTWorldMgr.h" #include "ZTMapView.h" -DWORD ZTWorldMgr::getWorldMgr() { - return (DWORD)((LPVOID)0x00638040); +void* ZTWorldMgr::getWorldMgr() { + return (void*)0x00638040; } DWORD ZTWorldMgr::getOffset(DWORD offset) { diff --git a/EmuAPI/reimp/ZTWorldMgr.h b/EmuAPI/reimp/ZTWorldMgr.h index 65e4c4d..976272c 100644 --- a/EmuAPI/reimp/ZTWorldMgr.h +++ b/EmuAPI/reimp/ZTWorldMgr.h @@ -10,7 +10,7 @@ class ZTWorldMgr { ZTWorldMgr(); ~ZTWorldMgr(); - static DWORD getWorldMgr(); + static void* getWorldMgr(); static DWORD getOffset(DWORD); static std::vector getAllEntitiesOfType(DWORD*, DWORD*, int ids[]); From 9f48dd5fadb8e9b1358585f7bea4cd721f1ecf54 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Fri, 8 Mar 2024 20:02:13 -0800 Subject: [PATCH 19/61] working mousewheel zoom in/out --- EmuAPI/EmuLoader.cpp | 49 ++++++++++++++++++++++++++++------- EmuAPI/emu/EmuConsole.cpp | 4 --- EmuAPI/reimp/ZTMapView.cpp | 53 +++++++++++++++++++++++++------------- EmuAPI/reimp/ZTMapView.h | 3 +++ 4 files changed, 78 insertions(+), 31 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 4c973af..4701914 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -24,6 +24,7 @@ #include "ZTUI.h" #include "BFMap.h" #include "ZTWorldMgr.h" +#include "ZTMapView.h" //------ Flags for console bool IsConsoleRunning = false; @@ -35,6 +36,7 @@ bool ctrlMPressed = false; // ------ Function prototypes DWORD WINAPI ZooConsole(LPVOID lpParameter); +BOOL InitializeHook(); //------ Function pointers DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game @@ -48,7 +50,7 @@ typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update #define fs std::filesystem //------ Global variables -HHOOK hHook = NULL; +HHOOK hMsgHook = NULL; int consoleW = 400; // console window width int consoleH = 200; // console window height EmuScriptMgr sm; // script manager object @@ -63,12 +65,19 @@ ZooModels* zoo_models = new ZooModels(); DWORD setAnimalRatingAddress = 0x0041D08B; DWORD setZooRatingAddress = 0x0041D22F; DWORD setGuestRatingAddress = 0x0041D15D; +bool hasHooked = false; void __fastcall RunEmu(void* thisptr) { // main loop + if (!hasHooked) { + InitializeHook(); // initialize mouse hook + + hasHooked = true; + } + if (EmuBase::DoubleKey(0x11, 0x54) == true) { // BFUIMgr::shared_instance().getElement(0x3f8); // BFGameApp::incSimSpeed(); @@ -209,12 +218,38 @@ void __cdecl SetAnimalRating(int rating) { // return ogexitBuilding(thisptr, param_1); // } +LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { + if (nCode == HC_ACTION) { + MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam; + if (wParam == WM_MOUSEWHEEL) { + int wheelDelta = GET_WHEEL_DELTA_WPARAM(pMouseStruct->mouseData); + int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); + if (wheelDelta > 0 && *currentZoom < 2) { + // f << "Mouse wheel up!" << std::endl; + ZTMapView::clickZoomIn(); + } else if (wheelDelta < 0 && *currentZoom > -2) { + // f << "Mouse wheel down!" << std::endl; + ZTMapView::clickZoomOut(); + } + } + return CallNextHookEx(NULL, nCode, wParam, lParam); +} +} + +BOOL InitializeHook() +{ + // call SetWindowsHookEx here + HHOOK hHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), 0); + if (hHook == NULL) { + // handle error + return false; + } + return true; +} // ------ DllMain -BOOL APIENTRY DllMain(HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved) { +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { // Get the thread ID of the current thread @@ -224,11 +259,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, // dll attachment status switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: - { - // f << "[" << timestamp << "] " << "DLL attached!\n"; - // HANDLE thread = CreateThread(NULL, 0, &RunEmu, NULL, 0, NULL); - // CloseHandle(thread); - } //------ Find/load script file directories with script manager sm.findScripts(); sm.storeScripts(); @@ -247,6 +277,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DetourTransactionCommit(); ZTGameMgr::init(); ZTUI::main::init(); + ZTMapView::init(); // EmuBase::callHook(0x00452ea5, (DWORD)&generateMap); // BFMap::init(); diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index d878fd7..093a3b9 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -438,10 +438,6 @@ void EmuConsole::processInput(bool& IsConsoleRunning) ZTMapView::zoomMap(::atoi(tokens[1].c_str())); std::cout << "Map zoom level set to: " << tokens[1] << std::endl; } - else if (tokens[0] == "clickzoomout") { - ZTMapView::clickZoomOut(); - std::cout << "Clicked zoom out." << std::endl; - } else if (tokens[0] == "ztgr") { std::cout << ZTGameMgr::shared_instance().zoo_budget << std::endl; std::cout << ZTGameMgr::shared_instance().num_animals << std::endl; diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp index a31ba75..26205bc 100644 --- a/EmuAPI/reimp/ZTMapView.cpp +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -1,6 +1,7 @@ #include "ZTMapView.h" #include "ZTUI.h" #include "BFUIMgr.h" +#include "detours.h" typedef void (__thiscall *_zoomMapWidgetCall)(void*); @@ -12,9 +13,17 @@ typedef void (__thiscall *_zoomMapWidgetCall)(void*); // // destructor // } +void ZTMapView::init() { + // DWORD _clickZoomOut = 0x004b0779; + // DetourTransactionBegin(); + // DetourUpdateThread(GetCurrentThread()); + // DetourAttach((PVOID*)&_clickZoomOut, (PVOID)ZTMapView::clickZoomOut); + // DetourTransactionCommit(); +} + void ZTMapView::zoomMap(int param_2) { // zoom map - _zoomMap _ogzoomMap = (_zoomMap)0x004c85c0; + _zoomMap _ogzoomMap = (_zoomMap)0x004b072d; _ogzoomMap(getMapView(), param_2); } @@ -28,22 +37,30 @@ void* ZTMapView::getMapView() { return (void*)0x00638068; } -// doesn't do anything yet -void ZTMapView::clickZoomOut() { - int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - void* uiElem; - uiElem = BFUIMgr::getElement(1023); - _zoomMapWidgetCall func1 = (_zoomMapWidgetCall)0x0041914B; - func1(uiElem); - if (ZTMapView::getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { - int zoom = *currentZoom - 2; - ZTMapView::zoomMap(zoom); - uiElem = BFUIMgr::getElement(1007); - if (*currentZoom == -2) { - uiElem = BFUIMgr::getElement(1023); - _zoomMapWidgetCall func2 = (_zoomMapWidgetCall)0x00419191; - func2(uiElem); - } - } +// // doesn't do anything yet +// void ZTMapView::clickZoomOut() { +// if (ZTMapView::getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { +// int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); +// int zoom = *currentZoom - 2; +// ZTMapView::zoomMap(zoom); +// void* uiElem = BFUIMgr::getElement(1007); +// _zoomMapWidgetCall func1 = (_zoomMapWidgetCall)0x0041914B; +// func1(uiElem); +// if (*currentZoom == -2) { +// uiElem = BFUIMgr::getElement(1023); +// _zoomMapWidgetCall func2 = (_zoomMapWidgetCall)0x00419191; +// func2(uiElem); +// } +// } +// } + +void ZTMapView::clickZoomOut() { + _clickZoomOut _ogclickZoomOut = (_clickZoomOut)0x004b0779; + _ogclickZoomOut(); } + +void ZTMapView::clickZoomIn() { + _clickZoomOut _ogclickZoomIn = (_clickZoomOut)0x004b081b; + _ogclickZoomIn(); +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 3033b52..4b2394e 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -6,6 +6,7 @@ typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function +typedef void (__cdecl *_clickZoomOut)(); // define original clickZoomOut function class ZTMapView { public: @@ -18,6 +19,8 @@ class ZTMapView { static void* getMapView(); static void zoomMap(int); static void clickZoomOut(); + static void clickZoomIn(); + void static init(); }; #endif // ZTMAPVIEW_H \ No newline at end of file From 11d8153f014227d48481932b7d80beb5c186c221 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Fri, 8 Mar 2024 20:28:21 -0800 Subject: [PATCH 20/61] working CTRL+Mousewheel scroll map rotatations --- EmuAPI/EmuLoader.cpp | 22 +++++++++++++++++----- EmuAPI/reimp/ZTMapView.cpp | 10 ++++++++++ EmuAPI/reimp/ZTMapView.h | 4 ++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 4701914..885a761 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -223,13 +223,25 @@ LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam; if (wParam == WM_MOUSEWHEEL) { int wheelDelta = GET_WHEEL_DELTA_WPARAM(pMouseStruct->mouseData); + bool isCtrlPressed = GetAsyncKeyState(VK_CONTROL) & 0x8000; int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - if (wheelDelta > 0 && *currentZoom < 2) { + if (isCtrlPressed) { + if (isCtrlPressed && wheelDelta > 0) { // f << "Mouse wheel up!" << std::endl; - ZTMapView::clickZoomIn(); - } else if (wheelDelta < 0 && *currentZoom > -2) { - // f << "Mouse wheel down!" << std::endl; - ZTMapView::clickZoomOut(); + ZTMapView::rotateCW(); + } else if (isCtrlPressed && wheelDelta < 0) { + // f << "Mouse wheel down!" << std::endl; + ZTMapView::rotateCCW(); + } + + } else { + if (wheelDelta > 0 && *currentZoom < 2) { + // f << "Mouse wheel up!" << std::endl; + ZTMapView::clickZoomIn(); + } else if (wheelDelta < 0 && *currentZoom > -2) { + // f << "Mouse wheel down!" << std::endl; + ZTMapView::clickZoomOut(); + } } } return CallNextHookEx(NULL, nCode, wParam, lParam); diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp index 26205bc..df4a54d 100644 --- a/EmuAPI/reimp/ZTMapView.cpp +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -63,4 +63,14 @@ void ZTMapView::clickZoomOut() { void ZTMapView::clickZoomIn() { _clickZoomOut _ogclickZoomIn = (_clickZoomOut)0x004b081b; _ogclickZoomIn(); +} + +void ZTMapView::rotateCW() { + _rotateCW _ogrotateCW = (_rotateCW)0x004b071a; + _ogrotateCW(); +} + +void ZTMapView::rotateCCW() { + _rotateCCW _ogrotateCCW = (_rotateCCW)0x00416cb7; + _ogrotateCCW(); } \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 4b2394e..91a1cce 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -7,6 +7,8 @@ typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function typedef void (__cdecl *_clickZoomOut)(); // define original clickZoomOut function +typedef void (__thiscall *_rotateCW)(); // define original rotateCW function +typedef void (__thiscall *_rotateCCW)(); // define original rotateCCW function class ZTMapView { public: @@ -20,6 +22,8 @@ class ZTMapView { static void zoomMap(int); static void clickZoomOut(); static void clickZoomIn(); + static void rotateCW(); + static void rotateCCW(); void static init(); }; From a645956059595786d28da8dc6d695d3b4be884ff Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Fri, 8 Mar 2024 21:51:08 -0800 Subject: [PATCH 21/61] created EmuControls, EmuMain, abstracted code away from EmuLoader --- EmuAPI/EmuLoader.cpp | 109 ------------------------------------- EmuAPI/emu/EmuConsole.h | 1 + EmuAPI/emu/EmuControls.cpp | 46 ++++++++++++++++ EmuAPI/emu/EmuControls.h | 11 ++++ EmuAPI/emu/EmuMain.cpp | 68 +++++++++++++++++++++++ EmuAPI/emu/EmuMain.h | 20 +++++++ 6 files changed, 146 insertions(+), 109 deletions(-) create mode 100644 EmuAPI/emu/EmuControls.cpp create mode 100644 EmuAPI/emu/EmuControls.h create mode 100644 EmuAPI/emu/EmuMain.cpp create mode 100644 EmuAPI/emu/EmuMain.h diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 885a761..ec74e55 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -67,115 +67,6 @@ DWORD setZooRatingAddress = 0x0041D22F; DWORD setGuestRatingAddress = 0x0041D15D; bool hasHooked = false; - -void __fastcall RunEmu(void* thisptr) { - - // main loop - - if (!hasHooked) { - InitializeHook(); // initialize mouse hook - - hasHooked = true; - } - - if (EmuBase::DoubleKey(0x11, 0x54) == true) { - // BFUIMgr::shared_instance().getElement(0x3f8); - // BFGameApp::incSimSpeed(); - // DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); - // DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); - // int ids[] = {6101, 6111, NULL}; - - // std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); - // ZTWorldMgr::makeInvisible(entities); - - BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); - // std::ofstream f; - // f.open("getelement.log", std::ios_base::app); - // f << "x: " << x << std::endl; - // f.close(); - } - - - //---- CTRL + J - if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { - // f << "[" << timestamp << "] " << "Opening console..." << std::endl; - IsConsoleRunning = true; - HANDLE thread = CreateThread(NULL, 0, &ZooConsole, NULL, 0, NULL); - // f << "[" << timestamp << "] " << "Console opened!" << std::endl; - CloseHandle(thread); - } - - //---- CTRL + M - if (EmuBase::DoubleKey(0x11, 0x4D) == true && !ctrlMPressed) { - ctrlMPressed = true; // Set the flag - float mo_money = 1000000.00f; - ZooState::AddToZooBudget(mo_money); - } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { - ctrlMPressed = false; // Reset the flag when the key is released - } - - // only run scripts while zoo is loaded and not in main menu - if ((int)ZooState::object_ptr(0x0) > 0) { - // f << "[" << timestamp << "] " << "Is no longer in main menu!" << std::endl; - if (ZooState::IsZooLoaded() == true) { - // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; - *zoo_models = sm.executeScripts(); - // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; - - - } - - } - - //---- Process the input tokens while console is running - if (!tokens.empty() && IsConsoleRunning == true) - { - console.processInput(IsConsoleRunning); - tokens.clear(); - CommandIsProcessing = false; // reset flag to allow another command to be tokenized - } - - //---- return to original update function - _origUpdate ogUpdate = (_origUpdate)updateAddress; - // f << "[" << timestamp << "] " << "EMU loop finished!" << std::endl; - - ogUpdate(thisptr); - - // f << "[" << timestamp << "] " << "ogUpdate(thisptr) called!" << std::endl; - -} - -DWORD WINAPI ZooConsole(LPVOID lpParameter) -{ - - - - HasConsoleOpenedOnce = true; - - HWND consoleWindow = EmuConsole::createConsole(); - - while (IsConsoleRunning) - { - // ------ Tokenize the input - if (!CommandIsProcessing) - { - std::cout << ">> "; - CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once - console.tokenize(CommandIsProcessing); - } - Sleep(10); - - } - - // ------ Close the console window - HasConsoleOpenedOnce = false; - IsConsoleRunning = false; - FreeConsole(); - Sleep(100); - PostMessage(consoleWindow, WM_CLOSE, 0, 0); - return 1; -} - // ------ Detours typedef void (__cdecl *_setAnimalRating)(int); // define original setAnimalRating function diff --git a/EmuAPI/emu/EmuConsole.h b/EmuAPI/emu/EmuConsole.h index a99b22a..4bcf20d 100644 --- a/EmuAPI/emu/EmuConsole.h +++ b/EmuAPI/emu/EmuConsole.h @@ -24,6 +24,7 @@ class EmuConsole ~EmuConsole(); void tokenize(bool&); static HWND createConsole(); + static DWORD WINAPI ZooConsole(LPVOID, bool&, bool&, bool&); private: std::vector& tokens; static void EnableVirtualTerminalProcessing(); diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp new file mode 100644 index 0000000..a955148 --- /dev/null +++ b/EmuAPI/emu/EmuControls.cpp @@ -0,0 +1,46 @@ +#include "EmuControls.h" +#include "BFUIMgr.h" +#include "EmuBase.h" +#include "ZooState.h" +#include "EmuConsole.h" +#include "EmuMain.h" + +void EmuControls::procControls(bool &IsConsoleRunning, bool &HasConsoleOpenedOnce, bool &ctrlMPressed) +{ + if (EmuBase::DoubleKey(0x11, 0x54) == true) { + // BFUIMgr::shared_instance().getElement(0x3f8); + // BFGameApp::incSimSpeed(); + // DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); + // DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); + // int ids[] = {6101, 6111, NULL}; + + // std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); + // ZTWorldMgr::makeInvisible(entities); + + BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); + // std::ofstream f; + // f.open("getelement.log", std::ios_base::app); + // f << "x: " << x << std::endl; + // f.close(); + } + + + //---- CTRL + J + if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { + // f << "[" << timestamp << "] " << "Opening console..." << std::endl; + IsConsoleRunning = true; + HANDLE thread = CreateThread(NULL, 0, &EmuMain::ZooConsole(), NULL, 0, NULL); + // f << "[" << timestamp << "] " << "Console opened!" << std::endl; + CloseHandle(thread); + } + + //---- CTRL + M + if (EmuBase::DoubleKey(0x11, 0x4D) == true && !ctrlMPressed) { + ctrlMPressed = true; // Set the flag + float mo_money = 1000000.00f; + ZooState::AddToZooBudget(mo_money); + } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { + ctrlMPressed = false; // Reset the flag when the key is released + } + +} \ No newline at end of file diff --git a/EmuAPI/emu/EmuControls.h b/EmuAPI/emu/EmuControls.h new file mode 100644 index 0000000..f845497 --- /dev/null +++ b/EmuAPI/emu/EmuControls.h @@ -0,0 +1,11 @@ +#ifndef EMUCONTROLS_H +#define EMUCONTROLS_H + + +class EmuControls +{ + public: + static void procControls(bool&, bool&); +}; + +#endif // EMUCONTROLS_H \ No newline at end of file diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp new file mode 100644 index 0000000..072eb63 --- /dev/null +++ b/EmuAPI/emu/EmuMain.cpp @@ -0,0 +1,68 @@ +#include "EmuMain.h" +#include "EmuConsole.h" + +DWORD WINAPI EmuMain::ZooConsole(LPVOID lpParameter, EmuConsole console, bool &IsConsoleRunning, bool &CommandIsProcessing, bool &HasConsoleOpenedOnce) +{ + HasConsoleOpenedOnce = true; + + HWND consoleWindow = EmuConsole::createConsole(); + + EmuConsole + + while (IsConsoleRunning) + { + // ------ Tokenize the input + if (!CommandIsProcessing) + { + std::cout << ">> "; + CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once + console.tokenize(CommandIsProcessing); + } + Sleep(10); + } + + // ------ Close the console window + HasConsoleOpenedOnce = false; + IsConsoleRunning = false; + FreeConsole(); + Sleep(100); + PostMessage(consoleWindow, WM_CLOSE, 0, 0); + return 1; +} + +void __fastcall RunEmu(void* thisptr) { + + // main loop + + if (!hasHooked) { + InitializeHook(); // initialize mouse hook + + hasHooked = true; + } + + // only run scripts while zoo is loaded and not in main menu + if ((int)ZooState::object_ptr(0x0) > 0) { + // f << "[" << timestamp << "] " << "Is no longer in main menu!" << std::endl; + if (ZooState::IsZooLoaded() == true) { + // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; + *zoo_models = sm.executeScripts(); + // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; + } + } + + //---- Process the input tokens while console is running + if (!tokens.empty() && IsConsoleRunning == true) + { + console.processInput(IsConsoleRunning); + tokens.clear(); + CommandIsProcessing = false; // reset flag to allow another command to be tokenized + } + + //---- return to original update function + _origUpdate ogUpdate = (_origUpdate)updateAddress; + // f << "[" << timestamp << "] " << "EMU loop finished!" << std::endl; + + ogUpdate(thisptr); + + // f << "[" << timestamp << "] " << "ogUpdate(thisptr) called!" << std::endl; +} diff --git a/EmuAPI/emu/EmuMain.h b/EmuAPI/emu/EmuMain.h new file mode 100644 index 0000000..4991ef6 --- /dev/null +++ b/EmuAPI/emu/EmuMain.h @@ -0,0 +1,20 @@ +#ifndef EMUMAIN_H +#define EMUMAIN_H + +#include "EmuBase.h" + +class EmuMain +{ + public: + static DWORD WINAPI ZooConsole(LPVOID, bool&, bool&, bool&); + + static EmuMain &shared_instance() { + static EmuMain instance; + return instance; + } + + + +}; + +#endif // EMUMAIN_H \ No newline at end of file From d14bb285c56a5ec2526cb425cf5c74eccd20c274 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Fri, 8 Mar 2024 22:51:55 -0800 Subject: [PATCH 22/61] more abstraction in EmuConsole, EmuMain, ZTGameMgr and away from EmuLoader --- EmuAPI/EmuLoader.cpp | 123 ------------------------------------- EmuAPI/emu/EmuConsole.cpp | 1 + EmuAPI/emu/EmuControls.cpp | 49 +++++++++++++-- EmuAPI/emu/EmuControls.h | 7 +++ EmuAPI/emu/EmuMain.cpp | 50 ++++++++++----- EmuAPI/emu/EmuMain.h | 14 ++++- EmuAPI/reimp/ZTGameMgr.cpp | 42 ++++++++++++- EmuAPI/reimp/ZTGameMgr.h | 2 - 8 files changed, 138 insertions(+), 150 deletions(-) diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index ec74e55..4482b19 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -26,130 +26,19 @@ #include "ZTWorldMgr.h" #include "ZTMapView.h" -//------ Flags for console -bool IsConsoleRunning = false; -bool CommandIsProcessing = false; -bool HasConsoleOpenedOnce = false; // to avoid conflicts when console has not been opened yet - //------ Flags for keypresses bool ctrlMPressed = false; -// ------ Function prototypes -DWORD WINAPI ZooConsole(LPVOID lpParameter); -BOOL InitializeHook(); - -//------ Function pointers -DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game -typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function - - -// DWORD exitBuildingAddress = 0x4a75bb; // address of exit building function in the game -// typedef void* (__thiscall *_origexitBuildingAddress)(void* thisptr, int *param_1); // define original update function - -//------ Namespace and class aliases -#define fs std::filesystem - //------ Global variables -HHOOK hMsgHook = NULL; int consoleW = 400; // console window width int consoleH = 200; // console window height EmuScriptMgr sm; // script manager object -std::vector tokens; // contains tokens from console input -EmuConsole console(tokens); // console object - //------ ZooModels object extern ZooModels* zoo_models; ZooModels* zoo_models = new ZooModels(); -DWORD setAnimalRatingAddress = 0x0041D08B; -DWORD setZooRatingAddress = 0x0041D22F; -DWORD setGuestRatingAddress = 0x0041D15D; bool hasHooked = false; - -// ------ Detours - -typedef void (__cdecl *_setAnimalRating)(int); // define original setAnimalRating function -typedef void (__cdecl *_setZooRating)(int); // define original setZooRating function -typedef void (__cdecl *_setGuestRating)(int); // define original setGuestRating function - - -void __cdecl SetGuestRating(int rating) { - _setGuestRating ogSetGuestRating = (_setGuestRating)setGuestRatingAddress; - if (zoo_models->_emuGuestRatingSet == true) { - rating = zoo_models->_guestRating; - } - ogSetGuestRating(rating); -} - -void __cdecl SetZooRating(int rating) { - _setZooRating ogSetZooRating = (_setZooRating)setZooRatingAddress; - if (zoo_models->_emuZooRatingSet == true) { - rating = zoo_models->_zooRating; - } - ogSetZooRating(rating); -} - -void __cdecl SetAnimalRating(int rating) { - _setAnimalRating ogSetAnimalRating = (_setAnimalRating)setAnimalRatingAddress; - if (zoo_models->_emuAnimalRatingSet == true) { - rating = zoo_models->_animalRating; - } - ogSetAnimalRating(rating); -} - -// void* __fastcall exitBuilding(void* thisptr, unsigned int edx, int *param_1) { -// // std::ofstream f; -// // f.open("emu.log", std::ios_base::app); -// // f << "Exit building called!" << std::endl; -// // f << "thisptr: " << thisptr << std::endl; -// // f << "param_1: " << param_1 << std::endl; -// // f.close(); -// _origexitBuildingAddress ogexitBuilding = (_origexitBuildingAddress)exitBuildingAddress; -// return ogexitBuilding(thisptr, param_1); -// } - -LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { - if (nCode == HC_ACTION) { - MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam; - if (wParam == WM_MOUSEWHEEL) { - int wheelDelta = GET_WHEEL_DELTA_WPARAM(pMouseStruct->mouseData); - bool isCtrlPressed = GetAsyncKeyState(VK_CONTROL) & 0x8000; - int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - if (isCtrlPressed) { - if (isCtrlPressed && wheelDelta > 0) { - // f << "Mouse wheel up!" << std::endl; - ZTMapView::rotateCW(); - } else if (isCtrlPressed && wheelDelta < 0) { - // f << "Mouse wheel down!" << std::endl; - ZTMapView::rotateCCW(); - } - - } else { - if (wheelDelta > 0 && *currentZoom < 2) { - // f << "Mouse wheel up!" << std::endl; - ZTMapView::clickZoomIn(); - } else if (wheelDelta < 0 && *currentZoom > -2) { - // f << "Mouse wheel down!" << std::endl; - ZTMapView::clickZoomOut(); - } - } - } - return CallNextHookEx(NULL, nCode, wParam, lParam); -} -} - -BOOL InitializeHook() -{ - // call SetWindowsHookEx here - HHOOK hHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), 0); - if (hHook == NULL) { - // handle error - return false; - } - return true; -} - // ------ DllMain BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { @@ -166,18 +55,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv sm.findScripts(); sm.storeScripts(); - - - //------ Detour update function to run emu and sync with main game thread - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - DetourAttach((PVOID*)&updateAddress, (PVOID)&RunEmu); - DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); - DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); - DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); - - DetourTransactionCommit(); ZTGameMgr::init(); ZTUI::main::init(); ZTMapView::init(); diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 093a3b9..d9234d1 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -2,6 +2,7 @@ #include #include "ZTGameMgr.h" #include "BFGameApp.h" +#include "EmuControls.h" EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp index a955148..7f65e22 100644 --- a/EmuAPI/emu/EmuControls.cpp +++ b/EmuAPI/emu/EmuControls.cpp @@ -1,9 +1,5 @@ #include "EmuControls.h" -#include "BFUIMgr.h" -#include "EmuBase.h" -#include "ZooState.h" -#include "EmuConsole.h" -#include "EmuMain.h" + void EmuControls::procControls(bool &IsConsoleRunning, bool &HasConsoleOpenedOnce, bool &ctrlMPressed) { @@ -43,4 +39,45 @@ void EmuControls::procControls(bool &IsConsoleRunning, bool &HasConsoleOpenedOnc ctrlMPressed = false; // Reset the flag when the key is released } -} \ No newline at end of file +} + +LRESULT CALLBACK EmuControls::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { + if (nCode == HC_ACTION) { + MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam; + if (wParam == WM_MOUSEWHEEL) { + int wheelDelta = GET_WHEEL_DELTA_WPARAM(pMouseStruct->mouseData); + bool isCtrlPressed = GetAsyncKeyState(VK_CONTROL) & 0x8000; + int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); + if (isCtrlPressed) { + if (isCtrlPressed && wheelDelta > 0) { + // f << "Mouse wheel up!" << std::endl; + ZTMapView::rotateCW(); + } else if (isCtrlPressed && wheelDelta < 0) { + // f << "Mouse wheel down!" << std::endl; + ZTMapView::rotateCCW(); + } + + } else { + if (wheelDelta > 0 && *currentZoom < 2) { + // f << "Mouse wheel up!" << std::endl; + ZTMapView::clickZoomIn(); + } else if (wheelDelta < 0 && *currentZoom > -2) { + // f << "Mouse wheel down!" << std::endl; + ZTMapView::clickZoomOut(); + } + } + } + return CallNextHookEx(NULL, nCode, wParam, lParam); +} +} + +bool EmuControls::InitializeHook() +{ + // call SetWindowsHookEx here + HHOOK hHook = SetWindowsHookEx(WH_MOUSE_LL, EmuControls::LowLevelMouseProc, GetModuleHandle(NULL), 0); + if (hHook == NULL) { + // handle error + return false; + } + return true; +} diff --git a/EmuAPI/emu/EmuControls.h b/EmuAPI/emu/EmuControls.h index f845497..15b2115 100644 --- a/EmuAPI/emu/EmuControls.h +++ b/EmuAPI/emu/EmuControls.h @@ -1,11 +1,18 @@ #ifndef EMUCONTROLS_H #define EMUCONTROLS_H +#include "BFUIMgr.h" +#include "EmuBase.h" +#include "ZooState.h" +#include "EmuConsole.h" +#include "EmuMain.h" class EmuControls { public: static void procControls(bool&, bool&); + static LRESULT CALLBACK LowLevelMouseProc(int, WPARAM, LPARAM); + static bool InitializeHook(); }; #endif // EMUCONTROLS_H \ No newline at end of file diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp index 072eb63..5dd7efb 100644 --- a/EmuAPI/emu/EmuMain.cpp +++ b/EmuAPI/emu/EmuMain.cpp @@ -1,29 +1,51 @@ #include "EmuMain.h" #include "EmuConsole.h" +#include "detours.h" -DWORD WINAPI EmuMain::ZooConsole(LPVOID lpParameter, EmuConsole console, bool &IsConsoleRunning, bool &CommandIsProcessing, bool &HasConsoleOpenedOnce) +#define instance EmuMain::shared_instance() + +//------ Function pointers +DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game +typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function + + +EmuMain::EmuMain() { - HasConsoleOpenedOnce = true; + IsConsoleRunning = false; + CommandIsProcessing = false; + HasConsoleOpenedOnce = false; + console = new EmuConsole(tokens); +} - HWND consoleWindow = EmuConsole::createConsole(); +void EmuMain::init() +{ + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&updateAddress, (PVOID)&RunEmu); + DetourTransactionCommit(); +} + +DWORD WINAPI EmuMain::ZooConsole() +{ + instance.HasConsoleOpenedOnce = true; - EmuConsole + HWND consoleWindow = EmuConsole::createConsole(); - while (IsConsoleRunning) + while (instance.IsConsoleRunning) { // ------ Tokenize the input - if (!CommandIsProcessing) + if (!instance.CommandIsProcessing) { std::cout << ">> "; - CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once - console.tokenize(CommandIsProcessing); + instance.CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once + instance.console->tokenize(instance.CommandIsProcessing); } Sleep(10); } // ------ Close the console window - HasConsoleOpenedOnce = false; - IsConsoleRunning = false; + instance.HasConsoleOpenedOnce = false; + instance.IsConsoleRunning = false; FreeConsole(); Sleep(100); PostMessage(consoleWindow, WM_CLOSE, 0, 0); @@ -51,11 +73,11 @@ void __fastcall RunEmu(void* thisptr) { } //---- Process the input tokens while console is running - if (!tokens.empty() && IsConsoleRunning == true) + if (!instance.tokens.empty() && EmuMain::shared_instance().IsConsoleRunning == true) { - console.processInput(IsConsoleRunning); - tokens.clear(); - CommandIsProcessing = false; // reset flag to allow another command to be tokenized + instance.console->processInput(EmuMain::shared_instance().IsConsoleRunning); + instance.tokens.clear(); + EmuMain::shared_instance().CommandIsProcessing = false; // reset flag to allow another command to be tokenized } //---- return to original update function diff --git a/EmuAPI/emu/EmuMain.h b/EmuAPI/emu/EmuMain.h index 4991ef6..885eb3e 100644 --- a/EmuAPI/emu/EmuMain.h +++ b/EmuAPI/emu/EmuMain.h @@ -6,14 +6,24 @@ class EmuMain { public: - static DWORD WINAPI ZooConsole(LPVOID, bool&, bool&, bool&); + static DWORD WINAPI ZooConsole(); + static void init(); + EmuMain(); static EmuMain &shared_instance() { static EmuMain instance; return instance; } - + LPVOID lpParameter; + + //------ Flags for console + bool IsConsoleRunning; + bool CommandIsProcessing; + bool HasConsoleOpenedOnce; // to avoid conflicts when console has not been opened yet + + std::vector tokens; // contains tokens from console input + EmuConsole *console; // console object }; diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index e3c818f..927ee3f 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -18,10 +18,16 @@ void ZTGameMgr::init() { DWORD addCashAddress = 0x40f018; // address of addCash function in the game DWORD getDateAddress = 0x0040e7e0; // address of getDate function in the game DWORD getStartMenuMusicAddress = 0x004bded9; // address of startMenuMusic function in the game + DWORD setAnimalRatingAddress = 0x0041D08B; + DWORD setZooRatingAddress = 0x0041D22F; + DWORD setGuestRatingAddress = 0x0041D15D; DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); - // DetourAttach((PVOID*)&getDateAddress, (PVOID)&ZTGameMgr::getDate_Detour); + //------ Detour update function to run emu and sync with main game thread + DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); + DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); + DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); DetourTransactionCommit(); // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); @@ -49,6 +55,8 @@ void ZTGameMgr::init() { EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash + + // EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from ZTResearchBranch::update <--- crashes, not sure why // EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 <--- crashes, not sure why // // EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 @@ -91,7 +99,6 @@ void ZTGameMgr::subtractCash(float amount) { // _ogstartMenuMusic(pZTGameMgr); // } - DWORD ZTGameMgr::getZTGameMgr() { // get the instance of ZTGameMgr DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); @@ -141,4 +148,33 @@ ZTGameMgr::~ZTGameMgr() { _FILETIME* ZTGameMgr::getDate(_FILETIME* date) { SystemTimeToFileTime(¤t_date, date); return date; -} \ No newline at end of file +} + +typedef void (__cdecl *_setAnimalRating)(int); // define original setAnimalRating function +typedef void (__cdecl *_setZooRating)(int); // define original setZooRating function +typedef void (__cdecl *_setGuestRating)(int); // define original setGuestRating function + + +void __cdecl SetGuestRating(int rating) { + _setGuestRating ogSetGuestRating = (_setGuestRating)0x0041D15D; + if (zoo_models->_emuGuestRatingSet == true) { + rating = zoo_models->_guestRating; + } + ogSetGuestRating(rating); +} + +void __cdecl SetZooRating(int rating) { + _setZooRating ogSetZooRating = (_setZooRating)0x0041D22F; + if (zoo_models->_emuZooRatingSet == true) { + rating = zoo_models->_zooRating; + } + ogSetZooRating(rating); +} + +void __cdecl SetAnimalRating(int rating) { + _setAnimalRating ogSetAnimalRating = (_setAnimalRating)0x0041D08B; + if (zoo_models->_emuAnimalRatingSet == true) { + rating = zoo_models->_animalRating; + } + ogSetAnimalRating(rating); +} diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index bd0e7bb..10541e7 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -81,8 +81,6 @@ class ZTGameMgr static ZTGameMgr instance; return instance; } - - }; //Size: 0x10B4 4528 #endif // ZTGAMEMGR_h \ No newline at end of file From 85999985632a85057c90b273997bc1eac0d93857 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 9 Mar 2024 15:56:42 -0800 Subject: [PATCH 23/61] finished abstracting away most code in EmuLoader to respective classes --- EmuAPI/EmuAPI.vcproj | 16 +++++++++++++ EmuAPI/EmuLoader.cpp | 21 ++++------------- EmuAPI/emu/EmuConsole.cpp | 2 ++ EmuAPI/emu/EmuConsole.h | 2 -- EmuAPI/emu/EmuControls.cpp | 16 +++++++------ EmuAPI/emu/EmuControls.h | 2 +- EmuAPI/emu/EmuMain.cpp | 47 ++++++++++++++++++++----------------- EmuAPI/emu/EmuMain.h | 25 +++++++++++++++----- EmuAPI/reimp/ZTGameMgr.cpp | 48 +++++++++++++++++++------------------- EmuAPI/reimp/ZTGameMgr.h | 1 - EmuAPI/reimp/ZTMapView.cpp | 2 +- EmuAPI/reimp/ZTMapView.h | 1 - 12 files changed, 102 insertions(+), 81 deletions(-) diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index ba45ce0..5ab9276 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -211,6 +211,22 @@ RelativePath=".\emu\EmuConsole.h" > + + + + + + + + diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 4482b19..f4b4f2a 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -8,42 +8,29 @@ #include #include #include -#include "EmuConsole.h" -#include "EmuBase.h" #include #include #include #include -#include "ZooState.h" #include "RegZooState.h" -#include "EmuScriptMgr.h" -#include #include "ZooModels.h" #include "ZTGameMgr.h" #include "BFUIMgr.h" #include "ZTUI.h" #include "BFMap.h" #include "ZTWorldMgr.h" -#include "ZTMapView.h" - -//------ Flags for keypresses -bool ctrlMPressed = false; +#include "EmuMain.h" //------ Global variables int consoleW = 400; // console window width int consoleH = 200; // console window height -EmuScriptMgr sm; // script manager object //------ ZooModels object extern ZooModels* zoo_models; -ZooModels* zoo_models = new ZooModels(); -bool hasHooked = false; // ------ DllMain BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - - // Get the thread ID of the current thread // DWORD mainThreadId = GetCurrentThreadId(); // f << std::endl << std::endl << "[" << timestamp << "] " << "\nMain thread ID: " << mainThreadId << "\nCurrent thread ID: " << std::setfill('0') << std::setw(8) << std::hex << B::base << std::endl; @@ -52,9 +39,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: //------ Find/load script file directories with script manager - sm.findScripts(); - sm.storeScripts(); - + EmuMain::shared_instance().sm.findScripts(); + EmuMain::shared_instance().sm.storeScripts(); + EmuMain::init(); ZTGameMgr::init(); ZTUI::main::init(); ZTMapView::init(); diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index d9234d1..40c005a 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -3,6 +3,8 @@ #include "ZTGameMgr.h" #include "BFGameApp.h" #include "EmuControls.h" +#include "ZTMapView.h" + EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { diff --git a/EmuAPI/emu/EmuConsole.h b/EmuAPI/emu/EmuConsole.h index 4bcf20d..0e9bfa8 100644 --- a/EmuAPI/emu/EmuConsole.h +++ b/EmuAPI/emu/EmuConsole.h @@ -14,7 +14,6 @@ #include "ZooMiniMap.h" #include #include "ZTUI.h" -#include "ZTMapView.h" class EmuConsole { @@ -24,7 +23,6 @@ class EmuConsole ~EmuConsole(); void tokenize(bool&); static HWND createConsole(); - static DWORD WINAPI ZooConsole(LPVOID, bool&, bool&, bool&); private: std::vector& tokens; static void EnableVirtualTerminalProcessing(); diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp index 7f65e22..4ab6784 100644 --- a/EmuAPI/emu/EmuControls.cpp +++ b/EmuAPI/emu/EmuControls.cpp @@ -1,7 +1,9 @@ #include "EmuControls.h" +#include "EmuMain.h" +#define Main EmuMain::shared_instance() -void EmuControls::procControls(bool &IsConsoleRunning, bool &HasConsoleOpenedOnce, bool &ctrlMPressed) +void EmuControls::procControls() { if (EmuBase::DoubleKey(0x11, 0x54) == true) { // BFUIMgr::shared_instance().getElement(0x3f8); @@ -22,21 +24,21 @@ void EmuControls::procControls(bool &IsConsoleRunning, bool &HasConsoleOpenedOnc //---- CTRL + J - if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { + if (EmuBase::DoubleKey(0x11, 0x4A) == true && Main.IsConsoleRunning == false && Main.HasConsoleOpenedOnce == false) { // f << "[" << timestamp << "] " << "Opening console..." << std::endl; - IsConsoleRunning = true; - HANDLE thread = CreateThread(NULL, 0, &EmuMain::ZooConsole(), NULL, 0, NULL); + Main.IsConsoleRunning = true; + HANDLE thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&EmuMain::ZooConsole, NULL, 0, NULL); // f << "[" << timestamp << "] " << "Console opened!" << std::endl; CloseHandle(thread); } //---- CTRL + M - if (EmuBase::DoubleKey(0x11, 0x4D) == true && !ctrlMPressed) { - ctrlMPressed = true; // Set the flag + if (EmuBase::DoubleKey(0x11, 0x4D) == true && !Main.ctrlMPressed) { + Main.ctrlMPressed = true; // Set the flag float mo_money = 1000000.00f; ZooState::AddToZooBudget(mo_money); } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { - ctrlMPressed = false; // Reset the flag when the key is released + Main.ctrlMPressed = false; // Reset the flag when the key is released } } diff --git a/EmuAPI/emu/EmuControls.h b/EmuAPI/emu/EmuControls.h index 15b2115..78b6a20 100644 --- a/EmuAPI/emu/EmuControls.h +++ b/EmuAPI/emu/EmuControls.h @@ -10,7 +10,7 @@ class EmuControls { public: - static void procControls(bool&, bool&); + static void procControls(); static LRESULT CALLBACK LowLevelMouseProc(int, WPARAM, LPARAM); static bool InitializeHook(); }; diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp index 5dd7efb..28771b1 100644 --- a/EmuAPI/emu/EmuMain.cpp +++ b/EmuAPI/emu/EmuMain.cpp @@ -1,8 +1,8 @@ #include "EmuMain.h" -#include "EmuConsole.h" #include "detours.h" +#include "EmuControls.h" -#define instance EmuMain::shared_instance() +// #define instance //------ Function pointers DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game @@ -11,10 +11,13 @@ typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update EmuMain::EmuMain() { - IsConsoleRunning = false; - CommandIsProcessing = false; - HasConsoleOpenedOnce = false; - console = new EmuConsole(tokens); + this->IsConsoleRunning = false; + this->CommandIsProcessing = false; + this->HasConsoleOpenedOnce = false; + this->ctrlMPressed = false; + this->hasHooked = false; + this->zoo_models = new ZooModels(); + this->console = new EmuConsole(tokens); } void EmuMain::init() @@ -27,39 +30,41 @@ void EmuMain::init() DWORD WINAPI EmuMain::ZooConsole() { - instance.HasConsoleOpenedOnce = true; + EmuMain::shared_instance().HasConsoleOpenedOnce = true; HWND consoleWindow = EmuConsole::createConsole(); - while (instance.IsConsoleRunning) + while (EmuMain::shared_instance().IsConsoleRunning) { // ------ Tokenize the input - if (!instance.CommandIsProcessing) + if (!EmuMain::shared_instance().CommandIsProcessing) { std::cout << ">> "; - instance.CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once - instance.console->tokenize(instance.CommandIsProcessing); + EmuMain::shared_instance().CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once + EmuMain::shared_instance().console->tokenize(EmuMain::shared_instance().CommandIsProcessing); } Sleep(10); } // ------ Close the console window - instance.HasConsoleOpenedOnce = false; - instance.IsConsoleRunning = false; + EmuMain::shared_instance().HasConsoleOpenedOnce = false; + EmuMain::shared_instance().IsConsoleRunning = false; FreeConsole(); Sleep(100); PostMessage(consoleWindow, WM_CLOSE, 0, 0); return 1; } -void __fastcall RunEmu(void* thisptr) { +void __fastcall EmuMain::RunEmu(void* thisptr) { // main loop - if (!hasHooked) { - InitializeHook(); // initialize mouse hook + EmuControls::procControls(); // process controls - hasHooked = true; + if (!EmuMain::shared_instance().hasHooked) { + EmuControls::InitializeHook(); // initialize mouse hook + + EmuMain::shared_instance().hasHooked = true; } // only run scripts while zoo is loaded and not in main menu @@ -67,16 +72,16 @@ void __fastcall RunEmu(void* thisptr) { // f << "[" << timestamp << "] " << "Is no longer in main menu!" << std::endl; if (ZooState::IsZooLoaded() == true) { // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; - *zoo_models = sm.executeScripts(); + *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts(); // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; } } //---- Process the input tokens while console is running - if (!instance.tokens.empty() && EmuMain::shared_instance().IsConsoleRunning == true) + if (!EmuMain::shared_instance().tokens.empty() && EmuMain::shared_instance().IsConsoleRunning == true) { - instance.console->processInput(EmuMain::shared_instance().IsConsoleRunning); - instance.tokens.clear(); + EmuMain::shared_instance().console->processInput(EmuMain::shared_instance().IsConsoleRunning); + EmuMain::shared_instance().tokens.clear(); EmuMain::shared_instance().CommandIsProcessing = false; // reset flag to allow another command to be tokenized } diff --git a/EmuAPI/emu/EmuMain.h b/EmuAPI/emu/EmuMain.h index 885eb3e..f262c04 100644 --- a/EmuAPI/emu/EmuMain.h +++ b/EmuAPI/emu/EmuMain.h @@ -1,30 +1,43 @@ #ifndef EMUMAIN_H #define EMUMAIN_H -#include "EmuBase.h" +#include "EmuScriptMgr.h" +#include "ZooModels.h" +#include "windows.h" +#include "EmuConsole.h" class EmuMain { public: static DWORD WINAPI ZooConsole(); + static void __fastcall RunEmu(void*); static void init(); EmuMain(); - static EmuMain &shared_instance() { - static EmuMain instance; - return instance; - } - LPVOID lpParameter; + ZooModels* zoo_models; //------ Flags for console bool IsConsoleRunning; bool CommandIsProcessing; bool HasConsoleOpenedOnce; // to avoid conflicts when console has not been opened yet + //------ Flags for keypresses + bool ctrlMPressed; + + //------ Flags for hooks + bool hasHooked; + + EmuScriptMgr sm; // script manager object + std::vector tokens; // contains tokens from console input EmuConsole *console; // console object + static EmuMain &shared_instance() { + static EmuMain instance; + return instance; + } + }; #endif // EMUMAIN_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 927ee3f..6b95ec9 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -25,9 +25,9 @@ void ZTGameMgr::init() { DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); //------ Detour update function to run emu and sync with main game thread - DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); - DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); - DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); + // DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); + // DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); + // DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); DetourTransactionCommit(); // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); @@ -155,26 +155,26 @@ typedef void (__cdecl *_setZooRating)(int); // define original setZooRating func typedef void (__cdecl *_setGuestRating)(int); // define original setGuestRating function -void __cdecl SetGuestRating(int rating) { - _setGuestRating ogSetGuestRating = (_setGuestRating)0x0041D15D; - if (zoo_models->_emuGuestRatingSet == true) { - rating = zoo_models->_guestRating; - } - ogSetGuestRating(rating); -} +// void __cdecl SetGuestRating(int rating) { +// _setGuestRating ogSetGuestRating = (_setGuestRating)0x0041D15D; +// if (zoo_models->_emuGuestRatingSet == true) { +// rating = zoo_models->_guestRating; +// } +// ogSetGuestRating(rating); +// } -void __cdecl SetZooRating(int rating) { - _setZooRating ogSetZooRating = (_setZooRating)0x0041D22F; - if (zoo_models->_emuZooRatingSet == true) { - rating = zoo_models->_zooRating; - } - ogSetZooRating(rating); -} +// void __cdecl SetZooRating(int rating) { +// _setZooRating ogSetZooRating = (_setZooRating)0x0041D22F; +// if (zoo_models->_emuZooRatingSet == true) { +// rating = zoo_models->_zooRating; +// } +// ogSetZooRating(rating); +// } -void __cdecl SetAnimalRating(int rating) { - _setAnimalRating ogSetAnimalRating = (_setAnimalRating)0x0041D08B; - if (zoo_models->_emuAnimalRatingSet == true) { - rating = zoo_models->_animalRating; - } - ogSetAnimalRating(rating); -} +// void __cdecl SetAnimalRating(int rating) { +// _setAnimalRating ogSetAnimalRating = (_setAnimalRating)0x0041D08B; +// if (zoo_models->_emuAnimalRatingSet == true) { +// rating = zoo_models->_animalRating; +// } +// ogSetAnimalRating(rating); +// } diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h index 10541e7..a7e5eeb 100644 --- a/EmuAPI/reimp/ZTGameMgr.h +++ b/EmuAPI/reimp/ZTGameMgr.h @@ -55,7 +55,6 @@ class ZTGameMgr // virtual void update(int) {}; // virtual void updateSim(unsigned int) {}; - ZTGameMgr(); ~ZTGameMgr(); void addCash(float); diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp index df4a54d..d6ba2b1 100644 --- a/EmuAPI/reimp/ZTMapView.cpp +++ b/EmuAPI/reimp/ZTMapView.cpp @@ -37,7 +37,7 @@ void* ZTMapView::getMapView() { return (void*)0x00638068; } -// // doesn't do anything yet +// // // doesn't do anything yet // void ZTMapView::clickZoomOut() { // if (ZTMapView::getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { // int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h index 91a1cce..f23801b 100644 --- a/EmuAPI/reimp/ZTMapView.h +++ b/EmuAPI/reimp/ZTMapView.h @@ -4,7 +4,6 @@ #include "ZTWorldMgr.h" #include "EmuBase.h" - typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function typedef void (__cdecl *_clickZoomOut)(); // define original clickZoomOut function typedef void (__thiscall *_rotateCW)(); // define original rotateCW function From 75af399b20a7034c7a217ce3e1d4894d440b1406 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 9 Mar 2024 20:35:38 -0800 Subject: [PATCH 24/61] new 'emu_gawk' driver that only runs lua scripts once per zoo load --- EmuAPI/emu/EmuControls.cpp | 18 ++++++++++-------- EmuAPI/emu/EmuMain.cpp | 12 +++++++++++- EmuAPI/emu/EmuMain.h | 3 +++ EmuAPI/emu/EmuScriptMgr.cpp | 4 ++-- EmuAPI/emu/EmuScriptMgr.h | 2 +- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp index 4ab6784..996c611 100644 --- a/EmuAPI/emu/EmuControls.cpp +++ b/EmuAPI/emu/EmuControls.cpp @@ -1,21 +1,23 @@ #include "EmuControls.h" #include "EmuMain.h" +#include "ZTWorldMgr.h" #define Main EmuMain::shared_instance() void EmuControls::procControls() { - if (EmuBase::DoubleKey(0x11, 0x54) == true) { + if (EmuBase::DoubleKey(0x11, 0x54) == true) + { // BFUIMgr::shared_instance().getElement(0x3f8); - // BFGameApp::incSimSpeed(); - // DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); - // DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); - // int ids[] = {6101, 6111, NULL}; + //BFGameApp::incSimSpeed(); + DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); + DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); + int ids[] = {9313, 9314, NULL}; - // std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); - // ZTWorldMgr::makeInvisible(entities); + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); + ZTWorldMgr::makeInvisible(entities); - BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); + // BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); // std::ofstream f; // f.open("getelement.log", std::ios_base::app); // f << "x: " << x << std::endl; diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp index 28771b1..effdf1d 100644 --- a/EmuAPI/emu/EmuMain.cpp +++ b/EmuAPI/emu/EmuMain.cpp @@ -72,8 +72,18 @@ void __fastcall EmuMain::RunEmu(void* thisptr) { // f << "[" << timestamp << "] " << "Is no longer in main menu!" << std::endl; if (ZooState::IsZooLoaded() == true) { // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; - *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts(); + if (!EmuMain::shared_instance().hasEmuRunOnce) { + // f << "[" << timestamp << "] " << "Running emu_run scripts..." << std::endl; + EmuMain::shared_instance().sm.executeScripts("emu_gawk"); + EmuMain::shared_instance().hasEmuRunOnce = true; + // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; + } + *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts("emu_run"); // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; + } else { + // f << "[" << timestamp << "] " << "Zoo is not loaded!" << std::endl; + EmuMain::shared_instance().hasEmuRunOnce = false; + } } diff --git a/EmuAPI/emu/EmuMain.h b/EmuAPI/emu/EmuMain.h index f262c04..82db369 100644 --- a/EmuAPI/emu/EmuMain.h +++ b/EmuAPI/emu/EmuMain.h @@ -28,6 +28,9 @@ class EmuMain //------ Flags for hooks bool hasHooked; + //------ Flags for script manager + bool hasEmuRunOnce; + EmuScriptMgr sm; // script manager object std::vector tokens; // contains tokens from console input diff --git a/EmuAPI/emu/EmuScriptMgr.cpp b/EmuAPI/emu/EmuScriptMgr.cpp index 88d2609..36dbdee 100644 --- a/EmuAPI/emu/EmuScriptMgr.cpp +++ b/EmuAPI/emu/EmuScriptMgr.cpp @@ -25,7 +25,7 @@ EmuScriptMgr::~EmuScriptMgr() { } /// @brief Executes all emu scripts in a directory. -ZooModels EmuScriptMgr::executeScripts() { +ZooModels EmuScriptMgr::executeScripts(std::string script) { ZooModels zoo_models; for (size_t i = 0; i < scripts.size(); i++) { @@ -42,7 +42,7 @@ ZooModels EmuScriptMgr::executeScripts() { if (lua_pcall(lua, 0, LUA_MULTRET, 0) == 0) { // script is loaded, now load specific function - lua_getglobal(lua, "emu_run"); + lua_getglobal(lua, script.c_str()); // check if we can call function if (lua_isfunction(lua, -1)) { if (lua_pcall(lua, 0, LUA_MULTRET, 0) == 0) { diff --git a/EmuAPI/emu/EmuScriptMgr.h b/EmuAPI/emu/EmuScriptMgr.h index 6a7e8a4..90ad0de 100644 --- a/EmuAPI/emu/EmuScriptMgr.h +++ b/EmuAPI/emu/EmuScriptMgr.h @@ -21,7 +21,7 @@ class EmuScriptMgr ~EmuScriptMgr(); void findScripts(); void storeScripts(); - ZooModels executeScripts(); + ZooModels executeScripts(std::string); private: std::vector files; From 022056ff8e074745db0830e6f36c109767bab4aa Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 9 Mar 2024 20:36:29 -0800 Subject: [PATCH 25/61] disabled addCash detour --- EmuAPI/reimp/ZTGameMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index 6b95ec9..e69468b 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -23,7 +23,7 @@ void ZTGameMgr::init() { DWORD setGuestRatingAddress = 0x0041D15D; DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); + // DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); //------ Detour update function to run emu and sync with main game thread // DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); // DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); From ed487472037f45c8be742e7c78bf2ee0a001877d Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sat, 9 Mar 2024 20:59:46 -0800 Subject: [PATCH 26/61] debugged and tested with fixes: 'emu_gawk' works --- EmuAPI/EmuAPI.vcproj | 8 +++---- EmuAPI/EmuLoader.cpp | 4 ++-- EmuAPI/emu/EmuMain.cpp | 1 + EmuAPI/reimp/ZTGameMgr.cpp | 44 +++++++++++++++++++------------------- EmuAPI/reimp/ZTUI.cpp | 8 +++---- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 5ab9276..01e2542 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -190,6 +190,10 @@ RelativePath=".\EmuLoader.cpp" > + + @@ -219,10 +223,6 @@ RelativePath=".\emu\EmuControls.h" > - - diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index f4b4f2a..5bf8805 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -42,9 +42,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv EmuMain::shared_instance().sm.findScripts(); EmuMain::shared_instance().sm.storeScripts(); EmuMain::init(); - ZTGameMgr::init(); + // ZTGameMgr::init(); ZTUI::main::init(); - ZTMapView::init(); + // ZTMapView::init(); // EmuBase::callHook(0x00452ea5, (DWORD)&generateMap); // BFMap::init(); diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp index effdf1d..f4096d5 100644 --- a/EmuAPI/emu/EmuMain.cpp +++ b/EmuAPI/emu/EmuMain.cpp @@ -76,6 +76,7 @@ void __fastcall EmuMain::RunEmu(void* thisptr) { // f << "[" << timestamp << "] " << "Running emu_run scripts..." << std::endl; EmuMain::shared_instance().sm.executeScripts("emu_gawk"); EmuMain::shared_instance().hasEmuRunOnce = true; + EmuMain::shared_instance().sm = EmuScriptMgr(); // TODO: create dumpScripts function for graceful cleanup // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; } *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts("emu_run"); diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index e69468b..e17d791 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -32,28 +32,28 @@ void ZTGameMgr::init() { // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); - EmuBase::callHook(0x0050A245, (DWORD)&ZTGameMgr::addCash_Detour); // from removeEntityFromMap - EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::fGrantDonation - EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 - EmuBase::callHook(0x0060cccd, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433ae0 - EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433b00 - EmuBase::callHook(0x006089fc, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x40f018::meth_0x6089e8 - EmuBase::callHook(0x00607299, (DWORD)&ZTGameMgr::addCash_Detour); // from georgeW - EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 - EmuBase::callHook(0x005b0f2d, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 005b0f17 - EmuBase::callHook(0x005a1679, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTScenarioSimpleGoal::trigger03 - EmuBase::callHook(0x004f7031, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x41f881::meth_0x4f6e3c - EmuBase::callHook(0x004d920f , (DWORD)&ZTGameMgr::addCash_Detour); // from ZTMapView::placeEntityOnMap - EmuBase::callHook(0x004a2f97, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTGameMgr::removedZooDoo - EmuBase::callHook(0x00484047, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::financeChecks - EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation - EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser - EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser - - EmuBase::callHook(0x004cb64f, (DWORD)&ZTGameMgr::setCash_Detour); // from showMapSelect - EmuBase::callHook(0x006163ab, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashUp - EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown - EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash + // EmuBase::callHook(0x0050A245, (DWORD)&ZTGameMgr::addCash_Detour); // from removeEntityFromMap + // EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::fGrantDonation + // EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 + // EmuBase::callHook(0x0060cccd, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433ae0 + // EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433b00 + // EmuBase::callHook(0x006089fc, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x40f018::meth_0x6089e8 + // EmuBase::callHook(0x00607299, (DWORD)&ZTGameMgr::addCash_Detour); // from georgeW + // EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 + // EmuBase::callHook(0x005b0f2d, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 005b0f17 + // EmuBase::callHook(0x005a1679, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTScenarioSimpleGoal::trigger03 + // EmuBase::callHook(0x004f7031, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x41f881::meth_0x4f6e3c + // EmuBase::callHook(0x004d920f , (DWORD)&ZTGameMgr::addCash_Detour); // from ZTMapView::placeEntityOnMap + // EmuBase::callHook(0x004a2f97, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTGameMgr::removedZooDoo + // EmuBase::callHook(0x00484047, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::financeChecks + // EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation + // EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser + // EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser + + // EmuBase::callHook(0x004cb64f, (DWORD)&ZTGameMgr::setCash_Detour); // from showMapSelect + // EmuBase::callHook(0x006163ab, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashUp + // EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown + // EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index a5172ed..a4a3da7 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -64,10 +64,10 @@ void ZTUI::main::init() { // initialize the UI // setMoneyText(); - EmuBase::callHook(0x0040f02e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from addCash - EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim - EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash - EmuBase::callHook(0x00519c1c, (DWORD)&ZTUI::main::setMoneyText_Detour); // from init + // EmuBase::callHook(0x0040f02e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from addCash + // EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim + // EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash + // EmuBase::callHook(0x00519c1c, (DWORD)&ZTUI::main::setMoneyText_Detour); // from init EmuBase::callHook(0x00485d9c, (DWORD)&ZTUI::gameopts::loadFile); // from clickContinue EmuBase::callHook(0x004c9a13, (DWORD)&ZTUI::gameopts::loadFile); // from beginScenario From 30612b2ecd617898a6ee52db4625d7a8a629e4af Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sun, 10 Mar 2024 04:17:33 -0700 Subject: [PATCH 27/61] created getSelectedGuestName, InvisibleInvincibleCheat functions --- EmuAPI/EmuAPI.vcproj | 16 ++++++++++++++++ EmuAPI/EmuLoader.cpp | 1 - EmuAPI/emu/EmuConsole.cpp | 6 +++++- EmuAPI/emu/EmuControls.cpp | 7 +++---- EmuAPI/emu/EmuMain.cpp | 22 +++++++++++++--------- EmuAPI/reimp/BFMap.cpp | 20 ++++++++++++++++++-- EmuAPI/reimp/BFMap.h | 4 ++++ EmuAPI/reimp/BFUIMgr.cpp | 2 +- EmuAPI/reimp/BFUIMgr.h | 4 ++-- EmuAPI/reimp/ZTCheats.cpp | 19 +++++++++++++++++++ EmuAPI/reimp/ZTCheats.h | 10 ++++++++++ EmuAPI/reimp/ZTGameMgr.cpp | 36 ++++++++++++++++++------------------ EmuAPI/reimp/ZTGuest.cpp | 17 +++++++++++++++++ EmuAPI/reimp/ZTGuest.h | 12 ++++++++++++ EmuAPI/reimp/ZTUI.cpp | 23 +++++++++++++++++------ EmuAPI/reimp/ZTUI.h | 14 ++++++++++++-- EmuAPI/reimp/ZTWorldMgr.cpp | 9 +++++---- EmuAPI/reimp/ZTWorldMgr.h | 4 ++-- 18 files changed, 174 insertions(+), 52 deletions(-) create mode 100644 EmuAPI/reimp/ZTCheats.cpp create mode 100644 EmuAPI/reimp/ZTCheats.h create mode 100644 EmuAPI/reimp/ZTGuest.cpp create mode 100644 EmuAPI/reimp/ZTGuest.h diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 01e2542..9633342 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -372,6 +372,14 @@ RelativePath=".\reimp\ZTBuildingType.h" > + + + + @@ -388,6 +396,14 @@ RelativePath=".\reimp\ZTGameMgr.h" > + + + + diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp index 5bf8805..4f47020 100644 --- a/EmuAPI/EmuLoader.cpp +++ b/EmuAPI/EmuLoader.cpp @@ -45,7 +45,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv // ZTGameMgr::init(); ZTUI::main::init(); // ZTMapView::init(); - // EmuBase::callHook(0x00452ea5, (DWORD)&generateMap); // BFMap::init(); break; diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 40c005a..d0b058d 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -4,7 +4,7 @@ #include "BFGameApp.h" #include "EmuControls.h" #include "ZTMapView.h" - +#include "ZTGuest.h" EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { @@ -459,6 +459,10 @@ void EmuConsole::processInput(bool& IsConsoleRunning) std::cout << "Increasing sim speed..." << std::endl; BFGameApp::incSimSpeed(); } + else if (tokens[0] == "guestname") + { + std::cout << "The guest name is: " << ZTGuest::getSelectedGuestName() << std::endl; + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp index 996c611..7779bef 100644 --- a/EmuAPI/emu/EmuControls.cpp +++ b/EmuAPI/emu/EmuControls.cpp @@ -10,12 +10,11 @@ void EmuControls::procControls() { // BFUIMgr::shared_instance().getElement(0x3f8); //BFGameApp::incSimSpeed(); - DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); - DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); + int ids[] = {9313, 9314, NULL}; - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(begin, end, ids); - ZTWorldMgr::makeInvisible(entities); + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); + ZTWorldMgr::makeInvisible(entities, true); // BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); // std::ofstream f; diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp index f4096d5..57eba41 100644 --- a/EmuAPI/emu/EmuMain.cpp +++ b/EmuAPI/emu/EmuMain.cpp @@ -1,6 +1,7 @@ #include "EmuMain.h" #include "detours.h" #include "EmuControls.h" +#include "ZTCheats.h" // #define instance @@ -61,11 +62,13 @@ void __fastcall EmuMain::RunEmu(void* thisptr) { EmuControls::procControls(); // process controls - if (!EmuMain::shared_instance().hasHooked) { - EmuControls::InitializeHook(); // initialize mouse hook + // if (!EmuMain::shared_instance().hasHooked) { + // EmuControls::InitializeHook(); // initialize mouse hook - EmuMain::shared_instance().hasHooked = true; - } + // EmuMain::shared_instance().hasHooked = true; + // } + + ZTCheats::InvisibleInvincibleCheat(); // run cheats // only run scripts while zoo is loaded and not in main menu if ((int)ZooState::object_ptr(0x0) > 0) { @@ -81,11 +84,12 @@ void __fastcall EmuMain::RunEmu(void* thisptr) { } *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts("emu_run"); // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; - } else { - // f << "[" << timestamp << "] " << "Zoo is not loaded!" << std::endl; - EmuMain::shared_instance().hasEmuRunOnce = false; - - } + } + } + + if (ZooState::IsZooLoaded() == false) { + EmuMain::shared_instance().hasEmuRunOnce = false; + } //---- Process the input tokens while console is running diff --git a/EmuAPI/reimp/BFMap.cpp b/EmuAPI/reimp/BFMap.cpp index ead796e..f885cab 100644 --- a/EmuAPI/reimp/BFMap.cpp +++ b/EmuAPI/reimp/BFMap.cpp @@ -3,15 +3,19 @@ #include "detours.h" DWORD originalGenerateMapAdd = 0x00452e13; +DWORD setMapDimensionsAdd = 0x004c84d3; +DWORD computeTilesAdd = 0x004af165; void BFMap::init() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); // DetourAttach((PVOID*)generateMapAdd, (PVOID)&BFMap::generateMap); - DetourAttach((PVOID*)&originalGenerateMapAdd, (PVOID)BFMap::generateMap); + // DetourAttach((PVOID*)&originalGenerateMapAdd, (PVOID)BFMap::generateMap); + // DetourAttach((PVOID*)&setMapDimensionsAdd, (PVOID)&BFMap::setMapDimensions); + DetourAttach((PVOID*)&computeTilesAdd, (PVOID)&BFMap::computeTiles); DetourTransactionCommit(); - // EmuBase::callHook(0x00630ce8, (DWORD)&BFMap::generateMap); + EmuBase::callHook(0x005bc4b4, (DWORD)&BFMap::computeTiles); } @@ -19,4 +23,16 @@ void BFMap::init() { void BFMap::generateMap(void* a2, int a3, int a4, char a5) { ogGenerateMap original = (ogGenerateMap)originalGenerateMapAdd; return original(a2, a3, a4, a5); +} + +void BFMap::setMapDimensions(void* a2, int a3, int a4, bool a5) { + ogSetMapDimensions original = (ogSetMapDimensions)setMapDimensionsAdd; + // a3 = 200; + // a4 = 200; + original(a2, a3, a4, a5); +} + +void __fastcall BFMap::computeTiles(void* a2) { + ogComputeTiles original = (ogComputeTiles)computeTilesAdd; + original(a2); } \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.h b/EmuAPI/reimp/BFMap.h index 21b15df..f98d931 100644 --- a/EmuAPI/reimp/BFMap.h +++ b/EmuAPI/reimp/BFMap.h @@ -2,11 +2,15 @@ #define BFMAP_H typedef void (__thiscall *ogGenerateMap)(void*, int, int, char); +typedef void (*ogSetMapDimensions)(void*, int, int, bool); +typedef void (__thiscall *ogComputeTiles)(void*); class BFMap { public: static void init(); static void generateMap(void*, int, int, char); + static void setMapDimensions(void*, int, int, bool); + static void __fastcall computeTiles(void*); }; #endif // BFMAP_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp index 1a22dc0..a1b997c 100644 --- a/EmuAPI/reimp/BFUIMgr.cpp +++ b/EmuAPI/reimp/BFUIMgr.cpp @@ -44,7 +44,7 @@ DWORD BFUIMgr::getOffset(DWORD offset) { return (*((DWORD*)((LPVOID)0x00638de0)) + offset); } -void BFUIMgr::setControlForeColor(void* ptr, int param_1, DWORD color) { +void BFUIMgr::setControlForeColor(void* ptr, int param_1, ZTUI::main::rgb color) { _setControlForeColor og_setControlForeColor = (_setControlForeColor)0x0040ee08; og_setControlForeColor(ptr, param_1, color); diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h index 77e75cd..ba7148a 100644 --- a/EmuAPI/reimp/BFUIMgr.h +++ b/EmuAPI/reimp/BFUIMgr.h @@ -3,7 +3,7 @@ #include #include "ZTUI.h" -typedef void (__thiscall *_setControlForeColor)(void*, int, DWORD); // define original BFUIMgrSetControlForeColor function +typedef void (__thiscall *_setControlForeColor)(void*, int, ZTUI::main::rgb); // define original BFUIMgrSetControlForeColor function typedef int (__thiscall *_confirmDialog)(void*, char, int, int, std::string, char, char, int, int); // define original BFUIMgrConfirmDialog function class BFUIMgr { @@ -16,7 +16,7 @@ class BFUIMgr { static void clickSave(); static void* getUIMgr(); static DWORD getOffset(DWORD); - static void setControlForeColor(void*, int, DWORD); + static void setControlForeColor(void*, int, ZTUI::main::rgb); static int confirmDialog(void*, char, int, int, std::string, char, char, int, int); diff --git a/EmuAPI/reimp/ZTCheats.cpp b/EmuAPI/reimp/ZTCheats.cpp new file mode 100644 index 0000000..6752ac0 --- /dev/null +++ b/EmuAPI/reimp/ZTCheats.cpp @@ -0,0 +1,19 @@ +#include "ZTCheats.h" +#include "ZTWorldMgr.h" +#include "ZTGuest.h" +#include "ZTUI.h" + +void ZTCheats::InvisibleInvincibleCheat() { + if (ZTUI::general::getSelectedEntity() == 0) { + return; + } + if (ZTGuest::getSelectedGuestName() == "Mrs. Invis") { + int ids[] = {9313, 9314, NULL}; + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); + ZTWorldMgr::makeInvisible(entities, false); + } else if (ZTGuest::getSelectedGuestName() == "Mr. Show") { + int ids[] = {9313, 9314, NULL}; + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); + ZTWorldMgr::makeInvisible(entities, true); + } +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTCheats.h b/EmuAPI/reimp/ZTCheats.h new file mode 100644 index 0000000..e413683 --- /dev/null +++ b/EmuAPI/reimp/ZTCheats.h @@ -0,0 +1,10 @@ +#ifndef ZTCHEATS_H +#define ZTCHEATS_H + +class ZTCheats { + public: + static void InvisibleInvincibleCheat(); + +}; + +#endif // ZTCHEATS_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp index e17d791..107f238 100644 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ b/EmuAPI/reimp/ZTGameMgr.cpp @@ -81,17 +81,17 @@ void ZTGameMgr::init() { } -void ZTGameMgr::addCash(float amount) { - // add cash to the game - this->zoo_budget += amount; - ZTUI::main::setMoneyText(); // update money text in the UI -} +// void ZTGameMgr::addCash(float amount) { +// // add cash to the game +// this->zoo_budget += amount; +// ZTUI::main::setMoneyText(); // update money text in the UI +// } -void ZTGameMgr::subtractCash(float amount) { - // subtract cash from the game - this->zoo_budget -= amount; - ZTUI::main::setMoneyText(); // update money text in the UI -} +// void ZTGameMgr::subtractCash(float amount) { +// // subtract cash from the game +// this->zoo_budget -= amount; +// ZTUI::main::setMoneyText(); // update money text in the UI +// } // void ZTGameMgr::startMenuMusic() { // // start the menu music @@ -110,10 +110,10 @@ _FILETIME* ZTGameMgr::getDate_Detour(void* ptr, _FILETIME* date) { return ZTGameMgr::shared_instance().getDate(date); } -void ZTGameMgr::subtractCash_Detour(void* ptr, float amount) { - // detour function for subtracting cash from the game - ZTGameMgr::shared_instance().subtractCash(amount); -} +// void ZTGameMgr::subtractCash_Detour(void* ptr, float amount) { +// // detour function for subtracting cash from the game +// ZTGameMgr::shared_instance().subtractCash(amount); +// } void ZTGameMgr::setCash_Detour(int amount) { // detour function for setting cash in the game @@ -132,10 +132,10 @@ void ZTGameMgr::setCash(int amount) { _ogsetCash(amount); } -void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { - // detour function for adding cash to the game - ZTGameMgr::shared_instance().addCash(amount); -} +// void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { +// // detour function for adding cash to the game +// ZTGameMgr::shared_instance().addCash(amount); +// } ZTGameMgr::~ZTGameMgr() { diff --git a/EmuAPI/reimp/ZTGuest.cpp b/EmuAPI/reimp/ZTGuest.cpp new file mode 100644 index 0000000..da48918 --- /dev/null +++ b/EmuAPI/reimp/ZTGuest.cpp @@ -0,0 +1,17 @@ +#include "ZTGuest.h" +#include "ZTUI.h" + +std::string ZTGuest::getSelectedGuestName() { + void* selectedGuest = ZTUI::general::getSelectedEntity(); + + if (!selectedGuest) { + return "null"; + } + + char* startOfName = *reinterpret_cast(reinterpret_cast(selectedGuest) + 0x108); + char* endOfName = *reinterpret_cast(reinterpret_cast(selectedGuest) + 0x10C); + + size_t nameLength = endOfName - startOfName; + + return std::string(startOfName, nameLength); +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuest.h b/EmuAPI/reimp/ZTGuest.h new file mode 100644 index 0000000..948c834 --- /dev/null +++ b/EmuAPI/reimp/ZTGuest.h @@ -0,0 +1,12 @@ +#ifndef ZTGUEST_H +#define ZTGUEST_H + +#include + +class ZTGuest { + public: + static void init(); + static std::string getSelectedGuestName(); +}; + +#endif // ZTGUEST_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index a4a3da7..7815c85 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -5,6 +5,7 @@ #include #include "Windows.h" #include "detours.h" +#include "ZooState.h" unsigned int ZTUI::gameopts::saveGame(void) { _saveGame _ogsaveGame = (_saveGame)0x004769ac; @@ -45,25 +46,29 @@ void* ZTUI::general::getSelectedEntity(void) { return _oggetSelectedEntity(); } -void ZTUI::main::setMoneyText() { +void ZTUI::main::setMoneyText(rgb color) { // set money text show in the UI - float money = ZTGameMgr::shared_instance().zoo_budget; + float money = ZooState::GetZooBudget(); // void* pBFUIMgr = *(void**)0x00638de0; //DWORD pBFUIMgr = *(DWORD*)((LPVOID)0x00638de0); //DWORD bfuimgr = *((DWORD*)((LPVOID)0x00638de0)); - BFUIMgr *pBFUIMgr = reinterpret_cast((DWORD)0x00638de0); + void *pBFUIMgr = reinterpret_cast(0x00638de0); // GXRGB color = {0, 0, 0}; // set color to black // float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgr::setControlForeColor((LPVOID)pBFUIMgr, 0x3f8, 0x001ac5ff); // set control forecolor + BFUIMgr::setControlForeColor(pBFUIMgr, 0x3f8, color); // set control forecolor bfinternat::setMoneyText(0x3f8, (int)money, '\x01'); // set money text } void ZTUI::main::init() { // initialize the UI // setMoneyText(); - + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DWORD setMoneyTextAdd = 0x0040ee3d; + DetourAttach((PVOID*)&setMoneyTextAdd, (PVOID)&ZTUI::main::setMoneyText); + DetourTransactionCommit(); // EmuBase::callHook(0x0040f02e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from addCash // EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim // EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash @@ -75,9 +80,15 @@ void ZTUI::main::init() { EmuBase::callHook(0x005c1d28, (DWORD)&ZTUI::gameopts::loadFile); // from ZTApp::iniInstance } +ZTUI::main::main() { + // constructor + color.c = 0; + color.r = 0; +} + void ZTUI::main::setMoneyText_Detour() { // detour function for setting money text in the UI - ZTUI::main::setMoneyText(); + ZTUI::main::setMoneyText(ZTUI::main::shared_instance().color); } void ZTUI::main::unpauseGame() { diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index a2c65b2..f1ab7a1 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -2,7 +2,6 @@ #define ZTUI_H #include "ZTMapView.h" -#include "BFUIMgr.h" typedef unsigned int (*_saveGame)(void); // define original saveGame function typedef void (*_unpauseGame)(void); // define original unpauseGame function @@ -26,7 +25,18 @@ namespace ZTUI { class main { public: - static void setMoneyText(); + + main(); + struct rgb { + unsigned short c; + unsigned short r; + }; + rgb color; + static main &shared_instance() { + static main instance; + return instance; + } + static void setMoneyText(rgb); static void init(); static void unpauseGame(); // hook static void pauseGame(); // hook diff --git a/EmuAPI/reimp/ZTWorldMgr.cpp b/EmuAPI/reimp/ZTWorldMgr.cpp index eb8a3ed..522b508 100644 --- a/EmuAPI/reimp/ZTWorldMgr.cpp +++ b/EmuAPI/reimp/ZTWorldMgr.cpp @@ -10,10 +10,11 @@ DWORD ZTWorldMgr::getOffset(DWORD offset) { return (*(DWORD*)0x00638040) + offset; } -std::vector ZTWorldMgr::getAllEntitiesOfType(DWORD* begin, DWORD* end, int ids[]) { +std::vector ZTWorldMgr::getAllEntitiesOfType(int ids[]) { // store the begin and end pointers of the entity list - + DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); + DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); std::vector entities; // iterate through the entity list @@ -40,10 +41,10 @@ std::vector ZTWorldMgr::getAllEntitiesOfType(DWORD* begin, DWORD* end, i return entities; } -void ZTWorldMgr::makeInvisible(std::vector entities) { +void ZTWorldMgr::makeInvisible(std::vector entities, bool isInvisible) { for (size_t i = 0; i < entities.size(); i++) { // Correctly calculate the pointer to the visibility flag bool* visibilityFlag = reinterpret_cast(reinterpret_cast(entities[i]) + 0x13f); - *visibilityFlag = false; + *visibilityFlag = isInvisible; } } diff --git a/EmuAPI/reimp/ZTWorldMgr.h b/EmuAPI/reimp/ZTWorldMgr.h index 976272c..2c85b16 100644 --- a/EmuAPI/reimp/ZTWorldMgr.h +++ b/EmuAPI/reimp/ZTWorldMgr.h @@ -13,8 +13,8 @@ class ZTWorldMgr { static void* getWorldMgr(); static DWORD getOffset(DWORD); - static std::vector getAllEntitiesOfType(DWORD*, DWORD*, int ids[]); - static void makeInvisible(std::vector); + static std::vector getAllEntitiesOfType(int ids[]); + static void makeInvisible(std::vector, bool); }; #endif // ZTWORDLMGR_H From 16316c4446abbfc2d6ad914517c10b66b4b3d2e1 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Sun, 10 Mar 2024 21:45:43 -0700 Subject: [PATCH 28/61] utility functions: getSelectedEntityType, makeSelectableByType, makeSelectable, ZTScenery implementation --- EmuAPI/emu/EmuConsole.cpp | 26 ++++- EmuAPI/reimp/BFEntityType.h | 4 +- EmuAPI/reimp/ZTBuildingType.cpp | 166 ++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTBuildingType.h | 43 ++++++++- EmuAPI/reimp/ZTSceneryType.h | 4 +- EmuAPI/reimp/ZTUI.cpp | 41 ++++++-- EmuAPI/reimp/ZTUI.h | 3 + 7 files changed, 271 insertions(+), 16 deletions(-) diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index d0b058d..09775fd 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -5,6 +5,8 @@ #include "EmuControls.h" #include "ZTMapView.h" #include "ZTGuest.h" +#include "ZTBuildingType.h" +#include "ZTUI.h" EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) { @@ -430,7 +432,19 @@ void EmuConsole::processInput(bool& IsConsoleRunning) } else if (tokens[0] == "getent") { // return selected entity - std::cout << "The selected entity is: " << std::hex << reinterpret_cast(ZTUI::general::getSelectedEntity()) << std::endl; + void* entity = ZTUI::general::getSelectedEntity(); + std::ios_base::fmtflags originalFlags = std::cout.flags(); // save flags + std::cout << "The selected entity is: " << std::hex << reinterpret_cast(entity) << std::endl; + if (tokens.size() > 1 && tokens[1] == "-b") + { + void* entityType = ZTUI::general::getSelectedEntityType(); + ZTBuildingType building(entityType); + std::cout.flags(originalFlags); // reset flags + std::cout << "The building stats are: " << std::endl; + std::cout << "ncolors: " << building.ncolors() << std::endl; + std::cout << "cIconZoom: " << building.cIconZoom() << std::endl; + + } } else if (tokens[0] == "setmapzoom") { if (tokens.size() < 2) @@ -463,6 +477,16 @@ void EmuConsole::processInput(bool& IsConsoleRunning) { std::cout << "The guest name is: " << ZTGuest::getSelectedGuestName() << std::endl; } + else if (tokens[0] == "makesel") + { + if (tokens.size() < 2) + { + std::cout << "Err: Command <" << tokens[0] << "> requires an entity ID." << std::endl; + return; + } else { + ZTUI::general::makeSelectableByType(::atoi(tokens[1].c_str())); + } + } else { std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; diff --git a/EmuAPI/reimp/BFEntityType.h b/EmuAPI/reimp/BFEntityType.h index 56705ca..45e5afd 100644 --- a/EmuAPI/reimp/BFEntityType.h +++ b/EmuAPI/reimp/BFEntityType.h @@ -2,6 +2,6 @@ class BFEntityType { public: char padding[288]; - BFEntityType(); - ~BFEntityType(); + BFEntityType() {}; + ~BFEntityType() {}; }; \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.cpp b/EmuAPI/reimp/ZTBuildingType.cpp index e69de29..c601dc5 100644 --- a/EmuAPI/reimp/ZTBuildingType.cpp +++ b/EmuAPI/reimp/ZTBuildingType.cpp @@ -0,0 +1,166 @@ +#include "ZTBuildingType.h" +#include // must always be above detours.h + +ZTBuildingType::ZTBuildingType(void* thisptr) { + this->thisptr = thisptr; +} + +int ZTBuildingType::ncolors() { + return *(int*)((DWORD)this->thisptr + 0x038); +} + +int ZTBuildingType::ncolors(int input) { + *(int*)((DWORD)this->thisptr + 0x038) = input; + return input; +} + +bool ZTBuildingType::cIconZoom() { + return *(bool*)((DWORD)this->thisptr + 0x050); +} + +bool ZTBuildingType::cIconZoom(bool input) { + *(bool*)((DWORD)this->thisptr + 0x050) = input; + return input; +} + +bool ZTBuildingType::cExpansionID() { + return *(bool*)((DWORD)this->thisptr + 0x054); +} + +bool ZTBuildingType::cExpansionID(bool input) { + *(bool*)((DWORD)this->thisptr + 0x054) = input; + return input; +} + +bool ZTBuildingType::cMovable() { + return *(bool*)((DWORD)this->thisptr + 0x055); +} + +bool ZTBuildingType::cMovable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x055) = input; + return input; +} + +bool ZTBuildingType::walkable() { + return *(bool*)((DWORD)this->thisptr + 0x056); +} + +bool ZTBuildingType::walkable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x056) = input; + return input; +} + +bool ZTBuildingType::walkableByTall() { + return *(bool*)((DWORD)this->thisptr + 0x057); +} + +bool ZTBuildingType::walkableByTall(bool input) { + *(bool*)((DWORD)this->thisptr + 0x057) = input; + return input; +} + +bool ZTBuildingType::cRubbleable() { + return *(bool*)((DWORD)this->thisptr + 0x059); +} + +bool ZTBuildingType::cRubbleable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x059) = input; + return input; +} + +bool ZTBuildingType::cUseNumbersInName() { + return *(bool*)((DWORD)this->thisptr + 0x05B); +} + +bool ZTBuildingType::cUseNumbersInName(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05B) = input; + return input; +} + +bool ZTBuildingType::cUsesRealShadows() { + return *(bool*)((DWORD)this->thisptr + 0x05C); +} + +bool ZTBuildingType::cUsesRealShadows(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05C) = input; + return input; +} + +bool ZTBuildingType::cHasShadowImages() { + return *(bool*)((DWORD)this->thisptr + 0x05D); +} + +bool ZTBuildingType::cHasShadowImages(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05D) = input; + return input; +} + +bool ZTBuildingType::cForceShadowBlack() { + return *(bool*)((DWORD)this->thisptr + 0x05E); +} + +bool ZTBuildingType::cForceShadowBlack(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05E) = input; + return input; +} + +bool ZTBuildingType::cDrawsLate() { + return *(bool*)((DWORD)this->thisptr + 0x060); +} + +bool ZTBuildingType::cDrawsLate(bool input) { + *(bool*)((DWORD)this->thisptr + 0x060) = input; + return input; +} + +bool ZTBuildingType::cHeight() { + return *(bool*)((DWORD)this->thisptr + 0x064); +} + +bool ZTBuildingType::cHeight(bool input) { + *(bool*)((DWORD)this->thisptr + 0x064) = input; + return input; +} + +bool ZTBuildingType::cDepth() { + return *(bool*)((DWORD)this->thisptr + 0x068); +} + +bool ZTBuildingType::cDepth(bool input) { + *(bool*)((DWORD)this->thisptr + 0x068) = input; + return input; +} + +bool ZTBuildingType::cHasUnderwaterSection() { + return *(bool*)((DWORD)this->thisptr + 0x06C); +} + +bool ZTBuildingType::cHasUnderwaterSection(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06C) = input; + return input; +} + +bool ZTBuildingType::cIsTransient() { + return *(bool*)((DWORD)this->thisptr + 0x06D); +} + +bool ZTBuildingType::cIsTransient(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06D) = input; + return input; +} + +bool ZTBuildingType::cUsesPlacementCube() { + return *(bool*)((DWORD)this->thisptr + 0x06E); +} + +bool ZTBuildingType::cUsesPlacementCube(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06E) = input; + return input; +} + + + + +ZTBuildingType::~ZTBuildingType() { + // destructor +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.h b/EmuAPI/reimp/ZTBuildingType.h index 3ef7941..c9369d3 100644 --- a/EmuAPI/reimp/ZTBuildingType.h +++ b/EmuAPI/reimp/ZTBuildingType.h @@ -5,9 +5,48 @@ class ZTBuildingType : public ZTSceneryType { public: - char padding[112]; // 404 - ZTBuildingType(); + ZTBuildingType(void*); + int ncolors(); // 0x038 + int ncolors(int); // 0x038 + bool cIconZoom(); // 0x050 + bool cIconZoom(bool); // 0x050 + bool cExpansionID(); // 0x054 maybe int? + bool cExpansionID(bool); // 0x054 + bool cMovable(); // 0x055 + bool cMovable(bool); // 0x055 + bool walkable(); // 0x056 + bool walkable(bool); // 0x056 + bool walkableByTall(); // 0x057 + bool walkableByTall(bool); // 0x057 + bool cRubbleable(); // 0x059 + bool cRubbleable(bool); // 0x059 + bool cUseNumbersInName(); // 0x05B + bool cUseNumbersInName(bool); // 0x05B + bool cUsesRealShadows(); // 0x05C + bool cUsesRealShadows(bool); // 0x05C + bool cHasShadowImages(); // 0x05D + bool cHasShadowImages(bool); // 0x05D + bool cForceShadowBlack(); // 0x05E + bool cForceShadowBlack(bool); // 0x05E + bool cDrawsLate(); // 0x060 + bool cDrawsLate(bool); // 0x060 + bool cHeight(); // 0x064 + bool cHeight(bool); // 0x064 + bool cDepth(); // 0x068 + bool cDepth(bool); // 0x068 + bool cHasUnderwaterSection(); // 0x06C + bool cHasUnderwaterSection(bool); // 0x06C + bool cIsTransient(); // 0x06D + bool cIsTransient(bool); // 0x06D + bool cUsesPlacementCube(); // 0x06E + bool cUsesPlacementCube(bool); // 0x06E + + + ~ZTBuildingType(); + + private: + void* thisptr; }; #endif // ZTBUILDINGTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.h b/EmuAPI/reimp/ZTSceneryType.h index 27c073e..8a3db85 100644 --- a/EmuAPI/reimp/ZTSceneryType.h +++ b/EmuAPI/reimp/ZTSceneryType.h @@ -6,8 +6,8 @@ class ZTSceneryType : public BFEntityType { public: char padding[4]; // 292 - ZTSceneryType(); - ~ZTSceneryType(); + ZTSceneryType() {}; + ~ZTSceneryType() {}; }; #endif // ZTSCENERYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp index 7815c85..a579dd8 100644 --- a/EmuAPI/reimp/ZTUI.cpp +++ b/EmuAPI/reimp/ZTUI.cpp @@ -6,6 +6,7 @@ #include "Windows.h" #include "detours.h" #include "ZooState.h" +#include "ZTWorldMgr.h" unsigned int ZTUI::gameopts::saveGame(void) { _saveGame _ogsaveGame = (_saveGame)0x004769ac; @@ -33,19 +34,41 @@ void* ZTUI::general::getMapView(void) { } void* ZTUI::general::getSelectedEntity(void) { - // ZTMapView *pZTMapView = (ZTUI::general::getMapView()); - // unsigned char* baseAddr = reinterpret_cast(pZTMapView); - // // DWORD* addressAtOffset = reinterpret_cast(baseAddr + (1084 * sizeof(DWORD))); - // if (pZTMapView == 0) { - // return 0; - // } else { - // return addressAtOffset; - // } - _getSelectedEntity _oggetSelectedEntity = (_getSelectedEntity)0x00410f84; return _oggetSelectedEntity(); } +void* ZTUI::general::getSelectedEntityType(void) { + if (getSelectedEntity() == 0) { + return 0; + } + void* entity = getSelectedEntity(); + void* entitytype = *(void**)((DWORD)entity + 0x128); + return (void*)entitytype; +} + +void ZTUI::general::makeSelectableByType(int type) { + if (type == 0) { + return; + } + int id[] = {type, NULL}; + std::vector entities = ZTWorldMgr::getAllEntitiesOfType(id); + makeSelectable(entities); +} + +void ZTUI::general::makeSelectable(std::vector entities) { + if (entities.size() == 0) { + return; + } + for (size_t i = 0; i < entities.size(); i++) { + void* entity = (void*)entities[i]; + void* entitytype = *(void**)((DWORD)entity + 0x128); + // selectable offset is 0x128 + void* selectable = (void*)((DWORD)entitytype + 0x128); + *(bool*)selectable = true; + } +} + void ZTUI::main::setMoneyText(rgb color) { // set money text show in the UI float money = ZooState::GetZooBudget(); diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h index f1ab7a1..e89fa9d 100644 --- a/EmuAPI/reimp/ZTUI.h +++ b/EmuAPI/reimp/ZTUI.h @@ -21,6 +21,9 @@ namespace ZTUI { public: static void* getMapView(); static void* getSelectedEntity(); + static void* getSelectedEntityType(); + static void makeSelectableByType(int); + static void makeSelectable(std::vector); }; class main { From e322268dd36196af3fdf527b0748d440b09af9f7 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 11 Mar 2024 12:07:19 -0700 Subject: [PATCH 29/61] abstraction of BFEntityType, ZTSceneryType, and ZTBuildingType memory pointers --- EmuAPI/EmuAPI.vcproj | 4 + EmuAPI/emu/EmuConsole.cpp | 14 +- EmuAPI/reimp/BFEntityType.h | 66 +++- EmuAPI/reimp/ZTBuildingType.cpp | 163 --------- EmuAPI/reimp/ZTBuildingType.h | 44 +-- EmuAPI/reimp/ZTSceneryType.cpp | 589 ++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTSceneryType.h | 65 +++- 7 files changed, 731 insertions(+), 214 deletions(-) create mode 100644 EmuAPI/reimp/ZTSceneryType.cpp diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index 9633342..e5643c0 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -448,6 +448,10 @@ RelativePath=".\reimp\ZTRubbleType.h" > + + diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp index 09775fd..41d44da 100644 --- a/EmuAPI/emu/EmuConsole.cpp +++ b/EmuAPI/emu/EmuConsole.cpp @@ -433,17 +433,21 @@ void EmuConsole::processInput(bool& IsConsoleRunning) else if (tokens[0] == "getent") { // return selected entity void* entity = ZTUI::general::getSelectedEntity(); - std::ios_base::fmtflags originalFlags = std::cout.flags(); // save flags std::cout << "The selected entity is: " << std::hex << reinterpret_cast(entity) << std::endl; if (tokens.size() > 1 && tokens[1] == "-b") { void* entityType = ZTUI::general::getSelectedEntityType(); ZTBuildingType building(entityType); - std::cout.flags(originalFlags); // reset flags - std::cout << "The building stats are: " << std::endl; - std::cout << "ncolors: " << building.ncolors() << std::endl; + + std::cout << "The building stats at type: " << entityType << std::endl; + std::cout << std::dec << "ncolors: " << building.ncolors() << std::endl; std::cout << "cIconZoom: " << building.cIconZoom() << std::endl; - + std::cout << "cExpansionID: " << building.cExpansionID() << std::endl; + std::cout << "cMovable: " << building.cMovable() << std::endl; + std::cout << "walkable: " << building.walkable() << std::endl; + std::cout << "walkableByTall: " << building.walkableByTall() << std::endl; + std::cout << "cRubbleable: " << building.cRubbleable() << std::endl; + std::cout << "cUseNumbersInName: " << building.cUseNumbersInName() << std::endl; } } else if (tokens[0] == "setmapzoom") { diff --git a/EmuAPI/reimp/BFEntityType.h b/EmuAPI/reimp/BFEntityType.h index 45e5afd..83e1ba8 100644 --- a/EmuAPI/reimp/BFEntityType.h +++ b/EmuAPI/reimp/BFEntityType.h @@ -1,7 +1,69 @@ class BFEntityType { public: - char padding[288]; - BFEntityType() {}; + // char padding[288]; + int ncolors(); // 0x038 + int ncolors(int); // 0x038 + bool cIconZoom(); // 0x050 + bool cIconZoom(bool); // 0x050 + bool cExpansionID(); // 0x054 maybe int? + bool cExpansionID(bool); // 0x054 + bool cMovable(); // 0x055 + bool cMovable(bool); // 0x055 + bool walkable(); // 0x056 + bool walkable(bool); // 0x056 + bool walkableByTall(); // 0x057 + bool walkableByTall(bool); // 0x057 + bool cRubbleable(); // 0x059 + bool cRubbleable(bool); // 0x059 + bool cUseNumbersInName(); // 0x05B + bool cUseNumbersInName(bool); // 0x05B + bool cUsesRealShadows(); // 0x05C + bool cUsesRealShadows(bool); // 0x05C + bool cHasShadowImages(); // 0x05D + bool cHasShadowImages(bool); // 0x05D + bool cForceShadowBlack(); // 0x05E + bool cForceShadowBlack(bool); // 0x05E + bool cDrawsLate(); // 0x060 <--- might need double checking, not available in canopies + bool cDrawsLate(bool); // 0x060 + bool cHeight(); // 0x064 + bool cHeight(bool); // 0x064 + bool cDepth(); // 0x068 + bool cDepth(bool); // 0x068 + bool cHasUnderwaterSection(); // 0x06C + bool cHasUnderwaterSection(bool); // 0x06C + bool cIsTransient(); // 0x06D + bool cIsTransient(bool); // 0x06D + bool cUsesPlacementCube(); // 0x06E + bool cUsesPlacementCube(bool); // 0x06E + bool cShow(); //0x06F + bool cShow(bool); //0x06F + int cHitThreshold(); // 0x070 + int cHitThreshold(int); // 0x070 + bool cAvoidEdges(); // 0x074 + bool cAvoidEdges(bool); // 0x074 + std::string typeName(); // 0x098 + std::string typeName(std::string); // 0x098 + std::string codename(); // 0x0A4 + std::string codename(std::string); // 0x0A4 + int cFootprintX(); //0x0B4 + int cFootprintX(int); //0x0B4 + int cFootprintY(); //0x0B8 + int cFootprintY(int); //0x0B8 + int cFootprintZ(); //0x0BC + int cFootprintZ(int); //0x0BC + int cPlacementFootprintX(); //0x0C0 + int cPlacementFootprintX(int); //0x0C0 + int cPlacementFootprintY(); //0x0C4 + int cPlacementFootprintY(int); //0x0C4 + int cPlacementFootprintZ(); //0x0C8 + int cPlacementFootprintZ(int); //0x0C8 + bool availableAtStartup(); //0x0CC + bool availableAtStartup(bool); //0x0CC + + BFEntityType(void* ptr) : thisptr(ptr) {}; ~BFEntityType() {}; + + protected: + void* thisptr; }; \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.cpp b/EmuAPI/reimp/ZTBuildingType.cpp index c601dc5..97f70d9 100644 --- a/EmuAPI/reimp/ZTBuildingType.cpp +++ b/EmuAPI/reimp/ZTBuildingType.cpp @@ -1,166 +1,3 @@ #include "ZTBuildingType.h" #include // must always be above detours.h -ZTBuildingType::ZTBuildingType(void* thisptr) { - this->thisptr = thisptr; -} - -int ZTBuildingType::ncolors() { - return *(int*)((DWORD)this->thisptr + 0x038); -} - -int ZTBuildingType::ncolors(int input) { - *(int*)((DWORD)this->thisptr + 0x038) = input; - return input; -} - -bool ZTBuildingType::cIconZoom() { - return *(bool*)((DWORD)this->thisptr + 0x050); -} - -bool ZTBuildingType::cIconZoom(bool input) { - *(bool*)((DWORD)this->thisptr + 0x050) = input; - return input; -} - -bool ZTBuildingType::cExpansionID() { - return *(bool*)((DWORD)this->thisptr + 0x054); -} - -bool ZTBuildingType::cExpansionID(bool input) { - *(bool*)((DWORD)this->thisptr + 0x054) = input; - return input; -} - -bool ZTBuildingType::cMovable() { - return *(bool*)((DWORD)this->thisptr + 0x055); -} - -bool ZTBuildingType::cMovable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x055) = input; - return input; -} - -bool ZTBuildingType::walkable() { - return *(bool*)((DWORD)this->thisptr + 0x056); -} - -bool ZTBuildingType::walkable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x056) = input; - return input; -} - -bool ZTBuildingType::walkableByTall() { - return *(bool*)((DWORD)this->thisptr + 0x057); -} - -bool ZTBuildingType::walkableByTall(bool input) { - *(bool*)((DWORD)this->thisptr + 0x057) = input; - return input; -} - -bool ZTBuildingType::cRubbleable() { - return *(bool*)((DWORD)this->thisptr + 0x059); -} - -bool ZTBuildingType::cRubbleable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x059) = input; - return input; -} - -bool ZTBuildingType::cUseNumbersInName() { - return *(bool*)((DWORD)this->thisptr + 0x05B); -} - -bool ZTBuildingType::cUseNumbersInName(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05B) = input; - return input; -} - -bool ZTBuildingType::cUsesRealShadows() { - return *(bool*)((DWORD)this->thisptr + 0x05C); -} - -bool ZTBuildingType::cUsesRealShadows(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05C) = input; - return input; -} - -bool ZTBuildingType::cHasShadowImages() { - return *(bool*)((DWORD)this->thisptr + 0x05D); -} - -bool ZTBuildingType::cHasShadowImages(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05D) = input; - return input; -} - -bool ZTBuildingType::cForceShadowBlack() { - return *(bool*)((DWORD)this->thisptr + 0x05E); -} - -bool ZTBuildingType::cForceShadowBlack(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05E) = input; - return input; -} - -bool ZTBuildingType::cDrawsLate() { - return *(bool*)((DWORD)this->thisptr + 0x060); -} - -bool ZTBuildingType::cDrawsLate(bool input) { - *(bool*)((DWORD)this->thisptr + 0x060) = input; - return input; -} - -bool ZTBuildingType::cHeight() { - return *(bool*)((DWORD)this->thisptr + 0x064); -} - -bool ZTBuildingType::cHeight(bool input) { - *(bool*)((DWORD)this->thisptr + 0x064) = input; - return input; -} - -bool ZTBuildingType::cDepth() { - return *(bool*)((DWORD)this->thisptr + 0x068); -} - -bool ZTBuildingType::cDepth(bool input) { - *(bool*)((DWORD)this->thisptr + 0x068) = input; - return input; -} - -bool ZTBuildingType::cHasUnderwaterSection() { - return *(bool*)((DWORD)this->thisptr + 0x06C); -} - -bool ZTBuildingType::cHasUnderwaterSection(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06C) = input; - return input; -} - -bool ZTBuildingType::cIsTransient() { - return *(bool*)((DWORD)this->thisptr + 0x06D); -} - -bool ZTBuildingType::cIsTransient(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06D) = input; - return input; -} - -bool ZTBuildingType::cUsesPlacementCube() { - return *(bool*)((DWORD)this->thisptr + 0x06E); -} - -bool ZTBuildingType::cUsesPlacementCube(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06E) = input; - return input; -} - - - - -ZTBuildingType::~ZTBuildingType() { - // destructor -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.h b/EmuAPI/reimp/ZTBuildingType.h index c9369d3..20b4363 100644 --- a/EmuAPI/reimp/ZTBuildingType.h +++ b/EmuAPI/reimp/ZTBuildingType.h @@ -2,51 +2,11 @@ #define ZTBUILDINGTYPE_H #include "ZTSceneryType.h" +#include class ZTBuildingType : public ZTSceneryType { public: - ZTBuildingType(void*); - int ncolors(); // 0x038 - int ncolors(int); // 0x038 - bool cIconZoom(); // 0x050 - bool cIconZoom(bool); // 0x050 - bool cExpansionID(); // 0x054 maybe int? - bool cExpansionID(bool); // 0x054 - bool cMovable(); // 0x055 - bool cMovable(bool); // 0x055 - bool walkable(); // 0x056 - bool walkable(bool); // 0x056 - bool walkableByTall(); // 0x057 - bool walkableByTall(bool); // 0x057 - bool cRubbleable(); // 0x059 - bool cRubbleable(bool); // 0x059 - bool cUseNumbersInName(); // 0x05B - bool cUseNumbersInName(bool); // 0x05B - bool cUsesRealShadows(); // 0x05C - bool cUsesRealShadows(bool); // 0x05C - bool cHasShadowImages(); // 0x05D - bool cHasShadowImages(bool); // 0x05D - bool cForceShadowBlack(); // 0x05E - bool cForceShadowBlack(bool); // 0x05E - bool cDrawsLate(); // 0x060 - bool cDrawsLate(bool); // 0x060 - bool cHeight(); // 0x064 - bool cHeight(bool); // 0x064 - bool cDepth(); // 0x068 - bool cDepth(bool); // 0x068 - bool cHasUnderwaterSection(); // 0x06C - bool cHasUnderwaterSection(bool); // 0x06C - bool cIsTransient(); // 0x06D - bool cIsTransient(bool); // 0x06D - bool cUsesPlacementCube(); // 0x06E - bool cUsesPlacementCube(bool); // 0x06E - - - - ~ZTBuildingType(); - - private: - void* thisptr; + ZTBuildingType(void* ptr) : ZTSceneryType(ptr) {}; }; #endif // ZTBUILDINGTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.cpp b/EmuAPI/reimp/ZTSceneryType.cpp new file mode 100644 index 0000000..c3f795e --- /dev/null +++ b/EmuAPI/reimp/ZTSceneryType.cpp @@ -0,0 +1,589 @@ +#include "ZTSceneryType.h" +#include // must always be above detours.h + +int ZTSceneryType::ncolors() { + return *(int*)((DWORD)thisptr + 0x038); +} + +int ZTSceneryType::ncolors(int input) { + *(int*)((DWORD)this->thisptr + 0x038) = input; + return input; +} + +bool ZTSceneryType::cIconZoom() { + return *(bool*)((DWORD)this->thisptr + 0x050); +} + +bool ZTSceneryType::cIconZoom(bool input) { + *(bool*)((DWORD)this->thisptr + 0x050) = input; + return input; +} + +bool ZTSceneryType::cExpansionID() { + return *(bool*)((DWORD)this->thisptr + 0x054); +} + +bool ZTSceneryType::cExpansionID(bool input) { + *(bool*)((DWORD)this->thisptr + 0x054) = input; + return input; +} + +bool ZTSceneryType::cMovable() { + return *(bool*)((DWORD)this->thisptr + 0x055); +} + +bool ZTSceneryType::cMovable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x055) = input; + return input; +} + +bool ZTSceneryType::walkable() { + return *(bool*)((DWORD)this->thisptr + 0x056); +} + +bool ZTSceneryType::walkable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x056) = input; + return input; +} + +bool ZTSceneryType::walkableByTall() { + return *(bool*)((DWORD)this->thisptr + 0x057); +} + +bool ZTSceneryType::walkableByTall(bool input) { + *(bool*)((DWORD)this->thisptr + 0x057) = input; + return input; +} + +bool ZTSceneryType::cRubbleable() { + return *(bool*)((DWORD)this->thisptr + 0x059); +} + +bool ZTSceneryType::cRubbleable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x059) = input; + return input; +} + +bool ZTSceneryType::cUseNumbersInName() { + return *(bool*)((DWORD)this->thisptr + 0x05B); +} + +bool ZTSceneryType::cUseNumbersInName(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05B) = input; + return input; +} + +bool ZTSceneryType::cUsesRealShadows() { + return *(bool*)((DWORD)this->thisptr + 0x05C); +} + +bool ZTSceneryType::cUsesRealShadows(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05C) = input; + return input; +} + +bool ZTSceneryType::cHasShadowImages() { + return *(bool*)((DWORD)this->thisptr + 0x05D); +} + +bool ZTSceneryType::cHasShadowImages(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05D) = input; + return input; +} + +bool ZTSceneryType::cForceShadowBlack() { + return *(bool*)((DWORD)this->thisptr + 0x05E); +} + +bool ZTSceneryType::cForceShadowBlack(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05E) = input; + return input; +} + +bool ZTSceneryType::cDrawsLate() { + return *(bool*)((DWORD)this->thisptr + 0x060); +} + +bool ZTSceneryType::cDrawsLate(bool input) { + *(bool*)((DWORD)this->thisptr + 0x060) = input; + return input; +} + +bool ZTSceneryType::cHeight() { + return *(bool*)((DWORD)this->thisptr + 0x064); +} + +bool ZTSceneryType::cHeight(bool input) { + *(bool*)((DWORD)this->thisptr + 0x064) = input; + return input; +} + +bool ZTSceneryType::cDepth() { + return *(bool*)((DWORD)this->thisptr + 0x068); +} + +bool ZTSceneryType::cDepth(bool input) { + *(bool*)((DWORD)this->thisptr + 0x068) = input; + return input; +} + +bool ZTSceneryType::cHasUnderwaterSection() { + return *(bool*)((DWORD)this->thisptr + 0x06C); +} + +bool ZTSceneryType::cHasUnderwaterSection(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06C) = input; + return input; +} + +bool ZTSceneryType::cIsTransient() { + return *(bool*)((DWORD)this->thisptr + 0x06D); +} + +bool ZTSceneryType::cIsTransient(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06D) = input; + return input; +} + +bool ZTSceneryType::cUsesPlacementCube() { + return *(bool*)((DWORD)this->thisptr + 0x06E); +} + +bool ZTSceneryType::cUsesPlacementCube(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06E) = input; + return input; +} + +bool ZTSceneryType::cShow() { + return *(bool*)((DWORD)this->thisptr + 0x06F); +} + +bool ZTSceneryType::cShow(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06F) = input; + return input; +} + +int ZTSceneryType::cHitThreshold() { + return *(int*)((DWORD)this->thisptr + 0x070); +} + +int ZTSceneryType::cHitThreshold(int input) { + *(int*)((DWORD)this->thisptr + 0x070) = input; + return input; +} + +bool ZTSceneryType::cAvoidEdges() { + return *(bool*)((DWORD)this->thisptr + 0x074); +} + +bool ZTSceneryType::cAvoidEdges(bool input) { + *(bool*)((DWORD)this->thisptr + 0x074) = input; + return input; +} + +int ZTSceneryType::cFootprintX() { + return *(int*)((DWORD)this->thisptr + 0x0B4); +} + +int ZTSceneryType::cFootprintX(int input) { + *(int*)((DWORD)this->thisptr + 0x0B4) = input; + return input; +} + +int ZTSceneryType::cFootprintY() { + return *(int*)((DWORD)this->thisptr + 0x0B8); +} + +int ZTSceneryType::cFootprintY(int input) { + *(int*)((DWORD)this->thisptr + 0x0B8) = input; + return input; +} + + +int ZTSceneryType::cFootprintZ() { + return *(int*)((DWORD)this->thisptr + 0x0BC); +} + +int ZTSceneryType::cFootprintZ(int input) { + *(int*)((DWORD)this->thisptr + 0x0BC) = input; + return input; +} + +int ZTSceneryType::cPlacementFootprintX() { + return *(int*)((DWORD)this->thisptr + 0x0C0); +} + +int ZTSceneryType::cPlacementFootprintX(int input) { + *(int*)((DWORD)this->thisptr + 0x0C0) = input; + return input; +} + +int ZTSceneryType::cPlacementFootprintY() { + return *(int*)((DWORD)this->thisptr + 0x0C4); +} + +int ZTSceneryType::cPlacementFootprintY(int input) { + *(int*)((DWORD)this->thisptr + 0x0C4) = input; + return input; +} + +int ZTSceneryType::cPlacementFootprintZ() { + return *(int*)((DWORD)this->thisptr + 0x0C8); +} + + +int ZTSceneryType::cPlacementFootprintZ(int input) { + *(int*)((DWORD)this->thisptr + 0x0C8) = input; + return input; +} + +int ZTSceneryType::cPurchaseCost() { + return *(int*)((DWORD)this->thisptr + 0x100); +} + +int ZTSceneryType::cPurchaseCost(int input) { + *(int*)((DWORD)this->thisptr + 0x100) = input; + return input; +} + +int ZTSceneryType::cNameID() { + return *(int*)((DWORD)this->thisptr + 0x104); +} + +int ZTSceneryType::cNameID(int input) { + *(int*)((DWORD)this->thisptr + 0x104) = input; + return input; +} + +int ZTSceneryType::cHelpID() { + return *(int*)((DWORD)this->thisptr + 0x108); +} + +int ZTSceneryType::cHelpID(int input) { + *(int*)((DWORD)this->thisptr + 0x108) = input; + return input; +} + +int ZTSceneryType::cHabitat() { + return *(int*)((DWORD)this->thisptr + 0x10C); +} + +int ZTSceneryType::cHabitat(int input) { + *(int*)((DWORD)this->thisptr + 0x10C) = input; + return input; +} + +int ZTSceneryType::cLocation() { + return *(int*)((DWORD)this->thisptr + 0x110); +} + +int ZTSceneryType::cLocation(int input) { + *(int*)((DWORD)this->thisptr + 0x110) = input; + return input; +} + +int ZTSceneryType::cEra() { + return *(int*)((DWORD)this->thisptr + 0x114); +} + +int ZTSceneryType::cEra(int input) { + *(int*)((DWORD)this->thisptr + 0x114) = input; + return input; +} + +int ZTSceneryType::cMaxFoodUnits() { + return *(int*)((DWORD)this->thisptr + 0x118); +} + +int ZTSceneryType::cMaxFoodUnits(int input) { + *(int*)((DWORD)this->thisptr + 0x118) = input; + return input; +} + +// bool ZTSceneryType::cDeletable() { +// return *(bool*)((DWORD)this->thisptr + 0x119); +// } + +// bool ZTSceneryType::cDeletable(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x119) = input; +// return input; +// } + +bool ZTSceneryType::cStink() { + return *(bool*)((DWORD)this->thisptr + 0x11C); +} + +bool ZTSceneryType::cStink(bool input) { + *(bool*)((DWORD)this->thisptr + 0x11C) = input; + return input; +} + +int ZTSceneryType::cEstheticWeight() { + return *(int*)((DWORD)this->thisptr + 0x120); +} + +int ZTSceneryType::cEstheticWeight(int input) { + *(int*)((DWORD)this->thisptr + 0x120) = input; + return input; +} + +bool ZTSceneryType::cSelectable() { + return *(bool*)((DWORD)this->thisptr + 0x128); +} + +bool ZTSceneryType::cSelectable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x128) = input; + return input; +} + +// bool ZTSceneryType::cDeletable() { +// return *(bool*)((DWORD)this->thisptr + 0x129); +// } + +// bool ZTSceneryType::cDeletable(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x129) = input; +// return input; +// } + +bool ZTSceneryType::cFoliage() { + return *(bool*)((DWORD)this->thisptr + 0x12A); +} + +bool ZTSceneryType::cFoliage(bool input) { + *(bool*)((DWORD)this->thisptr + 0x12A) = input; + return input; +} + +// bool ZTSceneryType::cAutoRotate() { +// return *(bool*)((DWORD)this->thisptr + 0x12D); +// } + +// bool ZTSceneryType::cAutoRotate(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x12D) = input; +// return input; +// } + +// bool ZTSceneryType::cLand() { +// return *(bool*)((DWORD)this->thisptr + 0x12E); +// } + +// bool ZTSceneryType::cLand(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x12E) = input; +// return input; +// } + +bool ZTSceneryType::cSwims() { + return *(bool*)((DWORD)this->thisptr + 0x12F); +} + +bool ZTSceneryType::cSwims(bool input) { + *(bool*)((DWORD)this->thisptr + 0x12F) = input; + return input; +} + +bool ZTSceneryType::cUnderwater() { + return *(bool*)((DWORD)this->thisptr + 0x130); +} + +bool ZTSceneryType::cUnderwater(bool input) { + *(bool*)((DWORD)this->thisptr + 0x130) = input; + return input; +} + +bool ZTSceneryType::cSurface() { + return *(bool*)((DWORD)this->thisptr + 0x131); +} + +bool ZTSceneryType::cSurface(bool input) { + *(bool*)((DWORD)this->thisptr + 0x131) = input; + return input; +} + +std::string ZTSceneryType::typeName() { + return *(std::string*)((DWORD)this->thisptr + 0x098); +} + +std::string ZTSceneryType::typeName(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x098) = input; + return input; +} + +std::string ZTSceneryType::codename() { + return *(std::string*)((DWORD)this->thisptr + 0x0A4); +} + +std::string ZTSceneryType::codename(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x0A4) = input; + return input; +} + +// bool ZTSceneryType::cSelectable() { +// return *(bool*)((DWORD)this->thisptr + 0x128); +// } + +// bool ZTSceneryType::cSelectable(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x128) = input; +// return input; +// } + +// bool ZTSceneryType::cDeletable() { +// return *(bool*)((DWORD)this->thisptr + 0x129); +// } + +// bool ZTSceneryType::cDeletable(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x129) = input; +// return input; +// } + +// bool ZTSceneryType::cFoliage() { +// return *(bool*)((DWORD)this->thisptr + 0x12A); +// } + +// bool ZTSceneryType::cFoliage(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x12A) = input; +// return input; +// } + +bool ZTSceneryType::cAutoRotate() { + return *(bool*)((DWORD)this->thisptr + 0x12D); +} + +bool ZTSceneryType::cAutoRotate(bool input) { + *(bool*)((DWORD)this->thisptr + 0x12D) = input; + return input; +} + +bool ZTSceneryType::cLand() { + return *(bool*)((DWORD)this->thisptr + 0x12E); +} + +bool ZTSceneryType::cLand(bool input) { + *(bool*)((DWORD)this->thisptr + 0x12E) = input; + return input; +} + +// bool ZTSceneryType::cSwims() { +// return *(bool*)((DWORD)this->thisptr + 0x12F); +// } + +// bool ZTSceneryType::cSwims(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x12F) = input; +// return input; +// } + +// bool ZTSceneryType::cUnderwater() { +// return *(bool*)((DWORD)this->thisptr + 0x130); +// } + +// bool ZTSceneryType::cUnderwater(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x130) = input; +// return input; +// } + +// bool ZTSceneryType::cSurface() { +// return *(bool*)((DWORD)this->thisptr + 0x131); +// } + +// bool ZTSceneryType::cSurface(bool input) { +// *(bool*)((DWORD)this->thisptr + 0x131) = input; +// return input; +// } + +bool ZTSceneryType::cSubmerge() { + return *(bool*)((DWORD)this->thisptr + 0x132); +} + +bool ZTSceneryType::cSubmerge(bool input) { + *(bool*)((DWORD)this->thisptr + 0x132) = input; + return input; +} + +bool ZTSceneryType::cOnlySwims() { + return *(bool*)((DWORD)this->thisptr + 0x133); +} + +bool ZTSceneryType::cOnlySwims(bool input) { + *(bool*)((DWORD)this->thisptr + 0x133) = input; + return input; +} + +bool ZTSceneryType::cNeedsConfirm() { + return *(bool*)((DWORD)this->thisptr + 0x134); +} + +bool ZTSceneryType::cNeedsConfirm(bool input) { + *(bool*)((DWORD)this->thisptr + 0x134) = input; + return input; +} + +bool ZTSceneryType::cGawkOnlyFromFront() { + return *(bool*)((DWORD)this->thisptr + 0x135); +} + +bool ZTSceneryType::cGawkOnlyFromFront(bool input) { + *(bool*)((DWORD)this->thisptr + 0x135) = input; + return input; +} + +bool ZTSceneryType::cDeadOnLand() { + return *(bool*)((DWORD)this->thisptr + 0x136); +} + +bool ZTSceneryType::cDeadOnLand(bool input) { + *(bool*)((DWORD)this->thisptr + 0x136) = input; + return input; +} + +bool ZTSceneryType::cDeadOnFlatWater() { + return *(bool*)((DWORD)this->thisptr + 0x137); +} + +bool ZTSceneryType::cDeadOnFlatWater(bool input) { + *(bool*)((DWORD)this->thisptr + 0x137) = input; + return input; +} + +bool ZTSceneryType::cDeadUnderwater() { + return *(bool*)((DWORD)this->thisptr + 0x138); +} + +bool ZTSceneryType::cDeadUnderwater(bool input) { + *(bool*)((DWORD)this->thisptr + 0x138) = input; + return input; +} + +bool ZTSceneryType::cUsesTreeRubble() { + return *(bool*)((DWORD)this->thisptr + 0x139); +} + +bool ZTSceneryType::cUsesTreeRubble(bool input) { + *(bool*)((DWORD)this->thisptr + 0x139) = input; + return input; +} + +bool ZTSceneryType::cForcesSceneryRubble() { + return *(bool*)((DWORD)this->thisptr + 0x13A); +} + +bool ZTSceneryType::cForcesSceneryRubble(bool input) { + *(bool*)((DWORD)this->thisptr + 0x13A) = input; + return input; +} + +bool ZTSceneryType::cBlocksLOS() { + return *(bool*)((DWORD)this->thisptr + 0x13B); +} + +bool ZTSceneryType::cBlocksLOS(bool input) { + *(bool*)((DWORD)this->thisptr + 0x13B) = input; + return input; +} + +std::string ZTSceneryType::cInfoImageName() { + return *(std::string*)((DWORD)this->thisptr + 0x14C); +} + +std::string ZTSceneryType::cInfoImageName(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x14C) = input; + return input; +} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.h b/EmuAPI/reimp/ZTSceneryType.h index 8a3db85..63061a1 100644 --- a/EmuAPI/reimp/ZTSceneryType.h +++ b/EmuAPI/reimp/ZTSceneryType.h @@ -2,12 +2,73 @@ #define ZTSCENERYTYPE_H #include "BFEntityType.h" +#include + class ZTSceneryType : public BFEntityType { public: - char padding[4]; // 292 - ZTSceneryType() {}; + // char padding[4]; // 292 + int cPurchaseCost(); //0x100 + int cPurchaseCost(int); //0x100 + int cNameID(); //0x104 + int cNameID(int); //0x104 + int cHelpID(); //0x108 + int cHelpID(int); //0x108 + int cHabitat(); //0x10C + int cHabitat(int); //0x10C + int cLocation(); //0x110 + int cLocation(int); //0x110 + int cEra(); //0x114 + int cEra(int); //0x114 + int cMaxFoodUnits(); //0x118 + int cMaxFoodUnits(int); //0x118 + bool cDeletable(); //0x119 + bool cDeletable(bool); //0x119 + bool cStink(); //0x11C + bool cStink(bool); //0x11C + int cEstheticWeight(); //0x120 + int cEstheticWeight(int); //0x120 + bool cSelectable(); //0x128 + bool cSelectable(bool); //0x128 + // bool cDeletable(); //0x129 + // bool cDeletable(bool); //0x129 + bool cFoliage(); //0x12A + bool cFoliage(bool); //0x12A + bool cAutoRotate(); //0x12D + bool cAutoRotate(bool); //0x12D + bool cLand(); //0x12E + bool cLand(bool); //0x12E + bool cSwims(); //0x12F + bool cSwims(bool); //0x12F + bool cUnderwater(); //0x130 + bool cUnderwater(bool); //0x130 + bool cSurface(); //0x131 + bool cSurface(bool); //0x131 + bool cSubmerge(); //0x132 + bool cSubmerge(bool); //0x132 + bool cOnlySwims(); //0x133 + bool cOnlySwims(bool); //0x133 + bool cNeedsConfirm(); //0x134 + bool cNeedsConfirm(bool); //0x134 + bool cGawkOnlyFromFront(); //0x135 + bool cGawkOnlyFromFront(bool); //0x135 + bool cDeadOnLand(); //0x136 + bool cDeadOnLand(bool); //0x136 + bool cDeadOnFlatWater(); //0x137 + bool cDeadOnFlatWater(bool); //0x137 + bool cDeadUnderwater(); //0x138 + bool cDeadUnderwater(bool); //0x138 + bool cUsesTreeRubble(); //0x139 + bool cUsesTreeRubble(bool); //0x139 + bool cForcesSceneryRubble(); //0x13A + bool cForcesSceneryRubble(bool); //0x13A + bool cBlocksLOS(); //0x13B + bool cBlocksLOS(bool); //0x13B + std::string cInfoImageName(); //0x14C + std::string cInfoImageName(std::string); //0x14C + ZTSceneryType(void* ptr) : BFEntityType(ptr) {}; ~ZTSceneryType() {}; + }; #endif // ZTSCENERYTYPE_H \ No newline at end of file From 5dcd27e13b8f13d7514fecf3135e3b162e276155 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 11 Mar 2024 12:54:12 -0700 Subject: [PATCH 30/61] ZTFenceType pointer class --- EmuAPI/reimp/BFEntityType.cpp | 267 +++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTFenceType.h | 32 +++- EmuAPI/reimp/ZTSceneryType.cpp | 252 ------------------------------- 3 files changed, 297 insertions(+), 254 deletions(-) create mode 100644 EmuAPI/reimp/BFEntityType.cpp diff --git a/EmuAPI/reimp/BFEntityType.cpp b/EmuAPI/reimp/BFEntityType.cpp new file mode 100644 index 0000000..df26f72 --- /dev/null +++ b/EmuAPI/reimp/BFEntityType.cpp @@ -0,0 +1,267 @@ +#include "BFEntityType.h" +#include // must always be above detours.h +#include + +int BFEntityType::ncolors() { + return *(int*)((DWORD)thisptr + 0x038); +} + +int BFEntityType::ncolors(int input) { + *(int*)((DWORD)this->thisptr + 0x038) = input; + return input; +} + +bool BFEntityType::cIconZoom() { + return *(bool*)((DWORD)this->thisptr + 0x050); +} + +bool BFEntityType::cIconZoom(bool input) { + *(bool*)((DWORD)this->thisptr + 0x050) = input; + return input; +} + +bool BFEntityType::cExpansionID() { + return *(bool*)((DWORD)this->thisptr + 0x054); +} + +bool BFEntityType::cExpansionID(bool input) { + *(bool*)((DWORD)this->thisptr + 0x054) = input; + return input; +} + +bool BFEntityType::cMovable() { + return *(bool*)((DWORD)this->thisptr + 0x055); +} + +bool BFEntityType::cMovable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x055) = input; + return input; +} + +bool BFEntityType::walkable() { + return *(bool*)((DWORD)this->thisptr + 0x056); +} + +bool BFEntityType::walkable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x056) = input; + return input; +} + +bool BFEntityType::walkableByTall() { + return *(bool*)((DWORD)this->thisptr + 0x057); +} + +bool BFEntityType::walkableByTall(bool input) { + *(bool*)((DWORD)this->thisptr + 0x057) = input; + return input; +} + +bool BFEntityType::cRubbleable() { + return *(bool*)((DWORD)this->thisptr + 0x059); +} + +bool BFEntityType::cRubbleable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x059) = input; + return input; +} + +bool BFEntityType::cUseNumbersInName() { + return *(bool*)((DWORD)this->thisptr + 0x05B); +} + +bool BFEntityType::cUseNumbersInName(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05B) = input; + return input; +} + +bool BFEntityType::cUsesRealShadows() { + return *(bool*)((DWORD)this->thisptr + 0x05C); +} + +bool BFEntityType::cUsesRealShadows(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05C) = input; + return input; +} + +bool BFEntityType::cHasShadowImages() { + return *(bool*)((DWORD)this->thisptr + 0x05D); +} + +bool BFEntityType::cHasShadowImages(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05D) = input; + return input; +} + +bool BFEntityType::cForceShadowBlack() { + return *(bool*)((DWORD)this->thisptr + 0x05E); +} + +bool BFEntityType::cForceShadowBlack(bool input) { + *(bool*)((DWORD)this->thisptr + 0x05E) = input; + return input; +} + +bool BFEntityType::cDrawsLate() { + return *(bool*)((DWORD)this->thisptr + 0x060); +} + +bool BFEntityType::cDrawsLate(bool input) { + *(bool*)((DWORD)this->thisptr + 0x060) = input; + return input; +} + +bool BFEntityType::cHeight() { + return *(bool*)((DWORD)this->thisptr + 0x064); +} + +bool BFEntityType::cHeight(bool input) { + *(bool*)((DWORD)this->thisptr + 0x064) = input; + return input; +} + +bool BFEntityType::cDepth() { + return *(bool*)((DWORD)this->thisptr + 0x068); +} + +bool BFEntityType::cDepth(bool input) { + *(bool*)((DWORD)this->thisptr + 0x068) = input; + return input; +} + +bool BFEntityType::cHasUnderwaterSection() { + return *(bool*)((DWORD)this->thisptr + 0x06C); +} + +bool BFEntityType::cHasUnderwaterSection(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06C) = input; + return input; +} + +bool BFEntityType::cIsTransient() { + return *(bool*)((DWORD)this->thisptr + 0x06D); +} + +bool BFEntityType::cIsTransient(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06D) = input; + return input; +} + +bool BFEntityType::cUsesPlacementCube() { + return *(bool*)((DWORD)this->thisptr + 0x06E); +} + +bool BFEntityType::cUsesPlacementCube(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06E) = input; + return input; +} + +bool BFEntityType::cShow() { + return *(bool*)((DWORD)this->thisptr + 0x06F); +} + +bool BFEntityType::cShow(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06F) = input; + return input; +} + +int BFEntityType::cHitThreshold() { + return *(int*)((DWORD)this->thisptr + 0x070); +} + +int BFEntityType::cHitThreshold(int input) { + *(int*)((DWORD)this->thisptr + 0x070) = input; + return input; +} + +bool BFEntityType::cAvoidEdges() { + return *(bool*)((DWORD)this->thisptr + 0x074); +} + +bool BFEntityType::cAvoidEdges(bool input) { + *(bool*)((DWORD)this->thisptr + 0x074) = input; + return input; +} + +std::string BFEntityType::typeName() { + return *(std::string*)((DWORD)this->thisptr + 0x098); +} + +std::string BFEntityType::typeName(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x098) = input; + return input; +} + +std::string BFEntityType::codename() { + return *(std::string*)((DWORD)this->thisptr + 0x0A4); +} + +std::string BFEntityType::codename(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x0A4) = input; + return input; +} + + +int BFEntityType::cFootprintX() { + return *(int*)((DWORD)this->thisptr + 0x0B4); +} + +int BFEntityType::cFootprintX(int input) { + *(int*)((DWORD)this->thisptr + 0x0B4) = input; + return input; +} + +int BFEntityType::cFootprintY() { + return *(int*)((DWORD)this->thisptr + 0x0B8); +} + +int BFEntityType::cFootprintY(int input) { + *(int*)((DWORD)this->thisptr + 0x0B8) = input; + return input; +} + + +int BFEntityType::cFootprintZ() { + return *(int*)((DWORD)this->thisptr + 0x0BC); +} + +int BFEntityType::cFootprintZ(int input) { + *(int*)((DWORD)this->thisptr + 0x0BC) = input; + return input; +} + +int BFEntityType::cPlacementFootprintX() { + return *(int*)((DWORD)this->thisptr + 0x0C0); +} + +int BFEntityType::cPlacementFootprintX(int input) { + *(int*)((DWORD)this->thisptr + 0x0C0) = input; + return input; +} + +int BFEntityType::cPlacementFootprintY() { + return *(int*)((DWORD)this->thisptr + 0x0C4); +} + +int BFEntityType::cPlacementFootprintY(int input) { + *(int*)((DWORD)this->thisptr + 0x0C4) = input; + return input; +} + +int BFEntityType::cPlacementFootprintZ() { + return *(int*)((DWORD)this->thisptr + 0x0C8); +} + + +int BFEntityType::cPlacementFootprintZ(int input) { + *(int*)((DWORD)this->thisptr + 0x0C8) = input; + return input; +} + +bool BFEntityType::availableAtStartup() { + return *(bool*)((DWORD)this->thisptr + 0x0CC); +} + +bool BFEntityType::availableAtStartup(bool input) { + *(bool*)((DWORD)this->thisptr + 0x0CC) = input; + return input; +} diff --git a/EmuAPI/reimp/ZTFenceType.h b/EmuAPI/reimp/ZTFenceType.h index 21b078f..441a0f5 100644 --- a/EmuAPI/reimp/ZTFenceType.h +++ b/EmuAPI/reimp/ZTFenceType.h @@ -5,8 +5,36 @@ class ZTFenceType : public ZTSceneryType { public: - char padding[32]; // 324 - ZTFenceType(); + // char padding[32]; // 324 + bool cIsShowFence(); // 0x06F + bool cIsShowFence(bool); // 0x06F + int cStrength(); // 0x168 + int cStrength(int); // 0x168 + int cLife(); // 0x16C + int cLife(int); // 0x16C + int cDecayedLife(); // 0x170 + int cDecayedLife(int); // 0x170 + int cDecayedDelta(); // 0x174 + int cDecayedDelta(int); // 0x174 + int cBreakSoundAtten(); // 0x178 + int cBreakSoundAtten(int); // 0x178 + std::string cBreakSound(); // 0x184 + std::string cBreakSound(std::string); // 0x184 + std::string cOpenSound(); // 0x188 + std::string cOpenSound(std::string); // 0x188 + bool cSeeThrough(); // 0x194 + bool cSeeThrough(bool); // 0x194 + bool cIsJumpable(); // 0x195 + bool cIsJumpable(bool); // 0x195 + bool cIsClimbable(); // 0x196 + bool cIsClimbable(bool); // 0x196 + bool cIndestructable(); // 0x197 + bool cIndestructable(bool); // 0x197 + bool cIsElectrified(); // 0x198 + bool cIsElectrified(bool); // 0x198 + bool cNoDrawWater(); // 0x199 + bool cNoDrawWater(bool); // 0x199 + ZTFenceType(void* ptr) : ZTSceneryType(ptr) {}; ~ZTFenceType(); }; diff --git a/EmuAPI/reimp/ZTSceneryType.cpp b/EmuAPI/reimp/ZTSceneryType.cpp index c3f795e..d4b73e2 100644 --- a/EmuAPI/reimp/ZTSceneryType.cpp +++ b/EmuAPI/reimp/ZTSceneryType.cpp @@ -1,241 +1,6 @@ #include "ZTSceneryType.h" #include // must always be above detours.h -int ZTSceneryType::ncolors() { - return *(int*)((DWORD)thisptr + 0x038); -} - -int ZTSceneryType::ncolors(int input) { - *(int*)((DWORD)this->thisptr + 0x038) = input; - return input; -} - -bool ZTSceneryType::cIconZoom() { - return *(bool*)((DWORD)this->thisptr + 0x050); -} - -bool ZTSceneryType::cIconZoom(bool input) { - *(bool*)((DWORD)this->thisptr + 0x050) = input; - return input; -} - -bool ZTSceneryType::cExpansionID() { - return *(bool*)((DWORD)this->thisptr + 0x054); -} - -bool ZTSceneryType::cExpansionID(bool input) { - *(bool*)((DWORD)this->thisptr + 0x054) = input; - return input; -} - -bool ZTSceneryType::cMovable() { - return *(bool*)((DWORD)this->thisptr + 0x055); -} - -bool ZTSceneryType::cMovable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x055) = input; - return input; -} - -bool ZTSceneryType::walkable() { - return *(bool*)((DWORD)this->thisptr + 0x056); -} - -bool ZTSceneryType::walkable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x056) = input; - return input; -} - -bool ZTSceneryType::walkableByTall() { - return *(bool*)((DWORD)this->thisptr + 0x057); -} - -bool ZTSceneryType::walkableByTall(bool input) { - *(bool*)((DWORD)this->thisptr + 0x057) = input; - return input; -} - -bool ZTSceneryType::cRubbleable() { - return *(bool*)((DWORD)this->thisptr + 0x059); -} - -bool ZTSceneryType::cRubbleable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x059) = input; - return input; -} - -bool ZTSceneryType::cUseNumbersInName() { - return *(bool*)((DWORD)this->thisptr + 0x05B); -} - -bool ZTSceneryType::cUseNumbersInName(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05B) = input; - return input; -} - -bool ZTSceneryType::cUsesRealShadows() { - return *(bool*)((DWORD)this->thisptr + 0x05C); -} - -bool ZTSceneryType::cUsesRealShadows(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05C) = input; - return input; -} - -bool ZTSceneryType::cHasShadowImages() { - return *(bool*)((DWORD)this->thisptr + 0x05D); -} - -bool ZTSceneryType::cHasShadowImages(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05D) = input; - return input; -} - -bool ZTSceneryType::cForceShadowBlack() { - return *(bool*)((DWORD)this->thisptr + 0x05E); -} - -bool ZTSceneryType::cForceShadowBlack(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05E) = input; - return input; -} - -bool ZTSceneryType::cDrawsLate() { - return *(bool*)((DWORD)this->thisptr + 0x060); -} - -bool ZTSceneryType::cDrawsLate(bool input) { - *(bool*)((DWORD)this->thisptr + 0x060) = input; - return input; -} - -bool ZTSceneryType::cHeight() { - return *(bool*)((DWORD)this->thisptr + 0x064); -} - -bool ZTSceneryType::cHeight(bool input) { - *(bool*)((DWORD)this->thisptr + 0x064) = input; - return input; -} - -bool ZTSceneryType::cDepth() { - return *(bool*)((DWORD)this->thisptr + 0x068); -} - -bool ZTSceneryType::cDepth(bool input) { - *(bool*)((DWORD)this->thisptr + 0x068) = input; - return input; -} - -bool ZTSceneryType::cHasUnderwaterSection() { - return *(bool*)((DWORD)this->thisptr + 0x06C); -} - -bool ZTSceneryType::cHasUnderwaterSection(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06C) = input; - return input; -} - -bool ZTSceneryType::cIsTransient() { - return *(bool*)((DWORD)this->thisptr + 0x06D); -} - -bool ZTSceneryType::cIsTransient(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06D) = input; - return input; -} - -bool ZTSceneryType::cUsesPlacementCube() { - return *(bool*)((DWORD)this->thisptr + 0x06E); -} - -bool ZTSceneryType::cUsesPlacementCube(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06E) = input; - return input; -} - -bool ZTSceneryType::cShow() { - return *(bool*)((DWORD)this->thisptr + 0x06F); -} - -bool ZTSceneryType::cShow(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06F) = input; - return input; -} - -int ZTSceneryType::cHitThreshold() { - return *(int*)((DWORD)this->thisptr + 0x070); -} - -int ZTSceneryType::cHitThreshold(int input) { - *(int*)((DWORD)this->thisptr + 0x070) = input; - return input; -} - -bool ZTSceneryType::cAvoidEdges() { - return *(bool*)((DWORD)this->thisptr + 0x074); -} - -bool ZTSceneryType::cAvoidEdges(bool input) { - *(bool*)((DWORD)this->thisptr + 0x074) = input; - return input; -} - -int ZTSceneryType::cFootprintX() { - return *(int*)((DWORD)this->thisptr + 0x0B4); -} - -int ZTSceneryType::cFootprintX(int input) { - *(int*)((DWORD)this->thisptr + 0x0B4) = input; - return input; -} - -int ZTSceneryType::cFootprintY() { - return *(int*)((DWORD)this->thisptr + 0x0B8); -} - -int ZTSceneryType::cFootprintY(int input) { - *(int*)((DWORD)this->thisptr + 0x0B8) = input; - return input; -} - - -int ZTSceneryType::cFootprintZ() { - return *(int*)((DWORD)this->thisptr + 0x0BC); -} - -int ZTSceneryType::cFootprintZ(int input) { - *(int*)((DWORD)this->thisptr + 0x0BC) = input; - return input; -} - -int ZTSceneryType::cPlacementFootprintX() { - return *(int*)((DWORD)this->thisptr + 0x0C0); -} - -int ZTSceneryType::cPlacementFootprintX(int input) { - *(int*)((DWORD)this->thisptr + 0x0C0) = input; - return input; -} - -int ZTSceneryType::cPlacementFootprintY() { - return *(int*)((DWORD)this->thisptr + 0x0C4); -} - -int ZTSceneryType::cPlacementFootprintY(int input) { - *(int*)((DWORD)this->thisptr + 0x0C4) = input; - return input; -} - -int ZTSceneryType::cPlacementFootprintZ() { - return *(int*)((DWORD)this->thisptr + 0x0C8); -} - - -int ZTSceneryType::cPlacementFootprintZ(int input) { - *(int*)((DWORD)this->thisptr + 0x0C8) = input; - return input; -} int ZTSceneryType::cPurchaseCost() { return *(int*)((DWORD)this->thisptr + 0x100); @@ -399,23 +164,6 @@ bool ZTSceneryType::cSurface(bool input) { return input; } -std::string ZTSceneryType::typeName() { - return *(std::string*)((DWORD)this->thisptr + 0x098); -} - -std::string ZTSceneryType::typeName(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x098) = input; - return input; -} - -std::string ZTSceneryType::codename() { - return *(std::string*)((DWORD)this->thisptr + 0x0A4); -} - -std::string ZTSceneryType::codename(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x0A4) = input; - return input; -} // bool ZTSceneryType::cSelectable() { // return *(bool*)((DWORD)this->thisptr + 0x128); From a64534dd9002e9220bfb0a0c24bb604476fa1e49 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 11 Mar 2024 13:00:34 -0700 Subject: [PATCH 31/61] ZTFenceType definitions --- EmuAPI/reimp/ZTFenceType.cpp | 138 +++++++++++++++++++++++++++++++++++ EmuAPI/reimp/ZTFenceType.h | 2 + 2 files changed, 140 insertions(+) create mode 100644 EmuAPI/reimp/ZTFenceType.cpp diff --git a/EmuAPI/reimp/ZTFenceType.cpp b/EmuAPI/reimp/ZTFenceType.cpp new file mode 100644 index 0000000..854258a --- /dev/null +++ b/EmuAPI/reimp/ZTFenceType.cpp @@ -0,0 +1,138 @@ +#include "ZTFenceType.h" +#include +#include // must always be above detours.h + +bool ZTFenceType::cIsShowFence() { + return *(bool*)((DWORD)this->thisptr + 0x06F); +} + +bool ZTFenceType::cIsShowFence(bool input) { + *(bool*)((DWORD)this->thisptr + 0x06F) = input; + return input; +} + +int ZTFenceType::cStrength() { + return *(int*)((DWORD)this->thisptr + 0x168); +} + +int ZTFenceType::cStrength(int input) { + *(int*)((DWORD)this->thisptr + 0x168) = input; + return input; +} + +int ZTFenceType::cLife() { + return *(int*)((DWORD)this->thisptr + 0x16C); +} + +int ZTFenceType::cLife(int input) { + *(int*)((DWORD)this->thisptr + 0x16C) = input; + return input; +} + +int ZTFenceType::cDecayedLife() { + return *(int*)((DWORD)this->thisptr + 0x170); +} + +int ZTFenceType::cDecayedLife(int input) { + *(int*)((DWORD)this->thisptr + 0x170) = input; + return input; +} + +int ZTFenceType::cDecayedDelta() { + return *(int*)((DWORD)this->thisptr + 0x174); +} + +int ZTFenceType::cDecayedDelta(int input) { + *(int*)((DWORD)this->thisptr + 0x174) = input; + return input; +} + +int ZTFenceType::cBreakSoundAtten() { + return *(int*)((DWORD)this->thisptr + 0x178); +} + +int ZTFenceType::cBreakSoundAtten(int input) { + *(int*)((DWORD)this->thisptr + 0x178) = input; + return input; +} + +int ZTFenceType::cOpenSoundAtten() { + return *(int*)((DWORD)this->thisptr + 0x17C); +} + +int ZTFenceType::cOpenSoundAtten(int input) { + *(int*)((DWORD)this->thisptr + 0x17C) = input; + return input; +} + +std::string ZTFenceType::cBreakSound() { + return *(std::string*)((DWORD)this->thisptr + 0x184); +} + +std::string ZTFenceType::cBreakSound(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x184) = input; + return input; +} + +std::string ZTFenceType::cOpenSound() { + return *(std::string*)((DWORD)this->thisptr + 0x188); +} + +std::string ZTFenceType::cOpenSound(std::string input) { + *(std::string*)((DWORD)this->thisptr + 0x188) = input; + return input; +} + +bool ZTFenceType::cSeeThrough() { + return *(bool*)((DWORD)this->thisptr + 0x194); +} + +bool ZTFenceType::cSeeThrough(bool input) { + *(bool*)((DWORD)this->thisptr + 0x194) = input; + return input; +} + +bool ZTFenceType::cIsJumpable() { + return *(bool*)((DWORD)this->thisptr + 0x195); +} + +bool ZTFenceType::cIsJumpable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x195) = input; + return input; +} + +bool ZTFenceType::cIsClimbable() { + return *(bool*)((DWORD)this->thisptr + 0x196); +} + +bool ZTFenceType::cIsClimbable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x196) = input; + return input; +} + +bool ZTFenceType::cIndestructable() { + return *(bool*)((DWORD)this->thisptr + 0x197); +} + +bool ZTFenceType::cIndestructable(bool input) { + *(bool*)((DWORD)this->thisptr + 0x197) = input; + return input; +} + +bool ZTFenceType::cIsElectrified() { + return *(bool*)((DWORD)this->thisptr + 0x198); +} + +bool ZTFenceType::cIsElectrified(bool input) { + *(bool*)((DWORD)this->thisptr + 0x198) = input; + return input; +} + +bool ZTFenceType::cNoDrawWater() { + return *(bool*)((DWORD)this->thisptr + 0x199); +} + +bool ZTFenceType::cNoDrawWater(bool input) { + *(bool*)((DWORD)this->thisptr + 0x199) = input; + return input; +} diff --git a/EmuAPI/reimp/ZTFenceType.h b/EmuAPI/reimp/ZTFenceType.h index 441a0f5..03e0a78 100644 --- a/EmuAPI/reimp/ZTFenceType.h +++ b/EmuAPI/reimp/ZTFenceType.h @@ -18,6 +18,8 @@ class ZTFenceType : public ZTSceneryType { int cDecayedDelta(int); // 0x174 int cBreakSoundAtten(); // 0x178 int cBreakSoundAtten(int); // 0x178 + int cOpenSoundAtten(); // 0x17C + int cOpenSoundAtten(int); // 0x17C std::string cBreakSound(); // 0x184 std::string cBreakSound(std::string); // 0x184 std::string cOpenSound(); // 0x188 From 908be3a08f795316cf3c6f1ad3bbc661b634aabc Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Mon, 11 Mar 2024 19:42:40 -0700 Subject: [PATCH 32/61] updated project deps --- EmuAPI/EmuAPI.vcproj | 18 +++++++++++++++++- EmuAPI/reimp/BFEntityType.h | 9 ++++++++- EmuAPI/reimp/ZTPathType.h | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj index e5643c0..f5c7c5a 100644 --- a/EmuAPI/EmuAPI.vcproj +++ b/EmuAPI/EmuAPI.vcproj @@ -115,7 +115,7 @@ Optimization="0" EnableIntrinsicFunctions="false" WholeProgramOptimization="false" - AdditionalIncludeDirectories=""$(ProjectDir)";"$(ProjectDir)\emu";"$(ProjectDir)\lua\include";"$(ProjectDir)\resources";"$(ProjectDir)\lua\";"$(ProjectDir)\detours\";"$(ProjectDir)\reimp\"" + AdditionalIncludeDirectories=""$(ProjectDir)";"$(ProjectDir)\emu";"$(ProjectDir)\lua\include";"$(ProjectDir)\resources";"$(ProjectDir)\lua\";"$(ProjectDir)\detours\";"$(ProjectDir)\reimp\";"$(ProjectDir)\simpleini\"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;EMUAPI_EXPORTS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" @@ -178,6 +178,10 @@ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > + + @@ -489,6 +493,18 @@ > + + + + + + diff --git a/EmuAPI/reimp/BFEntityType.h b/EmuAPI/reimp/BFEntityType.h index 83e1ba8..a0e3756 100644 --- a/EmuAPI/reimp/BFEntityType.h +++ b/EmuAPI/reimp/BFEntityType.h @@ -1,3 +1,8 @@ +#ifndef BFENTITYTYPE_H +#define BFENTITYTYPE_H + +#include +#include "INIReader.h" class BFEntityType { public: @@ -66,4 +71,6 @@ class BFEntityType { protected: void* thisptr; -}; \ No newline at end of file +}; + +#endif // BFENTITYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTPathType.h b/EmuAPI/reimp/ZTPathType.h index 6a0f397..aa482a4 100644 --- a/EmuAPI/reimp/ZTPathType.h +++ b/EmuAPI/reimp/ZTPathType.h @@ -8,8 +8,10 @@ class ZTPathType : public ZTSceneryType { public: - ZTPathType(); + ZTPathType(void* ptr) : ZTSceneryType(ptr) {}; ~ZTPathType(); + + }; #endif // ZTPATHTYPE_H \ No newline at end of file From fa171e01e74650285b105b9e5fc7f164646acd02 Mon Sep 17 00:00:00 2001 From: Eric Galvan Date: Tue, 12 Mar 2024 00:31:28 -0700 Subject: [PATCH 33/61] EmuScriptMgr initial rewrite --- .gitignore | 4 +- EmuAPI.sln | 20 - EmuAPI/.gitignore | 5 - EmuAPI/EmuAPI.vcproj | 511 ---- EmuAPI/EmuLoader.cpp | 67 - EmuAPI/detours.lib | Bin 689670 -> 0 bytes EmuAPI/detours/LICENSE.md | 23 - EmuAPI/detours/detours.cpp | 2604 ------------------ EmuAPI/detours/detours.h | 1233 --------- EmuAPI/emu/EmuBase.cpp | 142 - EmuAPI/emu/EmuBase.h | 120 - EmuAPI/emu/EmuConsole.cpp | 507 ---- EmuAPI/emu/EmuConsole.h | 32 - EmuAPI/emu/EmuControls.cpp | 86 - EmuAPI/emu/EmuControls.h | 18 - EmuAPI/emu/EmuMain.cpp | 110 - EmuAPI/emu/EmuMain.h | 46 - EmuAPI/emu/EmuScriptMgr.cpp | 186 -- EmuAPI/emu/EmuScriptMgr.h | 36 - EmuAPI/emu/emu_run_wrapper.emu | 21 - EmuAPI/emu/emu_test_script.lua | 3 - EmuAPI/lua/RegZooState.cpp | 469 ---- EmuAPI/lua/RegZooState.h | 48 - EmuAPI/lua/lualicense.txt | 7 - EmuAPI/lua53.lib | Bin 591434 -> 0 bytes EmuAPI/reimp/BFEntityType.cpp | 267 -- EmuAPI/reimp/BFEntityType.h | 76 - EmuAPI/reimp/BFGameApp.cpp | 31 - EmuAPI/reimp/BFGameApp.h | 15 - EmuAPI/reimp/BFMap.cpp | 38 - EmuAPI/reimp/BFMap.h | 16 - EmuAPI/reimp/BFOverlayType.h | 15 - EmuAPI/reimp/BFUIMgr.cpp | 51 - EmuAPI/reimp/BFUIMgr.h | 32 - EmuAPI/reimp/BFUnitType.h | 13 - EmuAPI/reimp/UIMessageQueue.h | 5 - EmuAPI/reimp/ZTAmbientType.h | 13 - EmuAPI/reimp/ZTAnimalType.h | 13 - EmuAPI/reimp/ZTApp.cpp | 50 - EmuAPI/reimp/ZTApp.h | 16 - EmuAPI/reimp/ZTBuildingType.cpp | 3 - EmuAPI/reimp/ZTBuildingType.h | 12 - EmuAPI/reimp/ZTCheats.cpp | 19 - EmuAPI/reimp/ZTCheats.h | 10 - EmuAPI/reimp/ZTFenceType.cpp | 138 - EmuAPI/reimp/ZTFenceType.h | 43 - EmuAPI/reimp/ZTFoodType.h | 14 - EmuAPI/reimp/ZTGameMgr.cpp | 180 -- EmuAPI/reimp/ZTGameMgr.h | 85 - EmuAPI/reimp/ZTGuest.cpp | 17 - EmuAPI/reimp/ZTGuest.h | 12 - EmuAPI/reimp/ZTGuestType.h | 13 - EmuAPI/reimp/ZTGuideType.h | 13 - EmuAPI/reimp/ZTHabitatMgr.cpp | 10 - EmuAPI/reimp/ZTHabitatMgr.h | 15 - EmuAPI/reimp/ZTHelicopterType.h | 13 - EmuAPI/reimp/ZTKeeperType.h | 13 - EmuAPI/reimp/ZTMainType.h | 13 - EmuAPI/reimp/ZTMapView.cpp | 76 - EmuAPI/reimp/ZTMapView.h | 29 - EmuAPI/reimp/ZTPathType.h | 17 - EmuAPI/reimp/ZTRubbleType.h | 13 - EmuAPI/reimp/ZTSceneryType.cpp | 337 --- EmuAPI/reimp/ZTSceneryType.h | 74 - EmuAPI/reimp/ZTStaffType.h | 13 - EmuAPI/reimp/ZTTankFilterType.h | 13 - EmuAPI/reimp/ZTTankWallType.h | 13 - EmuAPI/reimp/ZTUI.cpp | 126 - EmuAPI/reimp/ZTUI.h | 50 - EmuAPI/reimp/ZTUnitType.h | 13 - EmuAPI/reimp/ZTWorldMgr.cpp | 50 - EmuAPI/reimp/ZTWorldMgr.h | 20 - EmuAPI/reimp/bfinternat.cpp | 7 - EmuAPI/reimp/bfinternat.h | 11 - EmuAPI/resources/ZooMiniMap.cpp | 95 - EmuAPI/resources/ZooMiniMap.h | 27 - EmuAPI/resources/ZooModels.cpp | 0 EmuAPI/resources/ZooModels.h | 14 - EmuAPI/resources/ZooState.cpp | 267 -- EmuAPI/resources/ZooState.h | 86 - EmuScriptMgr.cpp | 33 + EmuScriptMgr.h | 21 + LICENSE.md | 19 - README.md | 120 - {EmuAPI/lua/include => deps/lua54}/lauxlib.h | 66 +- {EmuAPI/lua/include => deps/lua54}/lua.h | 76 +- {EmuAPI/lua/include => deps/lua54}/lua.hpp | 0 deps/lua54/lua54.lib | Bin 0 -> 748746 bytes deps/lua54/luaconf.h | 763 +++++ {EmuAPI/lua/include => deps/lua54}/lualib.h | 8 +- deps/sol/as_args.hpp | 54 + deps/sol/as_returns.hpp | 62 + deps/sol/assert.hpp | 99 + deps/sol/base_traits.hpp | 123 + deps/sol/bind_traits.hpp | 553 ++++ deps/sol/bytecode.hpp | 121 + deps/sol/call.hpp | 961 +++++++ deps/sol/compatibility.hpp | 51 + deps/sol/compatibility/compat-5.3.c.h | 900 ++++++ deps/sol/compatibility/compat-5.3.h | 424 +++ deps/sol/compatibility/compat-5.4.h | 25 + deps/sol/compatibility/lua_version.hpp | 218 ++ deps/sol/config.hpp | 50 + deps/sol/coroutine.hpp | 251 ++ deps/sol/debug.hpp | 52 + deps/sol/demangle.hpp | 192 ++ deps/sol/deprecate.hpp | 44 + deps/sol/detail/build_version.hpp | 232 ++ deps/sol/dump_handler.hpp | 77 + deps/sol/ebco.hpp | 161 ++ deps/sol/environment.hpp | 264 ++ deps/sol/epilogue.hpp | 39 + deps/sol/error.hpp | 89 + deps/sol/error_handler.hpp | 175 ++ deps/sol/forward.hpp | 266 ++ deps/sol/forward_detail.hpp | 56 + deps/sol/function.hpp | 142 + deps/sol/function_result.hpp | 78 + deps/sol/function_types.hpp | 769 ++++++ deps/sol/function_types_core.hpp | 46 + deps/sol/function_types_overloaded.hpp | 65 + deps/sol/function_types_stateful.hpp | 158 ++ deps/sol/function_types_stateless.hpp | 385 +++ deps/sol/function_types_templated.hpp | 154 ++ deps/sol/in_place.hpp | 48 + deps/sol/inheritance.hpp | 195 ++ deps/sol/load_result.hpp | 152 + deps/sol/lua_table.hpp | 95 + deps/sol/lua_value.hpp | 162 ++ {EmuAPI/lua/include => deps/sol}/luaconf.h | 0 deps/sol/make_reference.hpp | 74 + deps/sol/metatable.hpp | 203 ++ deps/sol/object.hpp | 150 + deps/sol/object_base.hpp | 86 + deps/sol/optional.hpp | 83 + deps/sol/optional_implementation.hpp | 2303 ++++++++++++++++ deps/sol/overload.hpp | 49 + deps/sol/packaged_coroutine.hpp | 262 ++ deps/sol/pairs_iterator.hpp | 275 ++ deps/sol/pointer_like.hpp | 103 + deps/sol/policies.hpp | 98 + deps/sol/prologue.hpp | 47 + deps/sol/property.hpp | 151 + deps/sol/protect.hpp | 53 + deps/sol/protected_function.hpp | 385 +++ deps/sol/protected_function_result.hpp | 242 ++ deps/sol/protected_handler.hpp | 108 + deps/sol/proxy_base.hpp | 68 + deps/sol/raii.hpp | 162 ++ deps/sol/reference.hpp | 900 ++++++ deps/sol/resolve.hpp | 173 ++ deps/sol/sol.hpp | 81 + deps/sol/stack.hpp | 362 +++ deps/sol/stack/detail/pairs.hpp | 98 + deps/sol/stack_check.hpp | 30 + deps/sol/stack_check_get.hpp | 30 + deps/sol/stack_check_get_qualified.hpp | 148 + deps/sol/stack_check_get_unqualified.hpp | 186 ++ deps/sol/stack_check_qualified.hpp | 89 + deps/sol/stack_check_unqualified.hpp | 639 +++++ deps/sol/stack_core.hpp | 1446 ++++++++++ deps/sol/stack_field.hpp | 279 ++ deps/sol/stack_get.hpp | 30 + deps/sol/stack_get_qualified.hpp | 37 + deps/sol/stack_get_unqualified.hpp | 1046 +++++++ deps/sol/stack_guard.hpp | 67 + deps/sol/stack_iterator.hpp | 153 + deps/sol/stack_pop.hpp | 51 + deps/sol/stack_probe.hpp | 94 + deps/sol/stack_proxy.hpp | 64 + deps/sol/stack_proxy_base.hpp | 96 + deps/sol/stack_push.hpp | 1387 ++++++++++ deps/sol/stack_reference.hpp | 314 +++ deps/sol/state.hpp | 62 + deps/sol/state_handling.hpp | 194 ++ deps/sol/state_view.hpp | 874 ++++++ deps/sol/string_view.hpp | 45 + deps/sol/table.hpp | 116 + deps/sol/table_core.hpp | 733 +++++ deps/sol/table_iterator.hpp | 114 + deps/sol/table_proxy.hpp | 344 +++ deps/sol/thread.hpp | 189 ++ deps/sol/tie.hpp | 98 + deps/sol/traits.hpp | 739 +++++ deps/sol/trampoline.hpp | 214 ++ deps/sol/tuple.hpp | 93 + deps/sol/types.hpp | 1497 ++++++++++ deps/sol/unicode.hpp | 308 +++ deps/sol/unique_usertype_traits.hpp | 240 ++ deps/sol/unsafe_function.hpp | 170 ++ deps/sol/unsafe_function_result.hpp | 182 ++ deps/sol/userdata.hpp | 134 + deps/sol/usertype.hpp | 131 + deps/sol/usertype_container.hpp | 1563 +++++++++++ deps/sol/usertype_container_launch.hpp | 432 +++ deps/sol/usertype_core.hpp | 214 ++ deps/sol/usertype_proxy.hpp | 187 ++ deps/sol/usertype_storage.hpp | 1165 ++++++++ deps/sol/usertype_traits.hpp | 61 + deps/sol/variadic_args.hpp | 181 ++ deps/sol/variadic_results.hpp | 103 + deps/sol/version.hpp | 842 ++++++ deps/sol/wrapper.hpp | 280 ++ emu-api.vcxproj | 260 ++ main.cpp | 34 + 205 files changed, 33410 insertions(+), 9108 deletions(-) delete mode 100644 EmuAPI.sln delete mode 100644 EmuAPI/.gitignore delete mode 100644 EmuAPI/EmuAPI.vcproj delete mode 100644 EmuAPI/EmuLoader.cpp delete mode 100644 EmuAPI/detours.lib delete mode 100644 EmuAPI/detours/LICENSE.md delete mode 100644 EmuAPI/detours/detours.cpp delete mode 100644 EmuAPI/detours/detours.h delete mode 100644 EmuAPI/emu/EmuBase.cpp delete mode 100644 EmuAPI/emu/EmuBase.h delete mode 100644 EmuAPI/emu/EmuConsole.cpp delete mode 100644 EmuAPI/emu/EmuConsole.h delete mode 100644 EmuAPI/emu/EmuControls.cpp delete mode 100644 EmuAPI/emu/EmuControls.h delete mode 100644 EmuAPI/emu/EmuMain.cpp delete mode 100644 EmuAPI/emu/EmuMain.h delete mode 100644 EmuAPI/emu/EmuScriptMgr.cpp delete mode 100644 EmuAPI/emu/EmuScriptMgr.h delete mode 100644 EmuAPI/emu/emu_run_wrapper.emu delete mode 100644 EmuAPI/emu/emu_test_script.lua delete mode 100644 EmuAPI/lua/RegZooState.cpp delete mode 100644 EmuAPI/lua/RegZooState.h delete mode 100644 EmuAPI/lua/lualicense.txt delete mode 100644 EmuAPI/lua53.lib delete mode 100644 EmuAPI/reimp/BFEntityType.cpp delete mode 100644 EmuAPI/reimp/BFEntityType.h delete mode 100644 EmuAPI/reimp/BFGameApp.cpp delete mode 100644 EmuAPI/reimp/BFGameApp.h delete mode 100644 EmuAPI/reimp/BFMap.cpp delete mode 100644 EmuAPI/reimp/BFMap.h delete mode 100644 EmuAPI/reimp/BFOverlayType.h delete mode 100644 EmuAPI/reimp/BFUIMgr.cpp delete mode 100644 EmuAPI/reimp/BFUIMgr.h delete mode 100644 EmuAPI/reimp/BFUnitType.h delete mode 100644 EmuAPI/reimp/UIMessageQueue.h delete mode 100644 EmuAPI/reimp/ZTAmbientType.h delete mode 100644 EmuAPI/reimp/ZTAnimalType.h delete mode 100644 EmuAPI/reimp/ZTApp.cpp delete mode 100644 EmuAPI/reimp/ZTApp.h delete mode 100644 EmuAPI/reimp/ZTBuildingType.cpp delete mode 100644 EmuAPI/reimp/ZTBuildingType.h delete mode 100644 EmuAPI/reimp/ZTCheats.cpp delete mode 100644 EmuAPI/reimp/ZTCheats.h delete mode 100644 EmuAPI/reimp/ZTFenceType.cpp delete mode 100644 EmuAPI/reimp/ZTFenceType.h delete mode 100644 EmuAPI/reimp/ZTFoodType.h delete mode 100644 EmuAPI/reimp/ZTGameMgr.cpp delete mode 100644 EmuAPI/reimp/ZTGameMgr.h delete mode 100644 EmuAPI/reimp/ZTGuest.cpp delete mode 100644 EmuAPI/reimp/ZTGuest.h delete mode 100644 EmuAPI/reimp/ZTGuestType.h delete mode 100644 EmuAPI/reimp/ZTGuideType.h delete mode 100644 EmuAPI/reimp/ZTHabitatMgr.cpp delete mode 100644 EmuAPI/reimp/ZTHabitatMgr.h delete mode 100644 EmuAPI/reimp/ZTHelicopterType.h delete mode 100644 EmuAPI/reimp/ZTKeeperType.h delete mode 100644 EmuAPI/reimp/ZTMainType.h delete mode 100644 EmuAPI/reimp/ZTMapView.cpp delete mode 100644 EmuAPI/reimp/ZTMapView.h delete mode 100644 EmuAPI/reimp/ZTPathType.h delete mode 100644 EmuAPI/reimp/ZTRubbleType.h delete mode 100644 EmuAPI/reimp/ZTSceneryType.cpp delete mode 100644 EmuAPI/reimp/ZTSceneryType.h delete mode 100644 EmuAPI/reimp/ZTStaffType.h delete mode 100644 EmuAPI/reimp/ZTTankFilterType.h delete mode 100644 EmuAPI/reimp/ZTTankWallType.h delete mode 100644 EmuAPI/reimp/ZTUI.cpp delete mode 100644 EmuAPI/reimp/ZTUI.h delete mode 100644 EmuAPI/reimp/ZTUnitType.h delete mode 100644 EmuAPI/reimp/ZTWorldMgr.cpp delete mode 100644 EmuAPI/reimp/ZTWorldMgr.h delete mode 100644 EmuAPI/reimp/bfinternat.cpp delete mode 100644 EmuAPI/reimp/bfinternat.h delete mode 100644 EmuAPI/resources/ZooMiniMap.cpp delete mode 100644 EmuAPI/resources/ZooMiniMap.h delete mode 100644 EmuAPI/resources/ZooModels.cpp delete mode 100644 EmuAPI/resources/ZooModels.h delete mode 100644 EmuAPI/resources/ZooState.cpp delete mode 100644 EmuAPI/resources/ZooState.h create mode 100644 EmuScriptMgr.cpp create mode 100644 EmuScriptMgr.h delete mode 100644 LICENSE.md delete mode 100644 README.md rename {EmuAPI/lua/include => deps/lua54}/lauxlib.h (87%) rename {EmuAPI/lua/include => deps/lua54}/lua.h (87%) rename {EmuAPI/lua/include => deps/lua54}/lua.hpp (100%) create mode 100644 deps/lua54/lua54.lib create mode 100644 deps/lua54/luaconf.h rename {EmuAPI/lua/include => deps/lua54}/lualib.h (87%) create mode 100644 deps/sol/as_args.hpp create mode 100644 deps/sol/as_returns.hpp create mode 100644 deps/sol/assert.hpp create mode 100644 deps/sol/base_traits.hpp create mode 100644 deps/sol/bind_traits.hpp create mode 100644 deps/sol/bytecode.hpp create mode 100644 deps/sol/call.hpp create mode 100644 deps/sol/compatibility.hpp create mode 100644 deps/sol/compatibility/compat-5.3.c.h create mode 100644 deps/sol/compatibility/compat-5.3.h create mode 100644 deps/sol/compatibility/compat-5.4.h create mode 100644 deps/sol/compatibility/lua_version.hpp create mode 100644 deps/sol/config.hpp create mode 100644 deps/sol/coroutine.hpp create mode 100644 deps/sol/debug.hpp create mode 100644 deps/sol/demangle.hpp create mode 100644 deps/sol/deprecate.hpp create mode 100644 deps/sol/detail/build_version.hpp create mode 100644 deps/sol/dump_handler.hpp create mode 100644 deps/sol/ebco.hpp create mode 100644 deps/sol/environment.hpp create mode 100644 deps/sol/epilogue.hpp create mode 100644 deps/sol/error.hpp create mode 100644 deps/sol/error_handler.hpp create mode 100644 deps/sol/forward.hpp create mode 100644 deps/sol/forward_detail.hpp create mode 100644 deps/sol/function.hpp create mode 100644 deps/sol/function_result.hpp create mode 100644 deps/sol/function_types.hpp create mode 100644 deps/sol/function_types_core.hpp create mode 100644 deps/sol/function_types_overloaded.hpp create mode 100644 deps/sol/function_types_stateful.hpp create mode 100644 deps/sol/function_types_stateless.hpp create mode 100644 deps/sol/function_types_templated.hpp create mode 100644 deps/sol/in_place.hpp create mode 100644 deps/sol/inheritance.hpp create mode 100644 deps/sol/load_result.hpp create mode 100644 deps/sol/lua_table.hpp create mode 100644 deps/sol/lua_value.hpp rename {EmuAPI/lua/include => deps/sol}/luaconf.h (100%) create mode 100644 deps/sol/make_reference.hpp create mode 100644 deps/sol/metatable.hpp create mode 100644 deps/sol/object.hpp create mode 100644 deps/sol/object_base.hpp create mode 100644 deps/sol/optional.hpp create mode 100644 deps/sol/optional_implementation.hpp create mode 100644 deps/sol/overload.hpp create mode 100644 deps/sol/packaged_coroutine.hpp create mode 100644 deps/sol/pairs_iterator.hpp create mode 100644 deps/sol/pointer_like.hpp create mode 100644 deps/sol/policies.hpp create mode 100644 deps/sol/prologue.hpp create mode 100644 deps/sol/property.hpp create mode 100644 deps/sol/protect.hpp create mode 100644 deps/sol/protected_function.hpp create mode 100644 deps/sol/protected_function_result.hpp create mode 100644 deps/sol/protected_handler.hpp create mode 100644 deps/sol/proxy_base.hpp create mode 100644 deps/sol/raii.hpp create mode 100644 deps/sol/reference.hpp create mode 100644 deps/sol/resolve.hpp create mode 100644 deps/sol/sol.hpp create mode 100644 deps/sol/stack.hpp create mode 100644 deps/sol/stack/detail/pairs.hpp create mode 100644 deps/sol/stack_check.hpp create mode 100644 deps/sol/stack_check_get.hpp create mode 100644 deps/sol/stack_check_get_qualified.hpp create mode 100644 deps/sol/stack_check_get_unqualified.hpp create mode 100644 deps/sol/stack_check_qualified.hpp create mode 100644 deps/sol/stack_check_unqualified.hpp create mode 100644 deps/sol/stack_core.hpp create mode 100644 deps/sol/stack_field.hpp create mode 100644 deps/sol/stack_get.hpp create mode 100644 deps/sol/stack_get_qualified.hpp create mode 100644 deps/sol/stack_get_unqualified.hpp create mode 100644 deps/sol/stack_guard.hpp create mode 100644 deps/sol/stack_iterator.hpp create mode 100644 deps/sol/stack_pop.hpp create mode 100644 deps/sol/stack_probe.hpp create mode 100644 deps/sol/stack_proxy.hpp create mode 100644 deps/sol/stack_proxy_base.hpp create mode 100644 deps/sol/stack_push.hpp create mode 100644 deps/sol/stack_reference.hpp create mode 100644 deps/sol/state.hpp create mode 100644 deps/sol/state_handling.hpp create mode 100644 deps/sol/state_view.hpp create mode 100644 deps/sol/string_view.hpp create mode 100644 deps/sol/table.hpp create mode 100644 deps/sol/table_core.hpp create mode 100644 deps/sol/table_iterator.hpp create mode 100644 deps/sol/table_proxy.hpp create mode 100644 deps/sol/thread.hpp create mode 100644 deps/sol/tie.hpp create mode 100644 deps/sol/traits.hpp create mode 100644 deps/sol/trampoline.hpp create mode 100644 deps/sol/tuple.hpp create mode 100644 deps/sol/types.hpp create mode 100644 deps/sol/unicode.hpp create mode 100644 deps/sol/unique_usertype_traits.hpp create mode 100644 deps/sol/unsafe_function.hpp create mode 100644 deps/sol/unsafe_function_result.hpp create mode 100644 deps/sol/userdata.hpp create mode 100644 deps/sol/usertype.hpp create mode 100644 deps/sol/usertype_container.hpp create mode 100644 deps/sol/usertype_container_launch.hpp create mode 100644 deps/sol/usertype_core.hpp create mode 100644 deps/sol/usertype_proxy.hpp create mode 100644 deps/sol/usertype_storage.hpp create mode 100644 deps/sol/usertype_traits.hpp create mode 100644 deps/sol/variadic_args.hpp create mode 100644 deps/sol/variadic_results.hpp create mode 100644 deps/sol/version.hpp create mode 100644 deps/sol/wrapper.hpp create mode 100644 emu-api.vcxproj create mode 100644 main.cpp diff --git a/.gitignore b/.gitignore index 717caa8..928feb4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ .vs/ GooseTek/ .vscode/ -Release/ \ No newline at end of file +Release/ +*.vcxproj.user +*.vcxproj.filters \ No newline at end of file diff --git a/EmuAPI.sln b/EmuAPI.sln deleted file mode 100644 index a498159..0000000 --- a/EmuAPI.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmuAPI", "EmuAPI\EmuAPI.vcproj", "{EB6AF1E7-1BF2-4ECE-8EA8-8B20EBD29652}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EB6AF1E7-1BF2-4ECE-8EA8-8B20EBD29652}.Debug|Win32.ActiveCfg = Release|Win32 - {EB6AF1E7-1BF2-4ECE-8EA8-8B20EBD29652}.Debug|Win32.Build.0 = Release|Win32 - {EB6AF1E7-1BF2-4ECE-8EA8-8B20EBD29652}.Release|Win32.ActiveCfg = Release|Win32 - {EB6AF1E7-1BF2-4ECE-8EA8-8B20EBD29652}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/EmuAPI/.gitignore b/EmuAPI/.gitignore deleted file mode 100644 index 072a7c2..0000000 --- a/EmuAPI/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -Release/ -.vscode/ -Debug/ -*.vcproj.ERIC.leric.user -*.user diff --git a/EmuAPI/EmuAPI.vcproj b/EmuAPI/EmuAPI.vcproj deleted file mode 100644 index f5c7c5a..0000000 --- a/EmuAPI/EmuAPI.vcproj +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/EmuAPI/EmuLoader.cpp b/EmuAPI/EmuLoader.cpp deleted file mode 100644 index 4f47020..0000000 --- a/EmuAPI/EmuLoader.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Author: Eric "Goosifer" Galvan -// Github: https://github.com/GoosiferIO/EMU -// Description: EMU (Extensible Modding Utility) is a Zoo Tycoon Complete Collection API - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "RegZooState.h" -#include "ZooModels.h" -#include "ZTGameMgr.h" -#include "BFUIMgr.h" -#include "ZTUI.h" -#include "BFMap.h" -#include "ZTWorldMgr.h" -#include "EmuMain.h" - -//------ Global variables -int consoleW = 400; // console window width -int consoleH = 200; // console window height - -//------ ZooModels object -extern ZooModels* zoo_models; - -// ------ DllMain - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - // Get the thread ID of the current thread - // DWORD mainThreadId = GetCurrentThreadId(); - // f << std::endl << std::endl << "[" << timestamp << "] " << "\nMain thread ID: " << mainThreadId << "\nCurrent thread ID: " << std::setfill('0') << std::setw(8) << std::hex << B::base << std::endl; - - // dll attachment status - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - //------ Find/load script file directories with script manager - EmuMain::shared_instance().sm.findScripts(); - EmuMain::shared_instance().sm.storeScripts(); - EmuMain::init(); - // ZTGameMgr::init(); - ZTUI::main::init(); - // ZTMapView::init(); - // BFMap::init(); - - break; - case DLL_PROCESS_DETACH: - // f << "[" << timestamp << "] " << "DLL detached!\n"; - break; - case DLL_THREAD_ATTACH: - //f << "[" << timestamp << "] " << "Thread attached!\n"; - break; - - case DLL_THREAD_DETACH: - //f << "[" << timestamp << "] " << "Thread detached!\n"; - break; - default: - //f << "[" << timestamp << "] " << "DLL was not attached to thread or process!\n"; - return FALSE; - } - - return TRUE; -} \ No newline at end of file diff --git a/EmuAPI/detours.lib b/EmuAPI/detours.lib deleted file mode 100644 index d06a324ad6ac1c97f4244548e420e1b8f168a095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689670 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%0AU?G6qV-_Kq}4#K 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 QOe_magic != IMAGE_DOS_SIGNATURE) { - return false; - } - - PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + - pDosHeader->e_lfanew); - if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { - return false; - } - - if (pbAddress >= ((PBYTE)pDosHeader + - pNtHeader->OptionalHeader - .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress) && - pbAddress < ((PBYTE)pDosHeader + - pNtHeader->OptionalHeader - .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress + - pNtHeader->OptionalHeader - .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size)) { - return true; - } - } -#pragma prefast(suppress:28940, "A bad pointer means this probably isn't a PE header.") - __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? - EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { - return false; - } - return false; -} - -inline ULONG_PTR detour_2gb_below(ULONG_PTR address) -{ - return (address > (ULONG_PTR)0x7ff80000) ? address - 0x7ff80000 : 0x80000; -} - -inline ULONG_PTR detour_2gb_above(ULONG_PTR address) -{ -#if defined(DETOURS_64BIT) - return (address < (ULONG_PTR)0xffffffff80000000) ? address + 0x7ff80000 : (ULONG_PTR)0xfffffffffff80000; -#else - return (address < (ULONG_PTR)0x80000000) ? address + 0x7ff80000 : (ULONG_PTR)0xfff80000; -#endif -} - -///////////////////////////////////////////////////////////////////////// X86. -// -#ifdef DETOURS_X86 - -struct _DETOUR_TRAMPOLINE -{ - BYTE rbCode[30]; // target code + jmp to pbRemain - BYTE cbCode; // size of moved target code. - BYTE cbCodeBreak; // padding to make debugging easier. - BYTE rbRestore[22]; // original target code. - BYTE cbRestore; // size of original target code. - BYTE cbRestoreBreak; // padding to make debugging easier. - _DETOUR_ALIGN rAlign[8]; // instruction alignment array. - PBYTE pbRemain; // first instruction after moved code. [free list] - PBYTE pbDetour; // first instruction of detour function. -}; - -C_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 72); - -enum { - SIZE_OF_JMP = 5 -}; - -inline PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE pbJmpVal) -{ - PBYTE pbJmpSrc = pbCode + 5; - *pbCode++ = 0xE9; // jmp +imm32 - *((INT32*&)pbCode)++ = (INT32)(pbJmpVal - pbJmpSrc); - return pbCode; -} - -inline PBYTE detour_gen_jmp_indirect(PBYTE pbCode, PBYTE *ppbJmpVal) -{ - *pbCode++ = 0xff; // jmp [+imm32] - *pbCode++ = 0x25; - *((INT32*&)pbCode)++ = (INT32)((PBYTE)ppbJmpVal); - return pbCode; -} - -inline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit) -{ - while (pbCode < pbLimit) { - *pbCode++ = 0xcc; // brk; - } - return pbCode; -} - -inline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals) -{ - if (pbCode == NULL) { - return NULL; - } - if (ppGlobals != NULL) { - *ppGlobals = NULL; - } - - // First, skip over the import vector if there is one. - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [imm32] - // Looks like an import alias jump, then get the code it points to. - PBYTE pbTarget = *(UNALIGNED PBYTE *)&pbCode[2]; - if (detour_is_imported(pbCode, pbTarget)) { - PBYTE pbNew = *(UNALIGNED PBYTE *)pbTarget; - DETOUR_TRACE(("%p->%p: skipped over import table.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - - // Then, skip over a patch jump - if (pbCode[0] == 0xeb) { // jmp +imm8 - PBYTE pbNew = pbCode + 2 + *(CHAR *)&pbCode[1]; - DETOUR_TRACE(("%p->%p: skipped over short jump.\n", pbCode, pbNew)); - pbCode = pbNew; - - // First, skip over the import vector if there is one. - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [imm32] - // Looks like an import alias jump, then get the code it points to. - PBYTE pbTarget = *(UNALIGNED PBYTE *)&pbCode[2]; - if (detour_is_imported(pbCode, pbTarget)) { - pbNew = *(UNALIGNED PBYTE *)pbTarget; - DETOUR_TRACE(("%p->%p: skipped over import table.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - // Finally, skip over a long jump if it is the target of the patch jump. - else if (pbCode[0] == 0xe9) { // jmp +imm32 - pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1]; - DETOUR_TRACE(("%p->%p: skipped over long jump.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - return pbCode; -} - -inline void detour_find_jmp_bounds(PBYTE pbCode, - PDETOUR_TRAMPOLINE *ppLower, - PDETOUR_TRAMPOLINE *ppUpper) -{ - // We have to place trampolines within +/- 2GB of code. - ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode); - ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode); - DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi)); - - // And, within +/- 2GB of relative jmp targets. - if (pbCode[0] == 0xe9) { // jmp +imm32 - PBYTE pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1]; - - if (pbNew < pbCode) { - hi = detour_2gb_above((ULONG_PTR)pbNew); - } - else { - lo = detour_2gb_below((ULONG_PTR)pbNew); - } - DETOUR_TRACE(("[%p..%p..%p] +imm32\n", (PVOID)lo, pbCode, (PVOID)hi)); - } - - *ppLower = (PDETOUR_TRAMPOLINE)lo; - *ppUpper = (PDETOUR_TRAMPOLINE)hi; -} - -inline BOOL detour_does_code_end_function(PBYTE pbCode) -{ - if (pbCode[0] == 0xeb || // jmp +imm8 - pbCode[0] == 0xe9 || // jmp +imm32 - pbCode[0] == 0xe0 || // jmp eax - pbCode[0] == 0xc2 || // ret +imm8 - pbCode[0] == 0xc3 || // ret - pbCode[0] == 0xcc) { // brk - return TRUE; - } - else if (pbCode[0] == 0xf3 && pbCode[1] == 0xc3) { // rep ret - return TRUE; - } - else if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32] - return TRUE; - } - else if ((pbCode[0] == 0x26 || // jmp es: - pbCode[0] == 0x2e || // jmp cs: - pbCode[0] == 0x36 || // jmp ss: - pbCode[0] == 0x3e || // jmp ds: - pbCode[0] == 0x64 || // jmp fs: - pbCode[0] == 0x65) && // jmp gs: - pbCode[1] == 0xff && // jmp [+imm32] - pbCode[2] == 0x25) { - return TRUE; - } - return FALSE; -} - -inline ULONG detour_is_code_filler(PBYTE pbCode) -{ - // 1-byte through 11-byte NOPs. - if (pbCode[0] == 0x90) { - return 1; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x90) { - return 2; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x00) { - return 3; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x40 && - pbCode[3] == 0x00) { - return 4; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x44 && - pbCode[3] == 0x00 && pbCode[4] == 0x00) { - return 5; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && - pbCode[3] == 0x44 && pbCode[4] == 0x00 && pbCode[5] == 0x00) { - return 6; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x80 && - pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00) { - return 7; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x84 && - pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00) { - return 8; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && - pbCode[3] == 0x84 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00) { - return 9; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x0F && - pbCode[3] == 0x1F && pbCode[4] == 0x84 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && - pbCode[9] == 0x00) { - return 10; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x66 && - pbCode[3] == 0x0F && pbCode[4] == 0x1F && pbCode[5] == 0x84 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && - pbCode[9] == 0x00 && pbCode[10] == 0x00) { - return 11; - } - - // int 3. - if (pbCode[0] == 0xcc) { - return 1; - } - return 0; -} - -#endif // DETOURS_X86 - -///////////////////////////////////////////////////////////////////////// X64. -// -#ifdef DETOURS_X64 - -struct _DETOUR_TRAMPOLINE -{ - // An X64 instuction can be 15 bytes long. - // In practice 11 seems to be the limit. - BYTE rbCode[30]; // target code + jmp to pbRemain. - BYTE cbCode; // size of moved target code. - BYTE cbCodeBreak; // padding to make debugging easier. - BYTE rbRestore[30]; // original target code. - BYTE cbRestore; // size of original target code. - BYTE cbRestoreBreak; // padding to make debugging easier. - _DETOUR_ALIGN rAlign[8]; // instruction alignment array. - PBYTE pbRemain; // first instruction after moved code. [free list] - PBYTE pbDetour; // first instruction of detour function. - BYTE rbCodeIn[8]; // jmp [pbDetour] -}; - -C_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 96); - -enum { - SIZE_OF_JMP = 5 -}; - -inline PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE pbJmpVal) -{ - PBYTE pbJmpSrc = pbCode + 5; - *pbCode++ = 0xE9; // jmp +imm32 - *((INT32*&)pbCode)++ = (INT32)(pbJmpVal - pbJmpSrc); - return pbCode; -} - -inline PBYTE detour_gen_jmp_indirect(PBYTE pbCode, PBYTE *ppbJmpVal) -{ - PBYTE pbJmpSrc = pbCode + 6; - *pbCode++ = 0xff; // jmp [+imm32] - *pbCode++ = 0x25; - *((INT32*&)pbCode)++ = (INT32)((PBYTE)ppbJmpVal - pbJmpSrc); - return pbCode; -} - -inline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit) -{ - while (pbCode < pbLimit) { - *pbCode++ = 0xcc; // brk; - } - return pbCode; -} - -inline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals) -{ - if (pbCode == NULL) { - return NULL; - } - if (ppGlobals != NULL) { - *ppGlobals = NULL; - } - - // First, skip over the import vector if there is one. - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32] - // Looks like an import alias jump, then get the code it points to. - PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2]; - if (detour_is_imported(pbCode, pbTarget)) { - PBYTE pbNew = *(UNALIGNED PBYTE *)pbTarget; - DETOUR_TRACE(("%p->%p: skipped over import table.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - - // Then, skip over a patch jump - if (pbCode[0] == 0xeb) { // jmp +imm8 - PBYTE pbNew = pbCode + 2 + *(CHAR *)&pbCode[1]; - DETOUR_TRACE(("%p->%p: skipped over short jump.\n", pbCode, pbNew)); - pbCode = pbNew; - - // First, skip over the import vector if there is one. - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32] - // Looks like an import alias jump, then get the code it points to. - PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2]; - if (detour_is_imported(pbCode, pbTarget)) { - pbNew = *(UNALIGNED PBYTE *)pbTarget; - DETOUR_TRACE(("%p->%p: skipped over import table.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - // Finally, skip over a long jump if it is the target of the patch jump. - else if (pbCode[0] == 0xe9) { // jmp +imm32 - pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1]; - DETOUR_TRACE(("%p->%p: skipped over long jump.\n", pbCode, pbNew)); - pbCode = pbNew; - } - } - return pbCode; -} - -inline void detour_find_jmp_bounds(PBYTE pbCode, - PDETOUR_TRAMPOLINE *ppLower, - PDETOUR_TRAMPOLINE *ppUpper) -{ - // We have to place trampolines within +/- 2GB of code. - ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode); - ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode); - DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi)); - - // And, within +/- 2GB of relative jmp vectors. - if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32] - PBYTE pbNew = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2]; - - if (pbNew < pbCode) { - hi = detour_2gb_above((ULONG_PTR)pbNew); - } - else { - lo = detour_2gb_below((ULONG_PTR)pbNew); - } - DETOUR_TRACE(("[%p..%p..%p] [+imm32]\n", (PVOID)lo, pbCode, (PVOID)hi)); - } - // And, within +/- 2GB of relative jmp targets. - else if (pbCode[0] == 0xe9) { // jmp +imm32 - PBYTE pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1]; - - if (pbNew < pbCode) { - hi = detour_2gb_above((ULONG_PTR)pbNew); - } - else { - lo = detour_2gb_below((ULONG_PTR)pbNew); - } - DETOUR_TRACE(("[%p..%p..%p] +imm32\n", (PVOID)lo, pbCode, (PVOID)hi)); - } - - *ppLower = (PDETOUR_TRAMPOLINE)lo; - *ppUpper = (PDETOUR_TRAMPOLINE)hi; -} - -inline BOOL detour_does_code_end_function(PBYTE pbCode) -{ - if (pbCode[0] == 0xeb || // jmp +imm8 - pbCode[0] == 0xe9 || // jmp +imm32 - pbCode[0] == 0xe0 || // jmp eax - pbCode[0] == 0xc2 || // ret +imm8 - pbCode[0] == 0xc3 || // ret - pbCode[0] == 0xcc) { // brk - return TRUE; - } - else if (pbCode[0] == 0xf3 && pbCode[1] == 0xc3) { // rep ret - return TRUE; - } - else if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32] - return TRUE; - } - else if ((pbCode[0] == 0x26 || // jmp es: - pbCode[0] == 0x2e || // jmp cs: - pbCode[0] == 0x36 || // jmp ss: - pbCode[0] == 0x3e || // jmp ds: - pbCode[0] == 0x64 || // jmp fs: - pbCode[0] == 0x65) && // jmp gs: - pbCode[1] == 0xff && // jmp [+imm32] - pbCode[2] == 0x25) { - return TRUE; - } - return FALSE; -} - -inline ULONG detour_is_code_filler(PBYTE pbCode) -{ - // 1-byte through 11-byte NOPs. - if (pbCode[0] == 0x90) { - return 1; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x90) { - return 2; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x00) { - return 3; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x40 && - pbCode[3] == 0x00) { - return 4; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x44 && - pbCode[3] == 0x00 && pbCode[4] == 0x00) { - return 5; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && - pbCode[3] == 0x44 && pbCode[4] == 0x00 && pbCode[5] == 0x00) { - return 6; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x80 && - pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00) { - return 7; - } - if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x84 && - pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00) { - return 8; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F && - pbCode[3] == 0x84 && pbCode[4] == 0x00 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00) { - return 9; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x0F && - pbCode[3] == 0x1F && pbCode[4] == 0x84 && pbCode[5] == 0x00 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && - pbCode[9] == 0x00) { - return 10; - } - if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x66 && - pbCode[3] == 0x0F && pbCode[4] == 0x1F && pbCode[5] == 0x84 && - pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 && - pbCode[9] == 0x00 && pbCode[10] == 0x00) { - return 11; - } - - // int 3. - if (pbCode[0] == 0xcc) { - return 1; - } - return 0; -} - -#endif // DETOURS_X64 - -//////////////////////////////////////////////////////////////////////// IA64. -// -#ifdef DETOURS_IA64 - -struct _DETOUR_TRAMPOLINE -{ - // On the IA64, a trampoline is used for both incoming and outgoing calls. - // - // The trampoline contains the following bundles for the outgoing call: - // movl gp=target_gp; - // - // brl target_code; - // - // The trampoline contains the following bundles for the incoming call: - // alloc r41=ar.pfs, b, 0, 8, 0 - // mov r40=rp - // - // adds r50=0, r39 - // adds r49=0, r38 - // adds r48=0, r37 ;; - // - // adds r47=0, r36 - // adds r46=0, r35 - // adds r45=0, r34 - // - // adds r44=0, r33 - // adds r43=0, r32 - // adds r42=0, gp ;; - // - // movl gp=ffffffff`ffffffff ;; - // - // brl.call.sptk.few rp=disas!TestCodes+20e0 (00000000`00404ea0) ;; - // - // adds gp=0, r42 - // mov rp=r40, +0 ;; - // mov.i ar.pfs=r41 - // - // br.ret.sptk.many rp ;; - // - // This way, we only have to relocate a single bundle. - // - // The complicated incoming trampoline is required because we have to - // create an additional stack frame so that we save and restore the gp. - // We must do this because gp is a caller-saved register, but not saved - // if the caller thinks the target is in the same DLL, which changes - // when we insert a detour. - // - DETOUR_IA64_BUNDLE bMovlTargetGp; // Bundle which sets target GP - BYTE rbCode[sizeof(DETOUR_IA64_BUNDLE)]; // moved bundle. - DETOUR_IA64_BUNDLE bBrlRemainEip; // Brl to pbRemain - // This must be adjacent to bBranchIslands. - - // Each instruction in the moved bundle could be a IP-relative chk or branch or call. - // Any such instructions are changed to point to a brl in bBranchIslands. - // This must be adjacent to bBrlRemainEip -- see "pbPool". - DETOUR_IA64_BUNDLE bBranchIslands[DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE]; - - // Target of brl inserted in target function - DETOUR_IA64_BUNDLE bAllocFrame; // alloc frame - DETOUR_IA64_BUNDLE bSave37to39; // save r37, r38, r39. - DETOUR_IA64_BUNDLE bSave34to36; // save r34, r35, r36. - DETOUR_IA64_BUNDLE bSaveGPto33; // save gp, r32, r33. - DETOUR_IA64_BUNDLE bMovlDetourGp; // set detour GP. - DETOUR_IA64_BUNDLE bCallDetour; // call detour. - DETOUR_IA64_BUNDLE bPopFrameGp; // pop frame and restore gp. - DETOUR_IA64_BUNDLE bReturn; // return to caller. - - PLABEL_DESCRIPTOR pldTrampoline; - - BYTE rbRestore[sizeof(DETOUR_IA64_BUNDLE)]; // original target bundle. - BYTE cbRestore; // size of original target code. - BYTE cbCode; // size of moved target code. - _DETOUR_ALIGN rAlign[14]; // instruction alignment array. - PBYTE pbRemain; // first instruction after moved code. [free list] - PBYTE pbDetour; // first instruction of detour function. - PPLABEL_DESCRIPTOR ppldDetour; // [pbDetour,gpDetour] - PPLABEL_DESCRIPTOR ppldTarget; // [pbTarget,gpDetour] -}; - -C_ASSERT(sizeof(DETOUR_IA64_BUNDLE) == 16); -C_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 256 + DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE * 16); - -enum { - SIZE_OF_JMP = sizeof(DETOUR_IA64_BUNDLE) -}; - -inline PBYTE detour_skip_jmp(PBYTE pPointer, PVOID *ppGlobals) -{ - PBYTE pGlobals = NULL; - PBYTE pbCode = NULL; - - if (pPointer != NULL) { - PPLABEL_DESCRIPTOR ppld = (PPLABEL_DESCRIPTOR)pPointer; - pbCode = (PBYTE)ppld->EntryPoint; - pGlobals = (PBYTE)ppld->GlobalPointer; - } - if (ppGlobals != NULL) { - *ppGlobals = pGlobals; - } - if (pbCode == NULL) { - return NULL; - } - - DETOUR_IA64_BUNDLE *pb = (DETOUR_IA64_BUNDLE *)pbCode; - - // IA64 Local Import Jumps look like: - // addl r2=ffffffff`ffe021c0, gp ;; - // ld8 r2=[r2] - // nop.i 0 ;; - // - // ld8 r3=[r2], 8 ;; - // ld8 gp=[r2] - // mov b6=r3, +0 - // - // nop.m 0 - // nop.i 0 - // br.cond.sptk.few b6 - // - - // 002024000200100b - if ((pb[0].wide[0] & 0xfffffc000603ffff) == 0x002024000200100b && - pb[0].wide[1] == 0x0004000000203008 && - pb[1].wide[0] == 0x001014180420180a && - pb[1].wide[1] == 0x07000830c0203008 && - pb[2].wide[0] == 0x0000000100000010 && - pb[2].wide[1] == 0x0080006000000200) { - - ULONG64 offset = - ((pb[0].wide[0] & 0x0000000001fc0000) >> 18) | // imm7b - ((pb[0].wide[0] & 0x000001ff00000000) >> 25) | // imm9d - ((pb[0].wide[0] & 0x00000000f8000000) >> 11); // imm5c - if (pb[0].wide[0] & 0x0000020000000000) { // sign - offset |= 0xffffffffffe00000; - } - PBYTE pbTarget = pGlobals + offset; - DETOUR_TRACE(("%p: potential import jump, target=%p\n", pb, pbTarget)); - - if (detour_is_imported(pbCode, pbTarget) && *(PBYTE*)pbTarget != NULL) { - DETOUR_TRACE(("%p: is import jump, label=%p\n", pb, *(PBYTE *)pbTarget)); - - PPLABEL_DESCRIPTOR ppld = (PPLABEL_DESCRIPTOR)*(PBYTE *)pbTarget; - pbCode = (PBYTE)ppld->EntryPoint; - pGlobals = (PBYTE)ppld->GlobalPointer; - if (ppGlobals != NULL) { - *ppGlobals = pGlobals; - } - } - } - return pbCode; -} - - -inline void detour_find_jmp_bounds(PBYTE pbCode, - PDETOUR_TRAMPOLINE *ppLower, - PDETOUR_TRAMPOLINE *ppUpper) -{ - (void)pbCode; - *ppLower = (PDETOUR_TRAMPOLINE)(ULONG_PTR)0x0000000000080000; - *ppUpper = (PDETOUR_TRAMPOLINE)(ULONG_PTR)0xfffffffffff80000; -} - -inline BOOL detour_does_code_end_function(PBYTE pbCode) -{ - // Routine not needed on IA64. - (void)pbCode; - return FALSE; -} - -inline ULONG detour_is_code_filler(PBYTE pbCode) -{ - // Routine not needed on IA64. - (void)pbCode; - return 0; -} - -#endif // DETOURS_IA64 - -#ifdef DETOURS_ARM - -struct _DETOUR_TRAMPOLINE -{ - // A Thumb-2 instruction can be 2 or 4 bytes long. - BYTE rbCode[62]; // target code + jmp to pbRemain - BYTE cbCode; // size of moved target code. - BYTE cbCodeBreak; // padding to make debugging easier. - BYTE rbRestore[22]; // original target code. - BYTE cbRestore; // size of original target code. - BYTE cbRestoreBreak; // padding to make debugging easier. - _DETOUR_ALIGN rAlign[8]; // instruction alignment array. - PBYTE pbRemain; // first instruction after moved code. [free list] - PBYTE pbDetour; // first instruction of detour function. -}; - -C_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 104); - -enum { - SIZE_OF_JMP = 8 -}; - -inline PBYTE align4(PBYTE pValue) -{ - return (PBYTE)(((ULONG)pValue) & ~(ULONG)3u); -} - -inline ULONG fetch_thumb_opcode(PBYTE pbCode) -{ - ULONG Opcode = *(UINT16 *)&pbCode[0]; - if (Opcode >= 0xe800) { - Opcode = (Opcode << 16) | *(UINT16 *)&pbCode[2]; - } - return Opcode; -} - -inline void write_thumb_opcode(PBYTE &pbCode, ULONG Opcode) -{ - if (Opcode >= 0x10000) { - *((UINT16*&)pbCode)++ = Opcode >> 16; - } - *((UINT16*&)pbCode)++ = (UINT16)Opcode; -} - -PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE *ppPool, PBYTE pbJmpVal) -{ - PBYTE pbLiteral; - if (ppPool != NULL) { - *ppPool = *ppPool - 4; - pbLiteral = *ppPool; - } - else { - pbLiteral = align4(pbCode + 6); - } - - *((PBYTE*&)pbLiteral) = DETOURS_PBYTE_TO_PFUNC(pbJmpVal); - LONG delta = pbLiteral - align4(pbCode + 4); - - write_thumb_opcode(pbCode, 0xf8dff000 | delta); // LDR PC,[PC+n] - - if (ppPool == NULL) { - if (((ULONG)pbCode & 2) != 0) { - write_thumb_opcode(pbCode, 0xdefe); // BREAK - } - pbCode += 4; - } - return pbCode; -} - -inline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit) -{ - while (pbCode < pbLimit) { - write_thumb_opcode(pbCode, 0xdefe); - } - return pbCode; -} - -inline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals) -{ - if (pbCode == NULL) { - return NULL; - } - if (ppGlobals != NULL) { - *ppGlobals = NULL; - } - - // Skip over the import jump if there is one. - pbCode = (PBYTE)DETOURS_PFUNC_TO_PBYTE(pbCode); - ULONG Opcode = fetch_thumb_opcode(pbCode); - - if ((Opcode & 0xfbf08f00) == 0xf2400c00) { // movw r12,#xxxx - ULONG Opcode2 = fetch_thumb_opcode(pbCode+4); - - if ((Opcode2 & 0xfbf08f00) == 0xf2c00c00) { // movt r12,#xxxx - ULONG Opcode3 = fetch_thumb_opcode(pbCode+8); - if (Opcode3 == 0xf8dcf000) { // ldr pc,[r12] - PBYTE pbTarget = (PBYTE)(((Opcode2 << 12) & 0xf7000000) | - ((Opcode2 << 1) & 0x08000000) | - ((Opcode2 << 16) & 0x00ff0000) | - ((Opcode >> 4) & 0x0000f700) | - ((Opcode >> 15) & 0x00000800) | - ((Opcode >> 0) & 0x000000ff)); - if (detour_is_imported(pbCode, pbTarget)) { - PBYTE pbNew = *(PBYTE *)pbTarget; - pbNew = DETOURS_PFUNC_TO_PBYTE(pbNew); - DETOUR_TRACE(("%p->%p: skipped over import table.\n", pbCode, pbNew)); - return pbNew; - } - } - } - } - return pbCode; -} - -inline void detour_find_jmp_bounds(PBYTE pbCode, - PDETOUR_TRAMPOLINE *ppLower, - PDETOUR_TRAMPOLINE *ppUpper) -{ - // We have to place trampolines within +/- 2GB of code. - ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode); - ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode); - DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi)); - - *ppLower = (PDETOUR_TRAMPOLINE)lo; - *ppUpper = (PDETOUR_TRAMPOLINE)hi; -} - - -inline BOOL detour_does_code_end_function(PBYTE pbCode) -{ - ULONG Opcode = fetch_thumb_opcode(pbCode); - if ((Opcode & 0xffffff87) == 0x4700 || // bx - (Opcode & 0xf800d000) == 0xf0009000) { // b - return TRUE; - } - if ((Opcode & 0xffff8000) == 0xe8bd8000) { // pop {...,pc} - __debugbreak(); - return TRUE; - } - if ((Opcode & 0xffffff00) == 0x0000bd00) { // pop {...,pc} - __debugbreak(); - return TRUE; - } - return FALSE; -} - -inline ULONG detour_is_code_filler(PBYTE pbCode) -{ - if (pbCode[0] == 0x00 && pbCode[1] == 0xbf) { // nop. - return 2; - } - if (pbCode[0] == 0x00 && pbCode[1] == 0x00) { // zero-filled padding. - return 2; - } - return 0; -} - -#endif // DETOURS_ARM - -#ifdef DETOURS_ARM64 - -struct _DETOUR_TRAMPOLINE -{ - // An ARM64 instruction is 4 bytes long. - // - // The overwrite is always composed of 3 instructions (12 bytes) which perform an indirect jump - // using _DETOUR_TRAMPOLINE::pbDetour as the address holding the target location. - // - // Copied instructions can expand. - // - // The scheme using MovImmediate can cause an instruction - // to grow as much as 6 times. - // That would be Bcc or Tbz with a large address space: - // 4 instructions to form immediate - // inverted tbz/bcc - // br - // - // An expansion of 4 is not uncommon -- bl/blr and small address space: - // 3 instructions to form immediate - // br or brl - // - // A theoretical maximum for rbCode is thefore 4*4*6 + 16 = 112 (another 16 for jmp to pbRemain). - // - // With literals, the maximum expansion is 5, including the literals: 4*4*5 + 16 = 96. - // - // The number is rounded up to 128. m_rbScratchDst should match this. - // - BYTE rbCode[128]; // target code + jmp to pbRemain - BYTE cbCode; // size of moved target code. - BYTE cbCodeBreak[3]; // padding to make debugging easier. - BYTE rbRestore[24]; // original target code. - BYTE cbRestore; // size of original target code. - BYTE cbRestoreBreak[3]; // padding to make debugging easier. - _DETOUR_ALIGN rAlign[8]; // instruction alignment array. - PBYTE pbRemain; // first instruction after moved code. [free list] - PBYTE pbDetour; // first instruction of detour function. -}; - -C_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 184); - -enum { - SIZE_OF_JMP = 12 -}; - -inline ULONG fetch_opcode(PBYTE pbCode) -{ - return *(ULONG *)pbCode; -} - -inline void write_opcode(PBYTE &pbCode, ULONG Opcode) -{ - *(ULONG *)pbCode = Opcode; - pbCode += 4; -} - -struct ARM64_INDIRECT_JMP { - struct { - ULONG Rd : 5; - ULONG immhi : 19; - ULONG iop : 5; - ULONG immlo : 2; - ULONG op : 1; - } ardp; - - struct { - ULONG Rt : 5; - ULONG Rn : 5; - ULONG imm : 12; - ULONG opc : 2; - ULONG iop1 : 2; - ULONG V : 1; - ULONG iop2 : 3; - ULONG size : 2; - } ldr; - - ULONG br; -}; - -#pragma warning(push) -#pragma warning(disable:4201) - -union ARM64_INDIRECT_IMM { - struct { - ULONG64 pad : 12; - ULONG64 adrp_immlo : 2; - ULONG64 adrp_immhi : 19; - }; - - LONG64 value; -}; - -#pragma warning(pop) - -PBYTE detour_gen_jmp_indirect(BYTE *pbCode, ULONG64 *pbJmpVal) -{ - // adrp x17, [jmpval] - // ldr x17, [x17, jmpval] - // br x17 - - struct ARM64_INDIRECT_JMP *pIndJmp; - union ARM64_INDIRECT_IMM jmpIndAddr; - - jmpIndAddr.value = (((LONG64)pbJmpVal) & 0xFFFFFFFFFFFFF000) - - (((LONG64)pbCode) & 0xFFFFFFFFFFFFF000); - - pIndJmp = (struct ARM64_INDIRECT_JMP *)pbCode; - pbCode = (BYTE *)(pIndJmp + 1); - - pIndJmp->ardp.Rd = 17; - pIndJmp->ardp.immhi = jmpIndAddr.adrp_immhi; - pIndJmp->ardp.iop = 0x10; - pIndJmp->ardp.immlo = jmpIndAddr.adrp_immlo; - pIndJmp->ardp.op = 1; - - pIndJmp->ldr.Rt = 17; - pIndJmp->ldr.Rn = 17; - pIndJmp->ldr.imm = (((ULONG64)pbJmpVal) & 0xFFF) / 8; - pIndJmp->ldr.opc = 1; - pIndJmp->ldr.iop1 = 1; - pIndJmp->ldr.V = 0; - pIndJmp->ldr.iop2 = 7; - pIndJmp->ldr.size = 3; - - pIndJmp->br = 0xD61F0220; - - return pbCode; -} - -PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE *ppPool, PBYTE pbJmpVal) -{ - PBYTE pbLiteral; - if (ppPool != NULL) { - *ppPool = *ppPool - 8; - pbLiteral = *ppPool; - } - else { - pbLiteral = pbCode + 8; - } - - *((PBYTE*&)pbLiteral) = pbJmpVal; - LONG delta = (LONG)(pbLiteral - pbCode); - - write_opcode(pbCode, 0x58000011 | ((delta / 4) << 5)); // LDR X17,[PC+n] - write_opcode(pbCode, 0xd61f0000 | (17 << 5)); // BR X17 - - if (ppPool == NULL) { - pbCode += 8; - } - return pbCode; -} - -inline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit) -{ - while (pbCode < pbLimit) { - write_opcode(pbCode, 0xd4100000 | (0xf000 << 5)); - } - return pbCode; -} - -inline INT64 detour_sign_extend(UINT64 value, UINT bits) -{ - const UINT left = 64 - bits; - const INT64 m1 = -1; - const INT64 wide = (INT64)(value << left); - const INT64 sign = (wide < 0) ? (m1 << left) : 0; - return value | sign; -} - -inline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals) -{ - if (pbCode == NULL) { - return NULL; - } - if (ppGlobals != NULL) { - *ppGlobals = NULL; - } - - // Skip over the import jump if there is one. - pbCode = (PBYTE)pbCode; - ULONG Opcode = fetch_opcode(pbCode); - - if ((Opcode & 0x9f00001f) == 0x90000010) { // adrp x16, IAT - ULONG Opcode2 = fetch_opcode(pbCode + 4); - - if ((Opcode2 & 0xffe003ff) == 0xf9400210) { // ldr x16, [x16, IAT] - ULONG Opcode3 = fetch_opcode(pbCode + 8); - - if (Opcode3 == 0xd61f0200) { // br x16 - -/* https://static.docs.arm.com/ddi0487/bb/DDI0487B_b_armv8_arm.pdf - The ADRP instruction shifts a signed, 21-bit immediate left by 12 bits, adds it to the value of the program counter with - the bottom 12 bits cleared to zero, and then writes the result to a general-purpose register. This permits the - calculation of the address at a 4KB aligned memory region. In conjunction with an ADD (immediate) instruction, or - a Load/Store instruction with a 12-bit immediate offset, this allows for the calculation of, or access to, any address - within +/- 4GB of the current PC. - -PC-rel. addressing - This section describes the encoding of the PC-rel. addressing instruction class. The encodings in this section are - decoded from Data Processing -- Immediate on page C4-226. - Add/subtract (immediate) - This section describes the encoding of the Add/subtract (immediate) instruction class. The encodings in this section - are decoded from Data Processing -- Immediate on page C4-226. - Decode fields - Instruction page - op - 0 ADR - 1 ADRP - -C6.2.10 ADRP - Form PC-relative address to 4KB page adds an immediate value that is shifted left by 12 bits, to the PC value to - form a PC-relative address, with the bottom 12 bits masked out, and writes the result to the destination register. - ADRP ,

-/// Constructor: initiate process variables -/// -EmuBase::EmuBase() -{ - id = GetCurrentProcessId(); - handle = __getZooHandle(id); - base = (DWORD)GetModuleHandle(NULL); - thread = __getZooThread(id); -} - -/// -/// Returns -/// -/// : input 32 bit float -DWORD EmuBase::getModuleBaseAddress() -{ - return base; -} - -/// -/// Convert 32 bit float to 32 unsigned 32 bit value -/// -/// : input 32 bit float -uint32_t EmuBase::floatToUint(float f) -{ - uint32_t result; - memcpy(&result, &f, sizeof(f)); - return result; -} - -/// -/// Convert unsigned 32 bit integer to 32 bit float -/// -/// : input unsigned 32 bit integer -float EmuBase::uintToFloat(uint32_t n) -{ - float result; - memcpy(&result, &n, sizeof(n)); - return result; -} - -/// -/// Obtain process handle for zoo.exe -/// -/// : input zoo.exe process ID -HANDLE EmuBase::__getZooHandle(DWORD zooID) -{ - HANDLE zooHandle; - return zooHandle = OpenProcess(PROCESS_ALL_ACCESS, true, zooID); -} - -/// -/// Obtain thread ID for zoo.exe -/// -/// : input zoo.exe process ID -DWORD EmuBase::__getZooThread(DWORD zooID) -{ - THREADENTRY32 entry; - entry.dwSize = sizeof(THREADENTRY32); - HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); - if (Thread32First(snapshot, &entry) == TRUE) { - while (Thread32Next(snapshot, &entry) == TRUE) { - if (entry.th32OwnerProcessID == EmuBase::id) { - CloseHandle(snapshot); - return entry.th32ThreadID; - } - } - } - CloseHandle(snapshot); - return NULL; -} - -// utility function for near hooking -DWORD EmuBase::callHook(DWORD hookAt, DWORD newFunc) -{ - DWORD newOffset = newFunc - hookAt - 5; - DWORD oldProtection = EmuBase::Memory::protectMemory((LPVOID)(hookAt + 1), PAGE_EXECUTE_READWRITE); - DWORD originalOffset = EmuBase::Memory::readMemory((LPVOID)(hookAt + 1)); - EmuBase::Memory::writeMemory((LPVOID)(hookAt + 1), newOffset); - EmuBase::Memory::protectMemory((LPVOID)(hookAt + 1), oldProtection); - return originalOffset + hookAt + 5; -} - -/// @brief Set key to custom action. Single key. -/// @param VK_IKEY -/// @return -bool EmuBase::SingleKey(const int VK_IKEY) -{ - if (GetAsyncKeyState(VK_IKEY) & 0x8000) - { - return true; - } - return false; -} - -/// @brief Set keys to custom action--two key binding. -/// @param VK_IKEY -/// @param VK_SKEY -/// @return -bool EmuBase::DoubleKey(const int VK_IKEY, const int VK_SKEY) -{ - if (GetAsyncKeyState(VK_IKEY) & 0x8000 && GetAsyncKeyState(VK_SKEY) & 0x8000) - { - return true; - } - return false; -} - -/// @brief Set keys to custom action--three key binding. -/// @param VK_IKEY -/// @param VK_SKEY -/// @param VK_TKEY -/// @return -bool EmuBase::TripleKey(const int VK_IKEY, const int VK_SKEY, const int VK_TKEY) -{ - if (GetAsyncKeyState(VK_IKEY) & 0x8000 && GetAsyncKeyState(VK_SKEY) & 0x8000) - { - return true; - } - return false; -} - -/// @brief Print out to log file -/// @param log -/// @param file -/// @return -void EmuBase::logToFile(std::string log, std::ios::openmode mode) -{ - std::ofstream f; - f.open("getelement.log", mode); - const char* cstr = log.c_str(); - f << "[" << __TIMESTAMP__ << "] " << cstr << std::endl; - f.close(); -} \ No newline at end of file diff --git a/EmuAPI/emu/EmuBase.h b/EmuAPI/emu/EmuBase.h deleted file mode 100644 index 5fd85ee..0000000 --- a/EmuAPI/emu/EmuBase.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef EMUBASE_H -#define EMUBASE_H - -// #ifndef EMU_EXPORTS -// #define EMU_API __declspec(dllexport) -// #else -// #define EMU_API __declspec(dllimport) -// #endif - -#include "Windows.h" -#include -#include -#include -#include -#include -#include - -// extern "C" { -// EMU_API bool SingleKey(const int key) { -// return EmuBase::SingleKey(key); -// } - -// EMU_API bool DoubleKey(const int key1, const int key2) { -// return EmuBase::DoubleKey(key1, key2); -// } - -// EMU_API bool TripleKey(const int key1, const int key2, const int key3) { -// return EmuBase::TripleKey(key1, key2, key3); -// } -// } - -typedef __int32 uint32_t; - -class EmuBase -{ -public: - template - struct Memory - { - public: - Memory() {}; - static T readMemory(LPVOID); - static void writeMemory(LPVOID, T); - static DWORD protectMemory(LPVOID, DWORD); - static T* pointMemory(LPVOID adr); - }; - - static DWORD getModuleBaseAddress(); - static DWORD callHook(DWORD hookAt, DWORD newFunc); - static void logToFile(std::string log, std::ios::openmode); - - static uint32_t floatToUint(float); - static float uintToFloat(uint32_t); - EmuBase(); - static DWORD id; - static HANDLE handle; - static DWORD base; - static DWORD thread; - - // Windows Mgmt - - static bool SingleKey(const int); - static bool DoubleKey(const int, const int); - static bool TripleKey(const int, const int, const int); - -protected: - static DWORD __getModuleBaseAddress(DWORD, const TCHAR*); - static HANDLE __getZooHandle(DWORD); - static DWORD __getZooThread(DWORD); -}; - -// read from memory -template -T EmuBase::Memory::readMemory(LPVOID adr) -{ - return *((T*)adr); -} - -// write to memory -template -void EmuBase::Memory::writeMemory(LPVOID adr, T val) -{ - *((T*)adr) = val; -} - -// Save memory protection for given process handle -template -DWORD EmuBase::Memory::protectMemory(LPVOID adr, DWORD prot) -{ - DWORD oldProt; - //HANDLE handleZ = GetModuleHandle(L"zoo.exe"); - VirtualProtect(adr, sizeof(T), prot, &oldProt); - return oldProt; -} - -template -T* EmuBase::Memory::pointMemory(LPVOID adr) -{ - return ((T*)adr); -} - -// shelf: near call hook - -// // declare addToBudget (goes to top) -// DWORD __fastcall addToBudget(DWORD, float); - -// // reroute old function to new function -// typedef DWORD(__fastcall _origFunc)(DWORD arg1, float transaction); -// _origFunc* __addToBudget = (_origFunc*)callHook(0x0050A245, (DWORD)&addToBudget); - -// // deposit = admission fee paid by guest -// DWORD __fastcall addToBudget(DWORD tclass, float transaction) -// { -// //transaction = 10000; // final release won't see this line. also the idea will be to call this function -// // from a VF table to use other class members -// return __addToBudget(tclass, transaction); // return to location in zoo.exe -// } - -#endif - diff --git a/EmuAPI/emu/EmuConsole.cpp b/EmuAPI/emu/EmuConsole.cpp deleted file mode 100644 index 41d44da..0000000 --- a/EmuAPI/emu/EmuConsole.cpp +++ /dev/null @@ -1,507 +0,0 @@ -#include "EmuConsole.h" -#include -#include "ZTGameMgr.h" -#include "BFGameApp.h" -#include "EmuControls.h" -#include "ZTMapView.h" -#include "ZTGuest.h" -#include "ZTBuildingType.h" -#include "ZTUI.h" - -EmuConsole::EmuConsole(std::vector& tokes) : tokens(tokes) -{ -} - -EmuConsole::~EmuConsole(void) -{ -} - -// ---- Enables ANSI escape sequences for console -void EmuConsole::EnableVirtualTerminalProcessing() { - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (hOut == INVALID_HANDLE_VALUE) { - return; - } - - DWORD dwMode = 0; - if (!GetConsoleMode(hOut, &dwMode)) { - return; - } - - dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(hOut, dwMode); -} - -HWND EmuConsole::createConsole() -{ - HWND consoleWindow; // contains console window handle - - FILE* file_s; - - // ------ Create a console window - AllocConsole(); - if (freopen_s(&file_s, "CONOUT$", "w", stdout) != 0) - { - perror("freeopen_s"); - } - if (freopen_s(&file_s, "CONIN$", "r", stdin) != 0) - { - perror("freeopen_s"); - } - - // ------ Set the console window title and position - consoleWindow = GetConsoleWindow(); - - EnableVirtualTerminalProcessing(); - - - SetConsoleTitle(TEXT("EMU Console")); // console title - // SetConsoleMode(consoleWindow, ENABLE_PROCESSED_INPUT | ENABLE_WINDOW_INPUT); // enable window input - - if (consoleWindow != NULL) - { - RECT mainWindowRect; - HWND mainGameWindow = FindWindow(NULL, TEXT("Zoo Tycoon")); // find the main game window - GetWindowRect(mainGameWindow, &mainWindowRect); - - // ------ Get screen dimensions - int screenWidth = GetSystemMetrics(SM_CXSCREEN); - int screenHeight = GetSystemMetrics(SM_CYSCREEN); - int windowWidth = 400; - int windowHeight = 200; - - // ------ Remove close, minimize and maximize buttons - LONG lStyle = GetWindowLong(consoleWindow, GWL_STYLE); - lStyle &= ~(WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU); - SetWindowLong(consoleWindow, GWL_STYLE, lStyle); - - // ------ Remove from taskbar - LONG lExStyle = GetWindowLong(consoleWindow, GWL_EXSTYLE); - lExStyle = (lExStyle | WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW; - SetWindowLong(consoleWindow, GWL_EXSTYLE, lExStyle); - - // ------ Set the window position - if (mainGameWindow != NULL) - { - // ------ Set the console window position - RECT mainGameWindowRect; - GetWindowRect(mainGameWindow, &mainGameWindowRect); - int windowWidth = 400; - int windowHeight = 200; - - // ------ Calculate new position - int newWindowX = mainWindowRect.right - windowWidth; - int newWindowY = mainWindowRect.top + 30; - - // SetWindowPos(consoleWindow, HWND_TOPMOST, mainGameWindowRect.left + 100, mainGameWindowRect.top + 100, windowWidth, windowHeight, SWP_SHOWWINDOW); - SetWindowPos(consoleWindow, HWND_TOPMOST, newWindowX, newWindowY, windowWidth, windowHeight, SWP_SHOWWINDOW); - // hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookMainWindow, GetModuleHandle(NULL), 0); - // if (hHook == NULL) { - // f << "[" << timestamp << "] " << "Main window hook failed!" << std::endl; - // } else { - // f << "[" << timestamp << "] " << "Main window hook successful!" << std::endl; - // } - } - } - - std::cout << "Welcome to the EMU command console.\nAuthor: Eric \"Goosifer\" Galvan.\nSpecial thanks to: Finn, wowjinxy, Jay\n\nPlease enter your command below. Enter 'help' for a list of commands, or 'exit' to exit." << std::endl << std::endl; - std::cout << ""; // reset color - return consoleWindow; -} - -/// -/// Tokenizes buffer stream -/// -void EmuConsole::tokenize(bool& CommandIsProcessing) -{ - std::string token = ""; - // TODO: fix try/catch. Crashes if error found. - if (!std::getline(std::cin, token)) { - return; - } - - if (token.size() > 100) - { - // this limit will be increased, it's just a pre-emptive measure - std::cout << "Err: Command too long." << std::endl; - CommandIsProcessing = false; - // std::cin.ignore(32767, '\n'); - } else { - std::istringstream iss(token); - - while (std::getline(iss, token, ' ')) - { - tokens.push_back(token); - } - } - - -} - -std::string EmuConsole::HelpDefinition(std::string command, std::string definition) -{ - std::string help = command + " - " + definition; - return help; -} - -/// -/// Delivers requested commands provided by user -/// -void EmuConsole::processInput(bool& IsConsoleRunning) -{ - // tokens.clear(); - - // Process the input tokens - - // Check for a special command to exit the program - if (tokens[0] == "exit") - { - IsConsoleRunning = false; - return; - } - if (tokens[0] == "help") - { - std::cout << "==== Commands ====" << std::endl << std::endl; - std::cout << HelpDefinition("addtobudget ", "Adds to the zoo budget.") << std::endl; - std::cout << HelpDefinition("getbudget", "Returns the current zoo budget.") << std::endl; - std::cout << HelpDefinition("setbudget ", "Sets the zoo budget to .") << std::endl; - std::cout << HelpDefinition("pause", "Pauses the game.") << std::endl; - std::cout << HelpDefinition("resume", "Resumes the game.") << std::endl; - std::cout << HelpDefinition("num-animals", "Returns the current number of animals in the zoo.") << std::endl; - std::cout << HelpDefinition("num-species", "Returns the current number of animal species in the zoo.") << std::endl; - std::cout << HelpDefinition("num-guests", "Returns the current number of guests in the zoo.") << std::endl; - std::cout << HelpDefinition("num-tiredguests", "Returns the current number of tired guests in the zoo.") << std::endl; - std::cout << HelpDefinition("num-hungryguests", "Returns the current number of hungry guests in the zoo.") << std::endl; - std::cout << HelpDefinition("num-thirstyguests", "Returns the current number of thirsty guests in the zoo.") << std::endl; - std::cout << HelpDefinition("num-rstrmguests", "Returns the current number of guests that need to use the restroom in the zoo.") << std::endl; - std::cout << HelpDefinition("num-guestsfilter", "Returns the current number of guests in the guest filter.") << std::endl; - std::cout << HelpDefinition("getzooadmcost", "Returns the current zoo admission cost.") << std::endl; - std::cout << HelpDefinition("setzooadmcost ", "Sets the zoo admission cost to .") << std::endl; - std::cout << HelpDefinition("list-admissionsincome", "Returns a full year list of admissions income by month.") << std::endl; - std::cout << HelpDefinition("list-concessionsbenefit", "Returns a full year list of concessions benefits by month.") << std::endl; - // std::cout << HelpDefinition("list-recyclingbenefit", "Returns a full year list of recycling benefits by month.") << std::endl; - std::cout << HelpDefinition("list-zooprofits", "Returns a full year list of zoo profits by month.") << std::endl; - std::cout << HelpDefinition("list-privatedonations", "Returns a full year list of private donations by month.") << std::endl; - std::cout << HelpDefinition("list-zoorating", "Returns a full year list of zoo rating by month.") << std::endl; - std::cout << HelpDefinition("list-constructioncosts", "Returns a full year list of construction costs by month.") << std::endl; - std::cout << HelpDefinition("list-animalpurchasecosts", "Returns a full year list of animal purchase costs by month.") << std::endl; - std::cout << HelpDefinition("list-researchcosts", "Returns a full year list of research costs by month.") << std::endl; - std::cout << HelpDefinition("list-zoovalue", "Returns a full year list of the zoo's value by month.") << std::endl; - // std::cout << HelpDefinition("setmmcursor ", "Sets the mini map cursor to and .") << std::endl; - // std::cout << HelpDefinition("setmmcursor ", "Sets the mini map cursor to .") << std::endl; - // std::cout << HelpDefinition("pefound", "Test command to check if PE header is valid or found.") << std::endl; - std::cout << HelpDefinition("exit", "Exits the console.") << std::endl; - std::cout << HelpDefinition("help", "Displays this help menu.") << std::endl; - - std::cout << ""; - - } - else if (ZooState::IsZooLoaded()) - { - - if (tokens[0] == "addtobudget") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires an amount." << std::endl; - return; - } - // add to budget hook - std::cout << "Budget has been updated. " << std::endl; - ZooState::AddToZooBudget(static_cast(::atof(tokens[1].c_str()))); - } - else if (tokens[0] == "getbudget") - { - // return budget - std::cout << std::fixed; - std::cout << "The current budget is: " << std::setprecision(2) << ZooState::GetZooBudget() << std::endl; - } - else if (tokens[0] == "setbudget") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires an amount." << std::endl; - return; - } - // sets the budget - ZooState::SetZooBudget(static_cast(::atof(tokens[1].c_str()))); - } - else if (tokens[0] == "pause") - { - // number of animals hook - std::cout << "Pausing..." << std::endl; - ZTUI::main::pauseGame(); - } - else if (tokens[0] == "resume") - { - // number of animals hook - std::cout << "Resuming game..." << std::endl; - ZTUI::main::unpauseGame(); - } - else if (tokens[0] == "num-animals") - { - // return num of animals - std::cout << "The current number of animals in the zoo: " << ZooState::NumAnimals() << std::endl; - } - else if (tokens[0] == "num-species") - { - // return num of animal species - std::cout << "The current number of animal species in the zoo: " << ZooState::NumSpecies() << std::endl; - } - else if (tokens[0] == "num-guests") - { - // return num of guests - std::cout << "The current number of guests in the zoo: " << ZooState::NumGuests() << std::endl; - } - else if (tokens[0] == "num-tiredguests") - { - // return num of tired guests - std::cout << "The current number of tired guests in the zoo: " << ZooState::NumTiredGuests() << std::endl; - } - else if (tokens[0] == "num-hungryguests") - { - // return num of hungry guests - std::cout << "The current number of hungry guests in the zoo: " << ZooState::NumHungryGuests() << std::endl; - } - else if (tokens[0] == "num-thirstyguests") - { - // return num of thirsty guests - std::cout << "The current number of thirsty guests in the zoo: " << ZooState::NumThirstyGuests() << std::endl; - } - else if (tokens[0] == "num-rstrmguests") - { - // return num of guests that need to use the restroom - std::cout << "The current number of guests that need restroom in the zoo: " << ZooState::NumGuestsNeedRestrm() << std::endl; - } - else if (tokens[0] == "num-guestsfilter") - { - // return num of guests in filter - std::cout << "The current number of guests in the guest filter: " << ZooState::NumGuestsInFilter() << std::endl; - } - else if (tokens[0] == "getzooadmcost") - { - // return zoo admission cost - std::cout << "Zoo admission cost: $" << ZooState::GetZooAdmissionCost() << std::endl; - } - else if (tokens[0] == "setzooadmcost") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires an amount." << std::endl; - return; - } - // sets the admissions cost - ZooState::SetZooAdmissionCost(static_cast(::atof(tokens[1].c_str()))); - } - - else if (tokens[0] == "list-admissionsincome") - { - // return a full year list of admissions income by month - ZooState::print_year_to_console(ZooState::AdmissionsIncomeByMonth(), "ADMISSIONS INCOME BY MONTH"); - } - else if (tokens[0] == "list-concessionsbenefit") - { - // return a full year list of concessions benefits by month - ZooState::print_year_to_console(ZooState::ConcessionsBenefitByMonth(), "CONCESSIONS BENEFIT BY MONTH"); - } - // else if (tokens[0] == "list-recyclingbenefit") - // { - // // return a full year list of recycling benefits by month - // ZooState::print_year_to_console(ZooState::RecyclingBenefitByMonth(), "RECYCLING BENEFIT BY MONTH"); - // } - else if (tokens[0] == "list-zooprofits") - { - // return a full year list of zoo profits by month - ZooState::print_year_to_console(ZooState::ZooProfitOverTime(), "ZOO PROFITS BY MONTH"); - } - else if (tokens[0] == "list-privatedonations") - { - // return a full year list of private donations by month - ZooState::print_year_to_console(ZooState::PrivateDonationsByMonth(), "PRIVATE DONATIONS BY MONTH"); - } - else if (tokens[0] == "list-zoorating") - { - // return a full year list of zoo profits by month - ZooState::print_year_to_console(ZooState::ZooRatingByMonth(), "ZOO RATING BY MONTH"); - } - else if (tokens[0] == "list-constructioncosts") - { - // return a full year list of zoo profits by month - ZooState::print_year_to_console(ZooState::ConstructionCostByMonth(), "CONSTRUCTION COSTS BY MONTH"); - } - else if (tokens[0] == "list-animalpurchasecosts") - { - // return a full year list of animal purchase costs by month - ZooState::print_year_to_console(ZooState::AnimalPurchaseCostsByMonth(), "ANIMAL PURCHASE COSTS BY MONTH"); - } - else if (tokens[0] == "list-researchcosts") - { - // return a full year list of research costs by month - ZooState::print_year_to_console(ZooState::ResearchCostsByMonth(), "RESEARCH COSTS BY MONTH"); - } - else if (tokens[0] == "list-zoovalue") - { - // return a full year list of the zoo's value by month - ZooState::print_year_to_console(ZooState::ZooValueByMonth(), "ZOO VALUE BY MONTH"); - } - // else if (tokens[0] == "setmmcursor") - // { - // if (tokens.size() > 2) - // { - // ZooMiniMap::SetMiniMapCursor(::atoi(tokens[1].c_str()), ::atoi(tokens[2].c_str())); - // } - // else if (tokens.size() == 2) - // { - // // set new mini map cursor size - // ZooMiniMap::SetMiniMapCursor(tokens[1]); - // } - - // } - - // ----- Test commands (devs only) - // else if (tokens[0] == "pefound") { - // // ----- Test command to check if PE header is valid or found - // if (ZUtilities::FoundIAT() == 0) - // { - // std::cout << "PE header not found." << std::endl; - // } - // else if (ZUtilities::FoundIAT() == 2) - // { - // std::cout << "Optional header in PE Header not found." << std::endl; - // } - // else if (ZUtilities::FoundIAT() == 3) - // { - // std::cout << "Import Address Table in PE Header not found." << std::endl; - // } - // else - // { - // std::cout << "PE header found and valid." << std::endl; - // } - - // } - else if (tokens[0] == "setzoorating") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires a rating." << std::endl; - return; - } - // sets the zoo rating - // ZooState::SetZooRating(::atoi(tokens[1].c_str())); - } - else if (tokens[0] == "setguestrating") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires a rating." << std::endl; - return; - } - // sets the guest rating - // ZooState::SetGuestRating(::atoi(tokens[1].c_str())); - } - else if (tokens[0] == "setanimalrating") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires a rating." << std::endl; - return; - } - // sets the animal rating - // ZooState::SetAnimalRating(::atoi(tokens[1].c_str())); - } - else if (tokens[0] == "devmode") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires a boolean." << std::endl; - return; - } - // enable dev mode - if (tokens[1] == "true") - { - ZooState::EnableDevMode(true); - } - else if (tokens[1] == "false") - { - ZooState::EnableDevMode(false); - } - else - { - std::cout << "Err: Command <" << tokens[0] << "> requires a boolean." << std::endl; - } - } - else if (tokens[0] == "getent") { - // return selected entity - void* entity = ZTUI::general::getSelectedEntity(); - std::cout << "The selected entity is: " << std::hex << reinterpret_cast(entity) << std::endl; - if (tokens.size() > 1 && tokens[1] == "-b") - { - void* entityType = ZTUI::general::getSelectedEntityType(); - ZTBuildingType building(entityType); - - std::cout << "The building stats at type: " << entityType << std::endl; - std::cout << std::dec << "ncolors: " << building.ncolors() << std::endl; - std::cout << "cIconZoom: " << building.cIconZoom() << std::endl; - std::cout << "cExpansionID: " << building.cExpansionID() << std::endl; - std::cout << "cMovable: " << building.cMovable() << std::endl; - std::cout << "walkable: " << building.walkable() << std::endl; - std::cout << "walkableByTall: " << building.walkableByTall() << std::endl; - std::cout << "cRubbleable: " << building.cRubbleable() << std::endl; - std::cout << "cUseNumbersInName: " << building.cUseNumbersInName() << std::endl; - } - } - else if (tokens[0] == "setmapzoom") { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires a zoom level." << std::endl; - return; - } - ZTMapView::zoomMap(::atoi(tokens[1].c_str())); - std::cout << "Map zoom level set to: " << tokens[1] << std::endl; - } - else if (tokens[0] == "ztgr") { - std::cout << ZTGameMgr::shared_instance().zoo_budget << std::endl; - std::cout << ZTGameMgr::shared_instance().num_animals << std::endl; - std::cout << ZTGameMgr::shared_instance().num_species << std::endl; - std::cout << ZTGameMgr::shared_instance().guest_count << std::endl; - std::cout << ZTGameMgr::shared_instance().animal_purchase_costs[0] << std::endl; - } - else if (tokens[0] == "getelem") { - std::cout << BFUIMgr::getElement(::atoi(tokens[1].c_str())) << std::endl; - } - else if (tokens[0] == "zoomout") { - ZTMapView::clickZoomOut(); - std::cout << "Zoomed out." << std::endl; - } - else if (tokens[0] == "incspd") { - std::cout << "Increasing sim speed..." << std::endl; - BFGameApp::incSimSpeed(); - } - else if (tokens[0] == "guestname") - { - std::cout << "The guest name is: " << ZTGuest::getSelectedGuestName() << std::endl; - } - else if (tokens[0] == "makesel") - { - if (tokens.size() < 2) - { - std::cout << "Err: Command <" << tokens[0] << "> requires an entity ID." << std::endl; - return; - } else { - ZTUI::general::makeSelectableByType(::atoi(tokens[1].c_str())); - } - } - else - { - std::cout << "Err: Command <" << tokens[0] << "> does not exist." << std::endl; - } - } - else - { - std::cout << "Err: Not able to execute command until zoo has been loaded." << std::endl; - } - - // tokens.clear(); - // std::cout << ">> "; - // this->tokenize(); -} \ No newline at end of file diff --git a/EmuAPI/emu/EmuConsole.h b/EmuAPI/emu/EmuConsole.h deleted file mode 100644 index 0e9bfa8..0000000 --- a/EmuAPI/emu/EmuConsole.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef EMUCONSOLE_H -#define EMUCONSOLE_H - -#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING -#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 -#endif - -#include -#include -#include -#include -#include -#include "ZooState.h" -#include "ZooMiniMap.h" -#include -#include "ZTUI.h" - -class EmuConsole -{ -public: - EmuConsole(std::vector&); - void processInput(bool&); - ~EmuConsole(); - void tokenize(bool&); - static HWND createConsole(); -private: - std::vector& tokens; - static void EnableVirtualTerminalProcessing(); - std::string HelpDefinition(std::string, std::string); -}; - -#endif \ No newline at end of file diff --git a/EmuAPI/emu/EmuControls.cpp b/EmuAPI/emu/EmuControls.cpp deleted file mode 100644 index 7779bef..0000000 --- a/EmuAPI/emu/EmuControls.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "EmuControls.h" -#include "EmuMain.h" -#include "ZTWorldMgr.h" - -#define Main EmuMain::shared_instance() - -void EmuControls::procControls() -{ - if (EmuBase::DoubleKey(0x11, 0x54) == true) - { - // BFUIMgr::shared_instance().getElement(0x3f8); - //BFGameApp::incSimSpeed(); - - int ids[] = {9313, 9314, NULL}; - - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); - ZTWorldMgr::makeInvisible(entities, true); - - // BFUIMgr::confirmDialog(BFUIMgr::getUIMgr(), 153, 0, 3, "ui/sharedui/question/question", '\x01', '\0', 0, 0); - // std::ofstream f; - // f.open("getelement.log", std::ios_base::app); - // f << "x: " << x << std::endl; - // f.close(); - } - - - //---- CTRL + J - if (EmuBase::DoubleKey(0x11, 0x4A) == true && Main.IsConsoleRunning == false && Main.HasConsoleOpenedOnce == false) { - // f << "[" << timestamp << "] " << "Opening console..." << std::endl; - Main.IsConsoleRunning = true; - HANDLE thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&EmuMain::ZooConsole, NULL, 0, NULL); - // f << "[" << timestamp << "] " << "Console opened!" << std::endl; - CloseHandle(thread); - } - - //---- CTRL + M - if (EmuBase::DoubleKey(0x11, 0x4D) == true && !Main.ctrlMPressed) { - Main.ctrlMPressed = true; // Set the flag - float mo_money = 1000000.00f; - ZooState::AddToZooBudget(mo_money); - } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { - Main.ctrlMPressed = false; // Reset the flag when the key is released - } - -} - -LRESULT CALLBACK EmuControls::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { - if (nCode == HC_ACTION) { - MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam; - if (wParam == WM_MOUSEWHEEL) { - int wheelDelta = GET_WHEEL_DELTA_WPARAM(pMouseStruct->mouseData); - bool isCtrlPressed = GetAsyncKeyState(VK_CONTROL) & 0x8000; - int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); - if (isCtrlPressed) { - if (isCtrlPressed && wheelDelta > 0) { - // f << "Mouse wheel up!" << std::endl; - ZTMapView::rotateCW(); - } else if (isCtrlPressed && wheelDelta < 0) { - // f << "Mouse wheel down!" << std::endl; - ZTMapView::rotateCCW(); - } - - } else { - if (wheelDelta > 0 && *currentZoom < 2) { - // f << "Mouse wheel up!" << std::endl; - ZTMapView::clickZoomIn(); - } else if (wheelDelta < 0 && *currentZoom > -2) { - // f << "Mouse wheel down!" << std::endl; - ZTMapView::clickZoomOut(); - } - } - } - return CallNextHookEx(NULL, nCode, wParam, lParam); -} -} - -bool EmuControls::InitializeHook() -{ - // call SetWindowsHookEx here - HHOOK hHook = SetWindowsHookEx(WH_MOUSE_LL, EmuControls::LowLevelMouseProc, GetModuleHandle(NULL), 0); - if (hHook == NULL) { - // handle error - return false; - } - return true; -} diff --git a/EmuAPI/emu/EmuControls.h b/EmuAPI/emu/EmuControls.h deleted file mode 100644 index 78b6a20..0000000 --- a/EmuAPI/emu/EmuControls.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef EMUCONTROLS_H -#define EMUCONTROLS_H - -#include "BFUIMgr.h" -#include "EmuBase.h" -#include "ZooState.h" -#include "EmuConsole.h" -#include "EmuMain.h" - -class EmuControls -{ - public: - static void procControls(); - static LRESULT CALLBACK LowLevelMouseProc(int, WPARAM, LPARAM); - static bool InitializeHook(); -}; - -#endif // EMUCONTROLS_H \ No newline at end of file diff --git a/EmuAPI/emu/EmuMain.cpp b/EmuAPI/emu/EmuMain.cpp deleted file mode 100644 index 57eba41..0000000 --- a/EmuAPI/emu/EmuMain.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "EmuMain.h" -#include "detours.h" -#include "EmuControls.h" -#include "ZTCheats.h" - -// #define instance - -//------ Function pointers -DWORD updateAddress = 0x41a16b; // 0x00401644; // address of update function in game -typedef void (__thiscall *_origUpdate)(void* thisptr); // define original update function - - -EmuMain::EmuMain() -{ - this->IsConsoleRunning = false; - this->CommandIsProcessing = false; - this->HasConsoleOpenedOnce = false; - this->ctrlMPressed = false; - this->hasHooked = false; - this->zoo_models = new ZooModels(); - this->console = new EmuConsole(tokens); -} - -void EmuMain::init() -{ - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&updateAddress, (PVOID)&RunEmu); - DetourTransactionCommit(); -} - -DWORD WINAPI EmuMain::ZooConsole() -{ - EmuMain::shared_instance().HasConsoleOpenedOnce = true; - - HWND consoleWindow = EmuConsole::createConsole(); - - while (EmuMain::shared_instance().IsConsoleRunning) - { - // ------ Tokenize the input - if (!EmuMain::shared_instance().CommandIsProcessing) - { - std::cout << ">> "; - EmuMain::shared_instance().CommandIsProcessing = true; // set flag to true to avoid multiple commands being processed at once - EmuMain::shared_instance().console->tokenize(EmuMain::shared_instance().CommandIsProcessing); - } - Sleep(10); - } - - // ------ Close the console window - EmuMain::shared_instance().HasConsoleOpenedOnce = false; - EmuMain::shared_instance().IsConsoleRunning = false; - FreeConsole(); - Sleep(100); - PostMessage(consoleWindow, WM_CLOSE, 0, 0); - return 1; -} - -void __fastcall EmuMain::RunEmu(void* thisptr) { - - // main loop - - EmuControls::procControls(); // process controls - - // if (!EmuMain::shared_instance().hasHooked) { - // EmuControls::InitializeHook(); // initialize mouse hook - - // EmuMain::shared_instance().hasHooked = true; - // } - - ZTCheats::InvisibleInvincibleCheat(); // run cheats - - // only run scripts while zoo is loaded and not in main menu - if ((int)ZooState::object_ptr(0x0) > 0) { - // f << "[" << timestamp << "] " << "Is no longer in main menu!" << std::endl; - if (ZooState::IsZooLoaded() == true) { - // f << "[" << timestamp << "] " << "Zoo is loaded!" << std::endl; - if (!EmuMain::shared_instance().hasEmuRunOnce) { - // f << "[" << timestamp << "] " << "Running emu_run scripts..." << std::endl; - EmuMain::shared_instance().sm.executeScripts("emu_gawk"); - EmuMain::shared_instance().hasEmuRunOnce = true; - EmuMain::shared_instance().sm = EmuScriptMgr(); // TODO: create dumpScripts function for graceful cleanup - // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; - } - *(EmuMain::shared_instance().zoo_models) = EmuMain::shared_instance().sm.executeScripts("emu_run"); - // f << "[" << timestamp << "] " << "Scripts executed!" << std::endl; - } - } - - if (ZooState::IsZooLoaded() == false) { - EmuMain::shared_instance().hasEmuRunOnce = false; - - } - - //---- Process the input tokens while console is running - if (!EmuMain::shared_instance().tokens.empty() && EmuMain::shared_instance().IsConsoleRunning == true) - { - EmuMain::shared_instance().console->processInput(EmuMain::shared_instance().IsConsoleRunning); - EmuMain::shared_instance().tokens.clear(); - EmuMain::shared_instance().CommandIsProcessing = false; // reset flag to allow another command to be tokenized - } - - //---- return to original update function - _origUpdate ogUpdate = (_origUpdate)updateAddress; - // f << "[" << timestamp << "] " << "EMU loop finished!" << std::endl; - - ogUpdate(thisptr); - - // f << "[" << timestamp << "] " << "ogUpdate(thisptr) called!" << std::endl; -} diff --git a/EmuAPI/emu/EmuMain.h b/EmuAPI/emu/EmuMain.h deleted file mode 100644 index 82db369..0000000 --- a/EmuAPI/emu/EmuMain.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef EMUMAIN_H -#define EMUMAIN_H - -#include "EmuScriptMgr.h" -#include "ZooModels.h" -#include "windows.h" -#include "EmuConsole.h" - -class EmuMain -{ - public: - static DWORD WINAPI ZooConsole(); - static void __fastcall RunEmu(void*); - static void init(); - EmuMain(); - - LPVOID lpParameter; - ZooModels* zoo_models; - - //------ Flags for console - bool IsConsoleRunning; - bool CommandIsProcessing; - bool HasConsoleOpenedOnce; // to avoid conflicts when console has not been opened yet - - //------ Flags for keypresses - bool ctrlMPressed; - - //------ Flags for hooks - bool hasHooked; - - //------ Flags for script manager - bool hasEmuRunOnce; - - EmuScriptMgr sm; // script manager object - - std::vector tokens; // contains tokens from console input - EmuConsole *console; // console object - - static EmuMain &shared_instance() { - static EmuMain instance; - return instance; - } - -}; - -#endif // EMUMAIN_H \ No newline at end of file diff --git a/EmuAPI/emu/EmuScriptMgr.cpp b/EmuAPI/emu/EmuScriptMgr.cpp deleted file mode 100644 index 36dbdee..0000000 --- a/EmuAPI/emu/EmuScriptMgr.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include "EmuScriptMgr.h" - -// EmuScriptMgr::EmuScriptMgr() : lua(NULL), f(std::ofstream("out.log", std::ios_base::app)), timestamp(*new char) { -// // do not use default constructor -// } - -EmuScriptMgr::EmuScriptMgr() { - - //------ Initializing Lua - lua = luaL_newstate(); // Open Lua - int iErr = 0; - // if (!lua) { - // f << "[" << timestamp << "] " << "Failed to create Lua state." << std::endl; - // } - - //------ Register API functions to Lua - RegZooState::register_zoo_state(lua); - - //------ Load Lua libraries - luaL_openlibs (lua); -} - -EmuScriptMgr::~EmuScriptMgr() { - lua_close (lua); -} - -/// @brief Executes all emu scripts in a directory. -ZooModels EmuScriptMgr::executeScripts(std::string script) { - ZooModels zoo_models; - - for (size_t i = 0; i < scripts.size(); i++) { - lua = luaL_newstate(); // Open Lua - - int iErr = 0; - if (!lua) { - // f << "[" << timestamp << "] " << "Failed to create Lua state." << std::endl; - } - //------ Register API functions to Lua - RegZooState::register_zoo_state(lua); - luaL_openlibs (lua); - if (luaL_loadstring(lua, scripts[i].c_str()) == 0) { - if (lua_pcall(lua, 0, LUA_MULTRET, 0) == 0) - { - // script is loaded, now load specific function - lua_getglobal(lua, script.c_str()); - // check if we can call function - if (lua_isfunction(lua, -1)) { - if (lua_pcall(lua, 0, LUA_MULTRET, 0) == 0) { - // // errors if can't execute script - // const char* error_message = lua_tostring(lua, -1); - // f << "Error executing Lua function: " << error_message << std::endl; - // lua_close (lua); - // // return 1; - lua_getglobal(lua, "_globalAnimalRating"); - if (lua_isnil(lua, -1)) { - zoo_models._emuAnimalRatingSet = false; - } - else if (lua_isnumber(lua, -1)) { - int animalRating = (int)lua_tointeger(lua, -1); - zoo_models._animalRating = animalRating; - zoo_models._emuAnimalRatingSet = true; - } - lua_getglobal(lua, "_globalGuestRating"); - if (lua_isnil(lua, -1)) { - zoo_models._emuGuestRatingSet = false; - } - else if (lua_isnumber(lua, -1)) { - int guestRating = (int)lua_tointeger(lua, -1); - zoo_models._guestRating = guestRating; - zoo_models._emuGuestRatingSet = true; - } - lua_getglobal(lua, "_globalZooRating"); - if (lua_isnil(lua, -1)) { - zoo_models._emuZooRatingSet = false; - } - else if (lua_isnumber(lua, -1)) { - int zooRating = (int)lua_tointeger(lua, -1); - zoo_models._zooRating = zooRating; - zoo_models._emuZooRatingSet = true; - } - lua_pop(lua, 1); - } - } else { - // f << "[" << timestamp << "] " << "Function 'emu_run' not found or not callable" << std::endl; - lua_close (lua); - // return 1; - } - lua_pop(lua, 1); - } else { - // error handling - const char* error_message = lua_tostring(lua, -1); - // f << "[" << timestamp << "] " << "Error executing Lua script " << i << ": " << error_message << std::endl; - - // remove err from stack - lua_pop(lua, 1); - lua_close (lua); - // return 1; - } - } else { - // error handling - const char* error_message = lua_tostring(lua, -1); - // f << "[" << timestamp << "] " << "Error loading Lua script " << i << ": " << error_message << std::endl; - - // remove err from stack - lua_pop(lua, 1); - lua_close (lua); - // return 1; - } - lua_close (lua); - } - - // return 0; - return zoo_models; -} - -/// @brief Stores all emu scripts in a directory in memory. -void EmuScriptMgr::storeScripts() { - - for (size_t i = 0; i < files.size(); i++) { - //------ Read script file - std::ifstream file(files[i].c_str()); - std::string script; - char c; - while (file.get(c)) { - script += c; - } - scripts.push_back(script); - file.close(); - //------ Compile script - if ((luaL_loadstring(lua, script.c_str())) == 0) { - lua_CFunction script_funct = lua_tocfunction(lua, -1); - compiled_scripts.push_back(script_funct); - lua_pop(lua, 1); - } else { - // f << "[" << timestamp << "] " << "Error loading script: " << files[i].substr(0, files[i].size() - (int)(files[i].size() * 0.30)) << " [..]" << std::endl; - } - } - lua_close (lua); - -} - -/// @brief Finds all scripts within the /scripts directory and stores their location in memory. -void EmuScriptMgr::findScripts() { - - //------ Open log file in append mode - std::ofstream f; - f.open("out.log", std::ios_base::app); - - //------ Get working directory - wchar_t buffer[MAX_PATH]; // wide char buffer for GetCurrentDirectory - DWORD len = GetCurrentDirectory(MAX_PATH, buffer); // TODO: add error handling for this - std::wstring wpath(buffer, len);//std::wstring(buffer.begin(), buffer.end()); // conv path to wide string (project uses multi-byte char set) - wpath += L"\\scripts"; - - //------ Convert wide string to narrow string, - std::string path(wpath.begin(), wpath.end()); - - //------ Find first .emu file in directory - WIN32_FIND_DATA find_emu_file; - HANDLE hFind = FindFirstFile((wpath + L"\\*.emu").c_str(), &find_emu_file); // wide string used here - - wpath = find_emu_file.cFileName; - std::string file_found(wpath.begin(), wpath.end()); - - //------ If no .emu files found, log error - if (hFind == INVALID_HANDLE_VALUE) { - // f << "[" << timestamp << "] " << "Error finding path: " << file_found << std::endl; - } else { - //------ Find the rest of the .emu files in the directory - do { - if (find_emu_file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - // skip directories (for now) - } else { // we only care about files (for now) - std::wstring nFound = find_emu_file.cFileName; // conv file found back to narrow string - std::string file_name(nFound.begin(), nFound.end()); - std::string file = path + "\\" + file_name; - - files.push_back(file); - file_names.push_back(file_name); - } - } while (FindNextFile(hFind, &find_emu_file) != 0); // find the next file - FindClose(hFind); - } - -} - diff --git a/EmuAPI/emu/EmuScriptMgr.h b/EmuAPI/emu/EmuScriptMgr.h deleted file mode 100644 index 90ad0de..0000000 --- a/EmuAPI/emu/EmuScriptMgr.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef EMUSCRIPTMGR_H -#define EMUSCRIPTMGR_H - -#include -#include -#include -#include -#include -#include -#include -#include "lua.hpp" -#include -#include -#include "RegZooState.h" -#include "ZooModels.h" - -class EmuScriptMgr -{ -public: - EmuScriptMgr(); // overloaded constructor - ~EmuScriptMgr(); - void findScripts(); - void storeScripts(); - ZooModels executeScripts(std::string); - -private: - std::vector files; - std::vector file_names; - std::vector compiled_scripts; - std::vector scripts; - static int writer(const void*, size_t, void*); - - lua_State *lua; -}; - -#endif \ No newline at end of file diff --git a/EmuAPI/emu/emu_run_wrapper.emu b/EmuAPI/emu/emu_run_wrapper.emu deleted file mode 100644 index 9bb7239..0000000 --- a/EmuAPI/emu/emu_run_wrapper.emu +++ /dev/null @@ -1,21 +0,0 @@ --- Wrapper script -function emu_run_wrapper() - -- Define a function counter - local counter = 1 - - -- Iterate through the emu_run functions - while true do - -- Generate the function name - local func_name = "emu_run" .. counter - - -- Call the function with the generated name - local func = _G[func_name] - if func then - func() - counter = counter + 1 - else - break -- Exit the loop when no more functions are found - end - end -end - diff --git a/EmuAPI/emu/emu_test_script.lua b/EmuAPI/emu/emu_test_script.lua deleted file mode 100644 index 450e424..0000000 --- a/EmuAPI/emu/emu_test_script.lua +++ /dev/null @@ -1,3 +0,0 @@ -function emu_run() - io.write(GetZooBudget() + "Hello world from inside Lua running inside EMU running inside Zoo Tycoon!") -end \ No newline at end of file diff --git a/EmuAPI/lua/RegZooState.cpp b/EmuAPI/lua/RegZooState.cpp deleted file mode 100644 index f51d3b9..0000000 --- a/EmuAPI/lua/RegZooState.cpp +++ /dev/null @@ -1,469 +0,0 @@ -#include "RegZooState.h" - -void RegZooState::register_zoo_state(lua_State* lua) -{ - // create a new RegZooState object - lua_register(lua, "GetZooBudget", RegZooState::lua_ZooState_GetZooBudget); - lua_register(lua, "IsZooLoaded", RegZooState::lua_ZooState_IsZooLoaded); - lua_register(lua, "PauseGame", RegZooState::lua_ZooState_PauseGame); - lua_register(lua, "IsGamePaused", RegZooState::lua_ZooState_IsGamePaused); - lua_register(lua, "SetZooBudget", RegZooState::lua_ZooState_SetZooBudget); - lua_register(lua, "AddToZooBudget", RegZooState::lua_ZooState_AddToZooBudget); - lua_register(lua, "NumAnimals", RegZooState::lua_ZooState_NumAnimals); - lua_register(lua, "NumSpecies", RegZooState::lua_ZooState_NumSpecies); - lua_register(lua, "NumGuests", RegZooState::lua_ZooState_NumGuests); - lua_register(lua, "AdmissionsIncomeByMonth", RegZooState::lua_ZooState_AdmissionsIncomeByMonth); - lua_register(lua, "ConcessionsBenefitByMonth", RegZooState::lua_ZooState_ConcessionsBenefitByMonth); - lua_register(lua, "ZooProfitOverTime", RegZooState::lua_ZooState_ZooProfitOverTime); - lua_register(lua, "ZooRatingByMonth", RegZooState::lua_ZooState_ZooRatingByMonth); - lua_register(lua, "ConstructionCostByMonth", RegZooState::lua_ZooState_ConstructionCostByMonth); - lua_register(lua, "PrivateDonationsByMonth", RegZooState::lua_ZooState_PrivateDonationsByMonth); - lua_register(lua, "AnimalPurchaseCostsByMonth", RegZooState::lua_ZooState_AnimalPurchaseCostsByMonth); - lua_register(lua, "ResearchCostsByMonth", RegZooState::lua_ZooState_ResearchCostsByMonth); - //lua_register(lua, "NumAngryGuests", RegZooState::lua_ZooState_NumAngryGuests); - lua_register(lua, "NumTiredGuests", RegZooState::lua_ZooState_NumTiredGuests); - lua_register(lua, "NumHungryGuests", RegZooState::lua_ZooState_NumHungryGuests); - lua_register(lua, "NumThirstyGuests", RegZooState::lua_ZooState_NumThirstyGuests); - lua_register(lua, "NumGuestsNeedRestrm", RegZooState::lua_ZooState_NumGuestsNeedRestrm); - lua_register(lua, "NumGuestsInFilter", RegZooState::lua_ZooState_NumGuestsInFilter); - lua_register(lua, "GetZooAdmissionCost", RegZooState::lua_ZooState_GetZooAdmissionCost); - lua_register(lua, "SetZooAdmissionCost", RegZooState::lua_ZooState_SetZooAdmissionCost); - lua_register(lua, "ZooValueByMonth", RegZooState::lua_ZooState_ZooValueByMonth); - lua_register(lua, "SetZooRating", RegZooState::lua_ZooState_SetZooRating); - lua_register(lua, "SetGuestRating", RegZooState::lua_ZooState_SetGuestRating); - lua_register(lua, "SetAnimalRating", RegZooState::lua_ZooState_SetAnimalRating); - lua_register(lua, "EnableDevMode", RegZooState::lua_ZooState_EnableDevMode); - lua_register(lua, "IsDevModeEnabled", RegZooState::lua_ZooState_IsDevModeEnabled); -} - -int RegZooState::lua_ZooState_GetZooBudget(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::GetZooBudget()); - return 1; -} - -int RegZooState::lua_ZooState_IsZooLoaded(lua_State* lua) -{ - lua_pushboolean(lua, ZooState::IsZooLoaded()); - return 1; -} - -int RegZooState::lua_ZooState_PauseGame(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - // parameter is at Lua stack 1 - #pragma warning(disable : 4800) - bool pause_state = lua_toboolean(lua, 1); - #pragma warning(default : 4800) - - // set new value - ZooState::PauseGame(pause_state); - } - else - { - return luaL_error(lua, "Missing argument: pause state (true or false)"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_IsGamePaused(lua_State* lua) -{ - lua_pushboolean(lua, ZooState::IsGamePaused()); - return 1; -} - -int RegZooState::lua_ZooState_SetZooBudget(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - // parameter is at Lua stack 1 - float newBudget = (float)lua_tonumber(lua, 1); - - // set new value - ZooState::SetZooBudget(newBudget); - } - else - { - return luaL_error(lua, "Missing argument: new budget value"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - - -int RegZooState::lua_ZooState_AddToZooBudget(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - // parameter is at Lua stack 1 - float deposit = (float)lua_tonumber(lua, 1); - - // set new value - ZooState::AddToZooBudget(deposit); - } - else - { - return luaL_error(lua, "Missing argument: deposit value"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_NumAnimals(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumAnimals()); - return 1; -} - -int RegZooState::lua_ZooState_NumSpecies(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumSpecies()); - return 1; -} - -int RegZooState::lua_ZooState_NumGuests(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumGuests()); - return 1; -} - -int RegZooState::lua_ZooState_AdmissionsIncomeByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::AdmissionsIncomeByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_ConcessionsBenefitByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::ConcessionsBenefitByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_ZooProfitOverTime(lua_State* lua) -{ - float* incomeArray = ZooState::ZooProfitOverTime(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_ZooRatingByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::ZooRatingByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_ConstructionCostByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::ConstructionCostByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_PrivateDonationsByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::PrivateDonationsByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_AnimalPurchaseCostsByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::AnimalPurchaseCostsByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_ResearchCostsByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::ResearchCostsByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -// int RegZooState::lua_ZooState_NumAngryGuests(lua_State* lua) -// { -// lua_pushnumber(lua, ZooState::NumAngryGuests()); -// return 1; -// } - -int RegZooState::lua_ZooState_NumTiredGuests(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumTiredGuests()); - return 1; -} - -int RegZooState::lua_ZooState_NumHungryGuests(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumHungryGuests()); - return 1; -} - -int RegZooState::lua_ZooState_NumThirstyGuests(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumThirstyGuests()); - return 1; -} - -int RegZooState::lua_ZooState_NumGuestsNeedRestrm(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumGuestsNeedRestrm()); - return 1; -} - -int RegZooState::lua_ZooState_NumGuestsInFilter(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::NumGuestsInFilter()); - return 1; -} - -int RegZooState::lua_ZooState_GetZooAdmissionCost(lua_State* lua) -{ - lua_pushnumber(lua, ZooState::GetZooAdmissionCost()); - return 1; -} - -int RegZooState::lua_ZooState_SetZooAdmissionCost(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - // parameter is at Lua stack 1 - float adm_cost = (float)lua_tonumber(lua, 1); - - // set new value - ZooState::SetZooAdmissionCost(adm_cost); - } - else - { - return luaL_error(lua, "Missing argument: new admission cost"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_ZooValueByMonth(lua_State* lua) -{ - float* incomeArray = ZooState::ZooValueByMonth(); - - // new lua table to hold the float array - lua_newtable(lua); - - // push each element of array onto lua table - for (int i = 0; i < 12; i++) { - lua_pushnumber(lua, incomeArray[i]); - lua_rawseti(lua, -2, i + 1); // -2 refers to the table, i + 1 is the Lua array index - } - - // return the Lua table (it's on top of the stack) - return 1; -} - -int RegZooState::lua_ZooState_SetAnimalRating(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - ZooModels* instance = static_cast(lua_touserdata(lua, lua_upvalueindex(1))); - // parameter is at Lua stack 1 - int rating = (int)lua_tonumber(lua, 1); - instance->_animalRating = rating; - - return 1; - } - else - { - return luaL_error(lua, "Missing argument: new animal rating"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_SetGuestRating(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - ZooModels* instance = static_cast(lua_touserdata(lua, lua_upvalueindex(1))); - // parameter is at Lua stack 1 - int rating = (int)lua_tonumber(lua, 1); - instance->_guestRating = rating; - - // set new value - // ZooState::SetGuestRating(rating); - } - else - { - return luaL_error(lua, "Missing argument: new guest rating"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_SetZooRating(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - ZooModels* instance = static_cast(lua_touserdata(lua, lua_upvalueindex(1))); - // parameter is at Lua stack 1 - int rating = (int)lua_tonumber(lua, 1); - instance->_zooRating = rating; - - // set new value - // ZooState::SetZooRating(rating); - } - else - { - return luaL_error(lua, "Missing argument: new zoo rating"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_EnableDevMode(lua_State* lua) -{ - // obtain num of args taken from lua - int numArgs = lua_gettop(lua); - - // only one arg required - if (numArgs == 1) - { - // parameter is at Lua stack 1 - #pragma warning(disable : 4800) - bool dev_mode = lua_toboolean(lua, 1); - #pragma warning(default : 4800) - - // set new value - ZooState::EnableDevMode(dev_mode); - } - else - { - return luaL_error(lua, "Missing argument: dev mode state (true or false)"); - } - - // ret num of values to ret to lua (0 in this case) - return 0; -} - -int RegZooState::lua_ZooState_IsDevModeEnabled(lua_State* lua) -{ - lua_pushboolean(lua, ZooState::IsDevModeEnabled()); - return 1; -} - diff --git a/EmuAPI/lua/RegZooState.h b/EmuAPI/lua/RegZooState.h deleted file mode 100644 index b5ee428..0000000 --- a/EmuAPI/lua/RegZooState.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef REGZOOSTATE_H -#define REGZOOSTATE_H - -#include "lua.hpp" -#include "ZooState.h" -#include "ZooModels.h" - -class RegZooState -{ - public: - RegZooState(lua_State*); - static void register_zoo_state(lua_State*); - static int lua_ZooState_GetZooBudget(lua_State*); - static int lua_ZooState_IsZooLoaded(lua_State*); - static int lua_ZooState_PauseGame(lua_State*); - static int lua_ZooState_IsGamePaused(lua_State*); - static int lua_ZooState_SetZooBudget(lua_State*); - static int lua_ZooState_AddToZooBudget(lua_State*); - static int lua_ZooState_NumAnimals(lua_State*); - static int lua_ZooState_NumSpecies(lua_State*); - static int lua_ZooState_NumGuests(lua_State*); - static int lua_ZooState_AdmissionsIncomeByMonth(lua_State*); - static int lua_ZooState_ConcessionsBenefitByMonth(lua_State*); - static int lua_ZooState_ZooProfitOverTime(lua_State*); - static int lua_ZooState_ZooRatingByMonth(lua_State*); - static int lua_ZooState_ConstructionCostByMonth(lua_State*); - static int lua_ZooState_PrivateDonationsByMonth(lua_State*); - static int lua_ZooState_AnimalPurchaseCostsByMonth(lua_State*); - static int lua_ZooState_ResearchCostsByMonth(lua_State*); - //static int lua_ZooState_NumAngryGuests(lua_State*); - static int lua_ZooState_NumTiredGuests(lua_State*); - static int lua_ZooState_NumHungryGuests(lua_State*); - static int lua_ZooState_NumThirstyGuests(lua_State*); - static int lua_ZooState_NumGuestsNeedRestrm(lua_State*); - static int lua_ZooState_NumGuestsInFilter(lua_State*); - static int lua_ZooState_GetZooAdmissionCost(lua_State*); - static int lua_ZooState_SetZooAdmissionCost(lua_State*); - static int lua_ZooState_ZooValueByMonth(lua_State*); - static int lua_ZooState_SetZooRating(lua_State*); - static int lua_ZooState_SetGuestRating(lua_State*); - static int lua_ZooState_SetAnimalRating(lua_State*); - static int lua_ZooState_EnableDevMode(lua_State*); - static int lua_ZooState_IsDevModeEnabled(lua_State*); - - static ZooModels zoo_models; - }; - -#endif \ No newline at end of file diff --git a/EmuAPI/lua/lualicense.txt b/EmuAPI/lua/lualicense.txt deleted file mode 100644 index e09d1c1..0000000 --- a/EmuAPI/lua/lualicense.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 1994–2023 Lua.org, PUC-Rio. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EmuAPI/lua53.lib b/EmuAPI/lua53.lib deleted file mode 100644 index a00af3dca17ac0e471f30d9baff49bb0a4f58880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591434 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
qkud3sjNyo#hJgOWVS5plAKo1f6U5i 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 // must always be above detours.h -#include - -int BFEntityType::ncolors() { - return *(int*)((DWORD)thisptr + 0x038); -} - -int BFEntityType::ncolors(int input) { - *(int*)((DWORD)this->thisptr + 0x038) = input; - return input; -} - -bool BFEntityType::cIconZoom() { - return *(bool*)((DWORD)this->thisptr + 0x050); -} - -bool BFEntityType::cIconZoom(bool input) { - *(bool*)((DWORD)this->thisptr + 0x050) = input; - return input; -} - -bool BFEntityType::cExpansionID() { - return *(bool*)((DWORD)this->thisptr + 0x054); -} - -bool BFEntityType::cExpansionID(bool input) { - *(bool*)((DWORD)this->thisptr + 0x054) = input; - return input; -} - -bool BFEntityType::cMovable() { - return *(bool*)((DWORD)this->thisptr + 0x055); -} - -bool BFEntityType::cMovable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x055) = input; - return input; -} - -bool BFEntityType::walkable() { - return *(bool*)((DWORD)this->thisptr + 0x056); -} - -bool BFEntityType::walkable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x056) = input; - return input; -} - -bool BFEntityType::walkableByTall() { - return *(bool*)((DWORD)this->thisptr + 0x057); -} - -bool BFEntityType::walkableByTall(bool input) { - *(bool*)((DWORD)this->thisptr + 0x057) = input; - return input; -} - -bool BFEntityType::cRubbleable() { - return *(bool*)((DWORD)this->thisptr + 0x059); -} - -bool BFEntityType::cRubbleable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x059) = input; - return input; -} - -bool BFEntityType::cUseNumbersInName() { - return *(bool*)((DWORD)this->thisptr + 0x05B); -} - -bool BFEntityType::cUseNumbersInName(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05B) = input; - return input; -} - -bool BFEntityType::cUsesRealShadows() { - return *(bool*)((DWORD)this->thisptr + 0x05C); -} - -bool BFEntityType::cUsesRealShadows(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05C) = input; - return input; -} - -bool BFEntityType::cHasShadowImages() { - return *(bool*)((DWORD)this->thisptr + 0x05D); -} - -bool BFEntityType::cHasShadowImages(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05D) = input; - return input; -} - -bool BFEntityType::cForceShadowBlack() { - return *(bool*)((DWORD)this->thisptr + 0x05E); -} - -bool BFEntityType::cForceShadowBlack(bool input) { - *(bool*)((DWORD)this->thisptr + 0x05E) = input; - return input; -} - -bool BFEntityType::cDrawsLate() { - return *(bool*)((DWORD)this->thisptr + 0x060); -} - -bool BFEntityType::cDrawsLate(bool input) { - *(bool*)((DWORD)this->thisptr + 0x060) = input; - return input; -} - -bool BFEntityType::cHeight() { - return *(bool*)((DWORD)this->thisptr + 0x064); -} - -bool BFEntityType::cHeight(bool input) { - *(bool*)((DWORD)this->thisptr + 0x064) = input; - return input; -} - -bool BFEntityType::cDepth() { - return *(bool*)((DWORD)this->thisptr + 0x068); -} - -bool BFEntityType::cDepth(bool input) { - *(bool*)((DWORD)this->thisptr + 0x068) = input; - return input; -} - -bool BFEntityType::cHasUnderwaterSection() { - return *(bool*)((DWORD)this->thisptr + 0x06C); -} - -bool BFEntityType::cHasUnderwaterSection(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06C) = input; - return input; -} - -bool BFEntityType::cIsTransient() { - return *(bool*)((DWORD)this->thisptr + 0x06D); -} - -bool BFEntityType::cIsTransient(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06D) = input; - return input; -} - -bool BFEntityType::cUsesPlacementCube() { - return *(bool*)((DWORD)this->thisptr + 0x06E); -} - -bool BFEntityType::cUsesPlacementCube(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06E) = input; - return input; -} - -bool BFEntityType::cShow() { - return *(bool*)((DWORD)this->thisptr + 0x06F); -} - -bool BFEntityType::cShow(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06F) = input; - return input; -} - -int BFEntityType::cHitThreshold() { - return *(int*)((DWORD)this->thisptr + 0x070); -} - -int BFEntityType::cHitThreshold(int input) { - *(int*)((DWORD)this->thisptr + 0x070) = input; - return input; -} - -bool BFEntityType::cAvoidEdges() { - return *(bool*)((DWORD)this->thisptr + 0x074); -} - -bool BFEntityType::cAvoidEdges(bool input) { - *(bool*)((DWORD)this->thisptr + 0x074) = input; - return input; -} - -std::string BFEntityType::typeName() { - return *(std::string*)((DWORD)this->thisptr + 0x098); -} - -std::string BFEntityType::typeName(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x098) = input; - return input; -} - -std::string BFEntityType::codename() { - return *(std::string*)((DWORD)this->thisptr + 0x0A4); -} - -std::string BFEntityType::codename(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x0A4) = input; - return input; -} - - -int BFEntityType::cFootprintX() { - return *(int*)((DWORD)this->thisptr + 0x0B4); -} - -int BFEntityType::cFootprintX(int input) { - *(int*)((DWORD)this->thisptr + 0x0B4) = input; - return input; -} - -int BFEntityType::cFootprintY() { - return *(int*)((DWORD)this->thisptr + 0x0B8); -} - -int BFEntityType::cFootprintY(int input) { - *(int*)((DWORD)this->thisptr + 0x0B8) = input; - return input; -} - - -int BFEntityType::cFootprintZ() { - return *(int*)((DWORD)this->thisptr + 0x0BC); -} - -int BFEntityType::cFootprintZ(int input) { - *(int*)((DWORD)this->thisptr + 0x0BC) = input; - return input; -} - -int BFEntityType::cPlacementFootprintX() { - return *(int*)((DWORD)this->thisptr + 0x0C0); -} - -int BFEntityType::cPlacementFootprintX(int input) { - *(int*)((DWORD)this->thisptr + 0x0C0) = input; - return input; -} - -int BFEntityType::cPlacementFootprintY() { - return *(int*)((DWORD)this->thisptr + 0x0C4); -} - -int BFEntityType::cPlacementFootprintY(int input) { - *(int*)((DWORD)this->thisptr + 0x0C4) = input; - return input; -} - -int BFEntityType::cPlacementFootprintZ() { - return *(int*)((DWORD)this->thisptr + 0x0C8); -} - - -int BFEntityType::cPlacementFootprintZ(int input) { - *(int*)((DWORD)this->thisptr + 0x0C8) = input; - return input; -} - -bool BFEntityType::availableAtStartup() { - return *(bool*)((DWORD)this->thisptr + 0x0CC); -} - -bool BFEntityType::availableAtStartup(bool input) { - *(bool*)((DWORD)this->thisptr + 0x0CC) = input; - return input; -} diff --git a/EmuAPI/reimp/BFEntityType.h b/EmuAPI/reimp/BFEntityType.h deleted file mode 100644 index a0e3756..0000000 --- a/EmuAPI/reimp/BFEntityType.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef BFENTITYTYPE_H -#define BFENTITYTYPE_H - -#include -#include "INIReader.h" - -class BFEntityType { - public: - // char padding[288]; - int ncolors(); // 0x038 - int ncolors(int); // 0x038 - bool cIconZoom(); // 0x050 - bool cIconZoom(bool); // 0x050 - bool cExpansionID(); // 0x054 maybe int? - bool cExpansionID(bool); // 0x054 - bool cMovable(); // 0x055 - bool cMovable(bool); // 0x055 - bool walkable(); // 0x056 - bool walkable(bool); // 0x056 - bool walkableByTall(); // 0x057 - bool walkableByTall(bool); // 0x057 - bool cRubbleable(); // 0x059 - bool cRubbleable(bool); // 0x059 - bool cUseNumbersInName(); // 0x05B - bool cUseNumbersInName(bool); // 0x05B - bool cUsesRealShadows(); // 0x05C - bool cUsesRealShadows(bool); // 0x05C - bool cHasShadowImages(); // 0x05D - bool cHasShadowImages(bool); // 0x05D - bool cForceShadowBlack(); // 0x05E - bool cForceShadowBlack(bool); // 0x05E - bool cDrawsLate(); // 0x060 <--- might need double checking, not available in canopies - bool cDrawsLate(bool); // 0x060 - bool cHeight(); // 0x064 - bool cHeight(bool); // 0x064 - bool cDepth(); // 0x068 - bool cDepth(bool); // 0x068 - bool cHasUnderwaterSection(); // 0x06C - bool cHasUnderwaterSection(bool); // 0x06C - bool cIsTransient(); // 0x06D - bool cIsTransient(bool); // 0x06D - bool cUsesPlacementCube(); // 0x06E - bool cUsesPlacementCube(bool); // 0x06E - bool cShow(); //0x06F - bool cShow(bool); //0x06F - int cHitThreshold(); // 0x070 - int cHitThreshold(int); // 0x070 - bool cAvoidEdges(); // 0x074 - bool cAvoidEdges(bool); // 0x074 - std::string typeName(); // 0x098 - std::string typeName(std::string); // 0x098 - std::string codename(); // 0x0A4 - std::string codename(std::string); // 0x0A4 - int cFootprintX(); //0x0B4 - int cFootprintX(int); //0x0B4 - int cFootprintY(); //0x0B8 - int cFootprintY(int); //0x0B8 - int cFootprintZ(); //0x0BC - int cFootprintZ(int); //0x0BC - int cPlacementFootprintX(); //0x0C0 - int cPlacementFootprintX(int); //0x0C0 - int cPlacementFootprintY(); //0x0C4 - int cPlacementFootprintY(int); //0x0C4 - int cPlacementFootprintZ(); //0x0C8 - int cPlacementFootprintZ(int); //0x0C8 - bool availableAtStartup(); //0x0CC - bool availableAtStartup(bool); //0x0CC - - BFEntityType(void* ptr) : thisptr(ptr) {}; - ~BFEntityType() {}; - - protected: - void* thisptr; -}; - -#endif // BFENTITYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFGameApp.cpp b/EmuAPI/reimp/BFGameApp.cpp deleted file mode 100644 index 6e918fe..0000000 --- a/EmuAPI/reimp/BFGameApp.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "BFGameApp.h" - - -void BFGameApp::init() { - // initialize instance of BFGameApp - // initialize detour function pointers - // EmuBase::callHook(0x0062075b, (DWORD)&); // from addCash -} - -DWORD BFGameApp::instance(DWORD offset) { - // return instance of BFGameApp - return (*((DWORD*)((LPVOID)0x00638148)) + offset); -} - -// not functional -void BFGameApp::incSimSpeed() { - // detour function for increasing simulation speed - // ZTGameMgr::shared_instance().incSimSpeed(); - // 0063088c - void* _thisptr = (void*)0x00638148; - - // char *cVar1 = (char*)(instance(0x442)); - // float *fVar2 = (float*)(instance(0x4e0)); - - // if (*cVar1 != '\0') { - // *fVar2 = *fVar2 + 0.1; - // } - - _incSimSpeed _ogincSimSpeed = (_incSimSpeed)0x00620745; - _ogincSimSpeed(_thisptr); -} \ No newline at end of file diff --git a/EmuAPI/reimp/BFGameApp.h b/EmuAPI/reimp/BFGameApp.h deleted file mode 100644 index 5f2d03f..0000000 --- a/EmuAPI/reimp/BFGameApp.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef BFGameApp_h -#define BFGameApp_h - -#include "EmuBase.h" - -typedef void (__thiscall *_incSimSpeed)(void*); - -class BFGameApp { - public: - void init(); - static DWORD instance(DWORD offset); - static void incSimSpeed(); -}; - -#endif \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.cpp b/EmuAPI/reimp/BFMap.cpp deleted file mode 100644 index f885cab..0000000 --- a/EmuAPI/reimp/BFMap.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "BFMap.h" -#include "EmuBase.h" -#include "detours.h" - -DWORD originalGenerateMapAdd = 0x00452e13; -DWORD setMapDimensionsAdd = 0x004c84d3; -DWORD computeTilesAdd = 0x004af165; - -void BFMap::init() { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - // DetourAttach((PVOID*)generateMapAdd, (PVOID)&BFMap::generateMap); - // DetourAttach((PVOID*)&originalGenerateMapAdd, (PVOID)BFMap::generateMap); - // DetourAttach((PVOID*)&setMapDimensionsAdd, (PVOID)&BFMap::setMapDimensions); - DetourAttach((PVOID*)&computeTilesAdd, (PVOID)&BFMap::computeTiles); - DetourTransactionCommit(); - - EmuBase::callHook(0x005bc4b4, (DWORD)&BFMap::computeTiles); - -} - -// not working -void BFMap::generateMap(void* a2, int a3, int a4, char a5) { - ogGenerateMap original = (ogGenerateMap)originalGenerateMapAdd; - return original(a2, a3, a4, a5); -} - -void BFMap::setMapDimensions(void* a2, int a3, int a4, bool a5) { - ogSetMapDimensions original = (ogSetMapDimensions)setMapDimensionsAdd; - // a3 = 200; - // a4 = 200; - original(a2, a3, a4, a5); -} - -void __fastcall BFMap::computeTiles(void* a2) { - ogComputeTiles original = (ogComputeTiles)computeTilesAdd; - original(a2); -} \ No newline at end of file diff --git a/EmuAPI/reimp/BFMap.h b/EmuAPI/reimp/BFMap.h deleted file mode 100644 index f98d931..0000000 --- a/EmuAPI/reimp/BFMap.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef BFMAP_H -#define BFMAP_H - -typedef void (__thiscall *ogGenerateMap)(void*, int, int, char); -typedef void (*ogSetMapDimensions)(void*, int, int, bool); -typedef void (__thiscall *ogComputeTiles)(void*); - -class BFMap { - public: - static void init(); - static void generateMap(void*, int, int, char); - static void setMapDimensions(void*, int, int, bool); - static void __fastcall computeTiles(void*); -}; - -#endif // BFMAP_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFOverlayType.h b/EmuAPI/reimp/BFOverlayType.h deleted file mode 100644 index 21e0334..0000000 --- a/EmuAPI/reimp/BFOverlayType.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef BFOVERLAYTYPE_H -#define BFOVERLAYTYPE_H - -#include "BFEntityType.h" - -// size: 288 -// no difference in size to BFEntityType - -class BFOverlayType : public BFEntityType { - public: - BFOverlayType(); - ~BFOverlayType(); -}; - -#endif // BFOVERLAYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/BFUIMgr.cpp b/EmuAPI/reimp/BFUIMgr.cpp deleted file mode 100644 index a1b997c..0000000 --- a/EmuAPI/reimp/BFUIMgr.cpp +++ /dev/null @@ -1,51 +0,0 @@ - -#include "BFUIMgr.h" - - -BFUIMgr::BFUIMgr() { - // constructor -} - -BFUIMgr::~BFUIMgr() { - // destructor -} - -// int __cdecl BFUIMgr::__getElement(void* pThis, int param_1) { - -// _getElement _getElementAdd = (_getElement)0x0040157d; -// return _getElementAdd(pThis, param_1); -// } - -void* BFUIMgr::getElement(int param_1) { - _getElement _oggetElement = (_getElement)0x0040157d; - - return _oggetElement(BFUIMgr::getUIMgr(), param_1); -} - -int BFUIMgr::confirmDialog(void* pThis, char param_1, int param_2, int param_3, std::string param_4, char param_5, char param_6, int param_7, int param_8) { - _confirmDialog _ogconfirmDialog = (_confirmDialog)0x004fff2c; - return _ogconfirmDialog(pThis, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8); -} - -void BFUIMgr::clickSave() { - //if (*(BFUIMgr::getElement(1502)) & 2 == 0) { - // click save button - if (ZTUI::gameopts::saveGame() != 0) { - BFUIMgr::getElement(5); - } - //} -} - -void* BFUIMgr::getUIMgr() { - return (void*)0x00638de0;; -} - -DWORD BFUIMgr::getOffset(DWORD offset) { - return (*((DWORD*)((LPVOID)0x00638de0)) + offset); -} - -void BFUIMgr::setControlForeColor(void* ptr, int param_1, ZTUI::main::rgb color) { - _setControlForeColor og_setControlForeColor = (_setControlForeColor)0x0040ee08; - - og_setControlForeColor(ptr, param_1, color); -} \ No newline at end of file diff --git a/EmuAPI/reimp/BFUIMgr.h b/EmuAPI/reimp/BFUIMgr.h deleted file mode 100644 index ba7148a..0000000 --- a/EmuAPI/reimp/BFUIMgr.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef BFUIMGR_h -#define BFUIMGR_h -#include -#include "ZTUI.h" - -typedef void (__thiscall *_setControlForeColor)(void*, int, ZTUI::main::rgb); // define original BFUIMgrSetControlForeColor function -typedef int (__thiscall *_confirmDialog)(void*, char, int, int, std::string, char, char, int, int); // define original BFUIMgrConfirmDialog function - -class BFUIMgr { - public: - BFUIMgr(); - ~BFUIMgr(); - char padding[170]; // assumption on size. constructor not yet found. - static void* getElement(int); - static int __cdecl __getElement(void* pThis, int param_1); - static void clickSave(); - static void* getUIMgr(); - static DWORD getOffset(DWORD); - static void setControlForeColor(void*, int, ZTUI::main::rgb); - static int confirmDialog(void*, char, int, int, std::string, char, char, int, int); - - - // static BFUIMgr &shared_instance() { - // static BFUIMgr instance; - // return instance; - // } -}; - -typedef void* (__thiscall *_getElement)(void*, int); // define original getElement function - - -#endif /* BFUIMgr_h */ \ No newline at end of file diff --git a/EmuAPI/reimp/BFUnitType.h b/EmuAPI/reimp/BFUnitType.h deleted file mode 100644 index 37ea318..0000000 --- a/EmuAPI/reimp/BFUnitType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef BFUNITTYPE_H -#define BFUNITTYPE_H - -#include "BFEntityType.h" - -class BFUnitType : public BFEntityType { - public: - char padding[176]; // 464 - BFUnitType(); - ~BFUnitType(); -}; - -#endif // BFUNITTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/UIMessageQueue.h b/EmuAPI/reimp/UIMessageQueue.h deleted file mode 100644 index a3ecd1c..0000000 --- a/EmuAPI/reimp/UIMessageQueue.h +++ /dev/null @@ -1,5 +0,0 @@ -class UIMessageQueue { - UIMessageQueue(); - ~UIMessageQueue(); - char padding[200]; // assumption on size from 0x511054 -}; \ No newline at end of file diff --git a/EmuAPI/reimp/ZTAmbientType.h b/EmuAPI/reimp/ZTAmbientType.h deleted file mode 100644 index 09c4a4b..0000000 --- a/EmuAPI/reimp/ZTAmbientType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTAMBIENTTYPE_H -#define ZTAMBIENTTYPE_H - -#include "BFOverlayType.h" - -class ZTAmbientType : public BFOverlayType { - public: - char padding[12]; // 300 - ZTAmbientType(); - ~ZTAmbientType(); -}; - -#endif // ZTAMBIENTTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTAnimalType.h b/EmuAPI/reimp/ZTAnimalType.h deleted file mode 100644 index 1338ad9..0000000 --- a/EmuAPI/reimp/ZTAnimalType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTANIMALTYPE_H -#define ZTANIMALTYPE_H - -#include "ZTUnitType.h" - -class ZTAnimalType : public ZTUnitType { - public: - char padding[324]; // 864 - ZTAnimalType(); - ~ZTAnimalType(); -}; - -#endif // ZTANIMALTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTApp.cpp b/EmuAPI/reimp/ZTApp.cpp deleted file mode 100644 index fb12b63..0000000 --- a/EmuAPI/reimp/ZTApp.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "ZTApp.h" -#include "EmuBase.h" -#include "BFUIMgr.h" - -void ZTApp::init() { - EmuBase::callHook(0x004f0b72, (DWORD)&ZTApp::handleKeyDown); // from addCash -} - -void ZTApp::handleKeyDown(int key) { - // handle key down event - _handleKeyDown _oghandleKeyDown = (_handleKeyDown)0x004f0b72; - _oghandleKeyDown(key); -} - -void ZTApp::emuKeysHandleKeyDown(int key) { - - // if (key == 0x11) { - // EmuBase::setCtrlPressed(true); - // } - // // CTRL + T - for testing - // if (EmuBase::DoubleKey(0x11, 0x54) == true) { - // // BFUIMgr::shared_instance().getElement(0x3f8); - // BFUIMgr::clickSave(); - - // // std::ofstream f; - // // f.open("getelement.log", std::ios_base::app); - // // f << "x: " << x << std::endl; - // // f.close(); - // } - - - // //---- CTRL + J - // if (EmuBase::DoubleKey(0x11, 0x4A) == true && IsConsoleRunning == false && HasConsoleOpenedOnce == false) { - // // f << "[" << timestamp << "] " << "Opening console..." << std::endl; - // IsConsoleRunning = true; - // HANDLE thread = CreateThread(NULL, 0, &ZooConsole, NULL, 0, NULL); - // // f << "[" << timestamp << "] " << "Console opened!" << std::endl; - // CloseHandle(thread); - // } - - // //---- CTRL + M - // if (EmuBase::DoubleKey(0x11, 0x4D) == true && !ctrlMPressed) { - // ctrlMPressed = true; // Set the flag - // float mo_money = 1000000.00f; - // ZooState::AddToZooBudget(mo_money); - // } else if (EmuBase::DoubleKey(0x11, 0x4D) == false) { - // ctrlMPressed = false; // Reset the flag when the key is released - // } - -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTApp.h b/EmuAPI/reimp/ZTApp.h deleted file mode 100644 index 9e0a90d..0000000 --- a/EmuAPI/reimp/ZTApp.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef ZTAPP_H -#define ZTAPP_H - -#include - -typedef void (__cdecl *_handleKeyDown)(int); // define original handleKeyDown function - -class ZTApp -{ -public: - static void init(); - static void handleKeyDown(int); - static void emuKeysHandleKeyDown(int); -}; - -#endif /* ZTAPP_H */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTBuildingType.cpp b/EmuAPI/reimp/ZTBuildingType.cpp deleted file mode 100644 index 97f70d9..0000000 --- a/EmuAPI/reimp/ZTBuildingType.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "ZTBuildingType.h" -#include // must always be above detours.h - diff --git a/EmuAPI/reimp/ZTBuildingType.h b/EmuAPI/reimp/ZTBuildingType.h deleted file mode 100644 index 20b4363..0000000 --- a/EmuAPI/reimp/ZTBuildingType.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef ZTBUILDINGTYPE_H -#define ZTBUILDINGTYPE_H - -#include "ZTSceneryType.h" -#include - -class ZTBuildingType : public ZTSceneryType { - public: - ZTBuildingType(void* ptr) : ZTSceneryType(ptr) {}; -}; - -#endif // ZTBUILDINGTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTCheats.cpp b/EmuAPI/reimp/ZTCheats.cpp deleted file mode 100644 index 6752ac0..0000000 --- a/EmuAPI/reimp/ZTCheats.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "ZTCheats.h" -#include "ZTWorldMgr.h" -#include "ZTGuest.h" -#include "ZTUI.h" - -void ZTCheats::InvisibleInvincibleCheat() { - if (ZTUI::general::getSelectedEntity() == 0) { - return; - } - if (ZTGuest::getSelectedGuestName() == "Mrs. Invis") { - int ids[] = {9313, 9314, NULL}; - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); - ZTWorldMgr::makeInvisible(entities, false); - } else if (ZTGuest::getSelectedGuestName() == "Mr. Show") { - int ids[] = {9313, 9314, NULL}; - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(ids); - ZTWorldMgr::makeInvisible(entities, true); - } -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTCheats.h b/EmuAPI/reimp/ZTCheats.h deleted file mode 100644 index e413683..0000000 --- a/EmuAPI/reimp/ZTCheats.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef ZTCHEATS_H -#define ZTCHEATS_H - -class ZTCheats { - public: - static void InvisibleInvincibleCheat(); - -}; - -#endif // ZTCHEATS_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTFenceType.cpp b/EmuAPI/reimp/ZTFenceType.cpp deleted file mode 100644 index 854258a..0000000 --- a/EmuAPI/reimp/ZTFenceType.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "ZTFenceType.h" -#include -#include // must always be above detours.h - -bool ZTFenceType::cIsShowFence() { - return *(bool*)((DWORD)this->thisptr + 0x06F); -} - -bool ZTFenceType::cIsShowFence(bool input) { - *(bool*)((DWORD)this->thisptr + 0x06F) = input; - return input; -} - -int ZTFenceType::cStrength() { - return *(int*)((DWORD)this->thisptr + 0x168); -} - -int ZTFenceType::cStrength(int input) { - *(int*)((DWORD)this->thisptr + 0x168) = input; - return input; -} - -int ZTFenceType::cLife() { - return *(int*)((DWORD)this->thisptr + 0x16C); -} - -int ZTFenceType::cLife(int input) { - *(int*)((DWORD)this->thisptr + 0x16C) = input; - return input; -} - -int ZTFenceType::cDecayedLife() { - return *(int*)((DWORD)this->thisptr + 0x170); -} - -int ZTFenceType::cDecayedLife(int input) { - *(int*)((DWORD)this->thisptr + 0x170) = input; - return input; -} - -int ZTFenceType::cDecayedDelta() { - return *(int*)((DWORD)this->thisptr + 0x174); -} - -int ZTFenceType::cDecayedDelta(int input) { - *(int*)((DWORD)this->thisptr + 0x174) = input; - return input; -} - -int ZTFenceType::cBreakSoundAtten() { - return *(int*)((DWORD)this->thisptr + 0x178); -} - -int ZTFenceType::cBreakSoundAtten(int input) { - *(int*)((DWORD)this->thisptr + 0x178) = input; - return input; -} - -int ZTFenceType::cOpenSoundAtten() { - return *(int*)((DWORD)this->thisptr + 0x17C); -} - -int ZTFenceType::cOpenSoundAtten(int input) { - *(int*)((DWORD)this->thisptr + 0x17C) = input; - return input; -} - -std::string ZTFenceType::cBreakSound() { - return *(std::string*)((DWORD)this->thisptr + 0x184); -} - -std::string ZTFenceType::cBreakSound(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x184) = input; - return input; -} - -std::string ZTFenceType::cOpenSound() { - return *(std::string*)((DWORD)this->thisptr + 0x188); -} - -std::string ZTFenceType::cOpenSound(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x188) = input; - return input; -} - -bool ZTFenceType::cSeeThrough() { - return *(bool*)((DWORD)this->thisptr + 0x194); -} - -bool ZTFenceType::cSeeThrough(bool input) { - *(bool*)((DWORD)this->thisptr + 0x194) = input; - return input; -} - -bool ZTFenceType::cIsJumpable() { - return *(bool*)((DWORD)this->thisptr + 0x195); -} - -bool ZTFenceType::cIsJumpable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x195) = input; - return input; -} - -bool ZTFenceType::cIsClimbable() { - return *(bool*)((DWORD)this->thisptr + 0x196); -} - -bool ZTFenceType::cIsClimbable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x196) = input; - return input; -} - -bool ZTFenceType::cIndestructable() { - return *(bool*)((DWORD)this->thisptr + 0x197); -} - -bool ZTFenceType::cIndestructable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x197) = input; - return input; -} - -bool ZTFenceType::cIsElectrified() { - return *(bool*)((DWORD)this->thisptr + 0x198); -} - -bool ZTFenceType::cIsElectrified(bool input) { - *(bool*)((DWORD)this->thisptr + 0x198) = input; - return input; -} - -bool ZTFenceType::cNoDrawWater() { - return *(bool*)((DWORD)this->thisptr + 0x199); -} - -bool ZTFenceType::cNoDrawWater(bool input) { - *(bool*)((DWORD)this->thisptr + 0x199) = input; - return input; -} diff --git a/EmuAPI/reimp/ZTFenceType.h b/EmuAPI/reimp/ZTFenceType.h deleted file mode 100644 index 03e0a78..0000000 --- a/EmuAPI/reimp/ZTFenceType.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef ZTFENCETYPE_H -#define ZTFENCETYPE_H - -#include "ZTSceneryType.h" - -class ZTFenceType : public ZTSceneryType { - public: - // char padding[32]; // 324 - bool cIsShowFence(); // 0x06F - bool cIsShowFence(bool); // 0x06F - int cStrength(); // 0x168 - int cStrength(int); // 0x168 - int cLife(); // 0x16C - int cLife(int); // 0x16C - int cDecayedLife(); // 0x170 - int cDecayedLife(int); // 0x170 - int cDecayedDelta(); // 0x174 - int cDecayedDelta(int); // 0x174 - int cBreakSoundAtten(); // 0x178 - int cBreakSoundAtten(int); // 0x178 - int cOpenSoundAtten(); // 0x17C - int cOpenSoundAtten(int); // 0x17C - std::string cBreakSound(); // 0x184 - std::string cBreakSound(std::string); // 0x184 - std::string cOpenSound(); // 0x188 - std::string cOpenSound(std::string); // 0x188 - bool cSeeThrough(); // 0x194 - bool cSeeThrough(bool); // 0x194 - bool cIsJumpable(); // 0x195 - bool cIsJumpable(bool); // 0x195 - bool cIsClimbable(); // 0x196 - bool cIsClimbable(bool); // 0x196 - bool cIndestructable(); // 0x197 - bool cIndestructable(bool); // 0x197 - bool cIsElectrified(); // 0x198 - bool cIsElectrified(bool); // 0x198 - bool cNoDrawWater(); // 0x199 - bool cNoDrawWater(bool); // 0x199 - ZTFenceType(void* ptr) : ZTSceneryType(ptr) {}; - ~ZTFenceType(); -}; - -#endif // ZTFENCETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTFoodType.h b/EmuAPI/reimp/ZTFoodType.h deleted file mode 100644 index ce4eb4a..0000000 --- a/EmuAPI/reimp/ZTFoodType.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ZTFOODTYPE_H -#define ZTFOODTYPE_H - -#include "ZTSceneryType.h" - -// no difference in byte space between ZTSceneryType and ZTFoodType - -class ZTFoodType : public ZTSceneryType { - public: - ZTFoodType(); - ~ZTFoodType(); -}; - -#endif // ZTFOODTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGameMgr.cpp b/EmuAPI/reimp/ZTGameMgr.cpp deleted file mode 100644 index 107f238..0000000 --- a/EmuAPI/reimp/ZTGameMgr.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include "ZTGameMgr.h" -#include - -ZTGameMgr::ZTGameMgr() { - // constructor - this->zoo_budget = 0.0; - this->num_animals = 0; - this->num_species = 0; - this->guest_count = 0; - - // initialize detour function pointers - -} - -void ZTGameMgr::init() { - // initialize instance of ZTGameMgr - // initialize detour function pointers - DWORD addCashAddress = 0x40f018; // address of addCash function in the game - DWORD getDateAddress = 0x0040e7e0; // address of getDate function in the game - DWORD getStartMenuMusicAddress = 0x004bded9; // address of startMenuMusic function in the game - DWORD setAnimalRatingAddress = 0x0041D08B; - DWORD setZooRatingAddress = 0x0041D22F; - DWORD setGuestRatingAddress = 0x0041D15D; - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - // DetourAttach((PVOID*)&addCashAddress, (PVOID)&ZTGameMgr::addCash_Detour); - //------ Detour update function to run emu and sync with main game thread - // DetourAttach((PVOID*)&setAnimalRatingAddress, (PVOID)&SetAnimalRating); - // DetourAttach((PVOID*)&setZooRatingAddress, (PVOID)&SetZooRating); - // DetourAttach((PVOID*)&setGuestRatingAddress, (PVOID)&SetGuestRating); - DetourTransactionCommit(); - // DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); - // ZTGameMgr::shared_instance() = *(ZTGameMgr*)(_ztGameMgr); - - // EmuBase::callHook(0x0050A245, (DWORD)&ZTGameMgr::addCash_Detour); // from removeEntityFromMap - // EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::fGrantDonation - // EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 - // EmuBase::callHook(0x0060cccd, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433ae0 - // EmuBase::callHook(0x00613f61, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 433b00 - // EmuBase::callHook(0x006089fc, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x40f018::meth_0x6089e8 - // EmuBase::callHook(0x00607299, (DWORD)&ZTGameMgr::addCash_Detour); // from georgeW - // EmuBase::callHook(0x0060d9d3, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 0060d8e3 - // EmuBase::callHook(0x005b0f2d, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at 005b0f17 - // EmuBase::callHook(0x005a1679, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTScenarioSimpleGoal::trigger03 - // EmuBase::callHook(0x004f7031, (DWORD)&ZTGameMgr::addCash_Detour); // from unknown fn at cls_0x41f881::meth_0x4f6e3c - // EmuBase::callHook(0x004d920f , (DWORD)&ZTGameMgr::addCash_Detour); // from ZTMapView::placeEntityOnMap - // EmuBase::callHook(0x004a2f97, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTGameMgr::removedZooDoo - // EmuBase::callHook(0x00484047, (DWORD)&ZTGameMgr::addCash_Detour); // from ZooStatus::financeChecks - // EmuBase::callHook(0x0042ec81, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTHabitat::acceptDonation - // EmuBase::callHook(0x0042d93f, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::removeUser - // EmuBase::callHook(0x005a981c, (DWORD)&ZTGameMgr::addCash_Detour); // from ZTBuilding::addUser - - // EmuBase::callHook(0x004cb64f, (DWORD)&ZTGameMgr::setCash_Detour); // from showMapSelect - // EmuBase::callHook(0x006163ab, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashUp - // EmuBase::callHook(0x0061640d, (DWORD)&ZTGameMgr::setCash_Detour); // from clickCashDown - // EmuBase::callHook(0x006165ce, (DWORD)&ZTGameMgr::setCash_Detour); // from editStartingCash - - - - // EmuBase::callHook(0x0041f284, (DWORD)&ZTGameMgr::subtractCash_Detour); // from ZTResearchBranch::update <--- crashes, not sure why - // EmuBase::callHook(0x0041f304, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0041f304 <--- crashes, not sure why - // // EmuBase::callHook(0x00469281, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 00469281 - // // EmuBase::callHook(0x0046944c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0046944c - // // EmuBase::callHook(0x004702e3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 004702e3 - // // EmuBase::callHook(0x0047c043, (DWORD)&ZTGameMgr::subtractCash_Detour); // from unknown fn at 0047c043 - // // EmuBase::callHook(0x004841a3, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks - // // EmuBase::callHook(0x00484230, (DWORD)&ZTGameMgr::subtractCash_Detour); // from financeChecks - // // EmuBase::callHook(0x00488e9d, (DWORD)&ZTGameMgr::subtractCash_Detour); // from fn at virt_meth_0x4da252:00488e9d - // // EmuBase::callHook(0x0048a021, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x489fcd - // // EmuBase::callHook(0x0048f76c, (DWORD)&ZTGameMgr::subtractCash_Detour); // from virt_meth_0x48f624 - // // EmuBase::callHook(0x0049befe, (DWORD)&ZTGameMgr::subtractCash_Detour); // from meth_0x49bec7 - // // EmuBase::callHook(0x004a099a, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - // // EmuBase::callHook(0x004d8eda, (DWORD)&ZTGameMgr::subtractCash_Detour); // from placeEntityOnMap - // // EmuBase::callHook(0x004deb1b, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_005b6710 - // // EmuBase::callHook(0x004efd66, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - // // EmuBase::callHook(0x005ce004, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - // // EmuBase::callHook(0x005ce042, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - // // EmuBase::callHook(0x005ce068, (DWORD)&ZTGameMgr::subtractCash_Detour); // from removeEntityFromMap - // // EmuBase::callHook(0x00611666, (DWORD)&ZTGameMgr::subtractCash_Detour); // from FUN_006115f2 - - -} - -// void ZTGameMgr::addCash(float amount) { -// // add cash to the game -// this->zoo_budget += amount; -// ZTUI::main::setMoneyText(); // update money text in the UI -// } - -// void ZTGameMgr::subtractCash(float amount) { -// // subtract cash from the game -// this->zoo_budget -= amount; -// ZTUI::main::setMoneyText(); // update money text in the UI -// } - -// void ZTGameMgr::startMenuMusic() { -// // start the menu music -// _startMenuMusic _ogstartMenuMusic = (_startMenuMusic)0x004bded9; -// _ogstartMenuMusic(pZTGameMgr); -// } - -DWORD ZTGameMgr::getZTGameMgr() { - // get the instance of ZTGameMgr - DWORD _ztGameMgr = *(DWORD*)((LPVOID)0x00638048); - return *(DWORD*)(_ztGameMgr); -} - -_FILETIME* ZTGameMgr::getDate_Detour(void* ptr, _FILETIME* date) { - // detour function for getting the current date from the game - return ZTGameMgr::shared_instance().getDate(date); -} - -// void ZTGameMgr::subtractCash_Detour(void* ptr, float amount) { -// // detour function for subtracting cash from the game -// ZTGameMgr::shared_instance().subtractCash(amount); -// } - -void ZTGameMgr::setCash_Detour(int amount) { - // detour function for setting cash in the game - // Log the amount of cash being set - std::ofstream logfile("cash.txt", std::ios::app); - if (logfile.is_open()) { - logfile << "Setting cash to: " << amount << std::endl; - logfile.close(); - } - - ZTGameMgr::shared_instance().setCash(amount); -} - -void ZTGameMgr::setCash(int amount) { - _setCash _ogsetCash = (_setCash)0x004cb384; - _ogsetCash(amount); -} - -// void __fastcall ZTGameMgr::addCash_Detour(void* ptr, float amount) { -// // detour function for adding cash to the game -// ZTGameMgr::shared_instance().addCash(amount); -// } - - -ZTGameMgr::~ZTGameMgr() { - // destructor - // clean up detour function pointers -} - -// address: 0x0040e7e0. _FILETIME* return value likely incorrect. -// game has it as a long long, which would have been the same number of bytes as a FILETIME -_FILETIME* ZTGameMgr::getDate(_FILETIME* date) { - SystemTimeToFileTime(¤t_date, date); - return date; -} - -typedef void (__cdecl *_setAnimalRating)(int); // define original setAnimalRating function -typedef void (__cdecl *_setZooRating)(int); // define original setZooRating function -typedef void (__cdecl *_setGuestRating)(int); // define original setGuestRating function - - -// void __cdecl SetGuestRating(int rating) { -// _setGuestRating ogSetGuestRating = (_setGuestRating)0x0041D15D; -// if (zoo_models->_emuGuestRatingSet == true) { -// rating = zoo_models->_guestRating; -// } -// ogSetGuestRating(rating); -// } - -// void __cdecl SetZooRating(int rating) { -// _setZooRating ogSetZooRating = (_setZooRating)0x0041D22F; -// if (zoo_models->_emuZooRatingSet == true) { -// rating = zoo_models->_zooRating; -// } -// ogSetZooRating(rating); -// } - -// void __cdecl SetAnimalRating(int rating) { -// _setAnimalRating ogSetAnimalRating = (_setAnimalRating)0x0041D08B; -// if (zoo_models->_emuAnimalRatingSet == true) { -// rating = zoo_models->_animalRating; -// } -// ogSetAnimalRating(rating); -// } diff --git a/EmuAPI/reimp/ZTGameMgr.h b/EmuAPI/reimp/ZTGameMgr.h deleted file mode 100644 index a7e5eeb..0000000 --- a/EmuAPI/reimp/ZTGameMgr.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef ZTGAMEMGR_h -#define ZTGAMEMGR_h - -#include // must always be above detours.h -#include -#include "EmuBase.h" -#include "BFUIMgr.h" - -typedef __int32 int32_t; -typedef void (__thiscall *_addCash)(void* thisptr, float amount); // define original addCash function -typedef void (__cdecl *_setCash)(int); // define original setCash function -typedef void (__fastcall *_startMenuMusic)(void*); // define original startMenuMusic function - -struct GXRGB { - int r; - int g; - int b; -}; - -class ZTGameMgr -{ - class MenuMusicHandler - { - // 20 bytes - void update(unsigned int); // 0x41a13a - - }; -public: - char pad_0004[12]; - float zoo_budget; //0x000C - char pad_0010[32]; //0x0010 - int num_animals; //0x0030 - char pad_0034[4]; //0x0034 - int num_species; //0x0038 - char pad_003C[24]; //0x003C - int guest_count; //0x0054 - char pad_0058[364]; //0x0058 - float animal_purchase_costs[12]; //0x01C4 - float construction_costs[12]; //0x01F4 - char pad_0224[48]; //0x0224 - float admissions_income[12]; //0x0254 - float concessions_benefits[12]; //0x0284 - char pad_02B4[336]; //0x02B4 - float zoo_profits[12]; //0x0404 - float zoo_values[12]; //0x0434 - float zoo_ratings[12]; //0x0464 - char pad_0494[384]; //0x0494 - float number_of_guests[12]; //0x0614 - char pad_0644[2928]; //0x0644 TODO: subtract current date - SYSTEMTIME current_date; //0x1194 (8 bytes) - // virtual ~ZTGameMgr(); - // virtual void setNewGameDefaults(void*, char) {}; - // virtual void save(char**) {}; - // virtual void load() {}; - // virtual void update(int) {}; - // virtual void updateSim(unsigned int) {}; - - ZTGameMgr(); - ~ZTGameMgr(); - void addCash(float); - void setCash(int); - void subtractCash(float); - _FILETIME* getDate(_FILETIME* date); - void startMenuMusic(); // 0x004bded9 - void startMenuMusicFade(int); // 0x004cc59d - unsigned int save(char**); // 0x47acc5 - void setNewGameDefaults(void*, char); // 0x0058f39c - void stop(int); // 0x004fa123 - - - - static _FILETIME* __fastcall getDate_Detour(void* ptr, _FILETIME* date); - static void __fastcall addCash_Detour(void* ptr, float amount); - static void __cdecl setCash_Detour(int amount); - static void __fastcall subtractCash_Detour(void* ptr, float amount); - static void __fastcall startMenuMusic_Detour(int param_1); - static void init(); - static DWORD getZTGameMgr(); - static ZTGameMgr &shared_instance() { - static ZTGameMgr instance; - return instance; - } -}; //Size: 0x10B4 4528 - -#endif // ZTGAMEMGR_h \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuest.cpp b/EmuAPI/reimp/ZTGuest.cpp deleted file mode 100644 index da48918..0000000 --- a/EmuAPI/reimp/ZTGuest.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "ZTGuest.h" -#include "ZTUI.h" - -std::string ZTGuest::getSelectedGuestName() { - void* selectedGuest = ZTUI::general::getSelectedEntity(); - - if (!selectedGuest) { - return "null"; - } - - char* startOfName = *reinterpret_cast(reinterpret_cast(selectedGuest) + 0x108); - char* endOfName = *reinterpret_cast(reinterpret_cast(selectedGuest) + 0x10C); - - size_t nameLength = endOfName - startOfName; - - return std::string(startOfName, nameLength); -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuest.h b/EmuAPI/reimp/ZTGuest.h deleted file mode 100644 index 948c834..0000000 --- a/EmuAPI/reimp/ZTGuest.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef ZTGUEST_H -#define ZTGUEST_H - -#include - -class ZTGuest { - public: - static void init(); - static std::string getSelectedGuestName(); -}; - -#endif // ZTGUEST_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuestType.h b/EmuAPI/reimp/ZTGuestType.h deleted file mode 100644 index fefc2f6..0000000 --- a/EmuAPI/reimp/ZTGuestType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTGUESTTYPE_H -#define ZTGUESTTYPE_H - -#include "ZTUnitType.h" - -class ZTGuestType : public ZTUnitType { - public: - char padding[216]; // 756 - ZTGuestType(); - ~ZTGuestType(); -}; - -#endif // ZTGUESTTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTGuideType.h b/EmuAPI/reimp/ZTGuideType.h deleted file mode 100644 index 4755762..0000000 --- a/EmuAPI/reimp/ZTGuideType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTGUIDETYPE_H -#define ZTGUIDETYPE_H - -#include "ZTStaffType.h" - -class ZTGuideType : public ZTStaffType { - public: - char padding[24]; // 624 - ZTGuideType(); - ~ZTGuideType(); -}; - -#endif // ZTGUIDETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTHabitatMgr.cpp b/EmuAPI/reimp/ZTHabitatMgr.cpp deleted file mode 100644 index 496df5b..0000000 --- a/EmuAPI/reimp/ZTHabitatMgr.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "ZTHabitatMgr.h" - -ZTHabitatMgr::ZTHabitatMgr() { - // constructor -} - -ZTHabitatMgr::~ZTHabitatMgr() { - // destructor -} - diff --git a/EmuAPI/reimp/ZTHabitatMgr.h b/EmuAPI/reimp/ZTHabitatMgr.h deleted file mode 100644 index 8a35333..0000000 --- a/EmuAPI/reimp/ZTHabitatMgr.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef ZT_HABITATMGR_H -#define ZT_HABITATMGR_H - -class ZTHabitatMgr { -public: - ZTHabitatMgr(); - ~ZTHabitatMgr(); - char padding[112]; // assumption on size. constructor not yet found. - static ZTHabitatMgr &shared_instance() { - static ZTHabitatMgr instance; - return instance; - } -}; - -#endif // ZT_HABITATMGR_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTHelicopterType.h b/EmuAPI/reimp/ZTHelicopterType.h deleted file mode 100644 index 77e837d..0000000 --- a/EmuAPI/reimp/ZTHelicopterType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTHELICOPTERTYPE_H -#define ZTHELICOPTERTYPE_H - -#include "ZTStaffType.h" - -class ZTHelicopterType : public ZTStaffType { - public: - char padding[24]; // 624 - ZTHelicopterType(); - ~ZTHelicopterType(); -}; - -#endif // ZTHELICOPTERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTKeeperType.h b/EmuAPI/reimp/ZTKeeperType.h deleted file mode 100644 index 264656b..0000000 --- a/EmuAPI/reimp/ZTKeeperType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTKEEPERTYPE_H -#define ZTKEEPERTYPE_H - -#include "ZTStaffType.h" - -class ZTKeeperType : public ZTStaffType { - public: - char padding[24]; // 624 - ZTKeeperType(); - ~ZTKeeperType(); -}; - -#endif // ZTKEEPERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMainType.h b/EmuAPI/reimp/ZTMainType.h deleted file mode 100644 index 78a7099..0000000 --- a/EmuAPI/reimp/ZTMainType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTMAINTYPE_H -#define ZTMAINTYPE_H - -#include "ZTUnitType.h" - -class ZTMainType : public ZTUnitType { - public: - char padding[40]; // 640 - ZTMainType(); - ~ZTMainType(); -}; - -#endif // ZTMAINTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.cpp b/EmuAPI/reimp/ZTMapView.cpp deleted file mode 100644 index d6ba2b1..0000000 --- a/EmuAPI/reimp/ZTMapView.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "ZTMapView.h" -#include "ZTUI.h" -#include "BFUIMgr.h" -#include "detours.h" - -typedef void (__thiscall *_zoomMapWidgetCall)(void*); - -// ZTMapView::ZTMapView() { -// // constructor -// } - -// ZTMapView::~ZTMapView() { -// // destructor -// } - -void ZTMapView::init() { - // DWORD _clickZoomOut = 0x004b0779; - // DetourTransactionBegin(); - // DetourUpdateThread(GetCurrentThread()); - // DetourAttach((PVOID*)&_clickZoomOut, (PVOID)ZTMapView::clickZoomOut); - // DetourTransactionCommit(); -} - -void ZTMapView::zoomMap(int param_2) { - // zoom map - _zoomMap _ogzoomMap = (_zoomMap)0x004b072d; - _ogzoomMap(getMapView(), param_2); -} - -DWORD getOffset(DWORD offset) -{ - return (*((DWORD*)((LPVOID)0x00638068)) + offset); -} - -// Live version of the ZTMapView state -void* ZTMapView::getMapView() { - return (void*)0x00638068; -} - -// // // doesn't do anything yet -// void ZTMapView::clickZoomOut() { -// if (ZTMapView::getMapView() != 0 && ZTWorldMgr::getWorldMgr() != 0) { -// int* currentZoom = (int*)ZTWorldMgr::getOffset(0x14); -// int zoom = *currentZoom - 2; -// ZTMapView::zoomMap(zoom); -// void* uiElem = BFUIMgr::getElement(1007); -// _zoomMapWidgetCall func1 = (_zoomMapWidgetCall)0x0041914B; -// func1(uiElem); -// if (*currentZoom == -2) { -// uiElem = BFUIMgr::getElement(1023); -// _zoomMapWidgetCall func2 = (_zoomMapWidgetCall)0x00419191; -// func2(uiElem); -// } -// } - -// } - -void ZTMapView::clickZoomOut() { - _clickZoomOut _ogclickZoomOut = (_clickZoomOut)0x004b0779; - _ogclickZoomOut(); -} - -void ZTMapView::clickZoomIn() { - _clickZoomOut _ogclickZoomIn = (_clickZoomOut)0x004b081b; - _ogclickZoomIn(); -} - -void ZTMapView::rotateCW() { - _rotateCW _ogrotateCW = (_rotateCW)0x004b071a; - _ogrotateCW(); -} - -void ZTMapView::rotateCCW() { - _rotateCCW _ogrotateCCW = (_rotateCCW)0x00416cb7; - _ogrotateCCW(); -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTMapView.h b/EmuAPI/reimp/ZTMapView.h deleted file mode 100644 index f23801b..0000000 --- a/EmuAPI/reimp/ZTMapView.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef ZTMAPVIEW_H -#define ZTMAPVIEW_H - -#include "ZTWorldMgr.h" -#include "EmuBase.h" - -typedef void (__thiscall *_zoomMap)(void*, int); // define original zoomMap function -typedef void (__cdecl *_clickZoomOut)(); // define original clickZoomOut function -typedef void (__thiscall *_rotateCW)(); // define original rotateCW function -typedef void (__thiscall *_rotateCCW)(); // define original rotateCCW function - -class ZTMapView { - public: - char padding[1444]; - static ZTMapView &shared_instance() { - ZTMapView *ztmapview = reinterpret_cast(0x00511054); - static ZTMapView instance = *ztmapview; - return instance; - } - static void* getMapView(); - static void zoomMap(int); - static void clickZoomOut(); - static void clickZoomIn(); - static void rotateCW(); - static void rotateCCW(); - void static init(); -}; - -#endif // ZTMAPVIEW_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTPathType.h b/EmuAPI/reimp/ZTPathType.h deleted file mode 100644 index aa482a4..0000000 --- a/EmuAPI/reimp/ZTPathType.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ZTPATHTYPE_H -#define ZTPATHTYPE_H - -#include "ZTSceneryType.h" - -// size: 296 -// no difference from ZTSceneryType in byte space - -class ZTPathType : public ZTSceneryType { - public: - ZTPathType(void* ptr) : ZTSceneryType(ptr) {}; - ~ZTPathType(); - - -}; - -#endif // ZTPATHTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTRubbleType.h b/EmuAPI/reimp/ZTRubbleType.h deleted file mode 100644 index 42ea8d3..0000000 --- a/EmuAPI/reimp/ZTRubbleType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTRUBBLETYPE_H -#define ZTRUBBLETYPE_H - -#include "ZTSceneryType.h" - -class ZTRubbleType : public ZTSceneryType { - public: - char padding[12]; // 304 - ZTRubbleType(); - ~ZTRubbleType(); -}; - -#endif // ZTRUBBLETYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.cpp b/EmuAPI/reimp/ZTSceneryType.cpp deleted file mode 100644 index d4b73e2..0000000 --- a/EmuAPI/reimp/ZTSceneryType.cpp +++ /dev/null @@ -1,337 +0,0 @@ -#include "ZTSceneryType.h" -#include // must always be above detours.h - - -int ZTSceneryType::cPurchaseCost() { - return *(int*)((DWORD)this->thisptr + 0x100); -} - -int ZTSceneryType::cPurchaseCost(int input) { - *(int*)((DWORD)this->thisptr + 0x100) = input; - return input; -} - -int ZTSceneryType::cNameID() { - return *(int*)((DWORD)this->thisptr + 0x104); -} - -int ZTSceneryType::cNameID(int input) { - *(int*)((DWORD)this->thisptr + 0x104) = input; - return input; -} - -int ZTSceneryType::cHelpID() { - return *(int*)((DWORD)this->thisptr + 0x108); -} - -int ZTSceneryType::cHelpID(int input) { - *(int*)((DWORD)this->thisptr + 0x108) = input; - return input; -} - -int ZTSceneryType::cHabitat() { - return *(int*)((DWORD)this->thisptr + 0x10C); -} - -int ZTSceneryType::cHabitat(int input) { - *(int*)((DWORD)this->thisptr + 0x10C) = input; - return input; -} - -int ZTSceneryType::cLocation() { - return *(int*)((DWORD)this->thisptr + 0x110); -} - -int ZTSceneryType::cLocation(int input) { - *(int*)((DWORD)this->thisptr + 0x110) = input; - return input; -} - -int ZTSceneryType::cEra() { - return *(int*)((DWORD)this->thisptr + 0x114); -} - -int ZTSceneryType::cEra(int input) { - *(int*)((DWORD)this->thisptr + 0x114) = input; - return input; -} - -int ZTSceneryType::cMaxFoodUnits() { - return *(int*)((DWORD)this->thisptr + 0x118); -} - -int ZTSceneryType::cMaxFoodUnits(int input) { - *(int*)((DWORD)this->thisptr + 0x118) = input; - return input; -} - -// bool ZTSceneryType::cDeletable() { -// return *(bool*)((DWORD)this->thisptr + 0x119); -// } - -// bool ZTSceneryType::cDeletable(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x119) = input; -// return input; -// } - -bool ZTSceneryType::cStink() { - return *(bool*)((DWORD)this->thisptr + 0x11C); -} - -bool ZTSceneryType::cStink(bool input) { - *(bool*)((DWORD)this->thisptr + 0x11C) = input; - return input; -} - -int ZTSceneryType::cEstheticWeight() { - return *(int*)((DWORD)this->thisptr + 0x120); -} - -int ZTSceneryType::cEstheticWeight(int input) { - *(int*)((DWORD)this->thisptr + 0x120) = input; - return input; -} - -bool ZTSceneryType::cSelectable() { - return *(bool*)((DWORD)this->thisptr + 0x128); -} - -bool ZTSceneryType::cSelectable(bool input) { - *(bool*)((DWORD)this->thisptr + 0x128) = input; - return input; -} - -// bool ZTSceneryType::cDeletable() { -// return *(bool*)((DWORD)this->thisptr + 0x129); -// } - -// bool ZTSceneryType::cDeletable(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x129) = input; -// return input; -// } - -bool ZTSceneryType::cFoliage() { - return *(bool*)((DWORD)this->thisptr + 0x12A); -} - -bool ZTSceneryType::cFoliage(bool input) { - *(bool*)((DWORD)this->thisptr + 0x12A) = input; - return input; -} - -// bool ZTSceneryType::cAutoRotate() { -// return *(bool*)((DWORD)this->thisptr + 0x12D); -// } - -// bool ZTSceneryType::cAutoRotate(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x12D) = input; -// return input; -// } - -// bool ZTSceneryType::cLand() { -// return *(bool*)((DWORD)this->thisptr + 0x12E); -// } - -// bool ZTSceneryType::cLand(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x12E) = input; -// return input; -// } - -bool ZTSceneryType::cSwims() { - return *(bool*)((DWORD)this->thisptr + 0x12F); -} - -bool ZTSceneryType::cSwims(bool input) { - *(bool*)((DWORD)this->thisptr + 0x12F) = input; - return input; -} - -bool ZTSceneryType::cUnderwater() { - return *(bool*)((DWORD)this->thisptr + 0x130); -} - -bool ZTSceneryType::cUnderwater(bool input) { - *(bool*)((DWORD)this->thisptr + 0x130) = input; - return input; -} - -bool ZTSceneryType::cSurface() { - return *(bool*)((DWORD)this->thisptr + 0x131); -} - -bool ZTSceneryType::cSurface(bool input) { - *(bool*)((DWORD)this->thisptr + 0x131) = input; - return input; -} - - -// bool ZTSceneryType::cSelectable() { -// return *(bool*)((DWORD)this->thisptr + 0x128); -// } - -// bool ZTSceneryType::cSelectable(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x128) = input; -// return input; -// } - -// bool ZTSceneryType::cDeletable() { -// return *(bool*)((DWORD)this->thisptr + 0x129); -// } - -// bool ZTSceneryType::cDeletable(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x129) = input; -// return input; -// } - -// bool ZTSceneryType::cFoliage() { -// return *(bool*)((DWORD)this->thisptr + 0x12A); -// } - -// bool ZTSceneryType::cFoliage(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x12A) = input; -// return input; -// } - -bool ZTSceneryType::cAutoRotate() { - return *(bool*)((DWORD)this->thisptr + 0x12D); -} - -bool ZTSceneryType::cAutoRotate(bool input) { - *(bool*)((DWORD)this->thisptr + 0x12D) = input; - return input; -} - -bool ZTSceneryType::cLand() { - return *(bool*)((DWORD)this->thisptr + 0x12E); -} - -bool ZTSceneryType::cLand(bool input) { - *(bool*)((DWORD)this->thisptr + 0x12E) = input; - return input; -} - -// bool ZTSceneryType::cSwims() { -// return *(bool*)((DWORD)this->thisptr + 0x12F); -// } - -// bool ZTSceneryType::cSwims(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x12F) = input; -// return input; -// } - -// bool ZTSceneryType::cUnderwater() { -// return *(bool*)((DWORD)this->thisptr + 0x130); -// } - -// bool ZTSceneryType::cUnderwater(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x130) = input; -// return input; -// } - -// bool ZTSceneryType::cSurface() { -// return *(bool*)((DWORD)this->thisptr + 0x131); -// } - -// bool ZTSceneryType::cSurface(bool input) { -// *(bool*)((DWORD)this->thisptr + 0x131) = input; -// return input; -// } - -bool ZTSceneryType::cSubmerge() { - return *(bool*)((DWORD)this->thisptr + 0x132); -} - -bool ZTSceneryType::cSubmerge(bool input) { - *(bool*)((DWORD)this->thisptr + 0x132) = input; - return input; -} - -bool ZTSceneryType::cOnlySwims() { - return *(bool*)((DWORD)this->thisptr + 0x133); -} - -bool ZTSceneryType::cOnlySwims(bool input) { - *(bool*)((DWORD)this->thisptr + 0x133) = input; - return input; -} - -bool ZTSceneryType::cNeedsConfirm() { - return *(bool*)((DWORD)this->thisptr + 0x134); -} - -bool ZTSceneryType::cNeedsConfirm(bool input) { - *(bool*)((DWORD)this->thisptr + 0x134) = input; - return input; -} - -bool ZTSceneryType::cGawkOnlyFromFront() { - return *(bool*)((DWORD)this->thisptr + 0x135); -} - -bool ZTSceneryType::cGawkOnlyFromFront(bool input) { - *(bool*)((DWORD)this->thisptr + 0x135) = input; - return input; -} - -bool ZTSceneryType::cDeadOnLand() { - return *(bool*)((DWORD)this->thisptr + 0x136); -} - -bool ZTSceneryType::cDeadOnLand(bool input) { - *(bool*)((DWORD)this->thisptr + 0x136) = input; - return input; -} - -bool ZTSceneryType::cDeadOnFlatWater() { - return *(bool*)((DWORD)this->thisptr + 0x137); -} - -bool ZTSceneryType::cDeadOnFlatWater(bool input) { - *(bool*)((DWORD)this->thisptr + 0x137) = input; - return input; -} - -bool ZTSceneryType::cDeadUnderwater() { - return *(bool*)((DWORD)this->thisptr + 0x138); -} - -bool ZTSceneryType::cDeadUnderwater(bool input) { - *(bool*)((DWORD)this->thisptr + 0x138) = input; - return input; -} - -bool ZTSceneryType::cUsesTreeRubble() { - return *(bool*)((DWORD)this->thisptr + 0x139); -} - -bool ZTSceneryType::cUsesTreeRubble(bool input) { - *(bool*)((DWORD)this->thisptr + 0x139) = input; - return input; -} - -bool ZTSceneryType::cForcesSceneryRubble() { - return *(bool*)((DWORD)this->thisptr + 0x13A); -} - -bool ZTSceneryType::cForcesSceneryRubble(bool input) { - *(bool*)((DWORD)this->thisptr + 0x13A) = input; - return input; -} - -bool ZTSceneryType::cBlocksLOS() { - return *(bool*)((DWORD)this->thisptr + 0x13B); -} - -bool ZTSceneryType::cBlocksLOS(bool input) { - *(bool*)((DWORD)this->thisptr + 0x13B) = input; - return input; -} - -std::string ZTSceneryType::cInfoImageName() { - return *(std::string*)((DWORD)this->thisptr + 0x14C); -} - -std::string ZTSceneryType::cInfoImageName(std::string input) { - *(std::string*)((DWORD)this->thisptr + 0x14C) = input; - return input; -} \ No newline at end of file diff --git a/EmuAPI/reimp/ZTSceneryType.h b/EmuAPI/reimp/ZTSceneryType.h deleted file mode 100644 index 63061a1..0000000 --- a/EmuAPI/reimp/ZTSceneryType.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef ZTSCENERYTYPE_H -#define ZTSCENERYTYPE_H - -#include "BFEntityType.h" -#include - - -class ZTSceneryType : public BFEntityType { - public: - // char padding[4]; // 292 - int cPurchaseCost(); //0x100 - int cPurchaseCost(int); //0x100 - int cNameID(); //0x104 - int cNameID(int); //0x104 - int cHelpID(); //0x108 - int cHelpID(int); //0x108 - int cHabitat(); //0x10C - int cHabitat(int); //0x10C - int cLocation(); //0x110 - int cLocation(int); //0x110 - int cEra(); //0x114 - int cEra(int); //0x114 - int cMaxFoodUnits(); //0x118 - int cMaxFoodUnits(int); //0x118 - bool cDeletable(); //0x119 - bool cDeletable(bool); //0x119 - bool cStink(); //0x11C - bool cStink(bool); //0x11C - int cEstheticWeight(); //0x120 - int cEstheticWeight(int); //0x120 - bool cSelectable(); //0x128 - bool cSelectable(bool); //0x128 - // bool cDeletable(); //0x129 - // bool cDeletable(bool); //0x129 - bool cFoliage(); //0x12A - bool cFoliage(bool); //0x12A - bool cAutoRotate(); //0x12D - bool cAutoRotate(bool); //0x12D - bool cLand(); //0x12E - bool cLand(bool); //0x12E - bool cSwims(); //0x12F - bool cSwims(bool); //0x12F - bool cUnderwater(); //0x130 - bool cUnderwater(bool); //0x130 - bool cSurface(); //0x131 - bool cSurface(bool); //0x131 - bool cSubmerge(); //0x132 - bool cSubmerge(bool); //0x132 - bool cOnlySwims(); //0x133 - bool cOnlySwims(bool); //0x133 - bool cNeedsConfirm(); //0x134 - bool cNeedsConfirm(bool); //0x134 - bool cGawkOnlyFromFront(); //0x135 - bool cGawkOnlyFromFront(bool); //0x135 - bool cDeadOnLand(); //0x136 - bool cDeadOnLand(bool); //0x136 - bool cDeadOnFlatWater(); //0x137 - bool cDeadOnFlatWater(bool); //0x137 - bool cDeadUnderwater(); //0x138 - bool cDeadUnderwater(bool); //0x138 - bool cUsesTreeRubble(); //0x139 - bool cUsesTreeRubble(bool); //0x139 - bool cForcesSceneryRubble(); //0x13A - bool cForcesSceneryRubble(bool); //0x13A - bool cBlocksLOS(); //0x13B - bool cBlocksLOS(bool); //0x13B - std::string cInfoImageName(); //0x14C - std::string cInfoImageName(std::string); //0x14C - ZTSceneryType(void* ptr) : BFEntityType(ptr) {}; - ~ZTSceneryType() {}; - -}; - -#endif // ZTSCENERYTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTStaffType.h b/EmuAPI/reimp/ZTStaffType.h deleted file mode 100644 index cf2dbbe..0000000 --- a/EmuAPI/reimp/ZTStaffType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTSTAFFTYPE_H -#define ZTSTAFFTYPE_H - -#include "ZTUnitType.h" - -class ZTStaffType : public ZTUnitType { - public: - char padding[60]; // 600 - ZTStaffType(); - ~ZTStaffType(); -}; - -#endif // ZTSTAFFTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTTankFilterType.h b/EmuAPI/reimp/ZTTankFilterType.h deleted file mode 100644 index ec0511f..0000000 --- a/EmuAPI/reimp/ZTTankFilterType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTTANKFILTERTYPE_H -#define ZTTANKFILTERTYPE_H - -#include "ZTSceneryType.h" - -class ZTTankFilterType : public ZTSceneryType { - public: - char padding[72]; // 368 - ZTTankFilterType(); - ~ZTTankFilterType(); -}; - -#endif // ZTTANKFILTERTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTTankWallType.h b/EmuAPI/reimp/ZTTankWallType.h deleted file mode 100644 index 1003ac6..0000000 --- a/EmuAPI/reimp/ZTTankWallType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTTANKWALLTYPE_H -#define ZTTANKWALLTYPE_H - -#include "ZTFenceType.h" - -class ZTTankWallType : public ZTFenceType { - public: - char padding[652]; // 976 - ZTTankWallType(); - ~ZTTankWallType(); -}; - -#endif // ZTTANKWALLTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUI.cpp b/EmuAPI/reimp/ZTUI.cpp deleted file mode 100644 index a579dd8..0000000 --- a/EmuAPI/reimp/ZTUI.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "ZTUI.h" -#include "ZTGameMgr.h" -#include "bfinternat.h" -#include "EmuBase.h" -#include -#include "Windows.h" -#include "detours.h" -#include "ZooState.h" -#include "ZTWorldMgr.h" - -unsigned int ZTUI::gameopts::saveGame(void) { - _saveGame _ogsaveGame = (_saveGame)0x004769ac; - return _ogsaveGame(); -} - -// hooked but filestr is not readable yet -unsigned int ZTUI::gameopts::loadFile(char **filestr) { - _loadFile _ogloadFile = (_loadFile)0x00453000; - // std::ofstream logFile("filename.txt"); - // if (logFile.is_open()) { - // logFile << *filename << std::endl; - // logFile.close(); - // } - return _ogloadFile(filestr); -} - -void* ZTUI::general::getMapView(void) { - void* ztmapview = (void*)(0x00638068); - if (ztmapview == 0) { - ztmapview = (void*)BFUIMgr::getElement(7000); - } - - return ztmapview; -} - -void* ZTUI::general::getSelectedEntity(void) { - _getSelectedEntity _oggetSelectedEntity = (_getSelectedEntity)0x00410f84; - return _oggetSelectedEntity(); -} - -void* ZTUI::general::getSelectedEntityType(void) { - if (getSelectedEntity() == 0) { - return 0; - } - void* entity = getSelectedEntity(); - void* entitytype = *(void**)((DWORD)entity + 0x128); - return (void*)entitytype; -} - -void ZTUI::general::makeSelectableByType(int type) { - if (type == 0) { - return; - } - int id[] = {type, NULL}; - std::vector entities = ZTWorldMgr::getAllEntitiesOfType(id); - makeSelectable(entities); -} - -void ZTUI::general::makeSelectable(std::vector entities) { - if (entities.size() == 0) { - return; - } - for (size_t i = 0; i < entities.size(); i++) { - void* entity = (void*)entities[i]; - void* entitytype = *(void**)((DWORD)entity + 0x128); - // selectable offset is 0x128 - void* selectable = (void*)((DWORD)entitytype + 0x128); - *(bool*)selectable = true; - } -} - -void ZTUI::main::setMoneyText(rgb color) { - // set money text show in the UI - float money = ZooState::GetZooBudget(); - - // void* pBFUIMgr = *(void**)0x00638de0; - //DWORD pBFUIMgr = *(DWORD*)((LPVOID)0x00638de0); - //DWORD bfuimgr = *((DWORD*)((LPVOID)0x00638de0)); - void *pBFUIMgr = reinterpret_cast(0x00638de0); - // GXRGB color = {0, 0, 0}; // set color to black - - // float money_to_display = (float)((int)money); // round down to nearest integer - BFUIMgr::setControlForeColor(pBFUIMgr, 0x3f8, color); // set control forecolor - bfinternat::setMoneyText(0x3f8, (int)money, '\x01'); // set money text -} - -void ZTUI::main::init() { - // initialize the UI - // setMoneyText(); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DWORD setMoneyTextAdd = 0x0040ee3d; - DetourAttach((PVOID*)&setMoneyTextAdd, (PVOID)&ZTUI::main::setMoneyText); - DetourTransactionCommit(); - // EmuBase::callHook(0x0040f02e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from addCash - // EmuBase::callHook(0x0041d38d, (DWORD)&ZTUI::main::setMoneyText_Detour); // from updateSim - // EmuBase::callHook(0x0041ef7e, (DWORD)&ZTUI::main::setMoneyText_Detour); // from subtractCash - // EmuBase::callHook(0x00519c1c, (DWORD)&ZTUI::main::setMoneyText_Detour); // from init - - EmuBase::callHook(0x00485d9c, (DWORD)&ZTUI::gameopts::loadFile); // from clickContinue - EmuBase::callHook(0x004c9a13, (DWORD)&ZTUI::gameopts::loadFile); // from beginScenario - EmuBase::callHook(0x004cc462, (DWORD)&ZTUI::gameopts::loadFile); // from loadGame - EmuBase::callHook(0x005c1d28, (DWORD)&ZTUI::gameopts::loadFile); // from ZTApp::iniInstance -} - -ZTUI::main::main() { - // constructor - color.c = 0; - color.r = 0; -} - -void ZTUI::main::setMoneyText_Detour() { - // detour function for setting money text in the UI - ZTUI::main::setMoneyText(ZTUI::main::shared_instance().color); -} - -void ZTUI::main::unpauseGame() { - _unpauseGame _ogunpauseGame = (_unpauseGame)0x0059c7a9; - _ogunpauseGame(); -} - -void ZTUI::main::pauseGame() { - _pauseGame _ogpauseGame = (_pauseGame)0x0059c6b8; - _ogpauseGame(); -} - diff --git a/EmuAPI/reimp/ZTUI.h b/EmuAPI/reimp/ZTUI.h deleted file mode 100644 index e89fa9d..0000000 --- a/EmuAPI/reimp/ZTUI.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef ZTUI_H -#define ZTUI_H - -#include "ZTMapView.h" - -typedef unsigned int (*_saveGame)(void); // define original saveGame function -typedef void (*_unpauseGame)(void); // define original unpauseGame function -typedef void (*_pauseGame)(void); // define original pauseGame function -typedef unsigned int (__cdecl *_loadFile)(char **filename); // define original loadFile function -// typedef ZTMapView (*_getMapView)(void); // define original getMapView function -typedef void* (*_getSelectedEntity)(void); // define original getSelectedEntity function - -namespace ZTUI { - class gameopts { - public: - static unsigned int saveGame(); - static unsigned int loadFile(char **filename); - }; - - class general { - public: - static void* getMapView(); - static void* getSelectedEntity(); - static void* getSelectedEntityType(); - static void makeSelectableByType(int); - static void makeSelectable(std::vector); - }; - - class main { - public: - - main(); - struct rgb { - unsigned short c; - unsigned short r; - }; - rgb color; - static main &shared_instance() { - static main instance; - return instance; - } - static void setMoneyText(rgb); - static void init(); - static void unpauseGame(); // hook - static void pauseGame(); // hook - static void __cdecl setMoneyText_Detour(); - }; -}; - -#endif /* ZTUI_H */ \ No newline at end of file diff --git a/EmuAPI/reimp/ZTUnitType.h b/EmuAPI/reimp/ZTUnitType.h deleted file mode 100644 index 6b2cd26..0000000 --- a/EmuAPI/reimp/ZTUnitType.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ZTUNITTYPE_H -#define ZTUNITTYPE_H - -#include "BFUnitType.h" - -class ZTUnitType : public BFUnitType { - public: - char padding[76]; // 540 - ZTUnitType(); - ~ZTUnitType(); -}; - -#endif // ZTUNITTYPE_H \ No newline at end of file diff --git a/EmuAPI/reimp/ZTWorldMgr.cpp b/EmuAPI/reimp/ZTWorldMgr.cpp deleted file mode 100644 index 522b508..0000000 --- a/EmuAPI/reimp/ZTWorldMgr.cpp +++ /dev/null @@ -1,50 +0,0 @@ - -#include "ZTWorldMgr.h" -#include "ZTMapView.h" - -void* ZTWorldMgr::getWorldMgr() { - return (void*)0x00638040; -} - -DWORD ZTWorldMgr::getOffset(DWORD offset) { - return (*(DWORD*)0x00638040) + offset; -} - -std::vector ZTWorldMgr::getAllEntitiesOfType(int ids[]) { - // store the begin and end pointers of the entity list - - DWORD* begin = *reinterpret_cast(ZTWorldMgr::getOffset(0x80)); - DWORD* end = *reinterpret_cast(ZTWorldMgr::getOffset(0x84)); - std::vector entities; - - // iterate through the entity list - for (DWORD** current = reinterpret_cast(begin); current < reinterpret_cast(end); ++current) { - // get the first level pointer - DWORD* firstLevelPtr = *current; - if (!firstLevelPtr) continue; - - // get the second level pointer - DWORD* secondLevelPtr = *reinterpret_cast(reinterpret_cast(firstLevelPtr) + 0x128); - if (!secondLevelPtr) continue; - - // get second level pointer's entity ID - int entityID = *reinterpret_cast(reinterpret_cast(secondLevelPtr) + 0x104); - - for (size_t i = 0; ids[i] != NULL; i++) { - if (entityID == ids[i]) { - // store the pointer to the entity - entities.push_back(firstLevelPtr); - } - } - } - - return entities; -} - -void ZTWorldMgr::makeInvisible(std::vector entities, bool isInvisible) { - for (size_t i = 0; i < entities.size(); i++) { - // Correctly calculate the pointer to the visibility flag - bool* visibilityFlag = reinterpret_cast(reinterpret_cast(entities[i]) + 0x13f); - *visibilityFlag = isInvisible; - } -} diff --git a/EmuAPI/reimp/ZTWorldMgr.h b/EmuAPI/reimp/ZTWorldMgr.h deleted file mode 100644 index 2c85b16..0000000 --- a/EmuAPI/reimp/ZTWorldMgr.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef ZTWORDLMGR_H -#define ZTWORDLMGR_H - -#include "Windows.h" -#include - -class ZTWorldMgr { - public: - char padding[536]; - ZTWorldMgr(); - ~ZTWorldMgr(); - - static void* getWorldMgr(); - static DWORD getOffset(DWORD); - - static std::vector getAllEntitiesOfType(int ids[]); - static void makeInvisible(std::vector, bool); -}; - -#endif // ZTWORDLMGR_H diff --git a/EmuAPI/reimp/bfinternat.cpp b/EmuAPI/reimp/bfinternat.cpp deleted file mode 100644 index b8b4eec..0000000 --- a/EmuAPI/reimp/bfinternat.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "bfinternat.h" - -void bfinternat::setMoneyText(int param_1, int param_2, char param_3) { - _setMoneyText og_setMoneyText = (_setMoneyText)0x0040ed88; - - og_setMoneyText(param_1, param_2, param_3); -} \ No newline at end of file diff --git a/EmuAPI/reimp/bfinternat.h b/EmuAPI/reimp/bfinternat.h deleted file mode 100644 index 3af132f..0000000 --- a/EmuAPI/reimp/bfinternat.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef BFINTERNAT_H -#define BFINTERNAT_H - -typedef void (__cdecl *_setMoneyText)(int, int, char); // define original BFUIMgrSetControlForeColor function - -class bfinternat { - public: - static void setMoneyText(int, int, char); -}; - -#endif /* BFINTERNAT_H */ \ No newline at end of file diff --git a/EmuAPI/resources/ZooMiniMap.cpp b/EmuAPI/resources/ZooMiniMap.cpp deleted file mode 100644 index b2a7e72..0000000 --- a/EmuAPI/resources/ZooMiniMap.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "ZooMiniMap.h" - -ZooMiniMap::ZooMiniMap() -{ - dflt_set = false; -} - -ZooMiniMap::~ZooMiniMap() -{ - -} - -bool ZooMiniMap::dflt_set = false; -int ZooMiniMap::min_map_x = 800; -int ZooMiniMap::min_map_y = 600; - -void ZooMiniMap::SetMiniMapCursor(int mapx, int mapy) -{ - DWORD ptr = *((DWORD*)((LPVOID)0x638068)) + 0x4C; - int* x = ((int*)ptr); - - DWORD ptr2 = *((DWORD*)((LPVOID)0x638068)) + 0x50; - int* y = ((int*)ptr2); - - if (dflt_set == false) - { - dflt_set = true; - min_map_x = *x; - min_map_y = *y; - } - - *x = mapx; - *y = mapy; -} - -void ZooMiniMap::SetMiniMapCursor(std::string size) -{ - DWORD ptr = *((DWORD*)((LPVOID)0x638068)) + 0x4C; - int* x = ((int*)ptr); - - DWORD ptr2 = *((DWORD*)((LPVOID)0x638068)) + 0x50; - int* y = ((int*)ptr2); - - if (dflt_set == false) - { - dflt_set = true; - min_map_x = *x; - min_map_y = *y; - } - - if (size == "small") - { - *x = 512; - *y = 384; - } - else if (size == "default") - { - *x = 1024; - *y = 768; - } - else if (size == "large") - { - *x = 2048; - *y = 1536; - } -} - -void ZooMiniMap::RestoreMiniMapCursor() -{ - DWORD ptr = *((DWORD*)((LPVOID)0x638068)) + 0x4C; - int* x = ((int*)ptr); - - DWORD ptr2 = *((DWORD*)((LPVOID)0x638068)) + 0x50; - int* y = ((int*)ptr2); - - if (dflt_set == true) - { - *x = min_map_x; - *y = min_map_y; - } - else - { - std::cout << "Err: Mini Map cursor size is already the default." << std::endl << std::endl; - } -} - -int ZooMiniMap::GetMiniMapCursorX() -{ - return 0; -} - -int ZooMiniMap::GetMiniMapCursorY() -{ - return 0; -} \ No newline at end of file diff --git a/EmuAPI/resources/ZooMiniMap.h b/EmuAPI/resources/ZooMiniMap.h deleted file mode 100644 index 5fb74b5..0000000 --- a/EmuAPI/resources/ZooMiniMap.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef ZOOMINIMAP_H -#define ZOOMINIMAP_H - -#include "EmuBase.h" -#include -#include -#include "lua.h" - -class ZooMiniMap -{ - public: - ZooMiniMap(); - ~ZooMiniMap(); - - lua_State* L; - static void SetMiniMapCursor(int, int); - static void SetMiniMapCursor(std::string); - static void RestoreMiniMapCursor(); - static int GetMiniMapCursorX(); - static int GetMiniMapCursorY(); - private: - static bool dflt_set; - static int min_map_x; - static int min_map_y; -}; - -#endif \ No newline at end of file diff --git a/EmuAPI/resources/ZooModels.cpp b/EmuAPI/resources/ZooModels.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/EmuAPI/resources/ZooModels.h b/EmuAPI/resources/ZooModels.h deleted file mode 100644 index 76d4f58..0000000 --- a/EmuAPI/resources/ZooModels.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ZOOMODELS_H -#define ZOOMODELS_H - -struct ZooModels -{ - bool _emuAnimalRatingSet; - bool _emuGuestRatingSet; - bool _emuZooRatingSet; - int _animalRating; - int _guestRating; - int _zooRating; -}; - -#endif \ No newline at end of file diff --git a/EmuAPI/resources/ZooState.cpp b/EmuAPI/resources/ZooState.cpp deleted file mode 100644 index 227cc8a..0000000 --- a/EmuAPI/resources/ZooState.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include "ZooState.h" - - - -//using LuaFunction = std::function; - -ZooState::ZooState() -{ - -} - -ZooState::~ZooState(void) -{ -} - -DWORD ZooState::object_ptr(DWORD offset) -{ - return (*((DWORD*)((LPVOID)0x638048)) + offset); -} - -/// @brief Pause the game. -/// @param input -void ZooState::PauseGame(bool input) -{ - DWORD ptr = (((DWORD)((LPVOID)0x638588))); - bool* p = (bool*)ptr; - *p = input; -} - -/// @brief Is the game paused through the UI? -bool ZooState::IsGamePaused() -{ - DWORD ptr = (((DWORD)((LPVOID)0x638588))); - bool* p = (bool*)ptr; - return *p; -} - -/// @brief Overload: allows a user to set -/// @param input -void ZooState::FreezeGameState(bool is_loaded) -{ - bool* p = ((bool*)object_ptr(0x4)); - *p = is_loaded; -} - - -/// @brief Pause the game. -/// @param input -bool ZooState::IsZooLoaded() -{ - bool* p = ((bool*)object_ptr(0x4)); - return *p; -} - -/// @brief Add money to the zoo budget. -/// @param input -void ZooState::AddToZooBudget(float input) -{ - float* budget = (float*)object_ptr(0x0C); - *budget = (float)(*budget + input); -} - -/// @brief Returns the zoo budget. -/// @return -float ZooState::GetZooBudget() -{ - float* budget = (float*)object_ptr(0x0C); - return *budget; -} - -/// @brief Sets the zoo budget. -/// @return -void ZooState::SetZooBudget(float new_budget) -{ - float* budget = (float*)object_ptr(0x0C); - *budget = new_budget; -} - -/// @brief Returns number of animals in zoo. -/// @return -int ZooState::NumAnimals() -{ - int* p = ((int*)object_ptr(0x30)); - return *p; -} - -/// @brief Returns number of animal species in zoo. -/// @return -int ZooState::NumSpecies() -{ - int* p = ((int*)object_ptr(0x38)); - return *p; -} - -/// @brief Returns number of guests in the zoo. -/// @return -int ZooState::NumGuests() -{ - int* p = ((int*)object_ptr(0x54)); - return *p; -} - -/// @brief Returns the number of tired guests. -/// @return -int ZooState::NumTiredGuests() -{ - int* p = ((int*)object_ptr(0x3C)); - return *p; -} - -/// @brief Returns the number of hungry guests. -/// @return -int ZooState::NumHungryGuests() -{ - int* p = ((int*)object_ptr(0x40)); - return *p; -} - -/// @brief Returns the number of thirsty guests. -/// @return -int ZooState::NumThirstyGuests() -{ - int* p = ((int*)object_ptr(0x44)); - return *p; -} - -/// @brief Returns the number of guests that need the restroom. -/// @return -int ZooState::NumGuestsNeedRestrm() -{ - int* p = ((int*)object_ptr(0x48)); - return *p; -} - -int ZooState::NumGuestsInFilter() -{ - int* p = ((int*)object_ptr(0x54)); - return *p; -} - -float ZooState::GetZooAdmissionCost() -{ - float* p = ((float*)object_ptr(0x1160)); - return *p; -} - -void ZooState::SetZooAdmissionCost(float new_cost) -{ - float* p = ((float*)object_ptr(0x1160)); - *p = new_cost; -} - -/// LISTS - -/// @brief Returns admissions income by month as a 12-member array. -/// @return -float* ZooState::AdmissionsIncomeByMonth() -{ - float* p = ((float*)object_ptr(0x254)); - return p; -} - -float* ZooState::ConcessionsBenefitByMonth() -{ - float* p = ((float*)object_ptr(0x284)); - return p; -} - -// Offset is incorrect -// float* ZooState::RecyclingBenefitByMonth() -// { -// float* p = ((float*)object_ptr(0x314)); -// return p; -// } - -float* ZooState::ZooProfitOverTime() -{ - float* p = ((float*)object_ptr(0x404)); - return p; -} - -float* ZooState::PrivateDonationsByMonth() -{ - float* p = ((float*)object_ptr(0x2E4)); - return p; -} - -float* ZooState::ZooRatingByMonth() -{ - float* p = ((float*)object_ptr(0x464)); - return p; -} - -float* ZooState::ConstructionCostByMonth() -{ - float* p = ((float*)object_ptr(0x1F4)); - return p; -} - -float* ZooState::AnimalPurchaseCostsByMonth() -{ - float* p = ((float*)object_ptr(0x1C4)); - return p; -} - -// needs another look -float* ZooState::ResearchCostsByMonth() -{ - float* p = ((float*)object_ptr(0xD10)); - return p; -} - -float* ZooState::ZooValueByMonth() -{ - float* p = ((float*)object_ptr(0x434)); - return p; -} - -void ZooState::EnableDevMode(bool input) -{ - DWORD ptr = (((DWORD)((LPVOID)0x63858A))); - bool* p = (bool*)ptr; - *p = input; -} - -bool ZooState::IsDevModeEnabled() -{ - DWORD ptr = (((DWORD)((LPVOID)0x63858A))); - bool* p = (bool*)ptr; - return *p; -} - -// float* ZooState::ZooValueByMonth() -// { -// float* p = ((float*)object_ptr(0x434)); -// return p; -// } - -/// @brief Print a human-readable list of one of the year-long arrays. -/// @param p 12-member float -/// @param msg message to display -void ZooState::print_year_to_console(float* p, std::string msg) -{ - std::cout << std::endl; - std::string calendar[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; - std::cout << msg << std::endl; - std::cout << "---------------------------------------------" << std::endl; - std::cout << std::endl; - - for (int i = 0; i < 12; i++) - { - std::cout << calendar[i] << ": "; - int val = (int)p[i]; - if (val < -1000000000) - { - std::cout << "[Value too low/not available]" << std::endl; - } - else - { - std::cout << val << std::endl; - } - - } - - std::cout << std::endl; -} - diff --git a/EmuAPI/resources/ZooState.h b/EmuAPI/resources/ZooState.h deleted file mode 100644 index f72eed1..0000000 --- a/EmuAPI/resources/ZooState.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef ZOOSTATE_H -#define ZOOSTATE_H - -#ifndef EMU_EXPORTS -#define EMU_API __declspec(dllexport) -#else -#define EMU_API __declspec(dllimport) -#endif - -#include "EmuBase.h" -#include -#include -#include "lua.hpp" -#include -#include -#include -#include "detours.h" -#include "ZooModels.h" - -extern "C" { - EMU_API void FreezeGameState(bool); - EMU_API void PauseGame(bool); - EMU_API bool IsGamePaused(); - EMU_API void SetZooBudget(float); - EMU_API float GetZooBudget(); - EMU_API void AddToZooBudget(float); - EMU_API void EnableDevMode(bool); - EMU_API bool IsDevModeEnabled(); -} - -class ZooState -{ - -public: - /// Lua Managers - static void register_zoo_state(lua_State*); - static int lua_ZooState_GetZooBudget(lua_State*); - - /// Zoo State - ZooState(); - ~ZooState(); - void FreezeGameState(bool); - static bool IsZooLoaded(); - static void PauseGame(bool); - static bool IsGamePaused(); - static void SetZooBudget(float); - static float GetZooBudget(); - static void AddToZooBudget(float); - static int NumAnimals(); - static int NumSpecies(); - static int NumGuests(); - static float* AdmissionsIncomeByMonth(); - static float* ConcessionsBenefitByMonth(); - // static float* RecyclingBenefitByMonth(); - static float* ZooProfitOverTime(); - static float* ZooRatingByMonth(); - static float* ConstructionCostByMonth(); - static float* PrivateDonationsByMonth(); - static float* AnimalPurchaseCostsByMonth(); - static float* ResearchCostsByMonth(); - // verify - //static int NumAngryGuests(); - static int NumTiredGuests(); - static int NumHungryGuests(); - static int NumThirstyGuests(); - static int NumGuestsNeedRestrm(); - static int NumGuestsInFilter(); - static float GetZooAdmissionCost(); - static void SetZooAdmissionCost(float); - static float* ZooValueByMonth(); - - static int SetZooRating(int); - static void SetGuestRating(int); - static void SetAnimalRating(int); - static void EnableDevMode(bool); - static bool IsDevModeEnabled(); - - static void print_month_to_console(float*, std::string); - - static void print_year_to_console(float*, std::string); - static DWORD object_ptr(DWORD); - - ZooModels zoo_models; - }; - -#endif diff --git a/EmuScriptMgr.cpp b/EmuScriptMgr.cpp new file mode 100644 index 0000000..04bc691 --- /dev/null +++ b/EmuScriptMgr.cpp @@ -0,0 +1,33 @@ +#include "EmuScriptMgr.h" + +EmuScriptMgr::EmuScriptMgr() +{ +} + +EmuScriptMgr::~EmuScriptMgr() +{ +} + +void EmuScriptMgr::LoadScript(const std::string& script) +{ + sol::state lua; + lua.open_libraries(sol::lib::base, sol::lib::package); + + lua.script_file(script); +} + +void EmuScriptMgr::ConvertToBytecode(const std::string& script) +{ + sol::state lua; + lua.open_libraries(sol::lib::base, sol::lib::package); + + lua.load_file(script); + lua. + assert(result.valid(), "Failed to load script: %s", script.c_str()); + sol::protected_function target = result.get(); + + if (result.valid()) { + sol::bytecode bc = target.dump(); + c_scripts.push_back(bc); + } +} \ No newline at end of file diff --git a/EmuScriptMgr.h b/EmuScriptMgr.h new file mode 100644 index 0000000..67bb076 --- /dev/null +++ b/EmuScriptMgr.h @@ -0,0 +1,21 @@ +#ifndef EMUSCRIPTMGR_H +#define EMUSCRIPTMGR_H + +#include +#include "sol/sol.hpp" +#include "sol/assert.hpp" +#include + +class EmuScriptMgr +{ +public: + EmuScriptMgr(); + ~EmuScriptMgr(); + + void LoadScript(const std::string& script); + void ConvertToBytecode(const std::string& script); +private: + std::vector c_scripts; +}; + +#endif // EMUSCRIPTMGR_H \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 086de38..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2024 Goosifer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index ff361ce..0000000 --- a/README.md +++ /dev/null @@ -1,120 +0,0 @@ -

EMU | Extensible Modding Utility

- -

A Zoo Tycoon Complete Collection API Utility for Modders

- -Zoo Tycoon initially offered limited modding tools, leading modders to heavily depend on the game's INI configuration for modifications. This project aims to enhance modding accessibility by introducing embedded Lua scripting and expanded access to game resources that were previously unavailable. - -### Compatibility - -This API requires the Zoo Tycoon Complete Collection, including both expansions, and a Windows XP or newer operating system with the Microsoft Visual C++ 2008 Redistributable installed. - -If you do not own the Complete Collection but own the base game and have the two expansions installed, that should work as well. - -### Build from Source - -The .sln file has been included for the option to build from source. This requires Microsoft Visual C++ 2008 in order to compile. Express Edition should be fine. - -### Installation - -Drop the res-EMU.dll binary directly into your `C:\Program Files (x86)\Microsoft Games\Zoo Tycoon` game directory. - -### Command Console - -The API includes a command console not originally available in the vanilla game. It can be accessed via `CTRL + J`. Commands will not run unless a zoo is loaded. - -Console limitations to consider as of **EMU v1.0.0-alpha.5**: -- The console is only visible in windowed mode and will not be accessible if you are full screen. -- Safety checks are not yet implemented so be careful to stray too far from the expected input. -- Console stays ontop of the main game window (in windowed mode) and will stay ontop of other windows if game is minized. If it's obtrusive, close the console with `exit`. -- This API makes use of multi-threading to run EMU and the console simultaneously with the game. On slower hardware you might see propagation of resources take longer between what you see in the game and what you see in a function return value. For example: `num-tiredguests` might say 10, but the game says 11 for a few milliseconds longer. -- `list-privatedonations` has different values than what the game displays. The array is accurate down to the second that the month changes, but then the game adds an unknown value to the final recorded value on-screen. It is not known if this is a bug or if it is adding other donations like benefactor contributions. We keep it for analysis in the future. - -#### Console Commands - -| Command | Description | -| ------------- | ------------- | -| exit | Safely close the console window. | -| addtobudget \ | Deposit a discrete amount of cash into your zoo budget. | -| getbudget | Returns the current budget. | -| setbudget \ | Set your current budget to a new amount. | -| pause | Pause your game from the console. | -| resume | Resume your game from the console. | -| num-animals | Return the current number of animals in your zoo. | -| num-species | Return the current number of animal species in your zoo. | -| num-guests | Return the current number of guests in your zoo. | -| num-tiredguests | Return the current number of tired guests in your zoo. | -| num-hungryguests | Return the current number of hungry guests in your zoo. | -| num-thirstyguests | Return the current number of thirsty guests in your zoo. | -| num-rstrmguests | Return the current number of guests that need to use the restroom. | -| getzooadmcost | Return the current admission cost to your zoo. Note: this is the adult ticket value. The child ticket value is not stored in memory as it is automatically calculated from the adult price divided by 2. | -| setzooadmcost \ | Set the current admission cost to your zoo. See the above limitation about child ticket prices. | -| list-admissionsincome | Return a calendar listing of admissions income. | -| list-concessionsbenefit | Return a calendar listing of concessions benefits. | -| list-zoovalue | Return a calendar listing of zoo value changes over the year. | -| list-privatedonations | Return a calendar listing of private donations. | -| list-zoorating | Return a calendar listing of zoo ratings. | -| list-constructioncosts | Return a calendar listing with construction costs. | -| list-animalpurchasecosts | Return a calendar listing of animal adoption costs. | -| devmode \ | Set to true to enable dev mode or false to disable. | - -### Lua Scripting - -Introduced as of **EMU v1.0.0-alpha.3**. - -EMU adds scripting support to Zoo Tycoon 1. Currently scripting is limited to the following commands: - -| Command | Description | -| ------------- | ------------- | -| AddToZooBudget(float deposit) | Deposit a discrete amount of cash into your zoo budget. Takes a float as an argument. | -| GetZooBudget() | Returns the current budget as a float. | -| SetZooBudget(float new_budget) | Set your current budget to a new amount. Takes a float as an argument. | -| IsZooLoaded() | Is a zoo currently open? Returns a boolean value. | -| PauseGame() | Pause the game. | -| IsGamePaused() | Is the game currently paused? Returns a boolean value. | -| NumAnimals() | Return the current number of animals in your zoo. Returns an integer. | -| NumSpecies() | Return the current number of animal species in your zoo. Returns an integer. | -| NumGuests() | Return the current number of guests in your zoo. Returns an integer. | -| NumTiredGuests() | Return the current number of tired guests in your zoo. Returns an integer. | -| NumHungryGuests() | Return the current number of hungry guests in your zoo. Returns an integer. | -| NumThirstyGuests() | Return the current number of thirsty guests in your zoo. Returns an integer. | -| NumGuestsNeedRestrm() | Return the current number of guests that need to use the restroom. Returns an integer. | -| NumGuestsInFilter() | Return the current number of guests in the guest filter. Returns an integer. | -| GetZooAdmissionCost() | Return the current admission cost to your zoo. Note: this is the adult ticket value. The child ticket value is not stored in memory as it is automatically calculated from the adult price divided by 2. Returns a float. | -| SetZooAdmissionCost(float new_adm) | Set the current admission cost to your zoo. See the above limitation about child ticket prices. Takes one float as an argument. | -| AdmissionsIncomeByMonth() | Retrieve an array containing 12 elements, each representing admissions income for a specific month. | -| ConcessionsBenefitByMonth() | Retrieve an array containing 12 elements, each representing the concessions benefit for a specific month. | -| ZooValueByMonth() | Retrieve an array containing 12 elements, each representing the zoo value for a specific month. | -| PrivateDonationsByMonth() | Retrieve an array containing 12 elements, each representing the private donations for a specific month. | -| ZooRatingByMonth() | Retrieve an array containing 12 elements, each representing the zoo rating for a specific month. | -| ConstructionCostByMonth() | Retrieve an array containing 12 elements, each representing the construction costs for a specific month. | -| AnimalPurchaseCostsByMonth() | Retrieve an array containing 12 elements, each representing the animal adoption costs for a specific month. | -| _globalAnimalRating | Global variable. Sets the animal rating per update. | -| _globalZooRating | Global variable. Sets the zoo rating per update. | -| _globalGuestRating | Global variable. Sets the guest rating per update. | - -### How to Install EMU Scripts - -Create a new folder called `scripts` inside of your main Zoo Tycoon directory: `C:\Program Files (x86)\Microsoft Games\Zoo Tycoon`. Drop scripts inside of the scripts folder. - -Scripting info: -- All Lua standard libraries as of Lua 5.3 are made available for your use. -- Lua scripts must have the `.emu` extension. -- As of the latest **EMU v1.0.0-alpha.4**, EMU can load any lua scripts inside of a `/scripts` folder inside of the root Zoo Tycoon 1 folder. -- Lua support is designed for modders to take control of the game logic by having individual scripts run on the main EMU loop. If/then statements are obviously encouraged, but be conservative with your own loops unless they are predictable and efficient. Global variables might not be effective. -- All executing code must live inside of an `emu_run` function. - -**Example Lua Script:** -_playground.emu_ -```Lua -function emu_run() - -- pause the game if the budget goes above $400,000 - if GetZooBudget() > 400000 and IsGamePaused() == false then - io.write("Pausing the game") - PauseGame(true) - -- resume game if budget dips below $400,000 (maybe the console can save us here?) - elseif GetZooBudget() <= 400000 and IsGamePaused() == true then - io.write("Resuming the game") - PauseGame(false) - end -end -``` diff --git a/EmuAPI/lua/include/lauxlib.h b/deps/lua54/lauxlib.h similarity index 87% rename from EmuAPI/lua/include/lauxlib.h rename to deps/lua54/lauxlib.h index 0bac246..59fef6a 100644 --- a/EmuAPI/lua/include/lauxlib.h +++ b/deps/lua54/lauxlib.h @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.h,v 1.128 2014/10/29 16:11:17 roberto Exp $ +** $Id: lauxlib.h $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -15,11 +15,25 @@ #include "lua.h" +/* global table */ +#define LUA_GNAME "_G" -/* extra error code for 'luaL_load' */ + +typedef struct luaL_Buffer luaL_Buffer; + + +/* extra error code for 'luaL_loadfilex' */ #define LUA_ERRFILE (LUA_ERRERR+1) +/* key, in the registry, for table of loaded modules */ +#define LUA_LOADED_TABLE "_LOADED" + + +/* key, in the registry, for table of preloaded loaders */ +#define LUA_PRELOAD_TABLE "_PRELOAD" + + typedef struct luaL_Reg { const char *name; lua_CFunction func; @@ -36,6 +50,7 @@ LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); +LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname); LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, size_t *l); LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, @@ -65,7 +80,8 @@ LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); LUALIB_API int (luaL_execresult) (lua_State *L, int stat); -/* pre-defined references */ + +/* predefined references */ #define LUA_NOREF (-2) #define LUA_REFNIL (-1) @@ -85,8 +101,10 @@ LUALIB_API lua_State *(luaL_newstate) (void); LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); -LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); +LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, + const char *p, const char *r); +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, + const char *p, const char *r); LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); @@ -113,6 +131,10 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, #define luaL_argcheck(L, cond,arg,extramsg) \ ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) + +#define luaL_argexpected(L,cond,arg,tname) \ + ((void)((cond) || luaL_typeerror(L, (arg), (tname)))) + #define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) #define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) @@ -131,19 +153,30 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, #define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) +/* push the value used to represent failure/error */ +#define luaL_pushfail(L) lua_pushnil(L) + + /* ** {====================================================== ** Generic Buffer manipulation ** ======================================================= */ -typedef struct luaL_Buffer { +struct luaL_Buffer { char *b; /* buffer address */ size_t size; /* buffer size */ size_t n; /* number of characters in buffer */ lua_State *L; - char initb[LUAL_BUFFERSIZE]; /* initial buffer */ -} luaL_Buffer; + union { + LUAI_MAXALIGN; /* ensure maximum alignment for buffer */ + char b[LUAL_BUFFERSIZE]; /* initial buffer */ + } init; +}; + + +#define luaL_bufflen(bf) ((bf)->n) +#define luaL_buffaddr(bf) ((bf)->b) #define luaL_addchar(B,c) \ @@ -152,6 +185,8 @@ typedef struct luaL_Buffer { #define luaL_addsize(B,s) ((B)->n += (s)) +#define luaL_buffsub(B,s) ((B)->n -= (s)) + LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); @@ -189,21 +224,6 @@ typedef struct luaL_Stream { /* }====================================================== */ - - -/* compatibility with old module system */ -#if defined(LUA_COMPAT_MODULE) - -LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname, - int sizehint); -LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); - -#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) - -#endif - - /* ** {================================================================== ** "Abstraction Layer" for basic report of messages and errors diff --git a/EmuAPI/lua/include/lua.h b/deps/lua54/lua.h similarity index 87% rename from EmuAPI/lua/include/lua.h rename to deps/lua54/lua.h index 09a4cca..c9d64d7 100644 --- a/EmuAPI/lua/include/lua.h +++ b/deps/lua54/lua.h @@ -1,5 +1,5 @@ /* -** $Id: lua.h,v 1.325 2014/12/26 17:24:27 roberto Exp $ +** $Id: lua.h $ ** Lua - A Scripting Language ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** See Copyright Notice at the end of this file @@ -17,13 +17,15 @@ #define LUA_VERSION_MAJOR "5" -#define LUA_VERSION_MINOR "3" -#define LUA_VERSION_NUM 503 -#define LUA_VERSION_RELEASE "0" +#define LUA_VERSION_MINOR "4" +#define LUA_VERSION_RELEASE "2" + +#define LUA_VERSION_NUM 504 +#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 0) #define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR #define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE -#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2015 Lua.org, PUC-Rio" +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2020 Lua.org, PUC-Rio" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" @@ -35,9 +37,11 @@ /* -** pseudo-indices +** Pseudo-indices +** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty +** space after that to help overflow detection) */ -#define LUA_REGISTRYINDEX LUAI_FIRSTPSEUDOIDX +#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) #define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) @@ -47,8 +51,7 @@ #define LUA_ERRRUN 2 #define LUA_ERRSYNTAX 3 #define LUA_ERRMEM 4 -#define LUA_ERRGCMM 5 -#define LUA_ERRERR 6 +#define LUA_ERRERR 5 typedef struct lua_State lua_State; @@ -69,7 +72,7 @@ typedef struct lua_State lua_State; #define LUA_TUSERDATA 7 #define LUA_TTHREAD 8 -#define LUA_NUMTAGS 9 +#define LUA_NUMTYPES 9 @@ -122,6 +125,13 @@ typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); +/* +** Type for warning functions +*/ +typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont); + + + /* ** generic extra include file @@ -143,11 +153,12 @@ extern const char lua_ident[]; LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); LUA_API void (lua_close) (lua_State *L); LUA_API lua_State *(lua_newthread) (lua_State *L); +LUA_API int (lua_resetthread) (lua_State *L); LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); -LUA_API const lua_Number *(lua_version) (lua_State *L); +LUA_API lua_Number (lua_version) (lua_State *L); /* @@ -180,7 +191,7 @@ LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); LUA_API int (lua_toboolean) (lua_State *L, int idx); LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_rawlen) (lua_State *L, int idx); +LUA_API lua_Unsigned (lua_rawlen) (lua_State *L, int idx); LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); LUA_API void *(lua_touserdata) (lua_State *L, int idx); LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); @@ -245,9 +256,9 @@ LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); -LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); +LUA_API void *(lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue); LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API int (lua_getuservalue) (lua_State *L, int idx); +LUA_API int (lua_getiuservalue) (lua_State *L, int idx, int n); /* @@ -261,7 +272,7 @@ LUA_API void (lua_rawset) (lua_State *L, int idx); LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API void (lua_setuservalue) (lua_State *L, int idx); +LUA_API int (lua_setiuservalue) (lua_State *L, int idx, int n); /* @@ -286,13 +297,21 @@ LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); */ LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, lua_KFunction k); -LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg); +LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg, + int *nres); LUA_API int (lua_status) (lua_State *L); LUA_API int (lua_isyieldable) (lua_State *L); #define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) +/* +** Warning-related functions +*/ +LUA_API void (lua_setwarnf) (lua_State *L, lua_WarnFunction f, void *ud); +LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); + + /* ** garbage-collection function and options */ @@ -306,8 +325,10 @@ LUA_API int (lua_isyieldable) (lua_State *L); #define LUA_GCSETPAUSE 6 #define LUA_GCSETSTEPMUL 7 #define LUA_GCISRUNNING 9 +#define LUA_GCGEN 10 +#define LUA_GCINC 11 -LUA_API int (lua_gc) (lua_State *L, int what, int data); +LUA_API int (lua_gc) (lua_State *L, int what, ...); /* @@ -326,6 +347,7 @@ LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); +LUA_API void (lua_toclose) (lua_State *L, int idx); /* @@ -356,11 +378,10 @@ LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); #define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) #define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) +#define lua_pushliteral(L, s) lua_pushstring(L, "" s) #define lua_pushglobaltable(L) \ - lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) + ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)) #define lua_tostring(L,i) lua_tolstring(L, (i), NULL) @@ -376,7 +397,7 @@ LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); /* ** {============================================================== -** compatibility macros for unsigned conversions +** compatibility macros ** =============================================================== */ #if defined(LUA_COMPAT_APIINTCASTS) @@ -386,6 +407,13 @@ LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); #define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) #endif + +#define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1) +#define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1) +#define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1) + +#define LUA_NUMTAGS LUA_NUMTYPES + /* }============================================================== */ /* @@ -436,6 +464,7 @@ LUA_API lua_Hook (lua_gethook) (lua_State *L); LUA_API int (lua_gethookmask) (lua_State *L); LUA_API int (lua_gethookcount) (lua_State *L); +LUA_API int (lua_setcstacklimit) (lua_State *L, unsigned int limit); struct lua_Debug { int event; @@ -443,6 +472,7 @@ struct lua_Debug { const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ const char *source; /* (S) */ + size_t srclen; /* (S) */ int currentline; /* (l) */ int linedefined; /* (S) */ int lastlinedefined; /* (S) */ @@ -450,6 +480,8 @@ struct lua_Debug { unsigned char nparams;/* (u) number of parameters */ char isvararg; /* (u) */ char istailcall; /* (t) */ + unsigned short ftransfer; /* (r) index of first value transferred */ + unsigned short ntransfer; /* (r) number of transferred values */ char short_src[LUA_IDSIZE]; /* (S) */ /* private part */ struct CallInfo *i_ci; /* active function */ @@ -459,7 +491,7 @@ struct lua_Debug { /****************************************************************************** -* Copyright (C) 1994-2015 Lua.org, PUC-Rio. +* Copyright (C) 1994-2020 Lua.org, PUC-Rio. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the diff --git a/EmuAPI/lua/include/lua.hpp b/deps/lua54/lua.hpp similarity index 100% rename from EmuAPI/lua/include/lua.hpp rename to deps/lua54/lua.hpp diff --git a/deps/lua54/lua54.lib b/deps/lua54/lua54.lib new file mode 100644 index 0000000000000000000000000000000000000000..bb721160c0269506baa50d8bda7ae55e517311af GIT binary patch literal 748746 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 (AyiB({V+L?^V-qE*mZ~hP*KT-V4m8C~%vB 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 z zSzVeQz{E0rL3NZgYO1wTc%rpQhQmgao%C>Jma(`VvD69X%s@q-gN{o2C{QZtsi3$? z7;3N`t2$8xN+oUqC_8agc%w7>rYj_IjXFX0N_%TsV4{RrN2yqvyFj${8M&pQChFd;jX`-<<%Krs{@zfKm};8P1lnnFvaCLo7M9v&ObCEVJ zZf5SwFs__USe6`N{jOzASn*T9!0M)H98G(3@@JV|(=&KzNU)@bai3W>ZdGsDA6isI zIKZgsAtO9jqMiauO%K^F=L-*n7^~%fb9#8KMEJ6=Vo_eZ>4E-eb6gDGyw}AI;=j#t z!}xD|Tpa#k?fxZJ6JbT@d*ZjE_nhv1E-nEcpyTUuU0W}Vi-JGxjBx>B;D0PTzip{T zDi)Y$r%oUEg=(~zQ-op8Q7PNH-tV!(kAXQk!1XfFT;+4wj)@O5QWocG8`xUsH!H*v zsGB%YH5JZc5Ms?A8?Eu_i0ZK8V!Boe05e92!$R2j5s#0TI^(^u*(kS~Nd< z=khnR6-99=M!ZV!cF8A5a3s_{?PUj;?_z*XZM#$;&(sFN)u7b!f}NvU<{q$kuUWi* zfl?BoC`u*K9+Z+825K5UQDSN{MW}o{RmCX=r6yC=pzIF#QoLOSy&=W~nI!GRJ2r0$ zWt3$b)bkHyK~#acWs5!%ZBhE8e>m)dS*;N5()$h;^y&+frBJNCf>6_WcA6>3kx+xZ zi5fyDgR&bOYcqsUr@~~ZwL_wY831AxgHn=yjWrZ>4F2=$9KAp%LUo!4V(NQB2X`Vv z#URf@P?AzHo{k9MsH$4Yc}4$aUqyns8+_G1!tur(1h$iD-utC#a3Rmqv{o}AFf)t# zwt6weRHZQY_`?x1Wh)lZi#B&~IN55)G#pF`iD}aS0<*u!+Ml}BY(z_0$9xxEep=8m zW=;1A0u}6wHxOW<56@4E?Gwf)Yc@5Ox)D-{P9*0QI!=1_S^HB%bvPq-RZd6@<28*{ z+pOo|6o~Pih#;ne5K8=Uro8q*wD&mT&sAo$=7eC9d7jQF-)NjT&)VBEJ8lGv&FLug zKg?{uw!<>4l<@&5c7~zGN1&AK51>?NoqD2Ak}K0Eb9(YyeZ(##2%8k5#oIJQ)~9rO1cn-RX-7%a7W8{V
QDWbI^rc%9a|9LXP3r(lB<-CT#(HwqnLxOm;j?ZNJke{MauRbzCD zeKs^yIobIW1slPrPwfy9l`MXDs#@)QP%7f(pzMgR!5dwO{!)pp5#Nk|70L36X8FYW z=JciK%jz?(Sk{^$*vkn)yNawwIfdEr;2uyI7qF4oc5ypmDJmixtB6D_RIIt?$d*jz zfT?25BCuo4%xAp}F9&SJ#^Ie}9-XrDa zp#XchgoyX7&VxbtMkhv=TKen&*8rNtcFKu%79EDEgf9^F1?!tx$}F@h@o2bEN2!L8-=>YvJZuzDq%s3XXM|^TQ}(tHlE$roH*!{A%Yal_#v+;nGk0><^*T zvCyd=V=i!fyqLhoiyRTRS2<`ikwxYPlldQG5Ayp0Q=@!^9;>R7&+>`(w{<c7jp8VA}IsM-TjV z>oV+2t`9M4+L_}vn!$--TN*a@@P2#dBYtZ=&6EzS{nk};3Y8@W8_v&J~pYVo} zCaOM+HD`iR^S3!?KCt7%Z~r*Tq)K9VEP|$VLJcn1)mCdCP-?A^4NC1xl!8(jb_pnz zv8>W6>uv+3G7Nda=FUhRRn zEqf!jTn&XHs+u0E2$N^FHxxKiVC@t0KvBe%#}J{0IL-$Q+Xp@4bOfr_6jRmQ)YKW% zgif7DAs@xW`Gp_Z1lA5Eu;-S&&oDwy^AVBq$`mu~ru6v**i?e23Bt@5R+C-coF>wURX|gYbxQSd-0Mu2X2*@$z~4Z6 zh?9E8sb7{zaO+PsPxgCiE>#6ejayfMdJGbwMjfaOk!5eEMytC(<%*VjL8+A&i$H04 z36z@Uya}p6aPM2V&n?{dpj2nj0{WF~Bq-Gfb6r-X(gvzfsJ`Uk6D21gl>}SOOz~w3 zl`o&lm*b~eS(JlPIkeI8y%N+Ee4>mUc+M6r?1NQ`c7am4@mEl4w)PMxCGjLECGk8c zCGk2a)%U*-O10oytgGjjKsgX&2h94#*GlZawCNQv2*tVL=6lOF-3)2XUD~2bI{y* z;ks|8_ZNuX1yS!Y9(gjG68viZGvU}JW4+(jg>>h6r?VPY@K(cg|07SuJo0pA!m$nS zaYW(Zg!hlJ85zfjr8Qs?8&~^!!@xs`#i-h|=b_^s#DqWH1~J1_J0T+f6t^famyE<3 z0euo8ISi32@t&+JvJMh`SDh%^gM-Y&DM(4t6n#)7CoTh<8}8RBIUy%*P$e21R1Ye5 zSpe)Iayb^ymB7J}FmCD$)1XKNiim89B*6mjG3hU$9@k4tPe$FXW6l~{O21F*mXSmkx1 za{)Yf;8sbR9+8ORD8we#KZ?U7iW99UCfHF-K@=}Eqi6fKd89o z|JnnCPAu_mj`JW^oA6CiG`=94=#1fsRA5*h+l-0JYg$S6o`|2AT-^hB7E03z)8E3G zF$>cPjr30_4nHCFc0&CQK=~vTaozM>oY)Vn?yoCPlwajR_M`rI+i^j)H6s!gX;_rm z6m*&C`h>_-2;xZAB z3RIXVgFU{YycX34K59XEJ}9+MJ=Ws!n-}HF9`y)5p~gBqm6iuV9Tgrcr0NS_0+ojk z_TTVSvY&ubn!f|3`bSO{kKrv;4z+Oi481#e{}vwi0hPWyP@f5pC9HU?y($cT!>hvB z0!oE(Jt!5%ouF8oS@i7%rS!c5O7-7wgHp05LA@rp(-y8BGWHGO^#k>` zP=i4!En`8wC%g+laV&~5rhro6mV#0-tpKHBx)GEL?MBOY7pVV=misO06;KtTkM{7? zdbtI*3sQvF29(l53wHK?Bkxn#hjI=vM#)V0k3jow;Yj2jaiW9fTHnS-@_QJy8LnjQjT7v8$#=ABEapy<8jIsVseBm*N{zM`fa16q zYH+=#cwDck5twI&8pL-VC|wUgRfDG{`jvR2Grvr$vCA1_VbBwiQ_H$2|Llos{i2)W6fY{56QB5vQhJQpWUfq z%Nv<4?V%XSj*^>8d!u&=HR2JNS{rgtT(xG_pSgnLLR#Ut|EYQw&f`_9nhQ!Tq!)rx zGi&Z4DT&pV??zDJ_=Fm@c&Y{b)u7Y@{yI?XlSAc*mRcd)51v}Uv*pi}xNw%QLOTLV z#q={!3&aLe9MDtqgO&JmFxK%I=0rb5$RPE&~Vb zCmb%0NZvPBeje0U;>Fgc;zjMOl62L{^RQ%1B{@9`61 zb%Q!g_%R~+o4Vx4aqj9K(~w-f`G$UC>(UVKNpEu4){*Xm#dENj*RxGDEk%hwwV%;c z(~99-CElBQ+)<6ycXIh87Jfu)8P)yo*1sFUy;s=~Y{8%CGJDtplZ+?xmnq1G@o~YPwt$s|N8HDAjbiJXSb%Gpgwx z0HvDlYoJtPdKZ*xx*vj45^Pq=_bX80_=Fm#@KjCrH&CkSwqV?(c7}mcvF`>-HQj!o zRMQ;=O6f}nrD8f2)B=2>#3xy(C3r3uii5SvgN>lnqy@nm*Wr!MZM5N-E)yHysf9gn zz%pP68>Py5wG2?SeHzH_9r5FWdT)9d*8t}=tnnM|u*oi-;WGK}AT>!TLc4$umI2WX zYhvos2l)n~q#WROh_jj)b_blq!vjL8lAhub0uS@Web9f6F9Z96Qujum@DEv{Mf4Dor_{77Gr9 zF%KWSpk1|OHcHzw+ZFo{ZG+I~mxTD~Ky}}UCnC}(?5pYSZGTnD@UVu^O_+Zi1xWq! zP-;i*fe~8)fRFVH3~WAye?b^Wf3@IX4si(~1z~idC!AaTGj^M5!lWIZ zYhEEIv8uazF@=Ac8WQt{aPDSe!5?h$?4Kq-A7 zsTbSCgY0qWB7`z9Qd@u5Lx8uChll5+$PL!pGRlWKc|iig51`K|B+q=iOtPJUuaYKl>uj<=eM z(rTE*i0#*>s-MxPO8sA6vZNxmba73^QX4R_Pu2K73ntC*8= zo7O{y3~3!-wRFkKl`xeP+h;-Sva;1>%c}Yth09=!rA=$d#zLi{`YbSC;vrWJQyj6S zuw7Y&m;V1Bb8iAyW%2!wKi7MOtD+YbmE5{2DlRDsDvHLv>^r!j<$|c7AOf*zMu7q; zUTOJcnQgY3)hFA`O07WLGuIZ&O4}tg%}Px({_it0&&C7l_w)JwzpvlueVFGw=bSln z=FFMpd1gkMojTW!!*2=~rezn{`+$>gU$DuRaI(q#oVgMqQW7Mt9bywY&U{MeXa?ef z9FEDDq@=I|kFql6%`dRys1Cj@8SBC*5#eac$%jrRAk(g9B?lzWljv|ADQ~uvm&Ri_c16mWoryf7oU-Q?%(rKdClnrg#dEOGOHwKLUiaDdttV6s*RoFlSQKNk#ReYU9mfpqM5E+OF8N3 z5)_7~!Q& zzJx-|r^>J}BY$CP!JPSH?5VlAL+sgUX>+07^ua7;#ud^PWz0<@sMN37zKZuT#Gc-F;tpM2oHgPY$>{$|10os&MfJ^9SYc3<5+KBMA~zt{Bt<@=VK zW`s>!y5yVKNk<(QXPwQ;KkU6|?)4_|`RR?2pZmP{bQ|;B^*8nXa)H~%gLgMH6hHb} zYe$y7cgoYfe4LxR#QIU%%@*{y54=x!N9zju$Dci`{mzij>c_g@V8uxj(AKb~CC{!!aoRj1c3 zsVkiGO4^y>oxTsgdw82S0)9SKGwhd#+V%hF+xC%Pbl&=9<>MVjIxkz_{o?q>7t7X! z{%X1U>E^1g!;=e6j2n|PIpR-?Gp6E#)baZX?t9lBOo@N*#mTW7y&oEMrNJ82CL-sB zZ7(MKe7?`8Tf)Tppv}Who#}h&%F7jDdlwA+^0_u|hm`yO@aHAzz2lEfnD^!{%O2ib zu&ZDF$=SCS<+Oj_`pBe;AG=RF)o>v2`|aiZSKQX-+aZ6ff4TGLo7UWa@c5a7>q;Iv z^2)>ETV@WM-R>^GttUHgIyu5V?ztnQ-#gPe^4Z>RuUHo7$d+ES8OaHK6E*t9AYRk^>qIFNL>+|7<2h1(L&MPfm{9C88$X6fOx!+Q> z_Q~lxQ{UQn_~e2My~gj{8(FnydP1Lr)83fyQ}hetO(Bb}wz6FE$k}+*w7I@*yFY#^ zA9?xtHyoe7`a<0>Pwy|ok9z<6(-XTRmxmpCqRVn$$ESN=@tN1TzqwZ@pZnXdKQw23 zuTP$O#s18Y3*n>Qd}NE)nx*4bmwYyHLfg;I&O5zl^CjE61sRWxdbP)g=Wn*mPqj>I z{Y%iM#eE&GS5K?j`_t;|!SCdh>|AaBz_qq_|0nw0-f76OxBI;1Y#8@g&TPxn+MD{k zl5E?vy zG5>4G`wJ>}oqnXl+5Ih|?)>{g^3}B$xBdF}p^#bTPQjTy9$5a=mnmHz_PXl7pd|S_ z*?teK{m7@fzgw@;%8&hjYq9O)!CxF(5%Kh|n_n9e6SIH0|1S6Lecl?IcgOxE37ON! zz5nZdmj3exP4BciaO1k8#To8}r{22bOyFz7KfKB9$>p<-{Zabv>#4uSZF=hFKKFc= z@#(+Xyfe@-`gpy2-SX`($KU*Cv~%KvUh7`;>2_t2_l3Ht9VWg0Qv3R!U)^-%i?CN~ z?hW(_IQjf~uVdbi=H{eNwBNUU^x%X4B$RDB-sfw-=Sn)Yg-6uS;|Jl85zh8A<&al59o&QwL8&AcZf6Xs^+3lYkT>HM)(#}T~SBC%l zl}~;Qx4txUcfSFCp&ee%dFSj8I}Ua})<3+>d+lbq-+JHMuiQJLWZ}2Fx4zsh{8at1 z{)c~GSnS`iSI8|N%pOot9C3e5hHH9@=kCtS?RZy>`;2iXZXdHOd&QEL1Fk+e`eLm?}r;ay$95>YS%BJrxw%h&3gZ)x=g?{_l zyB&{oJ3jE|u+hIPww68@GA#Y{xTMG8E9dTOdF&y-w)bv1y{c2mjJfMq?K*Y;&HLYe zZ^=U+wVGkwli#Vx8PsA;$|wD!dc0QA>FUM@X5KaD{k`qNX1@E1&W|?^doO3w(r2~~9G2#6csnHdo!gHdoV)VioT%S&`+WG)ocupGWe2o* zqT#J2kFGz`M_REiWz_Q}$)#Aj8@zIOi6`ql^T zYCrQtbyD%o5i1AxOzn5@jW(UfwQ*#9{I=`2Er)BzF8rKc5ZaW(@u5aIV zdAZL7T&Qwfd1laq_M>&#GsAnl+jH?h`(AvzoBKmkqOTmCeWceX@BVz(xWxS*4xe-N zO6N_lltt`VHX>o*hHthFbw9rN(_0?xbkn5sU0(3~XWRHa!Id?)L_PNV(!Y8o%#Pf+ ze%#3Q?^pb}XV93WUBx+D3SZnixObf2>MoL{P5VAyeqo+$Sm zH2%G!+moN`ad^$hQM)&M-Qt$N9Jp2op@DjU zj`XzDf+2o>51LG+0#cNdHDuvjj6U%8g5hXS6GK-Krw0$^>@?RQ{Ddo-X<(FQ(_+n2 z9@U;AMtx7SiQb=3I$dHvDdWS)l-W6p=gr~xX2}i-wP%G{7?n4!6jK9HEiB;o3`a*r zJ#@24?xzoZHVq?sN|l1lho0)sNp=H7J;{0aFz0%esvD6a5Dus`r)<%P&uk(%X{tku zKmOoULO&4zvQr57IopIo!5zy*@b$ii4-M+frarimq&;k3{>#XxHN&A{yUeE*=c74o ztc?K&19iZ(Y0=QjYNxUqgZ8Tfb^_;hACGJMao@zOjC8Ht^|b;A3YvgK(vMSr)o>8u|2MING{nH}E0LF`H0Gj8DXp zUO`4aR73Up>22WS!*HnTlec;8uT#$%`SdmL@iFj0H9%T@p%Suw_wjvRF!Jed;M32* z$Cu%dCMi68%N$HZHP-V0JkjUN*T4sE6gWe0CF#xk4& zT&cVs|MPV;jE(h7Jq^8n#v1tC%5XAprF`uxUz2L&L%G)Txz)hO!En~$N-gWY&THN^ z@^La8t^aWt_=GT=<+!%NZ+^>Rn~i)z4SYfje8LzGz2+gmnldnTn~_hrflru$53@iM z>4)^3wXSWwkq^~ky?!DLd}#jBY?>zcJa*wK47_o9MH~1;8TiC7oDz_>Lo8rbJ_@-p zpI8H*7z3X;hLeaZmHUHF>}jH1jyLd$Gw?}ZI8^JY-D!R3&R>l3P%3);BpCQ4F`UPd z6>3?tVje;vH_q311D_-Vp9u_yESBV%GvVYLMn2SG*UK}(z-JP}nTIRc&oS?mIYvH{ z4SXgU_#`tN@@8Z|-!*iHDK*a56a$}R10OUqkhua^@?&qddG}ExpW6(4rW*L5*#nz$nPK2F-N0ui!=WB2Q9rl-dvt*t z^GPxAnQ7oNi{UVDkJuwurrv4flWO2I%fJWC9`epSCt@FNxtMO`15;?EpV+aj#gdL_C_{=r%LGnoJ8(h8cD=a_stWh4aQhj-)8~Ds;I4|Ma3cvnKpN1JV z)-z1A5uf=6KA8-sH?CB_+@ji|X>H7Bfq_q^fln60p^_#4lWXyP+sJ33flro!Pd3A$ zkJ+eAU3*7em61=5fls!9PcFluZ!xKNk{|XCo;#zObXOQJ(t^eC{*wd4SE1-6i2U$XeNRgT9Fojlvb8a5q5Hle=C~2i}6kHi+ zB%YO(BbYM?-pk^@z>?Do$N>Qvu0XyOklPi= zc>xJfAQlUkc)9}d5)eNH(qBNPDv&?{2~;4_0y0K{+$JDH6v%u5nWR9l;{Xep3gkWk z$x8U^#2uO?qDH4$R3Zz0nq7=v)0m)S$FA7My z0@*Aez6xZgfXq}N#{|T#KC7QnDM~+~D~IH! zW@pSHE;u<%;Zq~{+{ba~d#ZGNV1@92g7cBUS*1We6A%vt@`Hd#fS~t<&)DYV(uj!y zL44v8hSS*d4->w0#9uQ(XlfekXgS1UoB1xGlR!|X+o{D-{>Ko^I z<66vCsZsmt7NKaO6!@yKd>rO#MIC?6YjWL_r;Y#82p0hFGAyYjds0c?- zwFVGX!d(k?qT0w*?+7Zw(NjIjsGv9&+QeTzsZxC@s0c?-wH6RFUwDYvrtpO)RI0xO z72)Wq9%EFpOk)RrGgYM;EQ*+L^i+>Cs`j{22wyY*W|b;bP!W!v>Ip#1CQNFu;Bjho zfJ&7qs0c?-^&}wb*9ePWybXDg<$YOD5ssefDMr;AR|>~|o77vSsu5I#qo-O2h}qPZ zNDvzCIrp(j^`oF796i<3fS664aHa6wJ8jTqmnCeEF*t>%@zYa11Blr~Ga?kqTRAX( zkg1{t72)Wqo&`j$DFY(zxuQ~42r9zSQ$5G1gb_#&T9+XqIjyyVig5H)&oe5T+n`Y5 zaZ9X9^`@XA96i+wfS64(ReZ`Y3_azvE($8b(NnEwRI-FGzCZO-l`2FOBjM<&USw1> z3a4SaJw58!h9Wsgd=Q&16(p6V4w1(&M{a$2VZ72)WqXy(Ukl69EB$C9e1bwyAS zj-KjOM%5Bm3LVFK{H{`U6HbV5^i&%GQFZwK+5t;ds^Nl)aP(9(-c_l_bsBwGrAif4 zgrlc=ol(i9y!xR|=_=J~K}9%vsyB30$Hq@Ru2Q`ts0c?-^(Le0iz|h5FSppFQhh0? z2uDx#79eI*2O>e3x2(0sdOLVHFBz|(TdN)_m037)!qHQ0WmK}we`gEc zsZw19W>EidQ5YBB%&QPxU^dlC{w)>9?O$s$fAyIC?7Lt+sjtw`T8F zsiq1lp1$^bzYiIe9ajotezlaUR5^l*aP(+90S1M^9D5sCwf{ z;e(=AN>!>|f{JkTRNDbjbr_jD?q-#WO@HG#;pnMqbyNeRdV#-O=HBh_5P@*?R677s zb?EH&$#RuysGuSoJrzs=RBpIZ_~otP;VM;xpduVS)hd_as!l`p6WM^A+&1XQxOnc`grQ$942@kl zWT*}@M00ZR5n!23bat>lj0Qz;a7w5n#V;TvEG{}WHa@{YN8&nU@Tjo(nD~&8*l>W^ z8vqAZH>F_0JT)tYmPzHL@HzGrzN{;so~F*pD@e)6nVmul%a=q_+4rNA8WHmVx5tAGCMybdv4ldeuvS2K~64@=WF7* zcn87Ok?}`)IV$TpIT%(mzH{cM%~`+}pYi*Qe7@F9z7xx}7;XkqWh>A4Ls|f(#@IqR zhE|ZnSqSk8as-ufKRYKUD=jr!(B@=m)5uF*L^Gg*k+S4Y+~+c0dHgX@)9xrtg%)Yv zlyXaJ$dntMtn^fu4gs|3GG(PVh8O^I$QlasM81hgml+gAdPZ8-Ttz?twDAmnGY79< z3epNvv7C$pQ1EhA3yU}ilvu!+szE~8&dbV~EoT_F`m_KL{1IzJOY7hkaK>3Vc<;ot z1T;2N!|!xa;*l&t} ziQK6f02-K+)B>YGXBTlPv~ZEVXQTAuQpotU_bd@@3CB_0)B_lf#=IGd?w(<24TquV z0SrgYtjM2I8N@x7FN%zyZ1sf^mtrU%k^pl~jVTdOoJVA1?EVRmseyN4H!ToFth z?uG<}CjPK4v@na88_*Z0!QwQ4yfj{haVdq_YMcy%Xn8%2gS$(e%a@L7A(|=@N7I$6 z!vck3vsEL9BIHHF0wWJ~JVOIXMe5(i{O&a7tn>Ef~(9Sdf#KIxo!;JPfVjHCi`^ zW3*$m+%yi0iwF%#3=fTW1P3VX<*?|4=#WtSbEGS}5UaIinL|B4y-gE-J0KhZfmS9wD#B zXL$+}`J&8HG+&psVc`)G(XnyJY_=lv$Vg{MNN9A3(*ehcCH%^RkVHpZctT`+LRf@@ zgu$|YjfDh{AcJ87(E5IscoQjtNn~PtY)m4`ta)h*a&(-V7Jg)0RD4`aLTDsv8`XS8 z&?HApWNbpTGd{|}_6`UhAvf;|N=UdPE-c2GkQfs#8?wBqK(Jr%2y83BG7yokPz;Za za>mDm#wNiE6yT_c&@j}RkOaX**e;4zLGcSsNJQ(8#cusKn?b*o15}ETTLQ zh>uMO2@6NvrA-VJFl3GjafT%wn##s*M2b0!*XY0*PNLc*d#!jt6MA#ZxnT;U`+ z!V|+{sIE1pP`D;JlER|GV-wHkY6XQY?A{^M<0G!!&3c(}zehLcS$f)>)1ZPr=gKe+?)x|20 z;1QyuBSIsbNSZgEa0xj`mhHTtMGJ`uiwsMQih?E6ZVaNd=|QSmc|)C! z$jGFS@bJiJ2j9s7N@06RpiEfVKnJO)!J>c^e(>gD5lPOZq$pG~d5a0ftzHv;vLZO@_ACC_j6JcWB0 z>^mYcDLNWHgzcI^0%-QlfWcFjgo=Q9dxg+H9<6Cyyfeaqtuqwp@Hn)?iSY?BjvS4h zgvEx&Mn@-v@hmFH!@|SkW1R5yXj&9tq9Zmj4)q|)>4+;t`G}1;NGt^h%8G~#iAV~8 z1EY;J$Vkw}hz&ZZViy6XY|)|8MLNP^hDj&|hZudpBE&Wwlma&DKw~z7ZPmeR8?r{@ zcBS9MdQ1SNXBEJI&y`va9X`_Et_j0NjtCe&8vjRWfQSzB^BXyGB>s*VJ&Y5~Y8{6! z=5Jd5*lgE8NuoI+3fdLabUzfoCt6WV6Iy%9D{d#s(8Y*+)CkWZd4_0L?-DL;eHYpq zGj44-WoP`cdnV0ljF$|&RUUY!*OudTY6fpBrd&2*S}3PI$HR12ll+c@-|`OFqR)%t z^=bxhKH&dGVqPQ|f;)aq$#)L$+kq3)g|PVd`Ay;dfoIPH=TUEl#ts!?czoj?4#d@g zU-C`()*C+xG}Gmf91iUqGr>uo-d!oC28X9#lXwGe0Iwz3_}u^=r90vV@y6Z&9;F+4 zgLqL*;b~T&lP0F&7Z1D*0#_+F%?fkEqp7)Hf%A{RgIP!pPote$Fd1s?hIMg0iHg?) zR&Gu3`wlbd=kcS^9KZf}_BU|)*a?fz9X7{rlpQBa;76f3ep~QtydCT9$dD0GRk)ot zAzvAA9uj!X@w0>eNr8hX3(d**KJY%i4nH#E&w+DJ;Gvo}E1#t|>KlF(O!zfb9!|h} z0w+b_k^M9$--Ez;<~sc7Yt~nQ6XF9#2sAt29KX4J@r4_H6q=K-AD-ORY0R&QaytT??;7JZvikz0a~e3aNB{&Ye$A!(I&i85o|2Cy(%lD~FB{`EO1CA_ z`2jd}8ocJx{T(=FssISrO1CX=dfWhBf8dO|0X!#g#@_(mG~g__0lY%sR5ZqG z_X`}BVO*N>&(!>_xdA*k;5~Z-c+?DSxB)yWt`BbjkKE&rH-JaYTEh+CjR0O3UtBby zDZP+=#2N5B4ecA%uXqEVu^og9mlAIPuMhAtZvcK#XbJ(_O{k4qgi6=qx3C1CrSG7-iWm+`Pun8=%+h$&oQLOcCGh3>u;AngP#C6Jb zzHFyyV%cXBj*YRiBtcwus)eomDI`^P%2d!<#~522&zJ_3+RPS$#bxaO>5aXQD~qu) z@FCa1vh59JhZ}+p{q#WHOH%%!7OkL2&Y z*nx2Ou-G76*Wu^JR#Kw$@N_h;#Vi(%>$CXraz2vsffM6p3cMd0sOqAB3yG= ztOD2NEJjZ%S?qaSvsr8luCL(dCRO9Q0zWV5D6T~1CH;l#2K?OEF7;&$<^xN=i^YZ^ zR?1@2mDvB2hIGlbJ!uL`8CKv2gWw0U;d}>Q*C}lB>^hHP^a?s#XbJkQz{mBeYZqC` zp@yKEyw0$a&x<^nk*P)Lk*t^i$~6e5KbG8D>=tx3KQR3Pn9ObyEVdbwfuT@huCqi{ ze5AxJ2uDHX?c>&}Wh-wY{r`%^tVcQD%gXvQT)9nrgBZ7odc?R*v{S63n_?4zh|##x zi*4Rs%3@`weX+ST9pr<8;oD@pj^Q-t?l?J?&fhu(EXj2VkinUjWE5N!gJiZ$Mgax_ z>|po)dn>9lO}2G4$yFXzNJheb!IRjNvK_wUzCtri$|l@!JN@SqUk*`sR44bwzOt2FoWt;@DJhb*i^F&eS8br9$RG2LX>pc5SO3f!HP1pewdzs}QR=QZl^Q zf-~3$yFPMlFRN+jgd>kiaJEtR;;wK?f5|ROoUaQucDSrTS8!Mu>jA@w<9ya`UzSyy zTpvMIgUb#}1Muu!WV;l~@$FUvX7*xxNozVO9cO^~6!BAOpk}5x!IGZBpV@eSp2eU}SwY$WQM&EsFv^>pmV5*NKQW*W z9>_;I$WnT8G2~k>CK*c+J&NwQ^QE2zKVgMx9oiLieaIq@6|X_PKb!X;8mRc7V};TG zJIP{4dQ}FTk48lVm}2Pu`tOljr6bj2JiSaKyMd#v{hf zaT;P|&TdjFuDo|b2E$F1ssT6Am5A})$)kw9gP)u9G_K|Nc}cJ1%G;l6C3YAw7k*yS z1zfpd{)1RPgV|upT++^n6*Ab(h;2g5O`=t~D;R7zVpS{_hS(|=quEW)k2bgG{O(1J z^P`4_^P`Hx`8|Oc=SPPDaDJN+yN~fZgxC`-Hjy9iBhF7ahE4^Kss}-r?db0Mz3hsq z*qhEH#?edi3DF5;6#tm+KJBVqJ3*Y_G9OG~((>^N-lF{YQ4`rLMK4_MX0e{Q-oav{ za4luASX{{|c}YpQQg6^rnu;rxix-9kRvH#~(y)MPj_6irnkV7_oy*KZn9Y}Tkb6hy zv~Nf4@~-y;5<_6M%NuRk4r|b*Vow5Sn7Rs}DW+=43jXMTTP1*bqcA{9|-cA3gPmyphnluq7>B&DYY zavvy=J8^3*QyeFS6f(3Ua?P#mX2f`D4?&FEr30}F{Jf;4xYDr6OQL=ex0KyV>^NfY zyu+*b@njQffJ#JI0;AoeVN{HO)~G(mYf9Wm}nW+TQu3E4CEB&CRP zPeML{m)J(cYVmWEHsi{hxEjQG$sR$BQ+$mW=Rzj?IDS-X{`=4iEZiguu6SjEm=#wa z7NdFIRxIX;YkwA_H1Wy;c;2`UWU=nJ(w&=R$MqH#BMwB*Pek)$G18`u#ps@VvztVE z?Z#r_W4nxO95hfM<>H_O2`}g9PagL3FG`cxB|irblhF`)p&Cg7fXRYcfZ0{Uwa zr>Ff3ad&ttPddJ^JJq%BbZWV8&{am_Q++iF(N|7+9P8)TUN!^p+4Q+c6eysAtnjBXf06 zp={*zH2IcO1&WYLt8R@{Le%Rjy9ueFa*aYX{zBE}`4UKvlL46#!7lm;<8 z_LTCJdSF}!bdC*AcL!oT-NT6S)V@$+-zu@Qh%IHDFCxa%HKP{tbZ)v0ew@WVN9-XMJBb)+-3veXIy2wx&my&> zZVJP8mtbsG`Z42xL3v#~MhDG$3S;rSc&uCX#bfN`G2Wb#>*b9tF``PhQ`Nzo)UK_8aRb^u`Rsbwon<#T!!sXmnLYsqH;A zx|{xKP#XD6auU93$3US$hrqR)hCa2_d*q%g05M*HA`#;rGZ``A&6HTW5+m%T_<6A^ z!#(D`xaU=bY_J+XH#YuVftZ){BCh=DhlufXcO%Br{Sq;rZXIGg-QSehUrLOs3Qw0t z`aIp65aXN&AXW`rH+CKwPj`&+bTVS4cZ$`nV`!e=WUXDrTY zOks@&FB?1L;AKOjVqP}nUU@7^iIK%D#m`Hci7PJ~s%5-v5MgCaf6bx?Pjfyz-^Zb4 za=Rw!W~OBtIcbi;Ta8-=XPfWg28cX7j6a+ObreXUCaDcWrGXZILd`4w&CP2EQ(?$wb>Wt zrRIVGF_z>5;@AhC?0hnNY5`6h!}2~l6%S{avDGp5bR2-zpN|mx(`!NHkTkJWg~Sk} zMVVzz-rTf2yS$cyaiGB?UMfqed3mXKf+WX2J7XU7flylFkdGyEUq0&_-__X*^TxOL zJb64iq-U?6-g$fNsV)P)1m-OJ?wwc2oyLa_@OUEDovf9)Cn!o$`qnpw; zd~vcz=WTz!a5dy`rrmG+qyZN9ffsi5tqJ&-{|?*poa?uJmTZ0Vwfm<$ z{lS9GqZaiWu`M8TyH~&UDJxe!+GFI_fVW5Y_u3dY`suXXHLfYo|M1}*RUHN-m(2Xt z;_cJ!=~-B#ros>x7K*ME^VIG{;O^?LmoaIQ@En+!`plh{`-#d z&-O1ZUbcKp^wi!r?Q;h7ICtOR$?v;*SO+{iv2IY%goLhx+hq?t-F4tiWe@$*;nj zg@1RvYjO8()8894@QtZUBcHhW{$(ALE}38OX_xC*wl?DY`oHC4kK|*NdSqq9?(hET zGk^NcoHyd13xlhI_V!!*&(geaKelbD-17ESUeNeN=Krzde#jGahH%eE&cS>Nd5RQR zDVqgB+$`Dg(|)o_eI2ujYCP5dp1=Nr?hdCC6D5FJ3{)){75NsLu1O7kCsU?k6%;Vq zc(rj_Zh)Fi%qH?y6x$M*haM!SV)HqG(UZnh zRzS@r@>k>w-SX~yN2U@r8&Io(ig3-QKX9cHN70oIaGfkIHd6!;LMu+C`Fx7}tJ&nh zwHDS?aCAo|QCC)7$bWR+Ak6!bZ>2z9ngZeImw1yeR;m8ET#WLPseFk9fpGLx zG)hpnHQ4sfq0K6llSmK)G@k)d1IrIbAd70(uq~07 zvi2}0Du4avz#UlotK~yYEw(H`!#fnQ_akq5#K?zgm7Y&?hZgk*CTaKI^($X8^66sW z)7+s&TYyOxupzPwhJ$3i+I-QFNiR=xhZfm^N#W<0M?@R>bi)%ppXLrNq7*4#V>@<+ zni|W~!@#GzLC-YWGMmUw$?wca+u~>BL$5FN@-%m75p`-Q)r86GQN0?=)62leZjh%p z!|8`B7GG!zsX(Jlgny-$U_@(;`XqdGE_* z)}%$&rN?nIelb8U8z3}M$b+0#2Lr@z zfDAQ2#u^~e2FUFONTvZ&V1SewAP*WK&lw;z>8Q`wRs&?00rI5*QfGi%HbB~vL9!t0 zu%`hs!~hv%fEc$^o@l_CZGhw(Aha!>UY>^pq^BfH_^g0*1_X@-!bSn{Rv_;RNCyU? zol@|wN(ADA)p!{T(?$kx5Q7jvVE8J0whKPpIUnp1FkIl!=B_;TPXtb11#&__>PjRC_w0D!h?>@3K}9%vsu6&gO*F!$@UZ>a+f}M7 zf{JkTR3ic52kH^k{8x6^R4QN586_M&)hI?~A`&IYn$H$ggrlbl1Vr6PO~0|^Qb9#H zdaBWkiuw-}{G!&ZS0#K{P!W!vY78L!uuh^1s=f;yG+Dwuf{JkTR6&f2`luA9e)FqK zrIMQf!r`3yQ1?Ov4jHL~Xf1p!@Kg&Q5S$P!bCD#6pduW|qxo=t9HTm=S2SQ#L4h4D z_=ZRM^8OGbL*ub5G%A7?Ytr5^%6iO^iO$5NgxDxrI!;470OxTPaqR2dp11{0#G_pcc^01gV2P-Yok}`^N zpi{CDY?XpTE>ciX1#Bje_~hi|3lxWTg)rHKW@i^Lk*w-Q)i^GWwx>4XEQI3cRr!yoDyNAe=lUVLuh^6g0*yV!HPb%2h zi~{?bM8!vihC0}sB~~~WE}Wf)Ro#TGOk2{n1X%SPn4wUH#5$rwqr;*j;;_V>wk+Ul z&*hm+PN1t=A<>RV?2{G|9_!FdZ(OQ9B|SUnp$P9o)5us zq$XCG(*VvT8f}3Ep2pR?K6u#B2(P)-iG9%Q`HQBHT9l?%pXLHS4mht0JYwA(zmI@( z{5t&Rg8oO~M2jYln#tz)(YXf;1zvOVWrBVYaK6>xHOH?WI9D`yP33nf__cJyH;wpF zxR!j60q13b*PMLRk)@sezt`Y3C*K+1T-D$;B_DcYk~?OdI^##-TJjA9&KQB$oP5+p z4FgV*2Cq5!N`WKqJFoE5OkaU*!j42tsS)e@Fje*>lXCS-Tw7$s{(@GrD_*+ z&K7sh_FA!z-L=d1S{T0MpMo^I)9(~9Mv|5O^vwr}GI&0LlxO=BaYu7AUeat_sVD3v z(EyU>KD_YbuPo`WyLi1ih{Z`HkBSS07XRv*wG$`P+g2~)Z+E32(+&9+m$~5(QpRi7 z{;nL)3*io1VL$o%Ygaf^i!Trhp%(VdLV?wk?~yWN+RWNa3xChLpL+8&Zu62-aHT56 zB_d}+0k1@9l9qk!3C+ID{|`P z+BK-w6z&0X3(A3{bk*QHA6a>!5Q7UzALyvcTZ%ghvba?E_=E<6f+LxaH!I5|R~OrB zSTi*NiF?yeF{M!{Gi&>Rh+7S@BIXoYN_>`u=HJ}eS3>NoD@M7WJO>S9+}JA()x2zg zQK07($V0HtUr>p1JugI{bnuA)FCECy-Q`AC_ABCLG_#g$umkASLLvV~0h4-+F%9J1 zCFO-}-+a4o7FPG-EpI+v@eYvq?oxJi$FadId-cq^$z$xZX+lMLODn&feeRQpA)#TJ zJvXPtcwW6TAnNkZhiYc5xqH&3Dccvn7tw2%wQ}BylN}D za&z|b-HGKhCjGYhysTsm^a8!xS{OaCGFw&7i_ypa0ZfXPpN-0S_6 zF-y$hj~w{^)i-voT~zh-lGzWY@45JMwCCmJ_U8iLsJrDz*2UMxZuef(`SfR-ruqCJ zEt>WCwC7o#arwV|yGUIWebBz^ppJvtB>TD-CNz9xoQEbSrk{%y^S+w-Y-+#Frd+z> zH|nR~Uo`TeHdN0?%nfV!P@7^lkq05C`+ooat&DuE20mi`Si=Wo;6rtv?CY*$ouZ9= zS{wKn=jq!poTa#uJi|QRt2FYVw=(*CwPBMGT0QeObyO2cp7Wy))EfEFe1@J+TLT}e zj%E{GNuJJsz4Wt@kEel;&A^8oGvCacd%}jRK)LGz#>-n&V)4g#~)6%pnN^(pG`Y77%(H%yG!hc#t6_GC;v` z86b}eNPFP0W09CRq;=9KKk|s?&`R;6a#s&Q%E293ID=5L$36g3Aj4=5Z4Q29y_||> z@KlI)h6xi~&?3L~sa(rH1&LYeo z%eUAOHY0mMQQ91AnJU8;YKS9K@(Q!n$&Ij-g85*;QVzw2;8|JouqAjw-kquQupg;B zRfYj~OhRIGNPI}Bc96=p=;LEz)=cm%-3W?3Nj1BIhDJH!LL!pl<3p3MQRc#&JZu!F zwjuIfZrJFIH6t{JZaviBFHk#%yxzz%aO7x#P9sYT8(Gp>jN}w3G&Qo^#2=~GCPtQv z@$`EYgT>g$vQf|8grb~=pEfuohhbk2I}oPx+M}Yv148)!WM7XAFd20H9{U`c>ih5e z?5f0gUrIp>;BgO&K6F-sfOle{WfOrAT3W9C+?e41F+}d#RL?4@p7D44iWdLszxA&3 z9{3c1hyTki1=*%PXdRpxkIW{rOA0H#d5T5{BFN1K;pklzJu#c?xatEnROFp9QkX5J zP!07T2CG%V^=jxa|IwmGQw?p!YAC(bxk)6{R1Ga|RHK@k`+21iUQ=^FG-$iIQO#>^ zEPosDXnh3*V%^kS12qEb3roU8Ev6j{HLuSJM%{qN!0YAf@T10U6L9)ap&(GY&GEYh zIO8;UOuj~Q15u!l6gb3>h5y{s%me)m%ndBb$ocR63=OlaSWa$DYAEt>MOYh(JZYFo zYf*2)J`z@p?b=6IMp!D_t+YDu*R~m}7|QlE%&etMQbAKNiBEy4^~F#LbTsEs>GZ@O zk4h)oaiY@cv76b>ZYQe~jDg&|%e92M0otLe=M*fz8&BWyyV_w~=?h7_8zmiu6uU#x zq0tU!RAoDe8T5tgiY@Z5DGf!I$)`xd0krvx80)z9k0GG(xSNR-1_Do$+IX zW!BFj3bPnJ6VzRjol(N%4J+0sl^iCZ+>#yZ5wv?Y42+L`{|%Q+m8G`XKT_g zThDJ;mp*#VqchiCJ-Yghehbh2c(lDqao_)!POE^jp$ppnIoYe(B$r^%!v?Sd z(Zd4xL_T@!iOgf?6k+yP=)EbA?Li|fZD^uTMJ5o`2(KxRy%~6~0WXcl1_)GO&3VLU zfb)jHBk`K@*e?OT6*zN68C;9s)4+LM;5EnZb3E7roCn$T8t-d1CtoX!;%=gm971#a zp2o92z+sa#h||EPIevcvuO&Gqgy#5d#WNdl_6a<9+&9P16CTA*UIn2!en;_OAaJgd zM@68%b#wd*;kzoxe<3u-FB;G82hK4KUUU4u1I~F3UQ^{u)#7j9gms}*dAiN5QH9iOjE&9gG44k2LIuoX+v6p=mDNhk)~(z-unubD)0}I8Rbv z4&hq-&H(4Cz-x}*54@v8*RT7lObzuDmN9B^7@F?Q&TH7{Qu;P?x?Yw;TgoOL(A z?|tBWd>wuy{^!66S$KW7ndcJVe5S!`PJbtXb54WTl;1cCewTssaW`Ye4@vaE6O{&1>gg!keN;=Oi*c<{*jq3YVN z5yh4cUw8LmPqE*_B(~@A*VBExaf4Ui>9!$<)?L^Ub{F=2pl@p>2@KfZyurX|D zjV(J~YA zSp2Me`YUID58||om31ObsIdS>3|aIxd>lw z@Df7acp*^)^18V`DyzZXAMG)B=Gv_>ran;M-ohTP&s`tM=F(29KB9+3dFVCh#Z=&> z)!+z#RLkklm<3(7-Cu+~Gi_!wtPPRYGniwPmYmtMN*Q;T}M2#LE<1$&#JfL|5$G%(KMk+-InS#v0NE{9qWKNCvg%8ucRp z7-}y2@mzjd(h=IPUDOt7sOra!*wav{CrpMl)g(N1_IO>n4>4{m&rz{5b9faoZY-EU z6UIVmabvj^IGlDSVw`pIcf=oQKYqNP{YO3r zHNTNYp-MYbr5#zlb{!MGCBHe}BK%r2-eo!@=XoXX%=1dUCN-~5I-mjmb^s0ASo?E+fWGCJ8v)>(JIX-0M^z#%b?IjMF}bm|Fj6(oyScJ_0|b z{$U?k`l8bROwCElpi3_I(!~}_p_^@Uu6w=NmFrPf?U|f}w>>`Qo&3wVSiEmB|5~=& z6I*~EW*;f~gWcEo@u|;f#3AvOPP^=ja5LW1=DP>|pH@X~fF7>5 z;JOd}C%mLW%hSFUbL5Cb`|WZDcErbbwKi~5YflsMK~J-_vCY*kOXsJBv#2$6fgm628-+gMA1#s5hCa8(CUq=P6A+SCtvsKPGk zoi?G;DpnJw(#N~d*f$3ohSGZ5J`C8NcL_!iy^EMwoO-iGc& z$HLBd>|Q^3thw-<%jAl-RJv6rSn9{&HCUjs^BOi1vX%b}5&{=+S#L$oiZjKLCCE*l zbGI96QN!*C3$7(DH&=oM&tm9VLD=XxpTWg(B|WgWyl+t$N=j}PJ!^r~ks-C!fp@b$ zkjoAHkZLKo5swmU@fXA+?66q9{uP(Hk3xh|BDnW^vhEQ!MnbO)ZMeL0gC0${$BpwldMLa!SCi$Urj+ zd=iY845EP<#8kx~ra}&BWrWprfXtyV*yScy2h|iNaZ|`uO<}rh3a$evz+7e!wy+x4 z9&Qdppr@&14tO{{$!HP<-LRGDbkwn_b*~|L*hFjC#CS{HGh7&0lpDz1>T~hP!GHYMm(F6b;(&{?veT*PvEM_*d(Gv8cjg9vl+wsjWgOzDOB%u-A) zrvm2&`~cJyK$7~c^eFPJ-V$^>4UD$%X1Ot$Qbu$s{Txqh5ci{$R7ZN7`?n1YH0i1}A< z0l!j8!?x;n03fUbXEf}wEsG=Od!WClZrd-Ozy|FXk58PEG@j+e$eL^eC9Ej57)tG+ zDizfg1yP^HRXdOpYQhGtuUghzGu3v|saEjkt>`R%2hk^$2J%ui*VESXQAx@^*yIF0 zMAlh}M3M7gL{ZEpYz*6>cNyzAHuM7;(ia`ez(<=l*8_OS+j_=uD)YR1nCGp*_z|Ah zgZT+j5F{GXb3@rsx*c~(9m$Qix9y5#fJ8sksEz`ed4=SLLca556L%AJ&!*_^(^H2}Iz{-Mf9BQ)*JK5sXjq<&Pe+}9m zR9oO1w7a0Y!+gqoZgMg-yCjTRHBk9^cvvv@; z@Dd>24!R(q2w2#TE7F*RuS_uDTp7aBDZE)ESlGE?Si^8utNr(aDJsTO$VF{tr}4CO zz>_^e8(T}Swn$ulS`!WJSPmp7ViZsYEKmpQf0W##EIF_LFu9Lea%HE-K0~Sd?|>r; zL|((lkyU#5lwHQ=($tKRWu#*-ebN)WPlg9=VkKcQNB5QCr zb@#a`+~I*69j*n&lj_@Z5H|X*dlu#gq|&=Dg%u8^4vxE2*kAComD4FVW6_G16IS?1 z;XA>mj<)0|z57&HRpCiYP{0#{u9M5%mB@Q6=r^s1u+~KZ%N0zftg&OZ!v=Qt_QKgg z-a$w2;TwL#^)j(LKx}8SkQvP%$=uk{x^`bY1P5Q%2kgy%g(7R7WxskVEWa#%)Af7J zPnNO<-$m2?8z`AUzmlG?;-!&Q!XlHC;8%UkyOj`V2Q6a5pIpG49#$K%&>j)KzaGwIlJRZTP9fTDB2<_m#=k zmD^V)T8Gzc2rkH7SyTF*&Br!od*O6g#?&!;3f5 zfEbAFToD!pQQj(+5a~NLPpHWw=nEVrcBvph86V?&x3ZJLWtTeJmir+Cw#}s^XM+!E zLUOqWxfOominIhpSPJ)R$Jb~y-AN^wtsUZqW^bMUUQFWJV)wafU=y_sBO68uKZFA; zrV+?x3u;%ejY=DRo>EsdmQfY-yx?@RWA-@Iv*Gn>Fw1Ny*Hj2yn1_yhlt=woM!Aer z+R8)F*>XkGnyhP62M{&TY~`MypoDA{G)h2Xu2M=YNtc?fybk-)HspIGPZ50%S16Va zdaZO=$HF1)$HNUaTlo(B)#|}z^REtSmon3~njaZL-HPi3Qwx*X-Qq3>$-SkUyD1n% zoAL8vi@11#IA@&`Mk*R;rVwVu(w78Y%D+c_hu`O#vXaMgnv0=)& zrKbadi$)#p0TyS6rL-iP%5tBl@rQvY`S{>=lek5c>V>NuYpNLDA^8Eu3Bb3*wM-?t z%2hs;cj5}rECHffNdd}bARM!XQ-e+d49=za1J0-EZj}$sE;8J5pJNmSb9Ca$eW>oE zdkE)}1>a+bN25W29rRR}LH`H-FiaX_D_NT4Gau+aKrayJ)tsvjI2AKat9;4{w2BRV z!S4x~FVn7InAAX?1$t@8PV(Bhby9u+K+JVp+3+875`uJ&0)&q&}^K4f`F<{bVY znLV6{l0h$;H5IFUR?xFmK3{Q^9fXpcg+%cZh7OHFb0$HrNiK(nE6NX<3UDP-o8XDl z9ejeK0t&sU*(C8;W8EF;g`9u^+81yb49Pv~2Ovk(lGOW91Q2%91roVa zr&$9;4!n^@xAB}IaM`(-csrzWY+qJm0fWILk858|ox5%GZ?0Vsq&wzo%$JaAAWrwe zirli3C1sb!FM3+Iu$o^yZJUqOd}lG^xIR}4SB$07y)w~)PSuJ?YuzGL`I=u)hnN1+ z(16}jq}5#6rCW7nq@`{;f5ac8+p@R+Zu_aa?p6-v`~vDX!h$?qo;AO?3rJZt4Z1z+ z9|kK^oj0&q&I_#&pFkvjofTl*w6D7aZvp|!c3W+m_dVdM+2t-pSC!D3+28BF!ZXk& zu?%c?g)Q}TC0XmnaE>yx08r|LxRR}vF&0XyvIX@;LaY}etq#(wt-KJ7E=07n+sYRZ zOLr=U3yzj}^4kD-!DJMKT#z1h86s62<#7s%tFHOQTjY!+Aa%POR#JB9Vrw|2i7wRN z(lETikNJAnIr#Yt5msA4CpHDc6&=A8-H!MYH7x;#n8{NrqdZ;lR@ZMXhlRSWVfcJn z7Q>4~WO|$8MW$AF0u4PRf-I*zMNyJ$D0moK=@JwgBqHGoZzs82c@|e|oMq|91YG6v za~(#ye*EZ69Ou+GuVqlOHNU5;$b+1RRP(K+Y}YySZzQ|zVT}Elnjw^*ut@Y*>S6rI zvAh3;x@k zh+}8a)M+)o@NaD%&Y^c{#w3?81yU_~9O0yKsCaMv2-v_#ZUa~^ZH18sUU0$=ZsK!# zw5UFiDxHJbLJQ(ewm=J@QCY@Msf_SM&jp4!p)$e);IU+sb!Vv5$sdKi?&*rM3X{A9 zP(aPkROc}rd2zc`ia~E{VW)@c77EvTm3H}Z!9fhOrPyLEik?bQ=k?+87n&; zqaM<(ps+_Z4C9%DuUC!y-^`nksbb2KbXVy{UM0eMAp}*g&}u990WqZYb6GDqTiOZJ zR{rf}z*@G75mJ)~NblaN?S*hGsONEo=xa?D0Z< z9x}a0U$wk>)oKsr`e}3DiEW7=&_w+z@V#aZLrFYaU2k3o{lM1??Jo79$)=GpVPvk~ zCZHb58$qJtIe=p3^^tl?Nun8rc{Hwsr!FyL2#~cv4v&l>u#wdt)>*x*h_Q_n@6d>J zO~v1VWE=cM@uR>sHox(jD)A$EZFM&0t>M7ntn0jOo6k{2Ew3(USC!E40dg!I{fSCJ zWTFG9%O&ANp_-FcGdnm4RkJG6vkY*{c*Q{Wpv4TQx{qOer41jQu-5`J`lGLj%9f-U zuxDKyU_xc*Kron`*E#Z8BE_ca&>>_jfz=w9TVH#P_c@x9{k*l>Jgt*`@55gnk8bVXl)dg0K*CueORy z7aAHEYE{Tm^fIccmw`7yCg9OTqkG-wKu{BD?1@nwS0-3X|H7ojiZ+;{KwDT9LJhQ^ zt>S(FT&)>%b30dvr6X23*<=y!Cbqm^Ml&9TbW0=n2^JThwuBJq9iyN;frj1-^<3n> zTU~@sD7ht;n+Fmq%3762auxOpY**;(vNACSwT5fz7NQa3!k-NdrGN1$U#b3P@{1s% zRBaX8@XVDY%R`=LCFbMNpS6og>(=#lO%~oHbX^wMOEt{jvs|3FO|NMpC&ff%C_`;d zs5osE7h4PM=2>kOS8>yDhXr}^vS2bU&m!jI(BqlHOSmVoRn^vk3|dzE z(8%fQCm06qISyW|Y%jtf1s_V;*=+n_Hur8T|LpgM23TNC-N%Rk>yYi-TKaE$|nJroa4pTD8Z(2FS(N=D7bV??OS1~R~N z(quNu2)}VQcoxpvX3~UQQx!k{TH*<_gsH*--V*3mIJ!B*B(qfN%Adb6!_=0KT`rs& zJk#e&6pow5Jk@%(k>)MGUpkSCrVUIK?g8`V?u~dSMTkUYJy?m{d*aB^rW3FGL8v5ONz?FKu*s2_nS* ziC#K!d%^S+ltMFJb+1q&RMCX7?ECdUQpx~fEWI?w(n&EEyt&kBgc62EXoj85I8B0$ z5UeR(jDtMT1wDqCll)~x`0ErgoUlX_ik=QSe4^Gcf556rKe?*V1RQctGki$*B)|Is zf9l@CMXQSs&iqHZxL(C!Gk}_kLy|B9VGo#rFd0{I8CNqIseB+V$w?wo_2~`q0PfBz zjBDS;FI+WiD~`~ouNBq#L&`2UAlkC*QuU%X?6q@8xSjeia!tS6?%^4y-d?)x=$`ui zIN`WM$+5Cajyw%=7cF89)_{BEZ8AA$-{E3hPb2d0N$fQ_AlE&}@1yv_wS-0RjmI zg2^sLsfGy462z{Lz3YRI?NRJP2qGvdVnad2`Vb?Eg(gVe?>YC*>`XQb@mJo@`^S4f zJF{oboO5okbMCn(5M->%t&Tbkpyn8-@-C$E8Ij5-jj7BDM=ZX&U%ePZB#gmnR7+i&9I`fEL>&jkRvX_Qz?!39;R5+e zuOnpthC?{)HB%u9B0?G}XxOEBZX9n9Vb9g^w!P+GpdHiEUh@p`1RHlRC%-j;>bO!L z8y@zqZi|5{_2>`<$Pc<)f_5ER6y=L^k1sG=jt#@)egf7&&s*CC>6a$De5kLG6)z>bVf+1 z_|mAE6p7kl!U@`02=;W*VOyAgA2z zv!fPsPPI=)9JMu#Cy3voBm!H1U-Yaajp2G1m51w>!Z>y-15u zIeT?GS9DgxJAHJ>dyWphKwS85eH5Wvipv+@A};b9t%yR*dd?Wp`-`mc=kG2eKX?9W zgH8H~iZt0rf7%DwpYRkg*qi{#{|mWI0njH8g@lubUvO@77}tw1-ohV=sclDaDV$Uw zX>jzyH^w~Y&zR!dG$`rIZ}U8V1RVcMd45Z?NRjs(DSClC=RXmumh!yeYs5umhDU(;J0MR9f1R{GPvwf}*qfD+Yo@PDO5Q2_KMibBGP z&o8({aTwQ&Fy6xY0J20;IMot06T$O$0^wp=e|6LyAVI|L#$UrTMDA}zCW#3BS6Y!) zO%)ty1j%2-X1y8?4vs*hTZp8H0%KqB5Cy$iRzf!xp1QRh&8bQ2`bi413#NR3oiEfH@OZWmg}N0 z4KASNy6u$RAE2e$Nx)w8FNGFT2ARu2u-DuQ^nal^@s!?papSWw{m^=w~J9~OK=gc^x?>$>DRD73jdK5lond&Wf3 zt^&m~od_z^`5_We^G03KNwC>Br-qTn;312BHEm$5K4fyIR3Eat!{=J09xGH7j=7*p zv3dn`9~%px4Du@%442It`c|3+Osr|cS{|}6{Xln zUjxfri%vPv9aV^!0PpX~b8`gI5m0n$U)_cF4y%)i>Z+3;=sjW`y zsV*fd4?ep)YIBhedr>FwMfNR_IJ_pR^(dB$9imu5pB1wh-vp;GmD;TE>cuw2zTxQS zO-%*fC6Z<-={a$rd@>o1;k~}VLvMrf8J}zY#T|P)Nom2M@@zBm$fBWf(9-tJM1q3D zk@1ApTGoQO4Km_1QrzL&NdauQ#wbVlEZZ$s1wvf$HC3ze*+LfuS`Bp#_Uf-qGCXm0 zZq_8>gA(|AuA`y15UmE;XF@|+YpDrC03^j31OZgq=K4Y zSNv$MXU;p5ZOT zvtceVoh7Q0+u{iii0Zv{4HtlWZr6qmBt%sQ<1&D5Yp$XebJRPVC;-?3xOy4%LH)5t zYMXab+!1m#ZH|U+`a2>ZU9gHi5qC%W9$InUuCbw>p=0wbo`9GhlY(QBz?ti6hY z%EBpQA-wONxNQwXNy!5xY^y|47H?|^2NnxsX!qyuz$;G}eY?l1C~Mf^JEj`6hF|_d zLQklF&>^E$~9sXXwSEN=zDjqt`{tluX z6-i0?D$)&EJB;>SX=(N>Efv^BS-G&424MgI8PjKK6*pU&aBP=xEcaY4eBf6j2} z(xk6GTwPnpOH;!z_=6HgYU5WR1xamuGX6O|8nOY&K&y*>G(0i6!_XsRYj9&5rc=|w z)B7y7Y3E0fMVnpuTL3GpXo|Mbyeo8~nWd)P(9|Nm8*U&*jHxK`@R<`zikTR3gmG_1 zExt_miKHeZ`YKd%nuyN)1dJzQc9BByY;Ss>hF3p?{>F-dW>1MP&FSOqsL@bg4XZh3 zU;Pxd%c0djo1mateMMBXVor6qi=w^A&!Jy`?=5I6^c$;Br6K6W_bP;NWdWkVowtrO^oDzydG^KF#& zKI)>-BO|c2mW@6KX%nMUp-vi`-=I?H2(8U?A;*v|V`|eD*gKgfB1IhbP6-Z58T`{E zDV*|9wlq5JM*8xNp+i3F)I#4n9GZd%XLTLs4Vbr_fKnyo4l$qPWFUoWO8&-BDk%Vt zrKO`JXYWPq(ps^H+G`%l0Gn07g;AW+Wf0j*Xqi_p&>Wz z2uNrp?XOa! z2ywX%&lItrSm-+mKDE;;g!vu^g26-Oh9mF852{gMfifN?Wzz!Cq9DpnlIf{wLox2E z3c*(iME9-K=_b+e`1c|-+)ENgS8;^?QBmD?${y?_5;})$2O%1a_`Zl&D2Y2nbC_Uj zY){2?fo<^dx-%98hKIMLzMc{$i>Ms~Ei`Fjs)3XgLrJT<2y)c@h&f@Yl&@|iX+rp5 z>|i^1r22$oMT{@OF?dM?Y)N5)u-qm$0_MjSPWqzU5RO)y%ES^wQpj$Caun}mT3pO2#5H+rf~|@)U0KC8T1JI)sinYC zGhjhMb7E^3-iMp<^;U#c%M1!IhDs2rM%5qWPbkwd$X{NrxI?|m;b~(A7b0kaS8qFF ze=#r8mxgs1r+rJEw}5)H4fla%M`Da9mm#v4Z?&xU03J`Hc`5o}sX|HDVa9%SR% zgcIIeTg~3(UF^M;9SLDdCI^L3Xp&^7axATn#WUQuB8+<7hJxK%1&pQ|aeN=D5~Y(# zrU`0NLllULrjZ4KQbY$wzsZ`uk)Hm)`|qa!*+ZmlqE_WFplcW!hxm%A06oFb+t4`{Mg}gosZgy3odNU_(+%pNzTE)m4aRNJaKC9#w~mUkm*3U_ z5|WQ<&~U6Tea>&!0upau)1Uzk*g@sD(*TLLH)_xefDZ86p`BEy1duQnl-gOvEdwNQ zQ@g0Rn*a&i9H)xA7m&d1fr%_3IkcOK8`oV8!CxBm&u}$-Ujq{1bM{c7^?-zwdO$*Q zB8r{BEdwNQqs~)t^8g9lPa1AOgo^tCkl;Q4d=>XBAc6Zy!+q3C#kKFP(meu5&>hrp z{Vz~)R{|3L9@lUq`lz_kePKz4)Aqtv%w0}_6O_fvV70}{M#`YXyB z=9mfSdWIGO@-lP>pr;uM8z44WJCz}T9$?&bK=(6r6Ci5zoyw1ZXxFM!xpSbRyu;8Z zfOatS6QB(Ytr{du(m9nnK;rE$fCO*CU|5}Jx_uWZ${h?H847FM48;voeY*?Los6rD z##sOiT@UCfh7JP~H8f>7ENU}uJs{fu>r`FLpuTe$NyON05UOj2v7(^KLIi`bOexvp+5k%Vdw-P zD?_INg)*d!g0*voEP&cF6b7grLpDI|8FB!!G2{f)fuV3f9T|!MWM?Q65N$uUDp7zs zF*FcRXNHCV>cUVoAlhYXRbl~kWoQhbZVZhF)SV$0pm2tg0rg-g9Z*k(vH_718LN^H zD1xEMfO;`>DInTc4pRw$dNVW~P$WaM0A0XPDWE;KP6jo&cpeTmifci1C7*KzP zmI4~U&`LnGInk=D1~iDFwSdUPkX2a^XfQ(?0nzS7t8xpVix|2C&`^f%1~iPJ`vK9e zE35J_py3QX4rl~JPXdZz=ovt<3_TBMBttI&if8CGKrV*10!mW;^05w2AMy$w#sC z;3)5LPCgno4M+Ue`xe>OrJletQ+q5k3Cj(zNwv2&^@umkW`8lE&l9wv-)$R7f7QR4 zW_uI*V6nUUTT|SJ?u6Y&P@Fj22jFz-3j?CMrKNbP)H~ zaA7!tJ6%>DW;HTIP0!B^QR8x$A!7Vr(rWUr|KUx<^?hqr3jcJXm?{=Av@YhfUd{o zRF>iXPlmSO?q!HN{3}HP2P8Ux?*UC`9Hsd!xSY7eV3+>eC>KN0+J{uuZS9<-S;QU`}(yRV`nv>GGmKG!r! zW)8jMozknRGr~T(b#;`|_SJ8bxGz_pq||O|q|}a7_b;D7X~o`oyQc#FIb5{#b}=Qo zy_U)YTLr+ZJCdxCcpStyMYT|7gY_G-c@c&^Yy3?ad*IgQg{>^HZpGJ7mplAe3Km~F z`xIV&X{YhQK+2UCErl;AG%m=cEyvy;0>F)*P9Oh8irt>w2f0f`bo#*st`r~pKG zt3p=E{3U=UNcf=ywB-`;GGMlYgWWKCbIw@L#Y`GmfE_Y`ol*GWvyIJzcctvddIn6@ zgwTrarClKcdZEMkzj7d`F==4T+Y5Wz2W~q=Pqf72HSvnNcY+0SVLOxV9r5k}E~jz{ z?!xwHDxj4d_IyCg7@7u%O1db=*8oEEs90e5gxrg`)Pua=qhgG;RFm&5=rv$3|M`_| zs!y60b!&gzJ)MdYt!y0MS5&=MIsQ4H-%cx*oNpqe`+PrA6hRgdv%~jx%=@$|xFUj; zSh^J!(AH^TKC}Hcx3#*ysrut4Se357aw-l7=gb9xSen?Kh;V&~%c+#({xL(VaWCgM z(Gc99Gn8-S+9+Y2>Hl?HY~PH}b+^Gd5$qAI{1YEi`AZ}064|t^wqeuiSN>`7M5=GP z<16AQj*a@klnj&Mc=@gqD6+zIR5cd*c2290gg?7+IhFCai-C0^pbd<}O_@PAIGo5v zMMwEJuK&4^kqtA1%-M3t-hp4O57~1ZGU_3mzJPMjS(JnJC%+-{%v>9Nxpr^^)ET!BUiLTzVENHn0Ivfw1o`DU{q!+RbZ-gR%JFIf3{wQCvwPE zDzQAnRx6wXl}=do`oc-I%o1fU+>4sDZ6S=aXeR5$PE1cXsxElBXJJqA67bs#JJR0F zFZSV!iY4j`3oU}z+u+MyT%xL60f;3LKBQhg``3fM=B%{s6!5@ zk*MPasYc=hRbvYJI@IQ(saQ_;n%+vV07*+`=4mj#?#m*BP@`CBB$|Zy(puCSaZ)iX zDA0^(K^*F$$OZnAV=0>IHKD1Hg2_wUG@%iqqD5_!VcdNoLLpkvMSw)BO5qi~Bu%fL z#^qGr!d*<5-UCFnP9zl7Q*vf`!ekv_lyYh?;5AkxhoB_vsyeUwMAOm>R-j4Qy09nS zTCm{=_5o=OgvMs6jo!E_+fezcr`OucK_J+N%c)TN_6b9{DVcPG<7CADR$Np-9Bkk} z0;36Zm1GEbf8$V}wNSMqx0tLjF1FPoY_RnsEvh2>Yx7Jo`^g4yeNoN+T7=A={K>Sb zr190oLxT})YjK3ozfeN&Ds-MQ^+hwbOyFmJwvTWoqo&9$R`1Oi75m{Xy0 zP0g-IyxRd$1kglqDSrVl5^r)8jeX(s`S6kU;E>PM&2V|;+?L+bCx$R6r0KndpY@Rt zCXx*)Ps4YO zaj-}Wt8V90bbL0^_ERbuWD5kUumLMljnZg8E~k=(yGXwU8V&%j2vGWkAl1k{kBf%9 zqA5!q@0)MK0EoZCOc5V9P$&ob_94T)RW@%A)RNSi!^=y!66r9ljmt3 z!iFP&_uz6WQ*jpyBufE3$T-}1$%6jT@N}X7J-9-Zf1Ca^O|)!pv)h^$meF==+tj{~ z^$m?$8CBaaw*U40|K0zy{#^#d4X7CKb`% z5jUV}4T-Iat%-d%mJcXb2F$Lg91vOME?E#+Ruy?oNo9pX4+@={Syo&gxv;q0Q-Y^i zC5x2-ML0|oz<|h^r8o;c5@)nWmRHQ56BoIlqN=KFMtKPyD;5yl{E|hjBCT@caP~Qo z*@Qe*b5uGexIH{NP;p(Ut8TyT5$D_OJeDVmhBv8jn8q+LXc+Yxv~#%U}KXjzL%c z@yP9S3r0M8==}EQz4hRPqZI{{?)k0hjXiD8+cIKP=k4Qm4!bQcqSaI_pzw*p&#rHYwP*7@0D+S@YP>0-@C2; zy)Pb{^=aRT++E8a{dG_JR|Sr1PTy!+>UnhG0q=t^Jkq~SkM54AdfKA~wsUTJZL%q2 zx;^UA4Od@S|9ywA2CL6&Hg9=woO5(nWm)6y5qS^ifBEIcJ{6c-!p<~4mL2u_?MsVZ-|7BOPS*oFwmn{%x_;|n z@B7bgx$ny7-#afge*G&218#cQdg`O6S3LdeW9{b_e{s`AgYH_}?xx!v*D1drzM!hp zFa3U+IjbyW;ncm>KNk#{wV+pAgKN{FL8B%mE;#8}{!^!ou7qo^OPTb>__v~OvYT$o z*tRBf{jxt#|Lg6~=XD5u^10_XWSc)*|L@v=4xM<-ANjN6?c2WS{O6b5KOV7c^D8&^ z&%EP4+n($dCDF?k|JdgGtEZ$_-8y;bJHz5{eE*^+>f`E78UO5g>%#314eU2JVbG8p z^4vdUuiAUh{m<+e`sTk9pPsVd=mV?TUsFDQ?EFt&sGk>qb-S%=_s5J{@==uOj&VJ1 zePPIRmqnyc|8QMVw?8hvwt|8S|<}DanHmmp=i;0Z9nHAUUl4AGJ=;#|wrj-(d zneloUi~n;zVM7yxKC&{kT)eKC(p~50ul6Y4q`G8xWrMO!F%46tbFEj&}}}Lm@TB zt9^hRnh2UrAIf-rdbw?Dpd6Y38s&5dkYi_>4BRO%UO(CcK_f_?Ulb#w9D9JAPE3=I zJ8=*E$7~DU+wKjC*oIbidg=nN9Enicu zo?bLDHPEjprqSm`-vGb*G0hR&NzRrN>yXLK^P+!%oPGgvXsls2(b^Ez{59iNJQ65p zV1S$f0di=L139=;`*U>LusTrAkN`P@1LR!9 zG&AUq>(qpFFf|X)&;U6X1<0Wu$81vNbhf#-2g->KkTWbm&Tyu=itf1noU&<3pd6ZF z8PjKYfSeenp{YH^X4?1kdA51HVguyF1jrf5G#}zl?bs7_EAiJ{4hnL!@Qe(QGn#2= zCX4E$%)Q?ELZBQpH_haX4v;gJX>ONt`o&G16DVg~fSj=ba^jdK33rN3+@8WcfpW$N z$cYP(b1~CAKzCfv4*%!wKslEL$hkN`4h`MSrn{t^USE}87bwRSASa&X6k&cbv!c8l zui+v&h5f4qehl?n!l^VDs0fXV>Vt494Tau_$x;y-*VF*a+yD$Jx^$}KjVeNubAJHl zxd6ql(ZZ{~3Ux&%wf}T;Ty2`uJ(2p%&SQ$q2v{24H3cU@8MJD+4ea z127K;V4e%WY!ATf3Bc?R!2B41`6~cpqpHhJO|hN7!xhNK7vcH0?WA?m?S$a%yc{$c}nqlU7bS-vK5ojt)WT=H4V5&-WG{is6;1^*^4Va>$S?-E* z>ix;7<+-vMO}V>bmY${v>roYzf=6%_%`2HVbHNgcA~{jnxud9uK5Zfj>hB0c{qX@k zW;l&tXucbX3yLzJq4B|sddzSd!PFZtMDvXSLnDTxddvvo8YcZ>$s>s79X%$7##q1L z!f;3U9z&9sfQCk}%oRf+RDkJ=KaNEVN&X3!hM}R6LSrAoFc*2HxNvEh;q<;#j~PL1 zm@xWjVknjWqsNSmL6VXBRUcs4cjmekZ3kgQyht*&N`4H*Vy^*10Xk&BQ11L;z)(H()4)NA;M|6!*(9#nI%9 zCdt3(F=Hq^FWYo9V<;B69rPHIyc7!;nw+u3m0{Oo$ge{N4Ea^>(9@8d{hf4};n5KE zduIa%f=+iaU=X0CT@4tB{-&EAGaPb?x*IUydd7%>_r1dPG*k(P88P6>F=F7?RR#?Y1p+?}6|#wa4H)?KZzBc; zs7sWA29nnsFe4%7PBbHa$sA$pqO zh^Y;e1I_ml!$C91fT6PSlmSCk_k>oG_{p&X3F7c^8Up?HScqGCo6v=adDPHy^BLx1QaW|5%5vN}7aQHEB|Ds~qO zOd|fwCRzg^ckjy`kcWs0yLD*e$q`M6fh!3Zvx!1Q?&t5*4*0nqlw3q(<8Y45Wq0R=-ysqz*LRYOXpCH`!1&|!RfjaEpUWzPKr}|K zH0Gl9E^;$J`VEs?)vsQXi)f5o>A;vxl-K0Ot(%P!t#VD3Tts8!$^gb}LbJ^7_BJ0+ z_jBDLxroNdl?jYLH4551`JJEZP02+xMy@R8LbJ?n{^@9ZgHc0xNOBR4kt-V*vq|Op zCGJMFWGYurS!9St;3lbsNW;uFVDzOfhb4#M?sux>1(J(sjNzfOZ8oV~D|dhXpz1gD z;UpK)7`gHcTpJS(EcA2TFS&@u$dzy4+VSnCXZ>6+NiL!>a!oLB{V=`D6@IQgl8b1J zToakgfjha1>cc)i*CEM8G~k+9dR5gZY85a}!eutyp(Y#S=w=T^D_ia<&ZFg{5i~s# zPwoowxtbp*7vUqdTfCC+j3pH_=E|2dF-4i2V|b`6sglp`$|W<(=4-F^W|<*6)@nAuP<@GO9af}g@YW2PQM^nyAGd5Kv! zMKGyoMsa0jSxIG)@o@(H5~xW>mx&LWqCBD3t2m&?7)2TR=&37{c zKU9@gRJv6rfsyj~K@vjpRV7RO4-!IIDZ565JiSOfAk4)oA^e)JQ5KgMYs3Wzxu>{X z4OKx=c}Z23yR=wPi$|tl?t&tB1&a3!H7V#BaVVKnA|kGPo-ayI0p`Q*=0wPcvZ_*q zNeUIuRn4CBMCv1iC_5gvh+ILDDEX4JjMf4uj|z%toj`+TOR%c6Y_?lucR>*%3B3`# zp=yeVC{%ETRtwGAi{11{`Y3{8<~%^zlMz3D2{=UuPi7=%V0MZhR+F#7U0PB}Nr2=O zDJ&5)D;6vnF~c((Aza|8Dpd=ptEi|7v8*g}FDaT?T7rT#6V;@w#1)HGkYbNm^bk;0 zDH6M=yllq2BFG+rTCk`Hm1t%eN^X37QIe}DdSqHcazb8uPLhkG=Th;B$*%m&?1bFp z^gLJm7(_RIO#DbH=kX)Us^UkIHjhRdo0OZFo0^dAqW2m$&y|*+m5`N_mFSWhKk*}3 zX!xWIS6WtHVq#iSF8r37LF7N{2E~tra!~w8(hiD`O3scS z$r?g_=4@9|Mq)y4UVaKQtLj2$hB6DUL+F z5(g1xnXo&o9hB(XGn;ZA{vsXu)Ab4u^oE8DZX0w8aghU?;&KGadl~o*ph@dMR5XnU zF0UFiH%q!;^7?`Q9?)!)beM|-4c|e~965))67c^Cnj$&EKU?_j0?j5#7c6`iLf#9Y z`AX8AEqs50rh^>}aKYr!grqxYrb@cA$y)*%?>XdAd~XKL2}yUh_{JiWljXQDSomJR zi(Jr{J5wx#RxXzpozel}y`XysG?OtAB1h!G%2gO76K(j&4V2C`J zyy@XM{uvj!VDczD*MMfdjxLzI+d%WEj;^J0kNLmy3}}9kbZ5&qOAn+QE^@)bHv;c^ zfhJ$lolV|+&@4ZPJlYky7BmmY`PJFV!55%8Ea`%UkBZZA&{(O#fFrtK>E{4Vq>iqo z^os)jg`mlmbZ3iiIcS!iLtZ1~T@RY8u@p#-s%Nn9{RNs1qyYpMEWTIcU3bu|m2@pE~W%?u_l6f-m9&kqeY|Lt)Qd) z{HhgnJw>!s9$l-#Wh4RQE5<;$6etrnK`Gjc=i>TjE#)F0&}e^7S0?#8jqNB zLlc>1nB$c3ooHD%6sxO|O7S(c$}0YI%4SwpR8`D&M-H4gC^Bz>yKG+BHKgdD1TE&W za!fC=Kl`UJ+M(enEF~XHsn$xnSh?8aX!CWdO>BZe+T|APBC)}ssC{#o3wD+p+pGJk zEZDbvvdO;s0615koNTXo9RTbIwx07rFs$B%GbZsbLIFUAf}gRA>ky&DgS6Xac$gbj zn;bPhziFX`39Gk{hvC4SRoL{hxIj@nmyN~NP|qYG1*d_~J|5aEx}A>KqYA3@RiQzdNZxw^QHDC% z;E_nIf8kjq3}vo>0I)eFl3`YQ^5B)SS!`qsqfKQ^3&XhR$$hWbRyNlx;b}DaxDyxh z4)-azoJu6_QyIdI6$8|Uzfm3CFh*S$hgA1;R5t^Q@{bTYjlr`?W0Sl4 z!7EX;U4TRyqyiE#&ja)bE~|p7D1$y7kUw2Y@I=n6SVQQaiaLT0A023#Z1nH1*;E2T zmfEbt=)g7cxY_5s5{mh_b|~T#ma4`gB14 zpsN`ZqJ(h9l;drvGR5~(^>-(#e~Q5NPES}N$3diqubbG%6Pzba17dnxe9jf zvwDjhHT&%w$g&L#ZhvU+y_#MtzO?At49AXS(+Q>eN0aAB%>J0I z)KX9>UJ-3Rq4q4P)F;6rrUj<>xm!v^w+w`;h+z{#KDVAaMXriy4rHJSIFlF3i9x&U$J#-2?c zn@AdTEU-8*-W$5kWwE(nAs@uHBy8EFn8hK%mW3f*8p4tFMboB|wLOtoy0WGNspAOl zOx6&yRp%_$Hs)?17e!$_AW; z)Ln!Xh(aefTOWbV>!uhAu7Wx>5H%#tSz6P}@CDyyl z>90kwm}0LP2vV6m@=up2Bstt?hH23VopdsKR%>I~uvnzF&$Jmlyw)=Y_P?#(Wf3(^ z%jZ`&St<)_3!7@48{>8?vc!E-mEn7NKjk(rF#`{l()O~HKYY6#$6Gn6NE+X#zWj*Y@S5mBe*0(Hc2}l6{Z!px;F{WuO zNS0@cF{IjlbVSeLwY<#cb-Ke!gyki+lVi)DA}P=y_^eHy?55b4L@7xFCJvI8zUD7B z!U|6*`6q}(ti^pd&EQ2NIs}j?-{Ulhh9;s>zFmXf(V+imbYuli)H-UnM6Dy`)A^uq zvW2k)3?%?3{J2WvFrzoWg5UN7G)-^-n#WKYAgUEkWeOlsuciW;!MI{TqBhOZAiPj$ z9Tgs6h}D4yw>!MA1XRt8WLq2oC^Wy`_KRBsT{a+ZL&{MDe_IZdkKkwgW07 zo1|zySKHkgydoV20}|mL4oHL>01w*{O!!9j_n_>A>+HU@g?$stS$rA*3Bsp~0Qr3y zfhWCBR2Ha}p%%u$RYuyCBKrrv6h$2_#oO03fV7~n*2W`0t;V2C4@60;y?TuAg!dBf zWf3vEYW6QLu0Ca{%&bjnsw0JIioF zs8&th;cC($rU~9mlC`MGBaiBk)r6)^Y)>k}UsXEg!=}06L=V)LtEs+-7;}9&we)#W zM`V@ocP66|dr_>n0}_R_5s)aPR8B-8bprA?>eNwCj)o}W^FamRP=zgN`%7LZkp7ZK zb98dVMs7B)P=$)BzPMt{W)fYXhTYv3l%oE21N0y+t3neGf9^-&i5!&xa?}S>Ig5UP zo_O9n1jTsFB%boRU~L<%q0`r!I};u$z%X2A8VACLzBVU~uFsuPP<>|Lq5+r{hv)le z05n8hSinfN=d$?@HO7bsUltxFc?Ydap@CFqKKe-3D2Sg>;@#Hd<;lbz5Reh;vdv-KWI1r3Y8!mt`Mawclwlln1j(+l51o^ z%(1$|p@q7h^;*$`2VL-TN6)nBh@|Lf|lOWr8*?Z7gEe$d3pA`)>o z&B8?6PV;sV_+mgJ@RS%dB)77uEq`gEwwPRq(urGEN>0qesCg6;!}^^4+DsPKw#DTQ$fPsgZ#34D8q?U_2vC z57Inq4-P2DVLf2<<&9rE`7_Jk;B#jPo;H7nr>o$xCdGYWUtfp`6RcXP#>o#+1mp;{ z13*#q#sCtH$|^u22VT~o!y42Hje*FO?tnxNQ19w*Xz1$-In0QuyHTi*Wh+523FKVY zZskdryYtGE7rQ&GJb4}!TE(8Stb>@wiGVqLd=u?6 zgCK~QYcV1QqI>3`s1&g(f@jEM$Wl)_6Y!F(y`~9q#j>o0mSycVz2Fy?X2a|?)SNR5 zx_h@w38VrIIjMH@{M)ctYhSk)_`e%f_hkh*Z%~@-^5xllM+&{e$?_0~QC-reQz(w5 zawABGbhOX+8xh0t0}E~3(#lxbP~nTJw>w3Zr~EV~i2gD7o3r!z-|p^?NbkZWjFmpl z&?UHUVkjN=N?f8j73KUnJPYUpK+of{vgxiD89IQw;P@KQD~zN1Kud5=w!2J?gOx2I z3mmN?Z)KbvkigN}v1q8N^azMXo9{8*J%D6b09^^3Q>h0e8u?v-u3+4^fJ7sI6p-lV z+k~h!(hf+}NGG7DSaL57*B8*Uj2ookh5{0`d5ngm&7J~Bqud$nZ#JME%v+%0XuMm` zxDpMAM}@wIw!yy{wVqrtu27|4)wswR#j_$wTeNaXBvioW72~5zzp6os8+x12DJ_`= zYfYZ{SHXr8EB5(~ED@h%z+WU3@t|%w-wk6>q*Ddak)&1_Ij^h=GG~@5^DEqu#i~z2 z=6TtkVg*K&+n`w68`jd5m0Wu<3gaQ&EQ0JR~@m zwGy>3H-xE}JG{2z z`7-< z?^*xNWv?B+b87eUS4(esp!2fvFJ2h&xNT{>0f*kIZg_ueX=ch7^T$^H=zb{GJny5m zm)|q3%dKm2EU%AwXiN5puC>n{4SQ~nH+tS3TQdKAF*Gi=YQz5gdFl5(a$c|0abssK z4J&*8#ZL}zm>K;`-fgeXaW1~}!|Izq?p=HTH8XCUz4Q3tj>iuiAK%vc!{?t~^w+g_ z#jm-iP0tYvVv|lOPe$K6aosN+56s{A`03-d#e=^3wC=4X1Mcp;zx<1$8xrlm+-;qF zW>W0E)7Mz{MZf#mM?G#mm|t`}aom#KM_=7?;PuO{e&~wx((ArkQ5K)~ZrL?Ye4F&x z;pI{NHf(!n+&ho-?Z32SeEZ{HeEa5+w>!VM=&8do9k%q0biMR++q)-q_oT%cRqeN^VH?V6{Z{io%F(-q@R9zEu>TT+IOG2!Z!bty+h{R`qkUF z?VUdH!lw6z9WeJ>GjyMc0OtZbAM%ra84l#{V> z|K>nBG_Nzt31%5djo0E?M{@(^P)-@;1hb4pYGgD@jy?Y_HC{Revd%1rRLBVGx`H-g zG|vl~AQ=7X9AFKDd@!46$)hWvuRE_suhv`+y)nvh2FRfaq}fDaA?}@y&(L=^mqT5? zQBE++NTY}n*U+}qeKnWUBS20t%Sa=noUhh>eQ}^1s#V7D1hb4pvvMk{nRie8JW$U0 z0dj&_Mxv=Y#b#sLo#=I&$E$aMoM4ubXj)F`Q@3dcCVp}`GFTyj|?3SIN`85AIAAj<(-q4rd`NKB2$QOOog#ZbB!F~e1aqSA~Hz@!CW zCI?`q2ViLZM>tjTDixvmwJ`v5Zvf_bi5bXTMPdUELg8j&`{|Twy5b}*mfZ3 z6S~1gX*Ayn1a@B%R}nT!%)-cvkbYYeKT8_FwTC|?#&6d`EM(HYPStmsN|B4yFp&~t z*D$2mLC&dR#z>6c_C=b+_^nS&l9>J)SFyx&)-YrjoSfep#x)Y-w}x@O#F#a%nBm1BSyxo3{C=m^UEV26ZK-`ew}dyO}S{ZFs%d!IifM{ zZ5#}YXhrG$1ykFjsZzOqmRv+*h1k7{6bSgnC}|b1jfuL}TO{##~)+CwIq;t$qAl|BzfnW8|Xr_V0ks zdUog`KUclvA{rytaOR>iL+-OJ@2vB4eIdDs#>mB^5w>DVTn|ni9_i;Yiw0LA8Y35# zHGh7sxa}5ckMlMkssD&Zdw(za4ey$wJMKne(D*I*=jhV@fd+k;TR{c_K z91)F?i|U7;%k|2|x-`65`b9KGE^4gICTicv#fw_wm+ zIxf}55z!dAsMRr>x)BT9&`TacXRO9cwP-{%My_$d_;+?c`N{!=O69uHLXwb1xCAa+ zVhAfRMFxysEj$i1{(aLYUp^hF@}RGfTttKL==K-Wn8Iv2DC;O5q+10J+S-`MTLx## z^$Nn|U;}2wjIufWI;UtJZSkEc_M~1;o5aMH$jggnmudTL%jVB?^BzY}adMHn6q{z5 znfJ>ssH|{T_#X}1XPfPUZOtCnDMdp07ZNdONJP+RZ!UpLcsnPcDf6q!=FF!(ZG@jB z_OJqy>pALZL+&so5?*Y|mGoleiK&t*X3-W=kfdTAix-I`UMy45W=y=yrzlEz3hf2< z@Gfh-NiLb;K|;=?-IwKM?vhH{Cp?=U#dcW+(~+o9M|SD==Nb2F$~~Bg*{;0o^wgaE zZ0vW$w!W(P80-uzo`oB)y~U3di&WVA7nPJDD58=w{ksekTuJ#U`FZ&n*)DBqj&@68 zZO%`W=*mh=$x2I4&BAs|UaxCmPh(=fD>EfMAvZlc)5RfBea1f|%5^;22}%ojdf^#~ zX{iaBdFe6+BPk)`N2&{Ge#&H5dUASdNDBmzT|;7ZBPO-M@0O~qP|TuN-7a--4_ zUTn(Dppaz7M`b3*MtSpyq`BC>eEhjNO1FG>ZT7{G= zlG^KRSAJ?nHum9)*P>8sZxb_I$+=mni8)#M{>%#=t29?)0#Z34Inl+-nf?M4kOFzG zq}7SnSjEyL0a795E_(43pE2&UD_V|{%>d`Q<)wgTilhrBj}|40 zK;zZX1qBe0l=NDek6frlB5e3J|ARU37SKat{t9( zrC&DY-dD)^cQARh%rYA^x9aGE$-56UPwVJf%8xY2dzol@;DS3_{! zpqV7;&X&J(K(na1yk_G`YX4SA8VVn|mfCyzP(&66^sXg3%Kk@MqSGw~kPH_B{%SM2 z|Hh8p*$_GK+&gyN^Zo~R>r(Llj)P&FW{LiHxc}?4Vzr$r81)@i{yIgirIocXsiIi< z4P}|w(n$GX<@I*4f=qW>0ktZTxC@RbKz$fD5OSb6o7o~()scUnueD#^H0VYMph zxQ}2c8~2e6<>Nkvp~<+@dXbe?mPm~Xhn3@=z|eHuNs^UUmZ>sXSurk?p>o`F7+Qck z$+YtJ)=3O4#=U@{rMO?l&`R7%Iu0wxof;!6?{k{L(0bfU7}|(?DMPp5eicJ^;69(B zyK%poq5E-nGc>?ft19M~r468sey9MiBFl~lg@hmc!ROOk0JJ|_m8r)$v3wO33 zRwT@b!OYuyqMbp8?TThB=07qU4tBP=<(UujeMK{{#DTwZzL96DMY1AcjIKx+k(1{M zvR12ob8cAm*LGiB^`SQI@ajV$v_akBTfNqSmaY-oG;q3SV;lMl_Z2#z>l+1aZfDc; z|9BFqCUo&g`F>BMxq90e9FJ^=ZhnNPCyr4+1Of$$tvK=-Xiq5gOJla;;PWDzFVjMs zfd;2VKz%dP7veR0v!I!YW6P7m;8U)}o8<6jIq6)|wMpSn?DypW73s~2vTsfSYM?L8 ziSyN?aj^6;SD$u;o>2Cyu?_#x$?Ncx4qsmsVa9>bMdB1^t2dWVU{4Kui5hXzFwVmN zE?iFDGVyPQKE%DAq0e#O&Jb=qFr|s_hPx6eBGM|cj+as zI^dzbH!4y!&eJy4PIc(XlY1WVW%v98TYwP3xX4~wSd=`h;&sA__eL*4nLU~0;L6T2= z?mR-Ci~M42)Y{Z=iH-E;BFh*%aBb>9iH-K=#&T|_j;T$B9Rw6OoH^O2ou|FXzwI_` zn%03-KShqL0OZdR8VZwZBliTq09XW@x5F2(cN77~Tob}RxG2IHd<3+G;3J^TgHJ&h zC60p`ytK)ZX6fb4?!{#-xmOr=|II?cLUk4gxUeZf zo3N%pVYX13UVxq~s$f@Ns%@PsY`n>BdED+vkd>?YudbeWU#jzU8pqFd&Td=U2b_}% z)s1t+*&FX?4=?Rw5U>RTxLQoDSN+)?f#AH2%gL>k2Ox2`jD{t+I zuBF|nP|T0Cr+ij8r53vPh=e`)q%j`hh6p5!6u=I`dP;=EfJ9KEC6W)Z4@`vDv_v2= zs&BimM65*Y|Di$e0P?599z0oaS(Q+#smg1(bbIgB)DOe4^L7u;Th6s2x;Fc!y0y91 zn61<5+k;-TL&SX{-Qd)H_Rj&9)e(sjX5X9{&|;@LeCyQ~JH(exEjIqbeFctbIEI;y zYPU5#e;qa1>Xw7B`r5=X^%=nUJ)VLma!})=7E&JYJ%PBzA;b`gErVf&HOH2e(3S|_ zufDYK!D+HlyM#K9E21J$(W)2Ql;t|>ChwuWlN~}~gzr6Ho%us-Wk)M*-bVEwEoCDg zwC=0pvuRZvZBdJeX+j~P?YuL5pB>*n1+AIy$GDTrhWQ+6K1)xud=_tt;?1F^FRZ$r z75&$ygjK)kfY^w*GfO|D-8Pri$DLUg2~GDX-&^E!U6{FU@NsTZcR+351ydL%&rv}+ z9#MY_my^$A_BWF>HKTN~C|$bXPafedn#eaOZCPB?=E>MiAtRgT@LD?3(buujQZIf7 zV(nOUhI-efAEBM2>GU96V%WA5kdq4lLM2=0ctGS#(tg16fQ8uwTOm$`9-rdriB5BI zcukY1mpIDXUNp^Tsi6W{KR(UVNN;U5P3~_>NsPAfK|6EXu`WGq<=6I=CoP^WKBWlT z>8I8A0cBfURvzzt%n*(3L;zC&`HKyW!pMclcKBJqx_v$i6QD%Ku*@6-_JM??gF_4^|zHYix){v zt=JY^#&}@UD0g))u}2sr7th1US)O-1qs+YsreY&2fGDORb|lp4)tALEKwCNwhKXkq zR@H>Rtp9!2onCt0=+G;&5=*A1=R7m{t@u9QpLf%l*Cytef`91owmVCbgOq@ky~T(8tFUA6U-=N8tK-q&f?U$J!q za`%ThdwIWldeBpSPTg}T*Y(JVAGdk08vo|xk1j7bT)O4a*F(atyYJN>W-MJ(uyAsx zUa{swwK<3pXHgEW(bk~7R)=6p8##Ka|y5muGCqYTHr{w9Y*4@27 zJ|ueh!>LbxdENIXuDESfNbylB;xw6FV3`-Zrk+b=P%@iwXHJ!_4Dez z6Z;<=blc^pzWDf(xr^q%@$&D5HOeG+#YK@L9v}MUgZWRK^38s`j?)`A>y8U0b`bnuek|P=n=-|5IipIrU28}GD zHJhl-CbvA|4U9wt4{1yaM>Iw~lQzJZO{zb!lV6bASBpRRQTw%cYxjNkX=RrT$TFFH;M!zT>{3kwGs=cTE zTn|VtqA_x{V=grfqk241?&qSGmmJX;xoGs}4`IJ;KVvyWP5FdO~s$jggCnbN&$CWbHb^&s8V6h{ni8J)7Sz)0W(I zey)9zi)f5oRD=CoALSm@m6juti)f5ow8rP>I+pYZNYpe8lK{~exu`exb6xt&yBP7P zT#*tW8Y5S@fotsr6Og4U7i|J0M>Iw*T6^^S_3tNNd)LpEFS&@u$kmg%v|L{78s+CI zm0Uz)#8a`Tnpv2Ght>hvaBUhw>s~};z*UxoI zauJP@>jLIdQ+~sXWJXyHVHavJ;E2Y^)dv`VO}TUzow%iP4Ut?#W8?ynjw}7gxeNSU zNs^0bj9k=f`FpfpVLQ-CsD528xroNdMZKs$ze*q9`In!|Be{si$km^@s2?FWVtB%% zey$CYi)g^5`(Qi(7=#eDmU_^`lP*pXGerHaw1G@R?VGIJIHRx)p7e4CF%1pHiRO

-FMTsm&X52(!OqLRS<2aXe}5DN3Yk7$Lj&XlJ1?8U zLrM7B$AfPTloK5wC)jz}d!(FsS1w0#HxJK<06D?V%chhh?r$C$v@1|fY=E3#=Veck za$+t}4hPCXL)I+6f}NNBD=4X4U(Gg!m?A~F7xi<>0oVvVLFWhz{fhKZDzcnuRP zF$o$bSz?B1m;#9zu3=QY@j)79nWP!5VKzvNqG9e2z&sm(*%pBLFaYyq0Om*lM#}=t z_jc3>vr|*PYXGKq0A{$v41gToRmA7Ru7;e8aS067{H1!#NIWQ1-ib!+wV~Fk+<+O4 zrzLs}HAD)vvPrlE*Kj}>w8-zWICXb8wGQv&qBq7JIw`>T`@zRvzw~2KYJpb9%UBSN zu^&ujE*j5}Yn#6HO+VKZ$wf3qE~;7nJr2Jgo&A}g%PYBvM)ck5rTC#9#l)Q`v7t5K<$={Wu;E5#)~Cu=W8=O(1(WF=)}x#S0C z?aj!@LSLSkxadag^J za-<2(cHv;AtlX@0yivbgYcFFHle06jvT}%R&P)wGDltDTH7h$M3uyYft-TnTlbf89 z4YTZcf$!ZKJ~k~QCj+NHB>-P?wT2#ExTCMG};p1+d&@u}IF z8Hu@2eCO}xetbq!enNI)LJHw4baIf9IqCVigvYma9er{}Vt!IyKJfV3uHi?ersO84 zW^lad`@8=|T4q{Wett4B&=+~_#mJmAc$|`vN-ruZH9T@RDK|MIheAqU?X?#p^Kn*H zLT(Z<;5)t_pOl@Kn4FYP4EVC|$LAm|67v%Xk8k}NepGr^0!mNPIIb%A@q$!HB`3)@9052v=l|K021PRIPZO+IK>J*DhYyOw z<#Y%>~r52|J}0^Bdjyf4tR+kL}5Dc_OBcJzZB%#ObY!dxJOM5hKv8kPf{BL28#$vpx zZ${VB9u1nZ#nCF7&berhhHmOducC0xY(^JM*KiH!ZkMzajh1u+#{&OAE9HF-x*yLW zZz|;d(MoxF9nr<&A{Q)tG=wPw&0{*cVDWtxG<7<R|FN1kE@}7c6{(!JiD83LRZA zc}qa!)zP(-e*GZtW=SJL7(9G0fo|tHPx z_{#7i8#FJ_8Zq42%HM~e`Bu^elSfNEhb0XQ#4T9(21TMA;35}H-crOjDH3V{eVB|D znuE!+_l4>*E^@)-QTPUdrbN;~e9-VM0gd+@@^*s%X3$KfjvbD=uVCT(4`_}{x?tg> z_QixodKxv9c2I_{UOBxo4TT6RG?7%N<1sx3wYFbHmM=R*UAa7Fu z9meC$;z4x(ZYABTEz#+gq996HiSkn4jPAd&$E6G+2e)F63+*!apWNmmN4XRugNu|; zP_nf6-X;aL>bj=tJxw)R7j>u%<8v+SRc7C|`k1ZtL@HZ5ZpP?&GcKsNkzyN^+8n<3 z2ICMr)53nNGhXYA{@_R7+vZ)zlHWgJhXH4M$|t_xB+a6)q4`K6#?lQ=)i@<2Ec`=( z&GrhFR@$l1HfDbzbU4p6O$KBF)Bn#pfiQE(L1G$xlJ3B z9`me0 z`HOCFX1Pt{Il!FYVd8WE$GU{jbw#1RMGjw~b8T9vFTvr3vT}mco8~O?UhSB+_Oej# z1m{#PA2BS7%7@TZ+`_`Rj6)k0+V;q%Y4uP}Jr759z3oedHnFTW?JC=eYEu~!vzIkq zYcreT-mhv?xg;#o-E(lRcSqR7rxSVXf{}dprvK;q+Fb+4Rnr?6wd43&zQs$x^R(*|AaYwGp z4CNy8;lWyqtL~sVpNa=8;L8GHtM3a2N_bI@Wk0Fa_?LvZY_t~%w3VQ{Z-OIk+d@b6 z)`I>ktDUTI~tbq>0$qexi5ils>O(+adzyOjyqd24EGCG0_<1*vu z=pgPb#kMLgpflsX;09I&MG-gp{r~sA_mVVC;rqV%mYd&uIq%$a&)x4mcRQC+RZtn* ziNC}e=Knx7;mG?DJWeGW?=SGgDdX{G;N!&lkgPC&!8eBsaf13w0X>fQ*8*bT4-4oS zyjulSkM~ys+KacO1E6rwPh(c39xxU#?l88=Q(`W)iP@Fht=SvvYclmd;l~bQ=-GE{ zL^8GErWID@6|P3Gfjv-*wi1=bI$>POeoXN4u>aJ5~{ zv8k^%d~EU6A2m0$uG+9BPFXiPkkz)i!IKuqGG!d~TCiokufA2>f|k;$)Fi<1q3T{C zj{Vix$=^D%ZlYeW3kEd>Y?*3~W5e2(F6Mxx#oKk%a)&o|)GDW^CyqwoJVb23Hoo;E zk;6QZ;ThL1PS;$DsMXjRr!8p!TP=*$^MKa-UTrI@Y|}$!69+n0paV_9p@tbrjv+6p z&HWn@(*&dz`of9om*#JJe`x>f`=88t~4Ng zDx8ur<6pmEXb)i7Gi_KMr>yO+jRt8^^ox=!YdxjBUPJG=pc= z73!r$Zw6O7wDTEglxtBGFIEe+gg94i*ng;73r?mSijjX7`Dc}Xj&2Q^t!CA2<=u=t zrX`|O=`yZ6NI*k=9)fWz9;Y~fDxn$!2SC}#7mR+0;z7XTRwecs;wYr=qjA0yy=zv7 zH-K#;P^g?*p|XlgmT>K&!0LwzYyvBayMT}baX1lR!A&M%*@lBDXa>&&KXH2x{=+%& zhQRi?XzioLVv4bZ88b(lO?cv8He|F0ZqbN7Ges_4+|VqXS;w{ zBxD~*3E(9>apJz<7X|cJyjujsM)YL?v02|NIlBDY`)w`a)dil{>sxw7P)!ScVRdGJ*bGCEk zW^t`e-4wm>X-!prL{oKnM@^MD{*s5_%DTQCkW3~3$^(4Cn3dk5>)s9+(Gn4Il&Q0< z>Mv@uxgJgG8nx7RJa^9td%(8Gi|gWIR$O#E>yX`(te;Y|pb+#7Olb?`pG0FEzo9U0 zgCCV4zb);62trw=rfVcpJWvK}^a2F ztP@gx#X-utEXx>+7xzy(Fv_tWCY>$QZ%f*Wb`@Y~hu^HPu+>nSwa>vG_v^?uds+)cQ) z#N4AbM_V6)QGwztZHXmX7x7*=cZ&Pq`_cclVYAChIZEMaK z`GnhY9j)Wg-k=7b4IxMnH+*a!@~Zi@P#3tFNB1`zkE56;kx64zGcNJM0LeeaiLBb1 z-{p9YHPh2yTtgTj2`hL9v!~A7I(a z;|RNuH7|yQDjV@mJNR!KzHxN>){PFn+R77*IF~2~fURX>02r^nu1>M|_O$u-w{3p0 zh6BK#A;{P<0IUxbv}L@y;^In^elM&(7xbN5j4*+&*|VZ<~9);h;FC`qFWe zJy2xwW~h674UUYa6-OZJiiT%M(;Ejf_N+@(s~rJb9#TOuw*+jjg5H~v>1#;H*t7On z`7BN;_|It0XVq7DpE6I_Lio0-MHWBKrMN4;79kF!^YLIqS8!}xABKtV7mkkf4PdQMX2Pl|9T&keK6+je6 z#nnqWeC*l=G>%o#u}~RNV6Uu3@m1=UDeAhek)qc+5RF+ z-FWL(sG;EWRRenxN5&5;Zc?Z4c6b!)cub7c%}bi$#}o;A6WZg+1-T0m#*oChbz!`} z#)+t9;H#kZOh!U|8NqalSRwR`B!+ZT)gM4L4?<6ATMaLspQioZWK?1ah^I9Ys=|+l1hxFwJCoAztYsL~0>B3bpiCzm@6J1IgoS zN+8c?kbEu-ITIC6zkp>4Q`h_g=SwbQg6nB4o4njc6t2s`KHa$H(OPMdL&SZv;PP2K zPBBK=E}(DlW`pDu+TU*xP#-i{vgx}FkQ^ZJW)w;b821ADlYsD2xQxb?e2dae^u+fA z7IjBV@_75C)l(pFFsO3k2t8?;#63WBm}^yPoj$A`vE-0phO<&mM6}| z$YfUgk%?Yvt*ukUm_&ZJjuRqKYlb!s33mGy{b(}BA!1$%QP2idtz9CjL61@ve_il_ z)aS#^xc?Ial0?MjRXlOZAiQ4_5NEvZ#^V$^jkXIY8*eG9%>X33ud4xV$Kw<`ePvs> z4c{_fX>$NioWkM7egQF6Ul$PN$2SDTF78bM;Uxwx$Xa$<{1fGYsqLVInZyAJ&dwvo z#uS2R3OE*ox9(9vucaH!}IgY50_$|sGd?#=L`v_FM@LWg5aX!Zi3F5?Zl)5)QFC3JrW}}N* z34vJT5v`Ey}w%3&7tz}CiyAgT%jx!f8V$~Gy*u!$61E=DMrJD`}qr<}7)ZU@9GbAui$ zC+29NN`ii%`4TS5XBk5S-$7GIAoPGTG13mO8DuCJ-sA1U%W~DZF~ykULyRRpHZIpmzntYbH39ic_uw^p1ddVDmiz-2_Ow#izI`LKgY%qR6vC$Z`geI#U#B zV`S23hb0L_qo=UVq7m-!|0o{OHX%W6X$Ls;z1$k8G~t5QX=p^y=sVTlwqf<-mz9=` z)|%-Vzo^IT?jJM0sTqMzE>Zp0kRKp%xz+JDU&9IWe)Bh?FFqb)4-}XJmpSaYm;$1b zkgq}QL=j>)=`z1=rgjpC$#Q)beenG>p!N=Q3+f&WDx^%pq+}Rllru%ZpBCXnAT029|m|8bumb<{A?pHIN6gR~(T{0G^ zgt%FKHl{WEN!>1t4a#ZA0u?KU`A`naB(6lhS46k5e3of2hRHxC%rYgbjeyG#v_ImJ z3Cwar0}-t^|DVAVuWbB^ozo5?a0Tl$oLQi;7Cnb#)s;UcK0z+01z(q6%>GvQ2;V+zWNj9 z7QFyK`pz~5#-jl2fig2u0Kf=o=rB#&lw^J>ll;x^lDqH3fZDs5pdwGxzD|1=`TNG_ z$kw?sS2-~rma#b^W5+~f?0H7UCL&`KbfrC(w%kog0X#xj7uot&9z8_1?!Wj&e{f)=(QQod9WmKA55#B`BQ*81nT;Ly zBOT1tUXCRA4o{p=uy{;B3-G=hk6e4)E}*q|OTmcQCIur-xNpbf6svtwFk-(TWefH$ z$MFTlm4Mi{Kyf9Y?*)_q=tlu10y-few6vDuy6JHk5N>*R^>8_4yXZ6qg&RIuzjbUP2))A&|1NQfc_i%n1@hI>o3DDy+^+dvO8wFtC9` zDa&^R#wRrAS{ZxHxaC@pIuy1rpToxd!q)P5u1?Pk8D7isv5y_0oNuGxD(gonpxf{` z#X#XCASrwXhujq2Y0Ofes2G;S<62r=G_q)(Yw`TmF3&R8`Ag@o@|>@T<4eKob>-)x zrSs;maxJQMQA1`sRN_v7V@-W*^3S?sRFs-+)4y0+Wg zBhB+G^YvR@_tm|;$vkrLJvS%5p76V?tdF+VIsUft+{sr?`g&w}X;152B`sag*!%3g zW1AnWx_+qRDci68URrxk!ry+F`}=oS`^Np{-3R}3U(7W(cfGx}cJ$6c-k4W@>v^O; z`__u*Uff>w=^ySWPMvT`+kjC^$L{;#g!1IOw_mpKp=*xce%srZU3l^@b3R}Cz?Ob} z9~#hmz|g@9X4e&b((B3F{=E32ud?2m@2;Ns>ZM=g^trTf{$Nk5#hm<)q5gBL`i=aL zqxGD#j(N@g>5E!N&)bvtQJM3_H~Yr#KXCQECnjyVamj<1EK98UQuW0A?uHu+j@&YB z=A9qBbC0+9@ih}GpL)~Qt7zrSyY>$px^!;C@I$w~y83wB;!iU@g@1nJjpy&kx^+~~ zL7$D;lJ#Os|0}+#H{agclsf&FmM{0e{K*kl?JX65ePvC_jkb%{|Ni@1&wp#ku7@VY zcd1_Vuh=hE3@!fGvWKR;cYJ?+_TAb4dSiU>y&Qo$OU2y)0FTXYWCf?K~=jJ@O<)+*% z|M^GmKb|{Tl9bp#aAfJ%_uN?Xm-Q9TEKOK)&Hdg*A3S$<^TV&)m3fu9=(qTP@95p* zkuE2m?v|f$#Y z%Qnr~F(m!ohhBU44~q`$p8m_14NtfJ@<&%F7c zDgU@4v0yfbSi<~2zEwA5lNzcX&PgU~;doLA`i{8&Ll9%xI2v0ykCu6G~~-)0k+B53CQu4io|A9lv!=d|M@_*eza zm1F|*lBsxnBp)_d;e4zSeAt4jhbP+2yXS(E=G7nW_eb*S1DkL@(Qe-54ie_d?4;Yi zj^x8}S~#C*H}C!xd|0wuw=I|($%n()a6Zv)-aQMHG(E@0W9F`X`t*lQIG<=Y?{X4^ zHKrix%JGqW=u0@CXgBX}Bqg5Rf%9fW@);1pC)&-sTr^;*^<1?Q#iV__&WYgTiYPw= z1AHFE%)XI) z&X3>|?dIJPpk%xzjX3Z{B%i?%eB{l$q3!Agf@ZYFXGZEJkU`tWi?uI2UKd29bBdth zA{1M+C6&!PBKcex!6zkx51K9b#kCTapSKSjfdJY*JQqjsxhR59s-PKzH_e<&CPM&j z&u1uX!sC@1!DpDD;rugO{O0R+B}VdLYZ=aGSOlMRLBsGczaD+)rj3z&hDY#8kKn@` zH=A1UW=nm;@E`pAiv!MhY6%cZMgq_;1fg@?kF-9YqnWG;Pq|KS%S`HYR=GbVx$ds4IMdc0{I-_G3|$%nNsJYJVZ z@W~W3H{;Fld~bQ~U?iU`K@-}4Wk&GH7Bn2Fvt4~^=i`5iZ6?F~m2JR{k$egw_~Z-f z@&zmAuUZaEVO*kg;p!9}q39U4JJRSFT_#fu8pbD_rdUT9G*?AnmPTOKL}2vt5%g<& z1PzDvGy@I4o{VxHxC|OjG|;3Nm^O*Ph83N27n4L? zU|@P{m|+ISrD4(y%rFgewt*R|VJh04oqv48e zwW8dpVa6Dk9U8`FU>?#i{S3@A8Ya)c?9(v88_nO+FcyR6Qw`%VFh?{@F9Y+FhOru$ zc+^9ht_G&3hPl+hoULIp4a@}^Cf~s5w<+fum>i9!hrr;r*NQpS6~eDLM2gXO1H)hl&FKb4q}Vs1G$N*FYn+2I9TJKeO5Z1i zVumrr?#ClWb|Qof^R`fo@SVLPX@Z>DR~Q(PhSS3^EIr;Z45PX!6q8QhTk!P7BT7^{ zeSahrGn7%CtYL)jX^iTOP>j&lbX6!uqBHVi zx?*yKVMeh?xsa+%5m_%%5iwgBhH;;ZhcuE8{aO}=A!qg?K^n%L;R#|Gp4|o}^q}5& zV1v4%cFuea6*~qvnwvC$G~pViCIDkLajZ=l}?&)SFF8eQ*Szfxxu#% zLDyYx79Mr#-#G>m@7xx|FVo#i8_b@$6_?km^b zU^K7sAx(IA3d3AAee%$wL08K(SELDdH6_f|=d*jGDC)7eR&zxfxC%M;SR`C+&JU}4ile~dBJz^zVFGDgXjoq zZNhH?&o5u$T^gzoCwS|34%JXWm5^{{-0*$XoVkl7qvCRQDpkvtF2wCjf~XierK*CT zLL&||@(8OZS&EVcS1&B32 z=B!vTMwh`8Zql^zy&k4vDC8gw$JYL3C8w0uF8N2(24h^xHIt3)KloyrQXP+zok z`LgOo@&fVDuW6+U;_jVOCBnL>8cME)g)m0cs}?O;1jf=Mc)xHyl6?`br4oS^GyAwv z9RE6q3=^F;)Ilv-?)8X>;coJ|%e+fvIzlHJE=JShDnFzH_{K7_ay~9|M-*1fU$hh# zs3Gd}SIw=Mvvi^0yL=8Y2nb6CBBh9kB9rENl%MI&%boxgWfO2$wOGvPh@e&=iHxb#$_S zC)`gbO*|eLg3(Ucj{(gjjgJ0y#P17Ol!9h#7jlzqqw({B<_{WOG=3b=->K0EhImEe z_crJbpMoF7k7J-o;`|a!XX$qlXf6$*>nOfU!J|N<5e)H)7QS7eYdQr#hVS*$f)t9`E!zD^2>bE~|#~tW;N8H=cy`fb|u{ z>P(0Ec$vD!mGR@c?%3^GZ5%-iSpG>LiUO8r#XqccR@g4=?F$Fzmz9P%D8F*n%tn7s zg1;KfYP*$|$?Y46iLj}(Nay>`0J{P_PQ{IPiGZ%cJ6Aw82JS`!+5w2PGVVJ8(ct7J zi-}T($JmG{ZX#6Qz-Gkdjxub{b*M`V(pqt_{cP+M!M%`^&S+Dyu{_q?g1 zzAw20q|l|h6UGmEMIEy>VA;w|RXDp>fpbRj8E<(@m?Z&R$9c^6jb%k2`+!UZiXmdW z*x8Q_Ult&%kN8gh>RD808Xe<3-*@si&#byE)97rIx1aCiNzc@}teDZ+G2ZSt;_S(- z%QBD7HhadX>v2n%_YUl9bg1sc47baET{Gf>fF_DPw%*Y=%5sQN#NNh@wTaA8`zDst zR^F`UsLPM78$W5ow+WkCJhABsTk~V}Q$g4dyV9lQ@f@`rS$vu~jIB7ydbTl_yCIho zMJ~5??=Wkz6+a09cBoTaxS9^>rzIYCq5&Jo=~+~1LBW=}->nx%8;+%-%$R01;;6|i zaq5ze!rMbV*(VBi`dw;D1#?=R<xY+?4QW9|b*h&; zHa0RSX~zSJFJr%Nf;#3g^%b0t+*a3fw8PtP(*aMfx~ZnoIL+3>*AU~YkJ)s<`)OKz zYi$2|UyEsTy?xVWc<1(=j9I%EXApn$=U4($OxQJB7oWeW-uu&#pL}h}HD{HD?W|MZ zg6BAe1{FWt#O!Nptsaj8?u;zj>RY%?6juvZTbpv&kqvMtMgBE%gE@GlqP`n!WYg8i zj!>lfzMBy;nP7VW$;$8nAX%4B0?NT7v!CK1O^h-?Ac_HNhs=GyB-iw2v%~W(vVTR7 zgkb;DT8(pe=r7B(fU~XA>ZE#tE|LN`u2*Ai%Gbg^)nBe}j!$54uViTDw$Od_R)&_d zbuzSUon&Yi0t$wf!X}Mg_Adi0tC0gYeR^ZjKDJt=vW|uX(YQ9@+?x9DAK&?LfByr6 zUeEZcCQHzjI(Q3oLclV*s4^a5kts*fVU=}(e|emCoEZBcdjtwxO(q4~s#yttKqUmZ zjLbfkR2g6opkOdp7W2h6Qd~%Dgvw(a~m5mXPLUrp_aQcjzJ75Zma1)47ro;i(nNlh8$aWelgCy z84lQGG~ym;e+`&H3@J7m5Mh%DCbHWY2}pJulMNg*O4|fV?$V-7Se@Lr8_7JNe)dD7vj5Y^zsQ+h^@m+I z+;q;l8TZ{+{`RhW+^%&GZ=7Xy{CIKSQRn1Tu3GZ^!0$eO`Ks|hJlhig#23H(P`z{f zzR?LU?)^MtsN>j+Rke3Ll5lm=?|VJIYKm>x@Be+4DSyy7yW^UL4cy0E#AICra zV9#G(_%89IF)wEvK6CW3f#aWAe9O?MKHBqY%iGI$KiaMD*lw9suZYCL>;LgC#E_M7 zGjq?_MfS`sL%x#(pU{Blz@*;KKo&*~DIqeCqFh<=RL-2@!nGh~RUkpkX&dIsD<0s~?W!(=US0 znGt;Y3mUzLxnUYRs`mNLW1dZNqUo~P! zdL$oL1fKzd575GQ{ws=0q>Ma$9FB3x&k&l6A~0MPmPY53t0N4~Oe<-0npxVn-Jn^d zVR{-Eu13;yH!yV)0mW51pIbCc7Xw4#nWndac}ya(Lq~U2uVKzKFt2HtGYri88m5nd z`9i~VGcdntm;u1B{l%^elSG*fOoE1qH84pUCSG95(X-B7u8TnoA$L0r2OHK!mR`AH zn+k}z&3Yj)X~=LT2E16~f~&gs;frm!zznCW&q2dBIQ%A|bAU0ML}w3Z;Wb_V1#W<7 z^gTAD313MZ2no#7xPC|@!)KMgmKeN~ zqqux7qUD({7bV47rdTA>_QPnla3`$fbssB0p_Ge@M3&+L7&6sv@W{@|%qyHSWl~O| z84b^ttx- zt2osEi9m`Zlv-$zx zt?1!zW-kvz@@V{yfTm5Oi^gvbd32L21?0y~19ur3V;RzG(c0 zfhJp{i^lI_xSs@?H5wfomT3HL1I+`c;5Q8J9|O&2A#~CB9RW>S2wg|{F&6x~KnikG z5`tkoqVX#N&Fm1mj`&>w_m!ZzNu%p5zW)Hto>TB+eD{IoY?ek8$e zghnF>@roAT>7c7T1;2@K?*Yy8A#~CBy$G7OL+Cn6zun;X326RAi4vx>`o`1tZ)kMU z;(IQ5ysyy+hImB_UkoJFUX)T{qVbysyF}0|*XTM6->smz{}lYjpu+wGG~Z}_7rVA- z;Y){9n~R4gTKIOst`Ia9O1ChbmA`?Y8K%)i<5vwHV?gtFjjpryg{nHp^paMi(uSP-Mk5&F6)k-4fbPpv@cSLy ze-E0a93{Ze-)Q_+fo5w6T}SnU@%ue!ZV91_#%~8`9u1)r{8lcj@?2HLpa{eKd|IQ? zP*_TKC>OP(W4=9m8gz`Gm}oYb0qB4q{oUIUzjmvd91!Yv)#xlc()-VW$bZ`L>xhos zseY$TXZ%=ic&|;U>4+cWAx=Sr5O%ccT91Sg>P187{x?=#7lF-b=;^P<<&*yvJ^h?- zw3bz#Y+ISA)@o}4+R8v77HC`zAH@{4U7a9N@?EJ^%tk5(+`nQ1(xS$@`SZ-Z-HbQ`o=_Y zQ_fUVQw}yw&B8L9Lqul-0wANqQJzzw5U^H2Ie4=PaEj?-X?vA{TMUR}C8u&V-tz=h zgEt@9?gap`i@`D$OQcYquC2KFYN7dSTELy^cVi~Fc8uEG>=qMCScG*IKi$@b^_KOv z$|Ow-=>pR%D?+a}WBv4tE7ih8tlbW2XgFc<)yGmT@Kl*=AVD6b!Yi2{Wd=m==kNui zuNg6?M1F{sxMil88kx9K- zjz)^5G6@F(k_pTh%LL9gY_BwM0I-myCn2}I%T2&?c~Q-paW0c-YzxpH>)7}3S8Z#g z14S-0R>sQzeThKbf+tSw$X^af=JE;w;U)Aw^WVf544YUjr;rp$dS!8PsUgdz7CNz4 z!O&eQGJ8QA7wH(u1$bosQ~aaR6P)!PT*ZPRG}B>DT;sv%aL+k1+qbDJneQ?;7MRLK zzH_?#iz|`0$zUP#mW(O?(wLMOkvf%tWw33PZK&;GHQFO8GgPD;q7&ak~;f=yd6StvNu zplM^uiP;dXyp%yJU|rUUBs)~%1*7*=vjOXC(xM-%gbu-ywrSAf1>G!A_5}TsoBAT- zN(0rauuY`NJ<00NarvvAWq~yo|5D2Wf4We~#%Qs;=K%(Co%M=CCuH z-E7*FX17cJVQK{empc{iwiASDc2Bk{PEf9uU#sNbZ1J~cEB|1cw``ICpbZ9eodMly zKsOoCHXU*!*z`yg=w|mk`Ngycl2sjlEKcBk2mfH2-ByYh&2F|p_;boX<_f;X@UO|8 zX>M|tbcZCu&$8w%`cz-@7N=;7K)OYr(rn(6Xy9B1lw?532E=VNG|gL5HAo~XvK6b9 zS-8Lja#D@f8ERc3RG1n+v`hKYZ~4ic<~);)u+t zoCL)5aVi#MuPmEq0Fq_%EI=EDEnW)8m^3j;jA&}g0i$ecyKBlFK1|Nkc9Fq?-XN4z zj~2$ja!Xy#q$an;nv}5B9joSC?vL|VUyeqw)SudvX)Q>r_vPCh{#g#A9Ep5bfQ={q zmC1g0ir+oW@1Ey(SNPpk3!1Ti2|JZse)r{m_iVo#3TUfef|LQONRZCl^+QjVxjKE4fPK9++c9ahQ+8}Uvi7TJ@Z_+LcnFE-yg#>GRk||LZ zs7*yf;ZF3|IuQpns)^XV62HJdWuWkj6%5`+@#n<8+H|J;+5Sk_-n+2Y?emL zHF4I7LY8v}@z7|Oo8+jJ^_WZFMfkQtaI!(8nJs|b8I`sofKb{5)vz!!PGWzgL(^gA z+v{w!z>0|+C-k(g1LPEE3t2eg#CbW^bEi^(_Z9)+r4-?b#bXkunq>i%ojDpJt3L}3 zTXUB1wmC~H30YSE_+)=pia%?bKdZ{0HE%(47K=evg+I&X&$`^7HCseGi~M2qXm0{+ z2v8NT1I_+S#0J^mcPDa(kpe-sDc5SnZX(B6(yaXkm_TVNdiLgQEBQ6cDaydc4X|#` zcF_mFJHg+zIom<|rYyL2+pwQd%feEpKie{^kt5HbAVwLJMwenX0FDAA-^-@>#8>b7ZP}Bb4EOB3?!D`j2mig`&5tj*qyMNo z4$ix`x}@Ln-!>20n^kgfQNy_pU$}DSZTAhlcWUn`w+ycuGCb|0BMnopIWhBt!d+L~ zfA$q;jGunvki)U1DOuwZ3NBv1bKs8S?j_%^|9t)2!tvAV3%>o?)1@iztSLJt7yhIB zz8h0kkKTE2zhgiA^NBxhI&06)f43#|`^xpq{--V4BJKGMjNo&QsEwg~1_>Gpv#jqopLr%KL3=(d z72)YKD1r}D*lf~eChLwHF(=TT&v_Ai&W+$hY0YfX<(uh&`fibYk|X$>AHip^pvl6U zrg*#c(MUd`_L*2)8B&_T5qyRKYc^5rAkEp2JPxV1eY{cxO(>rs5qvmBVm3*c4LgSJ z+lvHaiift(7e(;7Q1Ag-lsf)%R|wt7gGT%h?pryFpD^bbGz=NdAOpjei{@MdgYl9>uug$$0Cb&Zf*&iA7JXBpSjUK{tA}|+5U~(cbQz9_)A~4G$Fu#kyY>vQei@@9& zf%!`qro7yA`pjgci>W6_;oqa7<5gb-saV)G$K~%xfA(?ja(JcQg!lLb08} zaZ?Qw+92-G0x%cq*Opd@nF>yn9zkU(fgY; zrpgsRAHGJmhvirtTQU#iFj7JYbwz%`7U}If?inImzff0#Cd@B}z$|A-0p-7GnJ8s| zP*;K`%$4YWjS!x-%Kg4T z?&=cZO0!m4?{en`UDa!7(n#<>I-%qfa!iuqy4h5(l`ni~=1aKXRxYZ25KC+FYi`xD zYPso(7T5?je-4h#lMc!j=6gaB_?#<-e?r-TAex4qREwn6h3HBs@~9hP-u$a1U7pa{ z5W+VPiVHmRm(I%>FIY-@;{$uN7A;+Dd}8O=+{H2!8ug;3b8|$fwC|cZE0%Kb$vEVd z^DC(TB0?Po0w!#AJs6=|;d0AY%&CF;jO8nqc`&-AHUY47mj_cUM?{4?>BRUKN)|wn zQ(oivF!C1C@K2%^Vr*;Tf>d7s_PBxzTN@l3y1SV^w=7;Reya`kC3&$5u%FG!zT=>?J zI)}ncsE6Q*+rmtdnxGL0qUm$sUb;DS&Pf47PsFH#tcitFvLFph;S1j#6%09hg?dZfly>|Nq#(>3Q%9J4{Q%TJX6*+0e zf$CpCm!2dEE%=MJe_{q`sx&&b1s(0j;Ckdr(0r@WQP7IUZxBSUG(0rX`0+Bbv7ot? zGAj&|FB-pHplQA8jo&ixSPhy(8XeovXyN-6G&ai2 zFwyv7)@-|E~etlurA2dTl=%R%$12hvu=sGHY2f?odG?!4Of$1ziCW3})rfH&u zZzk;KgJzFL7mx2~;j=>aNuc}#6OG?G*bM~DT^e0ykS!j5amFaXyF?Vy9+_HQlslE{pvt- z`ziQkf#1EL`Rp|K{REmW+5jY4_;SFnH)u*Vy3WE^37X%Xf}acgHfb~fg^8Aa_k!;6 zQ}APap94*sM%P*RdP7bgL|GXoT72h%!G)mNMmZPe3_Q`ow-R#h7RtIX(fC!uVjF0F z9wq5IYyVP4W33SnO*DSoo8#7K1R-A0!nXr-kDh`byMw1e^NB`h>4aam479y?XrhI0 zGVIO;%?gb!4&Twj_b_OlI|V;Z2ep9aTaB)>{EdYW(}#i#OtkP#fZYJlEYj#Yi|>t~ z*>MVfy}|Dx&^#AH7cIUmpm{5VuA}y)3j7X&rf@6(n9jnt5;R*hx@hse96Yvx=Fn;I zb6kqN!b1~{Up4G50L`5mU1#O_HPC!`3Vv*E4{J2^mnK^J^}{;w1$bzpg>NeC(m}IX zqwB1^+yp(Q9<_&x&7QH>7HI+S;*vEgUX+|7m+rXQYY{C4JI zH69O5G=AJwQ4g9!d6JHMZldu!=*FE-cxa;Wn}h`W6*L9xm|!TTM&tJ?D$@t7P%zQ> zafint&?HQfbe;8=TR`(ijV>C$`@m*9X!6+5z;q^Gsi66jMi-6W*Whs?@3n^W-n4IZ5U%?~q#w_@2PYWQX%e0XT0h3`z*Wr1dT2wgOO^FZSXq3ftWPXoVN zjfVcxMC11;=o(JJ?^d{f88mZe309rP_h!)Cr_n`=?`jON{tlYtt0cd~PQsTt7aN%H z&_v@m3U<>q8bOFxwD|r3boZQs-(TU;-#~N4e95h6C;ZF{Fjm1s6D@o3JgU)k zR-R1@F&}}4CK^A=&;2zTL5Nqh_~wAF_!Ru!hWnYP$!|mj#sYX~qJ?ic?215BuhE(D z9W8txfaaT1@H+?YPk`pkMF3#vZ!~^`K$8|i*HQgg3HM_`^O#20nY`8vn*W@F-xl!u z7&Hqj0l;*|Zw+WvjV@aHeFh#kgXVXO1-nk;y9qQmh0t{r-)F(*&!D-oO7iQ1zi8?A zPtd%e(M1a%tLSA4QQ^_=%VpE3imgHX5&)HuUjYlj)103ql?CGC){^g zhBgKdO=sor70|q|(M99O?EgZe5e)H)mVQMj{IgjBV50H+3Ko^1DP1AyocN2z@9b(U zed3{s#&0DG+(^(o%#IGG7oKSRu0r8o!3qEqjbC?ItObp~M$&bbzpsJjLyayPzw^Q7 zutp;}Mh~B373}cPMB}#&b{A+gf)KB0@qG$(FP(y)3+~?p&G#X6(fFMNO^?;m*J$Cp z9{G^~nw@JTT|fLqbI4X#7~ct3mUTM%P*U_dRGV8{hyY8oxcT>#+fAAb4mxnvr+X*Usk;YC&_oMi(u76JT*GXb%2a^6RX<|KnX~hw#uu z$*1BjoD6$py}uwb`Mw=Y!A{9>WGg0W9fF< z22DqFE?8G?57H3oi0)kA>$cN2XgZ>E!20jogEWLXq8kkS^V?|~G#$}V?mDzRNJFS2 zI<{BeZl`U~bVS!3)`NEhX$W;hhw7`0I1Re9K{w_!=u$v8{WR#hf^N%c(47goZKpxU za{0h%&?SQI;nSdFy?N<0=!Ssqz0;s$e#GC6SBU8-KhA@_^EBxCgKqR`(6PRioCY1+ z#W|-z$MUlBH0jo!2HhFpcg<YvC<55rj_!X$FGD3*o`yDjTrGq9 zX8sG>@VmlvgXz(o@3=UNB{nu5ri;}aVq#)UChVd^*e2o`k7qI-p13WB*7u53wIIC= zN5-7$Iz`QM1;>0&5d(bi^CDlNrO;xJOzzMbgLADNN1&aUQcCR*E|# zZSA)>jixIDE^($$TJRoFneRzTJVa+W$W^X3QTyyb ze4U8l2F!FoegxMkwA4Q#p!L8#B_IG|4-fxw2#w9T@&#2n zYK-qhFHf59L~qYUIGow_GI^8_`q4MPTbpg)J zC^8(`;HY~Tl`<T_Si~<-1itd4O&c&`dx(1%z?4h65l}8Svkt^g_fHb9%S0rksEs$l}nlsG4tHB%>!g}kp zmaf@qhFaqaEOWsh|1{{($c0*mOb7m4_UCg_ONvl_Mz+-yv@K89@)E_OAj7MygNv0= z2m&v2QOc$i1Tt;z=3MLdj3n&Went0C*6pN^`33%ztpWi;Cn5(QZnTKnsIl$W0H zC#j??=#9-+m6U9?Tmyh3)riCbKUhM?_5vsewr@TIdjHF3N(CMET}5594}Xo@ z8|K0Pk3<>!Cm>nIc;+`)vbg(-5;IgTvq4u5h%6DB#cic!BHiq}Ca1BU)Yt;$wu&|o z!S}KJugOyLtd-W{scki5f}usCjFEL^Ota-EnTonnSCXdYk14nBdg0ct>SM2Q!tNr6BWunNS#L_mFCIamjw!=#5&s$QL1=N`5d zhee_ModqT{ktap<4`!qdls$3&)rP9kZNn-%^o=L=HhE+DM>I$*I9Y0$isP*!kB!>CqfG7*O1q48u&KC?2!n7g)tbUWw zCQ`q~Y&Aa}34p&;{5jMFHPaPXoTz#gw2dRRIwac0lA^Zik!aIa8TBA%BdoD!`$2wsqps4h!QdpGU4ny1K!I(#Pv zdnR0%08XBvzC+#Yo5uoFYZ4@bQk}gm2VSOl&z9e6z5`KcZP9Hl&%u$>8k2UsSR=?y zsz9S!H+k6Bf;gzgNQ8&biGp8KX1ob)Pf_JmJ*o-zU3tTb^e-#?8EoIY2mB-}gCQ=y zu&Prm{(_W^>m9N1&|9e4<)^C4Evnm9Kt(cBWQj$sST(h@Im>}|p$#XK#h;0D@%}8S zjb1v&y#@06j7cnsRT=pf&(xv{E7h0O5YT==Cq;4o51{J=?gK#k1oSx|HeXJK z*(qHN03>ZMHgL>gX`#Cs-3~yq+COXH=z4wjy1TOEM4m zQzVu#C)4{ysMydPfp2j*&x8#~0yiAchXMkiWby^0Us6HkLudqXs|nkRFXI(+B z(Xh19GBEuFEa=weJ&U%enuXQ{qY50}9=H@pbhQq~Tv4H=-+MzjZVb9a?cw{Wi#HB} zm9^E3u7;JIH#H?Z#Xc>qKI0{O-X5)b2k%*OK?1y@@l{aBQul8_veW@k4&tFVW+h&9 z$~^93Xv)EjIiqSFUYp)CS)kzv36hZEws?jLpLH8+QCSd_IlnSkYo(P&v5y%dvz+5K zS#(Dj&^SP{=;i~GMRzJ7SvW5T6wFNaku(-fgBfm=ki|gLNn}z>Q+%3LD{6Aa4SUsf_rq=7Lwyytd=IK1t}RXtxHfFpvKJXPM}aYD%I013u%z?(%SD)AljDmVjL|& zjHcS5HP!n@!H4cx*ojlJ0LcX5Kq;6YMfjqD1{D#MI8g*yBYh{@Jd0VYOUnYwP3r1Y zwG21;;AWv$YrCqwB((l`Q+9WgI>pwMKf=_MWydWtwdbf)lFcmv=XiCBRUMzJb_v+_ z2gV;N*s!{b+1r0}{rd0H>SZ5URC$Ts+u-V#M*FU;u9>Z$aws7y3&XXRFBmZOqME>H_KuL}*Yg{ZFkZ{Pec@In~AVHmVxBP)n}<9@1@jzGQ> zW5RUVRact)`RRfD1mJ&%0Bh(Ik*hbb*d8Ky1<~tw7s=9;2hj`1Tg5ZVSf(c@EzysWnoSfVhCA5k=#Wg063EV>9C{Q^?(n{z?1NVRdJ!e2nGD-K9 z0mXyElY$FS%2|MDbeWxfqo!)jcd6nTTWVA&-(G8T97%n(NyEHJ(9~Bs4C#Vm3=*fP zJE}X$x7T5EyPDleq?CFUWyhO_?|&HHGNLrP=8~hrTa;bggq7K`td!Wftb{v=PSw6sJn>5fHt}!oyrODHh<+pNUH9 z`zo1}FrK85WvuUNZK^s8{^HkLR{Kh&4BpL<-eB|qy*|_E9RHKFf6+YotCCPF^3x&T zH|NR3%#(?kr&vMg&y$j_Z*MZ3x+ntsY8`6;Ckb&F(b3qk4OZ-%+5E}+4!v^7CEtm4 z_D#>j3WE!W;>i&Spf^oc@Dc7|nLf;W9uh1Wh1Qdlj#4X$fXelu%;qMgf;gR?knxEt zJy~O!&z`=O3V1q$6EbZeYaJ%TAObL!ev+;oO%D+koe*POuuZXVx|DG|kzwC7Tmb9r zn;(LwTAU^&ae4}h^j3>fh-sorIZZSQEo85dsG)5~t3n|wd20LUWFk6dgc13Z+B%}L zO@!WvY&sMudXh3j<39;H6AKI%lmt^jl2X*>Wz8a}uEI zh1*dEZZe=F0_VY7a=8PL}ASq*&0+KDjECWK2mAUxhN&Dx*PKp75q4LCB^XqC(s;|L@Ik6NmX_{$ME36rd zEcQSvyjFi}_`;%gQ7xlz*=4nTSMI3p-HwV|HLG)>*U|i1U6yThw#|M`3y9lRSlX_( z=mQe96xGb8z8}bL%Q&=dkouZ^zy=U;CI+{V<=7n-lf7rI=_u$(^48kVF;VCOh+D9r zXw5;%r`3`Nb&)8vPKM~ZY7~5oxJx*r$k{|pBc7w?B)6YO)F%F-&;pvp7jRznaOlpQQ7HKK(4*7xLHf*f~9f0@Rz`56jGhG4W|3qY)X@E=Ws$np~+ij`C< zC)AAUArK09B~y}9>Yzc$g<)u!G87NQ5H7i_s1%*Ha4z~u3<<`1TITiuUCR&S~?~aGjvJFg=Don zRW>8K7dA}oQ84h1D>ddIS^kh}LVRJpNXJJC<(Fari9))=JgF89$EUXH2tj>n-kj6=I- zY2#2{3`~v52+QQ!RwLVleYyB>h$2EMF<3;Vk_rZmt%wQVEYJ=ys!l|b z#~>JLO{#tKXaFTL*$|F&OkF2ahi$r;ua~70D+L#!-a6|Fhi%1_kXmSkEac*Vc6=f_ zM`P)Ms|{S2IJ4bqLw~v2(4S}ySH)C2^SHQ7Uvtpvy$px+Rle08>gxzsCSNw#sWP=A{rA!q;itvqfPq2avJJh`xw#}hBWRa;daFpf7@mx=@5-U9 zEZ2TD5ndyaS#i2J=;qf*(FBZtEzRHzbmMv(E^QTFd3M1o&KJ3}CFd?OO&`|5tNtXtc0S zJF>vGGG0~iSMyV)xhb=|skkX;ge++2Kk|Mp;!3)vS{{Lt;#p#21*0LSmc;;Cvaeuh zBq;in-lB0x2I+OMa0*36a&dq&ozixUVVeU;+DrbE9JMdIoTh9{HzLs=wPc9QW$k-#h@G0Y%qWhX_HossD5`kB!1)#Y#vK0({GA=cm> z`bS8wm=n4NAM6!#xCU=S$$-M`968&L*28GiSbj^;sGYPI`>+i!b!nh`iq_NtOph$yoC-Tl z;;`b~Ay*dfymU;RnIe{$!islzv)S6UM2~?LDa+Ma?->%K4}Yz4Gf7HgMy*CbTIgg>=xqQi;`NX|<1SsVu+i4CwEGWW9M7&~*rhQ`rkh)|QtI z+x>>^TZS!LRq6IK!}cq~_P7DD>`Q+sFUVTOvM=k+2*WnVuq`rd%MIHq!{K|LE5q_SASvy91xOCQe=#7c{*&`X{ zEaw1{HTOI~eMQfgV%Vk|ww!g6bomB^WKkyJixL!Mb|LN9@h$oZF*q(mox>2&cOuy{ z!FOVfXZTpomDx8dcw_Fqlp_-kQS@;O{%vBU0-0FUSybuP1*jj^pj6OWsuw5=`hmgT zu5e^!P+C($2qCj#$_OLQUY=M?UV0s34$`JI?!LVo*``z`R}R*hagHb%uB^o>t^ zZY@v8RWs;R!bY-r2)@kA5j)uELR(?I@ zY+9oWyIM_%M2b0)En@n-sDuO1bUm9z_Ttj1V3Ul|_eGxj)86%+813y|QX06tSxYV} z#5T1tI8N0nKjo2k5M1n;03=7O7Xy+Bm}@{)faHjEE1<81i|v4d9Tf#EId<(SgdA22 zCPIO>(P@UvS;QtK?Q5;*h&??v1lhY-pM)$=1x2#9HA0sf^dY)^a{#`Cj?#lE181D@ z7o+qdrjkpf4ia9b4z~}9)VYIc(=$-fEIiV^up*0Q1Cv==q6H2gMce{4hO38yN2w0@ z_9jUwxFBrMPf0~493>T*tehT_$(m`{a`-RlHUpB$dJiC(tWN;?Q6wlyzt+$9t_^tWo8YkXjZL4@xSPebaW{%I z-W+E&?v532W@O`TCSc=kt9W-2Z;l)rce9OZ+-(zYPRcdzX3QIR_YiNpc=r@=&yjdg(*(qcz%h19tX5kK)V60 z5D?|swF0UKR4X9L09OmB1&~)j`vCDgXPojnpbY|g6VOHhQ7)(!(0hPZ3+N+2YXtNu zp!EV`xn3uruK@i{Kx~6+1oSzWG*QgOh#e7ky0*&|hlb%*tZWKZy@TZQ54n7~Rv`Z_@!!ueu`B=&2@e4_|$Z zuOVjB0q>`2^{uh}>wPWQZQ-@f64k1_QFC~@?gq>f6|o#!Qp-adl*&tGP)aKpkl^k= zy#sBxfk-wfSs<0rctB^0?&=yqi2`B<%I1UFCLuO11BC56fTU2vjCmZX%1R4SUc8yi zCXv#;kpXCCuxz4cCu5<}8nQ_UJB%Ai&L)rsq{6%cmwMCm{@7OFY6gWjOR_ZzHcki< z8Vn2H+XRdDFN znJF0!>zwM*hR-eL6$zs*@(j*IMapPc`@IxuICGw;=I54hv!hbc7J4SJ*mbOF(Im0TKcp$k5d6x|$x{F4$wp-km{T4LaaT9 z#+pfGmx7%xPZ~qbz7m5Rap*b0D>y0Ia}(o;qKd9?Za6#L(I$tn($PK^Ob3dYQyeFd z5K~O19p~=Y7C4nf299$r4}pPG;q;RnYu#x;I|0eD*292gv$PwKl)Kr+1XH#JUok%=eGMTk zUtMlX*R8x|SsxRnwst!f;BcI|zlR(Z;2 zQIcXq>J-bphef4M1x}_8WzArtory0R{Q^X;glnY@gNyT6I<%2!1%1?t5qlh2WKsY<2MalTYZXuxa0dmn9+2Elc`YEB05<}X32+CX zVDZ?2FB-Gff5nU9A@aeuK1uOZsPUy7rVi&YmFImpP1ZHIk+-cTNyVv=@d$+7nH63lh+u_HZZ32QQ%1$6%~>rRJ&? z2+voyj#S>-R&s<<w^7p>#BwPjCp~o!~ zoGli&h9o*$tao%azn!qpL};8vdO5UKFd4dQ{;uk2k#4g)(NGf`Ofs35 zy^jncCh11(1O_8ooS3l=8)Y%q-Aiw%noLqHXJUfUT&%Ix@pPYt+BL~VB9KrkXwOEh z9gR5PGO2ZZV;OELnYS#&=;Icn&kK}5aY3U zB{ka+SrZcNdZ#Jk91d&YGrznO%`+G|k|6LCSK$orNR^*WlizvXhuZgQAsp5o57+ZU8r0EFmtdxoRT> zRwfAE1rx3BRJDumdZ`jGRC0OQBW`3~>EfqFU8c@6j0See{a$Ump%!_iHC8t?lU7z% z-=L^N^PxUhjz7s*H}@}|$W|^s(@IwtdB!<7i@BhkiNXXE^g>C)BX-)Vj`$t{96XNGg2pL2#}N7S-%+2L z_~n+t$}+i->X49^_ol^}{DU+r5{)<$&@oh4TyX(Z!_9e<`gX4hk)}d~pk=UFLemUI zETPv?)#I>qh+jZ7O`$H=D$&$p4MV|zL`N|ZkQnnxD|0`;B@KtznYb5_82z78ar6aQ z5w<(pw&>DF01}-{0wA$qPXi>TK3Rao)MuJXHxp0~`~syS^{oTYPL=>klNREMrn0y` z#w-1fh*zE?(&+tfW2I5tAd#<&h>7nI;tQwf3hqW^Ev2O=saMQ$Zw^_9zuB{Na^1@? zxi4hZ48hk?lehw?XjJ)0IPQWMi9RoClIhR_y%Sgc@rmGbcHG{+%6sd|)U-KdGsVTh zFdR=utE!1j12pMeEbhGqxnt8fkU4X#N|Z+pdszteeh5#!5h6(ehFAg2Y_JCdk{aw5 z@rTqBw5@Jxnwy3YFXBmVYIVy(HqaAZmXQ~dDI`eXwT$KTe_PHroNC~i!gj_V=Er5e7JK9L)U|7J43?(30yp&*BF-vXd6S+ zu-;_o0TuTnAUEUw2Gqz<7xMD1{1}2rqR|SA1V!|c?J4PxtGP4u;qVav*=zh=eMW^uHB(NxjrThnI4FY zwmCYW-UK4pIvfsi)i&sSgJvQhyU5 zk@}f{MCxg&EK+|9Ad&jJ0C`it8c$Re19(dlS~qUM7(C>Qe@W=6Q%u7Spr^(FNDz8z z9P!zkG)O1fYbZjKQw|Cq=KLE=$K+t!g2uMV@@;-J1LLqsm{`-we4^Wvz4Lp6x!W=h z?OuS05^gZ*|N6H+qm28Ea~QR-Ovt1;b|1jF_Aakl7#3r=?_Aq1&$Z9YYfV9G?QM+7 zZ3v2oj6tqFmRh^1I+>^3B;$(NG|z@@h8r=E%x#_Ixl7Eg-zI54#}BDQlEqce;oebY6>QS@N)Tsnc3uhdHH%rdiOZfk#dX z4o~g_cTw98((Z~FjRpe}qtR?Y-rl(kPvn#pJWW7b(oteMc~4h4EDXmckbX_EnqsZL z20@O3lAMoxGko%Nh$$sFJ0RL>T;_qqQ-Vxsj; zHR(8c7+hnx2$SK!*lH3k8r}7DyltXXn~I~Eznk!8Z^A_!lAlQZR!B|S?*^DS$(dG@ zZh-j}nhu{t4Gm<2=_1J_(>(IvT1X}qnxvP9A!S*OW1rM(EivGn~rP)OjXxw-onV@glG~E|AM6z}=R|gHGI;T5zM!IM!=W zgA_CoRAffTC0giwK%#|`tap$HryOQK#4;n%II9bVK(;$J+&!WOw*+xmb#6HHM?~yS z#@FhD3L26kF_a{6TGdb5hY&$Sl1==fjzK~zmE5s7_-lYk1_pxhvHON36TPGn&>fpn zlbnVQiUz?pIH)&Q?Vuoub#JmUU~g<&i7a&BQiE8+ic1YLtX^th>l~fc5g;}Pr|_Agc5ha)WzZWy)bWKWy=p(wy^OBD<2Q<<47x5>1+OB zDMG8O3-9Uh|FZc9Ok@9B<{xOvDUJ}xJ#`cW5MsbHuD9ir4M2kDWH@#G0qN19D<;fu4No4 zZ4H`B**vsy70u zE2M?5r~e6JD__tPg@O4C-{0jonEYX>I@MVr-l3skc4ufx3I=w#GhfCg1(_`p?l6Uf z{%T%gw}69%CSrXH%!g<@Ut|YIk|{6k@OBcBB*-somxWY95aeNXd?X)COsStWRj{8m zT>L%Q0~8_`6IEy&Ad#OrfYxy?mZ)!OtP~+=Us7!RzXnKzXaFR(`;P&47HiiBOVy`{*u_g4*<}ogjQz`q|5Fp;>LO9;tz#RG3`SWp@D_*r@Jxb z2y~}dYDO6q2DiP9tq_WuCS2r{5tnWh(quAP^kykojf>HHFK#60+$V4$0rd|m&rsY+ zp!*21r0KIMJuRKQ3;}5$XeepPuUJ0{6Za9q2n~{8)I4_xjD6L43x$0e{P_E0ggo#x28)zJ_Q@v7eAIIRW_xKCSV3IOZ z4z65`TNaL+m1`4O?!(+b&0B<$1bN(BRYZ%VkTP1RhExTrJgE~C@=QgcEaJfV)(di* z51Bkso(3qlHX^qN3T-w%g+zq78gfty-n7@SkR=H+-?jH5-r^BIc@Z7pZUW z0Q4+=Rz7VhxV(&Ku`5P%LIE8BBzDDU;1O$o+Sw7E^N)bM-37@^XL3-RSrJL6)2KEl z@Y&%BsIqm_j5Skm$vpPF>q4M;c`p!9Q=0%ikE@Z)g*1}6kVc&|2}*c(wvV}x42x3ozJP;D|W zoSC@XIi(>?# z5u<(3RHZ6{aJrqwpJ=5iCP!lR*pxB_7IQGN;g&pNRLeKU!pdx(R;6(OgstGG-TpQv>`f3 zA@pZ-zRBB$Nb}te66@tNxg-&_p&%M`ZQ1Tykiw0fls2Pa%H z_1Yvd);YOxkjmFJ0yYFVpJ>7&w3qI~R9Em!+mkoY_T=>_6WEk-{h@Pq6uH0K=$VYQ zed}0kG=+E`Q;~6grUIy4VGwQa456UipgE(-zOxgSMto^B2>06DI@hs1u6>C$I&4uu zw|)dM_Z=_SNn$W!*tE$`A7dxzgoEniA-jjOJs*%L9!kc;jC&Z+qYS+O=t+iX9`g)C z5`0m#KuOer2I8+yHjH=;XSP^VVYQbU;Vz3IbD55|XsxCp*1Zm+9mh@1x%M@Q@w+#1 zfm4(jpMasVkR*ks>x6DWFZU9x6-~D^6@j4l#(h&Lo_a{TQ_U$SXD_ySsjEBqQy{H8+mZZC3e4gQ;Y7}wWDhI zGr*gduK?cvs1?f9lm)w76bvd&?hX{2C@p|HYqlf>oi(?!E2pguI4XiH&uWMhVf-?r zA%F@EXVBdl!N?BWgqQ0eg+fg344h7H77I`LQ+(MAk^E(W;E<1_^k=EzM|p5%lr+Q9 zQbLKLt6b1ha?C~k>$nVLl?uuv1bMHq>qkQ>_NBdY(P~ZU>TwE0fH-m_7Hi5ID-J{W z6BdGztP~>Xid?JzHBQ$mfMn6LKnC(#FbFRY27*Z$Mg46c*Vai4jR8(H`YIKoGd==$ zScL*m`~ufkh0*|t7Eq?*X!Q6GenLqsLeOX;HfL!bCdM0@Pqjqx2eKJZF=HZS^>mhs z`h2qU5h(2jl*`aQKvNhx2xuxp9{{3pBT%B=%Lc*~arF#ftmO3uN+G|fvB%UBwrF|dSF z6VA-0bMJO;&FHwfi4}(^8lhn9e~Zf!JrTEv;vf}|$S~4Le~uScKDs2J0^r0dbul2y zAXZpNOYuZaK0q?i*vLoSMK^1q>7%Kt$=Ru9M9mUoj{mtS+9=8%==w=V+GXp+1>N1H zp>>Aqd6B8Ae4)N|^md&H0@=b}-7U>q#zeR?x!X4{t3hN#f_FIV;jjQ$oG{2VAS{(q5 zQ*qy<9+TOc)p&)Y6POwqL|Fx5zJ~CQR;~-Janc5_#azr?YQPH7HKLXK17{CXTGnP5 zt4Bd+nbcaJ$T~}T!y1CL@&pN;WfG}1p)#WZ${vF^q_nK*>~6{15uISZHOOJXvOd}9 zyXM}K9HCsAQO~Khh9JlWmYcRUsiIn?3xGrk)8&>=8MgqwcP+jSPvl@wkdG=7wKx_> zMQ5VP4_5r{MG5X-arzVXYxM7t#hFA?xxLBB)@I7XMaGQ5xiZ*)h9Q|-J7dyOH;+xs zghM?O4%^*Wda#KZ{HaN%Ro&$Jv0^LuARV+2DtQe;&u=PXAs3}ZGw>p6v&wVqR+_fM8{g5B@`qsg3LVKT>d zDU&&iZx;s1F}YK%+DwOVBE6&_^rm+go~ZK(kUDV&&{+mPNR8dsCB3QpF#4Qlnx--H z*HUcKqUph;AJ09a!Ht~UB}wneIhZNVl}$(Q66r3HE4DZnxMR=o?-0Vg{2ELT{O1zN zz-DNifOoi|hAt^Dldhu`Q%@vn!KKf!f~@)Le>=z8QG~z{S|}P=;}HW?RwV{=RTQFc z>?LFnRB{tM42i;3+cFr>W46*Hz;zKu*7o5YR2=idQBTBHDzq>|b*|mPwaIj)7AN<( zXW}ch&|ixOQp5y-unShFzKWf0La_sb%*mwKv4FV+d)DaQX)H5W?SrgBG~uKCW$VT0 zB-Cz(=v#nZF;63sfh5bf`#22*+Fd|W^WJRfx4CUUMx#|ya@V&d%7Zo9fDgv!VFm^9Z###O|#G;)a&Ezt#@7*ElLA663`2cvfsO0Ob2wu=*(9W}m14uH7Mx4XE8B zAX`>ec%Zb9XDEGn$VGDKq?x%Y-dApU1XkATn8YErN!}_XA2y?btNB^8Hhk6$r^y;= z>8YH7^E+qO7^cdGVsGrCJ}E*P-4`HUH?A^U)VDOJzswO`9L>ck-SPfLN^v+h+PsXe z;l#SwNa-2%fUcrXqYCi|q7f0(?b6+bD_PG@;@#L&O8%f4lZJ=ZG`L2JRqP#re2UI* z72A(iv1DLeUd49c(x+wa3D0=*mcrJFo~IO)=l_8`W|N)g}n1^4zbSGicVk*=} zP}XGD*V7J;Ug0F15RwI&q1t7!7|Dzeck(XI&{DHDc!sLu$Lh5{#M?~?$DD;M)sh;&Ng zEvejSw6{v65D>Um013tP`zr2JK$|$W?*KJ1M0ZbwdV3Zi5tf!-f*&ccX@O;xmcbX( zmo~Ky+}g85GBN`ar^jg;M`~5v`vye$ zZcP+o zKp_mR1k{J2)quJ&bUz^4`v{cQ0_w@oIzYV{+5pJL(9?j(v_qh@5zzGvp$<#*c}1F= zE9dK}lx4M}-w^2x#js9Gt}I6<9+SLpX%_kIw0e1@g5r!8q@osd10?EAZxu)T_5ue$ zy=^zS3H$$*6hQvy%64Rwkx5WtfJ4PuEswGto*{W8sd!^147@~pr;vZKw}L-l;B33HIASJ}JYKDVL_kGJE0_>@T1I-V zH1`=`!m(`j?vRDMPrLr^=sxd!#+?!A-b2%{RGNkb)o>a$^Lxq4= zGE@xc9)`*QtzgIjsE(lpfM~-bP+AP=UWWQ&9DazQa6peTL^I9@8HxsUKSMEq9$?50 z=wXHu06oP}3ZQ2gN&`f*`#>oZ&^m@l0r?n1lK?%(&=f#4_Yah&1A2s^JU|;5Dg^W- zL&boeWvC3$(+oKPJ;BfdK|^r-cEPzw$Y(W-@Ac$Z^f{80!$=m zBRvI*=*pEr=N$DwFVRA$A?#O;p9nCLG=TVPqp=;i5z2g^$d1WUB@Fhom-%~fe0*3* z>mA*}gfBXq_A`GZHq83#x#$R`7$WxQ2#0UE>Ay%rEHwgV+nF`VMJ>i|8%(35~fCq^m;!EXm3 zn!{VAkJYzF0f|NWPb#iSg?fYfF%A&{{~|*p;XleyvWhDKBo-`mRY)9GUI<8Zg-g}9 zv~ZljGOqwMmLclW$1}7V&^U(f2Q-l(h$44Hq@@t|lVu}=T&Mno}V#Km)oXsA{Lfr`N6==B~)Eyy3csJsL^x8LCU!!Y&KxKS#XhM!P#`! zBGE&5*oYvtkkcyOki7@>yGxcVrCTt{u@zEQ2u=rSRxT>XwSYwB7^vdL1EQ6SRk~5d z6#)87TQ{~SX!LlD&t0i5rJy|c9EkSY zhx3}Y<$X9l5be7U=Z4f`l_z{uY<1+h#6Fx&P>E!qva7eEv15(#CzMV(#gG}D*i7Du zQ<+|=8J$b2(tW;HM@z>|obMrkM6;n%5f%AaK%yp*CW5MvIK3>Y?{1)kV%B?lnT`U8 zYW@QtQKf0ek$Oa{WL2RqfP@OK7a&nDZU7{D*P(z!BS=&su#;#)Bboy#4Dqc9NF-Zj zlLuxxJ8D(4GuXR)7S}tj60e|A%2BUf@O?Rv$`0Tu@_<^67+3lO5^skA@-|I7p2#WZ zZb-r0QtDM<%U@8IKhu$)C(X$%DzOzfOJ+KXN=qaKu;n^z#YH9gwqALXqqNjEC%0sw z4Z%W-i{=zLY(*7#(Z`06y()aU*+LzqwwcAH6$n`2!=sN>Tskwi*fuY>yeM}@aejrA z>u}`HDRbCBpIcE;baM$oGfPV<94e8mcdv@xlCx}HZm|;~Vs0)4Nw10#K74JnoO8-5 zAP3$!3iE9hGfT_zZKVY^5gjuq&Yh88TyX=1u8?Mw=jYBAzOB^hs3^+I2W@GY4^OG2 z)HbiEq6lKzI4sLyD=00uu?W8LtN8`-N^jrTAs*dM|o+nt-?|6oau0u=OgP&kqad^OQDp?3P-LZzmL>= zcyCTkQHf7txP&AwVaZuCyQFk}39`;nUNpn$fUs0xbDYJFqB3NjqqN_Q{C-TErxq#| zmRvf;MHLRIXUl?)y*t0%`RMbrull6Ic;Df*p(BPoyZ+TR8*W(9;^h}!`{wkwm3O}J z#4mqHZ**wivTj{oie>FBSs@2s{`SJ3Ke+Dw^{dps+VwlIscc$1lj)~{ix%6WL#KTD zq38Q;w>?_j_NnoE;%eVtdGz(4OY2WM;}6=U*4PjvM%VFFR!}G^ZYYaqdNyL&3`B5(?9zrTZ78>{}42L z%6sJn6Hg_~4>)^1@O<~#R~<{danldIuD$TUqO528mHjpJNSmS&6Ylx!-N!e4xa!#V zu3?{tMtrq=&FROt4L5Fj=$&cDhipne^TW%Xuf6`jPTToW-#}{p9 z%8w`9GU%=S|A~6$v66-}2VQ#d&HR=vKKkqCBWu?8Kk?q$^#1SVcD>2IXWs`gkDu+b zF8ijoJ(JsRw~ku!*tV$HZ`P$1?YN;!_9sVE_og2D?bbn`-q^Y3z=n0xeqDLb?~^0e z*FKo#eDF*2?xm^uW3Jxp-q-%U7Ms8C>KgFtxcQ?#U;fF1k;nV*@B41mm-_X0t?sno z&RuywFWWG3)8W9;%g@G|;*M+@H{;>?`+nUV9rpeki5)Hb=j46WXXv6ICLhQf^=ZP` zoqfw|x2wQh0ibHAT0cjTAtnN!>V zp}X#$r}mV+@zYIxieK*BuEkfLZx;7+P3yAtk*5z_U2UKJSMLY!ve#7FX1v*C+CP87 zgF~0^Z#{U~fljYaer1=b&BU%fuKh7=V2_0zeks_n^!X1w$6~_oyXp4ISv_tD`0eU%T^_y&c}1@%Af6){U5)`EbhzuWtE9%-Yv*Kl}EKg_Xv~r`$BC=AqPU zJbSwAyY|9}j~{5$x#sqSxjmlV)%VN?Q=Y%BZr-m`cPG8K=#>lcqX&NyGJMYmhMBe7 zk6H}1zpnp2c6iD&<=qN$KL0K6?(BnqIWu;~U8TGJwe{aFY-q63t zyqYu@Zy6{ zuWG&f#*0ID3^N^0yMOq$sr5hp&~@0~u7?W)UfaDpDE`Hwjj!&{9s0nZbI;9qW99xI zH>dR2IyJH3y{?@~c0BvbQ>zk!)_rcf>&Zz=r}gZ4Tj-0|wphLR6VFdSCKP}4+eP;` zBev+;>VKY)|NiNxZ~N@ALsh4zKm60^y&3&}>(}aPJM(>~lZVsJ^g(mp#syw%$K`bReuFK@iz`9HsZ z{sLO1cwKG$s{1!jd#pvm`RnKW(E8!EroNl2$K7-C z%z(@-U8*Zztlu1SV(vXw;1c5Yw^^? z(a#613i~7C?z1EBt9{@OXHLMth4%!lyW`d~V^(LZHQHZj(f#u;9jzyBOYHc}Z6^X; ze@+YDH+=5(D+kWF^J3v0#@i2UT~lN@^lq%}hY1UQzIj64hT$_FzqeDtYg6yO<%idA z>Xw)I)<^APpStJtyo{2gr$$Ve*EFkP&a;ZROZr<^rzl;)|8C9Vqg8t zYx!kW-)}$ugLPWQkBzZsK74x1N3nl>797-aj;YJwzV}PVYr8Mq_a!aQ z*x6^6&ME6(l$X26prfzf=p}nWey*c`c=+8qU8RhfS6bYEP986Y1g3vpIc96~@`(jz zaFSkk19S8B`sd}(aNZn3i%1Ts*DdgU&2aznyj(}FK-1h*uZxjsHf4OaSqAaPAcIW9 zFs)qs;^)PL;we(a^mpVhaD>b$0fIy8b#*dyjq!%xh19ZyNkjwXA!4UJD@qSJ1LJ)8 z1Oltq-2$JeTTc%?qUA$6G=DyU8a_s*nT&`?`a6ccR;%Sh%R+xXMhzdD)a!M$4ktb< zZ=3^zE+oBgx@b?%pHFKI9~0A*!pF)$df@$sbF_SD8_%DQNyCTAM6bIEKIPBqX>GsK z@-b`pwAJvTQqb#4Axw8bGcIfo((<9jvcEhQ4WIT*V~0=j{I>Z=B%*o#(Bj3PPkRj? zT3+jQo#0dGk?YN8w0vku=+DQh;X@qsx^LlAKKGuN*r?@mwT4e84Ig9&_)LXQwQa-k zRIDGHr|TLGpCApN&P;PF`S`6GxC2e7IUmvs`KPP1hEFil5H||_=ubbpw0yc~_ylYC zbY&W%r2NqpK6qTqhnATB@^sbku`x|1`S|^naMvZ|>CQC1?cJu~(}QUi!>4pvp8H~@ zR-T?3K0P#iNJ*gA(c+z2W7_LEpK1B@((nn<@VSm@QsGnnxQrpowS0PO_*|#qLp`Nl z7c2AG_~0!mT0VU=d_pyRu4kHfnNK_ChRIq!VH!TyYxrg6XS}#a%V)5L z&maw-Xr@VrPa|ST?8$RlK0`EoqBVSmG7Z%o>GIUC z`BuwkxQ0)RhR+D5p%H;fDWL4psaifGHGD>B_}H1I7(U7Kc)zF7?3lfX0;@Tne}q?=A?`6O!iBxv~1L`kosnoq87>QmFS ze3J3TU!EilA9OdM84I7v{mjQ-AJX!nUe2FSiiQuBxL!xwOEl6)-SizgiRSq{TEl0Q zhEE#Pkb0KJu%tn8m*~f+w)@MIrs0#pG@;-_qi@~tQ=7E%jM4DP(D2D*nlxk%_2yqL zJ-t!OhjPzfo=gp&aZD2qd1%}j@Iu(lT0Y}7e8y?`OkkQP;J3u@{ySsQ;F{<2L=B$_ z8a`P}a|%Am^Y%;+I<4k>vNe3NG<>K<=ym51Gzie1t_9y~`P``CGfBheCZ=hGPc!NN zBwmAt(p(=I|x*IakAHx`xjTrr8JIgx^DhKijR9XQqbF3=N+=rm?{%H^Ou6 zwOT&;c;lbXc^W@md{)bpE3=fa;Bjf4!K!Z^+qSrJY6&@`O8zT z;p1SM`{7f%?)O}WML=^tlzaYs92!1I25890ZZM$Al2LbS`OMewnWy2ifN5xkLvDY| zb(hGWg?QsH&jJmfMNC6`+3f(0>0G`}E6*(&K8rMb7BkIi_*4%^?q2wrmd~vkK8rPc zmM~2yd~zG(Uro^Rxeagp)3rpyr;=$thfnUgInS@x@>z;E{(LGmd~RnNu8n{$?0NS= zEgzSL&+QsM%b2D+e5y5f9Q?AYmQR(2&oT|4JD7%Q5r$^z-2pFsujR8`!{-hSpK7Kd zZp7!2hknJRk|gt8r_?ZwZ~s%R;Zw^r5Q0PB_@7!drsjOy8a}leJ}a1JJN#DojgMSB zNXw^A!)Jwt&z(#&13ryk8P^>`6KO8bT^c@jYWS>Vnltceo)EF}I3`Wa`Jm}Gt3N9> zeC}bIC&|Ze)-8p9Yx%6w@VQ6Bhgz0iM+#9 zc~HY=Ez|UdPp(z)f+j7Whw;Wgf7WXFJi;_o`sD68fAz~+K9Ay!Kc7c5eAY3I4L;@W z(-AIYQ}cX&jA?w^*E$WK^-M!2XK8M?>(Au3w0s`d@L8|nvw>-r!l&_T{i_!)(QiDV z;j=-*hikHK9g<=I^|+J;UufldO2g+#4WFl(hGrB#)9`s#!)GJYM8hZd;6vkH*YeqfH~!_mQN!nXrlH$kG}|6N!EM&^c|pVH zc@3WznPvoh%IEOxS(#csFKPI^sNsX^3z@HnPx&0u@tXZwKCfu_ysY7~nQ7=ma~z;m zv#0IQ@_ALmXS0US7N()o++7Iz?PymmpVu^ewrKclWg0qV*AdWyZ^KZb@ZdLop$MCm z*H#UmZA{Y*K7|hL+4>UY^@fJeHVvOQnPvif>c_&SNGG)N(CFr0f8NyaLGuO;9hahh z^~)6%s0hu|^|pr3TN*w)n8psD+WWHK2F7do>|`1Xe2RhG4yGoEN?AA?*Bl&`RS=Sb znW@3d*I@3@U}yvqPT}*If>1eA%@$6fsaFsx&Brokfr>dUV-~5HGn!C;XfUmG3QCD9 zNP{7Lif{@Io%Zy{*fp4O8q7=$W{w84RD-!kgLy)Oc};`aqrrTj!F;X3oYG)uE$5$7 z6Llr*l-%f|!SvH$qBWQ}4TcU}`*Y6IVCHHtl^P7)Iq~O1J&r$y?s)iPUe{pgHn=|x z-OTaF9M@oe)nIt?$H9~wqx<9jeCV?-{+PZR%rFfmRfC~hKmL5C%9!UR8wAP0$+~ix zVgzI8fo}eg8>C_u$e3sqvrNVWtC*ECW*cL2W)|kpBxM7fRi$}Qrs=9;o{%v?D&}Pw z^RkNBDP!_f%sVosuZsCh#$2yrzL7EasF+`6%hM*}L{6cy86#%xqEU1dzUis>(7 z3RFzAjOnamQe=!##oQ=kR;!qN8M9W!&>bmqtyRqJGNxL^+$m!oQ85q5m?bJ^gN%7n z#k?$IHmDfBPm8z$Rm?$|rclL@D>lEcY8GHB^ios*{RI zlQH*;P&juhXOGlhr6DU3pedEF#1$W|&36%$GEP)NdXs3^iD`C_0glB5H^ zn8AeEi@4NK#DZ@DshA;z`Q4Xh0K}16VfpMs|#1;aFb@I>oM<}&~y^J;qBQGS@gMExg1l_)eER}7xo;-{y&%4w$>qheTQT1^s$pOP2$PH7ohpVnuLaE({NEv%F`QDWbrgzeIHh5}7)~j1S7`q ziE}Z=oz3{mVki{#Y+ek>6Yq^PrHLk*N`p^a z(L_X+BZ!9Oi6og<;ira*qQ0~pXs8x8W)dN zWCGobi3AN96Zc|Bo&rA%$uq|fLwV@%!%!aH;)fxbZ}-J;zgpvmA(_dZhZ;NgQDl|G zi=kX4s~KKQBrs3-VMu1OvEij5nP2h4kj&fsFeLL%KMcvd&leL(7XC7yDB|M*W{rvgfZ4qyr6?FKi`k$VrDCWo7WiTY5+6SdkN9L5AwvljNpYMwlX%Kf zFqACr)$Iy~`$OuZ7Bj~8KFBU$^g0uKau))p!bb+M>nyKsh$cYt4OI_}Ue{KTNx!%G z8H|-s!{ty!;~#1_hqB6{2BrV-iZ@h_9ExcCL+#;EHaXPQk6iPbH&mS*ifH^p?d4Ft zL4(B9TscsHn%#^!W-(M9ExcCL%j=(Ue{Fwl6p;eX`DAyJ2|;T z;~(lh4uy!4fV7fifH^pfe4|H1?)!8JhsCd>bM+=X#7Kc1dLu6%waG({As+(8|rsC6w&yH z`j|ttmqWd=<~?*DO1k>W$t4>9P@iz9Fges%M^AK_N~rO2D5CKX^(lu^>c+hdZ%=wdbw_@ZBO3oup97=Ub)=VYQ%er}wIn>qg$(@@Wi=jZt!)N7CMB^XoD`51x{uBgmq?Diq{A^e7nC}`j06gzXru!ldWiTwXdq*SR1^eyk|O zyV>(_#j&(p;3nl%E_a+0@#62#HPoB+~Nx5xdJ6ZvZ!nj z158GgD6*lHN=uM7MSil!A=7%1Wx0--g{=4$aq_dHv=HHBTIAzQXn|#s@*Ql*LViS@ zL)OX24muLDqvJV2501!mlx&Bb$C1lEmmqBKQUPf;UxrvnGG@p zf?Z0o-a!>gm}C*pY-vRj`;0Q|$ggmSiqE@`K48uq%41?$E<%ts5(x<@au8pzL9JFA z5W(U-stb&8UXBX$s%cqJ(Z}`$NN(I@&kuejN z4tnz3ywZ~5g;Gv#-YjQ@$_aI+JbzBfVLQX)hCFf!h(<^n3G#R zoAHncy$S?^SrjKKiTb2Onj@^sNI7gNhRnmr1z%BGJTIS&!boVjC3$jI#Wqil6B}j)B9`L(+y%?* z8A^%DL#Nanjp>Cz}3%L$eI1A9=^05Vo3RO`w2S#2PL@jZalwzYj z2hfZn0g5_+2nvdeW+GS64LX#v;Jl)3pB%QwLoETRrCt%^3*{^IPHeV^-^?#8g2^BT z#d`rm77Rn8$Dx*y0}DVUIdTqj>|D{x37jTR7* zY$Y+zkt1{B?K$D;_SD3bl!VOWRQt$~_@s)FQK02EY?ow`G4`bR(P^n^>G5_7Ju-^I zlc^<@A}-OMn2??xKPoZNuDl!>mFpN8MZ?L+DB_%_Qpd;Ilj6ptCnP2&*Nu+ zrY5Avri@CpbB2$MLJblYo>ZdvQTDWq#KgGKX=!%Z>eI+5;w@@}fVm=y&}zWwQKK{C z(?^f8%RNAa`X(XOo|Zm3J$_7T5=2i(r~0G_8ImwYlY1khxb;&mI7(G68TK)W$)hqy zC5^I+$~JNUS4@>4DlsiHB`IZ0s-3H;ijNy(ADxjndQ?(!rg$?lN;c4hGQ&Jb6TccV zKHWYhIW;3bDL&3#0+D4qQwT=29Z87hGQyuIRBcL!YG!PTx2kw^C2o{G zJtZ|cH6djT=L*$hFhF)NtLTxD{13b}wKOtwR6<5_8uFSZ3TkX|>GqVw)RdIO(Mi5l zQ!!z62}W`8_R(?iqemylqS!D#iPkVON*K0M8ONvD6GtT_#mA1yvJr+gB&z~s_)~I(MDnuN26|wlJ(12*)rD1DA_a?vIlLW zSPdPQW{*o4la??hDHX;#*i;teS8Qcbbw$CEwJbG6x;;KVBQrTMIi4C)DwiB}7|4B8 zex)afLwk#jPe@7xj>n?h#C-X^Kk~O(AuILd&P20xCQugTzQcH+9gYzubPU`6o8C?_&U2} zxBD)I=$#F}=bO>d-YrDGAt5m-c4FFuwA8qvJ>bQsPw3%~M8!dmnmE3P%>XvP;5Qq; zev+;o{zwT!r#SLw-dvtrFa>LdsK_a$GiFVhH*>(?DaEB_JVomd3=Ubuw3B+!@!AfM zCU=pf{!K5MSzcOETHvsSj_YF^Q|5p!%&=6me8zWVJnPO-KU^2%GxASL0pbsFlhS9 zbQJHU_zeJl5NK|`0)DrE#{Dn+=-9%&pxJx{{Puz7@W1eb9!mNaG}UbZz)^l)F1@=! z^NCD%x%7@g_^&||Y9?+%g>yN6F`!A4=`P1FA3U-^^TrkMdml7M|Ak*BB5DN95boB* z!J5m-r$aMpCu=Y-Ctr8ScdblA=_PkLeleg+`xk!45IzeugE|l=aZ&Sf{O$nF8kz2L z^34U0b)acyWp><`T#nxm(4@+Am*ZE77vn+mv8cr<-KT&E4|uM_)z0 zX8q(B5Iog}k8WYKC#U91GrC03Jpr1ZdJ4LKsxJv4*c8N%+~x8w9q*=r<~ff1XhD)vZkyH8k7z!jjjb{-u4Ly^yTf*(l=h&$B(vT~l zBYq>UfR3ga30FWz>C3zVI-2`sUjZGF+;jzW2GCVq0bOg*)m#A`$+zkX=xEP%jfM{M zx@P4@bdOvi-IG^9NAthuHFTMpH547Vc&i!R|6mO@3(@wyf;H5PSBu zyI|iPke59zA;?jaB{v^G8S={jkduDb`yn$c3hfM^V@P>E;MJa#&5Fy3a0-6PFiZ?V> z$RC%)CmQ5H^uZv`e~~5|_^ijzDh-EU!w`0!B{xG0RNN{R2S9p~JUG1+$g}W=0Ly8= zbed`}np~mz zaw@2%kSd}8&ZNhupxhHeEFC6<1kpD$OkpzOT0&6W^Zjv|Yp|dY4FFm9&o3zgimfLi z>8Zp>h^v6O$`=s*5{^IvfC zD6;b(oc{=)dx`j{zF;Ng!+*!optBjjKt2uq2p}t;;jd$83H%id9e{rqLnl=z2u1KJ zo&u#{KwB8H0eX$05J1$|1xhqQ+{sX16$%IRI^!Y%ZDS}J&>IZV$^JJPvIE-APy(R0 z7)k;3HbZHEb}$4_;)RgtsH>C)ZAwmzaMd!q6=7ks1Fd1zLD@yOq_uR7wWcfVIR zR#&TwUADt{G3>z7i~A64{-!zV(!!Ao!J8hkczr(T%H#)d|5t z_#{q{(l3I)d09C=YgU&QVhQ_2zqc_T4>Yr*;tXWtd?ZvLe+>Knm=Ml^;P9o05ZagI4o*-i+LGU`-mg-?bx^Ev<5g@xORNt33TnVxlUx8H@s(f zVCOdm{k{%oYqNF9-muPh`IEOArU8!G^x;19TVJ?5;YpS!-p*#{tlPQTwrf`}s`KLVT& zsPY&cZOvPfb;)v0InP!dadwaH=Il~+$`N?}^A5kB{~Dc`&E1ewQ;x5P)wIUvj*J); zrbg^w$Oc(N8HKA*nF>+IFWzocp*<=@y^DBDJ&AxusSwB{szp@h0a6fG(=~uwN;C-w z!W@HUL_AFNN!brE_hi}KjU(OIb$xa?z3wfSh z37E$+L&W}+;neGtn+sO%JYjV0H1cD`ukz;=^*ifrAZ~@9m@4)LL=IutQIUy}+ElBL z8SWg1mSl-{U5J@)$s7+UEwc2c$@ON79<|MAZl^O_;w|QOu@?Nb;jisi^OE@R0`sBR z@B(*ybU{sQbZz|5>e!)sV~0tT>tpQB88qIwevg^oVO(9jj&i_44L}3#un*kz1RMs?fq)YLdLq7r4i_lG2z&v#Lv`#hnzPMnEoOA6!9l1CAZkHO z@rBDEkOtPaF%shpqib&~S5v==4k(Wf+49$C#sFy+#Ck<4E3U8 zsHgfNsyc-YA`cD>+1(DmrG!q{M5Sk&NH~kBHRJ#=EB)v)oQow)8wygrv}D z^sydxWpn;?HC(7!91^oKY%hHSdrFoVu~3O8prp)irReHnkGL*mn3wl5Q2$#=?38(5 zyunp(a5Wfc`XE*9AU@{A58Map=ISsu#`3WF9=J{#J5C)48>0{}f)RR_4uK(CLT2r? z2%MmZSRI7LhP{!#ev4%Sh#z=;A7X&ynFs*cribmL$Z95p*j*R<-WrE0I*G(D%=B3^ z_)UuOj+Pq2h!wSevbYR;_Sz`O5$*O@He5c7*hp~w86-+P^^fl z-iR@}B}Qn<7DSsux$s|#mdE%!^qdj?OI?tg+sj^k0?{0WvibV)-YkP@#S&YJ?~* zWJ`)HnTd<+9TcK_v|L9i(@67*F}D(aMXTx+A!K&S6S0lfJ$0M;sdndwKZT6k*%)Z5 ztee-AT%DvFc3}Qb=RT@i7D6Lgz(=h=3~Q*i$d6$S*;Go?m6~GmO!iB!PSni*QkfvF zN?Am3RoI(g%InpHSkNt}AZyXYMUJDvpqED7qvl){^Cv3F6nwaz=B${$DDCe6VxKft zZq}$y#mLY?;2f7-KjNKeDvL!t@g{sG7_(@~07W$XosL|S-1akAM@AfU?XU>q@2A#} zEu=TpkQjBjPxKOzue$;bkj{rDzy~%O^#)@L6%lAOwrm5|Vrm@+NDL9AX`=;Lh6bCqr& zx(DIoHWZjA|x~YS!$! z_&;42TA7#kM1D3Kf6^_L3ypfG*{yS@QYRdZ-Ydov#Gkv3$yC0}%4@Hw2wk~^i38mk zL>vy{NRN$)BQt##g63s3s-huBVx$QlOT%>n{l+&rja;MM>6jh`$t&5Kv4*{|Mm<`A z8+G5EZmEqm#&mF+(6{QiZ;ti^#pumdRJGh=4enOVLcFO>BGN#R271~P5v|zX>f~l%Hp@Lyx75MgA5Y5$%40x>42}BV_YKH8^;64nTB-(WkGXYNPv!9 zfUY~z_BfYuDEti!rNghq&&qXDKV9Mfva@2>g@}Bt(70k@1Mp z>JyQv>YTZ18Q#t6?;rc??)RH@>9Qtb9W)U^?)Sq!Gk2>*ICS|Mb;SAcLK_ho%(20< ziNT7JMlmj%M3ajKOnrjFcIwX%CP@@4mN8-HU+jPaPn1Mz8~fu;OGG3()_#C!*=Cg{ z!v6rjKxs1kTNt+#zUV-RW;NreQxKicX+WY|qoNgWfs$zcJqUjTq@Fw(CN8832!D*; zV#=Ek(wFoX(MX9Q8$%gJDsC$@4qN3`jM7TMFj~`6%m9;(sGCCbN?I zG7)w(;3F)%TYosMdc1LRJu#*|W^w`2Rp_dP;Q>mwB}=Xg_%L)tQ^YxQ_I@`s2{aWp z^2C)tlZ<}KR%5J%Dk`L#dCLw(H)5@g)y4YboF{8RgX$F1&)FJ-xC!|!d0NGU)nGkh zPW-TPXgH=4K-R{QuEZEK$z0VBk7(u{NiNr}fZ71_Tl?qYAm$@F=f!_WI78WZp3~P3h6RJ z1ymOs;AsQZY!gKuW?sF+uK%Dmz%MTX9NFf#C^JkoadoLD>P#uk37kjWJI^1kYJy5j ze}?ne0*OrcM!Gqh<`+^HX3A(ErVy@zXiz!RT+k?gep>vc1)-?qLjb*tUm({g0o{q` zbBudKeS1WOZbSwNx&vn6MUj7v@ z@}li46x5eO*;mhS9xMI?%%2}O3K&Wj^l0@cd0-37{W-;WLik6|?M_&PvFSz>7FGyf z8A6DXGr<=jh&hj@C4_|F6>2TwG=3GV^dOCF8l(evG9Loh)V5I{H*Lh#?UM9MefsVh)T~Y{Rcj^-$3aC z{M`)w34aemwDv#1kO5EwL)6{vWr&*IK87rS-eHKEkbp?HFQ8x*vZ)X$G4^u^c&y*2 zf)7NglcVv`yJml`+N^$x+yLbqf|4NnOS*lddKrhcTZR+}M=WW&}4rlI~IAi3W_x1kic#F+b6DBWR z^!4ZoAHR4@-c!GS^vnl)Upm(9s|%m!+L!eC;o^N?*?N8%+v==mh zU&-AoLMER$mQ;8A=Z2A=U31~$+;fBP|Mjm$d&l0Fv|#KfosNCcrTdF{g#nMPxvk}} zxbVI&?w|ShtG(Z}e^7M1&Bil7MW$6QD_>DG@j|=v+n04L4uAEJ-0y-$&prJ4D;=J> z>7%-C?~bqS=nT8{wPT$hSiADW#vgWW8|%zFl-Ta8c_(7u?v}eM;oiqy-+bG3+g2Y4 z4F2@7PCLJ_7v4U+pueH`;<9_wPCA2sslIL5p<(wuI@hz|;kcO>dv$*9ww#xKs2j9x z!2{22>5)J6{l^z|+cV<#KmK0w%+S-Li)z zblBrDp7P%kgC6?up@Zuy+RU1J{eg$C`trjszm0nKflq!~-Rk4+X>(E&?H9kl{q>&D z-TlN}i-wGi$&d^qYo`r7=sMYd!LFoU@6@ijuF_g^e1+%s533&R{$At2$J?BKa{0YI zQt#RL%kGW|OP^Zu%#@VwjRUhLc53nY(B7V{Prj?0``n|8+E+`9qu#l`O?>8CO>5V# zeDwWM>&>UX?pM2g{f~90c72}HEpoLk>EOy0_icT~uy@YktF|0obVF2J->_BB1rE>q zY|bs|OXq&t_4{?p?tG!~hd#qzm{|7PV@t1EG;(h19o0u72K|}+ZCmr`kQZumI{jz( zEsdYb_2qxvnRrFXn(%#gup*=PFa%Ag^pfu>ZW=7b^>_56Qu~1apdY8k>3bra1|xqX z-v(?SfX3(aA`S3*T?BjzJz#Rbwpu>aCHwOU)bKGf%>bFtu1Oa$Gi@$UD-9o`hEHpz zp=m9JE=UPqBlOR{>AFh8r?rL;O?mY?v5>+h@`~bbw0vkf;GZs&h7Ym>G^5~?JPC{X zqf4S3_m#)YG}PJB8**(meCVxSmk*!#oEiP&by_~{n8ufnMZ<>%9K9|R5z#RA$(>hY zN4>c`9W;E}Yxq!Ty{rz76@=Z{sxhlW?Z?ihTk0ksRiKBMJxHPiT} ztCNOL5YxJhEI@&PiLm7L{O@2QQKa)pyhL|hEHb=A8LepogF@v zm#4*Q6moNUx-gAzx`H))x-v~~_!N5Ov1OlV`A}{5&*!chJ~pPIa;I7w99n<{Y;$?K zYxvkSe0neqHjp z2&}7=RDvb|Qw!ATCZ}Q6U%FwH8B?=f>uD>3Km7-Sv0b9D@qF1utM)5jt(NjipxhZ;^uCgX8t%#Y7c^ww0Y)GQW35i6i`nS!E0Gvd4%{9P4V&&`!+20x%q1|S9Wo@Bq=5oE2(`^^3Q3+s zR*`9;N5_!5;7whGVXkR}`7xx$X*fKTY6b?cQl3T{85l|(G7o8B zC}Q`UFcgd5%Mi*~0QIa1LqVk4G7!JQlqmr2{}G0{NQ`n0E*--$rJIf+HOQJv$8g-M zBWXD9S4Uzv?zfsS)J{BL!ldBoSrdlh{z#Kr9wv;t)hzdk3T*;z~Hhu@%oxq~J{@nD- z4Xz5wMKoqE4|7ppjGVQ8SG&Qb9aH0hkC`ijX!UsA`uIOkinTPnQ@)F61a7Cq03k7Z zO_<1%kjav@(ncH_52pSk7txr*;|0cQ(YS8N_{TeOxo-}0B>gr3^RMgZ|rBtk6w+WeDwX_7R&B@AzR*Zs6 zswzKo*W{Ji2KkDPgj9UD#p&BP2@F`{cJnYCftOw*9j6^4w|{G42GUcQ$iN`JcW z=_NS@zRav#im9(a6jw-1_Ih=alq^`<$;-*%#PEU)$wW0x&o<65pfpQ06=aHTwP#`% z2MWfg#l)wYd_cc>%^J@%6LR9juFtR$GI@GZggcdukd!HD(vS|>2wBfILQ0@guSGwF zTz57?Zb7?ca^2Vn34oxb3te|MLT&-w)PYz^!$ppIc^sF0Ti4)E6l30UgDov344r>F)0V z9i_{|J*0cA2XvHgPxOF}-urY9>7MH$-HSb>+tow5mLAgW?jhaY9?((#zR?3Zs^@R_ zfR6h32YNt9<^Izi(9wH8?~X2FrW+(mF0SuDH}f=l60@1HY(wOLW_|=+ceYL*gp5l; z(|0h7<8~sJyj0M5B^@EP0bblP&3D$@?6N ztr#@v!-c%*_=zPics4#t!9^~XJSs2OgJ!>^qk0fao_hoi6~ILagbx?F zSmA5$h46u<&nQ7h#Why=Y@;#Hh>Kh-d1D~&EYRf22^dmwvE&UHi|?dyk&7ko4b+b@ zpgBfUZE!Rr6-!=v8qyCJxmfbfg~vS5Y?&&ME6-Percu(xk~bV4 zw}9pe$_TiV>6b4-(<$j<$$J1YdSk-yahf!QbK!~=-`SWVTtd@?aIxh55q_&cb0$p; z!clu1OWsn@)JQsAUYBvy>EPcgX-FQq?#59lrphmSNOxxs=%`-*x(9Uh-UoU>*B5jT z_kfP#`%Dk$s2si3L%Mf*NcZ<1(!JjUIvPrU&;vRuA7AuVwpq2hYV&`?U=>B+|9g&#hMfll*xdw(iacenosB-9#t^Az z%1S#gI8q_D^D|`|thV5OHbY6cQx648a=4$z&?wx`X9(>%n+37+lAKtUqjsB?3GIBQ zD7BJyKKT)C4ImHhr1|Zx}x3{XtkeXO9jZMYpV|bcsYTP&0Zo~mVGE#!w*!OJ z44ZSO%M;G9Jwq*OcyM`(_SK?IeKS0mvE{HagbV)v#O1~%#<}#X8E5(mFt*6gO?J=* zc!%?)UaAw{H#*Yy1n?1mrUk#Y)Lj)VbJU6%_@o}@q&(@(8_(W;0$+4(tGTqaDXn+u z?9SBAO=*WoEWTn1*Eqt~a(q6mS|K)JhuZ?PTWYZ$fnth)8xdGwiouWyQw)Z13>H+h ztW>DH$S>vIpwjmNF7YLU*p23QHZ4yu(ZhZ z4IS?cOexd9;&eo$bS(um0bl7mcRD;_zpcHm_@pZIicQ@U?q9JY8Di-}0`UoGIn~!M zaJiM4xQnpO17w7VN`v#-?UW>(vY~@6`6*oIR4otb6Ap92j|aI(cw!Qf+X#q`WVQ2` zdm9*P0FI*NX7f`A7`g*@kwL!(WF*J$@I=m{h*joefGIgp@?nz#MgA@g5%R)51b#7gP@Vv&2v6 znh2jsF%y24n5eY8M~bQaSz<2e8k$d~m0Op_0$Lnv3KYCYYv7CEWNY`5w2e=sRQ4_^W_K*I*wY!SOFZf@2gkmEf2Ph`O6@Wu1;A<46McOC9=)?)!m``%Z_( zL5B%>GXM$RfQ}34xaW1;YdY>Qp#N|PegGu;Y9rBD2ze=hggk0M1hfEL z011v;bl(R7Q4Mq}ox1PfI9QTHI$*p8Nc0s(0uo)J(K>D-pjk|p1}KH0X@JPg7{+FR z=(~E1%>bn`lm&=Pk6~;Ei1Ng)6abpZPzfM1P-Iu;0-DOud_c6V+pa7GM9sWiSqx}0 zLzRFoU}y!PG=>lvg%(Z7^-`>Z==VoldjDaiu%0BUsq8`GBjD5nooROyv8=yGr6Gc* zd<(if-W^5u&<}&JJV14k*7|bzWiCMf#^vTcriU0BiFHL0n1KTlW&yKrw{v*%3Ek+j>0d-215Xmvq%GNq|5cLCwJB8>*v}u8Hut4b$?Ty zD_ooqKBF<;R=3x)BhR7w6GDewC7l~Rf(l)>4v)hbOoC;V0jl2>+MJ-&_SXDtuw8sq zC>+(}q6bO>3XO<3&EI~G%gra1f5Z@OJhG)GCDD z`WWRL;Dep!CSPJ?A^$}ipG%W%OB;8?WhT!K+hN9FSlBm>tQoZW zD8H0&QJQ>RtB-Vw((0pq#rSd1PuM4nYK46Ts&B^1q|Wt@&WT!&RxLtzY#4^Kz8U4M z9!C=B`MYUR918F#Qe_FC4{(WGyBrX?I0dIL!F_^DeBa%<-i2IC5GG3A=m)&fH>bH3 za!?`cs3!w1405-hK-`tB6NFU>vJYpQt$NY|PHqi^F!UN*x;(13CIt=E_7jx)TTd$i zpMyy{*K4ET1UAhlG{;$ZA6YaLb2Or#J`T7d#?kOx;AR361-=B(Z1$x&72yj&Sxh%L zEhcS%fV|O*xkuj}ausl8Iz28{_qnS_iZrSWhvSO#HcnNqzKXlyz9* z90r?WN!-8YQEj3pbiCYo%^wir7~_ldmf+tyr^*Uv?xQ&CX*q;Ctoq2Ijk-H##8AxEaKza#7Xv|bKI9moEgO%pcpB*bC9i-t)=T8n zM|48+)Q5S<^e#pY<{{H7z!-gV(UCFp{2_|xc3`@Uq!9Eo)v_5)wxMdCZOk6E*KBKx zuB8*g+33G7T5z#>l#eRpdX`e9;m9-e1N$W;NHi3l>2oTO<#op`x zuIrVKHwbk=(|n>4rb)k}xZKJUxYHL;b~a1hm!Vz2i7v@s0f{D`3X_mRO{d_k*KsX? zgyds7)ECu8;Kl(W73@|#fJ9U710>WZoQD-~Kp#sivyIM#>M!D3rKQUN5tNL1Q9QnE3Rq*sj(z#gmA zQq{nOUGmSX{+LdKK{RLZ3@#^HW9Ja1XqPkV&uZH|9g6{k%S_k)5o?F!#vK%~j%HUd zE_8f+Fh->#W2~`)FDqSi@VlvWFf!7m(vdN%j%G_BO_pp_J7bU}>R`-iq#-5^q0QL^ zPZm&UAhH|gf)*;F@yNH860K-cMg`e?7#R;kT@5?JCAMcqAO&D#nQfMU zA9z@`QJy(lLz~7fD+nEt-ftuzjV}Stu5?$CcEFdc-Pzej4b7Ii*-Y1B#@&Z!fqM+l zQpWAnajk$vYxg}MqjHH#Lv5L;dYb?V+;0I1y4`@@2bWuMp@54jH5ibnAW49hfx@nw ztK&ed&;|%}wb2&Fb7i2uIaP+ld&!p#ez{?zZM87_HL5JU8m(dZ4AqWi(cMke_zEL} zrWw7vcC%F7 z&qciXV;f4jbwB!jA&>2+_8aBoCn`g-=x?cq(c?mMd|f+UL+CNDQjSSWb;v=ok)J%M zn;e{gG>x5ug{rl2Zt@^xA*z-e70*Lr8;)#ysEy{rML0MjZKOsc+vLG*j{t)pcjnlP zX%lNx-oZ7-yYsgqvLdK&u)Ds?~670u|(wRK;p>>w2h)m@>YSxY$!*}jr$ zjJ_P9HzTj&#j#RaHX|pkE4*+OSy!-PrJhA~glkO0yEF}i`YKI?BY`56@k!_O5p9Ud zu!RoyDp4&SIs8FieDRYk z0%>>Z7T9^9FWQO_aH9Qq6i_1jQY&;iLk9r~I`R>8G@nAV%yyn9A)9D+ES?0KLZ$b^C<8bU>n`m=8!uzDkF#2P9g**LB?cfCR^N+pr2R@&0UF>a~dGga%KS%yek0-d0PNcSJ$p= z*XdM1qyp{AjXLg59e1yedjQZ_rh5nw8F#cRj{%~Qm|b}i(D@7{#-Vj)h~~Y>yntOv z0z|zxjDZ22$}*{*7Gdtp7^t#)19so5$ze8$2KmUPgAz+$EgiihdDU);eOGqoYn z9SG|A`NG2~XrZ61&TFgDN!|WEO?q!T6H8s{%N3(9!vP%V4>~kWCcE0K$+{UzpQ+Vp7?I)PpbAVRVVV4d8;LrZ)*P`?y(QIEa zVveL0y=IhDeUwBqByzP~Z{F4;SSRbfBVS^S?PHA*V2~Y4n_IXIaNg29TcobcER>PM z+Munw;2c75e|B(Av1lr0yj+2iok)-EKcZm8JFjWLi$uSp`BQY$Y}UhVmGHqCJ}0)y zpzn$tA0=qZ^E|{l%jm#hNP{NVg%y|4=rO&@6AiLMgQI__ck(7kOx~t}3oXW`$wc~D zBeAIRI|ES?rFJ7AQ5vrS6hsz7-vR2tWaB0xq^=HQ8(wvC3Oz!i#)+bJze?NGPQP!}nrrO<;*G{UB@dLIIZD8N%YgXZ9Y z8{vzmMQ_BZP~Rj}DE6;(uNT9Ml+X_s1}~!*>nWj)yEk?7rg$U;Q96I#dq{Qr@G@4w zKU^5N9=+4VVDAbT{Ny5Ck-Dp)qkIvJ1RE1+^F*>5DXWg{@LrnICj$1d4k%oDBC(}x;^N&%=M6RsHaM4}f@_%!t zJGyr{5TUgq_;x-LQk418z==8SNr1#OSQa2rujT^EXO2sB-=%=W9C@{l3jm_wrCqri zcOmaO-S;*?HkNXi4*gn(?$aRvY)XZGxskvx?Wv(&f%{&<^8A5o4z)x{WjF!E#o0=> z!sW?qG{{P5I8eJ}UK8fJ$F!G<@twM9Mq{=Zp!zTd<2rht+{NXmfu|TY!Kl8d2jN=o zBfu0kR#<$te6@eJ9HnA!Qp165kCrcjCQYo+PM{0nfJ2k2e1jS@(Mvu9km$jl14#5> zR|67dj#A_&TyC~$FUs7*cs9!1AMu2)63U#5GEn&*SGMs!zvtAPr<_xhv=$ZxlFq47*h)guiX}D7v}VcL z%ac}DudS+4va6KM^OchI%D6GgnkB2T|8h-LWs)>oAT~fMWE}$UQ-W)kRj;kCSpfoi zE#xMRs)6x?Ks6qg1XyCyIhCUovg=R@;{ys!~}~T~kBk=WRJp znK#!rZdwu>fDmz6vSE3ZL9z8bMH2#36HC@tMG!>Nrx0au+q{Qivj{oWdR+i9oI{d&mnTzhRd z-DLZr|D+$z9{-0G-tqsb`|Aj`|H99wJsiIN@s`P1PyBXr+?J15S3LcXf^mbB2MkR6 z>4n*QW`&!_ee{RT+poX!VSBG#r}gQ3WX-J~-}l9f4+c{HXXn0k!^i&iOGn=Pi~l_C zvv~vm`ND+w1DpRgu20R(j@$nE*3BQhls~w1=GeNO)t9Q(Qyx3<<(FM*L{0+QSuLyEWeoe*OFgcu=UAbSyH~4F=4#kaK!F`Dt$JShR z`lGLnbhSS+{^o0M%N{#&%Oin-*S--P_|k=$S8sgng)P1QI%k+?eDJ+#i|5Wwe&*i2 z-_N`Iya*jV`_`M}1pWm|WObM@yu(kgyK!92ldFb3QtmnX z)p`H^cfUVmzWc8}Kd4s?^5#7H?Xp3(hYr4;dHuP&uKudx-oB&SM%}*t)ic^(zN|9t z`onK-Up4LAHAlYK`oNk8pW1M9Rs7}0Tdux)R^xvXDnoy5xZ;1V$jofJwk6!ZYH(&nd?T2R! z9Mbgn0asuC$#<^wySG`3kMvvhmo3xxwdSmPt+>fn-kDpGnS0v6|J45Kl44i@37^}{N?`1Prb9~(Aaxk zd;HF%yoZxg`exi-m3YsHo5OQI+%R9Ap*H)dwPELhZdpIRx^l@CHcKalQ&z>ZtZGSM z{KSbjS}b)EvvJ+(@oOr%c@UULixX&L(7;WQ@{Av8N0GZs)Ua4B)L@xiqy-6#=|OV~ z?xeEKjubmNrZL%}A|Jzs(wF-)cNxvt0Ahh78nZ#W{CsMKvuG=LS(U`etO51qX&RKu;7+jA@ zE}}7W(ImOmLSZ16eENfEm9;e7Es*@_hncG%e2g^w{D;@jwrgC6Bp1<`x%x8~l^Jr^ z&A1l@P~$o-kg!|WmCFf?VJYkCots}UxM)q19MPEHMFVdm4L|?-jz1e*BP18mn7OEg z8flm|_vv{C*9DS`Xv|!qOR3d~4<9>wpTSikxroNhHHhD(rAGCwSCt!FRg#Nn%v^5f z(#qk{-~HwtgX;>(MKorv(@b28p4j-I!F99bA{sN-VCJHFN6zx@Z~O+=Lz0VV%v?i& zG0H~9(08sexLPC^(U`dsnTu*Gxf^%>1QM-myf3+k#>{m(Fh(xF?@su&!S%J|A{sLn zbw-U6_1N@&XB%97`@a}8rIt!$WW%1x78L}TVU)AX*b zGZ*-bcg>buL}TVU%fyvjcV?EswOVo!jhSn>i7RjJ?Gd?rjpQO4Ggp#{>yv)hq#5t} zjpQO4GZzv%BIWy5MV9#&B^S|{xki|{KHE2Oo$;>yl8b1}Tq8|fvtF79RVRrRn(QV= zG-j@3V2lzqJMdV6!PQ$bj<5sjJaT;?K8PHyJa=T9-X z{E~}k%v|RIW3)uKzx+L#I_+K6l8b1}T%(vv3*pU=+=v+^jcbSGA{uZ-SRWb9T)DVY zWlF2PZK;4FZ8D$FG^9(3hTLdwt0U!%0oH1H5O=BxQ~JHQB3jN^riqj@CQ8mYrn!Xf zxPJ5ZD{hRIGd@brxF|UjnC5r5Q@eiFU!MCzw48}iawbH{nZz_<+$mmt``v+jr&Nec zpA@EvjMt-nQ3TiER>V-?equdN6SGW>mp}z zl$@zdL-|e``KbQ@M(ADRH7!cc)F?R=3af>*J#qV&mLM^@%DEs)&h#ibG-YMAY@j=? z)f4Z8kgjrOM9E2yl5-)`Q0$2N-p*miqvgzul5=5{98@`k=W@E^daq9o3RKtdc$g+K zzh*_r$zU4l8xXg1!-sc9%gKzAlMyAy%QTB|r}7-wYV$VFnk#bT~|3dQF8oIa;OAaEwo5RrR2R}UNBk? z)f#iWa--zrGYu{2^aj*7XHl5%qcCx#`c3Z|6onZcg&7@%Nt2kViWcTs5;IH36iH0FjwzRz z3w2Dj#7x&QmrG2Bj-h3Ba$X%ni|WE@Z>P^j%$O&lFfU3>D&)ZWea(`MRgz~mW9Xq( z(#+E_Z%ND~9dl4(M(da(5;I1}d@nJ69pivrAU8+H43wB`9Yag{JIahMIoY)h?z08D3n+DAJPdl4GNZhVpc) z2}3cZMPi*RWg;-D2}9{~lLz`&2j4TKSr>Gjm3G%%E6>mxB! z2vdf*>oi;k-!fq+FX9nXgNC?@A~BpA51TMVlYqGETxk^3IVKE+@D3A(a`{jshELWw zZo-hnRY)IQ@)Y8_G7>W>1%VzX(?_I63Np;VfI(5=uQ~Hb^J1W_meZx@0}tM#DzXiR zev({7W9FjTYs?z;`~B)VgKLlEA{sLnx&;wjwpAAg46Y9)7txrx7BZIucXAiJTm6W^ z^@HRh8Z*}-V2lt3_H0{WaGg!VBsiimbCm;Qwe%%VxG70bN4)Do$wf3~t_om`G(6{? z3ozM(0>W;o}`a(j4@Br?-$=6 zG`I$Ew^C7v#>};hxwNwJYV~8^7+mK|E}}7WEoZLLxRc9n38Ij}w4G-j@q%rzKya-YvAeBa>OFS&@u z%(V&_<6WJ;B&d7sU3QsBL}TV!&0LxWi2LFn9)oL)vUwAFQ?F3l9^lLA?r~(dWttA!&{W?Wo-2_ z9iN()nOER1@fCPrWlG0RF32b;E-LVQ*zA;!PR%RM$<8eC`8?PNp<}1z_dS(&-M zoJ^0fl%-QoDJUxTvQ=^kl0#W^KK#l=}3vZiIA3yL%HGPCl5-VijBd$KRD zFsnGXu*ky}w{-H!5RjRjpX>Lq4K5v@;>|3`Ldq7==@XL-bXJ}}KRX*oHkeLXhB2?n znw?eb*SHFeclk?li%WbNbi@O{tJv@=EH22)E%JJ1rOry#v6H<(58hQtArm7)cHsqBGfa49sl1gWaLA^`#ikKZPsM$a+7hOeQt;eZFJM=Q~bq#Uy0wF?a4N@S&BC| ztGF=Nm*?3$-=NIS$|}mq%rEeitdBtYeFYiCS*VKB5vl^+BQw+E^%WLn7eTVVkq$xT z1Aug@DY;&MUV$&S&?5?g?lIM$=Z6OHWzmip+HI%%c=J5ol8l^!!psclT5SiO$RL>* z{FAF~#hW#GiNT#&;K|7?_GM*emUtqz<;|MR`|^w?Z?$p4`j~6raKZQ?hhPS7^i>e_?JO^3pgANE54V64XPQS?tNm zEGj6)$aHbqU#FBR(_|F5)>yplP5_#W% z#ySiHaIxe~g-1WoWMNE7?qu=Z2%4)UT`YMSkZ}WO-in}$m3{|6(;h+BoppQ~Cw?bs zD178%$+Ke!Fjx))VukN|;s?#65p=QSJqwz>5p>;!?(B%Hd6iyT$o zSn}RXQj~+Z$iHgQt*3)$!k; zahxlp(R*Xb8wi>a5p>NUZqYKN@tn$iiuQzPkOg>O1!Yz58E2)bC|+Xb38Bj~y-FJwmW zebCGw&%sj$<0qE9G<0IJs3QXxD|{Q^R|J|}l8&aLV##w&gdZ+)vE+r|cRpwymUJg; zk6s7Ofm6sM?@w_%Z4$jzyf;?(hJ$881YLLONBU~Iq+x-$#gbP7y2YoER|5W(pm{EW zE|$DkK=V!nU3cNjg1mo%W<-hz9i?+Dd1FB{BZ96wd6$6S2by0?x|5aXw?XsKDdhbV z@;(R6Yow^*PF8>a37Rh?U99p#&Cqd4!vb-O72ly)q#8pDRdBK7&4(W?A2&(5lj*;` zpn2~U^8OBaAA{yOTH=E1gDY0}&YFUCKV0Nug>NeSrh#T%1YIn7mxCr8LDyaW(i-c{ zpcyiaUwcx0@C|6Jq>$iZh3{VY^#jc#lI~>f@4KM+*D2)1<3&e7bL;|s?Mc&bK{{3w zagmD^zP|7Xf~JlXKitXk;}g()E9qj%8v>7?Ky%v6Q_H&?G+{{>OCA|_y%{v4GlV=h zeq!bCSD>+E3c6VGXl=JIXf7tj0CzHZXJ@0`!bL8YypQ3R4w|!kOvXFdVuf!rXm&`t zSn}4v<0jBpa)i8-)j_hsPD5nLJy_qxL3q{#(9}x0Sn_Uy zm>r-wW7(Cl*ZHT!DG|9__JVZZce5ZjXN7BWTN6pJcl1503E$>dy{oxey zk|E@&9?E+UbZw`QmyUpc1Df&GB6NN56Dxmj0?ltEogUvVrxUus|B$2+5@{X@^VD5V zOQZdWFLa@!%8n`a30c{`jClof3vx3r7=fF&aP9~*vbZ3tD5EfY&WI#PVf*uxtD_Xl z0D5KC1q%aJOP6n0vTPyNDJQ2bTzBcpg&UVnn!0fH@}>WU!_r`O&W7^`LZ7?lkwKAR zWooTUE!(X23i~&!{`uiv;j;OSd2w}z{Hs5{h}oY<#%M`m1m z|GGo*btkMrd-&FC5oFlON@&cqC3s-4(GAlX2`hVP2KmUyV@I~b>8!sUgmW4zW;fQx z@AkzjyZy5jwKQR+(v;~6`x0;ZR^C8>DjYK?5K_3Q89Y~46hE1Ac9G) zkdI8XFM<2`XKX$g?lFGOrfuoNT?bwupt|sGv;zbL}NsH2l+Be=n z3L7q2$u<}sQ&+gk)ZmKNY<}tP?806hp18z7pAum}2Ji34p6J0rU)iI&dI$=6mv%Mh zS%rN~{Dy;-q<$3*wNmK}t`^h;1_Y=ESF2kCD;1M4DJ1lY$GTs5bOzUJfMhJyrIqQz z1W8@6ATjjHM6z+eXhF*e1i{B?L1PyIWdSN=9Q73!F+@F&Vuq;A6FAb20$Ky8oP9R~ zTFg*Lhi(K!T`^(5iEPEVm0tlTcz+K_@IC>kf_-1mq1}Llyf<~|T|l()mxdFVjN?1y zpRi8mhY!vOfW`0xabj0f&HPrcC^TiQ-bx~G^{y8`0r9h%es+5ctt?EnH`OdIEenV0 zfDMQ0`Mv}9))3Vfa*{3_x&aU2&@Ftw4fiJRX3h4NH^J(4%qiRLEwZ$FIjmu?Fi;bE zC5cWImVkS=b5Kyg-qZ&sWl|?M?!xK5!(Y4YqS)*d3(!!*?-$iERLz_1%&U!Mk zh@wko^3+W(wUm^DZ?ozn3R;U4JhoXYy*1AK9efB_Sv?nCT z&mi6KOQ{=Nnr=vhZg4?22zzL309NRRTM?ed^4X2s;&=O@8hlURfBwWvCs?953Cxt#qTJet!oC&T$_VWa)4!8PL+nQV2%j|zJe6R zCInb0iq8QFMe#Ktp(tEPKcOfF12Pl^t@hbKWl?Ob>Q~}9USTVEb=xjdf@x}TlG=QG z=p(E3<>uqPru&C&JsZzsUM^KPCA@W<4tx^XPbX5m;uy2r;&+u-v`m1=42Tl>oPj5D z+QEPH`8!*bqGJyn>6V~PRl=4QBH=(VDLpC58YZ0$x`YOtB2@u)5y0 z?^Ej+>EG2{(pc2HquCRfrk1*3(smLuxbc#>WakW9a7af>Vj$@v1a%k}aZn-^CQZE;`kOmQ21%Prr zE`*X|M{PCNb{Hum`_HcQ)i57i|7T!v(q3a>{4?~veFv@Cu6YodBx>AoSfy*|4CKKe zSz$s))+C1~FhzAwLM$dk#KKLnILn9yMFEHD$tc9_2A?am+ZFoK5`0Dty2!9(`mvhq z#v%tL%X#Wx$U8ei-b|9`GUR~}B0HL$!9E?n-X2O6kqXB)Jg=@9hL|Kd8>Yi1A8Prc zi(B+J|Cti6{f%=Gv1}xRn>R^|)S;ywBb|=oiPFic^x|Az%vp;BwzYaz0I#%qgdXz< zJ?04rBaMUkf_8PV`cu2B?u0$qE3H>T68nWAE%v5bw?9uuur(KnWqRP{5TM z4gs5NYx1oq5rwa4bxGLK>f=O~m;hrq^(AIKQi7;Bsmf7uZEYkFy-ODA=2KxwyqiC> z5RhN@C0aTAp$8_wfq~An!K9@l{l+@b;2gSM;q3&a-$)IVcqS9G{_V@@!P9)u*1pJKZC@AxmpGsH*_T0` zB&a^ev&3X=Zl9>`!Bg`gTc|k^k7rAI2#XKx8c?FMyW0n#b7?{)sK?TObT*_?-CR(< zs3qDc9$wMCv-Gl}o?(B65&^jxf;c|kihgktCDjjQ8+=9Uvl7PTagI__i7*g~Lf%4}BZb(Bl23%9 zU&vxdt*T}ub_Hn{p&C|N#ILxcok>=YYD#06x*HZ_`+=Pd%(#`)bZ96b>espX>}2Zu zh?i<>FTE6DMfP&|AiQ(YcUSY~H(pYJlRF31eVo{s5tqEHPs@&sIJI}f-r!L+Z!tVu zud0Jwa;;ZU%^}x%71bGXU>yurSOJgb-Yi7N@Nd291|b5{s2-4Oz3MgrD9c(i3mr;p zCdXg_*G5wQ!FA(&Tqd_d~5|#n!emi72$LeL@8qe7~mS zO1kkPjn@_5D@np6$~d_zTBu73)k)Zh zc!>1s!Tr>_kvem4BV~oH(R~b!25t%tqUdl%a5wSmDM)8fhFiufGb_OYam=G9aOPCjv55?+iSV(^T&k4hQuY z96aoH*KI58wP}c2qw6oda{&Ft0ThT8b&w)KQbYoLW_UyUZ0FA6Imec}o- zk)>O68>+sp9&T>4qD8j8p59iIA`fy@ixM~utwoMwhtM@DZvHn??9F5EUnGKyaWM7C zsUb%v$?8L^;=*)+*4PN;Cdv`=i!}v;mZmYg!)xidBjyj)CMZqi4t1@IPVb@fL2ApL zJ8Mh${c2xpQNpoL`R(5~f7YwXHX(h_#!M>h$wF!ojfSm#-}=(}V`=(dYc&0XqrQds zu+J?Om4U)L)T^mC+jI}z@lF?pAA>u0QZDMJDJHa9@u+m}q_($n<6;qbOs{R++_ZMH z%(jKe(?pSLVu9S$cJ8bLM^o+mGTE6#Xg%st48Z1hK1N-I(h|XgPC0Tti_FyntEk(_ zGrXNbfg_CgNsVv1e6i@N(*#OM=i}5nD4Q(>90f9&&L*7E`51K;A|w~6+X)liPQh30 z>Q~{b=^00HT}>juI1O{A^JEa^4?;Ab6CS}*dsEtXm-~2M5>g#`uB9?n6QKoYlqRYP zb+1I-r(wLP`zry7YC?l~QL*j@BslH|M62p^vXK|mXH zh^WPTZv%80F1PZS4t=FV)WsIQbnu6OG67M`?p9U+GAcB!ol$A%C8r5%K_j}h&Yd`j zX4em)<7aOgVQ%=FGKRG@WjJsp<0`@BYDwMI(%r!@kjxG(VVo^4wzCWZ*)Q;JyK)Ag zUotce(5(!SR;4)O7+FAfGL!}Ac7}2Q-N8@+pt~3XplqNU91!eC)5s}MjN_degszs9vB+yKcuj#0;m%dYXJQvL(a;rfhL= zFYPK0Itnp$ThD6Durg` zrb;av`=CKc{ysq{`nt_UO7H}=3XM5fb4jG>)>fWaZK2_e5y+A*@4V1>Cp9UUt-~@- zV>8}h54h#jN0Dq{N>}g_Pitc{CTx@A%Mpm)b%%be+Z%`HmeV2GXltnSkn1H6W1Xod zusFa2Iv=e=QTm=hdgz2DI4)+_LAEP654P3ES%tBh)*9Fmu0U8=6x$~O0->~Xu2Dxylwc$U`lMy*7R)-vd7KR|g9_P~NK>3U0e5)p zHfO^_fI6Rk5_e2c%ksgqpwy0Q%V6hH%U!I`br;2{{)OqggT+Rn4f_|id(xk-0~01p z?BQz&N`IP^x_Bli{b^F~;+dfIr>O}N&jhK(^P9@%r~f6;N9FMrUeN(ry;T3=usytK zaa~cIN1Og1!zn;IRcKNGyktecR;4c~EFP4zrs86&mbhp<`bvV0MzfZ1=6p5t%CIGz zcO@6)k;DO~m3^AD)`sE8YV;Vc^?FHZk#V3skvNifL96-D@e$H znw%7wNbg|8dq9?o3BD9~lmuadni5NgX9uW|^JPVMh8Pu){ zXr2yHYcCY!gMdWxQppx{FX#}}1W~K@0ur?ffbw^`!S&)PD3ni5RGL2IMKQIdRK3g< zI_RVY33-4WR)EkEgu2=>-?k$sPA!^`eyndkde5Xx#&aH$$f=R@x(;$LX*GFOP3OGqi29 zf(a>FE$X+jk5)h&?KXHjkZ_!coO+4Q`d6`H#jPj;c}hoJwR)tjU8x2nnwhI~NCi{~ zUpJqnBUWJl2;4%(?E)kU(p!K;5&aTS9sAORxPS)e(3yZ}WeOAdxK}f@8277j*;&Fh z43ROWCWc5i>|kg;?qP;#Ub~SYD!eK~)b+cTA$n&6LkJ4TjegO6G|YHBNk z&}*}mKsAk(0^35hZY6j*8nwBNMe}erNNqy%!Cs*~7VhO7$Bew2`##S@g0k=9=63Xb z_P579&wZZ*VvT$Ztuv+nfF4gRdOYoX?{74AG;^%B-hK?{fl!}E^KkH#a;Xr34g#p= z;vJ#`v<{Hy08yJE>Ngce>W8}Vi=A)5%>Z_Xw6@!IpN>qdqRmsq&W1vx zF>KFR7OJ%?!I2mrVsPb>)le_B)b05U3oE|3_91dCwFk+jdMnW!)l||TSe=3(Hxwdi zvE%}6607HIvGlUQ*tq5t4bXorX^7cWCZPXex_1CQ z$k2X34>0r(K=(6r5YX=#0-(eLB4?57>{M51ISd6Yflo{=Eo*ww1*AHaa)Y!Ba)UGD z4#1I_(a6trxN90uPxAK5PMR5WWM|p;lX{ z-QsM>LT1F)DyPl}8ll|H$>jxf4?|l3iHx{YhaLkYGJ=x-S4>CA{~LxV`R`@uAfR6} z^a-HfG6X>B3y7RW>BrTB)R&w*qxorf`Y~ty9{5xJa3Kr0t88^PP@7rzRXj?3M{|<1 z{{Kd%=rtflrs)3NWJ+B8Vxg%B@57-`rp@%97LK{Kz==$uLAiil z03X+Hakz{Q}^4hd=6Y3Lq`EQ7y_VB>rD>pL%^Za%bCLK_X(+QmtiNF zL)}{0(CMt73jaCsw57V@xFo&J#rB2lN-^I~LvH6a$05V4v&uxN#vlqCl^ks}1&ek# zLIvriK6O{>fo17_d(C-Gn-Z}r!4nv$+PiMVqRDeFmiyE9U-^$lzcF_=QiMq@q)`=K z=0aWBx}t7*Tq|*S+LqwG+8mxgj&MZeX`=+}5=5HCZY;K^9;n|N7}vCkHb`_E6wr8` zJDWvd-Y0Q*^0Xa8Qg)F@xq`r|n}*RCbCbPpYa#j!YW9k-KUszntLsqcmbPa>n!YKa zCMnii>2;eDHXKwdk{S*K5^w16(iXNkdMc_5Tv(!S!z+3Pi&TGNXje)4(V8=`W>gQ+ z*cjz=D3GD~Z1{5ewo$>f(6%H6=OZ`V1qx0*|ETbb{NPW-uAS!NHc$K6bz9NZF;+?- z0$xPT-n~+Hp}1JzM7eRH&@}AB35VqiD%6*0)5LIocg!0mTI@D^Y!`PfSVdW8KR>J{=(3DKyNXG04Vff4jypz=HAaDJji}G zZPci#EXANw+lWCsguJL?)GZKI>;TBkRZL$a7xOeRT6k2iBg@i#_L|X6wTa7a=a2;Q&2+;cOD?<&d{r`Bq3GecWjE~hqaL-oG!*L5#!dPg7M48{NL%#(ic>fMa)E5i*1lpXly(WS|}_R3~9VDlstE5V-NB@)prc zJ6BYwL0nV%(Lh^YKQ{UVVl>lES&8s5AXH!eIr; zO9|_2c$yw-G1_-{ob|t_hgprqqN`2s5q$`;6)EPprjTq3YE!Yzr-9~SrkjELV+?t4f0Ust+#g|x+O@|S0xJ(z z@qjvH26A(YE=|{E{n&NVF_;}{Vr_J2x9sdM+OQ90~l@d-fRvj&Ip}HBZZ{YBPwr?c1&NLob0@A z5`57!y}{Tl{omLn?bdcl55uyY+t?+Il93QDNFD{9fv+g2+{WH1ZBcWvDuK!EvHTr{ zhrgrX&C!Snr_;^AmD|l0BXGP6cMt0MAXE*{LuE9q6gr)T8ag z(s`2=X5Ag(#v33Tzx`Dwy72MpaaA%0-=JX?JoO@iRS+~3VyapeX0b|Lln{HN+#yyq zCg|}Y-AYa?a5QNJX}oWW#c7)sXaj@#HMTDN%v}pDnUHS0kGieov}y8n{5~-$p)SH0 z!Yd|M#{jQQu7LQ>l z)Dh8WZ15`8#x>YxeY~lNce2gaRBZw#S=Iamwbh#M295n~Ifj zCKOGynh^Sf1EGjd-Nm88Wb2SR>N*Wr*++Y)W7Vz{c!J8oy{4Y+0Hta0(@=8609z;~ zsy+g`43JPvn*a&LL^C1O?QknJBjIO=T2nE-`XQh?#(k|rRy+%w3s4pNPQ;yRi(4V( zJcL6~0EoIpcHY!|7DID^JDnlwXq~|jy?rP{ivdyhNleY2$-8r-o!EbCs(G-u! zc738fY9d}NuxNWwG%j~|9q&JB8H7+@fzY~@5rAk~*o}|zv=pBOXfxxe$q+SaJ0Ot@ z*8>t9)DxsyCG-_l9df+;j7autnm_%ed z>qw|}9Jp3X9Bq{G-E9cdC=%KZfe+&JO@;c2izcN3P#?-b} z$Me4Gc89u0Y^lcHYHPExi#nlwnUsSNblqT`kB+W+gLV6~MxU+j(0}Uo+As$gqK_30J51G+B*iXimC!(!lep>yB6SQHc=p>zLID_!(?$o;vy`cR!QrXT&hqN;^ z8#tP`aVyIKO=gJZ0>&|Poet3yufRP8h;Pj+6q`wv4@K)+{*3g}M^-G=**4BdtM35I@+`*DWu!yV-o zQXT;G1LGdT-J-Wr`-lQAPOgw$hUbX!C-uJ))ok>KathS9LWdGVUnipP?WPZ$rw@15 zp9^wy{L>dASDF&>fL!v$)xYelKMtW?RrV3!x|DO#hrmiY?VY1p%(gus>ZZK6-OS9o z!fv}tKJ&*eo8=N=q@Zmeh(@=s(n@yZ_b=1T-@lBOe7btpgE zCa>PfyVRfXUAQmK8=9p!8~#cCe&~xN%(wRnC#LS29`DRLj?znC^HHwd%# zY2AM@L|XS#hU#!X#85r%2N@!*dzc~8x*sz{g}RL)1Vwoo5dIaL{BnFL9^?lF*ja@1 zJD~GoJ8(x+|9IDmiQ-Sg8jZ3+?ro3wj>}cniMCZrbYN;T+HF{DII@wf5$2 zJfRq4;#$n>(4HT29W<6u11DWVEtN~CMUm<5h_PTNw$~y4#^hYPwu+i(nwUdmyoiMx z)3|5{()T;Boy_a0a>^OOjdrJ=(xHzY{)j}g^EqZuFho%oql<@i=w(2;@O3NS0(z3^ zNOe&`v@6u_+{qB-##0PYMR`Wx;7j8}a@e!az5I*uEXLs?v(#)_Wpne8uz!i%bV#v9 z$`tbImb3mn@N*vOodwYmrcuuS53|uGvvF!BYy@cFb}Q zRc&HDbzn&uHo1=_da1-5SP~2!u>|*Fe`YdipoSyP`U^o2x-xl`;;erNq)n^WD9xW* zZ&1Ci#)45to6<%#`o2o`@R!r|y8^R!`@ZVio)738we&bX^gW9{y1rCw`1N+Yf(^eH zi2+|@5%wTE>JE9Z7Bp1#9p)n1U6_s}h7c4>u&Ip(K+c`7fJc0}{wl&xDXT!leoe$* zfuw|2+FwoGMW30=_}93sM;m>;@u9a7+7kN8yFE{YmOh-13~i-3v<^MAXUGNVZURfK zY-m>^y_OQPkrEO+9F<_ETD(Ht9nK#Xu2@mGG!8vS@g+oLbnc6Y&QAG`NA%d-hfHu| z_Cxir4}0-lWw>H}q#*bvvTs281|oeMy~ZN>a4`r)fOs!0rFoEQv{eLBb=YQbur>&o|2!IDrr5)<>PZ-#0+-kn%K z*8Q$LNR-2BlT_a{)%HvbvSC*qREv^Q4>atpJr6CiFGsb-cSi~$Z>TjP{ks6Lm+ z>KkVDB_O}8%?nzF=_%#YAsV5IG`mBGs1q-607Uh~Z!aZ*yAJb>G;^^{1x(4oyaHQR zK+zL+9=PYcA6bkI0;5wqmfe7+KxhD@nYN=sn|tA!-);#WAlnJhGU?ycGQoA`F1r+TJXw+WX2a8s*+$_zLv~kX;R~-@QCB5ugT8j09Y>X; z#VB${QqjmqB#W^t=^5aR;`Je($Y~vyd7M z89t1*VFw4JxfrPWS3`q@D^`>KXzNRn^RHkGYl*fK9E+fj>3)8L{Xh5b}e19Q96L6LYp)U)=u(KETP27 zWJw?BZdo`1{oKO&-G-+kHRBMoW|Vrdy^o<0LtEUi2NYi(?5}zqsc&Nh)nqI2T-?&= zp#A_FS;xMQbmSOdsDI{G(EiGDy9&_xjN76^f7gAj@Db&ksyL}eH*c&Js+W3#!uLBJ zB69%(M`zd?^?>Z`fe7`$F$h1r&@bjY6L{leDdMfxXnQC0ok-r~@FLD;>_m#kP9&;` z=`{&8=ZZ$OOGVc;E^SAu!S)I4?oWa(mmwW~+CL%J2~g_PZP*MXwj)&py{K7YKhgkg z8kJ;9rhwAoZ_P>uAYX+V)CG>b2w zw*aMadIC`XMK?HXJ?7L|03W&am~;g8MRmJ3ZH~Sb`bNtclfF4FtP0&kwV1ck3_)2LqF(>kjy)ed^=0(nRrXVXw>2D}_rm>eZ5}assp-8ToBMaX=TKx?&A@+s(B&IZ9O&># ze}C7Zz+GE|PwYFDd-nK*;)9=PUP@&iK}zanF+8v!;Kg^?7T> z#jQ=@VReEqX=nLhp5-v1$= z=emqKc3N|9`6uhoct3R6=kWYlZ##6A?H()eIkK%68^xWd`ysEcH_xw~pa8~NQd%xZK)1<%pTwXKw=kuSHfBfki z0}f5Ne){Bu4`2TBt@bs8FMYD-+P<}hL0_Kn`Qg_I6W@BOzSqP@J{tboy!V%FIwCAu z7PEeOepvU;y)9vDOUG25z3a#`DKF+Z=4D4%zdiIy(}u+1i9NU7>6;we?e-rAmdCeG zpK{DH>{iy*BUaG-3BA;~v>JV(vG0j(ojz z&Vk=@*AGp4tYTc^zx4f%O?h$eJ5d>lAB(BKT%9=WzFs{;Q}3JjVEcP3XFoRoq3u?` zZD;C^`mPT<_t_hpPXGQ{(Vl01TiEG~p^uh5^L($Z{bTC$&kz6hr2)%cemif-nGd>T z^t>MQe)Yefdt&_gB_C~ibjvWG!8_khU;50coX2-{7&@ZrkdXY=m#4a|%=~m;(1F44 zb+BxFTHp7#Yt`Qhw}t=YlVuq^Xu%obofVF~XSGSIt;PLEx0`n5j)xz8YQT)2lH0wo zeBOh9b^mLz-+f;`bmmW+*ZW&@zg?C0z`gN(rhN9#)syNPf5_-^@ycVHmxsT5^2drN zCdZC#t~~f+!Nhy-(obu6^K9I|zWp%x;Dlj2gPyuDC?-t%R@m-c#djOCf_Kd!|{QAO~C&$#>b#iQYpI28_&Al%_;`do^ zez)D4dMtg^Birp0yexH3^sak$+_fJIf1OsjVo*`+rq4e-w`|UYdwhiReq{msUs*r) zvFCSPcxu-??ZvFs7rK{!P+j)Q9Z!uNwYgV^Q;*%X?CGYW`Xz%xCvLyiv*07+%8$A} z*)C`F^xhYritaMY=g%$|UmTnI-LHKv_I&-_XM(rf7h9eF?c?KTe={k%&&fH*o;W*v z<@2*rGjbk2|7}`bZF0B8pWAPHC%EAuW05w#Zntg2&Ji0DI-bAQIbv}8`Kx;+j@@}~ zYDeEo_xS^u_t_^&&}S@WPUE)Z$Q=3 zW6|p$y3knKr>8zSJ-hVTH=g|Flk>y=UinDGABBlKzkZ?S z=R5Zdn)!v_f7TrucgFOO7s}+;N1%NMONSTaX0Om`nwx35zcoKE+crEn_%4lRog`UW zQZ#&VE^Df|#B~=sRDV#jI)bW3H#0mpZ+^uB|8x>keW}&h-0suGa2KtCV$t#Y0WFRuh0TnIp5`3{mrR z#~pVbvx=t&!%z&6*|YGwX=#L&f9EFc~;gnHhgEaFv>eW+=Jy_^Np54MD4+ z4{sFD-A}JdR`bwEiaSql6%P$eX*E-Dru=-R_;q|*CPvrtMW3(SdHhs7{TN2>G7n#6 zxvu8vuj1*a;;}GH1iV10``xkS_?p_%KLb=e78TDxhM^Q8*9TEB)I7JScm}F?{22zB zhQ-fqyKFzGc?PL?{8c=I8Ri9?$^89U+FUiy5ZrN(=fNr-%E^3>cM8|mTLer1Xc<4Z zs(1oaJT&i7tD%%7Q#WsrhIs&Is$riFpSwxTGfc%3q~aOQFfvKzY`2T7l3qo+DH|lTr6A z*Zx>G!?^OyQ}N7a7@7x7@f`i{eXpo_a#TF?RXix(2-iZKDgTUpjrPxL>7P6mPp*n5 zpJ8UeX*<}C{qhR3bxWQFDxQ255BY@q2Nq%4fZy;k(UPY?#j{YwgX96vP@Kti^`iBA z)I5t+JcTNrB8H(_h(s$H6B`Tg`6;CO{?7~@( z{nb2ZLJ)S>{8Ospp_W~%p-C*%7V7U@dtJ>_uHq?E@z@xKW_zOI5gt1b^0Jzz zLd9cK@hoMS1K{ZfTX?P4*J_?h70*%?&oYKdz!_A+%D1~5R`V=Z@hnsEtY8>oBc2zB zULB+6S*hY#q2gJ^F!Z&M%ISL%*Wid4UCTSF+7{`xO2xB=VWz-oN7$-AvYt`%pb2Tg zvqr_Uj$x>O=mT3rWNw3+XT6GNor>oUhPi|@mG?ic+9K3Eb`{SZDxM7t^SQ)x<#^8@ z)I1wiJR4LzcQOop9W}uAWMc5EYMxCho;y`Mn;GUCI^#GtZ_7(+9*2r&vx=vRVeXcA zhIgwvq2>`)JXI>5EevxOX9P`XYMlCToAG3o+sbklmXQZwEG%ZQ zLnpsDOdZ6p2NWq$v`bo=ql7kxY;zF^VKrk|ZdS zTuBnANa&j#H*&b{P)Y7lNuE$io>xhz#Ue9Lu%LuyW!p*?7vwOBH7ECrR#9B-M zzbr2goAXiFhbx$I5@x9)iIF5L6vgaW=Rr%MUo>)1~W-kenn9c zayj{El!93-VG0$=N=Z`6UBN}UEswgqLYRWtEMY8)+Nk-$UgY+!MJQ5vDp|_iao;=h|LXW3e5DN1s@?s5+c{rG#M-gU^tAvQz21fJn z&z}_xTP_Z#g#1ixm{UUGqL$n#A!c+xTqL7#m4*W^jRJc*3p@Eqkx=pYVKI-FWyb6b1^IxU#Uvs0FzS=e#KHU%Lh<~8tAwRjyd>c~6n2VH za>XU&p$%>l^3aQ}5_&M(ph`TMDGp6 z?1=EFil7o@0Qa63%?c@}Zxrgd7RC;2?}M4(WM{gvH@>R|$(l8d*^=EDq^iP?4~Z-tQ`5 zA${6SLLt5ACZQ)&*cBd@$EXfhBq4;k7m}s;XW?QcrN~t>k}x!;MHm(?#FYCZWL7+k*0RmKOeQ5?&cYLuHFFJY1AIGz#dH5H-C|J0%oSYCWA23h7}t35E1M zHwlIG3s(sXDfJu_9v0F;t`Zh5n)|3=l-l?vh?o@#YZ=oei8CKkND0FwCW`BxJl^ok&481zSh0C!$)ag5qkW1 zuvU;pQlPX5o0IJ^YcJ=yPrM601)+1o_3`JFHK~d#=s4*wsFNIlb1=&1CkHmnGR3XBQQf^deZ2abzNmKWsV-G-=RvPwxL*~=G};Z?ibmYuVRN#e39*vofC z>C$YDiDQo_Ei18=Fhq1#e!()?hBs02+x)`399y|0WbYRAr0A@&ieg(q5!h{cvI~0i z$&oIK^D5;4M`z8?E-Nd@E90S5F6YBzvM6U^Ue2QYg5vC=f)#l@c+puo3$u$CR1!I_!D(ss0wgSjNyt(zS=P!a zDTc=vAj?a>l*2oJIikpU!2*R#8qtt)9E)ZizszbYDJq}@V~L-Rlm(oHVw9W{gsj{W z8?pv_GICsYeqN<~uZ*6B8~Byx73We)$oYpJTTq;fR7X;l=apucAuzU*`FSj@*yBn| z3Ml14QBqchM3JuH5@oP7yP_QaVxAmD0|(qnuk~4#3kz&{JP?voIiVFUS-`zfP`(fj zbCx4h2wBTZDvB4l<^w*gH;PfSyy&#iTRZt?aY1oO8Lt+o`~g7k^oW|gqCD9v%&WX~ zmLn#Lkl`?z5D}3TZOsafinOLgrzOWtNlLcT?Ei?-&guVFVZ@l=V2g_xIc9X|sB!p> zbP>WjGB|k5m@yX1*wJG``JH(kk~BkvZkryS|Ie<_XeCvXt}|{)Gy+GEw{%nf>tK?< z3sE!7j1A}6EpS%B6y-XHmViBRoCfY235zOUu$a>3xqfFNoC!xGVSMO{kGWe-YQ8$$ z>j2Ct3D*JFp7=)U(Z=8)L(grEZxL=x0cL-D24i2bJn{MCVWIRu7>|6oHwl<$U2vZG zUIB(}NqPf5`WABvxS1VcfuZ1d;@b_(K?&!{f0N<);n#sib+ zf@_WMZn&Qg%r`DLPkfDp>5K!$Q~Z_TUI$=SNjS=ep7_oI^UY28dc%FAgn^YAPkbGW z7}>)?#*_ataL*r@6)reWd>eqd*9F&F{FQ=l2QZzfz{A`qJ$!))aKW|4mkN$iz^r${ zdGenK%p)$i*7&HS{4_8hOE@jAJ@Nexj87K;V3hcCS$RNmDi2*G3|*74nu4vaJzkOp z;po-|TsPn%+JGAZ+_ctkISUt+kD*Xy$`sYx*@k;$>?11;3={u#$Y976>SBa9h8$Cj6a<~4r~`k0BuJl?I|9t>}<{V6iIB9?&jUq%y0ZKfaf9{sh8Yz3 zim;))Dw-m`Xt&Y0@dNNQ%!l?3u`WHZ777t&WGLz=(h>bZvNMYQ@mQj4DiqSCB#>`W z67;nHeH|)+FE#XF@h{)fi%_Le=ZJ&iG(RnA)q+L=G1Xk1X%f908nFY`%X&j8vLn(g zrs~B=o!HCK+YtqIK#`<&84Ix;nfl$n6@J*@D4wed@51)Y=$M`xl75$6Z!~jJfS~^jVJWyuR=;4VPB1wV^heRRc4(n!-(u@>6^gZO9n+MJ z%M7HS6MAuU;Z3WK+)gUAY4C}ssTDS!0bx=0Zd?oiCC@1I28p~0w4vULE+G_e&h&<|n(oyGZ>a34 zkGw{*>dDuz$yLSA$cEi<>3j;MBN;hG=vBx^D4br{0nGB=3}6l>P`#D)AL^}a_^{sU z$AzK%kLBxntCe5*^1m4V=g^9m0sT>&!eVrOsu3Gg*TaWaGB`4u?Zy;N>Ee= zrVMOpc!_`+lCV&5Vv%pnrG9BV4zqA8&hv42vv+d4O+iBg&HX6;o8$DN zR-B^4R@{yhGgP_jH^=#MSe(U?;!n8EaRJqF!Po%cAcdDIS!&IBion8D%+bGA@L`n! z#kX5*RIib=>GY&}9dY1Dqe=i(!BMNX#<9!{ZDv|WqS@i&DI%~t8AzScK*>i&E>M)X zlAd8wr-80riaAh&?Q7B$l@z8!d3<80<>G?xY$5^WV<5Rc;=eIWH@0m z1vgru9ZT#MFY@Z85 zzm2(frhimc#}!#8F84ZL^=0n03(vf&yI%Lh0x7Znw-=GSEaRp!fn^^!Q}&7Z*OF1( z<~oc;??CR;OOe|ka~%?+YpsUrAG~7;Jp=FgQ_Vx8VD3EaR6ITmLmjn_uocwa{iT{m zuj27h@la!-)ld(M!u8c(kD-4_HrH^GPu=~~Ud2Pc&}u}S>8T0Dlh&wts1kJN>8RrA z#4vKtVW;hbmjGCQ9O|d^h%0H4imq?*8ef;-M~yRzrr|30D#??Qq`UI;e@c=riiB!FGBn!b#cUt4GxV)0l5ZqQdqr|plJrz0 zG_{M2k0PPTRb+Z8lEIRsqaqn2NjfPKQgFtN?4JykBu|p`fh$T)zTF4?YZb`~3DZ}R zR7;WpisS)F(oT^)ElK(_2_~tr=>t>?QaRQE@~Z|ANeWw z4Ui>t!FofAgiXFX3@Nou-fpT>Zh=Hgy7QTtF!VE2sPfgTcn%rD;8VQIuqVC2Xf;7} z6DISa2hTZOos?V=#@*E*NVFO@!~|Q1o~KdbA0GwTrTm5c zW-|fsVYj4`QN?7HWmkfYz7FH7Cw<7qNNQXbKG#bhjO9z`2V+^{{9w!^1;qt6`GYqT z&?i^dxdq^~&ChX_u->lp#GB1Uh@;Q(m>Q8?R18gJ%uzIXQx3B-jQ}6$A(kEkc#-s! z(z3i#vSNf+(sY)E&b1Vc3U0A&A$>Dn?&?|Tv+2mx__WE%2{Fmm2>+NgtNb-JI@vm9 zN^DGIWKyhE>g-31wv|MTX3vcnjsAYbII>eeKVtM!#bH#8H6b!)a&%PU6nuu2(9W*E zf{RYD#^7UZVr*2TRel|a7#$H7;U67Wj=#}(D~K4K?fxYCjyq};#@H2ev+uZJp~3i? zONPGV-on1)-i;PISIWVyeaGEGCEC?^_>TK}3!Jr;@3=$3GlF`iF2>V$ky*eMNLVUk zt$k;q>Y==ie2)Y7(oOg_f$tD7R;v48sO)?4-*jMdC7dV!9mS1eU_z;X1Vev}&*i0n zR|SsQz+9AYNN&&mGsAy4$awM}#a~}w)=0P;#oyh)Jb4qoz2Mse z%p9p-c%%Hc0hoIwoG1S^f^P>fTYJC)b0hyf3Czn9&J*7%aQq9HFzUC!+=wp;m^l(o z;dAL&kbA1C@+AyilWFaHDi!ZVZNSm%YMBaWwYttNq-XfTLn~U~{@;Hm&8>hEz5nTV zQl^~NzQ!a}^o90V6F$LoZ(gdWO-;;VoUVCHGrrWAFm}kb&r(HCMl0N2J^kL3@;*V?rR zRX;JBJ^&$HW+2j<%R_;3VlY;TZT@D5oV-Mj#^7Zgl@S_q^=31?(_rI;Y!hr$zP*HA z^v6Dske24}?O!+9zYleKJvd#w-2k883ZJjmlgCZ?ib)$qnew-*gAmMu(4+Mr&`>Hi zI^IeX+u8mRL1KBZasM1|y|z)zG}*t3*gVI-=f<-Y0}wbwcpr-Ju@pi!Dvhz}82<^B zfWX%MZU3u_aZ@e)ZrpFDAT;}Lq`zN`ChuR2U1I$GH=Z?ae2i`|vVcPU<<+AZ_zohmS4guQ zh4D%*_gyzG#Z(cxu^G91DZV@FGN(BUCM$2gh%qz2m)=}qb-l};@B^N(*k3$#<0tfJ z{R!A);s@haYU{9V0}3@K5v?(z;UiC;^*|*#AAlVz;5_Lgo!Y&H1=fT6=|Tgx+e7G>}(mcjYA2zpcC;I0)UGPYTYq>&U!31U(}E0Kgs13AJ& zBuVaXmEG&r0SLH}d;8l4eB`7EHE#SKg^J>urbi&B)*wL929!C9>s!TRt;O{XxkG-y zCfR1=)@{g5Z0nTh3F3rHN?hOS$*cd5;+kznZ8mPHppDd%{6k5tx6&2_xU>Zw&^6(8 zz*5xy+_oP!XZt{XeX2*igx;*dpg9)QsF|GQA3Ld0*=G|Z0w`81x{L8i;i$oE24xb9 zzF|DecD-nC8KpjrZc!QZK!KMkgLIe5Kuir_rSpOuk8O4r^xtwvxw$Id8|{9#3aQQS z*|N>&7@sy^^f$!Nv6(LTt7_3k-GuZy{Qa!>)l8*HpCKYxCfw^il_M2 zKL5pdq^fewYI>p=KcOn-Bi#){# z*4AD^ue<|I@_eW2^#7{gW*BH*16!W@qQ{?C< z*Nf5gk`lsSQld>ES5ag1mF7iCz6nG3IcxyW4e@QTpll@C*4 zll=8AnTy^v(*MgZ8}!B$Z<>9Bta_Ug+4vSI^#^t-yR#9!; ziT4Y{MF#N{X4lDqZuth_p}!Z>O#Sn<;LqPqd0UJ|)6>+3ribC$(DX3ejhmkM@W0XY zB>DTfWmMN@;S&7k%$|+7qUzpDxP?{s$*@!GQ0Ldzq4UR|1>H;?{{8W<$A19+4b?jT zj5O4a7~Gb2qC=*^&ayhTA7NFT0S&2NMQ@sPhq}Q+%>bqcHe((Xr70?}LfY3wpCN6H z1_%n-T>BAoT`&l##xn~=IP)R}3)A~R)oeR~e=3ZG-ACw?RFN(8x~Efz-W>>pr3jT) zc_Png%LhAyyKVYl%cx5!um3Blb9uUB-MLWH+M+EL56`+K;(Yb@xiP07_$~9_E1y2w z?sWJ=VWEWu71zGi*G~QZi7j+&*z4QJ+W`(kiAPD>lSpo zcgGVGf=_+#?^x@|KKp&=;1?{1?)!Xx??*W2#AzS#2E;=AH@255eM{EzsS?hm{+{?UPkd4Z4BJe~B@Z)g9U85kTe zBYgEoPxgCk&yt@v_#_^@Yi{pbmUi28&2swgCl9=HqU(Xm7k>!pbZkTacRt*e_}9~) zL@kQD)f(?Zot$Sh$3e4sfOQ$Sn#r;Ccmq~f8^3|fsp&SaiG`3nZ8Tk_B_zk9g4 zs(7e6yBQA+v%B+{RXj9wuGPrR_pf3o-6ZP@m$e1m8 z_(UC7|MX+=0|zV=^iMj>h=C@TaO0e?Ax~X$PR5Y)hc8?~lOGMiPcF8RI}?+TZ8)7^ z%!*_@7YI&Wanv0p(_6vN$RQb;tU@J%k4VzLL6J~rj|@$E;g}U%0R6nORhOLp}Ilkq7oT;_u(%Z5ux_l<1anFm6w)ldyg=8r?yEKX(`k|#qL_X#AoK%&*q zh@!ih00~Xen8C6Q&pc6>7J+s7l#im8llld+(fWCAOQ~2qpH{X@`7CdNe35R0LWl+Y zMl{o^K#(}BoZ~tP=qkDdis-V7NoxUJrjc$4$v%VhMpV!ueYz7vdnR#f0yI?M8JN^i zo|jWmR$yDsm-J(8eaWJNJZq>tbs{t+DlH}{aY`a)R754AH>AvY7?Y3?7n_hUc{1He zjPOs4iSUn1i5P>cDG_6=m?`bT%~&DIFS22sKBllR6%W?X;IU&zg#{}HGa^EzmFhIh z0V~*Vva)?-*y!LehNKx0nQTVHv0zMyl~Sd(84-J=ukT8#d6*G#p#`qB84=WzOhps7 zgPJ)QDy^QrH2({jlM;@+*V>GT2*_!LZ+EGZqB__U-$Y=NC7dU|Qn=5QFt9S?iLV~G z^EctU2!{UvbCfDu7=nA^n}g=Kh?-;=PyVyu-ckueI5M92?g#E4H{nZz`@Mv5nQ`EW zuLCf>U2v_XM*^t)fhm%3H%i|sU>?2+ANg+=Fjv~Z*A?B6fz%a&@f3gSaW4p%7bG0j zsh-07IWRxngzqo7{{xsSXsyZID7;-!{|=-s4vZ)N#o=BMFl8<{PySm4%oZ11Yw58R zeD?!mpl%b)jlw$#m=p=;$$#_?I1`v767ELj?R#LZ-GuKP9^{Sg+P~S0D{ngkd>@Bl)Xc+BkHJ$o)&a9!!g=Cb4fhWN)AJT$yD?uNFyRu;6W>3;5erO%gu78b z?dFdOxj4vp;>*XqVZhuY;k3B+6yARVQ+pFWs?Oe#Ft9S?iSJY3ez*x=0X+UYF!Kg; zE^3NB@qG!*FA~mEcnjeE8Zdc7INy!xjR$~vM#6dGi^h$A0&^vR^AXOI|E>em`Bo>c zwR$ZFw|#+GDdBFE9uEQY>`nM;!S@O%lu1j%@hO7lPSPRI`5{Fy-O>(GRgsbJNEmpD z;t-!?Z(TD7st;(4=>Z&OfvTw|m@NwDeawav`zk^I@`~_7uuG~K@D;2ldBtpe)5kf3 zg!E{DnLKLBTu4r3ub2w8+ertovNZ1RKw%5cO~OW{qP=y&U=qpL#1>ttDFZ_^kW^|Ef!`tz_ht+ONWn#qsQGv{^KY zU8m(HTruwVwK^ho4IQUSajp|T5-UUPfAy&dLDU%w=gSd;XV~U6SB4?V z%*|tEsmrV!S`^Qm*yNk!WHLoD&EkU7wCZ^15mDUwI@5#PQev1{TC|=ZH@kn5I!5>6 zFbflL=1G?h+sjOLJI;HUjiQL(rKEg`$sWR)-=##=vBai3JlQD{d9v5Q#*_U7Y&25l z&2-{&+=mM83k3%Y(=Sc`UV@goCqgX_u8l;rk_LpXOz97j)l|`*r{=FAHFbov&RB1LIh#R=uWHS!>sTtok9dQH2II|;uX1;xmrFm^<ex%@tWjx_f(vl zQ|8RAqi68aJP5WYaF~S&IPYUNoY>SD`j-pSPS~B#Z>K?I{P+E^K5kBP^Y!Mrb=2N* ze^7_;2^?m@inG%nay-cXcoKJg1d4jSnCS~OIe}+t|J1Gj(;8(I*0jgxRZON%X-Ghn zYtK@21RldTSySyFI&JMC!i2wPOnoo>j4}Cec4M<4CAj9(=@}_0*drOf>|i`iUF-H{&8*%reuY;*2--bZd$Z zx9D2j;{PZF_>SxgO^7x}{o2v<_dVeUHZb2x-OxSM%GK56o=-5NUzd0y?Hlzn{Y` z4Nwp_4c7lnG zIT4QMLjx;+#se7xYroTq@kRD8b-OjT089fH#003j(xGa%$C*&OMtY|qFwN8C(3l~< zh7w0_1;j_C0jq}CnMxercW4K$?r%z)n(hEF-G|-B4Y3Kg0;Xp2nLqq&KjJ6WXE_$lynS{Z z)h5s5Ftce;FECpM&W|wL9GrJE8%}Kg0{yoWeAuYoF4(Cs=#fjzVlAz#Fp+vT-wY^F zsxJ4luPhQWq3Vt%T$qd-wgWD%G>GQ|Ck38ypl=bZ9q*NZ4jf2c6-?d)PAeetQG=i2vd=K#si1b3Y!Zxa=^^D zt`@{({nf~UUKM6hgMI;H4onEG{ljarW6C_yoANg?gRwy``%aA2JEG0Tw^m!k#e%&V z+T!knZ!r(M(%!7GjfQ0P3Pim{{0-{#(gTBe^kRZ7l0XbN_&28c2G(nT6q|soNJCxc z-;jtNNw=&~HJfAg)v>0zx8r$izMPnD2t-O@MiEn~6Dv59byZN6!(a+3Yp!FFf$L=x z{}5*zLaqiPcE@2(%9;?du6l+(@NLAZ1v7cWe_uUG)W)GQfl4|@R1Lnf(Pa|RMHG1vaf$tuL(kUw~bg1|ZF8mOy+P@vk3^dIKl|tPn1fQ3* ztFZBW0gFK6jnuqph5oD%J`FqN0RyGJS(>p{J;hL+P771~p=!@$+#j#Ee-UAC@-}Xu zf(k#|n|c^GP(@*H8f@Hf5f(Apw|bEwFjhcyM&-3Yj5Y5{ z`vsm*O0#j>2CyO%X^#gUevQgEwD(wfNjIjR2tQ^_rjoraA1KV*;Y8v})O`jm=nH#F zg@frlBHe(b_sF>679vd+!cQ;lyIqWI6sKN+O1Y`Js>r6zk$QV=WBBRHOVER4w#N$4 z%tzXhd>pAPCFAwR{WVgEH+DhRKxAC*jEEC`5HnDZhU*3sPGUW-DT*kn!~oGNP@~l5 zi+KcyzqbrNH5ciAVtcn3xP#a+rAd2S6r7P@uQ98mf%NaSjE3u2%p{f?Fg>oLGoBj} zI)8ef67o@A0vzS$d`F6fb(cD>5_?uC>(b zd6Q9#YpNa1LM~#J-z7~4{O&2(?qhdp!XGb`w22-SJ+rV9HtwPdHr^obf{nYl2HP*d zd9yAwb=S>8M|7rnug4cQ{tOFjyr~)to3sBzp9Ap2(UBGRCtzn)K3hgdmAxfH)Mldc zMp{7$SOT*CGH>eApyc{v25N}-H|DPbCe9G5mtu`ozeX{s-xWv9s76Q9s4G=5{hBt% zjB2v~q^bCns!c!x@J8cDZHXA?8yIJxw69w`ofLJlia>6Lbt2mM4EKuQZg>yMJ6$UR zZC&^YYTV^|VC_uh{fQKcS;Q{kKdtR8z8&~C>c)7g91m-Mk}5}d>Nipccu|LY+QWF` zLq;)YiPq43`{aQZ?RSnylcU%mRhc*MB&>z^cv?}4^O*0er1K!ycp3!4#?v4KHl9{+ zz_zbKg5rg}3rmg1VW-rX0B^A($FN9-;~^4|K`Cc=o3L5|pc)v^0B9FalQu?GtUX^v^d zUNqDg!syUku_vQ>#%^4RvHKixK_Z;T%@Jdp#N=xsr{-Q_ELgJW0}JoFN5e*eGYixo zJ#F0JWGe5FQ%h+=t=f4U>P_RuC*hukBEo-V zos4(j)?PDHd)U2`QRx@{i!EOo$~j6yIfwaBPH$R zC-|Tax3@m1Q~Qloh{bh)Xvsd%ruBmjbh>zrWvs+stHOFvA7iB!pllwPgbUQlsUXn zAgZi7gVhxRC9&c<%2y6=)jjkaUC1T^^gRx5fzoa-4wj?XPCmGRr)eb_&#v-2PzF|7 zqw%vDw}(SNa8#5|oTf*r{Sp}Ghf39IZ!)j$a3}zds;8P8234D_)dsw$H%YJN9a&c@ z{KOhB@x=OO>Q-f~?Zv8OavgqnjiFFbR3sYYBBq;Lw+M{9ZnMF5KMwBI)v%F~Uv?1qF9V!uccDS7e7M0ZJz5bR@2*teR+^zncKP*B%onXAAm$;{3mj~7648r24=HEZ+Q)8vtL7vk> z6&*8MaYp81ukl!&x1pwDHZ7iu4~E*%a2mET+k%*PPy+-uW;!HgqLlaba{gu=N_)Hk zFF$oCYtfTaTZEw#)45 zRPMwZ?0;(3g!77{(u@JtPFLeFP8cCB)uWgDE8XqeTxr;x=`9U1ARv?p;tkZwPe&UX zZw9C$PfVZ&3^j;DFCMN#bEZx8o93uASH%sS>aWS%94|Fy?8a1ScuJ}!*{C9X7|_y( z0qFFT4~^Th@Osd24-FF0QUqW7Wg7XC9@Zbx{TmK%VHnQ;#9?NNi>X=gW*TW}fXU4E zHRCdBj^1K-DZzPjb{00CO}ii+c_yYk6S<5!9lL=r3!`Csow=ob$hliw3iM^1j7}QY ztcD#K25Rtsk3^>e>szOqZJoqOQ}|{odA6vA(MKb_HCLnX3f`eU%8%S)SeDYx5k<*I zE2|BTC>qMp7iy+DqWmrqhNUqdPj|7NOu;Q)N7JD6UpTzkax>mPnv3h}OqPqYv)@{P zD>6F%Cv3sLk1&BXPb z@(Kozbvlq(#lJBEAifR9A!h?WLa%x_h5(l618dPQGKHUCJzdmBN$>x0^!^Wpym+6 z(fQthOx)UcHw@HMzp^glXq-3Ocoze7x~uUh2fd{}F6zNT<(rwFfzbs3T_>oAFVwIW z#~^;>qN%?nJQ%^?WK`UQHU zOJY1w!^Q&THpF~uKQYDQP+;mjjCE(t)nfC5x-58#zgLr2x6uhkCv;$0=>Y6)=u#ab zF!ig#Yv&r1YFPt1l6YX`F3*10-7+DPzGHK++ z#19lt<7-t{>1!1(@qsGE?1;k$tF`!G)e*hCagp@3DpH4Rgbc-UlKfs}KZ3y~{siYP z7kH5PSNNwDkFY#Qqq(o)Fbjn^^DI&U+bc}A3TK{`U|~IH`j`6;l(l?>o?WhKdKbKz z9k5{D1g1XEQc!H+7HrU$i>>k&2yB-@3%1`Y%P)eeK~k@WQ*kl$S7Y%Y5vomYZF++*R#1 zN9LE6EVkeoAfC7s_p-f!HYA9}<;Iq=nS>wZ02 zvw7!(?|<;yYad^-?JawDe9pPta% z=RWO|5B@ly(+_|4JYu%ZN&MucJ-Z8EJ~V09iwS+wH0EWwKXtz6xf%U`9@?ky^~ZOA zzIp2TxS>sEW8SxyYV2>XyldFnhqs)1W8TU^iP^?`etPG*Mc<~3srOzobHte+OT$9M z*Pq!FxFIz9(Ov!5E^8n6*!AGjxUWCx^Q%5@$=~fJ9F8b2wZ8quBj>VsC3atLzVBb}|ruQ$yy?zXvGxfo)pIIZ% z-ulb-lJ{uV~-#q#~`#%e`_cvDdI&{yq5fkU6y#Mm6<+-aeV*BKl4Q&5u*}RPJ6B~oR z>XI}l=4i65^21v$-1EsK{qjlUOS-qa{#DbMZjQmVAvO5RQW7S+ty|8?ayrddQxKUPM^kiMx}T7c5mAFZ&!EU@z$h;Q~jgP z#c$LnOnANBXD1$5-}OYFH%|B@7Va4Ialwk}kl!p%9eKCulQ+gUFMZsnq4C>)6kmSj z#p&m&@Ax$GN{30QlNK-NnzQrPs6ltwpE|#;F;nB)U^}$#_}@P|zWD8z_F<*n6GL8G zwg1$W6W`pwU{<#gMaKTqzgyGPC;O4F?+?i{(K{M5|G%xHOogwsI6mGKiq~H1U$`m; zr!JlQ8ZJ-kD5-@cbl>Zlc;9cyCxz$hfoz9k&>WxTY94B)-Q&lT!t=ifiDTLh zdxM&%hlA*!Ru?wa1B)PaE0ftYmjeY7#g;158JDw``xYP@mKNO!cxVRXAr|6^RfIRST0VH zcwAN$3}zS_bfkg146{k%$=={NqUO0(#S@_78Oks;NJsw3 zU6zB_fR=F>sNxx_;t67yf8b1ctjFwmAE0Ni3Z6v+6jYYK zwoS`W^Nd#UgsOPPFpT^LzGO$OMa?r-#WP05LvLtWO%9!LJYF#LIW-T8WsCR;Q}NI% zxmHt)Gqs2_3jG$SdBRmZ<5fHp7>0aBv73Hr7NV(TJfmCC!aoyKJd+q^o5b_%`VUYw zwB(^4f_u78Qt?w3>C#?B^a_G6Qy9DkT4xN2HV8b00&{h6wLDyW`c~N z!4868I=uX>LlUN)A~_;SoH`lal_buXCv7R*P+CB{0#(#(B%N9rra2*mYOb*wuBm`Y zn4W~8h^qcFhHd;oKB6|)>557V^-`FGVbg6VR8duZ@U>K^#5$n9I zV-jlG+$AH)uV3S6j{{qQxU5i$fkexvM#5IV@qIh*V`l-gI2R%qhH-Nh3#rr9FP6Q9 zyhrWoiecPb#W7cMgbvx!`84lmy1HT*H&^lQu5O9mz>qmY9Ox&m_kT*SE;}{HG!DL>JOc+VkK9Ead$;+omN9-fy_T=YcM7(`*4oriZJf3 zrb43C^d%=SO#u%scDlM(azz+-SJNPI>XLeS?!DhQT^*BL5ystBx|=KCe@s9(O7@|b z4mV*4FQp|6=68j^OA(H;Bi^yl?jPf!#*R^O~t$k7o-Ixi;e9<_X*kgz%sWNl(Rdu ztefskq}pbPZJfiLM`xAW@;KA1ESH!` zrwxIMkoFA4u9$5Gnt4)P!!9ytlcj?4g{kso-ZCh!A#FPNRDh=5Ci$8D6%<3!jF7dM z+JAh`C?fSZ+<7#Q4%+)jiYJ~ev*eA2C^OJ!1vrrXcmqW_q~^wkmw^yjWlq#&>y-G^ z=)~0cL@T3=7+p{tFQ`{ZWHz4*TzP-|D_9Y10E%`@JMzSgH$Hb+?MMcI&#aj7SA>~GB z^yK9D=sco79%nk`h zt$-)Kmw`Ea6Tau+{vknzM|GfB)b?fSD-aJn>PnhzDkogu7Axa{%+uP55Zx#ZwZ7`_OazokQdI4K;u; zp8QAEStBq;8jgV>oTu>i0_Ij1TxS&xDgD@&QOk{w@*)e-vaZyg!9Bl z-qK(!Dg+0a8~JZGFpDIdCq8P=DkKae#L1KYRs&bv2EGT{$oDvKFSUX1P#gJbfqU;J zd^9G00hp^)vBKOa|Bb?Ds3`gr1>-6HR^VO|Fh?cajp~Vk@W1p{up%|frE?^ ze=eioB&YZvCt>KC84vorXzb6;c)(3;1CG*ZQX6p0->u z2H=v~fa?t0%r@Yt-OFzSj>5614LC}-#cjaRb4%NRqjsvI4LIUk-UeJp;MTMON9pTO z;Y?OnE!%*wenXWC7p%fjdDzwl9JMR=w-NVf8*r2lo@@h-+Vj0_z)?Ou*ajShx3 zO1EQez;y!dR2y&prVcxeXtcy zuTgzKi#PnRl1*Rbv!TYg;R}ec4$7YvSq06&Qf)H?g7M87d(A$3)2+r$=TK=H_pc+V zv_mXZ8_ij_TsPR3Ar=_K8A({I+8a7c92q7tISDt|cCM3s8hVJ64GmrD<4ok1eJX#A zY>pJO7#py$#u4WyE)K#I{Yi?IA^yf#JicLw*LH+dD>4k*T?x`)m<}FoX2>k zI*KihI74+@&@^e0C{_YOEk{+nCLSRQLg+Sz!o}^gv&6&L)W=YV9RY{Z`iu&HQOmU# zL0w5?Xl;{MLKW~>AgA5 zpGCoCG135~7e1Tg2E$fm#f?FiSKz65R;Q}yf&P}waYHT_KtK!2hFs2qt-4r;O-45a zBQ=Z%q6coMS>CNamI8~=QVk|t9tYHJi*aKoK*V&t@j%o-T1>y&%ee7R+{a3^XdQb#O*WAs2$y+zu#;sOxC{qR5Z@;A`-6H-GWc6pvI&yp6G%O_#Y-wq$%*!VD` z;eW1Yfn9j{Xz{P}Y3JPrE)P%Az!(IBC*$SirPUeQdHWa)`u6P&209Fe4jpg}!}M(0 z5CPt7a)mFm(F;&7W?Kgv4ZnJ`HP77k1Z4Dz?#)f{=oS`X6u3K!@_Jdy=VZljezY7#u5(OBTQyhY+GRC zeD}e&gWY{tkv#?5PA1!}$lio)HIsdy*!)pt)9bFc5CB_mW($JNkJ*A@qvf>TLMUt_ zm@N#pe#|xjw!X|}g^kLow@?Zj>51?bY_QP+Tx^{P+hAr}1=|p2TL)VJvu%LwR%Y7_ z8%;j*7Pi1PjM=usMjAuB1)5Y4#B2}3HjvpKh3yt*djhuM%!UXP=mQRZ=&*IB(#P~# zNUPK{#VJUwgTu_!eR3Nv*=z**msbXU2RkVGOpZrjdi;iZLQLI zPgrO3K|`c%!b&*qT~zB>zN;6TnDP^`{-J4UQzcSt^^F}8&Ee&~t7>U^94fFnzz-3m`p&W6?=oNJhE4bJZ|8%}HyHMKcjg02f)e~JUk|E6R6IWOL7M9Hm2 z9o?rIj|>utnGbPh%LR4zb9ZgUdO6U!I=DU$Z^^|p7yAI33nw`K0acj{hPID3;eM0CjOw(=cDSlCVNv% zWtMwIAO7iD+A$qCsA{T#mYqv$60wbQx9VuG@JqaI#yN_M&Dx*C8`lOxIhkqAAX5L-(EsY4Zvq>N)W9nO=v40q{s9VMPtQj&NPcAhgb#17C~XXVQ9hKSRAv1l8c4*vd8 zc;hPHYTYPWLC!Q}LRA2C60n%Aqcznu;F+a7K<;A73T;2(4?tc>&p>+2Tel3ouG^4L z3{YRW%pg`KK}SMwtQU7IF^QQ;>sIi-*EH&TO{2b7BUZXO=97!zok*q6LAIbV*(;ShO>d2ssG{-E1RD&3x zuZ2Ru8<%*+mI@nhm@;AG4NeJcyqQ@A8*gUpitS0*c!L8A(^X6V&=|=oy$i4-+Of4K zY88!$pbHck@u7i@wb#8;phi$Hn)lkeA_JPU=GK!_-tVXrp^RAR22rQPy>y`WW3K(q z$GHEnQ)Mh^yigN`oNXA!dei6&eTTl#Yvi$p-mme#5R1A7!)v@R^qSNcf_4n*4Q<&@ z4+f>dUfWg93hF1QC2S4;|5oRMzMS!g^f4u-zzdIp4V}B3sgLtnT^%7tjtjH)G(VKXD?d0o??hTC!)w(Y4T?(IYbd^p#)8Hi@!=3Om zW&ek_KY@?=`u@l9*JLJ>A;Sy?K~xYG6@(;&SSEW&WU+)6iG4|JO=bkOL`N`QP50{Z z?xK6&-QILj-4jt_snQK^+M?RhbfHyJRrx*7xv$r2W-=M=`}6%j{`Zl2<-G3e+;jJH z&pr3vbI+ot!({UpY(69rXzT^Vki?&GP`D!vhgJ9Mkx=^b_|WflX|LA znuupxhA3a53{Az8`nHkHEw*O}iRWwO>AyN=eg&AMD#f;`Fm?!&6B7z5(=FbpfmTETpbI`i~ROu1bnM24kYRL9xdY z&(<06{KfJp=_dx&^{m_g;tl$JBu%aEiD%TRt|Tefb@B*Xzd+bRLgj;R5r?p3AAeHusf<@MyQzRo6&&1_)ilA1by%DT1-ezM0Fj?yGBV5Dj*JX2heouJSlhmp?3yX z*IDX9A?&Us}NLX0dlk7Dm+gz~30AvB^VcVkVuKPkl_zoC)%(?Z~`z30EXB-baRFz!+1}rk>(X>+P2EEumxqu z2tRnK$&wZo8jV8!_&9tL6kPPPw~&9%^w@=fh;ffm`6^pa}BT-E3?nokB0LL+=1z5J#I=X>97$|Z>EsS=Ba+kow*Id^fJ(Pit zP!X8(^1+$-x&{`95D508sY}IjQa4(Mv~qS_`-!9V#ys7Se4VqUt18G<9klin=V{D} zgF98ZYB5AGbw@D&tBF9GL=KVxoxsl~jlr{=OL!F^7emBaMSBClIyd@Hb1HJw>O`r7 zJD6lE)aPs&x?<1L&a&Omdj}b7tXCel}?#o^=f2!6x}>s%wxsb0+oxMtPv%6h`bY z4Anag@DNrBsa=R^>wcP~z0AZT0PVm}NXk6`ky8t0Ct&qPjEsrMdj>3E706}b`g4jo z%OKdEwrqnr(PZ42VTMJl90LqlCZBVUx?tIsZrYGsPZktmtk6|;!gC`=VR4Wc#)?Q; z`w@ONi86eEAv~nX^ng?CQSAkc*$3Yd!=|{%TA6IAywU2sN!C?dTsBbAL|E2t0xI3# zv4b=bmfP3k)k_-@UgV{YfP{_f95PhZR$hU!B2w#uP2fGwL1+Nh#HBW8FifGNu3^$k z>Rm(4bk_>pp0lbSnY`j&b?D5cgU^d0){j$8GrdNj2U>$m+0(e%!$^zLPOwD>pI%*mr+3 zV19s~jdgXjDc8uyC~Mgd4=Iu!aB5}O02cjeygb)l@e^`g+b{(s6sZ(DG_6VU#MH#t z6+Q_d2W_z85aa=Lsi>qlo;WK|KPyWRp|9VC6Dby{W{} zBLu8uS#YMSw%#s(VVUqr?}L^JdlWtHY|FybUb@+qsa3Nr)9@=f5jNX$^&oo(leeqd zwHIt@Lx$$sE|AVApR-je^ z7M+o*M07~KB^BbWS2rYC!PEIvp+n`DRQIsKOikWQS8OP^X#t9m>$O>;d`A9U{&?)h z4nsPEtsethPtpxZCbnLUOBI4(`P9SKCt=($PvC|k!jJcU*-tC=qRDj7ps|2n|QFszdw6Xr4_=n(eHvu9C zvvAzalA$Kj0zHa%-^#9i;4shxQ}plxmaz2c#}4B%}E2M zN*JGLqADS8Hh0?Gx)$Xp4a)rvHb*O3qJ7@(XxHO|1}rYRQ@W7|PUsN4O|TAXm6NYv zmUyuoUQ&d^SibzKi_aGt9_kEHo;94r zbB<0#bb|Ow5$6>LiFjSG#kq27`AVbCQjtJ2L{41D?zFj-8&`_;%4}CwH+!*8pznVI zzCtRe-nSn=8&BS=7`hID1Qeq|B!ddP`G7nF7^!@zLSb8(JHtM}s`?D+w~ECbYWwmz z0Ygg5D}YBhcTnM1ILVA~qEm(e5{>A3K+l1`k&mx?8qomwlT%f8#9I^z$v%$Rl!?E4 zRADrDsTebx#30qUiZQ=QjJE{_){0y|+F&n}T3>W!iMf2laHmjQ%sRvh8iK8^oDWdpYq2e*9mI%&7OdcmwAQ~irPbKXe+lv%aTLg&E3fc z1cj*KGFpqX)rq!=lz6uTz2Yaw>hhIXEm$T`G1K)7uyF`aMCPdQ4)igNn~e60ub1&YTNt*0G;pI}5iy5*W!L5_YfS zsYc?U`<+N|!@MrGidHY($>WHWJ9(x%c`nqe?&SH9VmismNQ1*hCixrPviPGplH?NF%n{7O+21rj+G7Q1b#L)|LvJ~&4eF0wP?QqENs@=i1{&j`X4X~;-)9?vq_Xq z4`CW@$r+Rz%1#01hGDp7Ra424qk<=Q1V0f>&ZG&TNj6lYn;EGINHv)1)ldRF(UNkS z9M>5BAH|QF3Ju#jW88cXZSJlxDQc(KW` zg4GQluQ)F!$_FYZs54~ChC3--iaJZSRIbLmm?KlN)E(oV!pM|M_lu#UmXnHFsTf$H`k`<}OVNGKpG z2uZ0sfuBu!3Qy9d8u^MiF>kGfpC~b!>In@9Eocge#x${$1%Px8KdOr$<>nar8X|>7 z4K*0deOiu?qLxf6nN~8VmlWlgwP5igz{>!qM0mXoo0KvImro2EAuX6TZ=sa!oF)|& z&6y!BfEfY&<}N}TEK18Mkmk%^G=189Y4*HX^Jhx1od9^=LdUE*vr1qTc;>97l5_Er zY4e>h>$_+n4xle|5D5y-whCr10-9r1$u!5J5@}J%Ojt4yr}-nIdZ7bXe={2^u}gVsF$!=Yr{ocGl9xIIKTwW^}|H7#r?U+KZx|F%1S9@RI}*(C1Do zjaaw{i4=(~nFSLGrLz_~ra9&F?mzeccT9&R<`$d&^IrDB80+kbOV1Da)A-l4ft&Ume(JkEw^kI4 zLBo!kmG{o$-71;|p9niJd)JFEuhMU?J)5C_E@95wLGP@7{i!W)PS-8H$)xYMYD=H# z|5D8mUw4;#bjk9&odt*XE&3_4pdoZpRlkNM4olE44+JfGd)U*Tw)`RY+^5eyIc&_S zD?=Yy`NyJnHXXJ7>+>Hz`L6imk4_v){B}&MC(rg<|Fr4-sQ9_!lz&_Ol&^BO-MG*3X~p*s zOlbRoD=hi`TVpQdhX4M;w{P$3Q(WNOYUyfu_w!zcGhaO1XU2-H(x1O?3Lo3`U#<;V zuLqB)h?}!-ct&K}x;GB}cJ%Ulhqhz2z01?`zh3S)XzEj)N8hq-S;&-D!;{BJr~jP4 zZtx!&(>_SJ!4WoLeBuX>U48oC{!XtCdSb$73r=ib_g!h$y)$BMmkOiTl|Ff(<7cNf zK7GIWsjhFXNT0Limk%F$`;}AMM#UVi$eo^4IHmMtuXkH7cy+aF{~+}}exS6d{ixM* z)%X3^J<<8S>5uM+TA8r>m&q@M)+S3EkN4kp%a)Zdu4~aTY+9?^-3bf2XGagYF{tFi z*JUdbx4Bkq-*)J>_F?_+x#fYvp=XP}f1t(MZ?2nnx%gsu`_Bt*+I;#@)g5yswY=W# zJlA;eeAteu$G?al`c%L7FSvU>{_Lq0S1KO;b92Nu53L-s<3!D7)=BZ0>Xm5S2OX#Ga_lSbb<{8CKwj~8!m^GT;;H+-M^@9ownwp}@5@3P~*Ws{R4T179< z>)<%`(9CaR>m%oOOj)@q{mbto&b4$zeLvm#;D269h%$YGkXI|Jpq8)g={kA8$4DuhoUOe>w2w_gfX-I^(@PEmI3y_p9E# z?v3UBTW^l(U)3Q#EaY+@`*RslYYsiX?USUx4u=;$G`!hkZ-@S{{@?ANyKi*iZPr`j ze#{#B;Gg!gsaO75d*YdQGaJ@jeaXD|&{v&;hm@V~H}8!}-B11Wb^W>bGpBbr7f&pk zot@Z4-+42qEjM5lp5zDn>{-(sePd$o*6GR>9~}4T3yW4X-U%OX0}d>{==v%2JpUB4 z$YaTeLh5x(Js%aw+bpS`acJjX44@h7Dlpe4+W$B6$`mcd`tIgp48M)(km%xTS}~A$ zg{er=O{2@P;kj|XNbvBb z6Ue+W?eS^`>}Tzl5Bk$-=|?A!dF5fiq*Q!%&jhzW9g>rM(-X+N@=L&^(){_C<4^e0 zY3)ZRka=a=l+^*)i=y5@bEA}bw;z&~ebW=jyz+ctlAH6>Dk%3F)1lh*r4z`!as)6b z^fx2_ywRUdm>-=$=9NjC+X>j4#y|9^KONF4`lct4d1YD`ivsq5l6NuNY@9EWY<=kj zGOs+BF!77n67j1)o$LJQ1TwF@5tua5z4&^{tNwH%{OANSuRIW#oBTsc6*@n5wk`6fL%H^))60(zO}6y95AmdV+$*m=_M|_ZXg@l= z{pj>z94<*fFD=;!Wm4mI*w>FvA3r)Y;^=j>=1gw&hYd}%LmEkZ^VQFfPJhPff+yFz z`}9}-=^5Zhr@tSaSjM>-Pa0hupB#S1pH7?~omf9QG@sV%Zo-q=&m+#uO|(O5?Y{Yn z_oFk2amL|E^|kP$)VuuCli){ZkRP4Fj6=H35J2%6w7Ar`zJ~bG8SF>``E!Ge>%hQ#kYKh`Oz7{I4Yg-&u@CnpN`#+&Ims` zh~6tbQ@Z6A_|r-Dqm$%ECxvl3p-8Cx)E>@%&7V%HADt9GI%$lv98cmK%`4vC>rW@$ zk4~B&oeajw!js(C6StsgH?FTteDN*k3_m&}8Aqk_{_k_v`qLTZM`xrT9ipJujlq*r z(X;aR)0Dil)^Pb|8cY*gEXH3 zichTOL+44z#cMue6rUcN&s4>ym*%rb@foc7tX6y^&1a*Z&m(?5w7*R_wN&5n^V#L+ z^QoWDmwrCKC_ZhZ2=23Jb=2kHnrS{}#iy<2(?RiRule*+e8y@%v5L=l&1bmcW6^v@ zDL$<d^||G z8l6oFolwnZv*Oc2gqpKd?F4K}p7c3UG#}3CSjC6q;(Xog?Lz{dw9?zBKjmkQj}Hag;O#RY25*%$a$FU|!Ug+K4@6GwDt`Mv}Gb7{m89okW<`Eb5& zhcEdso&JRLw2u#!;Wlrd0hF(|eS9cXwT}-K;w~Q_N;Bm`iz}8&>@y!9qI}H9hf3^} zj}MiYQOSkKJJm&)j}OIlgSXFMN?|HGAN4;jjlq|78c z=BM7F7{@2nB)?E%7U>;|aePA2*rQhk9cfvc;6>nGgxMQABk1L@F$2SzuF|{_lzM4K)uwp1wmNJ)vThP=w>@X_mx6a?<&>AeA}rBSMcA{^gP#HT!=e*E>}k36AdB^2TK zhFZv>)Ydzss8y9G)Kf|*!to77!nj9=7Jl1SC}7kSeyD^Z9N$ojIh5Kft@~=<^@RFb z2}L-*p>E+&Y8l>bqBDhRT$hzlgyS2kghK`6N$&Y?D=eN+Z4__9@eNf9AHA*x1%bP1 z{kc?6s2h|}gyS0u-N~!u_pLbjs3%mG5{htqLpgmy8AtxttEbFRLJ^K{s3jaqZSxn; zkNeRR*R4t@!to7N#-TdlNv`v%{pUTQ{;h-}9N$n&;iK2}q#$r@`gXj_6Y4u96yf-W zS_U6I?DGicc=;5fx?F-yF!i}AleCbx*MhL|^#gN!R$G`*Paabev6r6+@8rHfN=A-cGP zCWGz>ndwQR|HUuZ%;bF!jIwj7qy*ce1j$80lv=1i>s zGsLYV3rgoGbjm8{OUu32T`ZY&hY3>2G&AWg z7KRFnMB1@eY$08rf|8=pbYsU1z8__V6ZftxbSy?>E4#i z)Y0}4k*Rsw1tSS*Iho10U?c_JDI-N50gciSM%%Me(?;fIW{qSFZCjrYQm#EOIXx*m zJu{t=Qbxo#jTe`kH7a*BE{8!Haz;d^XQ$wiqs7%fBRw-EFB!L;q-cHvGShNWGqaK@ zffU9o?Qt2IqjE;&sl8JV0!*~FGf?L%B@M*7IyoU|-E z@ifgl$DW;*nGI^0cCZm7LD^WTA;jmT=8R5B8I@^g9^vuNPR`9t&P>m;^X5y+m6)9RA5?a66rqjFNylYKALQ9?~)8Wf(lP_nNU71ErW zmzhCoSB!NoSw^_7{wM#xHIuj#AU~ZT<}#e!g-Em zxT0#&>kS&HD{Z7!={z5e0pSs0O@ zRYr2}jcGJ4_rotWf*>!~#LYq^-jzmp;Q-{Dg&J9iCY0~#;pOa--R`~NfNsQILo~70?~5;=Uy+orYwLHy+?ubrWalydey)= zwvS#3$Lm4L86y717}zy z060B6Avqu>RiR}3@;e+jdTQ8kCj0`WZ!BbKyri^h~9MI zlz8Da#h=@PzzX2pJ(S6jk@bM|eg{tQFo72+eZ(Fu3XZ@GOm7hIGX91h4KMlsklqsD zt@|5#BS7yi;C!s$1>rqV`F#VN-~NUkrSC7`bQ=x;?ppN`4V5+KJM&>!YI`3)=XR3zT1?7iT97j|-H(B0IMG<3}zKJz`VK z?1bTQf#_|qOHvhnvJZj!(YM6Uv$!+`Us7hWKG&jII6FTAGO z^ADg`4V)K~MZ8A*3qFuNAyN^cEoeS>P0;0)V>~JqK{sDtLkD6@tbc!1?hX&}*Is!|V8w3q)@= zzC{9Oqk?y>^gR!p?SDfr6ZCcfr+GTXdhPs10VhGh3zWWW&`1W(9bR~W>i0q5Jnx0q zRC}3*2J$L!+KlAnNuBX85WV7(wr5ICIvvw}nMk_$wy0(kfT4Lusq9|z7a3f{HGw-!^dgpD7$K>6KY9t0?`|WZ=HZM(F-q7`lbV?#0#&f^7{?+Rsd(w z%@ixz4t{~?eF>bO6udy`YlrZcfYX8oPB_8~M6W$?dV1kCmA>f+-yb;lDtOoGZ(D&= z{WtV7KyROd1CU*y^tE1qc{hIK0_ArxzC{D)5e4sB^}7W)RewWoIq2;LPU=F6_1fi^ z1DrxHyr#w7BiwfSg+TR}F9Q_-5 z<)HTsaAuSMfV)=tEdb6+FTAGmdmU)32hKBIc!Bc!AK-l8h1V3lexSEU!J+h#3q-FT zc&1W;6R7-XJZi1r2+Y9r5`dTaH}uLtWDIcjc;N*~->1O&#tW~h{B8xkpMdk2L!|Cn z^4~7te4*e4$}g#ZPXH&3cErJ5tA4uyXMh)8Q|apg8bg6I%?mG3es2cOtzLLd(dz|z z6$%cek6a*nuK@4;zo9o4;cNdPy-rK8)gC``fy!?;zQqIQih|b+?}5@+fW|PJ8U&n1 zuhBYoCwyD1;4mT{P2Fs2guna`@MwN@_dmdk0p3IZ0Ixal_WT1piuY4LJgmnzy4iFw zGIFdD-v7hRrX&U3An97+A1)1_?3guUPRX>{ld&l(K5jC$UQJ#yqyM1E^J!by|MSJB zFk#w2@laKGJMt&z`q3l|#uku~)Cf7vB(H>RLc5$9mk(2~5oah6ESlp+IWz2GhLuU`^NZOSJuGpWD{yVd;}kkAyfW7c8sTz(%DMzP zwz-H~_fWCbt(R-aN??RL&j3r9`i8O?yhW?g+Q}YkMoeOvb!9t_P0om^9BED8m1?S& z;Je}%n8mZoU%`$^WUotyx!*xrPeRq;gH9i?uLz(^;)1y#Cog7I4EErrVq&WTWd$up`)YM(2$6$zhN2#ngIYDpT6gKje+=<0h!Niezh~FlQL< zs_6#HzLAn6!eTXAtft>AtMaUtRucZFTW4Fou;ZmA{ufZu*A|N6X~>NnGhtUo{4#BL!3WZJkj!O-K?t?y zxd90t_?YImAJ9i!cHe3c05)+-{|%D94gLR%OHsMKD}wn+)|O}z z1!xUM{7<2#k&c&8{D(PqSa|oa&dP<%fcg;w`iK}%KRHbztJ=yqOm{P>97xMCIFJgP zfDY_1zPkjEXsydZ2ynDS{X`*kRvJ9&;xtxDow}3qHkOhfL3$mf+^lt>a*ByU4TUEf z4Cu%4x7aFh?wA&q`!IN+o8vbWKjQn*YI-7f8?6Y1`>=^yV~npMJ|}qJEI@+yEd?Za z-&#O|_fcK^!Zq+VAknXD0f|0*Sc858^f}|%@T_GBUVP}D#xa9r;mWvzFBp({FrG^Y zB=?LcHpqi2(`|VTWw_|X)UYJ3VX?>?x_z`eJq{hC`c#N(?-;jj10iI>6Qmw#CgZCY48{Hx{BhX2nqtYbZ0}U#$8q%$;G{9YO*x zb*5Zf-dJ~r&7CW59ziLncvi5IyC}tej;?jl>69C64f>$Az*x-`$E8PFQ0@-!eiWoDF~2eg)r1O zWm7Ja06K6eWY_VcMZ_LM0J_mS3}H#C8DhD=##Ljl>!385@zi+~yY`bQUMq%Ktv?m( zyt|RsJ0o$wyy!-1AL@eSi@p&LNc0F=@DP5a!W4c~yaIYagI)k6`pXA^JpF}wly`sm zlM9erXu$;TFmj^OWhyh!VM?vw3Jqo69VSjbhmktLT^0u`)|L05f5FVP1^p-VQ0TbG z7`JU51xcYUq_ke(i7qs$#)SAqAG#ip=tGkLdHN94xa`ymb#{mpGSjuPurfir%!B$w z547;a44b2;yvU?}FeIK?(PF%Y2jNYFO$Y-_r_~!*e>I1D(RjAYA09g)E9*LZXXcio`MnQyiy# zT?9zON{xP8cLD!Q<&Nyu4}cXn_`WEE$%jKz^xps zn`DZ1Vv58KL<+kD5>-pwKvXRWVg6NXRM;amOEG&g(N$Eg6C+&pwz37j+>s=+-9a>+ z7I(fRo7|(!eEYF^H^dxl>V`b|tEH9QBs_7oGBt3znbi!K*n|orI>5MqU^gEUmW}Qt z1cGN^r!xlWjb6@R4A#>?Q^YK(6QHRKl>?f^5RGlL-YM=lrJWT{*+f8y_Dj*Y}O0!)Ksx;Jc@@alY4n)}PF@b{WNJ8$)q%!Dz9tpc!_3rtRVc>V+AOtSS1d~i#1;H?6 zARNq^5XRvaDZJ*ns{Yyl-G{5bdD&{;+AqJXcQ!}LtaS5fT{vIyV}-j~G*15L3>6Zho^9z{{rJV5smq(kRzZ2PmZ}b<6NrAe zhy!amJPUY ztiNU3jd3Z|aTAX$2^F)N(heI6O;?lREZdUeGV`?SFX#?-W;hMEh%3?d(};EoWW~)( zk8sqP@Y}?G0QhoF`j1cSNW365PXrBC(KHZ5D`Tgu$2d%am1R8vVS}scN}aemQKpL-6XYF{tB0DLxX7gX3~tP=rT@64^^E>(;`tS!xN$b| z+^W#T^Q$u|({+iptL=#gcpSr1D4#6)|{eAPw!gGwkphtFcDgFlBPwN4uN#& zUbo3zYAT#kv|DdNav&Z@)ChG=L9yv9X{IQ7s!#A)svmEkkh8DCN0Spw4W%Z0wri6C zGpGyFh=Zx4)uouwhH)cS9`udek7MvOs0sqQ79<7rX_faPiMBP>q_Y$g)M!jl|A4Ac zD(gmx7*n8L1PCdnsfZv6A*Kk9BLeETs5W`()wYhvO!*8%r!{{Oz17!^FDTZlGX{TJ z#Zp1BL3~!^ER4Q>G0IuEJHrG;X{76qh7}2`Lx$;K%TOsopv1c}R755Heu{*(kh3>(35`RD+u~#!^WSg=$vbg<6d@+})#mHCA#Bcl%W+ z5=E%E=?ZJ#DE5M4NsZk<6aVz~T57$zAiB9Wq?zJOG|v(fD-xjQa>pV44%y!^a;Fg! z-z)H=Z2&gD4Eqp6c08*YT7u`p3_XXZ(2kOz^$`0}I02mjM3Wes)DQGUh?fD05x*8t zF~_?f&-n};#FH#F8KuwgT*%N7JQp!^9M8oJoxpPeLu7r4EIApaGkB5(J)`s^o}~;S z8xkE~pss`4S4o-6jDuJKU#1=c6YA!A%8Bqol*STh~??n2R zA*`?~&_+O8*zZ|DqP9QKp#K7*5yK|^u0bJq7k=6K|YNw_?M7)Ty5Pl#>c z%j3+i3bj*$b3yglkTun)@do{Q+2dW%wD*Xny`$ib;J3eu#&Sia3}sfxnq3A-y6V~; ztUvE+n7Lv-EkV>2Rj#A>gaAl0CvriG-t4MKFl0rjGzS|k6(qQ+q7TUl@-mZrm^6Dk z6wO`<80TfG%d)xegGor+@ss2)dLQnTgvn#sSncyj)LlgHOG5Jpu1EEYLW!g{5G|%2 z5Ycu<$~jgVtjrrKGgeohu*N1`=|Q7P|D-Ftt^nD)D7LDw#(`)&+RdjaRyd%WQq&U?sC4jCE|rtp zQwe!13Oj&Efxngz(=HGOL0=uA&upwe3QWw#QUQtCSRNoT8}sNfmcvg>s$T~r<~0WZ ziT?4c=GP2`?wR$p#T&V1$_$Mv3w?nu4NHwQd5^tTZS3{ES2;=$&_toHd?>i8l@=(1 z1GmgKIGPPRw03r1ir{o(8Sc&OeF(`gtl4oDG5{JdhU&7mvV`fpXnYXyPpl5z;npbv z++sz5BmQwObLb&}Hi0CIimPL$k&;6`eAgGZ7HgKmk3e z)`0}fH8LT-=oWXCq9N1dKUiLEs?)nZZa@PMqsAO8Pa=$&-lDN+R^i zGSjD=2xvPHj}X{KHq;Hn{%Kt!RU* zNGnHqZX>l?(hlLmzz77siyIJ;p&}=zlG`K5p_9;RN*84{rM+vJSt@H)(rnE#6SG?1 zhOQDpSav_DL`<&124`=DNO#<22oV<;t7$H3(C?w##+0w9HKjJX(43Sre@ceosu0$`u{fp+hL9Y5>=X9Qk zLo&tkt|G|$i15isei&C5E>hghbj3v9871$)nv&~~RI#Tlyd-287gigf+bTz`E_9oC z1c7){gAs)O5eF2KAtkK>KgzOt)h#I;aWg6lS~l)`vazzzT<_}|8qJLDK?4Ds=o9qzt7*N_h0&Q~P zqDfI_(gRMfjF2>a<>`ajb-BSoY|kW{pa5{{-PRh>?lD_mj1lV&j97gj#7M6C28Y?M zucrS7xwh`~n0&R%W9_(x8ZwC{LTJh6*eE{XXkrwCD?uTrV68m!lIxG=mi5H^$3m%8 zNjOLXq;r#;nTob4H>ZL*XPWF1T~eMK!xa zg5eE5Z#Yyq2}+avLMVYAtgN}ZU?{k0R$LM)8_eX)97&@TBay>RYpR7E7O42Bl&tl%+|UNCQ0`7oDrVjk7)1WUi2S zcBO962Z+*^qV{p_q^$f<*{PEP`cgN@P>6J3N1=lYv0}E(1pd;+}FrcFh zy$I+qLq`BDabv3{=kflT z8${(hqUA!bJxWJbw8r)ou4xoFDx0Qso`CQp4_e<4deokPM4uW6NX-5-0EyW@0BJlu z;DVId9wk`J_ROx~%^|b%>Y5`Ho5%dp*i-q~t5F&)Y8okllM1~ONN=>TC{jn029dfH zKq7VdfIO+AHCA$J|9FN|2kpKITiLLYP24%(yr43v0Sj!F^(5WF|PzG@Jggj27Y ziZ&#R0EIQKv%!v@uCqFaf%I6!=_@Yc&T|AFr7okna}2xEO?qD0rA3Pt=x)ihpdlf- zZ8$-NjTXtcER=^XC^$G+kDs9{`EV1C0-$4v8aOdUBk%XpGjxH_7^(+E6JDc4s&v|J zf&rY0RzUEx;EkMK{F5H#f@fVDiw+(|8EGck;;MPCR?2&Ku$8XKxlIS}xs65!?L?U% zs1ubIh*>lf8mUAx83#x-lOjN3`Y;EOXZkQ7Z{*ZXG}M$>Aw}ydn90({MGLhO=`200 z_=zss7LbUJ{5@(6dc)mQOosO1VCz(DgY1;tsM5hJt(H3u;`7+qmM&1Q$%S#1He%M2 z{!_U*D`{O-wY+%uI6QqDX8Fp2lCydFsu0Ptb`8F|PVRE;Nq09Ve}`$!9;qCg&iK1y z7UomNH77~*vsa%83$1ns)#b~FV=u~vd*xc!$<^h5Bsg0^I$W~@71)rjKj^wTbH%CN zhkZ0(eWB7sL$s0lD-#QaBB8aK5-cMT*|{A%A{r)PeyY@lQ!u^RcOiwoPVeQgY#Wq} z&ttj$&@exap`QT>McPF`qL!$|P2jK8;^?{zBQx9a44L3JQG5knXS|WqNg=#f@g2OY zs`dfk0CJAHm9hi4u=(n!c+$BhhZT%r776xKNc&994WpnX-IeUwvQk(>^G`7;7^*=O zRT@3u)cNOQ93{FY##9WPXIwvqHLb81B-^c+V2y>lj;b>W`)5b7!9fllIbJjNG zRi<0j^;T%Zb8LC6-^k0?7M~zn>`v#kAWVBa4C4l*g7gwLmOaHv(2elh&wi9fbt9I_ zCSJN$TC1+Q>RXm|^X&#g2(B@%Cyv;lD)}|A0MXfd<@xJ{F9e`N1 zaBM_gu%@o??!vu;IDG^|v_L90DpJ!G*(Qaq$TnqEWP1gmZXBW4D%p0UqRm*bGl2AV zdSGo5!7y)%b|p5qRBVEmtKQ(mIU#Fen#~y|w^US@E#(j>E)}(<;})LumC_#2W}jlsYk@AU^v5Hs~)sfe5VrKO= z%lbQj(=>-*e)sjDOiXlT~n~Tz*;vD zCxzsRah5K`7Dx*t{}YANBwDF#k~iBl-mE1J2`ehRu|~`roMXjyy#g8y@-^1!jbRoT zafH#&7lT<19%f}PGnfrFGVIorDW+sj3r#GN7KqDAJLU|h=JkViyyT9}%URaGmdR$^eU{Eo%si}{;sVNehnj+Lq zP3`IMMKtdnS5*uUjUsBO!$r~fqNpwmy#1X8qoBM3&hF&nW#xhb|BN>S{rXiZR z;wELJh#Hz83(066Ai<7YfP_3mY6k&50mvg6y@EFremG5oCoUb-axT~}CEtLF2i-CfN(%% zM|Yb352|;u7;vq9(f{M>iB4Gp*uv?^N8)LKuqw-K`f8L;SSF23R=L2MSU~5ujFrWF zek=Oi=;5M5_jqZ_Brv4Z$OsZMGV}6_ zwVn37e0F0Etw@nl$H@0biqVM*cN>0G&Uz`#M(>Yv9&uKeCktUz=~UU+D2%PfT+>3D zckK+XxeoZAn!X-yBp|6ZeUvF7O=d-C1Q{FsxTTZ)K@kd806+?-2b^evFn1@y3-R2G zgx9%Q8*i8LkWg74x-`4j)XdP7Uu;7Y`%;y2k(dcXhA_GQ3SEsg{qd@j8+r^&MO%!W zuD>uQngLk0RS-ece4L`TY$&slY%GFce>)hr&yh)59Chuq*5D`)CIEF`s4-@NCzukm zsEz0==QV00qb2o_UmgzlVWAXNk7gAGp>T=!sUj3=6okU8xXMf&tu8d$(~3i0e8`W^ z_>D%(pmb2Xz_bmAkmA*BY6tvO4|VB4ZbKW6w6hdlP-$^jv&317lrR+=T013+_}q{c zIcDsx6wlmL{fKcjb`MT};IL*0ZAIrZ$~dfPd<%8sIdIz4Y14|IoLO|HHC-8KhttY? zI_>9b^C9+Y_0tyddtk1m9Ml|&MfH3f)GW}BW$~F*t_dU)gi-C& z^^#QEIK1Cf5S+!`jXIz<(dbNWvKBEEppDPtj`lf^8&{du4QHX$^5k>WlpYig5&zrr zsZ3K&;ts7$qto4SO&rE0dUSBO2=zd*5F%Q=?5;!-qcV2d$v6zX%0IYc%Sqb>;YSQ?1EUFO|7;#0Udd zlyf+VeTOjl-~&p-WgQ(d52MKlXAmtw*(w*(XhQ1Ih!l8=XI_3cdm1)tQ_6D7c=)b7=0@QhBS}(QICvc^6o#!>K zaxIweWFHazt)p=?2tq3Fmo}NOWx9E2JA@L#VsAinj=?6S14?7DjP&T~4AFAD5HvRc z5@I6>nqo}b14zuDT7!ZZ-MRx3e))iemTaL0)dQk^el}j)qBon=3o%_}h{QC=Ejs$SEej{(shIGgk{AQFp_bBt_%GL)%7 z69Lf;!A5B^pe%-_0?KA+CZN#_%>|Uh(0o9-3@rvkGgPDG0F=kjQb06UHA*W0jbW%9 zPzFP50nu6_spVj-8E;4&&Wwqp!rPHH%vixt+%Xq0SRmVFB5^e z^q5eYX4aT059LKb@#_9%)cv9KLDxS(=Mtg*p`I1NJquk2q=jt>Eest`RJjiyPb7U& zxU-$=XP}Kz7?i_#P^O_4Yxb3C{gq^p4oN+x=sUD_M!$`0VrVTaB6*HJ`VFk&lPu0D z&-0zEE9aEQD(955Jc+Iw;ejdlZG4X@Yw7;Ko>CU6`e!Vm@xf)%BZ;O?3w?dKInbQ6 zIetc-KnS)lQo|#Cpy(1S0f{c*1|+(~quST^0SRXC6Cl9?OlS-OiU8D~W9tcM07Jt8 zi8<~lK;PhJlP2LQVp{@8(7PYdKK@FobpgEus4r8YiGqNLWzj;rk=N$vh=x(38EY&< zG-IX3cQIof$PjhSc!o%>9mEh4&qqbzfevEgRfKJL5u22`fADFq{5bumyld?scCGOS z$Cb@C6quwNqCG9ho=d<;PBOeMB#p_;e7{4)a}oJJazjU-pE10!A*!1D`-NP+oQfrdAsc-E(qac ze=9(qkTgn@Lu+J5O_)QPWB1^Ey|rPiB@Jo;%(Be9R3bJ}&>Bj)C;>>v!Rfh zVliedRbHQvgy`xsFioTscZ7;~17Z`oOVc1K50C0%I;V%aMLSO1+ahJOwjM;AjJi@W(V{MQg|YTM-0tp7)gfO3ijb%Zn0PW+)8 zuv$6}g%HvMt07Y57+v+Lu+W3<_O3r#JNlwq#?dLnh6XajvcnxBx3g@^@!K=ojP%jz zaac&E2m;!Q7guPg${|%#id4CD~GPZzi_nSmU&7E z8!&UM3yR%?EMUvuLu*cvZeG8my56+rJAmcOOgU=~&@rX->hDZ%lZGJleC(d;@0ww9 zl)IO*aNborCKP?W`nwRYvKK>F%28-QEtkv4n=*!Np#x@ zfJDQ71kf4ABN0Y)^eR9-n95E-*E3WLs5e9V0o}mRK|nnj`V0^)6Bs4hMnrQE4)ekVmSq}I`y*c4i{SOQdJ(+S4O`VfOCmkhsIqmQLMP^PyW*j!@%bFVK!PC#k-OPgJ{VleG`N z4FnkMaB38(6FE}Sm}yPSw5>9WWb$e7n(c(bn*hX|k6uXwNsfc#|A!)%ypKOf9)%6S z>L~|ziB&!5kQ|0B7T8iTDv~x+h|`6nv?ixhHtdt$0!aZOIY`d5W0!_v?W(!hn*jsb3RHOibhRO2Pxx(c?K{NR_Uw=9b}R}q-M=VTf%y$hslL> z7}u8dQ0$K0JBF1b;L4U8bK)zLbQ{v+%l}xqBz-OsBcmi;icOUnkua7R2^B>{S*mJ# z!JU!n+8HkAM3UM9qg{hLyjIRgg@=27t)U@35;j-FJdLQVF4k3Mgyn(6*oHE@N&_tv z`V?5Xv~Mtn6}cCN(Ls|0M7)W4%Q!$Jf7_&0fP_Jl2Q@zcnuQL%)RMb2$@|0;td!eu z#D-iN)a8EK5F<99iWwkjcgWBW%|x;9#L8UF!yPCc^hw=Zc~Yefh8E^FM5<&>n(F)v zuqEV&jh=Z3_0R}0XXag?f;}St28$KS(Pq%Y0P@)Zg-wXgEm!s;<$nK(vCE{gP3o_IOwiqlb-hnDm(a+e0T71 zWF&WyQzNSpk)iOgxfb?8cL*wW;xFw3w~H*@?>JwwTWszA#oP1T?^fUtoHezeH{6yt3H z=qTmL=+Ql7cH5pEKj?VpuA+pmx_*@N>WVl1y>-`x;cXu{6ZzWR7oO}DY5%kJe*J~cO2K{t={jJ}d zyO&%sue)TP_gYH+=ojw#;GKIXem6Axj^tZHqmC8CKi0#pTWx>6?Tqa2L%a39dOBj@ z@$}5Xs#`A32zsmQsAGj|UNJ5B?YB<{T>Z7c_*&*Op(WC=NgwI{xPSDVJz2~9zx>q; z)8Bu3bKegq9i6yoP2QxOC6BgU(e4jeX&mt7z~JTQ?{8Bv?dw;jy5+U4S`R$FbYoea z<3GdBwoi?yd^EkP;Datl`yPMqwcF!giTUZfPG9_ZY+ak+bIVhH>biN}g*kuqp4B$- zi$#+jz4G3i@_+9>?#S-?NW;3*neyqmF|mL2EFT%<9P#4m__A{?`c4ji;C#`G_3;zx?ADNd z4+OjCZdiQd^YhZ?eR)Tb@voQOdwlD-y42eijtw6jcD&)g9X|PC+8*6ULvPy?eJ1RQ zJAbWPyy)xk_l4b`J2T^>mg|C^OdWFH{eMn+Ja*mo$*yq6KKJ&5L9({1~ z+IPF!lVAG!`)Tgw@{}=Cy2aI4-fy=!{@?mv*0lfQbkvcTcK%*3y>;y2F>_i)n_GSI zM%JUB4FCFE#v|+6ebM*$;;%CP`tRCbW|X{CdFNNlw%CkU<5P^ChaSq0Ie+JrM{JkZ zZi@RYXU5I9ADxl->j#~V6x7bLyW5|ecauBe_TZHNY+LrjmAfW?KJk*i+kD-rk7o@E zPQF~VXws-}Untx3m(h^aY{P^9dB*;FX7I=qW7oyIx-EJB;o&{sxp1b_zM&Iub1qo( z-&2yBnUE(B-echQ%L$JMX@Vhc9g3yUW$$&v|p( zeOC9t#tu29OUZfQ%9{`B`~UFZu#OL%-2CcOPpw$d{Qj=7!@k;m z=i%g{erNN)-T!2L{ykGZop`(TnMpstmN}yM=#iiA8rSdmY`MknwU4-$FZ!k9>35o+ z>@oMi-kYM|cJPs4^bfP|8oRIm zsW$I@`F(Ti^fQlNxSHPge5+rNB^Ryko;ldM`NchkFSc|aZcMu2=i#T$e-!@NxBW90 z-qJDYaLPlSUVZ%6&ZoC$@BirS&@flG59`iPzxC|zcRw_#xE>yPv!F;@OaQc7l zd8L2d>GfHM-`slO*R(a;FBdJp{7RpmCw6aNyCJc2;-!iw+qeBW;??Ymfxoz0tvgR=f-Ef5_WIzKc77GWb%fA_e>qzr{@D*-mL4IRy6+W*4WIuCw9ek)|RK& zecgP)fO|G<&tLFx{K@4d*XI}A82TQxJ|);pyzs&@B7-_>D#S8 zj~LdaPpeVmo-VG)>KMLe*1pVJwmVABhyOJ&{HQr{%)KXm1mp9pKWFsGj`#n$T7!Ho-La-yl&TRQ%3E&wDspZULEoLlJ)IJhP?Xh zh~)hZrA0k#zr^2p{~Y&;F6~y$&flva^=am~OAmju;P6-HyVkgGxU)^(ug7P-aq8%_ zMLTwF`y~4G*7{a6?tf?W-ZfiRzi|4&TYr1w#kAH3ulr*4=tIA(z4ctq`UU$JzVX2O z?%U4YaQeeuIS*`^Tm8t^=Q|vmChfaf-=b*wSHZ391<_w!`0(h(PjgQhe%$xSW&5)^ zht?In-o>zF?7O}1vz)rRe1-GdcWkvios0hU`qq>0tT?)9<(^}29jtJdb^M|EZTBrW zx2f~|mDdd%m+(Zl4=?`pV8ciA|2z4XMY>17d}8;Zjb^jqjxMp2+uWUQ?-v{YWAsCH z-9FzO^NqRf#21eijqmW@yyD3@cP72jzvKT`*_8msbiLo1%!t8|s8rEZr-a&Nu~V5W zk{}{Mf>I+ZA)91EERB#_#z+@!QEgRQlvY(+RaLb#iqb`OuP)kOH_}BnrP}6yzVF@l z=FQwp^naO``_4P}yzlPIdo%ZPVV9{nr_2T0HVs)`F>%1e)tASeh;I_JIdxqBcF%8n zCcWg3N0+ov=lcdbZE)WwKPPj6*+}1fG#Tu9xtY#B;oCH-Z~aZhZfmQMp~GlI3MbF_ZC^Fg{0G5(y=n9 z6OI(GS$|d`kZ=05lyt0;4y}rsjI@ML_AChqs*rW)fq{3tT1h&T3nt_3I8uJ?8M%Co ztV3&j-a5gO4iy)r98zq?xLOv;I&CDKYa|_-hnS2n;z%XnqxJ89E$dt>>4Zo+G*C4e zX~;>Xf7X+Q_scrhNjhyMop#K*fFs${qUDn|S*Ja7^yRsoq(ddyWbB2+p^~)uwY#u{ z?VIoPT`BK$?jY&V!lB8SK}USv9BO-3)}f)fw@#>}Ln{I%<7+rlX&d=Ums7INjgn4B zNyo;V4{@ZL_EADLFEu~Fa81$~J(^=B#B8JIw=-r;3imdW7e_B&b1<5yJ`jB3Y*ImxtoqTW5%*GmJS@gUF3AE^VNlzXeykb%segR1ZwXXdJ11 zesa8!2w3*b^)1 z#50F_1hVJuFKQ;qIwK^Vcu6OLIcohHmV6~$*5T2J*ElLc(n(?+YR$-%eD_iV=`#{n zywf>J(iz1ZYGEi|E$_eoPuZT)lFleeCt1^h$8c}$$k${YjxtdoW--a4t0&N${Q!;!2we@DwXvd(x(XPl%n zfjQ@Kr18ebGcGjH527ge*fT-W;Sqw7T1Bc~S3Z9j2KuJYL`f$@(n0aXy*QQNJ9Eu5 z7;^gROqO&eNjkSOr;v{Le0HmCiL5h4(z#XAnaZ4LLg%kXW?htZZj*GTN;<4y%o938 zpG|yO)^SKW(9wB|iC8BI%Sehx#2#=h1IgotAab z#ro)!N;*#F&{wf3Uel(hh08kSl8#f-nai9JIFdb2{}HiW)|n^i%$0O1m~#+EY7bkV zTCrBvnJ?*7NIDCc(*j3we|74Eg6W%I3vtD}onIj7EMg9oMk+t4pY;Dt*128MStRLH zGG`r*&GG5<@svZd&SK{1%TJ}GQ^g#5`?eK)hyMEWPFZJ(q*Ep7EM*QovI&K+*}0{k z%R1GP&QeL|4(9B{k;-%biy`mJI?E)TJ0zXu%o&Iy`vx+&Xbi`*t^S&4q_?92Hq_axWS>ei9y(J$_{rAQ$Q)lCs(s$|eXXRk zo;m15Iloq)J$;?5^MItYUeejXoLg`tEAo=c|CV(glyo*oIu9`ijSl|;!-k19;j+%d zlFmbt&PL|6#gXjk{6q9Jvd$xt&PGXR6LYfYh|j1uerrJIQRW2WNcSSQNz!=?sItCF z*8@XdZ=l_HoH=@($0VK2%qhW<>Q~{Z&roscuKIbw7Ut-6HcL8NnM1t>h5qc#Cevk| zCzzwx*(&L5W6q~IQv1BK^*s%w54uL5a=1;>d6GFa8Yg=?b~}j7@r~D0lFpNo&JO0p z3Z3zjo|`A@JT2+$kaVbpHyQf~o#D&MY_blb>JzV>lFlyXaEk}uzQ^6y%R0|WI=dvD z=a^H4Bc;kO9p`=_>!9iPvFABSXE$>?3Z1>_{U^&hFGxDOB^_$vJK`9(m5dM9AZuv97$(u__;B%J%^d2ucwD3 zomZLD9Y=DZWnIyM_@+-Su6U>OtCG$U=8Pv1xbpGENwUssxZMQ3uGHH5xVNA58VF;Pbdw@O1=31owY&@W<=yIVu(C24YNG=zRA zf?Sq{(09|wEzl79jTLfhHH2m+zj+}Jez|NE+uRAtG|s^YMfqbmq9LsX(nCW+1+tqF$BbO(tnxzi z1N5`Nq~plTuTYWUTBrySs;hBU$v{0XlP|G#sJAvG(gvu%|E=Zs-v}VBROvnTUu_#DUegVq@+^HaW`OdO9 zg)_{9#8xmggc0)oA?{V7Ax7#5;kqfIU~{C9KA>@|f)lPG*9)YNhV&MQRYQgeRD3r%3oVl3=`8ma$??*Mx3c=~6A@>U;OhX~TH9q3Ez4AHEmgJpyMLD$Hgh zLO4`E3PIn7_HZJB(3dq{>46cRZG(4k6=vJIN8i&&`7Wt(ioQ73i2*rJ$9_dH9{*NAspqo*9N0o!) z9!1En_|P1mk%%ayYZg+hN<+w?mH1$pMoIYyGH8(=;k@W25Z2+iQ)!`4iZZ2--3uY* zL-_EFmC6|FgbBo>6R$@&4X5i7PQzk7!f8l%CS}&)G^CNGhG^x`gHVc*&So`Ke~QKq zq#@<2r_}Yt86m99_E6)mA$)gwey$u5h>k7RPy8B&vB!V(*C0fAya7BqJB|ZIe zf`)L(OviOXJUMu~9^tz$(<7Xxx8q(~C@w#?06ju^G0Y30h>iC`xFDiO*L1iwUh9R> z?LYQHC{!~M3${6m?q$;>TsEw*(1|NbStZWj_-F{ni&{TIL@vXZ>xJ~g8PybxLyf56 zb3M|J67erDgz~}*A;54gJ{$4jdvVGS#~FQ;SP(?5=q?SRT=qgDNQl~}Zuls9N)}e> z5dsW13dD0SN_`5&2$wM$CTR$##zZ~Bxty&>IJ>A#&_YE}s#fZe{uJy2a+z#r3;R#AD(6dW0?fPLHsKm-Pr+XhJS)I&5JVJ;EguUA>3HHq*|MTBr!h)b)B~ z09p5n9^w8X8E7AT*yad|h8Ge^sqqm$RKu0H!(+HvAfA-B>k*Duq8{ORIrRv~Yo#91 zT5P(PVh`PYx1PhT=s6%0R8AztlsFynVGAQErknIgKb#nB0`b^Pc}}4`_oDRkAf!CZ z3n3wDNi+_RCH4b3ijQ)4is~*s!gs$(Aj-YyK6AVfviS);!ljP-lwLqRrS6Cxi6RS+ z;6of%j-tD_5*$XjkL#}?xNPW;c13jo2K_tR#{rv+*NclG_ZD3=P(foCCqfa&JJjny zOvXTkW_Wl0|FFodhAJ1Kh~pjV1c$PSQ2*|)yVDb@MuZ}ccc_ybiqenV7kAx;MoGQb z6CxCGyhFVK#AIwvLEtw0+P=Lf)E6QYaTKM$1VUVIoi~A)jH=CaT@8aVok#%UAXN6u z*<}Mb>kV%KF&RtL1foFfLV-l*7x9cHA731!FQeh>W%lTZ=xBV`Y;JyWd6^!!54I0B zMCax)p`bi-v;!>6`0aeb0c5NrJ2$_epm;{4K{+kWoR?Xe@0`h}V;nO|i|1vQS2*}| zlA~;Xku$R*x3sjll#$5}7*mRGuw~EY^U*vj(RpJqdnIAzLQI+WX>6Pt43j;Y+9_0; zW%3u}#5pXcZ`p}6%$tP|->%Cool6t{GJ#~z%*~#yH^(EIlV6rSGqZF?E*UK7bR&Ep zk7l%b^FSDRb zJuh<>Bl|LyL>=uY%f;>RHNzs+Pyoe6h^U%Eykw)8>;X$Mo!K)B@Wn!LPd;}R&qO$Z zAW^e3)yr55D#*;rRpX(Q49$3?xhhj!<~e~O&djWW+_L-yswg1cP4n`L^2?OcL-8o| zl$AI~R%U5wer~B!n35=#e2WZ6?ws<>g5s=M;?!A;Y|EXItHwXWkyqfCP66kV!aBtA|HyOn$d{3T9y#UtlU!d zEU%!La!!da0vH@xf#ww%-Kkol>0S;5%b~R=gM+?<>fjg(Td4Fyo@g<#RD_FiXJk5a zaf_UMYE}#mN;wo600u{X+4wlcBwvP`gYiFH2f~ZF-hcrEY__PVhyern()8xZ#zTf{R&2=HGEVtL66$UAU-6>z zzW9XDI7aW92dj^@$E&ato;V+#-4GnBA2txzh0lu;&u-U$1&eqz*tTOV{|t@i;V=&} z*n(51>mR2R9*obM;Cv={7{M6q!MLvzbug@u)|=R2)L{4yoN}9TPF=V^Jr_6+2%bMZ znutLWuJ;l2N;cS{%+C-EWYFMqq@+C;%&A`brSyB)lm ztLRbwt^?<+j^|JBJUD;pcn#%8JLs9asFo>z{pp2**Gq8y#diiI27vRh;5C-N&w_LK zDtcMaI|)v2N=UfI%HKe65_P{)65N;JkJfJ?dxP2IpTL z&!2sk?)cIcKIHt_*8|r&fs-tFjg^<_;FMfNkG6SS0M7EBd|O`9@@L;9%(G|GTpP}x zeI0PERB)JxgFn61;5~E|y-o3G`qS$S zPLz(A^<(r*nEY~Va6c#YY2 z3Y@c7(WCC*JUFdrEe@`+^lJxBHyy8`^b3UsttzJIc>dx$37nZaUPF4ca8?S=7Qt(* zJii3a>sQgEX8v7pF6(&y>@#8gtqrZg!THM%O1~SxiP7==>5T?wijLP%e5pOi1!sle zH5T6o!FlQ`dQU;`1#qTQLc%rHzpVl1F~Rc}-wbH%04G3M`@&L~|N7PzoUVfBPmdNf z!@-&PAM_T1v-&D}=b^V2oGN}?(RhEk5uBZZ=g+>*(Az6G@Urulzh}U!yNcdADEtA= zYJOaxEHC=g+XT)o!SiPy72|#2)cps&dT@ex@!o%Vrtx!o!Qsf_;LpB6;3Zu}uPwrl z`;U4v!K=86-bCmv1?OYIYixXFMB!>p1q{w#`UT_K^@77h9Q?(%CwN1zqDSL{5&u!o z0bcP{^irTVADm-?*I0c!15Vvl^lZ@kLvY|_=P$n3;vr5Kevsoo{b*Rw7o4d&o2aGa2365=v@S7GQDj9*O*=*IJXO)Kl|oEV+A<>{s+Bl@bs$_KIHuA(c`dQ;A|JX zW;pkkzouKzU*bc~pWgMjb^|zrbUc50vEYo;@fs>G6QDO0oLz#~SpL2R&gWOrqw&G_ z;ItYJ4;;nApMCAX>89f~WS;}!Bf+^x@EWu48E_6>MXw$7UKbpA+4-~YOYnZVie4uu zTmk2XXho~B@)rS4jNtjpUz&f62B-8t=q(3l?N#*7KyMQ`3+;-1jkWiWgY&%L`Lk~^ zWL^PhSPVRHjm0+=oaut+Pj3x0W`Xm!;5C-N9b)nO()f_`r}qG^^#kWk!D}qOe}K~@ zj^+I7IdC}$oFX01UwNqjXQhtUP?A7ra(o2NitKc+CfCsM8_=3|}$7@KB#%sO7xkK;*aPH5( z_26u~ir#XBe-4~MWGI{&AAfq&!6^|uf8{R~;TM2&Lhu^1?{jc|x{6*l^e%xjB?%t5 z#?mhroN^tnq4W!d#$s?D)baeqcMCW#=y(n3QT09uPQXaAu5tUU;DqXU4e8PRqboQQ zbv%FeWr8zD$7@K>3cZEktkCiN>D>d)qdHzgdKJ)n3Y^ZP;DIyY<4-RJoHW7nS6-?R zehN5e1g}XWdM&ZodIK%E!uiu{ifcE6(?`eiXWt-jl61U=;!F16>9Ap&CtHy6C+zIwW! zw50HKpSykZkS=!L=b_Y2+#~VAC0=vz?)?uu3wRGpJUn03y=Vjqy$5F4;=`j~gutWW zzVRaxV$zc*B#(?8(g}ySF%vp@gLs6V5;JDR_)a!zHh;lq20q=zP6qKqrs92q8Ks$d zQ}GT^|9(^Pj>puw*%1S$7G##>_n|jFh8TvmHguxj*luI688R1Oyf6Na$))qepGX^+CG$)3 zXUv2|Tz6Z<;KBWRM}|j+6Qxga>5N{s)bzOC{DOUyEX8zy z!xmH_>_O?mFV^FS+B1Uo#8|4&Mq?WnXJqxIuGm;H0>3qH#TGY#HL>+W50~}E{elmF zWj1}_3Z|cM$Irb7xWf064EBp?Mr8LKD{&L7rDobw#2tT+bz;r1dz8IGLR=QysNJ&H zolUTRrOW6}80K)tpSpw}hHolVst*NEtEG8UDC`O}RKwSaeRPvM=>TUI8$1NC?Yblm z6}xm4@YZs)4MNrJmJv>?d%U%#%oJkWlskbmQZCwCG4?dBTK)p zT8tP)xHGI#XIwp2jWAp7Fw~u59S=iX*je?^+0-=8K0DP3*0Z!nWNmu=K*huitNSAe zU5rD754dA5xJUi&GPy>ZSH)gh8Ap4wa+$l{9dt3qtJI~b8#`H`d4V-Ov5Q3v{@^%e zz^BA>EqtDGw-smP)OgabxhOj&)R&m+!x2#{+lQSSxD>yyr4TLakwa#)Gjgt@u+jEN z*m=lZYNgyOzxHT?#ZVn<4R*(3TU(K3wMv!-x>7hx6D$&eG)2dbTLki5=*uuoX^(CT zeS}@uW2d$m$V&a9U~T9Cr&{)J!@;PoU=Ksom0%QqEA7$~1RIAYSr<30i80lfmx_H+ zJnFQvOJ`_-;l#QQ4?yXhzBMa$nK*vD#5iV&^Ifvk2v-K!M0tr?^L}N`w`c-#8xXP z*-CNd3XI~63Y>uAkYKGzI$M3{LYk*ypai3)Vy~;AkXLs8qx+21Zl;uj`xRr!Hte?K zP7QW1-2{qj6&=|;S|cH+rtm^F1hsS_cD56VIT6P7JcWku=06jr;t6Mcc}I6b2<#7; zIL?(6>`nDjLXg-)k5!6&@p|-33EgXt4Kf_QZ0>oi z`fwBMW{&nR>JYYjGiZ$pHu7-7Wb5JY%%-;ok0x_Q!<;F#ak%G)Y!BT%iwM@qQUM{T$h8~DO8AtUM_Fqpnl|HEGl?&Y$I5GXwcA8&N`%4 zJKD*xEA3=R+ZmRBG|pomlBTgUD~wSpG3B1(yA3{NhsxRT(U+M*4D;dpS&L3J&d8ZX z8?la~L-mM~6q^fHT2s{x%q(@CGu-p6v&3em+zE3raXg*0UKy-(P*&^-^X}l4vjW>|MqGJrgUN}oo z0H`XvCz@RrSE_l{Sj);J%k5o}@OG!o9fwB5Z4r%sQyy`&z&3ws+3CgRWv^FS)5dB02%`RqWKs)> zd0K5#-0nQzju!Fj*cS_*CvntqzX`j;;DX^vHUX6q+v-@WDlR3Ihf*40P(^?EQ({dM zu?$i6nyI}B0e@m~l29M5(}0#7eTkBrGBa9pNXD19Z`e93q9sGtH`m5_!_r9xL?>_k%7zrB6BBCd$7LOX?m zyfPuJF8uH}%}qsCaT(jqV^}e`!dlr(y{#GK5HOeh7<4DauBvj3C1}}2*iKPY?}#cC z8nmZ!`~%frnGSy!KpPkatV|fMny6fz;C*$1xQcLT!dq3DVsthiTp4n(1+<+_4$^dp zw9#6bRwj&v*9NbZgv32kXBkyf)f8$>MIUs019B69g(-JSpJnh>u70~-Sekb?Ec<`C z8^CUXraX|pmPKFXQ8w8AjD0n@s$loRr&NI*8up5Y%>?^P4)LnyBR0La6lgdLUrYAU zfR%oRBartr3}W98z=GLFZDVWp(IA#Om_Tkr+pzC%VArvay2KFnnQ^?9eHI*Pi%(@( zL-!>YV6gI3LAcAx{C2x_1&G4V*viYm+>QH3qE ziLGZy*%D!tmYx*IN@e!biNxTzhr-`2tj8@Cg`Z_W>oY5$zNDLwwQB7WMn@z;8zP4A zx41l_H{flbt5b|1 z-N6_qwL|g;)+Ewu!a0l|dDd_GtFA9DVr2kRxtbVSJt%v_9ly%zu0Tl`=8iw^Ss|!v zf)xVib+m30L<5*st_&W)q*$ustid!0_0)7btW-u&1@L*65$HJ@Ikl`D}cy6>?2uupheZzrd=Wh*&6HsXUR zJR(t>G6=LOZ>AJLY=2i{4bwK&vp`=rAnOLXUm>I9FW#ME@c_}hEt3sIa6~jLXqXvM zHTjLI?<|adH9(#qQ<5b@C%~_cZ<4uK$ETWNLrPI$sk)&`=xZBQ`#-f9s?E1r@2F#= zO(H|EaU%_$Lb<6$dUi`yiYE&9u$Le~lY9HJLqQ{sqmd0wQ?Ft%$hNG$Jlj3mn(ofO zP<4Btu{7O1IyfU0oxmKW6L61#O;)te{b=*TITp7?DTQ{_L0XaPH|?SwBk54^#3&S>?$iNSge{uq=! znYF1^2qGuiTMV>mh0E$1jA3>n&8jF#=hLi1ZII1DFD3@&VGXYN-e72%FnFxRl(qU$ zJN6Rx6Em?Psh zJrhG+38C)9Nv?#DRf*^uCt0zR>+w8yLZ`gWujaKlp65#GMDbN8an`**Ln-g3gie^R zyAmg%v#7K6oEVC7W}zElYBQ5!G!ebJP3zFF)K9?#e=J!#IE`l1X=VpiZCXTAruc{8 zqouDv!wL94&{F6;&Zq?mG+2P)sjHGgh@{eBU~X#2I6xh_dz3Y3#L;OhvC4~8GH%p6 zQwX>K1N~aK!LW$~Q_bORR;|mtvXQMMU9{u z&_WZZfq5+@(OWD}(=(4e6?<|4Vte+DERQ6iB_7@b-GT`6@P)QuRfY%@KwW)Pw?^Ke z1Qe@p$PG@?04+0o7djtRZ=~F0B1(EN7ai4ZOI<5n+$dsH+g*cKCDN)ewue;`QdwkB z1DR_Q(NER}!9b;Rq!v|Kqo#N(3k{>-^P~VhK_I7YP*1-ZCqCHdnj>?h0hbS6t>dSyga1XOIZ|abp_*|Nl}MrK@$~b@I9Ns4!Z9U z*BqM&smAm%#cFDjXc~g;nCGdp5A+b|DRi9#t^SBCxP)LzOGj@vk_#}}8$^yUS#dF{|9N#-F9 z#e)(577~XV38jQ~htHF0^KfRy2Q3?y)$ME~Z1WmHtMh=ve^*})o);0c$AutRy`uFB zgBx2++nYX6>o#D*YqyHOmfCtHiLp9}X;#$fT67-`I-@zjtaGMjU@4|{f{&IQ0`asN zLnQVk!S^GK48bqM;tFHv{Mr0K!*uv)X(Et+H?1lAW&&%@K6v<-TIeqTc6W1x(f*rf zVQ~Tj92+&n!Rq>9a4pZ4z*g!ul{s>1@aH(VHeOT5N`pj!hg2AS)W#0g;7F)=6rAYw zP)=L(77yig<0z{C-*S`_;QNAoWWxkHz^Uul&$BHkU?@(ZE^`=0&a;dZ8yiYgNC0`b zRAFRXOK+%AB$Qauq(CVJO4GfYmAGR(g_RC|(qKC69&4@1zkua&Jo63VLK|8W`i>Z_ zRRp^K==n=sQ}=H@f2sZ{IAgprib}6Z2o{U!=>n=g62^;~cHHzYjtsRaif_E;gU8^Y z0~~rQwsVPMmeTE7(U`kp%(PC6?#N~2ww&52a!NGtMMMsPnE$^PmFn3l(&K z>v49I=>KO?$s_8!sI-$s8(vf@z}$o$@>VUxv*H0hi%N+XQqf|xa}|WOOC6u#yRO7f zcDa3^)ueyiZTu`Iy{TJFN^f8>=`MHT1^3wB#lv)Z7Kg&kWq5yF0X`7X)BMz=PA@@a7IN@U4?p<6G!(Hy`5+@v67}d@$XwRx<2T| z^uVDfN?YI&6B_Ufw31FsQfI_t#Q4uFuH?_G^k6*xGwMzL)06SNxV5q>Pmjly2+V@d zW9(v_ky9Uq)0#dW`75g^7(aw4l>h?>WTE?`iwT#4FvYouDb3sqL3>7fReY34 zjO5zQt56KnLJL{=({9;CXBW2#vrwC}^~D6dL((Ecdsb!5sE^X-E)-Zq zK);egZ`3HWPg*iM3wxCoKwU|}0t1)z7t~~@eySZU_lT%yh4Cg#aH4)puZcw=j6IvG zRqhbnS$R?6-IQ*@- z=P#zn!~dF>U97wg^K3&3E>#~6b`fFmPj$wGWf$jn$g5sptG~UC`zU6jv+$hWlLHVi z&ZD8zSlsZ8mbz*~rjAV(vk7T5JG1KFC_?nqt`563nvofKhWyLqZQwlzJgh14Fr&?A(q4yd9(Rvu3No@;q26Cmsh{k6L zkUD8{FrM9=4eKOXsxG%JH{lsb)#beMKs=zuh)EKo;SM=f>>d{5{`fdY&h$FwkXRtW zdj!E~O)#KN2nl+z!d7EGp*_~H=TZyI1poxc&62W;vZQ?yI&(I=hxs_)^oECN0%`((r{3KQ~k+D28w}z3W)L;d; z0`U$B@}QO`sF(QG1L6BkGlHh26ju}ek*i@Nd=?WSunNidWl+^+v(sL6+2o{mP3U!; zz+)VW7V|~yX0;xk>Q9$TF|TgXg2mFnQORLwV=%UcHR8QIj;+->03*4!hln!g3K zJvP6|Hjf0R%*bf%Ou0%XET;pU`l$LYj)!+*V%F@Pm~F~~F{S3!9s@3#!|GaktqWsp z8uFPr4397ZTt@Fyq%}3qB5^9t^r^U-?>?TQO&_%;teS*I=A`?b>aU`!&j;Y0i}OvK zt*XxlIs09#wU_s$S48ksrTScevvc*iCgnf7EkQ5F@UmhvWm)m?6m?Y*KDS{?ZFAh% zlL*;3Bd6A=``8Rv;8mkgijsJ7S$Y@CcQO6m2E!}uB%2uqGZiV#Qj4%uGZc3ERMQ07uC7her3SKnhfT;2pvuCVH|=T$t@(ywQeh-ZaKc~@Z-i*m&^FQZ`% zzwgiys_3yd1DO;vzJWpN}w?SlpLJ{AGNZIy%q40Q>rPx zRL1to10Jj;(*45eel*^qH{>ielT9_D8|#`-hd`_Lp<+mp9M(-Uj$Zjw$ox88T@zuO z%Y@Mmjd|$3*%ql8+BnDiK@lyEDAo>vPl*973@BJRe4c)(3TNb+h#}7jj>~7X8gHnj z4C$(6Q&Ym=z+ktCsprT~&^tINy$J^fqNdL)Oiagn7|Ig&(4U>d(ei}2Phim9eT;S4 z>B>IiGosG8)2%gAf-z2X$9K5kPVVr#i{EpM?{EoEB50AR8gFvo)u?Gx9JkfdZE1W# zPF*RzgKtCyf^KFV`h8g>as`caxxszAdDU&aZZ*c>N;jhoT{*^5{aUaq+*M&-Imv=G z{h{BNzK4WVq+=9iNH?K@JI~CNHA3aJ;vgEUhS4)u6Uv#pnc6xuQ0J6M8MXD~U?RIK zY^x#K(55_3OE9L7zW(!~JQuwOp9Et@En%t;1Fn z9(CNd_`^p(SoYKOhX)4yzC5J;%GJw8cL-gQdorogQ2B%5?`OU|`DpUQjW-7$9QNYf z&mHe`BJbNNCvrx;AD>qBt8H?xar0s;zS#X;*tsFMk4cz$s#)$$i=Idyy|dlDJ+BOX z{@&G=!E?UZxuwgAQ#U_u7}T%V^3a8jRzU~amh|6l`uX*=@H?OFyf{qN4>wPHwo8}n ze+QbLC5UeI%44? zvQ9ra?`*`ki`Ryq-11zPjp_f?uNwAa%y&P}n*P}3@770d+tU0*)rPj#<$qf9pN~sB zy0q2W<)+mye08wdp|0P5vg5;;BX_p@y63iGMdz0Ec;&-2bBwvY|99r#vcw*lCiCi6 z1Lq&CT>QhK3Ga8Gy`*#YwW-Z#56j-%Kf8T>?bCmzUVFIarnq}fulOMAn!5g%O3d32 z{L-?v_MR)lPEUTj^6{6)tq5B6_Kq*!x~1-}KlXn6$%noFS@>Y|L*ueC5^KB6d^9sS zqj%nzTk{eozqhsQ*31cyg(S>a@xuOQ+dq%q^JZCJHT^@^r0o7Nr@UAV-(*RO2x^42Ab|7}t`ZOz8v9V<4zZJgUF{io=GHy^EfEIqn1A#VBi4{Tq4_LlAE z_orPvH|d%QySBG3JJ~d{YgplDe_e0uQ-90xN49m})xK}0p;PPkrtGPo;QZ^Unb~{8 zdcOHb=@(sAA1vrQaCF+Q9St?tHVYVC*VNkfkL0+Ap6;8u?w8LGE7!z#+_e! zdj8XoEL6*5>%hN18$Qq-bJL8;4@5or`r)Y)vVO^3^z51PseLyVymRzW#i<$Yw+1|! znb70YG4*X@TfcM5gGnVn3?2T+SJMZT_4so{WXY4yo@rLu;^8ypp((8=E$#MHrR9mB z`Rx~Vda~l(lpSy1@x+`(LFq$2a-Hf~yUzNN6QYanq4zysy%Pndlk(#Ztl6{njhA-&nnA4KRkH8C231(M9bu5 zmybSr>!W|nIr{kN=byUi_RZ@T9(*eC+NW;qyyvBpH9w3#^7v1`cY6O$_iFpu4WC~3 z&cts`E1y2oyv^BTd+%5|^oF5n^Wrz|E*v^+z=kX9zWL(Gg9&|ZaC~&`t9Q3&BJp9g_+5ej!JN&80hrZsByeag8{gZKr()zr= z`}CDg)ieLy)2GYq+WD8AFBdIbSl2f6o%;JuzB#nZd&T3rp6$N&)+?WNUiv}hm4b|& zgHA-)iUo%_n}* zVd&U4AD(chFG@Cyc)9%RF;_P1bQE`P`QuHW?@ze*)wXJVc=fi6FU)-FV(b06O`Dwl zXU3T?c5J!ja_xQB@A}^z4;MR%D?fYj_ilrG?mRnm`^jznr`*1G$CX{7cRcXTcm3af zD7j;sNiCnsu$}&8>o+yYqaV+j+9POc$Kz)|9@y`nRk1fFzk7Pd(U|Y+KDzmx-wGE+ zwYe#__kpbLKmTqWeAlsC7PrYc-8?b6E+p-`i~$FqFTCy0CwtTO&)ik^<40G%y+7rj zhc6F$EBldY3FC|UwRouh`339uwmE(MnI7N8Pkmt6qR?+fT>SFQpna}=FZ?5V1_OQ% zv#_L3eop2Bv$4LOx;J}XZl<$Oc=$a=W0gSW78mp>%;7PUg6Mz7k~$fav9Btq{S`kY zNehe|(qwdM*Hn-G>sr)CpJgWV{nc8k(#dJ`i4C9U7*1>jX+VY^CubV&b!H z-p)(14vm()bu5w&jrmQ+tvFH)U;Ws;Th^helebQDNry(jCL=vCrPxIE*@BfQ-+0lC z-CM^h>ClRV$v6^6a-o;T9F%o}aK&4vm83(D-AqPWs30poU-IzRvJMT4ymf*l9eRFk zGSVoN@@sv<5qN#$MR)Pmxkl2Vaiz(qE`{t)IWSJvp=q_ZPKcyKDQq(4<47)W+oM^s z&ULurtOkSI!Zb=<{)u7bftOH zX<6qcNyjGXbYf05j?@yI--w<;vZu48(@D|^V-771P(8iUHx=K7@Qqg&NheIwp&U0E zDPGiWT$i!?ep%;cNvEr%(~UXw#D{beDuXd8^R=hDq|;5(>A@Uo=P7jiljDxcIz1(w z9+FNk=8ziY`%93T4nIo372#tnM0+B;&tiMU(h-DrgM~}6DjHRV-Dpk=>$CV)6cR_e@UmGq%(jy z=p;Db*X0)OlyzvL=pC;ClFlIJWaCJ&Ir&MxP1YIA9DRKsBFz z43%_-NIJuqQ%OgBnhpQo_p;6{lFl$mXE<}HMUDJ@O3-xUbF# zNhe;?Nnj3@SSpA8_P@ST)=89f5+t1@=1^-!RxDp-MaA{Chei?J>6|3#jAD+OKAV0T z*FZXRE9cekjFNPcS*H_@6t6cHkNHcshgRdf?Maq&Qke4;j?`aNogP^)>x`9jQY4*J z=FqY>*>nDv`A7`k^huL+QY9S>Q(!aIR?_+IlLgIWo$->+I7tWHFm%q-5uawqFK>`_ z(j}blR5f!W4ff1rE%afJaJ>d5m_f&<4}yrWl1_YKt26w zH&;XhI=Rfz+mj>dOOi5=J zb7*8jabI`h-7r~awxlyl(kWmL8fA`G`s`-^lXVIuodQXxh&fyn;X7=*c(<&BB=d<^ zk)%_?94fJt&PDg^$3TW+sPA{?Fh`$XC6Z1lbEt%n&a@qCQ4oA}$|RjqNyo{Yc|vDu zR5m1ib;>0jr=){wfVkg|BN{@(?W;c7F6+=;yz_moq*K8hni-K5&t9J1KzoR;$VaC_ z(pkV9Ze8Kq8sFxiY|lbTXMv=%h&gJ1dhQkjillG)P^`V` zug+pgr&7|XVop08$<25y=CZ7_1XsN6sgiV-GN%)cRDK#BKUYgSOC_B>8xUoI?nvE^sB+L zJ#I;7m87$pIS=4S@p}983;kuC8cAohq;n^8sQgf=*>+(A3a@YZxl7WyQ_?}Rh4gtD zN3y5nc`E|>>Y%IkDL;2hI-D}vy3Ms|8{5k|_ewfzB%S-1Lv04RW09$7Bz*0;A6LA~ z^L>)eTIO`bkwU*YEMb7Gvrf`kE9tCfPMFa7x5bcOWgW^*Z+q5DIw*GFbQe17CQWJ} zogb8RHb^=TF^5L}6t7!mFr}zW>@J={&}qR2<2kalicbwQSGhlFnn2&SvINKS;4j`M3~Cui^Fwn;iqGABaleE3BK8aCf} z(QL@O96l-O>|l;n=mb3-_PVU|w4}2`(%H!z?w#Rlz3K5-S?3u^XQ!mIi#b&|(md|( z);Gg6-*`RC9DVuOCFwlJoTfNZ=wZ`$H&C9Rmvo+!bapd`Y$2VUTaI**?Ri1c*)8ep zVa`|_$#s16t!reR7jeZqzxGHvdzlkMB5-S>exEMuyo4*>I(sFZeasn%BROaNv$(l$ zI#Vy;t+S7HC`2zhz=axYTtf|p!3tn_PD2s|(oREYyhU!fhD_&k`b9KVr$8XHGz484 zyGjjNA&{;bLVXfBn}$590ERspvO^#V8bYZ+E=faB=f2#8z<4WaLXkt@;=`UU{GP8ve*_>jxekP`yQ(GYsylH61cp0G-S3w7HLR@KvrqUDuJxjkcS1*QA4%~WP*n57D$SQ91utk z4LL55`!wV|fvnMxuLQE25!y@EF(aFktdGX|S#Wx3$X@~(ry*t<%D{zrbP955!jFBy z)mAH5aMo%_m_WicBuXGv8WJmzhcslYK5W9q=O2||RDUy&X30W;6>m+2eggh@H zM*_CgNQ?OHM$q;MA5xIHDcWo ze@&#!_qqvZgm~`NOONoqV)Y2$i$;xFD85&Y9^rxKJUtRYH#_HrP@I|yd-(1Vbh9pA z2;D4Pk3>=$&h%W`g3B|AB10{~4^sQf;4}xPdT5u%S zJvt>?4TGPT6rqTNyX$^-`w$S5Q6vcbs1kRqBn>`yFQD@Iq&MRoEbj6!rrfvyN_slQD4%)mWxN?@Q z?s~0~#kTJ1DfY8gek+|vAI|wDLX~{<>bJt<-QKYiy0RZVHh&i?+Bt1+o|}p7%IU7o z;sU)9rJ3_+G$Jnf800MWv7p#F6Ps&ek8MS%gl~nd#pzURM^0Xd@{aY&1$rwnvs4&M z30jno-PVc6C%lWh=iDm^h~Q-|0ebW4d~TjEA_3Xi1;u69x7>3ZuQcJ?(9fWIN0(rI zgi%Ol6clG=3hSxNWM&lzQJm%F=N5>x!5KDi7iobLz2EDCD0A6JR%fnGt|)h&YE1cD zB{XCTLD7-uF2vH6P!wLhjZ~IBHsVZYBhEag;6$_0_kyQh_}rg}KKG~YMpT0moxh-1 zEj2mig{mInQjWdsDV3l!FSE2LPdOv6R!wqCON&JjE5b(Q3IjX8XJ-n(lKW~cP_83o zU`TPc5QMz`)LBgB!IN>^hLnqQaJ|mONxsNgaXJe{pKmo*SMbL=U`r%wytv{l)|Je$ zT-?11>#dIbqI@M5BPa=Sa2%r7;$E0bF>A=lX!86aITV_agIE+ z%a|dN1#yn7%+k{Q+){`4X%^Z@72;MiFTV(z2rLkBh;wAm%q*IbTUeZ1r#uH` zo^|+?+5^uS`;r_~6GWSzL@DVx!4)+C(?kGpgb#NRzS7(>n4-a=tZ^tMuhSh`>CJF( z3r9ONP=qra*yo_k3F~#Io;EN8&92fBD6yw=eM6VwKtkk~&4jTcymGEunStI$EASZ( z+?5+`?!Y2N?N?4jzUo`<%<>8~5foK4&wL{sMB@MoZpG;YFSXx%XYy-x0c`f8uVou2 zIMi;a%wdR*cEs5o;o)&9sVT8BNpW_&3Pp@fOdUBUDSnJSIxId_g9ndD8WlHkO#CRo paU+Y0qx(~b2LC9#!Qsd&pr#l#4#Vfn0(-ykfq8?%J +#include + + +/* +** =================================================================== +** General Configuration File for Lua +** +** Some definitions here can be changed externally, through the +** compiler (e.g., with '-D' options). Those are protected by +** '#if !defined' guards. However, several other definitions should +** be changed directly here, either because they affect the Lua +** ABI (by making the changes here, you ensure that all software +** connected to Lua, such as C libraries, will be compiled with the +** same configuration); or because they are seldom changed. +** +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance restricting it to C89. +** ===================================================================== +*/ + +/* +@@ LUA_USE_C89 controls the use of non-ISO-C89 features. +** Define it if you want Lua to avoid the use of a few C99 features +** or Windows-specific features on Windows. +*/ +/* #define LUA_USE_C89 */ + + +/* +** By default, Lua on Windows use (some) specific Windows features +*/ +#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ +#endif + + +#if defined(LUA_USE_WINDOWS) +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ +#endif + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#endif + + +/* +@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +*/ +#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Number types. +** =================================================================== +*/ + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. +*/ +/* #define LUA_32BITS */ + + +/* +@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for +** C89 ('long' and 'double'); Windows always has '__int64', so it does +** not need to use this case. +*/ +#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) +#define LUA_C89_NUMBERS +#endif + + +/* +@@ LUA_INT_TYPE defines the type for Lua integers. +@@ LUA_FLOAT_TYPE defines the type for Lua floats. +** Lua should work fine with any mix of these options supported +** by your C compiler. The usual configurations are 64-bit integers +** and 'double' (the default), 32-bit integers and 'float' (for +** restricted platforms), and 'long'/'double' (for C compilers not +** compliant with C99, which may not have support for 'long long'). +*/ + +/* predefined options for LUA_INT_TYPE */ +#define LUA_INT_INT 1 +#define LUA_INT_LONG 2 +#define LUA_INT_LONGLONG 3 + +/* predefined options for LUA_FLOAT_TYPE */ +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 + +#if defined(LUA_32BITS) /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_IS32INT /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif defined(LUA_C89_NUMBERS) /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE + +#endif /* } */ + + +/* +** default configuration for 64-bit Lua ('long long' and 'double') +*/ +#if !defined(LUA_INT_TYPE) +#define LUA_INT_TYPE LUA_INT_LONGLONG +#endif + +#if !defined(LUA_FLOAT_TYPE) +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE +#endif + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Paths. +** =================================================================== +*/ + +/* +** LUA_PATH_SEP is the character that separates templates in a path. +** LUA_PATH_MARK is the string that marks the substitution points in a +** template. +** LUA_EXEC_DIR in a Windows path is replaced by the executable's +** directory. +*/ +#define LUA_PATH_SEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXEC_DIR "!" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +** Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +** C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ + +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll;" \ + LUA_CDIR"?54.dll;" ".\\?54.dll" +#endif + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so;" \ + LUA_CDIR"lib?54.so;" "./lib?54.so" +#endif + +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if !defined(LUA_DIRSEP) + +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Marks for exported symbols in the C code +** =================================================================== +*/ + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* +** More often than not the libs go together with the core. +*/ +#define LUALIB_API LUA_API +#define LUAMOD_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, +** none of which to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("internal"))) extern +#else /* }{ */ +#define LUAI_FUNC extern +#endif /* } */ + +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_5_3 controls other macros for compatibility with Lua 5.3. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_5_3) /* { */ + +/* +@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated +** functions in the mathematical library. +** (These functions were already officially removed in 5.3; +** nevertheless they are still available here.) +*/ +#define LUA_COMPAT_MATHLIB + +/* +@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for +** manipulating other integer types (lua_pushunsigned, lua_tounsigned, +** luaL_checkint, luaL_checklong, etc.) +** (These macros were also officially removed in 5.3, but they are still +** available here.) +*/ +#define LUA_COMPAT_APIINTCASTS + + +/* +@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod +** using '__lt'. +*/ +#define LUA_COMPAT_LT_LE + + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +** (Once more, these macros were officially removed in 5.3, but they are +** still available here.) +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +#endif /* } */ + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers. +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUA_NUMBER is the floating-point type used by Lua. +@@ LUAI_UACNUMBER is the result of a 'default argument promotion' +@@ over a floating number. +@@ l_floatatt(x) corrects float attribute 'x' to the proper float type +** by prefixing it with one of FLT/DBL/LDBL. +@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. +@@ LUA_NUMBER_FMT is the format for writing floats. +@@ lua_number2str converts a float to a string. +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. +@@ l_floor takes the floor of a float. +@@ lua_str2number converts a decimal numeral to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + +#define lua_number2str(s,sz,n) \ + l_sprintf((s), sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)(n)) + +/* +@@ lua_numbertointeger converts a float number with an integral value +** to an integer, or returns 0 if float is not within the range of +** a lua_Integer. (The range comparisons are tricky because of +** rounding. The tests here assume a two-complement representation, +** where MININTEGER always has an exact representation as a float; +** MAXINTEGER may not have one, and therefore its conversion to float +** may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + + +/* now the variable definitions */ + +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ + +#define LUA_NUMBER float + +#define l_floatatt(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" + +#define l_mathop(op) op##f + +#define lua_str2number(s,p) strtof((s), (p)) + + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ + +#define LUA_NUMBER long double + +#define l_floatatt(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" + +#define l_mathop(op) op##l + +#define lua_str2number(s,p) strtold((s), (p)) + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ + +#define LUA_NUMBER double + +#define l_floatatt(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.14g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ LUA_INTEGER is the integer type used by Lua. +** +@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. +** +@@ LUAI_UACINT is the result of a 'default argument promotion' +@@ over a LUA_INTEGER. +@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. +@@ LUA_INTEGER_FMT is the format for writing integers. +@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. +@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. +@@ LUA_MAXUNSIGNED is the maximum value for a LUA_UNSIGNED. +@@ LUA_UNSIGNEDBITS is the number of bits in a LUA_UNSIGNED. +@@ lua_integer2str converts an integer to a string. +*/ + + +/* The following definitions are good for most cases here */ + +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" + +#define LUAI_UACINT LUA_INTEGER + +#define lua_integer2str(s,sz,n) \ + l_sprintf((s), sz, LUA_INTEGER_FMT, (LUAI_UACINT)(n)) + +/* +** use LUAI_UACINT here to avoid problems with promotions (which +** can turn a comparison between unsigneds into a signed comparison) +*/ +#define LUA_UNSIGNED unsigned LUAI_UACINT + + +#define LUA_UNSIGNEDBITS (sizeof(LUA_UNSIGNED) * CHAR_BIT) + + +/* now the variable definitions */ + +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ + +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" + +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN + +#define LUA_MAXUNSIGNED UINT_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ + +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" + +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN + +#define LUA_MAXUNSIGNED ULONG_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ + +/* use presence of macro LLONG_MAX as proxy for C99 compliance */ +#if defined(LLONG_MAX) /* { */ +/* use ISO C99 stuff */ + +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" + +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN + +#define LUA_MAXUNSIGNED ULLONG_MAX + +#elif defined(LUA_USE_WINDOWS) /* }{ */ +/* in Windows, can use specific Windows types */ + +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" + +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN + +#define LUA_MAXUNSIGNED _UI64_MAX + +#else /* }{ */ + +#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ + or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" + +#endif /* } */ + +#else /* }{ */ + +#error "numeric integer type not defined" + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Dependencies with C99 and other C details +** =================================================================== +*/ + +/* +@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89. +** (All uses in Lua have only one format item.) +*/ +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i) +#else +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) +#endif + + +/* +@@ lua_strx2number converts a hexadecimal numeral to a number. +** In C99, 'strtod' does that conversion. Otherwise, you can +** leave 'lua_strx2number' undefined and Lua will provide its own +** implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_strx2number(s,p) lua_str2number(s,p) +#endif + + +/* +@@ lua_pointer2str converts a pointer to a readable string in a +** non-specified way. +*/ +#define lua_pointer2str(buff,sz,p) l_sprintf(buff,sz,"%p",p) + + +/* +@@ lua_number2strx converts a float to a hexadecimal numeral. +** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that. +** Otherwise, you can leave 'lua_number2strx' undefined and Lua will +** provide its own implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_number2strx(L,b,sz,f,n) \ + ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) +#endif + + +/* +** 'strtof' and 'opf' variants for math functions are not valid in +** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the +** availability of these variants. ('math.h' is already included in +** all files that use these macros.) +*/ +#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) +#undef l_mathop /* variants not available */ +#undef lua_str2number +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) +#endif + + +/* +@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation +** functions. It must be a numerical type; Lua will use 'intptr_t' if +** available, otherwise it will use 'ptrdiff_t' (the nearest thing to +** 'intptr_t' in C89) +*/ +#define LUA_KCONTEXT ptrdiff_t + +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include +#if defined(INTPTR_MAX) /* even in C99 this type is optional */ +#undef LUA_KCONTEXT +#define LUA_KCONTEXT intptr_t +#endif +#endif + + +/* +@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point). +** Change that if you do not want to use C locales. (Code using this +** macro must include the header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Language Variations +** ===================================================================== +*/ + +/* +@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some +** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from +** numbers to strings. Define LUA_NOCVTS2N to turn off automatic +** coercion from strings to numbers. +*/ +/* #define LUA_NOCVTN2S */ +/* #define LUA_NOCVTS2N */ + + +/* +@@ LUA_USE_APICHECK turns on several consistency checks on the C API. +** Define it as a help when debugging C code. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(l,e) assert(e) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Macros that affect the API and must be stable (that is, must be the +** same when you compile Lua and when you compile code that links to +** Lua). +** ===================================================================== +*/ + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +** (It must fit into max(size_t)/32.) +*/ +#if LUAI_IS32INT +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + + +/* +@@ LUA_EXTRASPACE defines the size of a raw memory area associated with +** a Lua state with very fast access. +** CHANGE it if you need a different size. +*/ +#define LUA_EXTRASPACE (sizeof(void *)) + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@@ of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +*/ +#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) + + +/* +@@ LUAI_MAXALIGN defines fields that, when used in a union, ensure +** maximum alignment for the other items in that union. +*/ +#define LUAI_MAXALIGN lua_Number n; double u; void *s; lua_Integer i; long l + +/* }================================================================== */ + + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + + + +#endif + diff --git a/EmuAPI/lua/include/lualib.h b/deps/lua54/lualib.h similarity index 87% rename from EmuAPI/lua/include/lualib.h rename to deps/lua54/lualib.h index 5165c0f..eb08b53 100644 --- a/EmuAPI/lua/include/lualib.h +++ b/deps/lua54/lualib.h @@ -1,5 +1,5 @@ /* -** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $ +** $Id: lualib.h $ ** Lua standard libraries ** See Copyright Notice in lua.h */ @@ -11,6 +11,9 @@ #include "lua.h" +/* version suffix for environment variable names */ +#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + LUAMOD_API int (luaopen_base) (lua_State *L); @@ -32,9 +35,6 @@ LUAMOD_API int (luaopen_string) (lua_State *L); #define LUA_UTF8LIBNAME "utf8" LUAMOD_API int (luaopen_utf8) (lua_State *L); -#define LUA_BITLIBNAME "bit32" -LUAMOD_API int (luaopen_bit32) (lua_State *L); - #define LUA_MATHLIBNAME "math" LUAMOD_API int (luaopen_math) (lua_State *L); diff --git a/deps/sol/as_args.hpp b/deps/sol/as_args.hpp new file mode 100644 index 0000000..719a3cd --- /dev/null +++ b/deps/sol/as_args.hpp @@ -0,0 +1,54 @@ +// sol2 + +// The MIT License (MIT) + +// Copyright (c) 2013-2022 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this Spermission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SOL_AS_ARGS_HPP +#define SOL_AS_ARGS_HPP + +#include + +namespace sol { + template + struct as_args_t { + T src; + }; + + template + auto as_args(Source&& source) { + return as_args_t { std::forward(source) }; + } + + namespace stack { + template + struct unqualified_pusher> { + int push(lua_State* L, const as_args_t& e) { + int p = 0; + for (const auto& i : e.src) { + p += stack::push(L, i); + } + return p; + } + }; + } // namespace stack +} // namespace sol + +#endif // SOL_AS_ARGS_HPP diff --git a/deps/sol/as_returns.hpp b/deps/sol/as_returns.hpp new file mode 100644 index 0000000..982f408 --- /dev/null +++ b/deps/sol/as_returns.hpp @@ -0,0 +1,62 @@ +// sol2 + +// The MIT License (MIT) + +// Copyright (c) 2013-2022 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SOL_AS_RETURNS_HPP +#define SOL_AS_RETURNS_HPP + +#include +#include +#include + +namespace sol { + template + struct as_returns_t : private detail::ebco { + private: + using base_t = detail::ebco; + + public: + using base_t::base_t; + using base_t::value; + }; + + template + auto as_returns(Source&& source) { + return as_returns_t> { std::forward(source) }; + } + + namespace stack { + template + struct unqualified_pusher> { + int push(lua_State* L, const as_returns_t& e) { + auto& src = detail::unwrap(e.value()); + int p = 0; + for (const auto& i : src) { + p += stack::push(L, i); + } + return p; + } + }; + } // namespace stack +} // namespace sol + +#endif // SOL_AS_RETURNS_HPP diff --git a/deps/sol/assert.hpp b/deps/sol/assert.hpp new file mode 100644 index 0000000..668dcd2 --- /dev/null +++ b/deps/sol/assert.hpp @@ -0,0 +1,99 @@ +// sol2 + +// The MIT License (MIT) + +// Copyright (c) 2013-2022 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#pragma once + +#ifndef SOL_ASSERT_HPP +#define SOL_ASSERT_HPP + +#include + +#if SOL_IS_ON(SOL2_CI) + +struct pre_main { + pre_main() { +#ifdef _MSC_VER + _set_abort_behavior(0, _WRITE_ABORT_MSG); +#endif + } +} inline sol2_ci_dont_lock_ci_please = {}; + +#endif // Prevent lockup when doing Continuous Integration + + +// clang-format off + +#if SOL_IS_ON(SOL_USER_C_ASSERT) + #define sol_c_assert(...) SOL_C_ASSERT(__VA_ARGS__) +#else + #if SOL_IS_ON(SOL_DEBUG_BUILD) + #include + #include + #include + + #define sol_c_assert(...) \ + do { \ + if (!(__VA_ARGS__)) { \ + std::cerr << "Assertion `" #__VA_ARGS__ "` failed in " << __FILE__ << " line " << __LINE__ << std::endl; \ + std::terminate(); \ + } \ + } while (false) + #else + #define sol_c_assert(...) \ + do { \ + if (false) { \ + (void)(__VA_ARGS__); \ + } \ + } while (false) + #endif +#endif + +#if SOL_IS_ON(SOL_USER_M_ASSERT) + #define sol_m_assert(message, ...) SOL_M_ASSERT(message, __VA_ARGS__) +#else + #if SOL_IS_ON(SOL_DEBUG_BUILD) + #include + #include + #include + + #define sol_m_assert(message, ...) \ + do { \ + if (!(__VA_ARGS__)) { \ + std::cerr << "Assertion `" #__VA_ARGS__ "` failed in " << __FILE__ << " line " << __LINE__ << ": " << message << std::endl; \ + std::terminate(); \ + } \ + } while (false) + #else + #define sol_m_assert(message, ...) \ + do { \ + if (false) { \ + (void)(__VA_ARGS__); \ + (void)sizeof(message); \ + } \ + } while (false) + #endif +#endif + +// clang-format on + +#endif // SOL_ASSERT_HPP diff --git a/deps/sol/base_traits.hpp b/deps/sol/base_traits.hpp new file mode 100644 index 0000000..6178088 --- /dev/null +++ b/deps/sol/base_traits.hpp @@ -0,0 +1,123 @@ +// sol2 + +// The MIT License (MIT) + +// Copyright (c) 2013-2022 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SOL_BASE_TRAITS_HPP +#define SOL_BASE_TRAITS_HPP + +#include + +namespace sol { + namespace detail { + struct unchecked_t { }; + const unchecked_t unchecked = unchecked_t {}; + } // namespace detail + + namespace meta { + using sfinae_yes_t = std::true_type; + using sfinae_no_t = std::false_type; + + template + using void_t = void; + + template + using unqualified = std::remove_cv>; + + template + using unqualified_t = typename unqualified::type; + + namespace meta_detail { + template + struct unqualified_non_alias : unqualified { }; + + template