summaryrefslogtreecommitdiff
path: root/src/client/GameSave.h
blob: 559b3a058349de800dae54bce2becafa967e1b9c (plain)
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
#ifndef The_Powder_Toy_GameSave_h
#define The_Powder_Toy_GameSave_h

#include <vector>
#include <string>
#include "Config.h"
#include "Misc.h"

#include "simulation/Sign.h"
#include "simulation/Particle.h"

//using namespace std;

struct ParseException: public std::exception {
	enum ParseResult { OK = 0, Corrupt, WrongVersion, InvalidDimensions, InternalError, MissingElement };
	std::string message;
	ParseResult result;
public:
	ParseException(ParseResult result, std::string message_): message(message_), result(result) {}
	const char * what() const throw()
	{
		return message.c_str();
	}
	~ParseException() throw() {};
};

class GameSave
{
public:
	
	int blockWidth, blockHeight;

	//Simulation data
	//int ** particleMap;
	int particlesCount;
	Particle * particles;
	unsigned char ** blockMap;
	float ** fanVelX;
	float ** fanVelY;
	
	//Simulation Options
	bool waterEEnabled;
	bool legacyEnable;
	bool gravityEnable;
	bool aheatEnable;
	bool paused;
	int gravityMode;
	int airMode;
	
	//Signs
	std::vector<sign> signs;

	//Element palette
	typedef std::pair<std::string, int> PaletteItem;
	std::vector<PaletteItem> palette;
	
	GameSave();
	GameSave(GameSave & save);
	GameSave(int width, int height);
	GameSave(char * data, int dataSize);
	GameSave(std::vector<char> data);
	GameSave(std::vector<unsigned char> data);
	~GameSave();
	void setSize(int width, int height);
	char * Serialise(int & dataSize);
	std::vector<char> Serialise();
	void Transform(matrix2d transform, vector2d translate);

	void Expand();
	void Collapse();
	bool Collapsed();
	
	inline GameSave& operator << (Particle v)
	{
		if(particlesCount<NPART && v.type)
		{
			particles[particlesCount++] = v;
		}
		return *this;
	}
	
	inline GameSave& operator << (sign v)
	{
		if(signs.size()<MAXSIGNS && v.text.length())
			signs.push_back(v);
		return *this;
	}
		
private:
	bool expanded;
	bool hasOriginalData;
	float * fanVelXPtr;
	float * fanVelYPtr;
	unsigned char * blockMapPtr;

	std::vector<char> originalData;

	void dealloc();
	void read(char * data, int dataSize);
	void readOPS(char * data, int dataLength);
	void readPSv(char * data, int dataLength);
	char * serialiseOPS(int & dataSize);
	//serialisePSv();
};

#endif