diff options
Diffstat (limited to 'Source/Puzzle.h')
-rw-r--r-- | Source/Puzzle.h | 76 |
1 files changed, 5 insertions, 71 deletions
diff --git a/Source/Puzzle.h b/Source/Puzzle.h index 94cb4b0..3a8e73b 100644 --- a/Source/Puzzle.h +++ b/Source/Puzzle.h | |||
@@ -62,7 +62,6 @@ struct Cell { | |||
62 | struct Negation {}; | 62 | struct Negation {}; |
63 | struct Pos {int x; int y;}; | 63 | struct Pos {int x; int y;}; |
64 | 64 | ||
65 | #include <cassert> // TODO: Move this + impl to cpp | ||
66 | class Puzzle { | 65 | class Puzzle { |
67 | public: | 66 | public: |
68 | int16_t height; | 67 | int16_t height; |
@@ -77,28 +76,9 @@ public: | |||
77 | std::vector<Negation> negations; | 76 | std::vector<Negation> negations; |
78 | std::vector<Pos> invalidElements; | 77 | std::vector<Pos> invalidElements; |
79 | 78 | ||
80 | inline Cell GetCell(int x, int y) const { | 79 | inline Cell GetCell(int x, int y) const; |
81 | x = Mod(x); | 80 | inline Cell::Color GetLine(int x, int y) const; |
82 | if (!SafeCell(x, y)) return Cell::Undefined(); | 81 | inline void NewGrid(int newWidth, int newHeight); |
83 | return grid[x][y]; | ||
84 | } | ||
85 | inline Cell::Color GetLine(int x, int y) const { | ||
86 | return grid[x][y].color; | ||
87 | } | ||
88 | inline void NewGrid(int newWidth, int newHeight) { | ||
89 | if (newWidth == 0) { | ||
90 | assert(false); | ||
91 | newWidth = width; | ||
92 | newHeight = height; | ||
93 | } else { | ||
94 | // @Cleanup! This should be in the ctor... | ||
95 | width = 2*newWidth + 1; | ||
96 | height = 2*newHeight + 1; | ||
97 | } | ||
98 | grid.clear(); | ||
99 | grid.resize(width); | ||
100 | for (int x=0; x<width; x++) grid[x].resize(height); | ||
101 | } | ||
102 | 82 | ||
103 | // @TODO: | 83 | // @TODO: |
104 | Pos GetSymmetricalPos(int x, int y); | 84 | Pos GetSymmetricalPos(int x, int y); |
@@ -107,52 +87,6 @@ public: | |||
107 | std::vector<std::vector<Cell>> grid; | 87 | std::vector<std::vector<Cell>> grid; |
108 | 88 | ||
109 | private: | 89 | private: |
110 | inline int Mod(int x) const { | 90 | inline int Mod(int x) const; |
111 | if (!pillar) return x; | 91 | inline bool SafeCell(int x, int y) const; |
112 | return (x + width * height * 2) % width; | ||
113 | } | ||
114 | |||
115 | inline bool SafeCell(int x, int y) const { | ||
116 | if (x < 0 || x >= width) return false; | ||
117 | if (y < 0 || y >= height) return false; | ||
118 | return true; | ||
119 | } | ||
120 | }; | ||
121 | |||
122 | class PuzzleSerializer { | ||
123 | public: | ||
124 | PuzzleSerializer(const std::shared_ptr<Memory>& memory); | ||
125 | Puzzle ReadPuzzle(int id); | ||
126 | void WritePuzzle(const Puzzle& p, int id); | ||
127 | |||
128 | private: | ||
129 | // @Bug: Blue and orange are swapped? | ||
130 | enum Flags { | ||
131 | IS_ENDPOINT = 0x1, | ||
132 | IS_STARTPOINT = 0x2, | ||
133 | IS_FULL_GAP = 0x8, | ||
134 | HAS_DOT = 0x20, | ||
135 | DOT_IS_BLUE = 0x100, | ||
136 | DOT_IS_ORANGE = 0x200, | ||
137 | DOT_IS_INVISIBLE = 0x1000, | ||
138 | HAS_ONE_CONN = 0x100000, | ||
139 | HAS_VERTI_CONN = 0x200000, | ||
140 | HAS_HORIZ_CONN = 0x400000, | ||
141 | }; | ||
142 | |||
143 | void ReadIntersections(Puzzle& p, int id); | ||
144 | void ReadDecorations(Puzzle& p, int id); | ||
145 | void WriteIntersections(const Puzzle& p, int id); | ||
146 | void WriteDecorations(const Puzzle& p, int id); | ||
147 | |||
148 | std::tuple<int, int> loc_to_xy(const Puzzle& p, int location) const; | ||
149 | int xy_to_loc(const Puzzle& p, int x, int y) const; | ||
150 | // Decoration location | ||
151 | std::tuple<int, int> dloc_to_xy(const Puzzle& p, int location) const; | ||
152 | int xy_to_dloc(const Puzzle& p, int x, int y) const; | ||
153 | Cell::Dot FlagsToDot(int flags) const; | ||
154 | // Iterate connection lists for another location which is connected to us; return that other location. | ||
155 | int FindConnection(int i, const std::vector<int>& connections_a, const std::vector<int>& connections_b) const; | ||
156 | |||
157 | std::shared_ptr<Memory> _memory; | ||
158 | }; | 92 | }; |