diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/PuzzleSerializer.cpp | 3 | ||||
-rw-r--r-- | Source/Randomizer2.cpp | 47 | ||||
-rw-r--r-- | Source/Randomizer2Core.cpp | 14 |
3 files changed, 53 insertions, 11 deletions
diff --git a/Source/PuzzleSerializer.cpp b/Source/PuzzleSerializer.cpp index da7a336..8165fe8 100644 --- a/Source/PuzzleSerializer.cpp +++ b/Source/PuzzleSerializer.cpp | |||
@@ -157,17 +157,20 @@ void PuzzleSerializer::ReadExtras(Puzzle& p) { | |||
157 | // Note that Y coordinates are reversed: 0.0 (bottom) 1.0 (top) | 157 | // Note that Y coordinates are reversed: 0.0 (bottom) 1.0 (top) |
158 | else if (y1 < y2) p.grid[x][y].end = Cell::Dir::DOWN; | 158 | else if (y1 < y2) p.grid[x][y].end = Cell::Dir::DOWN; |
159 | else if (y1 > y2) p.grid[x][y].end = Cell::Dir::UP; | 159 | else if (y1 > y2) p.grid[x][y].end = Cell::Dir::UP; |
160 | else assert(false); | ||
160 | } else if (_intersectionFlags[i] & Flags::HAS_DOT) { | 161 | } else if (_intersectionFlags[i] & Flags::HAS_DOT) { |
161 | if (x1 < x2) x--; | 162 | if (x1 < x2) x--; |
162 | else if (x1 > x2) x++; | 163 | else if (x1 > x2) x++; |
163 | else if (y1 < y2) y++; | 164 | else if (y1 < y2) y++; |
164 | else if (y1 > y2) y--; | 165 | else if (y1 > y2) y--; |
166 | else assert(false); | ||
165 | p.grid[x][y].dot = FlagsToDot(_intersectionFlags[i]); | 167 | p.grid[x][y].dot = FlagsToDot(_intersectionFlags[i]); |
166 | } else if (_intersectionFlags[i] & Flags::HAS_ONE_CONN) { | 168 | } else if (_intersectionFlags[i] & Flags::HAS_ONE_CONN) { |
167 | if (x1 < x2) x--; | 169 | if (x1 < x2) x--; |
168 | else if (x1 > x2) x++; | 170 | else if (x1 > x2) x++; |
169 | else if (y1 < y2) y++; | 171 | else if (y1 < y2) y++; |
170 | else if (y1 > y2) y--; | 172 | else if (y1 > y2) y--; |
173 | else assert(false); | ||
171 | p.grid[x][y].gap = Cell::Gap::BREAK; | 174 | p.grid[x][y].gap = Cell::Gap::BREAK; |
172 | gapLocations[i] = Pos{x, y}; | 175 | gapLocations[i] = Pos{x, y}; |
173 | } | 176 | } |
diff --git a/Source/Randomizer2.cpp b/Source/Randomizer2.cpp index 107950d..d2046bb 100644 --- a/Source/Randomizer2.cpp +++ b/Source/Randomizer2.cpp | |||
@@ -208,6 +208,53 @@ void Randomizer2::RandomizeSymmetry() { | |||
208 | 208 | ||
209 | _serializer.WritePuzzle(p, 0x59); | 209 | _serializer.WritePuzzle(p, 0x59); |
210 | } | 210 | } |
211 | { // Back wall 4 | ||
212 | Puzzle p; | ||
213 | p.NewGrid(5, 8); | ||
214 | p.symmetry = Puzzle::Symmetry::X; | ||
215 | p.grid[2][16].start = true; | ||
216 | p.grid[8][16].start = true; | ||
217 | p.grid[4][0].end = Cell::Dir::UP; | ||
218 | p.grid[6][0].end = Cell::Dir::UP; | ||
219 | std::vector<Pos> cutEdges = Randomizer2Core::CutSymmetricalEdgePairs(p, 15); | ||
220 | for (int i=0; i<cutEdges.size(); i++) { | ||
221 | Pos pos = cutEdges[i]; | ||
222 | if (i%2 == 0) { | ||
223 | p.grid[pos.x][pos.y].gap = Cell::Gap::BREAK; | ||
224 | } else { | ||
225 | Pos sym = p.GetSymmetricalPos(pos.x, pos.y); | ||
226 | p.grid[sym.x][sym.y].gap = Cell::Gap::BREAK; | ||
227 | } | ||
228 | } | ||
229 | |||
230 | _serializer.WritePuzzle(p, 0x62); | ||
231 | } | ||
232 | { // Back wall 5 | ||
233 | Puzzle p; | ||
234 | p.NewGrid(11, 8); | ||
235 | p.symmetry = Puzzle::Symmetry::X; | ||
236 | p.grid[0][16].start = true; | ||
237 | p.grid[10][16].start = true; | ||
238 | p.grid[12][16].start = true; | ||
239 | p.grid[22][16].start = true; | ||
240 | p.grid[2][0].end = Cell::Dir::UP; | ||
241 | p.grid[8][0].end = Cell::Dir::UP; | ||
242 | p.grid[14][0].end = Cell::Dir::UP; | ||
243 | p.grid[20][0].end = Cell::Dir::UP; | ||
244 | |||
245 | Puzzle q; | ||
246 | q.NewGrid(5, 8); | ||
247 | q.symmetry = Puzzle::Symmetry::X; | ||
248 | |||
249 | for (Pos pos : Randomizer2Core::CutSymmetricalEdgePairs(q, 16)) { | ||
250 | p.grid[pos.x][pos.y].gap = Cell::Gap::BREAK; | ||
251 | } | ||
252 | for (Pos pos : Randomizer2Core::CutSymmetricalEdgePairs(q, 16)) { | ||
253 | p.grid[pos.x + 12][pos.y].gap = Cell::Gap::BREAK; | ||
254 | } | ||
255 | |||
256 | _serializer.WritePuzzle(p, 0x5C); | ||
257 | } | ||
211 | } | 258 | } |
212 | 259 | ||
213 | void Randomizer2::RandomizeKeep() { | 260 | void Randomizer2::RandomizeKeep() { |
diff --git a/Source/Randomizer2Core.cpp b/Source/Randomizer2Core.cpp index ceb726b..eaefa9a 100644 --- a/Source/Randomizer2Core.cpp +++ b/Source/Randomizer2Core.cpp | |||
@@ -18,17 +18,9 @@ std::vector<Pos> Randomizer2Core::CutSymmetricalEdgePairs(const Puzzle& p, size_ | |||
18 | Puzzle copy = p; | 18 | Puzzle copy = p; |
19 | assert(p.symmetry != Puzzle::Symmetry::NONE); | 19 | assert(p.symmetry != Puzzle::Symmetry::NONE); |
20 | if (p.symmetry == Puzzle::Symmetry::X) { | 20 | if (p.symmetry == Puzzle::Symmetry::X) { |
21 | if (p.width%4 == 1) { | 21 | // Prevent cuts from landing on the midline |
22 | // The puzle has an even width (e.g. 4x4), so it has a midline for symmetry. | 22 | for (int y=0; y<p.height; y++) { |
23 | // Since this midline is unusable, we cut it pre-emptively. | 23 | copy.grid[p.width/2][y].gap = Cell::Gap::FULL; |
24 | for (int y=0; y<p.height; y++) { | ||
25 | copy.grid[p.width/2][y].gap = Cell::Gap::FULL; | ||
26 | } | ||
27 | } else { | ||
28 | // The puzzle has an odd width (e.g. 3x3), but we still need to cut the midline. | ||
29 | for (int y=0; y<p.height; y++) { | ||
30 | copy.grid[p.width/2][y].gap = Cell::Gap::FULL; | ||
31 | } | ||
32 | } | 24 | } |
33 | 25 | ||
34 | return CutEdgesInternal(copy, 0, (p.width-1)/2, 0, p.height, numEdges); | 26 | return CutEdgesInternal(copy, 0, (p.width-1)/2, 0, p.height, numEdges); |