diff options
Diffstat (limited to 'App/Main.cpp')
-rw-r--r-- | App/Main.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/App/Main.cpp b/App/Main.cpp index f0f770a..54d876d 100644 --- a/App/Main.cpp +++ b/App/Main.cpp | |||
@@ -1,6 +1,7 @@ | |||
1 | #include "pch.h" | 1 | #include "pch.h" |
2 | #include "Richedit.h" | 2 | #include "Richedit.h" |
3 | #include "Version.h" | 3 | #include "Version.h" |
4 | #include <fstream> | ||
4 | 5 | ||
5 | #include "Memory.h" | 6 | #include "Memory.h" |
6 | #include "Random.h" | 7 | #include "Random.h" |
@@ -124,6 +125,29 @@ HWND CreateCheckbox(int x, int y, int message) { | |||
124 | } | 125 | } |
125 | #pragma warning(pop) | 126 | #pragma warning(pop) |
126 | 127 | ||
128 | int findGlobals() { | ||
129 | int address = 0; | ||
130 | for (int i = 0x620000; i < 0x660000; i += 4) { | ||
131 | Memory::GLOBALS = i; | ||
132 | try { | ||
133 | if ((address = g_witnessProc->ReadPanelData<int>(0x17E52, STYLE_FLAGS, 1)[0]) == 0x0000A040) { | ||
134 | return i; | ||
135 | } | ||
136 | } | ||
137 | catch (std::exception) {} | ||
138 | } | ||
139 | for (int i = 0x600000; i < 0x620000; i += 4) { | ||
140 | Memory::GLOBALS = i; | ||
141 | try { | ||
142 | if ((address = g_witnessProc->ReadPanelData<int>(0x17E52, STYLE_FLAGS, 1)[0]) == 0x0000A040) { | ||
143 | return i; | ||
144 | } | ||
145 | } | ||
146 | catch (std::exception) {} | ||
147 | } | ||
148 | return 0; | ||
149 | } | ||
150 | |||
127 | int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { | 151 | int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { |
128 | LoadLibrary(L"Msftedit.dll"); | 152 | LoadLibrary(L"Msftedit.dll"); |
129 | WNDCLASSW wndClass = { | 153 | WNDCLASSW wndClass = { |
@@ -140,6 +164,40 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance | |||
140 | }; | 164 | }; |
141 | RegisterClassW(&wndClass); | 165 | RegisterClassW(&wndClass); |
142 | 166 | ||
167 | //Initialize memory globals constant depending on game version | ||
168 | for (int g : Memory::globalsTests) { | ||
169 | try { | ||
170 | Memory::GLOBALS = g; | ||
171 | if (g_witnessProc->ReadPanelData<int>(0x17E52, STYLE_FLAGS) != 0xA040) throw std::exception(); | ||
172 | break; | ||
173 | } | ||
174 | catch (std::exception) { Memory::GLOBALS = 0; } | ||
175 | } | ||
176 | if (!Memory::GLOBALS) { | ||
177 | std::ifstream file("globals.txt"); | ||
178 | if (file.is_open()) { | ||
179 | file >> std::hex >> Memory::GLOBALS; | ||
180 | } | ||
181 | else { | ||
182 | std::string str = "Globals ptr not found. Press OK to search for globals ptr. It will probably take around 5 minutes. This popup will close and the calculation will run in the background. Please keep The Witness open during this time."; | ||
183 | if (MessageBox(GetActiveWindow(), std::wstring(str.begin(), str.end()).c_str(), NULL, MB_OK) != IDOK) return 0; | ||
184 | int address = findGlobals(); | ||
185 | if (address) { | ||
186 | std::stringstream ss; ss << std::hex << "Address found: 0x" << address << ". This address wil be automatically loaded next time. Please post an issue on Github with this address so that it can be added in the future."; | ||
187 | std::string str = ss.str(); | ||
188 | MessageBox(GetActiveWindow(), std::wstring(str.begin(), str.end()).c_str(), NULL, MB_OK); | ||
189 | std::ofstream ofile("globals.txt", std::ofstream::app); | ||
190 | ofile << std::hex << address << std::endl; | ||
191 | } | ||
192 | else { | ||
193 | str = "Address could not be found. Please post an issue on the Github page."; | ||
194 | MessageBox(GetActiveWindow(), std::wstring(str.begin(), str.end()).c_str(), NULL, MB_OK); | ||
195 | return 0; | ||
196 | } | ||
197 | } | ||
198 | } | ||
199 | |||
200 | |||
143 | g_hInstance = hInstance; | 201 | g_hInstance = hInstance; |
144 | 202 | ||
145 | RECT rect; | 203 | RECT rect; |