2012-06-05 14:08:35 -05:00
|
|
|
//
|
|
|
|
// GameSave.h
|
|
|
|
// The Powder Toy
|
|
|
|
//
|
|
|
|
// Created by Simon Robertshaw on 04/06/2012.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef The_Powder_Toy_GameSave_h
|
|
|
|
#define The_Powder_Toy_GameSave_h
|
|
|
|
|
|
|
|
#include <vector>
|
2012-06-07 08:23:26 -05:00
|
|
|
#include <string>
|
|
|
|
#include "Config.h"
|
2012-06-05 14:08:35 -05:00
|
|
|
#include "Misc.h"
|
2012-06-07 08:23:26 -05:00
|
|
|
#include "simulation/Sign.h"
|
|
|
|
#include "simulation/Particle.h"
|
|
|
|
|
|
|
|
using namespace std;
|
2012-06-05 14:08:35 -05:00
|
|
|
|
2012-06-05 19:46:13 -05:00
|
|
|
struct ParseException: public exception {
|
|
|
|
enum ParseResult { OK = 0, Corrupt, WrongVersion, InvalidDimensions, InternalError, MissingElement };
|
|
|
|
string message;
|
|
|
|
ParseResult result;
|
|
|
|
public:
|
|
|
|
ParseException(ParseResult result, string message_): message(message_), result(result) {}
|
|
|
|
const char * what() const throw()
|
|
|
|
{
|
|
|
|
return message.c_str();
|
|
|
|
}
|
|
|
|
~ParseException() throw() {};
|
|
|
|
};
|
|
|
|
|
2012-06-05 14:08:35 -05:00
|
|
|
class GameSave
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2012-06-08 16:04:14 -05:00
|
|
|
int blockWidth, blockHeight;
|
2012-06-05 14:08:35 -05:00
|
|
|
|
|
|
|
//Simulation data
|
|
|
|
//int ** particleMap;
|
|
|
|
int particlesCount;
|
|
|
|
Particle * particles;
|
2012-06-05 16:55:39 -05:00
|
|
|
unsigned char ** blockMap;
|
2012-06-05 14:08:35 -05:00
|
|
|
float ** fanVelX;
|
|
|
|
float ** fanVelY;
|
|
|
|
|
|
|
|
//Simulation Options
|
|
|
|
bool waterEEnabled;
|
|
|
|
bool legacyEnable;
|
|
|
|
bool gravityEnable;
|
|
|
|
bool paused;
|
|
|
|
int gravityMode;
|
|
|
|
int airMode;
|
|
|
|
|
|
|
|
//Signs
|
|
|
|
std::vector<sign> signs;
|
|
|
|
|
2012-06-05 19:46:13 -05:00
|
|
|
GameSave();
|
2012-06-05 14:08:35 -05:00
|
|
|
GameSave(GameSave & save);
|
|
|
|
GameSave(int width, int height);
|
|
|
|
GameSave(char * data, int dataSize);
|
2012-07-27 14:06:17 -05:00
|
|
|
GameSave(std::vector<char> data);
|
|
|
|
GameSave(std::vector<unsigned char> data);
|
2012-06-05 14:08:35 -05:00
|
|
|
~GameSave();
|
|
|
|
void setSize(int width, int height);
|
|
|
|
char * Serialise(int & dataSize);
|
|
|
|
void Transform(matrix2d transform, vector2d translate);
|
|
|
|
|
|
|
|
inline GameSave& operator << (Particle v)
|
|
|
|
{
|
|
|
|
if(particlesCount<NPART && v.type)
|
|
|
|
{
|
|
|
|
particles[particlesCount++] = v;
|
|
|
|
}
|
2012-06-12 13:26:47 -05:00
|
|
|
return *this;
|
2012-06-05 14:08:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
inline GameSave& operator << (sign v)
|
|
|
|
{
|
|
|
|
if(signs.size()<MAXSIGNS && v.text.length())
|
|
|
|
signs.push_back(v);
|
2012-06-12 13:26:47 -05:00
|
|
|
return *this;
|
2012-06-05 14:08:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
float * fanVelXPtr;
|
|
|
|
float * fanVelYPtr;
|
2012-06-05 16:55:39 -05:00
|
|
|
unsigned char * blockMapPtr;
|
2012-06-05 14:08:35 -05:00
|
|
|
|
2012-07-27 14:06:17 -05:00
|
|
|
void read(char * data, int dataSize);
|
2012-06-05 19:46:13 -05:00
|
|
|
void readOPS(char * data, int dataLength);
|
|
|
|
void readPSv(char * data, int dataLength);
|
2012-06-05 14:08:35 -05:00
|
|
|
char * serialiseOPS(int & dataSize);
|
|
|
|
//serialisePSv();
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|