diff options
Diffstat (limited to 'Source/Puzzle.cpp')
| -rw-r--r-- | Source/Puzzle.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
| diff --git a/Source/Puzzle.cpp b/Source/Puzzle.cpp index f0664c7..101ec7c 100644 --- a/Source/Puzzle.cpp +++ b/Source/Puzzle.cpp | |||
| @@ -45,6 +45,94 @@ Pos Puzzle::GetSymmetricalPos(int x, int y) const { | |||
| 45 | return Pos{x, y}; | 45 | return Pos{x, y}; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | #include "json.hpp" | ||
| 49 | nlohmann::json newGrid(int width, int height) { | ||
| 50 | using namespace nlohmann; | ||
| 51 | |||
| 52 | json grid; | ||
| 53 | for (int x=0; x<width; x++) { | ||
| 54 | grid[x] = json::array(); | ||
| 55 | for (int y=0; y<height; y++) { | ||
| 56 | if (x%2 == 1 && y%2 == 1) grid[x][y] = json::object(); | ||
| 57 | else grid[x][y] = {{"type", "line"}, {"color", 0}}; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | return grid; | ||
| 61 | } | ||
| 62 | |||
| 63 | std::string Puzzle::Serialize() { | ||
| 64 | using namespace nlohmann; | ||
| 65 | |||
| 66 | json puzzle; | ||
| 67 | puzzle["grid"] = {}; | ||
| 68 | for (int x=0; x<width; x++) { | ||
| 69 | puzzle["grid"][x] = json::array(); | ||
| 70 | for (int y=0; y<height; y++) { | ||
| 71 | if (x%2 == 1 && y%2 == 1) puzzle["grid"][x][y] = json::object(); | ||
| 72 | else puzzle["grid"][x][y] = {{"type", "line"}, {"color", 0}}; | ||
| 73 | } | ||
| 74 | } | ||
| 75 | puzzle["pillar"] = pillar; | ||
| 76 | if (symmetry == Symmetry::X) puzzle["symmetry"] = {{"x", true}, {"y", false}}; | ||
| 77 | else if (symmetry == Symmetry::Y) puzzle["symmetry"] = {{"x", false}, {"y", true}}; | ||
| 78 | else if (symmetry == Symmetry::XY) puzzle["symmetry"] = {{"x", true}, {"y", true}}; | ||
| 79 | |||
| 80 | for (int x=0; x<width; x++) { | ||
| 81 | for (int y=0; y<height; y++) { | ||
| 82 | const Cell& cell = grid[x][y]; | ||
| 83 | json j = puzzle["grid"][x][y]; | ||
| 84 | if (cell.dot != Cell::Dot::NONE) { | ||
| 85 | if (cell.dot == Cell::Dot::BLACK) j["dot"] = 1; | ||
| 86 | if (cell.dot == Cell::Dot::BLUE) j["dot"] = 2; | ||
| 87 | if (cell.dot == Cell::Dot::YELLOW) j["dot"] = 3; | ||
| 88 | if (cell.dot == Cell::Dot::INVISIBLE) j["dot"] = 4; | ||
| 89 | } else if (cell.gap != Cell::Gap::NONE) { | ||
| 90 | if (cell.gap == Cell::Gap::BREAK) j["gap"] = 1; | ||
| 91 | if (cell.gap == Cell::Gap::FULL) j["gap"] = 2; | ||
| 92 | } else if (cell.decoration != nullptr) { | ||
| 93 | if (cell.decoration->color == Color::Black) j["color"] = "black"; | ||
| 94 | else if (cell.decoration->color == Color::Blue) j["color"] = "blue"; | ||
| 95 | else if (cell.decoration->color == Color::Cyan) j["color"] = "cyan"; | ||
| 96 | else if (cell.decoration->color == Color::Gray) j["color"] = "gray"; | ||
| 97 | else if (cell.decoration->color == Color::Green) j["color"] = "green"; | ||
| 98 | else if (cell.decoration->color == Color::Orange) j["color"] = "orange"; | ||
| 99 | else if (cell.decoration->color == Color::Pink) j["color"] = "pink"; | ||
| 100 | else if (cell.decoration->color == Color::Purple) j["color"] = "purple"; | ||
| 101 | else if (cell.decoration->color == Color::White) j["color"] = "white"; | ||
| 102 | else if (cell.decoration->color == Color::Yellow) j["color"] = "yellow"; | ||
| 103 | |||
| 104 | if (cell.decoration->type == Type::Stone) { | ||
| 105 | j["type"] = "square"; | ||
| 106 | } else if (cell.decoration->type == Type::Star) { | ||
| 107 | j["type"] = "star"; | ||
| 108 | } else if (cell.decoration->type == Type::Poly) { | ||
| 109 | j["type"] = "poly"; | ||
| 110 | j["polyshape"] = cell.decoration->polyshape; | ||
| 111 | } else if (cell.decoration->type == Type::Ylop) { | ||
| 112 | j["type"] = "ylop"; | ||
| 113 | j["polyshape"] = cell.decoration->polyshape; | ||
| 114 | } else if (cell.decoration->type == Type::Nega) { | ||
| 115 | j["type"] = "nega"; | ||
| 116 | } else if (cell.decoration->type == Type::Triangle) { | ||
| 117 | j["type"] = "triangle"; | ||
| 118 | j["count"] = cell.decoration->count; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | if (cell.start) j["start"] = true; | ||
| 123 | if (cell.end != Cell::Dir::NONE) { | ||
| 124 | if (cell.end == Cell::Dir::LEFT) j["end"] = "left"; | ||
| 125 | else if (cell.end == Cell::Dir::RIGHT) j["end"] = "right"; | ||
| 126 | else if (cell.end == Cell::Dir::UP) j["end"] = "top"; | ||
| 127 | else if (cell.end == Cell::Dir::DOWN) j["end"] = "bottom"; | ||
| 128 | } | ||
| 129 | puzzle["grid"][x][y] = j; | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 133 | return puzzle.dump(); | ||
| 134 | } | ||
| 135 | |||
| 48 | int Puzzle::Mod(int x) const { | 136 | int Puzzle::Mod(int x) const { |
| 49 | if (!pillar) return x; | 137 | if (!pillar) return x; |
| 50 | return (x + width * height * 2) % width; | 138 | return (x + width * height * 2) % width; |
