summaryrefslogtreecommitdiff
path: root/src/client/GameSave.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/GameSave.h')
-rw-r--r--src/client/GameSave.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/client/GameSave.h b/src/client/GameSave.h
new file mode 100644
index 0000000..8ac1fce
--- /dev/null
+++ b/src/client/GameSave.h
@@ -0,0 +1,112 @@
+//
+// 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>
+#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 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