diff options
Diffstat (limited to 'WitnessRandomizer')
-rw-r--r-- | WitnessRandomizer/Panels.h | 15 | ||||
-rw-r--r-- | WitnessRandomizer/WitnessRandomizer.cpp | 26 | ||||
-rw-r--r-- | WitnessRandomizer/WitnessRandomizer.h | 2 |
3 files changed, 23 insertions, 20 deletions
diff --git a/WitnessRandomizer/Panels.h b/WitnessRandomizer/Panels.h index 3120357..9589ace 100644 --- a/WitnessRandomizer/Panels.h +++ b/WitnessRandomizer/Panels.h | |||
@@ -9,6 +9,8 @@ std::vector<int> lasers = { | |||
9 | 0x17CA4, // Monastery | 9 | 0x17CA4, // Monastery |
10 | 0x032F5, // Town | 10 | 0x032F5, // Town |
11 | 0x03613, // Treehouse | 11 | 0x03613, // Treehouse |
12 | 0x0360E, // Keep Front Laser | ||
13 | // 0x03317, // Keep Back Laser | ||
12 | // 0x03608, // Desert | 14 | // 0x03608, // Desert |
13 | 0x03612, // Quarry | 15 | 0x03612, // Quarry |
14 | 0x03616, // Jungle | 16 | 0x03616, // Jungle |
@@ -34,7 +36,6 @@ std::vector<int> burnablePanels = { | |||
34 | 0x28ACB, // Town Blue 4 | 36 | 0x28ACB, // Town Blue 4 |
35 | 0x28ACC, // Town Blue 5 | 37 | 0x28ACC, // Town Blue 5 |
36 | 0x17CF0, // Mill Discard | 38 | 0x17CF0, // Mill Discard |
37 | 0x17C31, // Desert Final Transparent | ||
38 | 39 | ||
39 | 0x00698, // Desert Surface 1 | 40 | 0x00698, // Desert Surface 1 |
40 | 0x0048F, // Desert Surface 2 | 41 | 0x0048F, // Desert Surface 2 |
@@ -100,10 +101,10 @@ std::vector<int> upDownPanels = { | |||
100 | 101 | ||
101 | // Note: Some of these (non-controls) are duplicated elsewhere | 102 | // Note: Some of these (non-controls) are duplicated elsewhere |
102 | std::vector<int> leftForwardRightPanels = { | 103 | std::vector<int> leftForwardRightPanels = { |
103 | // 0x00075, // Symmetry Island Colored Dots 3 | 104 | 0x00075, // Symmetry Island Colored Dots 3 |
104 | // 0x288EA, // UTM Perspective 1 | 105 | 0x288EA, // UTM Perspective 1 |
105 | // 0x288FC, // UTM Perspective 2 | 106 | 0x288FC, // UTM Perspective 2 |
106 | // 0x289E7, // UTM Perspective 3 | 107 | 0x289E7, // UTM Perspective 3 |
107 | 108 | ||
108 | 0x17DD1, // Treehouse Left Orange 9 | 109 | 0x17DD1, // Treehouse Left Orange 9 |
109 | 0x17CE3, // Treehouse Right Orange 4 | 110 | 0x17CE3, // Treehouse Right Orange 4 |
@@ -198,7 +199,6 @@ std::vector<int> squarePanels = { | |||
198 | 0x00A68, // Symmetry Island Laser Blue 3 | 199 | 0x00A68, // Symmetry Island Laser Blue 3 |
199 | 0x17CE7, // Desert Discard | 200 | 0x17CE7, // Desert Discard |
200 | 0x0CC7B, // Desert Vault | 201 | 0x0CC7B, // Desert Vault |
201 | 0x17C31, // Desert Final Transparent | ||
202 | 0x01E5A, // Mill Entry Door Left | 202 | 0x01E5A, // Mill Entry Door Left |
203 | 0x01E59, // Mill Entry Door Right | 203 | 0x01E59, // Mill Entry Door Right |
204 | 0x00E0C, // Mill Lower Row 1 | 204 | 0x00E0C, // Mill Lower Row 1 |
@@ -306,7 +306,6 @@ std::vector<int> squarePanels = { | |||
306 | 0x17D27, // Keep Discard | 306 | 0x17D27, // Keep Discard |
307 | 0x17D28, // Shipwreck Discard | 307 | 0x17D28, // Shipwreck Discard |
308 | 0x00AFB, // Shipwreck Vault | 308 | 0x00AFB, // Shipwreck Vault |
309 | 0x19650, // Shadows Laser | ||
310 | 0x2899C, // Town 25 Dots 1 | 309 | 0x2899C, // Town 25 Dots 1 |
311 | 0x28A33, // Town 25 Dots 2 | 310 | 0x28A33, // Town 25 Dots 2 |
312 | 0x28ABF, // Town 25 Dots 3 | 311 | 0x28ABF, // Town 25 Dots 3 |
@@ -673,4 +672,6 @@ std::vector<int> nothingPanels = { | |||
673 | // 0x15ADD, // Jungle Vault | 672 | // 0x15ADD, // Jungle Vault |
674 | // 0x17CAA, // Jungle Courtyard Gate | 673 | // 0x17CAA, // Jungle Courtyard Gate |
675 | 0x0005C, // Glass Factory Vertical Symmetry 5 | 674 | 0x0005C, // Glass Factory Vertical Symmetry 5 |
675 | 0x17C31, // Desert Final Transparent | ||
676 | 0x19650, // Shadows Laser | ||
676 | }; | 677 | }; |
diff --git a/WitnessRandomizer/WitnessRandomizer.cpp b/WitnessRandomizer/WitnessRandomizer.cpp index 70e4fb2..47f9daa 100644 --- a/WitnessRandomizer/WitnessRandomizer.cpp +++ b/WitnessRandomizer/WitnessRandomizer.cpp | |||
@@ -1,8 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * BUGS: | ||
3 | * 3-way in treehouse not working :( | ||
4 | * Mountain orange is copying movement data :( | ||
5 | * Treehouse panels are not copying color? | ||
6 | * FEATURES: | 2 | * FEATURES: |
7 | * SWAP_TARGETS should still require the full panel sequence (and have ways to prevent softlocks?) | 3 | * SWAP_TARGETS should still require the full panel sequence (and have ways to prevent softlocks?) |
8 | ** Think about: Jungle | 4 | ** Think about: Jungle |
@@ -11,8 +7,6 @@ | |||
11 | * Randomize audio logs | 7 | * Randomize audio logs |
12 | * Swap sounds in jungle (along with panels) -- maybe impossible | 8 | * Swap sounds in jungle (along with panels) -- maybe impossible |
13 | * Make orange 7 (all of oranges?) hard. Like big = hard. | 9 | * Make orange 7 (all of oranges?) hard. Like big = hard. |
14 | * Kill panel slowdown in tutorial | ||
15 | * Fix desert elevator (laser rando) / Add keep? | ||
16 | */ | 10 | */ |
17 | #include "Memory.h" | 11 | #include "Memory.h" |
18 | #include "WitnessRandomizer.h" | 12 | #include "WitnessRandomizer.h" |
@@ -44,16 +38,17 @@ int main(int argc, char** argv) | |||
44 | 38 | ||
45 | // Content swaps -- must happen before squarePanels | 39 | // Content swaps -- must happen before squarePanels |
46 | randomizer.Randomize(upDownPanels, SWAP_LINES | SWAP_STYLE); | 40 | randomizer.Randomize(upDownPanels, SWAP_LINES | SWAP_STYLE); |
47 | randomizer.Randomize(leftForwardRightPanels, SWAP_LINES | SWAP_STYLE); | 41 | randomizer.Randomize(leftForwardRightPanels, SWAP_LINES); |
48 | 42 | ||
49 | randomizer.Randomize(squarePanels, SWAP_LINES | SWAP_STYLE); | 43 | randomizer.Randomize(squarePanels, SWAP_LINES | SWAP_STYLE); |
50 | 44 | ||
51 | // Frame swaps -- must happen after squarePanels | 45 | // Frame swaps -- must happen after squarePanels |
52 | randomizer.Randomize(burnablePanels, SWAP_LINES | SWAP_STYLE); | 46 | randomizer.Randomize(burnablePanels, SWAP_LINES | SWAP_STYLE); |
53 | 47 | ||
54 | |||
55 | // Target swaps, can happen whenever | 48 | // Target swaps, can happen whenever |
56 | randomizer.Randomize(lasers, SWAP_TARGETS); | 49 | randomizer.Randomize(lasers, SWAP_TARGETS); |
50 | // Read the target of keep front laser, and write it to keep back laser. | ||
51 | randomizer.Overwrite(0x0360E, 0x03317, 0x2BC, sizeof(int)); | ||
57 | 52 | ||
58 | std::vector<int> randomOrder = std::vector(junglePanels.size(), 0); | 53 | std::vector<int> randomOrder = std::vector(junglePanels.size(), 0); |
59 | std::iota(randomOrder.begin(), randomOrder.end(), 0); | 54 | std::iota(randomOrder.begin(), randomOrder.end(), 0); |
@@ -138,7 +133,7 @@ void WitnessRandomizer::SwapPanels(int panel1, int panel2, int flags) { | |||
138 | } | 133 | } |
139 | if (flags & SWAP_LINES) { | 134 | if (flags & SWAP_LINES) { |
140 | offsets[0x230] = 16; // traced_edges | 135 | offsets[0x230] = 16; // traced_edges |
141 | offsets[0x220] = sizeof(void*); // *pattern_name | 136 | // offsets[0x220] = sizeof(void*); // *pattern_name |
142 | // offsets[0x240] = sizeof(void*); // *mesh_name | 137 | // offsets[0x240] = sizeof(void*); // *mesh_name |
143 | offsets[0x2FC] = sizeof(int); // is_cylinder | 138 | offsets[0x2FC] = sizeof(int); // is_cylinder |
144 | offsets[0x300] = sizeof(float); // cylinder_z0 | 139 | offsets[0x300] = sizeof(float); // cylinder_z0 |
@@ -164,7 +159,6 @@ void WitnessRandomizer::SwapPanels(int panel1, int panel2, int flags) { | |||
164 | offsets[0x440] = sizeof(void*); // *reflection_data | 159 | offsets[0x440] = sizeof(void*); // *reflection_data |
165 | offsets[0x448] = sizeof(int); // grid_size_x | 160 | offsets[0x448] = sizeof(int); // grid_size_x |
166 | offsets[0x44C] = sizeof(int); // grid_size_y | 161 | offsets[0x44C] = sizeof(int); // grid_size_y |
167 | offsets[0x450] = sizeof(int); // style_flags // This is required to not ignore dots | ||
168 | offsets[0x45C] = sizeof(int); // sequence_len | 162 | offsets[0x45C] = sizeof(int); // sequence_len |
169 | offsets[0x460] = sizeof(void*); // *sequence | 163 | offsets[0x460] = sizeof(void*); // *sequence |
170 | offsets[0x468] = sizeof(int); // dot_sequence_len | 164 | offsets[0x468] = sizeof(int); // dot_sequence_len |
@@ -173,8 +167,6 @@ void WitnessRandomizer::SwapPanels(int panel1, int panel2, int flags) { | |||
173 | offsets[0x480] = sizeof(void*); // *dot_sequence_reflection | 167 | offsets[0x480] = sizeof(void*); // *dot_sequence_reflection |
174 | offsets[0x4B0] = sizeof(void*); // *panel_target | 168 | offsets[0x4B0] = sizeof(void*); // *panel_target |
175 | offsets[0x4D8] = sizeof(void*); // *specular_texture | 169 | offsets[0x4D8] = sizeof(void*); // *specular_texture |
176 | } | ||
177 | if (flags & SWAP_STYLE) { | ||
178 | offsets[0xC8] = 16; // path_color | 170 | offsets[0xC8] = 16; // path_color |
179 | offsets[0xD8] = 16; // reflection_path_color | 171 | offsets[0xD8] = 16; // reflection_path_color |
180 | // offsets[0xE8] = 16; // deprecated_finished_path_color | 172 | // offsets[0xE8] = 16; // deprecated_finished_path_color |
@@ -204,9 +196,14 @@ void WitnessRandomizer::SwapPanels(int panel1, int panel2, int flags) { | |||
204 | offsets[0x4A8] = sizeof(void*); // *colored_regions | 196 | offsets[0x4A8] = sizeof(void*); // *colored_regions |
205 | // offsets[0x4B8] = sizeof(void*); // *backing_texture | 197 | // offsets[0x4B8] = sizeof(void*); // *backing_texture |
206 | } | 198 | } |
199 | if (flags & SWAP_STYLE) { | ||
200 | offsets[0x450] = sizeof(int); // style_flags | ||
201 | } | ||
202 | /* | ||
207 | if (flags & SWAP_BACK_DISTANCE) { | 203 | if (flags & SWAP_BACK_DISTANCE) { |
208 | offsets[0x22C] = sizeof(float); // extra_back_distance | 204 | offsets[0x22C] = sizeof(float); // extra_back_distance |
209 | } | 205 | } |
206 | */ | ||
210 | 207 | ||
211 | for (auto const& [offset, size] : offsets) { | 208 | for (auto const& [offset, size] : offsets) { |
212 | SwapPanelData(panel1, panel2, offset, size); | 209 | SwapPanelData(panel1, panel2, offset, size); |
@@ -262,3 +259,8 @@ void WitnessRandomizer::TurnOn(int panel) { | |||
262 | void WitnessRandomizer::TurnOff(int panel) { | 259 | void WitnessRandomizer::TurnOff(int panel) { |
263 | _memory.WriteData<float>({0x5B28C0, 0x18, panel*8, 0x2A8}, {0.0f, 0.0f}); | 260 | _memory.WriteData<float>({0x5B28C0, 0x18, panel*8, 0x2A8}, {0.0f, 0.0f}); |
264 | } | 261 | } |
262 | |||
263 | void WitnessRandomizer::Overwrite(int panel1, int panel2, int offset, int size) { | ||
264 | std::vector<byte> data = _memory.ReadData<int>({0x5B28C0, 0x18, panel1*8, offset}, size); | ||
265 | _memory.WriteData<byte>({0x5B28C0, 0x18, panel2*8, offset}, data); | ||
266 | } \ No newline at end of file | ||
diff --git a/WitnessRandomizer/WitnessRandomizer.h b/WitnessRandomizer/WitnessRandomizer.h index f9a66c4..527fe13 100644 --- a/WitnessRandomizer/WitnessRandomizer.h +++ b/WitnessRandomizer/WitnessRandomizer.h | |||
@@ -15,7 +15,7 @@ public: | |||
15 | void RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex); | 15 | void RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex); |
16 | void SwapPanels(int panel1, int panel2, int flags); | 16 | void SwapPanels(int panel1, int panel2, int flags); |
17 | void ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order); | 17 | void ReassignTargets(const std::vector<int>& panels, const std::vector<int>& order); |
18 | 18 | void Overwrite(int panel1, int panel2, int offset, int size); | |
19 | 19 | ||
20 | //private: | 20 | //private: |
21 | void TurnOn(int panel); | 21 | void TurnOn(int panel); |