diff options
| -rw-r--r-- | WitnessRandomizer/Memory.cpp | 14 | ||||
| -rw-r--r-- | WitnessRandomizer/Memory.h | 20 | ||||
| -rw-r--r-- | WitnessRandomizer/Panels.h | 26 | ||||
| -rw-r--r-- | WitnessRandomizer/WitnessRandomizer.cpp | 32 | ||||
| -rw-r--r-- | WitnessRandomizer/WitnessRandomizer.h | 6 | ||||
| -rw-r--r-- | WitnessRandomizer/WitnessRandomizer.vcxproj | 8 | ||||
| -rw-r--r-- | WitnessRandomizerInstaller/WitnessRandomizerInstaller.sln | 41 | ||||
| -rw-r--r-- | WitnessRandomizerInstaller/WitnessRandomizerInstaller.vdproj | 697 |
8 files changed, 794 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 | |||
| 52 | void Memory::ThrowError() { | 50 | void 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 | ||
| 59 | uintptr_t Memory::ComputeOffset(std::vector<int> offsets) | 57 | void* 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> | ||
| 7 | using 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: | |||
| 45 | private: | 43 | private: |
| 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 |
| 5 | std::vector<int> lasers = { | 5 | const 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 |
| 21 | std::vector<int> burnablePanels = { | 21 | const 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 |
| 66 | std::vector<int> leftRightPanels = { | 66 | const 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 |
| 80 | std::vector<int> upDownPanels = { | 80 | const 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 |
| 103 | std::vector<int> leftForwardRightPanels = { | 103 | const 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 | ||
| 115 | std::vector<int> pillars = { | 115 | const 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 | ||
| 129 | std::vector<int> mountainMultipanel = { | 129 | const 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 | ||
| 138 | std::vector<int> squarePanels = { | 138 | const 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 | ||
| 456 | std::vector<int> shadowsPanels = { | 456 | const 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 | ||
| 481 | std::vector<int> monasteryPanels = { | 481 | const 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 | ||
| 496 | std::vector<int> bunkerPanels = { | 496 | const 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 | ||
| 517 | std::vector<int> junglePanels = { | 517 | const 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. |
| 536 | std::vector<int> nothingPanels = { | 536 | const 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 | ||
| 21 | template <class T> | 23 | template <class T> |
| 22 | int find(const std::vector<T> &data, T search, int startIndex = 0) { | 24 | size_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 | ||
| 29 | int main(int argc, char** argv) | 32 | int 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 | ||
| 124 | void WitnessRandomizer::Randomize(std::vector<int> &panels, int flags) { | 128 | void 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) |
| 129 | void WitnessRandomizer::RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex) { | 133 | void 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 | ||
| 217 | void WitnessRandomizer::ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order) { | 221 | void 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 { | |||
| 12 | public: | 12 | public: |
| 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> |
| diff --git a/WitnessRandomizerInstaller/WitnessRandomizerInstaller.sln b/WitnessRandomizerInstaller/WitnessRandomizerInstaller.sln new file mode 100644 index 0000000..f202990 --- /dev/null +++ b/WitnessRandomizerInstaller/WitnessRandomizerInstaller.sln | |||
| @@ -0,0 +1,41 @@ | |||
| 1 |  | ||
| 2 | Microsoft Visual Studio Solution File, Format Version 12.00 | ||
| 3 | # Visual Studio 15 | ||
| 4 | VisualStudioVersion = 15.0.28010.2046 | ||
| 5 | MinimumVisualStudioVersion = 10.0.40219.1 | ||
| 6 | Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "WitnessRandomizerInstaller", "WitnessRandomizerInstaller.vdproj", "{BBF9ED06-A4A7-4574-A15A-CF12489F45B8}" | ||
| 7 | EndProject | ||
| 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WitnessRandomizer", "..\WitnessRandomizer\WitnessRandomizer.vcxproj", "{1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}" | ||
| 9 | EndProject | ||
| 10 | Global | ||
| 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
| 12 | Debug|x64 = Debug|x64 | ||
| 13 | Debug|x86 = Debug|x86 | ||
| 14 | Release|x64 = Release|x64 | ||
| 15 | Release|x86 = Release|x86 | ||
| 16 | EndGlobalSection | ||
| 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
| 18 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Debug|x64.ActiveCfg = Debug | ||
| 19 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Debug|x64.Build.0 = Debug | ||
| 20 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Debug|x86.ActiveCfg = Debug | ||
| 21 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Debug|x86.Build.0 = Debug | ||
| 22 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Release|x64.ActiveCfg = Release | ||
| 23 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Release|x64.Build.0 = Release | ||
| 24 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Release|x86.ActiveCfg = Release | ||
| 25 | {BBF9ED06-A4A7-4574-A15A-CF12489F45B8}.Release|x86.Build.0 = Release | ||
| 26 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Debug|x64.ActiveCfg = Debug|x64 | ||
| 27 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Debug|x64.Build.0 = Debug|x64 | ||
| 28 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Debug|x86.ActiveCfg = Debug|Win32 | ||
| 29 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Debug|x86.Build.0 = Debug|Win32 | ||
| 30 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Release|x64.ActiveCfg = Release|x64 | ||
| 31 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Release|x64.Build.0 = Release|x64 | ||
| 32 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Release|x86.ActiveCfg = Release|Win32 | ||
| 33 | {1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}.Release|x86.Build.0 = Release|Win32 | ||
| 34 | EndGlobalSection | ||
| 35 | GlobalSection(SolutionProperties) = preSolution | ||
| 36 | HideSolutionNode = FALSE | ||
| 37 | EndGlobalSection | ||
| 38 | GlobalSection(ExtensibilityGlobals) = postSolution | ||
| 39 | SolutionGuid = {16A86E99-24E8-45C7-A6E2-1FA2C179A898} | ||
| 40 | EndGlobalSection | ||
| 41 | EndGlobal | ||
| diff --git a/WitnessRandomizerInstaller/WitnessRandomizerInstaller.vdproj b/WitnessRandomizerInstaller/WitnessRandomizerInstaller.vdproj new file mode 100644 index 0000000..d655a65 --- /dev/null +++ b/WitnessRandomizerInstaller/WitnessRandomizerInstaller.vdproj | |||
| @@ -0,0 +1,697 @@ | |||
| 1 | "DeployProject" | ||
| 2 | { | ||
| 3 | "VSVersion" = "3:800" | ||
| 4 | "ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" | ||
| 5 | "IsWebType" = "8:FALSE" | ||
| 6 | "ProjectName" = "8:WitnessRandomizerInstaller" | ||
| 7 | "LanguageId" = "3:1033" | ||
| 8 | "CodePage" = "3:1252" | ||
| 9 | "UILanguageId" = "3:1033" | ||
| 10 | "SccProjectName" = "8:" | ||
| 11 | "SccLocalPath" = "8:" | ||
| 12 | "SccAuxPath" = "8:" | ||
| 13 | "SccProvider" = "8:" | ||
| 14 | "Hierarchy" | ||
| 15 | { | ||
| 16 | "Entry" | ||
| 17 | { | ||
| 18 | "MsmKey" = "8:_99BCB0A7745940D890C011AEB10ED05F" | ||
| 19 | "OwnerKey" = "8:_UNDEFINED" | ||
| 20 | "MsmSig" = "8:_UNDEFINED" | ||
| 21 | } | ||
| 22 | } | ||
| 23 | "Configurations" | ||
| 24 | { | ||
| 25 | "Debug" | ||
| 26 | { | ||
| 27 | "DisplayName" = "8:Debug" | ||
| 28 | "IsDebugOnly" = "11:TRUE" | ||
| 29 | "IsReleaseOnly" = "11:FALSE" | ||
| 30 | "OutputFilename" = "8:Debug\\WitnessRandomizerInstaller.msi" | ||
| 31 | "PackageFilesAs" = "3:2" | ||
| 32 | "PackageFileSize" = "3:-2147483648" | ||
| 33 | "CabType" = "3:1" | ||
| 34 | "Compression" = "3:2" | ||
| 35 | "SignOutput" = "11:FALSE" | ||
| 36 | "CertificateFile" = "8:" | ||
| 37 | "PrivateKeyFile" = "8:" | ||
| 38 | "TimeStampServer" = "8:" | ||
| 39 | "InstallerBootstrapper" = "3:2" | ||
| 40 | } | ||
| 41 | "Release" | ||
| 42 | { | ||
| 43 | "DisplayName" = "8:Release" | ||
| 44 | "IsDebugOnly" = "11:FALSE" | ||
| 45 | "IsReleaseOnly" = "11:TRUE" | ||
| 46 | "OutputFilename" = "8:Release\\WitnessRandomizer.msi" | ||
| 47 | "PackageFilesAs" = "3:2" | ||
| 48 | "PackageFileSize" = "3:-2147483648" | ||
| 49 | "CabType" = "3:1" | ||
| 50 | "Compression" = "3:3" | ||
| 51 | "SignOutput" = "11:FALSE" | ||
| 52 | "CertificateFile" = "8:" | ||
| 53 | "PrivateKeyFile" = "8:" | ||
| 54 | "TimeStampServer" = "8:" | ||
| 55 | "InstallerBootstrapper" = "3:2" | ||
| 56 | } | ||
| 57 | } | ||
| 58 | "Deployable" | ||
| 59 | { | ||
| 60 | "CustomAction" | ||
| 61 | { | ||
| 62 | } | ||
| 63 | "DefaultFeature" | ||
| 64 | { | ||
| 65 | "Name" = "8:DefaultFeature" | ||
| 66 | "Title" = "8:" | ||
| 67 | "Description" = "8:" | ||
| 68 | } | ||
| 69 | "ExternalPersistence" | ||
| 70 | { | ||
| 71 | "LaunchCondition" | ||
| 72 | { | ||
| 73 | } | ||
| 74 | } | ||
| 75 | "File" | ||
| 76 | { | ||
| 77 | } | ||
| 78 | "FileType" | ||
| 79 | { | ||
| 80 | } | ||
| 81 | "Folder" | ||
| 82 | { | ||
| 83 | "{3C67513D-01DD-4637-8A68-80971EB9504F}:_D9D31B4A38DF41E78ABAD33DDC72CD52" | ||
| 84 | { | ||
| 85 | "DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]" | ||
| 86 | "Name" = "8:#1925" | ||
| 87 | "AlwaysCreate" = "11:FALSE" | ||
| 88 | "Condition" = "8:" | ||
| 89 | "Transitive" = "11:FALSE" | ||
| 90 | "Property" = "8:TARGETDIR" | ||
| 91 | "Folders" | ||
| 92 | { | ||
| 93 | } | ||
| 94 | } | ||
| 95 | "{1525181F-901A-416C-8A58-119130FE478E}:_E6EFC2A563B94B588E829ED15D2EE070" | ||
| 96 | { | ||
| 97 | "Name" = "8:#1916" | ||
| 98 | "AlwaysCreate" = "11:FALSE" | ||
| 99 | "Condition" = "8:" | ||
| 100 | "Transitive" = "11:FALSE" | ||
| 101 | "Property" = "8:DesktopFolder" | ||
| 102 | "Folders" | ||
| 103 | { | ||
| 104 | } | ||
| 105 | } | ||
| 106 | "{1525181F-901A-416C-8A58-119130FE478E}:_EC75B6D2E5304ADCACB28DC7CA4365A2" | ||
| 107 | { | ||
| 108 | "Name" = "8:#1919" | ||
| 109 | "AlwaysCreate" = "11:FALSE" | ||
| 110 | "Condition" = "8:" | ||
| 111 | "Transitive" = "11:FALSE" | ||
| 112 | "Property" = "8:ProgramMenuFolder" | ||
| 113 | "Folders" | ||
| 114 | { | ||
| 115 | } | ||
| 116 | } | ||
| 117 | } | ||
| 118 | "LaunchCondition" | ||
| 119 | { | ||
| 120 | } | ||
| 121 | "Locator" | ||
| 122 | { | ||
| 123 | } | ||
| 124 | "MsiBootstrapper" | ||
| 125 | { | ||
| 126 | "LangId" = "3:1033" | ||
| 127 | "RequiresElevation" = "11:FALSE" | ||
| 128 | } | ||
| 129 | "Product" | ||
| 130 | { | ||
| 131 | "Name" = "8:Microsoft Visual Studio" | ||
| 132 | "ProductName" = "8:WitnessRandomizerInstaller" | ||
| 133 | "ProductCode" = "8:{D2ADB0EF-B7B6-431F-91A4-ED85925A290F}" | ||
| 134 | "PackageCode" = "8:{31D00A20-20C0-46B5-A0B8-FD53A27831E8}" | ||
| 135 | "UpgradeCode" = "8:{B2AF0F34-4917-4AEC-B892-FE4FD4B9584A}" | ||
| 136 | "AspNetVersion" = "8:2.0.50727.0" | ||
| 137 | "RestartWWWService" = "11:FALSE" | ||
| 138 | "RemovePreviousVersions" = "11:FALSE" | ||
| 139 | "DetectNewerInstalledVersion" = "11:TRUE" | ||
| 140 | "InstallAllUsers" = "11:FALSE" | ||
| 141 | "ProductVersion" = "8:1.0.0" | ||
| 142 | "Manufacturer" = "8:jbzdarkid" | ||
| 143 | "ARPHELPTELEPHONE" = "8:" | ||
| 144 | "ARPHELPLINK" = "8:" | ||
| 145 | "Title" = "8:WitnessRandomizerInstaller" | ||
| 146 | "Subject" = "8:" | ||
| 147 | "ARPCONTACT" = "8:jbzdarkid" | ||
| 148 | "Keywords" = "8:" | ||
| 149 | "ARPCOMMENTS" = "8:Randomizer for The Witness" | ||
| 150 | "ARPURLINFOABOUT" = "8:www.github.com/jbzdarkid/witness-randomizer" | ||
| 151 | "ARPPRODUCTICON" = "8:" | ||
| 152 | "ARPIconIndex" = "3:0" | ||
| 153 | "SearchPath" = "8:" | ||
| 154 | "UseSystemSearchPath" = "11:TRUE" | ||
| 155 | "TargetPlatform" = "3:1" | ||
| 156 | "PreBuildEvent" = "8:" | ||
| 157 | "PostBuildEvent" = "8:" | ||
| 158 | "RunPostBuildEvent" = "3:0" | ||
| 159 | } | ||
| 160 | "Registry" | ||
| 161 | { | ||
| 162 | "HKLM" | ||
| 163 | { | ||
| 164 | "Keys" | ||
| 165 | { | ||
| 166 | "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_99D49F6F3FDE47E6A28761F01AF578E1" | ||
| 167 | { | ||
| 168 | "Name" = "8:Software" | ||
| 169 | "Condition" = "8:" | ||
| 170 | "AlwaysCreate" = "11:FALSE" | ||
| 171 | "DeleteAtUninstall" = "11:FALSE" | ||
| 172 | "Transitive" = "11:FALSE" | ||
| 173 | "Keys" | ||
| 174 | { | ||
| 175 | "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3A41D7EF5BF942FAA46261A8C8A6A3E9" | ||
| 176 | { | ||
| 177 | "Name" = "8:[Manufacturer]" | ||
| 178 | "Condition" = "8:" | ||
| 179 | "AlwaysCreate" = "11:FALSE" | ||
| 180 | "DeleteAtUninstall" = "11:FALSE" | ||
| 181 | "Transitive" = "11:FALSE" | ||
| 182 | "Keys" | ||
| 183 | { | ||
| 184 | } | ||
| 185 | "Values" | ||
| 186 | { | ||
| 187 | } | ||
| 188 | } | ||
| 189 | } | ||
| 190 | "Values" | ||
| 191 | { | ||
| 192 | } | ||
| 193 | } | ||
| 194 | } | ||
| 195 | } | ||
| 196 | "HKCU" | ||
| 197 | { | ||
| 198 | "Keys" | ||
| 199 | { | ||
| 200 | "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AF03DAE7450641EF9CB1A71C5F7E4DAF" | ||
| 201 | { | ||
| 202 | "Name" = "8:Software" | ||
| 203 | "Condition" = "8:" | ||
| 204 | "AlwaysCreate" = "11:FALSE" | ||
| 205 | "DeleteAtUninstall" = "11:FALSE" | ||
| 206 | "Transitive" = "11:FALSE" | ||
| 207 | "Keys" | ||
| 208 | { | ||
| 209 | "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2FE61CAEC5F04B44B9B356786AA5650E" | ||
| 210 | { | ||
| 211 | "Name" = "8:[Manufacturer]" | ||
| 212 | "Condition" = "8:" | ||
| 213 | "AlwaysCreate" = "11:FALSE" | ||
| 214 | "DeleteAtUninstall" = "11:FALSE" | ||
| 215 | "Transitive" = "11:FALSE" | ||
| 216 | "Keys" | ||
| 217 | { | ||
| 218 | } | ||
| 219 | "Values" | ||
| 220 | { | ||
| 221 | } | ||
| 222 | } | ||
| 223 | } | ||
| 224 | "Values" | ||
| 225 | { | ||
| 226 | } | ||
| 227 | } | ||
| 228 | } | ||
| 229 | } | ||
| 230 | "HKCR" | ||
| 231 | { | ||
| 232 | "Keys" | ||
| 233 | { | ||
| 234 | } | ||
| 235 | } | ||
| 236 | "HKU" | ||
| 237 | { | ||
| 238 | "Keys" | ||
| 239 | { | ||
| 240 | } | ||
| 241 | } | ||
| 242 | "HKPU" | ||
| 243 | { | ||
| 244 | "Keys" | ||
| 245 | { | ||
| 246 | } | ||
| 247 | } | ||
| 248 | } | ||
| 249 | "Sequences" | ||
| 250 | { | ||
| 251 | } | ||
| 252 | "Shortcut" | ||
| 253 | { | ||
| 254 | "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_17BDAE346F194FD0B84D3B6F64454455" | ||
| 255 | { | ||
| 256 | "Name" = "8:WitnessRandomizer" | ||
| 257 | "Arguments" = "8:" | ||
| 258 | "Description" = "8:" | ||
| 259 | "ShowCmd" = "3:1" | ||
| 260 | "IconIndex" = "3:0" | ||
| 261 | "Transitive" = "11:FALSE" | ||
| 262 | "Target" = "8:_99BCB0A7745940D890C011AEB10ED05F" | ||
| 263 | "Folder" = "8:_EC75B6D2E5304ADCACB28DC7CA4365A2" | ||
| 264 | "WorkingFolder" = "8:_D9D31B4A38DF41E78ABAD33DDC72CD52" | ||
| 265 | "Icon" = "8:" | ||
| 266 | "Feature" = "8:" | ||
| 267 | } | ||
| 268 | } | ||
| 269 | "UserInterface" | ||
| 270 | { | ||
| 271 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1D0761940F3446ECB1BF115230EEBAAD" | ||
| 272 | { | ||
| 273 | "Name" = "8:#1901" | ||
| 274 | "Sequence" = "3:2" | ||
| 275 | "Attributes" = "3:2" | ||
| 276 | "Dialogs" | ||
| 277 | { | ||
| 278 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_246CF02A71224692AE1FCD645D0C550C" | ||
| 279 | { | ||
| 280 | "Sequence" = "3:100" | ||
| 281 | "DisplayName" = "8:Progress" | ||
| 282 | "UseDynamicProperties" = "11:TRUE" | ||
| 283 | "IsDependency" = "11:FALSE" | ||
| 284 | "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid" | ||
| 285 | "Properties" | ||
| 286 | { | ||
| 287 | "BannerBitmap" | ||
| 288 | { | ||
| 289 | "Name" = "8:BannerBitmap" | ||
| 290 | "DisplayName" = "8:#1001" | ||
| 291 | "Description" = "8:#1101" | ||
| 292 | "Type" = "3:8" | ||
| 293 | "ContextData" = "8:Bitmap" | ||
| 294 | "Attributes" = "3:4" | ||
| 295 | "Setting" = "3:1" | ||
| 296 | "UsePlugInResources" = "11:TRUE" | ||
| 297 | } | ||
| 298 | "ShowProgress" | ||
| 299 | { | ||
| 300 | "Name" = "8:ShowProgress" | ||
| 301 | "DisplayName" = "8:#1009" | ||
| 302 | "Description" = "8:#1109" | ||
| 303 | "Type" = "3:5" | ||
| 304 | "ContextData" = "8:1;True=1;False=0" | ||
| 305 | "Attributes" = "3:0" | ||
| 306 | "Setting" = "3:0" | ||
| 307 | "Value" = "3:1" | ||
| 308 | "DefaultValue" = "3:1" | ||
| 309 | "UsePlugInResources" = "11:TRUE" | ||
| 310 | } | ||
| 311 | } | ||
| 312 | } | ||
| 313 | } | ||
| 314 | } | ||
| 315 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1F1DB42220714DF3AD764FE81693D17B" | ||
| 316 | { | ||
| 317 | "Name" = "8:#1901" | ||
| 318 | "Sequence" = "3:1" | ||
| 319 | "Attributes" = "3:2" | ||
| 320 | "Dialogs" | ||
| 321 | { | ||
| 322 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3BB25E5F9B10409982B7C4A22029DABC" | ||
| 323 | { | ||
| 324 | "Sequence" = "3:100" | ||
| 325 | "DisplayName" = "8:Progress" | ||
| 326 | "UseDynamicProperties" = "11:TRUE" | ||
| 327 | "IsDependency" = "11:FALSE" | ||
| 328 | "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid" | ||
| 329 | "Properties" | ||
| 330 | { | ||
| 331 | "BannerBitmap" | ||
| 332 | { | ||
| 333 | "Name" = "8:BannerBitmap" | ||
| 334 | "DisplayName" = "8:#1001" | ||
| 335 | "Description" = "8:#1101" | ||
| 336 | "Type" = "3:8" | ||
| 337 | "ContextData" = "8:Bitmap" | ||
| 338 | "Attributes" = "3:4" | ||
| 339 | "Setting" = "3:1" | ||
| 340 | "UsePlugInResources" = "11:TRUE" | ||
| 341 | } | ||
| 342 | "ShowProgress" | ||
| 343 | { | ||
| 344 | "Name" = "8:ShowProgress" | ||
| 345 | "DisplayName" = "8:#1009" | ||
| 346 | "Description" = "8:#1109" | ||
| 347 | "Type" = "3:5" | ||
| 348 | "ContextData" = "8:1;True=1;False=0" | ||
| 349 | "Attributes" = "3:0" | ||
| 350 | "Setting" = "3:0" | ||
| 351 | "Value" = "3:1" | ||
| 352 | "DefaultValue" = "3:1" | ||
| 353 | "UsePlugInResources" = "11:TRUE" | ||
| 354 | } | ||
| 355 | } | ||
| 356 | } | ||
| 357 | } | ||
| 358 | } | ||
| 359 | "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_315683E864204DC28444A9A6E1235D0F" | ||
| 360 | { | ||
| 361 | "UseDynamicProperties" = "11:FALSE" | ||
| 362 | "IsDependency" = "11:FALSE" | ||
| 363 | "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim" | ||
| 364 | } | ||
| 365 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_31D3A86D6A484695A7AB5AB54D880CCB" | ||
| 366 | { | ||
| 367 | "Name" = "8:#1902" | ||
| 368 | "Sequence" = "3:1" | ||
| 369 | "Attributes" = "3:3" | ||
| 370 | "Dialogs" | ||
| 371 | { | ||
| 372 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_96ED40E6C3E94DC3944345555DAC2381" | ||
| 373 | { | ||
| 374 | "Sequence" = "3:100" | ||
| 375 | "DisplayName" = "8:Finished" | ||
| 376 | "UseDynamicProperties" = "11:TRUE" | ||
| 377 | "IsDependency" = "11:FALSE" | ||
| 378 | "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid" | ||
| 379 | "Properties" | ||
| 380 | { | ||
| 381 | "BannerBitmap" | ||
| 382 | { | ||
| 383 | "Name" = "8:BannerBitmap" | ||
| 384 | "DisplayName" = "8:#1001" | ||
| 385 | "Description" = "8:#1101" | ||
| 386 | "Type" = "3:8" | ||
| 387 | "ContextData" = "8:Bitmap" | ||
| 388 | "Attributes" = "3:4" | ||
| 389 | "Setting" = "3:1" | ||
| 390 | "UsePlugInResources" = "11:TRUE" | ||
| 391 | } | ||
| 392 | "UpdateText" | ||
| 393 | { | ||
| 394 | "Name" = "8:UpdateText" | ||
| 395 | "DisplayName" = "8:#1058" | ||
| 396 | "Description" = "8:#1158" | ||
| 397 | "Type" = "3:15" | ||
| 398 | "ContextData" = "8:" | ||
| 399 | "Attributes" = "3:0" | ||
| 400 | "Setting" = "3:1" | ||
| 401 | "Value" = "8:#1258" | ||
| 402 | "DefaultValue" = "8:#1258" | ||
| 403 | "UsePlugInResources" = "11:TRUE" | ||
| 404 | } | ||
| 405 | } | ||
| 406 | } | ||
| 407 | } | ||
| 408 | } | ||
| 409 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_43BD3ADF347E4D599B648929E79D2905" | ||
| 410 | { | ||
| 411 | "Name" = "8:#1902" | ||
| 412 | "Sequence" = "3:2" | ||
| 413 | "Attributes" = "3:3" | ||
| 414 | "Dialogs" | ||
| 415 | { | ||
| 416 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_17CF2961248B47F1BE9F048C2821F5AA" | ||
| 417 | { | ||
| 418 | "Sequence" = "3:100" | ||
| 419 | "DisplayName" = "8:Finished" | ||
| 420 | "UseDynamicProperties" = "11:TRUE" | ||
| 421 | "IsDependency" = "11:FALSE" | ||
| 422 | "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid" | ||
| 423 | "Properties" | ||
| 424 | { | ||
| 425 | "BannerBitmap" | ||
| 426 | { | ||
| 427 | "Name" = "8:BannerBitmap" | ||
| 428 | "DisplayName" = "8:#1001" | ||
| 429 | "Description" = "8:#1101" | ||
| 430 | "Type" = "3:8" | ||
| 431 | "ContextData" = "8:Bitmap" | ||
| 432 | "Attributes" = "3:4" | ||
| 433 | "Setting" = "3:1" | ||
| 434 | "UsePlugInResources" = "11:TRUE" | ||
| 435 | } | ||
| 436 | } | ||
| 437 | } | ||
| 438 | } | ||
| 439 | } | ||
| 440 | "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_75C34DD0EF274A3C961526CAE494EB05" | ||
| 441 | { | ||
| 442 | "UseDynamicProperties" = "11:FALSE" | ||
| 443 | "IsDependency" = "11:FALSE" | ||
| 444 | "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim" | ||
| 445 | } | ||
| 446 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_94854F44F47B4AB68C268B55F9272AC8" | ||
| 447 | { | ||
| 448 | "Name" = "8:#1900" | ||
| 449 | "Sequence" = "3:2" | ||
| 450 | "Attributes" = "3:1" | ||
| 451 | "Dialogs" | ||
| 452 | { | ||
| 453 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_91CB7820557245A78F2BEC28E128F5A6" | ||
| 454 | { | ||
| 455 | "Sequence" = "3:200" | ||
| 456 | "DisplayName" = "8:Installation Folder" | ||
| 457 | "UseDynamicProperties" = "11:TRUE" | ||
| 458 | "IsDependency" = "11:FALSE" | ||
| 459 | "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid" | ||
| 460 | "Properties" | ||
| 461 | { | ||
| 462 | "BannerBitmap" | ||
| 463 | { | ||
| 464 | "Name" = "8:BannerBitmap" | ||
| 465 | "DisplayName" = "8:#1001" | ||
| 466 | "Description" = "8:#1101" | ||
| 467 | "Type" = "3:8" | ||
| 468 | "ContextData" = "8:Bitmap" | ||
| 469 | "Attributes" = "3:4" | ||
| 470 | "Setting" = "3:1" | ||
| 471 | "UsePlugInResources" = "11:TRUE" | ||
| 472 | } | ||
| 473 | } | ||
| 474 | } | ||
| 475 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F03A13F3FD82442D9A60ABA8F387556D" | ||
| 476 | { | ||
| 477 | "Sequence" = "3:300" | ||
| 478 | "DisplayName" = "8:Confirm Installation" | ||
| 479 | "UseDynamicProperties" = "11:TRUE" | ||
| 480 | "IsDependency" = "11:FALSE" | ||
| 481 | "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid" | ||
| 482 | "Properties" | ||
| 483 | { | ||
| 484 | "BannerBitmap" | ||
| 485 | { | ||
| 486 | "Name" = "8:BannerBitmap" | ||
| 487 | "DisplayName" = "8:#1001" | ||
| 488 | "Description" = "8:#1101" | ||
| 489 | "Type" = "3:8" | ||
| 490 | "ContextData" = "8:Bitmap" | ||
| 491 | "Attributes" = "3:4" | ||
| 492 | "Setting" = "3:1" | ||
| 493 | "UsePlugInResources" = "11:TRUE" | ||
| 494 | } | ||
| 495 | } | ||
| 496 | } | ||
| 497 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F767EFBE51C14BEEBDDDE4EE34194C2F" | ||
| 498 | { | ||
| 499 | "Sequence" = "3:100" | ||
| 500 | "DisplayName" = "8:Welcome" | ||
| 501 | "UseDynamicProperties" = "11:TRUE" | ||
| 502 | "IsDependency" = "11:FALSE" | ||
| 503 | "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid" | ||
| 504 | "Properties" | ||
| 505 | { | ||
| 506 | "BannerBitmap" | ||
| 507 | { | ||
| 508 | "Name" = "8:BannerBitmap" | ||
| 509 | "DisplayName" = "8:#1001" | ||
| 510 | "Description" = "8:#1101" | ||
| 511 | "Type" = "3:8" | ||
| 512 | "ContextData" = "8:Bitmap" | ||
| 513 | "Attributes" = "3:4" | ||
| 514 | "Setting" = "3:1" | ||
| 515 | "UsePlugInResources" = "11:TRUE" | ||
| 516 | } | ||
| 517 | "CopyrightWarning" | ||
| 518 | { | ||
| 519 | "Name" = "8:CopyrightWarning" | ||
| 520 | "DisplayName" = "8:#1002" | ||
| 521 | "Description" = "8:#1102" | ||
| 522 | "Type" = "3:3" | ||
| 523 | "ContextData" = "8:" | ||
| 524 | "Attributes" = "3:0" | ||
| 525 | "Setting" = "3:1" | ||
| 526 | "Value" = "8:#1202" | ||
| 527 | "DefaultValue" = "8:#1202" | ||
| 528 | "UsePlugInResources" = "11:TRUE" | ||
| 529 | } | ||
| 530 | "Welcome" | ||
| 531 | { | ||
| 532 | "Name" = "8:Welcome" | ||
| 533 | "DisplayName" = "8:#1003" | ||
| 534 | "Description" = "8:#1103" | ||
| 535 | "Type" = "3:3" | ||
| 536 | "ContextData" = "8:" | ||
| 537 | "Attributes" = "3:0" | ||
| 538 | "Setting" = "3:1" | ||
| 539 | "Value" = "8:#1203" | ||
| 540 | "DefaultValue" = "8:#1203" | ||
| 541 | "UsePlugInResources" = "11:TRUE" | ||
| 542 | } | ||
| 543 | } | ||
| 544 | } | ||
| 545 | } | ||
| 546 | } | ||
| 547 | "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_ADBB7C7C5F1C44A5BDF8196F2B399117" | ||
| 548 | { | ||
| 549 | "Name" = "8:#1900" | ||
| 550 | "Sequence" = "3:1" | ||
| 551 | "Attributes" = "3:1" | ||
| 552 | "Dialogs" | ||
| 553 | { | ||
| 554 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_12ABE080AB25431587017EA259F5EE77" | ||
| 555 | { | ||
| 556 | "Sequence" = "3:100" | ||
| 557 | "DisplayName" = "8:Welcome" | ||
| 558 | "UseDynamicProperties" = "11:TRUE" | ||
| 559 | "IsDependency" = "11:FALSE" | ||
| 560 | "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid" | ||
| 561 | "Properties" | ||
| 562 | { | ||
| 563 | "BannerBitmap" | ||
| 564 | { | ||
| 565 | "Name" = "8:BannerBitmap" | ||
| 566 | "DisplayName" = "8:#1001" | ||
| 567 | "Description" = "8:#1101" | ||
| 568 | "Type" = "3:8" | ||
| 569 | "ContextData" = "8:Bitmap" | ||
| 570 | "Attributes" = "3:4" | ||
| 571 | "Setting" = "3:1" | ||
| 572 | "UsePlugInResources" = "11:TRUE" | ||
| 573 | } | ||
| 574 | "CopyrightWarning" | ||
| 575 | { | ||
| 576 | "Name" = "8:CopyrightWarning" | ||
| 577 | "DisplayName" = "8:#1002" | ||
| 578 | "Description" = "8:#1102" | ||
| 579 | "Type" = "3:3" | ||
| 580 | "ContextData" = "8:" | ||
| 581 | "Attributes" = "3:0" | ||
| 582 | "Setting" = "3:1" | ||
| 583 | "Value" = "8:#1202" | ||
| 584 | "DefaultValue" = "8:#1202" | ||
| 585 | "UsePlugInResources" = "11:TRUE" | ||
| 586 | } | ||
| 587 | "Welcome" | ||
| 588 | { | ||
| 589 | "Name" = "8:Welcome" | ||
| 590 | "DisplayName" = "8:#1003" | ||
| 591 | "Description" = "8:#1103" | ||
| 592 | "Type" = "3:3" | ||
| 593 | "ContextData" = "8:" | ||
| 594 | "Attributes" = "3:0" | ||
| 595 | "Setting" = "3:1" | ||
| 596 | "Value" = "8:#1203" | ||
| 597 | "DefaultValue" = "8:#1203" | ||
| 598 | "UsePlugInResources" = "11:TRUE" | ||
| 599 | } | ||
| 600 | } | ||
| 601 | } | ||
| 602 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_342FF2D8B1B84AEF99509E470D61F8DB" | ||
| 603 | { | ||
| 604 | "Sequence" = "3:200" | ||
| 605 | "DisplayName" = "8:Installation Folder" | ||
| 606 | "UseDynamicProperties" = "11:TRUE" | ||
| 607 | "IsDependency" = "11:FALSE" | ||
| 608 | "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid" | ||
| 609 | "Properties" | ||
| 610 | { | ||
| 611 | "BannerBitmap" | ||
| 612 | { | ||
| 613 | "Name" = "8:BannerBitmap" | ||
| 614 | "DisplayName" = "8:#1001" | ||
| 615 | "Description" = "8:#1101" | ||
| 616 | "Type" = "3:8" | ||
| 617 | "ContextData" = "8:Bitmap" | ||
| 618 | "Attributes" = "3:4" | ||
| 619 | "Setting" = "3:1" | ||
| 620 | "UsePlugInResources" = "11:TRUE" | ||
| 621 | } | ||
| 622 | "InstallAllUsersVisible" | ||
| 623 | { | ||
| 624 | "Name" = "8:InstallAllUsersVisible" | ||
| 625 | "DisplayName" = "8:#1059" | ||
| 626 | "Description" = "8:#1159" | ||
| 627 | "Type" = "3:5" | ||
| 628 | "ContextData" = "8:1;True=1;False=0" | ||
| 629 | "Attributes" = "3:0" | ||
| 630 | "Setting" = "3:0" | ||
| 631 | "Value" = "3:1" | ||
| 632 | "DefaultValue" = "3:1" | ||
| 633 | "UsePlugInResources" = "11:TRUE" | ||
| 634 | } | ||
| 635 | } | ||
| 636 | } | ||
| 637 | "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7FA0E634601A4E15A45B2B6BB4AE5C39" | ||
| 638 | { | ||
| 639 | "Sequence" = "3:300" | ||
| 640 | "DisplayName" = "8:Confirm Installation" | ||
| 641 | "UseDynamicProperties" = "11:TRUE" | ||
| 642 | "IsDependency" = "11:FALSE" | ||
| 643 | "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid" | ||
| 644 | "Properties" | ||
| 645 | { | ||
| 646 | "BannerBitmap" | ||
| 647 | { | ||
| 648 | "Name" = "8:BannerBitmap" | ||
| 649 | "DisplayName" = "8:#1001" | ||
| 650 | "Description" = "8:#1101" | ||
| 651 | "Type" = "3:8" | ||
| 652 | "ContextData" = "8:Bitmap" | ||
| 653 | "Attributes" = "3:4" | ||
| 654 | "Setting" = "3:1" | ||
| 655 | "UsePlugInResources" = "11:TRUE" | ||
| 656 | } | ||
| 657 | } | ||
| 658 | } | ||
| 659 | } | ||
| 660 | } | ||
| 661 | } | ||
| 662 | "MergeModule" | ||
| 663 | { | ||
| 664 | } | ||
| 665 | "ProjectOutput" | ||
| 666 | { | ||
| 667 | "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_99BCB0A7745940D890C011AEB10ED05F" | ||
| 668 | { | ||
| 669 | "SourcePath" = "8:x64\\Release\\WitnessRandomizer.exe" | ||
| 670 | "TargetName" = "8:" | ||
| 671 | "Tag" = "8:" | ||
| 672 | "Folder" = "8:_D9D31B4A38DF41E78ABAD33DDC72CD52" | ||
| 673 | "Condition" = "8:" | ||
| 674 | "Transitive" = "11:FALSE" | ||
| 675 | "Vital" = "11:TRUE" | ||
| 676 | "ReadOnly" = "11:FALSE" | ||
| 677 | "Hidden" = "11:FALSE" | ||
| 678 | "System" = "11:FALSE" | ||
| 679 | "Permanent" = "11:FALSE" | ||
| 680 | "SharedLegacy" = "11:FALSE" | ||
| 681 | "PackageAs" = "3:1" | ||
| 682 | "Register" = "3:1" | ||
| 683 | "Exclude" = "11:FALSE" | ||
| 684 | "IsDependency" = "11:FALSE" | ||
| 685 | "IsolateTo" = "8:" | ||
| 686 | "ProjectOutputGroupRegister" = "3:1" | ||
| 687 | "OutputConfiguration" = "8:" | ||
| 688 | "OutputGroupCanonicalName" = "8:Built" | ||
| 689 | "OutputProjectGuid" = "8:{1563D1E2-0A18-4AFC-8D6F-9F8D9A433F31}" | ||
| 690 | "ShowKeyOutput" = "11:TRUE" | ||
| 691 | "ExcludeFilters" | ||
| 692 | { | ||
| 693 | } | ||
| 694 | } | ||
| 695 | } | ||
| 696 | } | ||
| 697 | } | ||
