From 10d8ca0bac1563acf91fbb73187d098dea42918c Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 22 Feb 2024 20:39:36 -0600 Subject: [PATCH] Fix cup placement saving --- src/g_gamedata.cpp | 59 ++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/g_gamedata.cpp b/src/g_gamedata.cpp index ca28d6a01..139778d2b 100644 --- a/src/g_gamedata.cpp +++ b/src/g_gamedata.cpp @@ -182,12 +182,22 @@ void srb2::save_ng_gamedata() } srb2::GamedataCupJson cupdata {}; cupdata.name = std::string(cup->name); - for (size_t i = 0; i < std::min(KARTGP_MAX, cupdata.records.size()); i++) + for (size_t i = 0; i < KARTGP_MAX; i++) { - cupdata.records[i].bestgrade = cup->windata[i].best_grade; - cupdata.records[i].bestplacement = cup->windata[i].best_placement; - cupdata.records[i].bestskin = std::string(skins[cup->windata[i].best_skin.id].name); - cupdata.records[i].gotemerald = cup->windata[i].got_emerald; + srb2::GamedataCupRecordsJson newrecords {}; + newrecords.bestgrade = cup->windata[i].best_grade; + newrecords.bestplacement = cup->windata[i].best_placement; + skinreference_t& skinref = cup->windata[i].best_skin; + if (skinref.unloaded) + { + newrecords.bestskin = std::string(skinref.unloaded->name); + } + else + { + newrecords.bestskin = std::string(skins[skinref.id].name); + } + newrecords.gotemerald = cup->windata[i].got_emerald; + cupdata.records.emplace_back(std::move(newrecords)); } ng.cups[cupdata.name] = std::move(cupdata); } @@ -199,12 +209,22 @@ void srb2::save_ng_gamedata() } srb2::GamedataCupJson cupdata {}; cupdata.name = std::string(unloadedcup->name); - for (int i = 0; i < 4; i++) + for (int i = 0; i < KARTGP_MAX; i++) { - cupdata.records[i].bestgrade = unloadedcup->windata[i].best_grade; - cupdata.records[i].bestplacement = unloadedcup->windata[i].best_placement; - cupdata.records[i].bestskin = std::string(skins[unloadedcup->windata[i].best_skin.id].name); - cupdata.records[i].gotemerald = unloadedcup->windata[i].got_emerald; + srb2::GamedataCupRecordsJson newrecords {}; + newrecords.bestgrade = unloadedcup->windata[i].best_grade; + newrecords.bestplacement = unloadedcup->windata[i].best_placement; + skinreference_t& skinref = unloadedcup->windata[i].best_skin; + if (skinref.unloaded) + { + newrecords.bestskin = std::string(skinref.unloaded->name); + } + else + { + newrecords.bestskin = std::string(skins[skinref.id].name); + } + newrecords.gotemerald = unloadedcup->windata[i].got_emerald; + cupdata.records.emplace_back(std::move(newrecords)); } ng.cups[cupdata.name] = std::move(cupdata); } @@ -645,22 +665,10 @@ void srb2::load_ng_gamedata() dummywindata[j].best_skin.id = MAXSKINS; dummywindata[j].best_skin.unloaded = nullptr; - bool skinfound = false; - for (int skin = 0; skin < numskins; skin++) - { - std::string skinname = std::string(skins[skin].name); - if (skinname == cuppair.second.records[j].bestskin) - { - skinreference_t ref {}; - ref.id = skin; - ref.unloaded = nullptr; - dummywindata[j].best_skin = ref; - skinfound = true; - break; - } - } - if (skinfound) + int skinloaded = R_SkinAvailable(cuppair.second.records[j].bestskin.c_str()); + if (skinloaded >= 0) { + dummywindata[j].best_skin.id = skinloaded; continue; } for (auto unloadedskin = unloadedskins; unloadedskin; unloadedskin = unloadedskin->next) @@ -672,7 +680,6 @@ void srb2::load_ng_gamedata() ref.id = MAXSKINS; ref.unloaded = unloadedskin; dummywindata[j].best_skin = ref; - skinfound = true; break; } }