From 49fbe3e63a3980e2fd5392b7e139027d17f4be51 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 4 May 2025 09:00:12 -0500 Subject: [PATCH] Fix item duplication + missing item bug. Fix #78 --- src/scenario/scenario.cpp | 6 +- test/replays/short/ItemDupe.xml | 259 ++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 test/replays/short/ItemDupe.xml diff --git a/src/scenario/scenario.cpp b/src/scenario/scenario.cpp index f3f4eef1..884e22ac 100644 --- a/src/scenario/scenario.cpp +++ b/src/scenario/scenario.cpp @@ -553,17 +553,17 @@ void cScenario::writeTo(cTagFile& file) const { } void cScenario::readFrom(const cTagFile& file){ - std::deque> taken; + std::map> taken; std::vector visible, hidden, slaughter; auto& page = file[0]; - page["ITEMTAKEN"].extract(taken); + page["ITEMTAKEN"].extractSparse(taken); page["TOWNVISIBLE"].extract(visible); page["TOWNHIDDEN"].extract(hidden); page["TOWNSLAUGHTER"].extractSparse(slaughter); std::sort(visible.begin(), visible.end()); std::sort(hidden.begin(), hidden.end()); for(size_t i = 0; i < towns.size(); i++) { - if(i < taken.size()) towns[i]->item_taken = taken[i]; + if(taken.find(i) != taken.end()) towns[i]->item_taken = taken[i]; else towns[i]->item_taken.clear(); if(i < slaughter.size()) towns[i]->m_killed = slaughter[i]; else towns[i]->m_killed = 0; diff --git a/test/replays/short/ItemDupe.xml b/test/replays/short/ItemDupe.xml new file mode 100644 index 00000000..1d9b5fe4 --- /dev/null +++ b/test/replays/short/ItemDupe.xml @@ -0,0 +1,259 @@ + + + + + + + move-outdoors + + + V2 + + + fixed + + + V1 + + + V2 + + + V2 + + + V1 + V2 + + + fixed + + + 1746364609 + + valleydy.boes + (8,8) + (9,8) + + + item1-key + 0 + + + done + 0 + + + + (9,7) + (9,6) + (9,5) + (9,4) + (9,3) + true + file1-field + + t + 0 + false + + + e + 0 + false + + + s + 0 + false + + + t + 0 + false + + + save1 + 0 + + false + + list + 0 + + + load1 + 0 + + + + + (23,39) + (21,5) + (21,6) + (21,7) + (20,8) + (19,9) + + + (19,8) + (18,8) + (17,8) + (16,8) + (15,8) + (14,8) + (13,8) + (12,8) + (11,8) + (10,8) + (9,8) + (8,8) + + + quit + 0 + +