summary refs log tree commit diff stats
path: root/Source/Panel.h
blob: 4f3ab112c6c439631ec78803af90a021d8e63cb9 (plain) (blame)
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;
};