summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--App/Main.cpp93
1 files changed, 52 insertions, 41 deletions
diff --git a/App/Main.cpp b/App/Main.cpp index 6946168..39dd517 100644 --- a/App/Main.cpp +++ b/App/Main.cpp
@@ -40,11 +40,20 @@ HWND g_randomizerStatus;
40HINSTANCE g_hInstance; 40HINSTANCE g_hInstance;
41auto g_witnessProc = std::make_shared<Memory>(L"witness64_d3d11.exe"); 41auto g_witnessProc = std::make_shared<Memory>(L"witness64_d3d11.exe");
42std::shared_ptr<Randomizer> g_randomizer; 42std::shared_ptr<Randomizer> g_randomizer;
43void SetRandomSeed();
43 44
44LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { 45LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
45 if (message == WM_DESTROY) { 46 if (message == WM_DESTROY) {
46 PostQuitMessage(0); 47 PostQuitMessage(0);
47 } else if (message == WM_COMMAND || message == WM_TIMER) { 48 } else if (message == WM_NOTIFY) {
49 MSGFILTER* m = (MSGFILTER *)lParam;
50 if (m->msg == WM_KEYDOWN && m->wParam == VK_RETURN) {
51 if (IsWindowEnabled(g_randomizerStatus) == TRUE) {
52 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZING, NULL);
53 return 1; // Non-zero to indicate that message was handled
54 }
55 }
56 } else if (message == WM_COMMAND || message == WM_TIMER || message == WM_NOTIFY) {
48 switch (LOWORD(wParam)) { 57 switch (LOWORD(wParam)) {
49 case HEARTBEAT: 58 case HEARTBEAT:
50 switch ((ProcStatus)lParam) { 59 switch ((ProcStatus)lParam) {
@@ -76,42 +85,27 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
76 } 85 }
77 break; 86 break;
78 case RANDOMIZING: 87 case RANDOMIZING:
79 if (!g_randomizer) { 88 if (!g_randomizer) break; // E.g. an enter press at the wrong time
80 assert(false);
81 break;
82 }
83 EnableWindow(g_randomizerStatus, FALSE); 89 EnableWindow(g_randomizerStatus, FALSE);
84 90
85 { 91 SetRandomSeed();
86 int seed = 0; 92 std::thread([]{
87 std::wstring text(128, L'\0'); 93 if (IsDlgButtonChecked(g_hwnd, DISABLE_SNIPES)) {
88 int size = GetWindowText(g_seed, text.data(), static_cast<int>(text.size())); 94 g_randomizer->PreventSnipes();
89 if (size > 0) { // Set seed
90 seed = _wtoi(text.c_str());
91 } else { // Random seed
92 seed = Random::RandInt(0, 999999);
93 SetWindowText(g_seed, std::to_wstring(seed).c_str());
94 RedrawWindow(g_seed, NULL, NULL, RDW_UPDATENOW);
95 } 95 }
96 Random::SetSeed(seed); 96 if (IsDlgButtonChecked(g_hwnd, SPEED_UP_AUTOSCROLLERS)) {
97 std::thread([]{ 97 g_randomizer->AdjustSpeed();
98 if (IsDlgButtonChecked(g_hwnd, DISABLE_SNIPES)) { 98 }
99 g_randomizer->PreventSnipes(); 99 if (IsDlgButtonChecked(g_hwnd, CHALLENGE_ONLY)) {
100 } 100 SetWindowText(g_randomizerStatus, L"Randomizing Challenge...");
101 if (IsDlgButtonChecked(g_hwnd, SPEED_UP_AUTOSCROLLERS)) { 101 g_randomizer->RandomizeChallenge();
102 g_randomizer->AdjustSpeed(); 102 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZE_CHALLENGE_DONE, NULL);
103 } 103 } else {
104 if (IsDlgButtonChecked(g_hwnd, CHALLENGE_ONLY)) { 104 SetWindowText(g_randomizerStatus, L"Randomizing...");
105 SetWindowText(g_randomizerStatus, L"Randomizing Challenge..."); 105 g_randomizer->Randomize();
106 g_randomizer->RandomizeChallenge(); 106 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZE_DONE, NULL);
107 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZE_CHALLENGE_DONE, NULL); 107 }
108 } else { 108 }).detach();
109 SetWindowText(g_randomizerStatus, L"Randomizing...");
110 g_randomizer->Randomize();
111 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZE_DONE, NULL);
112 }
113 }).detach();
114 }
115 break; 109 break;
116 case RANDOMIZE_DONE: 110 case RANDOMIZE_DONE:
117 EnableWindow(g_randomizerStatus, FALSE); 111 EnableWindow(g_randomizerStatus, FALSE);
@@ -120,6 +114,11 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
120 case RANDOMIZE_CHALLENGE_DONE: 114 case RANDOMIZE_CHALLENGE_DONE:
121 EnableWindow(g_randomizerStatus, FALSE); 115 EnableWindow(g_randomizerStatus, FALSE);
122 SetWindowText(g_randomizerStatus, L"Randomized Challenge!"); 116 SetWindowText(g_randomizerStatus, L"Randomized Challenge!");
117 std::thread([]{
118 // Allow re-randomization for challenge -- it doesn't break the rest of the game.
119 std::this_thread::sleep_for(std::chrono::seconds(10));
120 PostMessage(g_hwnd, WM_COMMAND, RANDOMIZE_READY, NULL);
121 }).detach();
123 break; 122 break;
124 case CHALLENGE_ONLY: 123 case CHALLENGE_ONLY:
125 CheckDlgButton(hwnd, CHALLENGE_ONLY, !IsDlgButtonChecked(hwnd, CHALLENGE_ONLY)); 124 CheckDlgButton(hwnd, CHALLENGE_ONLY, !IsDlgButtonChecked(hwnd, CHALLENGE_ONLY));
@@ -139,9 +138,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
139 case TMP2: 138 case TMP2:
140 if(g_panel) g_panel->Write(panel); 139 if(g_panel) g_panel->Write(panel);
141 break; 140 break;
142 case TMP3:
143 if(g_panel) g_panel->Random();
144 break;
145 case TMP4: 141 case TMP4:
146 if(g_panel) g_panel->Serialize(); 142 if(g_panel) g_panel->Serialize();
147 break; 143 break;
@@ -150,6 +146,20 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
150 return DefWindowProc(hwnd, message, wParam, lParam); 146 return DefWindowProc(hwnd, message, wParam, lParam);
151} 147}
152 148
149void SetRandomSeed() {
150 std::wstring text(128, L'\0');
151 int length = GetWindowText(g_seed, text.data(), static_cast<int>(text.size()));
152 if (length > 0) { // Set seed
153 text.resize(length);
154 Random::SetSeed(_wtoi(text.c_str()));
155 } else { // Random seed
156 int seed = Random::RandInt(0, 999999);
157 SetWindowText(g_seed, std::to_wstring(seed).c_str());
158 RedrawWindow(g_seed, NULL, NULL, RDW_UPDATENOW);
159 Random::SetSeed(seed);
160 }
161}
162
153HWND CreateLabel(int x, int y, int width, LPCWSTR text) { 163HWND CreateLabel(int x, int y, int width, LPCWSTR text) {
154 return CreateWindow(L"STATIC", text, 164 return CreateWindow(L"STATIC", text,
155 WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_LEFT, 165 WS_TABSTOP | WS_VISIBLE | WS_CHILD | SS_LEFT,
@@ -202,6 +212,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
202 212
203 CreateLabel(390, 15, 90, L"Version: " VERSION_STR); 213 CreateLabel(390, 15, 90, L"Version: " VERSION_STR);
204 g_seed = CreateText(10, 10, 100); 214 g_seed = CreateText(10, 10, 100);
215 PostMessage(g_seed, EM_SETEVENTMASK, 0, ENM_KEYEVENTS);
205 g_randomizerStatus = CreateButton(120, 10, 180, L"Randomize", RANDOMIZING); 216 g_randomizerStatus = CreateButton(120, 10, 180, L"Randomize", RANDOMIZING);
206 EnableWindow(g_randomizerStatus, FALSE); 217 EnableWindow(g_randomizerStatus, FALSE);
207 CreateCheckbox(10, 300, CHALLENGE_ONLY); 218 CreateCheckbox(10, 300, CHALLENGE_ONLY);
@@ -212,10 +223,10 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
212 CreateCheckbox(10, 340, SPEED_UP_AUTOSCROLLERS); 223 CreateCheckbox(10, 340, SPEED_UP_AUTOSCROLLERS);
213 CreateLabel(30, 340, 205, L"Speed up various autoscrollers"); 224 CreateLabel(30, 340, 205, L"Speed up various autoscrollers");
214 225
215 CreateButton(200, 100, 100, L"Read", TMP1); 226 // CreateButton(200, 100, 100, L"Read", TMP1);
216 CreateButton(200, 130, 100, L"Write", TMP2); 227 // CreateButton(200, 130, 100, L"Write", TMP2);
217 CreateButton(200, 160, 100, L"Random", TMP3); 228 // CreateButton(200, 160, 100, L"Random", TMP3);
218 CreateButton(200, 190, 100, L"Dump", TMP4); 229 // CreateButton(200, 190, 100, L"Dump", TMP4);
219 230
220 g_witnessProc->StartHeartbeat(g_hwnd); 231 g_witnessProc->StartHeartbeat(g_hwnd);
221 232