about summary refs log tree commit diff stats
path: root/WitnessRandomizer
diff options
context:
space:
mode:
Diffstat (limited to 'WitnessRandomizer')
-rw-r--r--WitnessRandomizer/Memory.cpp14
-rw-r--r--WitnessRandomizer/Memory.h20
-rw-r--r--WitnessRandomizer/Panels.h26
-rw-r--r--WitnessRandomizer/WitnessRandomizer.cpp32
-rw-r--r--WitnessRandomizer/WitnessRandomizer.h6
-rw-r--r--WitnessRandomizer/WitnessRandomizer.vcxproj8
6 files changed, 56 insertions, 50 deletions
diff --git a/WitnessRandomizer/Memory.cpp b/WitnessRandomizer/Memory.cpp index 6077691..0afeded 100644 --- a/WitnessRandomizer/Memory.cpp +++ b/WitnessRandomizer/Memory.cpp
@@ -47,30 +47,28 @@ Memory::~Memory() {
47 CloseHandle(_handle); 47 CloseHandle(_handle);
48} 48}
49 49
50// Private methods:
51
52void Memory::ThrowError() { 50void Memory::ThrowError() {
53 std::string message(256, '\0'); 51 std::string message(256, '\0');
54 FormatMessageA(4096, NULL, GetLastError(), 1024, &message[0], static_cast<DWORD>(message.length()), NULL); 52 FormatMessageA(4096, nullptr, GetLastError(), 1024, &message[0], static_cast<DWORD>(message.length()), nullptr);
55 std::cout << message.c_str() << std::endl; 53 std::cout << message.c_str() << std::endl;
56 exit(EXIT_FAILURE); 54 exit(EXIT_FAILURE);
57} 55}
58 56
59uintptr_t Memory::ComputeOffset(std::vector<int> offsets) 57void* Memory::ComputeOffset(std::vector<int> offsets)
60{ 58{
61 // Leave off the last offset, since it will be either read/write, and may not be of type unitptr_t. 59 // Leave off the last offset, since it will be either read/write, and may not be of type unitptr_t.
62 int final_offset = offsets.back(); 60 int final_offset = offsets.back();
63 offsets.pop_back(); 61 offsets.pop_back();
64 62
65 uintptr_t cumulativeAddress = _baseAddress; 63 uintptr_t cumulativeAddress = _baseAddress;
66 for (int offset : offsets) { 64 for (const int offset : offsets) {
67 cumulativeAddress += offset; 65 cumulativeAddress += offset;
68 66
69 auto search = _computedAddresses.find(cumulativeAddress); 67 const auto search = _computedAddresses.find(cumulativeAddress);
70 if (search == std::end(_computedAddresses)) { 68 if (search == std::end(_computedAddresses)) {
71 // If the address is not yet computed, then compute it. 69 // If the address is not yet computed, then compute it.
72 uintptr_t computedAddress = 0; 70 uintptr_t computedAddress = 0;
73 if (!ReadProcessMemory(_handle, (LPVOID)cumulativeAddress, &computedAddress, sizeof(uintptr_t), NULL)) { 71 if (!ReadProcessMemory(_handle, reinterpret_cast<LPVOID>(cumulativeAddress), &computedAddress, sizeof(uintptr_t), NULL)) {
74 ThrowError(); 72 ThrowError();
75 } 73 }
76 _computedAddresses[cumulativeAddress] = computedAddress; 74 _computedAddresses[cumulativeAddress] = computedAddress;
@@ -78,5 +76,5 @@ uintptr_t Memory::ComputeOffset(std::vector<int> offsets)
78 76
79 cumulativeAddress = _computedAddresses[cumulativeAddress]; 77 cumulativeAddress = _computedAddresses[cumulativeAddress];
80 } 78 }
81 return cumulativeAddress + final_offset; 79 return reinterpret_cast<void*>(cumulativeAddress + final_offset);
82} 80}
diff --git a/WitnessRandomizer/Memory.h b/WitnessRandomizer/Memory.h index 6f5b8b7..8e8bbc3 100644 --- a/WitnessRandomizer/Memory.h +++ b/WitnessRandomizer/Memory.h
@@ -2,9 +2,6 @@
2#include <vector> 2#include <vector>
3#include <map> 3#include <map>
4#include <windows.h> 4#include <windows.h>
5#include <thread>
6#include <chrono>
7using namespace std::chrono_literals;
8 5
9// https://github.com/erayarslan/WriteProcessMemory-Example 6// https://github.com/erayarslan/WriteProcessMemory-Example
10// http://stackoverflow.com/q/32798185 7// http://stackoverflow.com/q/32798185
@@ -16,16 +13,18 @@ public:
16 Memory(const std::string& processName); 13 Memory(const std::string& processName);
17 ~Memory(); 14 ~Memory();
18 15
16 Memory(const Memory& memory) = delete;
17 Memory& operator=(const Memory& other) = delete;
18
19 template<class T> 19 template<class T>
20 std::vector<T> ReadData(const std::vector<int>& offsets, int numItems) { 20 std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) {
21 std::vector<T> data; 21 std::vector<T> data;
22 data.resize(numItems); 22 data.resize(numItems);
23 for (int i=0; i<5; i++) { 23 for (int i=0; i<5; i++) {
24 if (ReadProcessMemory(_handle, (LPVOID)ComputeOffset(offsets), &data[0], sizeof(T) * numItems, NULL)) 24 if (ReadProcessMemory(_handle, ComputeOffset(offsets), &data[0], sizeof(T) * numItems, nullptr))
25 { 25 {
26 return data; 26 return data;
27 } 27 }
28 // std::this_thread::sleep_for(10ms);
29 } 28 }
30 ThrowError(); 29 ThrowError();
31 return {}; 30 return {};
@@ -34,10 +33,9 @@ public:
34 template <class T> 33 template <class T>
35 void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) { 34 void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) {
36 for (int i=0; i<5; i++) { 35 for (int i=0; i<5; i++) {
37 if (WriteProcessMemory(_handle, (LPVOID)ComputeOffset(offsets), &data[0], sizeof(T) * data.size(), NULL)) { 36 if (WriteProcessMemory(_handle, ComputeOffset(offsets), &data[0], sizeof(T) * data.size(), nullptr)) {
38 return; 37 return;
39 } 38 }
40 // std::this_thread::sleep_for(10ms);
41 } 39 }
42 ThrowError(); 40 ThrowError();
43 } 41 }
@@ -45,9 +43,9 @@ public:
45private: 43private:
46 void ThrowError(); 44 void ThrowError();
47 45
48 uintptr_t ComputeOffset(std::vector<int> offsets); 46 void* ComputeOffset(std::vector<int> offsets);
49 47
50 std::map<uintptr_t, uintptr_t> _computedAddresses; 48 std::map<uintptr_t, uintptr_t> _computedAddresses;
51 uintptr_t _baseAddress; 49 uintptr_t _baseAddress = 0;
52 HANDLE _handle; 50 HANDLE _handle = nullptr;
53}; \ No newline at end of file 51}; \ No newline at end of file
diff --git a/WitnessRandomizer/Panels.h b/WitnessRandomizer/Panels.h index cd815bc..2995170 100644 --- a/WitnessRandomizer/Panels.h +++ b/WitnessRandomizer/Panels.h
@@ -2,7 +2,7 @@
2#include <vector> 2#include <vector>
3 3
4// Some of these (the puzzle ones) are duplicated elsewhere 4// Some of these (the puzzle ones) are duplicated elsewhere
5std::vector<int> lasers = { 5const std::vector<int> lasers = {
6 0x0360D, // Symmetry 6 0x0360D, // Symmetry
7 0x03615, // Swamp 7 0x03615, // Swamp
8 0x09DE0, // Bunker 8 0x09DE0, // Bunker
@@ -18,7 +18,7 @@ std::vector<int> lasers = {
18}; 18};
19 19
20// Note: Some of these (non-desert) are duplicated elsewhere 20// Note: Some of these (non-desert) are duplicated elsewhere
21std::vector<int> burnablePanels = { 21const std::vector<int> burnablePanels = {
22 0x17D9C, // Treehouse Yellow 7 22 0x17D9C, // Treehouse Yellow 7
23 0x17DC2, // Treehouse Yellow 8 23 0x17DC2, // Treehouse Yellow 8
24 0x17DC4, // Treehouse Yellow 9 24 0x17DC4, // Treehouse Yellow 9
@@ -63,7 +63,7 @@ std::vector<int> burnablePanels = {
63 63
64// Note: Some of these (non-controls) are duplicated elsewhere 64// Note: Some of these (non-controls) are duplicated elsewhere
65// TODO: Gave up 65// TODO: Gave up
66std::vector<int> leftRightPanels = { 66const std::vector<int> leftRightPanels = {
67 0x01A54, // Glass Factory Entry 67 0x01A54, // Glass Factory Entry
68 0x00086, // Glass Factory Vertical Symmetry 1 68 0x00086, // Glass Factory Vertical Symmetry 1
69 0x00087, // Glass Factory Vertical Symmetry 2 69 0x00087, // Glass Factory Vertical Symmetry 2
@@ -77,7 +77,7 @@ std::vector<int> leftRightPanels = {
77}; 77};
78 78
79// Note: Some of these (non-controls) are duplicated elsewhere 79// Note: Some of these (non-controls) are duplicated elsewhere
80std::vector<int> upDownPanels = { 80const std::vector<int> upDownPanels = {
81 0x0008D, // Glass Factory Rotational Symmetry 1 81 0x0008D, // Glass Factory Rotational Symmetry 1
82 0x00081, // Glass Factory Rotational Symmetry 2 82 0x00081, // Glass Factory Rotational Symmetry 2
83 0x00083, // Glass Factory Rotational Symmetry 3 83 0x00083, // Glass Factory Rotational Symmetry 3
@@ -100,7 +100,7 @@ std::vector<int> upDownPanels = {
100}; 100};
101 101
102// Note: Some of these (non-controls) are duplicated elsewhere 102// Note: Some of these (non-controls) are duplicated elsewhere
103std::vector<int> leftForwardRightPanels = { 103const std::vector<int> leftForwardRightPanels = {
104// 0x00075, // Symmetry Island Colored Dots 3 104// 0x00075, // Symmetry Island Colored Dots 3
105// 0x288EA, // UTM Perspective 1 105// 0x288EA, // UTM Perspective 1
106// 0x288FC, // UTM Perspective 2 106// 0x288FC, // UTM Perspective 2
@@ -112,7 +112,7 @@ std::vector<int> leftForwardRightPanels = {
112 0x17E52, // Treehouse Green 4 112 0x17E52, // Treehouse Green 4
113}; 113};
114 114
115std::vector<int> pillars = { 115const std::vector<int> pillars = {
116 0x0383D, // Mountain 3 Left Pillar 1 116 0x0383D, // Mountain 3 Left Pillar 1
117 0x0383F, // Mountain 3 Left Pillar 2 117 0x0383F, // Mountain 3 Left Pillar 2
118 0x03859, // Mountain 3 Left Pillar 3 118 0x03859, // Mountain 3 Left Pillar 3
@@ -126,7 +126,7 @@ std::vector<int> pillars = {
126// 0x1C319, // Challenge Right Pillar 126// 0x1C319, // Challenge Right Pillar
127}; 127};
128 128
129std::vector<int> mountainMultipanel = { 129const std::vector<int> mountainMultipanel = {
130 0x09FCC, // Mountain 2 Multipanel 1 130 0x09FCC, // Mountain 2 Multipanel 1
131 0x09FCE, // Mountain 2 Multipanel 2 131 0x09FCE, // Mountain 2 Multipanel 2
132 0x09FCF, // Mountain 2 Multipanel 3 132 0x09FCF, // Mountain 2 Multipanel 3
@@ -135,7 +135,7 @@ std::vector<int> mountainMultipanel = {
135 0x09FD2, // Mountain 2 Multipanel 6 135 0x09FD2, // Mountain 2 Multipanel 6
136}; 136};
137 137
138std::vector<int> squarePanels = { 138const std::vector<int> squarePanels = {
139 0x00064, // Tutorial Straight 139 0x00064, // Tutorial Straight
140 0x00182, // Tutorial Bend 140 0x00182, // Tutorial Bend
141 0x0A3B2, // Tutorial Back Right 141 0x0A3B2, // Tutorial Back Right
@@ -453,7 +453,7 @@ std::vector<int> squarePanels = {
453 0x09E85, // Tunnels Town Shortcut 453 0x09E85, // Tunnels Town Shortcut
454}; 454};
455 455
456std::vector<int> shadowsPanels = { 456const std::vector<int> shadowsPanels = {
457 0x198B5, // Shadows Tutorial 1 457 0x198B5, // Shadows Tutorial 1
458 0x198BD, // Shadows Tutorial 2 458 0x198BD, // Shadows Tutorial 2
459 0x198BF, // Shadows Tutorial 3 459 0x198BF, // Shadows Tutorial 3
@@ -478,7 +478,7 @@ std::vector<int> shadowsPanels = {
478 0x19650, // Shadows Laser 478 0x19650, // Shadows Laser
479}; 479};
480 480
481std::vector<int> monasteryPanels = { 481const std::vector<int> monasteryPanels = {
482 0x00B10, // Monastery Left Door 482 0x00B10, // Monastery Left Door
483 0x00290, // Monastery Exterior 1 483 0x00290, // Monastery Exterior 1
484 0x00C92, // Monastery Right Door 484 0x00C92, // Monastery Right Door
@@ -493,7 +493,7 @@ std::vector<int> monasteryPanels = {
493 0x17CA4, // Monastery Laser 493 0x17CA4, // Monastery Laser
494}; 494};
495 495
496std::vector<int> bunkerPanels = { 496const std::vector<int> bunkerPanels = {
497 0x09F7D, // Bunker Tutorial 1 497 0x09F7D, // Bunker Tutorial 1
498 0x09FDC, // Bunker Tutorial 2 498 0x09FDC, // Bunker Tutorial 2
499 0x09FF7, // Bunker Tutorial 3 499 0x09FF7, // Bunker Tutorial 3
@@ -514,7 +514,7 @@ std::vector<int> bunkerPanels = {
514 0x0A079, // Bunker Elevator 514 0x0A079, // Bunker Elevator
515}; 515};
516 516
517std::vector<int> junglePanels = { 517const std::vector<int> junglePanels = {
518 0x002C4, // Jungle Waves 1 518 0x002C4, // Jungle Waves 1
519 0x00767, // Jungle Waves 2 519 0x00767, // Jungle Waves 2
520 0x002C6, // Jungle Waves 3 520 0x002C6, // Jungle Waves 3
@@ -533,7 +533,7 @@ std::vector<int> junglePanels = {
533}; 533};
534 534
535// There might be something to do with these, I haven't decided yet. 535// There might be something to do with these, I haven't decided yet.
536std::vector<int> nothingPanels = { 536const std::vector<int> nothingPanels = {
537// Doors & Shortcuts & Shortcut doors & Door controls 537// Doors & Shortcuts & Shortcut doors & Door controls
538 0x0C339, // Desert Surface Door 538 0x0C339, // Desert Surface Door
539 0x0A249, // Desert Pond Exit Door 539 0x0A249, // Desert Pond Exit Door
diff --git a/WitnessRandomizer/WitnessRandomizer.cpp b/WitnessRandomizer/WitnessRandomizer.cpp index efe18b5..d71cc21 100644 --- a/WitnessRandomizer/WitnessRandomizer.cpp +++ b/WitnessRandomizer/WitnessRandomizer.cpp
@@ -1,5 +1,6 @@
1/* 1/*
2 * BUGS: 2 * BUGS:
3 * Shipwreck vault fails, possibly because of dot_reflection?
3 * Treehouse pivots *should* work, but I need to not copy style_flags. 4 * Treehouse pivots *should* work, but I need to not copy style_flags.
4 This seems to cause crashes when pivots appear elsewhere in the world. 5 This seems to cause crashes when pivots appear elsewhere in the world.
5 * FEATURES: 6 * FEATURES:
@@ -17,23 +18,26 @@
17#include <string> 18#include <string>
18#include <iostream> 19#include <iostream>
19#include <numeric> 20#include <numeric>
21#include <chrono>
20 22
21template <class T> 23template <class T>
22int find(const std::vector<T> &data, T search, int startIndex = 0) { 24size_t find(const std::vector<T> &data, T search, size_t startIndex = 0) {
23 for (int i=startIndex ; i<data.size(); i++) { 25 for (size_t i=startIndex ; i<data.size(); i++) {
24 if (data[i] == search) return i; 26 if (data[i] == search) return i;
25 } 27 }
26 return -1; 28 std::cout << "Couldn't find " << search << " in data!" << std::endl;
29 exit(-1);
27} 30}
28 31
29int main(int argc, char** argv) 32int main(int argc, char** argv)
30{ 33{
34
31 WitnessRandomizer randomizer = WitnessRandomizer(); 35 WitnessRandomizer randomizer = WitnessRandomizer();
32 36
33 if (argc == 2) { 37 if (argc == 2) {
34 srand(atoi(argv[1])); // Seed from the command line 38 srand(atoi(argv[1])); // Seed from the command line
35 } else { 39 } else {
36 int seed = time(0) % (1 << 16); // Seed from the time in milliseconds 40 int seed = time(nullptr) % (1 << 16); // Seed from the time in milliseconds
37 std::cout << "Selected seed: " << seed << std::endl; 41 std::cout << "Selected seed: " << seed << std::endl;
38 srand(seed); 42 srand(seed);
39 } 43 }
@@ -71,7 +75,7 @@ int main(int argc, char** argv)
71 // Glass 1 will become door + glass 1, due to the targetting system 75 // Glass 1 will become door + glass 1, due to the targetting system
72 randomizer.RandomizeRange(randomOrder, SWAP_NONE, 1, 10); 76 randomizer.RandomizeRange(randomOrder, SWAP_NONE, 1, 10);
73 // Randomize Glass 1-3 into everything after the door 77 // Randomize Glass 1-3 into everything after the door
74 int glassDoorIndex = find(randomOrder, 9) + 1; 78 const size_t glassDoorIndex = find(randomOrder, 9) + 1;
75 randomizer.RandomizeRange(randomOrder, SWAP_NONE, glassDoorIndex, 12); 79 randomizer.RandomizeRange(randomOrder, SWAP_NONE, glassDoorIndex, 12);
76 randomizer.ReassignTargets(bunkerPanels, randomOrder); 80 randomizer.ReassignTargets(bunkerPanels, randomOrder);
77 81
@@ -121,17 +125,17 @@ WitnessRandomizer::WitnessRandomizer()
121 WritePanelData<float>(0x002C2, CURSOR_SPEED_SCALE, {1.0}); 125 WritePanelData<float>(0x002C2, CURSOR_SPEED_SCALE, {1.0});
122} 126}
123 127
124void WitnessRandomizer::Randomize(std::vector<int> &panels, int flags) { 128void WitnessRandomizer::Randomize(const std::vector<int>& panels, int flags) {
125 return RandomizeRange(panels, flags, 0, panels.size()); 129 return RandomizeRange(panels, flags, 0, panels.size());
126} 130}
127 131
128// Range is [start, end) 132// Range is [start, end)
129void WitnessRandomizer::RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex) { 133void WitnessRandomizer::RandomizeRange(std::vector<int> panels, int flags, size_t startIndex, size_t endIndex) {
130 if (panels.size() == 0) return; 134 if (panels.size() == 0) return;
131 if (startIndex >= endIndex) return; 135 if (startIndex >= endIndex) return;
132 if (endIndex >= panels.size()) endIndex = panels.size(); 136 if (endIndex >= panels.size()) endIndex = panels.size();
133 for (size_t i = endIndex-1; i > startIndex+1; i--) { 137 for (size_t i = endIndex-1; i > startIndex+1; i--) {
134 size_t target = rand() % (i - startIndex) + startIndex; 138 const size_t target = rand() % (i - startIndex) + startIndex;
135 if (i != target) { 139 if (i != target) {
136 // std::cout << "Swapping panels " << std::hex << panels[i] << " and " << std::hex << panels[target] << std::endl; 140 // std::cout << "Swapping panels " << std::hex << panels[i] << " and " << std::hex << panels[target] << std::endl;
137 SwapPanels(panels[i], panels[target], flags); 141 SwapPanels(panels[i], panels[target], flags);
@@ -215,17 +219,17 @@ void WitnessRandomizer::SwapPanels(int panel1, int panel2, int flags) {
215} 219}
216 220
217void WitnessRandomizer::ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order) { 221void WitnessRandomizer::ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order) {
222 // This list is offset by 1, so the target of the Nth panel is in position N (aka the N+1th element)
223 // The first panel may not have a wire to power it, so we use the panel ID itself.
218 std::vector<int> targetToActivatePanel = {panels[0] + 1}; 224 std::vector<int> targetToActivatePanel = {panels[0] + 1};
219 for (int panel : panels) { 225 for (const int panel : panels) {
220 int target = ReadPanelData<int>(panel, TARGET, 1)[0]; 226 int target = ReadPanelData<int>(panel, TARGET, 1)[0];
221 targetToActivatePanel.push_back(target); 227 targetToActivatePanel.push_back(target);
222 } 228 }
223 229
224 for (int i=0; i<order.size() - 1; i++) { 230 for (size_t i=0; i<order.size() - 1; i++) {
225 // order[i+1] is the target panel 231 // Set the target of order[i] to order[i+1], using the "real" target as determined above.
226 // order[i+1] - 1 is the (real) panel before the target panel 232 const int panelTarget = targetToActivatePanel[order[i+1]];
227 // targets[order[i+1] - 1] is the (real) target which will activate the target panel
228 int panelTarget = targetToActivatePanel[order[i+1]];
229 WritePanelData<int>(panels[order[i]], TARGET, {panelTarget}); 233 WritePanelData<int>(panels[order[i]], TARGET, {panelTarget});
230 } 234 }
231} 235}
diff --git a/WitnessRandomizer/WitnessRandomizer.h b/WitnessRandomizer/WitnessRandomizer.h index 0e88cee..3d748d1 100644 --- a/WitnessRandomizer/WitnessRandomizer.h +++ b/WitnessRandomizer/WitnessRandomizer.h
@@ -12,13 +12,13 @@ class WitnessRandomizer {
12public: 12public:
13 WitnessRandomizer(); 13 WitnessRandomizer();
14 14
15 void Randomize(std::vector<int> &panels, int flags); 15 void Randomize(const std::vector<int>& panels, int flags);
16 void RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex); 16 void RandomizeRange(std::vector<int> panels, int flags, size_t startIndex, size_t endIndex);
17 void SwapPanels(int panel1, int panel2, int flags); 17 void SwapPanels(int panel1, int panel2, int flags);
18 void ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order); 18 void ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order);
19 19
20 template <class T> 20 template <class T>
21 std::vector<T> ReadPanelData(int panel, int offset, int size) { 21 std::vector<T> ReadPanelData(int panel, int offset, size_t size) {
22 return _memory.ReadData<T>({GLOBALS, 0x18, panel*8, offset}, size); 22 return _memory.ReadData<T>({GLOBALS, 0x18, panel*8, offset}, size);
23 } 23 }
24 24
diff --git a/WitnessRandomizer/WitnessRandomizer.vcxproj b/WitnessRandomizer/WitnessRandomizer.vcxproj index 49bd186..a737dd3 100644 --- a/WitnessRandomizer/WitnessRandomizer.vcxproj +++ b/WitnessRandomizer/WitnessRandomizer.vcxproj
@@ -81,6 +81,8 @@
81 </PropertyGroup> 81 </PropertyGroup>
82 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> 82 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
83 <LinkIncremental>false</LinkIncremental> 83 <LinkIncremental>false</LinkIncremental>
84 <CodeAnalysisRuleSet>NativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
85 <RunCodeAnalysis>true</RunCodeAnalysis>
84 </PropertyGroup> 86 </PropertyGroup>
85 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 87 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
86 <ClCompile> 88 <ClCompile>
@@ -134,7 +136,7 @@
134 </ItemDefinitionGroup> 136 </ItemDefinitionGroup>
135 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> 137 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
136 <ClCompile> 138 <ClCompile>
137 <PrecompiledHeader>Use</PrecompiledHeader> 139 <PrecompiledHeader>NotUsing</PrecompiledHeader>
138 <WarningLevel>Level3</WarningLevel> 140 <WarningLevel>Level3</WarningLevel>
139 <Optimization>MaxSpeed</Optimization> 141 <Optimization>MaxSpeed</Optimization>
140 <FunctionLevelLinking>true</FunctionLevelLinking> 142 <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -143,6 +145,10 @@
143 <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 145 <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
144 <ConformanceMode>true</ConformanceMode> 146 <ConformanceMode>true</ConformanceMode>
145 <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> 147 <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
148 <LanguageStandard>stdcpp17</LanguageStandard>
149 <EnablePREfast>true</EnablePREfast>
150 <TreatWarningAsError>true</TreatWarningAsError>
151 <DisableSpecificWarnings>26451</DisableSpecificWarnings>
146 </ClCompile> 152 </ClCompile>
147 <Link> 153 <Link>
148 <SubSystem>Console</SubSystem> 154 <SubSystem>Console</SubSystem>