about summary refs log tree commit diff stats
path: root/ext/wittle_generator/Panel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wittle_generator/Panel.cpp')
-rw-r--r--ext/wittle_generator/Panel.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/ext/wittle_generator/Panel.cpp b/ext/wittle_generator/Panel.cpp index a005467..54c7283 100644 --- a/ext/wittle_generator/Panel.cpp +++ b/ext/wittle_generator/Panel.cpp
@@ -3,6 +3,8 @@
3#include <fstream> 3#include <fstream>
4#include <sstream> 4#include <sstream>
5 5
6#include "Serializer.h"
7
6template <class T> 8template <class T>
7int find(const std::vector<T>& data, T search, size_t startIndex = 0) { 9int find(const std::vector<T>& data, T search, size_t startIndex = 0) {
8 for (size_t i = startIndex; i < data.size(); i++) { 10 for (size_t i = startIndex; i < data.size(); i++) {
@@ -114,3 +116,111 @@ void Panel::Resize(int width, int height) {
114 for (auto& row : _grid) row.resize(height); 116 for (auto& row : _grid) row.resize(height);
115 _resized = true; 117 _resized = true;
116} 118}
119
120std::string Panel::Write() {
121 Serializer serializer;
122 serializer.writeInt(SERIALIZER_VERSION);
123 serializer.writeByte(_width);
124 serializer.writeByte(_height);
125 serializer.writeString("Generated");
126
127 int genericFlags = 0;
128 if (symmetry != Symmetry::None) {
129 genericFlags |= Serializer::Symmetrical;
130 if (symmetry == Symmetry::Horizontal) {
131 genericFlags |= Serializer::SymmetryX;
132 }
133 if (symmetry == Symmetry::Vertical) {
134 genericFlags |= Serializer::SymmetryY;
135 }
136 }
137 serializer.writeByte(genericFlags);
138
139 for (int x = 0; x < _width; x++) {
140 for (int y = 0; y < _height; y++) {
141 int val = _grid[x][y];
142
143 if (x % 2 == 1 && y % 2 == 1) {
144 // This is a grid cell.
145 int symbol = val & 0xF00;
146 if (symbol == Decoration::Triangle) {
147 serializer.writeByte(Serializer::Triangle);
148 serializer.writeColor(val & 0xF);
149 serializer.writeByte((val & 0xF0000) >> 16);
150 } else if (symbol == Decoration::Star) {
151 serializer.writeByte(Serializer::Star);
152 serializer.writeColor(val & 0xF);
153 } else if (symbol == Decoration::Stone) {
154 serializer.writeByte(Serializer::Square);
155 serializer.writeColor(val & 0xF);
156 } else if (symbol == Decoration::Eraser) {
157 serializer.writeByte(Serializer::Nega);
158 serializer.writeColor(val & 0xF);
159 } else if (symbol == Decoration::Poly) {
160 serializer.writeByte(Serializer::Poly);
161 serializer.writeColor(val & 0xF);
162 // TODO: write polyshape
163 } else if (symbol == Decoration::Negative) {
164 serializer.writeByte(Serializer::Ylop);
165 serializer.writeColor(val & 0xF);
166 // TODO: write polyshape
167 } else {
168 serializer.writeByte(Serializer::Nonce);
169 }
170 } else {
171 serializer.writeByte(Serializer::Line);
172 // line, dot, gap
173 serializer.writeByte(Serializer::LineNone);
174 if (val & Decoration::Dot) {
175 if (val & IntersectionFlags::DOT_IS_BLUE) {
176 serializer.writeByte(Serializer::DotBlue);
177 } else if (val & IntersectionFlags::DOT_IS_ORANGE) {
178 serializer.writeByte(Serializer::DotYellow);
179 } else if (val & IntersectionFlags::DOT_IS_INVISIBLE) {
180 serializer.writeByte(Serializer::DotInvisible);
181 } else {
182 serializer.writeByte(Serializer::DotBlack);
183 }
184 } else {
185 serializer.writeByte(Serializer::DotNone);
186 }
187 if (val & Decoration::Gap) {
188 serializer.writeByte(Serializer::GapBreak);
189 } else {
190 serializer.writeByte(Serializer::GapNone);
191 }
192 }
193
194 char startEnd = 0;
195 for (const Point& pos : _startpoints) {
196 if (pos.first == x && pos.second == y) {
197 startEnd |= Serializer::Start;
198 }
199 }
200 for (const Endpoint& endpoint : _endpoints) {
201 if (endpoint.GetX() == x && endpoint.GetY() == y) {
202 if (endpoint.GetDir() & Endpoint::LEFT) {
203 startEnd |= Serializer::EndLeft;
204 }
205 if (endpoint.GetDir() & Endpoint::RIGHT) {
206 startEnd |= Serializer::EndRight;
207 }
208 if (endpoint.GetDir() & Endpoint::UP) {
209 startEnd |= Serializer::EndTop;
210 }
211 if (endpoint.GetDir() & Endpoint::DOWN) {
212 startEnd |= Serializer::EndBottom;
213 }
214 }
215 }
216 serializer.writeByte(startEnd);
217 }
218 }
219
220 serializer.writeInt(0);
221 serializer.writeByte(Serializer::NegationsCancelNegations |
222 Serializer::PrecisePolyominos |
223 Serializer::FlashForErrors);
224
225 return serializer.str();
226}