From a1c17b713829bcdfa7752b0e38b6b95b1d440168 Mon Sep 17 00:00:00 2001 From: William JCM Date: Thu, 24 Feb 2022 14:00:47 +0100 Subject: [PATCH] Profile(Manager),SaveTool: improve error handling and fix bugs. --- src/Profile/Profile.cpp | 43 ++++++++++++----- src/Profile/Profile.h | 4 +- src/ProfileManager/ProfileManager.cpp | 2 +- src/SaveTool/SaveTool_MainManager.cpp | 69 +++++++++++++-------------- 4 files changed, 67 insertions(+), 51 deletions(-) diff --git a/src/Profile/Profile.cpp b/src/Profile/Profile.cpp index 16a655b..d7ba426 100644 --- a/src/Profile/Profile.cpp +++ b/src/Profile/Profile.cpp @@ -45,7 +45,13 @@ Profile::Profile(const std::string& path): _type = ProfileType::FullGame; } - _account = Utility::String::ltrim(Utility::String::rtrim(_filename, ".sav"), (_type == ProfileType::Demo ? "Demo" : "") + std::string{"Profile"}); + auto account_prop = _profile.at("Account"); + if(!account_prop) { + _lastError = "Couldn't find an account ID in " + _filename; + _valid = false; + return; + } + _account = account_prop->value; if(Utility::String::beginsWith(_account, "PMCSlot")) { _version = ProfileVersion::Normal; @@ -55,8 +61,6 @@ Profile::Profile(const std::string& path): } refreshValues(); - - _valid = _profile.valid(); } auto Profile::valid() const -> bool { @@ -90,7 +94,13 @@ void Profile::refreshValues() { return; } - _name = _profile.at("CompanyName")->value; + auto name_prop = _profile.at("CompanyName"); + if(!name_prop) { + _lastError = "No company name in " + _filename; + _valid = false; + return; + } + _name = name_prop->value; auto prop = _profile.at("ActiveFrameSlot"); _activeFrameSlot = prop ? prop->value : 0; @@ -127,6 +137,8 @@ void Profile::refreshValues() { _muscularConstruction = getResource("ResourceQuarkData", MuscularConstruction); _mineralExoskeletology = getResource("ResourceQuarkData", MineralExoskeletology); _carbonisedSkin = getResource("ResourceQuarkData", CarbonisedSkin); + + _valid = true; } auto Profile::companyName() const -> std::string const& { @@ -135,11 +147,16 @@ auto Profile::companyName() const -> std::string const& { auto Profile::renameCompany(const std::string& new_name) -> bool { auto name_prop = _profile.at("CompanyName"); + if(!name_prop) { + _lastError = "No company name in " + _filename; + _valid = false; + return false; + } name_prop->value = new_name; if(!_profile.saveToFile()) { - _lastError = "Couldn't save the profile."; + _lastError = _profile.lastError(); return false; } @@ -159,13 +176,14 @@ auto Profile::setCredits(Int amount) -> bool { if(!credits_prop) { credits_prop = new IntProperty; + credits_prop->name.emplace("Credit"); _profile.appendProperty(IntProperty::ptr{credits_prop}); } credits_prop->value = amount; if(!_profile.saveToFile()) { - _lastError = "Couldn't save the profile."; + _lastError = _profile.lastError(); return false; } @@ -181,13 +199,14 @@ auto Profile::setStoryProgress(Int progress) -> bool { if(!story_progress_prop) { story_progress_prop = new IntProperty; + story_progress_prop->name.emplace("StoryProgress"); _profile.appendProperty(IntProperty::ptr{story_progress_prop}); } story_progress_prop->value = progress; if(!_profile.saveToFile()) { - _lastError = "Couldn't save the profile."; + _lastError = _profile.lastError(); return false; } @@ -358,7 +377,7 @@ auto Profile::setCarbonisedSkin(Int amount) -> bool { return setResource("ResourceQuarkData", CarbonisedSkin, amount); } -auto Profile::getResource(const char* container, Int id) -> Int { +auto Profile::getResource(const char* container, MaterialID id) -> Int { auto mats_prop = _profile.at(container); if(!mats_prop) { @@ -374,14 +393,16 @@ auto Profile::getResource(const char* container, Int id) -> Int { return it != mats_prop->items.end() ? static_cast(it->get())->quantity : 0; } -auto Profile::setResource(const char* container, Int id, Int amount) -> bool { +auto Profile::setResource(const char* container, MaterialID id, Int amount) -> bool { auto mats_prop = _profile.at(container); if(!mats_prop) { + _lastError = "Couldn't find " + std::string{container} + " in " + _filename; + _valid = false; return false; } - static auto predicate = [&id](UnrealPropertyBase::ptr& prop){ + auto predicate = [&id](UnrealPropertyBase::ptr& prop){ auto res_prop = static_cast(prop.get()); return res_prop->id == id; }; @@ -406,5 +427,5 @@ auto Profile::setResource(const char* container, Int id, Int amount) -> bool { return false; } - return _profile.saveToFile(); + return true; } diff --git a/src/Profile/Profile.h b/src/Profile/Profile.h index af361e3..d68bd44 100644 --- a/src/Profile/Profile.h +++ b/src/Profile/Profile.h @@ -126,8 +126,8 @@ class Profile { auto setCarbonisedSkin(Int amount) -> bool; private: - auto getResource(const char* container, Int id) -> Int; - auto setResource(const char* container, Int id, Int amount) -> bool; + auto getResource(const char* container, MaterialID id) -> Int; + auto setResource(const char* container, MaterialID id, Int amount) -> bool; std::string _filename; diff --git a/src/ProfileManager/ProfileManager.cpp b/src/ProfileManager/ProfileManager.cpp index db1f289..38d69cf 100644 --- a/src/ProfileManager/ProfileManager.cpp +++ b/src/ProfileManager/ProfileManager.cpp @@ -76,7 +76,7 @@ auto ProfileManager::refreshProfiles() -> bool { } if(_profiles.empty()) { - _lastError = "No profiles were found."; + _lastError = "No valid profiles were found."; return false; } diff --git a/src/SaveTool/SaveTool_MainManager.cpp b/src/SaveTool/SaveTool_MainManager.cpp index b834640..8dc5e2f 100644 --- a/src/SaveTool/SaveTool_MainManager.cpp +++ b/src/SaveTool/SaveTool_MainManager.cpp @@ -225,8 +225,7 @@ void SaveTool::drawGeneralInfo() { } if(drawRenamePopup(name_buf)) { if(!_currentProfile->renameCompany(name_buf.data())) { - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", - _currentProfile->lastError().c_str(), window()); + _queue.addToast(Toast::Type::Error, _currentProfile->lastError()); } } @@ -243,8 +242,7 @@ void SaveTool::drawGeneralInfo() { } if(drawIntEditPopup(&credits, 20000000)) { if(!_currentProfile->setCredits(credits)) { - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", - _currentProfile->lastError().c_str(), window()); + _queue.addToast(Toast::Type::Error, _currentProfile->lastError()); } } @@ -263,8 +261,7 @@ void SaveTool::drawGeneralInfo() { if(!sp.after) { if(ImGui::MenuItem(sp.point)) { if(!_currentProfile->setStoryProgress(sp.id)) { - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", - _currentProfile->lastError().c_str(), window()); + _queue.addToast(Toast::Type::Error, _currentProfile->lastError()); } } } @@ -272,8 +269,7 @@ void SaveTool::drawGeneralInfo() { if(ImGui::BeginMenu(sp.after)) { if(ImGui::MenuItem(sp.point)) { if(!_currentProfile->setStoryProgress(sp.id)) { - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", - _currentProfile->lastError().c_str(), window()); + _queue.addToast(Toast::Type::Error, _currentProfile->lastError()); } } ImGui::EndMenu(); @@ -300,34 +296,33 @@ void SaveTool::drawResearchInventory() { ImGui::TableSetColumnIndex(2); \ ImGui::TextDisabled("Unavailable as of game version " SUPPORTED_GAME_VERSION); - #define matRow(name, tier, var, getter, setter) \ - ImGui::TableNextRow(); \ - ImGui::TableSetColumnIndex(0); \ - ImGui::TextUnformatted("T" #tier); \ - ImGui::TableSetColumnIndex(1); \ - ImGui::TextUnformatted(name); \ - ImGui::TableSetColumnIndex(2); \ - if(_currentProfile->getter() != -1) { \ - ImGui::Text("%i", _currentProfile->getter()); \ - if(_cheatMode) { \ - ImGui::TableSetColumnIndex(3); \ - ImGui::PushID(#setter); \ - static Int var = _currentProfile->getter(); \ - if(drawUnsafeWidget([]{ return ImGui::SmallButton(ICON_FA_EDIT); })) { \ - (var) = _currentProfile->getter(); \ - ImGui::OpenPopup("int_edit"); \ - } \ - if(drawIntEditPopup(&(var), 9999)) { \ - if(!_currentProfile->set##setter((var))) { \ - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", \ - _currentProfile->lastError().c_str(), window()); \ - } \ - } \ - ImGui::PopID(); \ - } \ - } \ - else { \ - ImGui::TextDisabled("Not found in the save file"); \ + #define matRow(name, tier, var, getter, setter) \ + ImGui::TableNextRow(); \ + ImGui::TableSetColumnIndex(0); \ + ImGui::TextUnformatted("T" #tier); \ + ImGui::TableSetColumnIndex(1); \ + ImGui::TextUnformatted(name); \ + ImGui::TableSetColumnIndex(2); \ + if(_currentProfile->getter() != -1) { \ + ImGui::Text("%i", _currentProfile->getter()); \ + if(_cheatMode) { \ + ImGui::TableSetColumnIndex(3); \ + ImGui::PushID(#setter); \ + static Int var = _currentProfile->getter(); \ + if(drawUnsafeWidget(ImGui::SmallButton, ICON_FA_EDIT)) { \ + (var) = _currentProfile->getter(); \ + ImGui::OpenPopup("int_edit"); \ + } \ + if(drawIntEditPopup(&(var), 9999)) { \ + if(!_currentProfile->set##setter((var))) { \ + _queue.addToast(Toast::Type::Error, _currentProfile->lastError()); \ + } \ + } \ + ImGui::PopID(); \ + } \ + } \ + else { \ + ImGui::TextDisabled("Not found in the save file"); \ } if(ImGui::BeginTable("##ResearchInventoryTable", 4, @@ -454,7 +449,7 @@ void SaveTool::drawMassManager() { _massManager->lastError().c_str(), window()); } } - else if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("Mass")) { + else if((payload = ImGui::AcceptDragDropPayload("Mass"))) { if(payload->DataSize != sizeof(int)) { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal error", "payload->DataSize != sizeof(int) in SaveTool::drawMassManager()",