From d352a10d802e7358c5034f500bfec21cc55e7e6e Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Wed, 8 Aug 2012 21:32:10 +0100 Subject: [PATCH] PTsave opening --- src/PowderToySDL.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++- src/client/Client.cpp | 11 ++++++++ src/client/Client.h | 1 + src/game/GameView.cpp | 5 +++- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 5bbd5dcce..eac1bc52d 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -22,6 +22,7 @@ #endif #include "Format.h" +#include "Style.h" #include "interface/Engine.h" #include "interface/Button.h" #include "interface/Panel.h" @@ -365,7 +366,9 @@ int main(int argc, char * argv[]) if(arguments["open"].length()) { - std::cout << arguments["open"] << std::endl; +#ifdef DEBUG + std::cout << "Loading " << arguments["open"] << std::endl; +#endif if(Client::Ref().FileExists(arguments["open"])) { try @@ -396,6 +399,66 @@ int main(int argc, char * argv[]) } } + if(arguments["ptsave"].length()) + { + engine->g->fillrect((engine->GetWidth()/2)-101, (engine->GetHeight()/2)-26, 202, 52, 0, 0, 0, 210); + engine->g->drawrect((engine->GetWidth()/2)-100, (engine->GetHeight()/2)-25, 200, 50, 255, 255, 255, 180); + engine->g->drawtext((engine->GetWidth()/2)-(Graphics::textwidth("Loading save...")/2), (engine->GetHeight()/2)-5, "Loading save...", style::Colour::InformationTitle.Red, style::Colour::InformationTitle.Green, style::Colour::InformationTitle.Blue, 255); + +#ifdef OGLI + blit(); +#else + if(engine->Scale==2) + blit2(engine->g->vid, engine->Scale); + else + blit(engine->g->vid); +#endif + std::string ptsaveArg = arguments["ptsave"]; + try + { + if(!ptsaveArg.find("ptsave:")) + { + std::string saveIdPart = ""; + int saveId; + int hashPos = ptsaveArg.find('#'); + if(hashPos != std::string::npos) + { + saveIdPart = ptsaveArg.substr(7, hashPos-7); + } + else + { + saveIdPart = ptsaveArg.substr(7); + } + if(saveIdPart.length()) + { +#ifdef DEBUG + std::cout << "Got Ptsave: id: " << saveIdPart << std::endl; +#endif + saveId = format::StringToNumber(saveIdPart); + if(!saveId) + throw std::runtime_error("Invalid Save ID"); + + SaveInfo * newSave = Client::Ref().GetSave(saveId, 0); + GameSave * newGameSave = new GameSave(Client::Ref().GetSaveData(saveId, 0)); + newSave->SetGameSave(newGameSave); + if(!newSave) + throw std::runtime_error("Could not load save"); + + gameController->LoadSave(newSave); + delete newSave; + } + else + { + throw std::runtime_error("No Save ID"); + } + } + } + catch (std::exception & e) + { + new ErrorMessage("Error", "Invalid save link"); + } + } + SDL_Event event; while(engine->Running()) { diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 740f1d604..eb55f8ea6 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -741,6 +741,17 @@ unsigned char * Client::GetSaveData(int saveID, int saveDate, int & dataLength) return NULL; } +std::vector Client::GetSaveData(int saveID, int saveDate) +{ + int dataSize; + unsigned char * data = GetSaveData(saveID, saveDate, dataSize); + + std::vector saveData(data, data+dataSize); + + delete[] data; + return saveData; +} + LoginStatus Client::Login(string username, string password, User & user) { lastError = ""; diff --git a/src/client/Client.h b/src/client/Client.h index 748c96ece..375c072ca 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -111,6 +111,7 @@ public: RequestStatus AddComment(int saveID, std::string comment); unsigned char * GetSaveData(int saveID, int saveDate, int & dataLength); + std::vector GetSaveData(int saveID, int saveDate); LoginStatus Login(string username, string password, User & user); void ClearThumbnailRequests(); std::vector * SearchSaves(int start, int count, string query, string sort, string category, int & resultCount); diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp index 8d5343912..65c0dddf5 100644 --- a/src/game/GameView.cpp +++ b/src/game/GameView.cpp @@ -819,6 +819,9 @@ void GameView::NotifySaveChanged(GameModel * sender) { if(sender->GetSave()) { + if(introText > 50) + introText = 50; + saveSimulationButton->SetText(sender->GetSave()->GetName()); if(sender->GetSave()->GetUserName() == sender->GetUser().Username) ((SplitButton*)saveSimulationButton)->SetShowSplit(true); @@ -1324,7 +1327,7 @@ void GameView::OnTick(float dt) } if(introText) { - introText -= int(dt)>0?int(dt):1; + introText -= int(dt)>0?std::min(int(dt), 5):1; if(introText < 0) introText = 0; }