about summary refs log tree commit diff stats
path: root/Source/Randomizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Randomizer.cpp')
-rw-r--r--Source/Randomizer.cpp48
1 files changed, 24 insertions, 24 deletions
diff --git a/Source/Randomizer.cpp b/Source/Randomizer.cpp index aaddf21..ce784be 100644 --- a/Source/Randomizer.cpp +++ b/Source/Randomizer.cpp
@@ -21,7 +21,7 @@
21template <class T> 21template <class T>
22int find(const std::vector<T> &data, T search, size_t startIndex = 0) { 22int find(const std::vector<T> &data, T search, size_t startIndex = 0) {
23 for (size_t i=startIndex ; i<data.size(); i++) { 23 for (size_t i=startIndex ; i<data.size(); i++) {
24 if (data[i] == search) return i; 24 if (data[i] == search) return static_cast<int>(i);
25 } 25 }
26 std::cout << "Couldn't find " << search << " in data!" << std::endl; 26 std::cout << "Couldn't find " << search << " in data!" << std::endl;
27 exit(-1); 27 exit(-1);
@@ -44,10 +44,10 @@ void Randomizer::Randomize()
44 _lastRandomizedFrame = GetCurrentFrame(); 44 _lastRandomizedFrame = GetCurrentFrame();
45 45
46 // Content swaps -- must happen before squarePanels 46 // Content swaps -- must happen before squarePanels
47 Randomize(upDownPanels, SWAP_LINES); 47 Randomize(upDownPanels, SWAP::LINES);
48 Randomize(leftForwardRightPanels, SWAP_LINES); 48 Randomize(leftForwardRightPanels, SWAP::LINES);
49 49
50 Randomize(squarePanels, SWAP_LINES); 50 Randomize(squarePanels, SWAP::LINES);
51 51
52 // Individual area modifications 52 // Individual area modifications
53 RandomizeTutorial(); 53 RandomizeTutorial();
@@ -88,7 +88,7 @@ void Randomizer::RandomizeSymmetry() {
88} 88}
89 89
90void Randomizer::RandomizeDesert() { 90void Randomizer::RandomizeDesert() {
91 Randomize(desertPanels, SWAP_LINES); 91 Randomize(desertPanels, SWAP::LINES);
92 92
93 // Turn off desert surface 8 93 // Turn off desert surface 8
94 _memory->WritePanelData<float>(0x09F94, POWER, {0.0, 0.0}); 94 _memory->WritePanelData<float>(0x09F94, POWER, {0.0, 0.0});
@@ -126,9 +126,9 @@ void Randomizer::RandomizeShadows() {
126 126
127 std::vector<int> randomOrder(shadowsPanels.size(), 0); 127 std::vector<int> randomOrder(shadowsPanels.size(), 0);
128 std::iota(randomOrder.begin(), randomOrder.end(), 0); 128 std::iota(randomOrder.begin(), randomOrder.end(), 0);
129 RandomizeRange(randomOrder, SWAP_NONE, 0, 8); // Tutorial 129 RandomizeRange(randomOrder, SWAP::NONE, 0, 8); // Tutorial
130 RandomizeRange(randomOrder, SWAP_NONE, 8, 16); // Avoid 130 RandomizeRange(randomOrder, SWAP::NONE, 8, 16); // Avoid
131 RandomizeRange(randomOrder, SWAP_NONE, 16, 21); // Follow 131 RandomizeRange(randomOrder, SWAP::NONE, 16, 21); // Follow
132 ReassignTargets(shadowsPanels, randomOrder); 132 ReassignTargets(shadowsPanels, randomOrder);
133 // Turn off original starting panel 133 // Turn off original starting panel
134 _memory->WritePanelData<float>(shadowsPanels[0], POWER, {0.0f, 0.0f}); 134 _memory->WritePanelData<float>(shadowsPanels[0], POWER, {0.0f, 0.0f});
@@ -142,7 +142,7 @@ void Randomizer::RandomizeTown() {
142void Randomizer::RandomizeMonastery() { 142void Randomizer::RandomizeMonastery() {
143 std::vector<int> randomOrder(monasteryPanels.size(), 0); 143 std::vector<int> randomOrder(monasteryPanels.size(), 0);
144 std::iota(randomOrder.begin(), randomOrder.end(), 0); 144 std::iota(randomOrder.begin(), randomOrder.end(), 0);
145 RandomizeRange(randomOrder, SWAP_NONE, 3, 9); // Outer 2 & 3, Inner 1-4 145 RandomizeRange(randomOrder, SWAP::NONE, 3, 9); // Outer 2 & 3, Inner 1-4
146 ReassignTargets(monasteryPanels, randomOrder); 146 ReassignTargets(monasteryPanels, randomOrder);
147} 147}
148 148
@@ -152,10 +152,10 @@ void Randomizer::RandomizeBunker() {
152 // Randomize Tutorial 2-Advanced Tutorial 4 + Glass 1 152 // Randomize Tutorial 2-Advanced Tutorial 4 + Glass 1
153 // Tutorial 1 cannot be randomized, since no other panel can start on 153 // Tutorial 1 cannot be randomized, since no other panel can start on
154 // Glass 1 will become door + glass 1, due to the targetting system 154 // Glass 1 will become door + glass 1, due to the targetting system
155 RandomizeRange(randomOrder, SWAP_NONE, 1, 10); 155 RandomizeRange(randomOrder, SWAP::NONE, 1, 10);
156 // Randomize Glass 1-3 into everything after the door/glass 1 156 // Randomize Glass 1-3 into everything after the door/glass 1
157 const size_t glass1Index = find(randomOrder, 9); 157 const size_t glass1Index = find(randomOrder, 9);
158 RandomizeRange(randomOrder, SWAP_NONE, glass1Index + 1, 12); 158 RandomizeRange(randomOrder, SWAP::NONE, glass1Index + 1, 12);
159 ReassignTargets(bunkerPanels, randomOrder); 159 ReassignTargets(bunkerPanels, randomOrder);
160} 160}
161 161
@@ -163,8 +163,8 @@ void Randomizer::RandomizeJungle() {
163 std::vector<int> randomOrder(junglePanels.size(), 0); 163 std::vector<int> randomOrder(junglePanels.size(), 0);
164 std::iota(randomOrder.begin(), randomOrder.end(), 0); 164 std::iota(randomOrder.begin(), randomOrder.end(), 0);
165 // Waves 1 cannot be randomized, since no other panel can start on 165 // Waves 1 cannot be randomized, since no other panel can start on
166 RandomizeRange(randomOrder, SWAP_NONE, 1, 7); // Waves 2-7 166 RandomizeRange(randomOrder, SWAP::NONE, 1, 7); // Waves 2-7
167 RandomizeRange(randomOrder, SWAP_NONE, 8, 13); // Pitches 1-6 167 RandomizeRange(randomOrder, SWAP::NONE, 8, 13); // Pitches 1-6
168 ReassignTargets(junglePanels, randomOrder); 168 ReassignTargets(junglePanels, randomOrder);
169} 169}
170 170
@@ -175,8 +175,8 @@ void Randomizer::RandomizeSwamp() {
175 175
176void Randomizer::RandomizeMountain() { 176void Randomizer::RandomizeMountain() {
177 // Randomize lasers & some of mountain 177 // Randomize lasers & some of mountain
178 Randomize(lasers, SWAP_TARGETS); 178 Randomize(lasers, SWAP::TARGETS);
179 Randomize(mountainMultipanel, SWAP_LINES); 179 Randomize(mountainMultipanel, SWAP::LINES);
180 180
181 // Randomize final pillars order 181 // Randomize final pillars order
182 std::vector<int> targets = {pillars[0] + 1}; 182 std::vector<int> targets = {pillars[0] + 1};
@@ -188,8 +188,8 @@ void Randomizer::RandomizeMountain() {
188 188
189 std::vector<int> randomOrder(pillars.size(), 0); 189 std::vector<int> randomOrder(pillars.size(), 0);
190 std::iota(randomOrder.begin(), randomOrder.end(), 0); 190 std::iota(randomOrder.begin(), randomOrder.end(), 0);
191 RandomizeRange(randomOrder, SWAP_NONE, 0, 4); // Left Pillars 1-4 191 RandomizeRange(randomOrder, SWAP::NONE, 0, 4); // Left Pillars 1-4
192 RandomizeRange(randomOrder, SWAP_NONE, 5, 9); // Right Pillars 1-4 192 RandomizeRange(randomOrder, SWAP::NONE, 5, 9); // Right Pillars 1-4
193 ReassignTargets(pillars, randomOrder, targets); 193 ReassignTargets(pillars, randomOrder, targets);
194 // Turn off original starting panels 194 // Turn off original starting panels
195 _memory->WritePanelData<float>(pillars[0], POWER, {0.0f, 0.0f}); 195 _memory->WritePanelData<float>(pillars[0], POWER, {0.0f, 0.0f});
@@ -206,7 +206,7 @@ void Randomizer::RandomizeMountain() {
206void Randomizer::RandomizeChallenge() { 206void Randomizer::RandomizeChallenge() {
207 std::vector<int> randomOrder(challengePanels.size(), 0); 207 std::vector<int> randomOrder(challengePanels.size(), 0);
208 std::iota(randomOrder.begin(), randomOrder.end(), 0); 208 std::iota(randomOrder.begin(), randomOrder.end(), 0);
209 RandomizeRange(randomOrder, SWAP_NONE, 1, 9); // Easy maze - Triple 2 209 RandomizeRange(randomOrder, SWAP::NONE, 1, 9); // Easy maze - Triple 2
210 std::vector<int> triple1Target = _memory->ReadPanelData<int>(0x00C80, TARGET, 1); 210 std::vector<int> triple1Target = _memory->ReadPanelData<int>(0x00C80, TARGET, 1);
211 _memory->WritePanelData<int>(0x00CA1, TARGET, triple1Target); 211 _memory->WritePanelData<int>(0x00CA1, TARGET, triple1Target);
212 _memory->WritePanelData<int>(0x00CB9, TARGET, triple1Target); 212 _memory->WritePanelData<int>(0x00CB9, TARGET, triple1Target);
@@ -219,7 +219,7 @@ void Randomizer::RandomizeChallenge() {
219void Randomizer::RandomizeAudioLogs() { 219void Randomizer::RandomizeAudioLogs() {
220 std::vector<int> randomOrder(audiologs.size(), 0); 220 std::vector<int> randomOrder(audiologs.size(), 0);
221 std::iota(randomOrder.begin(), randomOrder.end(), 0); 221 std::iota(randomOrder.begin(), randomOrder.end(), 0);
222 Randomize(randomOrder, SWAP_NONE); 222 Randomize(randomOrder, SWAP::NONE);
223 ReassignNames(audiologs, randomOrder); 223 ReassignNames(audiologs, randomOrder);
224} 224}
225 225
@@ -231,9 +231,9 @@ void Randomizer::Randomize(std::vector<int>& panels, int flags) {
231void Randomizer::RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex) { 231void Randomizer::RandomizeRange(std::vector<int> &panels, int flags, size_t startIndex, size_t endIndex) {
232 if (panels.size() == 0) return; 232 if (panels.size() == 0) return;
233 if (startIndex >= endIndex) return; 233 if (startIndex >= endIndex) return;
234 if (endIndex >= panels.size()) endIndex = panels.size(); 234 if (endIndex >= panels.size()) endIndex = static_cast<int>(panels.size());
235 for (size_t i = endIndex-1; i > startIndex; i--) { 235 for (size_t i = endIndex-1; i > startIndex; i--) {
236 const size_t target = Random::RandInt(startIndex, i); 236 const int target = Random::RandInt(static_cast<int>(startIndex), static_cast<int>(i));
237 if (i != target) { 237 if (i != target) {
238 // std::cout << "Swapping panels " << std::hex << panels[i] << " and " << std::hex << panels[target] << std::endl; 238 // std::cout << "Swapping panels " << std::hex << panels[i] << " and " << std::hex << panels[target] << std::endl;
239 SwapPanels(panels[i], panels[target], flags); 239 SwapPanels(panels[i], panels[target], flags);
@@ -245,13 +245,13 @@ void Randomizer::RandomizeRange(std::vector<int> &panels, int flags, size_t star
245void Randomizer::SwapPanels(int panel1, int panel2, int flags) { 245void Randomizer::SwapPanels(int panel1, int panel2, int flags) {
246 std::map<int, int> offsets; 246 std::map<int, int> offsets;
247 247
248 if (flags & SWAP_TARGETS) { 248 if (flags & SWAP::TARGETS) {
249 offsets[TARGET] = sizeof(int); 249 offsets[TARGET] = sizeof(int);
250 } 250 }
251 if (flags & SWAP_AUDIO_NAMES) { 251 if (flags & SWAP::AUDIO_NAMES) {
252 offsets[AUDIO_LOG_NAME] = sizeof(void*); 252 offsets[AUDIO_LOG_NAME] = sizeof(void*);
253 } 253 }
254 if (flags & SWAP_LINES) { 254 if (flags & SWAP::LINES) {
255 offsets[PATH_COLOR] = 16; 255 offsets[PATH_COLOR] = 16;
256 offsets[REFLECTION_PATH_COLOR] = 16; 256 offsets[REFLECTION_PATH_COLOR] = 16;
257 offsets[DOT_COLOR] = 16; 257 offsets[DOT_COLOR] = 16;