summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-06-05 19:08:35 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-06-05 19:08:35 (GMT)
commit49dafbfd263957631116557ac4fa59429390ebaa (patch)
treed33a60331bf704db792e481d81e6bf8229e7493e /src/game
parentbc35d622adb0965652955b6517c17b19f41fd41f (diff)
downloadpowder-49dafbfd263957631116557ac4fa59429390ebaa.zip
powder-49dafbfd263957631116557ac4fa59429390ebaa.tar.gz
Use a different method for decoding saves with uncompressed object in memory for stamps and clipboard, also allows for transformation (rotation), missing failure states and code for loading it into a Simulation
Diffstat (limited to 'src/game')
-rw-r--r--src/game/GameController.cpp41
-rw-r--r--src/game/GameModel.cpp46
-rw-r--r--src/game/GameModel.h12
-rw-r--r--src/game/GameView.cpp4
4 files changed, 54 insertions, 49 deletions
diff --git a/src/game/GameController.cpp b/src/game/GameController.cpp
index 7f852a6..9580d2c 100644
--- a/src/game/GameController.cpp
+++ b/src/game/GameController.cpp
@@ -172,7 +172,7 @@ void GameController::PlaceStamp(ui::Point position)
{
if(gameModel->GetStamp())
{
- gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetStamp()->data, gameModel->GetStamp()->dataLength);
+ gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetStamp());
gameModel->SetPaused(gameModel->GetPaused());
}
}
@@ -181,7 +181,7 @@ void GameController::PlaceClipboard(ui::Point position)
{
if(gameModel->GetClipboard())
{
- gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetClipboard()->data, gameModel->GetClipboard()->dataLength);
+ gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetClipboard());
gameModel->SetPaused(gameModel->GetPaused());
}
}
@@ -316,21 +316,18 @@ void GameController::ToolClick(int toolSelection, ui::Point point)
void GameController::StampRegion(ui::Point point1, ui::Point point2)
{
- int saveSize;
- unsigned char * saveData;
- saveData = gameModel->GetSimulation()->Save(point1.X, point1.Y, point2.X, point2.Y, saveSize);
- if(saveData && saveSize)
- gameModel->AddStamp(saveData, saveSize);
+ GameSave * newSave;
+ newSave = gameModel->GetSimulation()->Save(point1.X, point1.Y, point2.X, point2.Y);
+ if(newSave)
+ gameModel->AddStamp(newSave);
}
void GameController::CopyRegion(ui::Point point1, ui::Point point2)
{
- int saveSize;
- unsigned char * saveData;
- saveData = gameModel->GetSimulation()->Save(point1.X, point1.Y, point2.X, point2.Y, saveSize);
-
- if(saveData && saveSize)
- gameModel->SetClipboard(saveData, saveSize);
+ GameSave * newSave;
+ newSave = gameModel->GetSimulation()->Save(point1.X, point1.Y, point2.X, point2.Y);
+ if(newSave)
+ gameModel->SetClipboard(newSave);
}
bool GameController::MouseMove(int x, int y, int dx, int dy)
@@ -530,24 +527,25 @@ void GameController::OpenSaveWindow()
{
if(gameModel->GetUser().ID)
{
- int tempSaveLength;
- unsigned char * tempData = gameModel->GetSimulation()->Save(tempSaveLength);
- if(!tempData)
+ GameSave * tempSave = gameModel->GetSimulation()->Save();
+ if(!tempSave)
{
new ErrorMessage("Error", "Unable to build save.");
}
else
{
+ int dataSize;
+ unsigned char * tempData = (unsigned char*)tempSave->Serialise(dataSize);
if(gameModel->GetSave())
{
Save tempSave(*gameModel->GetSave());
- tempSave.SetData(tempData, tempSaveLength);
+ tempSave.SetData(tempData, dataSize);
ssave = new SSaveController(new SSaveCallback(this), tempSave);
}
else
- {
+ {
Save tempSave(0, 0, 0, 0, gameModel->GetUser().Username, "");
- tempSave.SetData(tempData, tempSaveLength);
+ tempSave.SetData(tempData, dataSize);
ssave = new SSaveController(new SSaveCallback(this), tempSave);
}
ui::Engine::Ref().ShowWindow(ssave->GetView());
@@ -585,7 +583,10 @@ void GameController::ClearSim()
void GameController::ReloadSim()
{
if(gameModel->GetSave() && gameModel->GetSave()->GetData())
- gameModel->GetSimulation()->Load(gameModel->GetSave()->GetData(), gameModel->GetSave()->GetDataLength());
+ {
+ GameSave * newSave = new GameSave((char*)gameModel->GetSave()->GetData(), gameModel->GetSave()->GetDataLength());
+ gameModel->GetSimulation()->Load(newSave);
+ }
}
std::string GameController::ElementResolve(int type)
diff --git a/src/game/GameModel.cpp b/src/game/GameModel.cpp
index ae3b191..08bd0ec 100644
--- a/src/game/GameModel.cpp
+++ b/src/game/GameModel.cpp
@@ -275,7 +275,8 @@ void GameModel::SetSave(Save * newSave)
currentSave = newSave;
if(currentSave)
{
- int returnVal = sim->Load(currentSave->GetData(), currentSave->GetDataLength());
+ GameSave * newSave = new GameSave((char*)currentSave->GetData(), currentSave->GetDataLength());
+ int returnVal = sim->Load(newSave);
if(returnVal){
delete currentSave;
currentSave = NULL;
@@ -429,46 +430,49 @@ void GameModel::ClearSimulation()
sim->clear_sim();
}
-void GameModel::AddStamp(unsigned char * saveData, int saveSize)
+void GameModel::SetStamp(Save * save)
{
+ if(stamp)
+ delete stamp;
+ stamp = new GameSave((char*)save->GetData(), save->GetDataLength());
+ notifyStampChanged();
+}
+
+void GameModel::AddStamp(GameSave * save)
+{
+ if(stamp)
+ delete stamp;
+ stamp = save;
+
+ char * saveData;
+ int saveSize;
+ saveData = save->Serialise(saveSize);
Save * tempSave = new Save(0, 0, 0, 0, "", "");
- tempSave->SetData(saveData, saveSize);
+ tempSave->SetData((unsigned char*)saveData, saveSize);
Client::Ref().AddStamp(tempSave);
delete tempSave;
+
+ notifyClipboardChanged();
}
-void GameModel::SetClipboard(unsigned char * saveData, int saveSize)
+void GameModel::SetClipboard(GameSave * save)
{
if(clipboard)
delete clipboard;
- clipboard = new Save(0, 0, 0, 0, "", "");
- clipboard->SetData(saveData, saveSize);
+ clipboard = save;
notifyClipboardChanged();
}
-Save * GameModel::GetClipboard()
+GameSave * GameModel::GetClipboard()
{
return clipboard;
}
-Save * GameModel::GetStamp()
+GameSave * GameModel::GetStamp()
{
return stamp;
}
-void GameModel::SetStamp(Save * newStamp)
-{
- if(stamp)
- delete stamp;
- if(newStamp)
- {
- stamp = new Save(*newStamp);
- }
- else
- stamp = NULL;
- notifyStampChanged();
-}
-
void GameModel::Log(string message)
{
consoleLog.push_front(message);
diff --git a/src/game/GameModel.h b/src/game/GameModel.h
index 7dff6f2..c038493 100644
--- a/src/game/GameModel.h
+++ b/src/game/GameModel.h
@@ -34,8 +34,8 @@ class GameModel
private:
//int clipboardSize;
//unsigned char * clipboardData;
- Save * stamp;
- Save * clipboard;
+ GameSave * stamp;
+ GameSave * clipboard;
deque<string> consoleLog;
vector<GameView*> observers;
vector<Tool*> toolList;
@@ -111,12 +111,12 @@ public:
void SetZoomWindowPosition(ui::Point position);
ui::Point GetZoomWindowPosition();
void SetStamp(Save * newStamp);
- void AddStamp(unsigned char * saveData, int saveSize);
- void SetClipboard(unsigned char * saveData, int saveSize);
+ void AddStamp(GameSave * save);
+ void SetClipboard(GameSave * save);
void Log(string message);
deque<string> GetLog();
- Save * GetClipboard();
- Save * GetStamp();
+ GameSave * GetClipboard();
+ GameSave * GetStamp();
};
#endif // GAMEMODEL_H
diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp
index 9d97a33..adc5883 100644
--- a/src/game/GameView.cpp
+++ b/src/game/GameView.cpp
@@ -834,7 +834,7 @@ void GameView::NotifyClipboardChanged(GameModel * sender)
delete clipboardThumb;
if(sender->GetClipboard())
{
- clipboardThumb = SaveRenderer::Ref().Render(sender->GetClipboard()->GetData(), sender->GetClipboard()->GetDataLength());
+ clipboardThumb = SaveRenderer::Ref().Render(sender->GetClipboard());
}
else
clipboardThumb = NULL;
@@ -847,7 +847,7 @@ void GameView::NotifyStampChanged(GameModel * sender)
delete stampThumb;
if(sender->GetStamp())
{
- stampThumb = SaveRenderer::Ref().Render(sender->GetStamp()->GetData(), sender->GetStamp()->GetDataLength());
+ stampThumb = SaveRenderer::Ref().Render(sender->GetStamp());
}
else
stampThumb = NULL;