diff --git a/dGame/dMission/Mission.cpp b/dGame/dMission/Mission.cpp index b1ff4360..e8d2146e 100644 --- a/dGame/dMission/Mission.cpp +++ b/dGame/dMission/Mission.cpp @@ -96,20 +96,18 @@ void Mission::LoadFromXmlCur(const tinyxml2::XMLElement& element) { if (index >= m_Tasks.size()) { break; } + auto* const curTask = m_Tasks[index]; - const auto type = m_Tasks[index]->GetType(); + const auto type = curTask->GetType(); - if (type == eMissionTaskType::COLLECTION || - type == eMissionTaskType::VISIT_PROPERTY) { + auto value = std::stoul(task->Attribute("v")); + curTask->SetProgress(value, false); + task = task->NextSiblingElement(); + + // Collection tasks and visit property tasks store each of the collected/visited targets after the progress value + if (type == eMissionTaskType::COLLECTION || type == eMissionTaskType::VISIT_PROPERTY) { std::vector uniques; - - const auto value = std::stoul(task->Attribute("v")); - - m_Tasks[index]->SetProgress(value, false); - - task = task->NextSiblingElement(); - - while (task != nullptr) { + while (task != nullptr && value > 0) { const auto unique = std::stoul(task->Attribute("v")); uniques.push_back(unique); @@ -119,19 +117,10 @@ void Mission::LoadFromXmlCur(const tinyxml2::XMLElement& element) { } task = task->NextSiblingElement(); + value--; } - m_Tasks[index]->SetUnique(uniques); - - m_Tasks[index]->SetProgress(uniques.size(), false); - - break; - } else { - const auto value = std::stoul(task->Attribute("v")); - - m_Tasks[index]->SetProgress(value, false); - - task = task->NextSiblingElement(); + curTask->SetUnique(uniques); } index++; @@ -163,31 +152,19 @@ void Mission::UpdateXmlCur(tinyxml2::XMLElement& element) { if (IsComplete()) return; - for (auto* task : m_Tasks) { - if (task->GetType() == eMissionTaskType::COLLECTION || - task->GetType() == eMissionTaskType::VISIT_PROPERTY) { - - auto* child = element.GetDocument()->NewElement("sv"); - - child->SetAttribute("v", static_cast(task->GetProgress())); - - element.LinkEndChild(child); - - for (auto unique : task->GetUnique()) { - auto* uniqueElement = element.GetDocument()->NewElement("sv"); - - uniqueElement->SetAttribute("v", static_cast(unique)); - - element.LinkEndChild(uniqueElement); - } - - break; - } - auto* child = element.GetDocument()->NewElement("sv"); - + for (const auto* const task : m_Tasks) { + auto* const child = element.InsertNewChildElement("sv"); child->SetAttribute("v", static_cast(task->GetProgress())); - element.LinkEndChild(child); + // Collection and visit property tasks then need to store the collected/visited items after the progress + const auto taskType = task->GetType(); + if (taskType == eMissionTaskType::COLLECTION || taskType == eMissionTaskType::VISIT_PROPERTY) { + for (const auto unique : task->GetUnique()) { + auto* uniqueElement = element.InsertNewChildElement("sv"); + + uniqueElement->SetAttribute("v", static_cast(unique)); + } + } } } @@ -507,11 +484,6 @@ void Mission::YieldRewards() { // If a mission rewards zero of an item, make it reward 1. auto count = pair.second > 0 ? pair.second : 1; - // Sanity check, 6 is the max any mission yields - if (count > 6) { - count = 0; - } - inventoryComponent->AddItem(pair.first, count, IsMission() ? eLootSourceType::MISSION : eLootSourceType::ACHIEVEMENT); } @@ -540,11 +512,6 @@ void Mission::YieldRewards() { // If a mission rewards zero of an item, make it reward 1. auto count = pair.second > 0 ? pair.second : 1; - // Sanity check, 6 is the max any mission yields - if (count > 6) { - count = 0; - } - inventoryComponent->AddItem(pair.first, count, IsMission() ? eLootSourceType::MISSION : eLootSourceType::ACHIEVEMENT); }