void GameModel::SetSaveFile(SaveFile * newSave) { SetSave(NULL); if(newSave && newSave->GetGameSave()) { GameSave * saveData = newSave->GetGameSave(); SetPaused(saveData->paused & GetPaused()); sim->gravityMode = saveData->gravityMode; sim->air->airMode = saveData->airMode; sim->legacy_enable = saveData->legacyEnable; sim->water_equal_test = saveData->waterEEnabled; if(saveData->gravityEnable && !sim->grav->ngrav_enable) { sim->grav->start_grav_async(); } else if(!saveData->gravityEnable && sim->grav->ngrav_enable) { sim->grav->stop_grav_async(); } sim->clear_sim(); sim->Load(saveData); } notifySaveChanged(); UpdateQuickOptions(); }
void PreviewModel::UpdateSave(int saveID, int saveDate) { this->tSaveID = saveID; this->tSaveDate = saveDate; if (save) { delete save; save = NULL; } if (saveData) { delete saveData; saveData = NULL; } if (saveComments) { for (size_t i = 0; i < saveComments->size(); i++) delete saveComments->at(i); saveComments->clear(); delete saveComments; saveComments = NULL; } notifySaveChanged(); notifySaveCommentsChanged(); RequestBroker::Ref().Start(Client::Ref().GetSaveDataAsync(saveID, saveDate), this, 1); RequestBroker::Ref().Start(Client::Ref().GetSaveAsync(saveID, saveDate), this, 2); if (!GetDoOpen()) { commentsLoaded = false; RequestBroker::Ref().Start(Client::Ref().GetCommentsAsync(saveID, (commentsPageNumber-1)*20, 20), this, 3); } }
void GameModel::SetSave(SaveInfo * newSave) { if(currentSave != newSave) { if(currentSave) delete currentSave; if(newSave == NULL) currentSave = NULL; else currentSave = new SaveInfo(*newSave); } if(currentSave && currentSave->GetGameSave()) { GameSave * saveData = currentSave->GetGameSave(); SetPaused(saveData->paused | GetPaused()); sim->gravityMode = saveData->gravityMode; sim->air->airMode = saveData->airMode; sim->legacy_enable = saveData->legacyEnable; sim->water_equal_test = saveData->waterEEnabled; if(saveData->gravityEnable) sim->grav->start_grav_async(); else sim->grav->stop_grav_async(); sim->clear_sim(); sim->Load(saveData); } notifySaveChanged(); UpdateQuickOptions(); }
void PreviewModel::SetFavourite(bool favourite) { if(save) { Client::Ref().FavouriteSave(save->id, favourite); save->Favourite = favourite; notifySaveChanged(); } }
void GameModel::SetSave(SaveInfo * newSave) { if(currentSave != newSave) { delete currentSave; if(newSave == NULL) currentSave = NULL; else currentSave = new SaveInfo(*newSave); } delete currentFile; currentFile = NULL; if(currentSave && currentSave->GetGameSave()) { GameSave * saveData = currentSave->GetGameSave(); SetPaused(saveData->paused | GetPaused()); sim->gravityMode = saveData->gravityMode; sim->air->airMode = saveData->airMode; sim->edgeMode = saveData->edgeMode; sim->legacy_enable = saveData->legacyEnable; sim->water_equal_test = saveData->waterEEnabled; sim->aheat_enable = saveData->aheatEnable; if(saveData->gravityEnable) sim->grav->start_grav_async(); else sim->grav->stop_grav_async(); sim->clear_sim(); ren->ClearAccumulation(); if (!sim->Load(saveData)) { // This save was created before logging existed // Add in the correct info if (saveData->authors.size() == 0) { saveData->authors["type"] = "save"; saveData->authors["id"] = newSave->id; saveData->authors["username"] = newSave->userName; saveData->authors["title"] = newSave->name; saveData->authors["description"] = newSave->Description; saveData->authors["published"] = (int)newSave->Published; saveData->authors["date"] = newSave->updatedDate; } // This save was probably just created, and we didn't know the ID when creating it // Update with the proper ID else if (saveData->authors.get("id", -1) == 0 || saveData->authors.get("id", -1) == -1) { saveData->authors["id"] = newSave->id; } Client::Ref().OverwriteAuthorInfo(saveData->authors); } } notifySaveChanged(); UpdateQuickOptions(); }
void GameModel::SetVote(int direction) { if(currentSave) { RequestStatus status = Client::Ref().ExecVote(currentSave->GetID(), direction); if(status == RequestOkay) { currentSave->vote = direction; notifySaveChanged(); } } }
void PreviewModel::OnResponseReady(void * object, int identifier) { if (identifier == 1) { delete saveData; saveData = (std::vector<unsigned char>*)object; } if (identifier == 2) { delete save; save = (SaveInfo*)object; } if (identifier == 3) { if (saveComments) { for (size_t i = 0; i < saveComments->size(); i++) delete saveComments->at(i); saveComments->clear(); delete saveComments; saveComments = NULL; } saveComments = (std::vector<SaveComment*>*)object; commentsLoaded = true; notifySaveCommentsChanged(); notifyCommentsPageChanged(); } if (identifier == 1 || identifier == 2) { if (save && saveData) { commentsTotal = save->Comments; try { GameSave *gameSave = new GameSave(*saveData); if (gameSave->fromNewerVersion) new ErrorMessage("This save is from a newer version", "Please update TPT in game or at http://powdertoy.co.uk"); save->SetGameSave(gameSave); } catch(ParseException &e) { new ErrorMessage("Error", e.what()); canOpen = false; } notifySaveChanged(); notifyCommentsPageChanged(); //make sure author name comments are red if (commentsLoaded) notifySaveCommentsChanged(); } } }
void PreviewModel::SetFavourite(bool favourite) { if(save) { if (Client::Ref().FavouriteSave(save->id, favourite) == RequestOkay) save->Favourite = favourite; else if (favourite) throw PreviewModelException("Error, could not fav. the save: " + Client::Ref().GetLastError()); else throw PreviewModelException("Error, could not unfav. the save: " + Client::Ref().GetLastError()); notifySaveChanged(); } }
void PreviewModel::Update() { if(updateSavePreviewWorking) { if(updateSavePreviewFinished) { if(savePreview) { delete savePreview; savePreview = NULL; } updateSavePreviewWorking = false; pthread_join(updateSavePreviewThread, (void**)(&savePreview)); notifyPreviewChanged(); } } if(updateSaveInfoWorking) { if(updateSaveInfoFinished) { if(save) { delete save; save = NULL; } updateSaveInfoWorking = false; pthread_join(updateSaveInfoThread, (void**)(&save)); notifySaveChanged(); } } if(updateSaveCommentsWorking) { if(updateSaveCommentsFinished) { if(saveComments) { for(int i = 0; i < saveComments->size(); i++) delete saveComments->at(i); delete saveComments; saveComments = NULL; } updateSaveCommentsWorking = false; pthread_join(updateSaveCommentsThread, (void**)(&saveComments)); notifySaveCommentsChanged(); } } }
void GameModel::ClearSimulation() { //Load defaults sim->gravityMode = 0; sim->air->airMode = 0; sim->legacy_enable = false; sim->water_equal_test = false; sim->SetEdgeMode(edgeMode); sim->clear_sim(); ren->ClearAccumulation(); notifySaveChanged(); UpdateQuickOptions(); }
void GameModel::SetVote(int direction) { if(currentSave) { RequestStatus status = Client::Ref().ExecVote(currentSave->GetID(), direction); if(status == RequestOkay) { currentSave->vote = direction; notifySaveChanged(); } else { throw GameModelException("Could not vote: "+Client::Ref().GetLastError()); } } }
void PreviewModel::UpdateSave(int saveID, int saveDate) { this->tSaveID = saveID; this->tSaveDate = saveDate; if(save) { delete save; save = NULL; } if(savePreview) { delete savePreview; savePreview = NULL; } if(saveComments) { for(int i = 0; i < saveComments->size(); i++) delete saveComments->at(i); delete saveComments; saveComments = NULL; } notifyPreviewChanged(); notifySaveChanged(); notifySaveCommentsChanged(); if(!updateSavePreviewWorking) { updateSavePreviewWorking = true; updateSavePreviewFinished = false; pthread_create(&updateSavePreviewThread, 0, &PreviewModel::updateSavePreviewTHelper, this); } if(!updateSaveInfoWorking) { updateSaveInfoWorking = true; updateSaveInfoFinished = false; pthread_create(&updateSaveInfoThread, 0, &PreviewModel::updateSaveInfoTHelper, this); } if(!updateSaveCommentsWorking) { updateSaveCommentsWorking = true; updateSaveCommentsFinished = false; pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsTHelper, this); } }
void GameModel::SetSaveFile(SaveFile * newSave) { if(currentFile != newSave) { delete currentFile; if(newSave == NULL) currentFile = NULL; else currentFile = new SaveFile(*newSave); } delete currentSave; currentSave = NULL; if(newSave && newSave->GetGameSave()) { GameSave * saveData = newSave->GetGameSave(); SetPaused(saveData->paused | GetPaused()); sim->gravityMode = saveData->gravityMode; sim->air->airMode = saveData->airMode; sim->edgeMode = saveData->edgeMode; sim->legacy_enable = saveData->legacyEnable; sim->water_equal_test = saveData->waterEEnabled; sim->aheat_enable = saveData->aheatEnable; if(saveData->gravityEnable && !sim->grav->ngrav_enable) { sim->grav->start_grav_async(); } else if(!saveData->gravityEnable && sim->grav->ngrav_enable) { sim->grav->stop_grav_async(); } sim->clear_sim(); ren->ClearAccumulation(); if (!sim->Load(saveData)) { Client::Ref().OverwriteAuthorInfo(saveData->authors); } } notifySaveChanged(); UpdateQuickOptions(); }
void PreviewModel::Update() { if(updateSaveDataWorking) { if(updateSaveDataFinished) { updateSaveDataWorking = false; pthread_join(updateSaveDataThread, NULL); if(updateSaveInfoFinished && save) { commentsTotal = save->Comments; try { save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size())); } catch(ParseException &e) { throw PreviewModelException("Save file corrupt or from newer version"); } notifySaveChanged(); notifyCommentsPageChanged(); } } } if(updateSaveInfoWorking) { if(updateSaveInfoFinished) { if(save) { delete save; save = NULL; } updateSaveInfoWorking = false; pthread_join(updateSaveInfoThread, (void**)(&save)); if(updateSaveDataFinished && save) { commentsTotal = save->Comments; try { save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size())); } catch(ParseException &e) { throw PreviewModelException("Save file corrupt or from newer version"); } notifyCommentsPageChanged(); } notifySaveChanged(); if(!save) throw PreviewModelException("Unable to load save"); } } if(updateSaveCommentsWorking) { if(updateSaveCommentsFinished) { if(saveComments) { for(int i = 0; i < saveComments->size(); i++) delete saveComments->at(i); saveComments->clear(); saveComments = NULL; } commentsLoaded = true; updateSaveCommentsWorking = false; pthread_join(updateSaveCommentsThread, (void**)(&saveComments)); notifySaveCommentsChanged(); } } }