1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#pragma once
#include "json.hpp"
#include "RandomizerCore.h"
#include "Memory.h"
class Decoration
{
public:
enum Shape {
Stone = 0x100,
Star = 0x200,
Poly = 0x400,
Eraser = 0x500,
Triangle = 0x600,
};
enum Color {
Black = 0x1,
White = 0x2,
Red = 0x3,
Blue = 0x4,
Green = 0x5,
};
static nlohmann::json to_json(int decoration) {
nlohmann::json json = {};
int shape = decoration & 0x00000F00;
if (shape == Shape::Stone) json["type"] = "square";
if (shape == Shape::Star) json["type"] = "star";
if (shape == Shape::Poly) json["type"] = "poly";
if (shape == Shape::Eraser) json["type"] = "eraser";
if (shape == Shape::Triangle) json["type"] = "triangle";
int color = decoration & 0x0000000F;
if (color == Color::Black) json["color"] = "black";
if (color == Color::White) json["color"] = "white";
if (color == Color::Red) json["color"] = "red";
if (color == Color::Blue) json["color"] = "blue";
if (color == Color::Green) json["color"] = "green";
if (json.empty()) return false;
return json;
}
};
enum IntersectionFlags {
IS_ENDPOINT = 0x1,
IS_STARTPOINT = 0x2,
IS_GAP = 0x10000,
HAS_DOT = 0x8,
DOT_IS_BLUE = 0x100,
DOT_IS_ORANGE = 0x200,
DOT_IS_INVISIBLE = 0x1000,
};
class Endpoint {
public:
enum Direction {
LEFT,
RIGHT,
UP,
DOWN
};
Endpoint(int x, int y, Direction dir) {
_x = x;
_y = y;
_dir = dir;
}
int GetX() {return _x;}
void SetX(int x) {_x = x;}
int GetY() {return _y;}
void SetY(int y) {_y = y;}
Direction GetDir() {return _dir;}
void SetDir(Direction dir) {_dir = dir;}
nlohmann::json to_json() {
nlohmann::json json = {{"x", _x}, {"y", _y}};
if (_dir == LEFT) json["dir"] = "left";
if (_dir == RIGHT) json["dir"] = "right";
if (_dir == UP) json["dir"] = "up";
if (_dir == DOWN) json["dir"] = "down";
return json;
}
private:
int _x, _y;
Direction _dir;
};
class Panel
{
public:
explicit Panel(int id);
// explicit Panel(nlohmann::json json);
void Write(int id);
nlohmann::json Serialize();
void Random();
enum Style {
SYMMETRICAL = 0x2,
IS_2COLOR = 0x10,
HAS_DOTS = 0x4,
HAS_STARS = 0x40,
HAS_STONES = 0x100,
HAS_ERASERS = 0x1000,
HAS_SHAPERS = 0x2000,
};
private:
void ReadIntersections(int id);
void WriteIntersections(int id);
void ReadDecorations(int id);
void WriteDecorations(int id);
// TODO: Reflection data
// TODO: Decoration colors
Memory _memory = Memory("witness64_d3d11.exe");
int _width, _height;
std::vector<std::vector<int>> _grid;
std::vector<Endpoint> _endpoints;
std::vector<std::pair<int ,int>> _startpoints;
int _style;
};
|