diff options
Diffstat (limited to 'WitnessRandomizer')
-rw-r--r-- | WitnessRandomizer/Memory.cpp | 19 | ||||
-rw-r--r-- | WitnessRandomizer/Memory.h | 2 | ||||
-rw-r--r-- | WitnessRandomizer/Panels.h | 8 | ||||
-rw-r--r-- | WitnessRandomizer/WitnessRandomizer.cpp | 3 |
4 files changed, 19 insertions, 13 deletions
diff --git a/WitnessRandomizer/Memory.cpp b/WitnessRandomizer/Memory.cpp index 92a5136..6077691 100644 --- a/WitnessRandomizer/Memory.cpp +++ b/WitnessRandomizer/Memory.cpp | |||
@@ -62,18 +62,21 @@ uintptr_t Memory::ComputeOffset(std::vector<int> offsets) | |||
62 | int final_offset = offsets.back(); | 62 | int final_offset = offsets.back(); |
63 | offsets.pop_back(); | 63 | offsets.pop_back(); |
64 | 64 | ||
65 | auto search = _computedOffsets.find(offsets); | ||
66 | if (search != std::end(_computedOffsets)) { | ||
67 | return search->second + final_offset; | ||
68 | } | ||
69 | |||
70 | uintptr_t cumulativeAddress = _baseAddress; | 65 | uintptr_t cumulativeAddress = _baseAddress; |
71 | for (int offset : offsets) { | 66 | for (int offset : offsets) { |
72 | cumulativeAddress += offset; | 67 | cumulativeAddress += offset; |
73 | if (!ReadProcessMemory(_handle, (LPVOID)cumulativeAddress, &cumulativeAddress, sizeof(uintptr_t), NULL)) { | 68 | |
74 | ThrowError(); | 69 | auto search = _computedAddresses.find(cumulativeAddress); |
70 | if (search == std::end(_computedAddresses)) { | ||
71 | // If the address is not yet computed, then compute it. | ||
72 | uintptr_t computedAddress = 0; | ||
73 | if (!ReadProcessMemory(_handle, (LPVOID)cumulativeAddress, &computedAddress, sizeof(uintptr_t), NULL)) { | ||
74 | ThrowError(); | ||
75 | } | ||
76 | _computedAddresses[cumulativeAddress] = computedAddress; | ||
75 | } | 77 | } |
78 | |||
79 | cumulativeAddress = _computedAddresses[cumulativeAddress]; | ||
76 | } | 80 | } |
77 | _computedOffsets[offsets] = cumulativeAddress; | ||
78 | return cumulativeAddress + final_offset; | 81 | return cumulativeAddress + final_offset; |
79 | } | 82 | } |
diff --git a/WitnessRandomizer/Memory.h b/WitnessRandomizer/Memory.h index 390269c..6f5b8b7 100644 --- a/WitnessRandomizer/Memory.h +++ b/WitnessRandomizer/Memory.h | |||
@@ -47,7 +47,7 @@ private: | |||
47 | 47 | ||
48 | uintptr_t ComputeOffset(std::vector<int> offsets); | 48 | uintptr_t ComputeOffset(std::vector<int> offsets); |
49 | 49 | ||
50 | std::map<std::vector<int>, uintptr_t> _computedOffsets; | 50 | std::map<uintptr_t, uintptr_t> _computedAddresses; |
51 | uintptr_t _baseAddress; | 51 | uintptr_t _baseAddress; |
52 | HANDLE _handle; | 52 | HANDLE _handle; |
53 | }; \ No newline at end of file | 53 | }; \ No newline at end of file |
diff --git a/WitnessRandomizer/Panels.h b/WitnessRandomizer/Panels.h index 9589ace..4f7ff2d 100644 --- a/WitnessRandomizer/Panels.h +++ b/WitnessRandomizer/Panels.h | |||
@@ -101,10 +101,10 @@ std::vector<int> upDownPanels = { | |||
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 | 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 |
107 | 0x289E7, // UTM Perspective 3 | 107 | // 0x289E7, // UTM Perspective 3 |
108 | 108 | ||
109 | 0x17DD1, // Treehouse Left Orange 9 | 109 | 0x17DD1, // Treehouse Left Orange 9 |
110 | 0x17CE3, // Treehouse Right Orange 4 | 110 | 0x17CE3, // Treehouse Right Orange 4 |
diff --git a/WitnessRandomizer/WitnessRandomizer.cpp b/WitnessRandomizer/WitnessRandomizer.cpp index dacb8fe..c5cf0bb 100644 --- a/WitnessRandomizer/WitnessRandomizer.cpp +++ b/WitnessRandomizer/WitnessRandomizer.cpp | |||
@@ -1,4 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * BUGS: | ||
3 | * 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. | ||
2 | * FEATURES: | 5 | * FEATURES: |
3 | * SWAP_TARGETS should still require the full panel sequence (and have ways to prevent softlocks?) | 6 | * SWAP_TARGETS should still require the full panel sequence (and have ways to prevent softlocks?) |
4 | ** Think about: Jungle | 7 | ** Think about: Jungle |