diff options
| author | Simon 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) |
| commit | 49dafbfd263957631116557ac4fa59429390ebaa (patch) | |
| tree | d33a60331bf704db792e481d81e6bf8229e7493e /src/game | |
| parent | bc35d622adb0965652955b6517c17b19f41fd41f (diff) | |
| download | powder-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.cpp | 41 | ||||
| -rw-r--r-- | src/game/GameModel.cpp | 46 | ||||
| -rw-r--r-- | src/game/GameModel.h | 12 | ||||
| -rw-r--r-- | src/game/GameView.cpp | 4 |
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; |
