From 3b254ad6319a6687dcbf3b7e4f10679a7cceb259 Mon Sep 17 00:00:00 2001 From: MatthewRock Date: Wed, 9 Dec 2015 18:24:35 +0100 Subject: [PATCH] Allows the same item to have multiple ancestors --- apps/openmw/mwworld/containerstore.cpp | 34 +++++++++++++------------- apps/openmw/mwworld/containerstore.hpp | 4 +-- components/esm/inventorystate.cpp | 10 ++++---- components/esm/inventorystate.hpp | 2 +- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp index 99e051ea7..5844cfa9a 100644 --- a/apps/openmw/mwworld/containerstore.cpp +++ b/apps/openmw/mwworld/containerstore.cpp @@ -444,12 +444,12 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std:: if (!levItem.empty() && count < 0) { //If there is no item in map, insert it - std::map >::iterator itemInMap = - mLevelledItemMap.insert(std::make_pair(id, std::make_pair(0, levItem))).first; + std::map, int>::iterator itemInMap = + mLevelledItemMap.insert(std::make_pair(std::make_pair(id, levItem), 0)).first; //Update spawned count - itemInMap->second.first += std::abs(count); + itemInMap->second += std::abs(count); } - count = std::abs(count); + count = std::abs(count); ref.getPtr().getCellRef().setOwner(owner); addImp (ref.getPtr(), count); @@ -470,47 +470,48 @@ void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MW std::map allowedForReplace; //Check which lists need restocking: - for (std::map >::iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end(); ++it) + for (std::map, int>::iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end();) { - int spawnedCount = it->second.first; //How many items should be in shop originally - int itemCount = count(it->first); //How many items are there in shop now + int spawnedCount = it->second; //How many items should be in shop originally + int itemCount = count(it->first.first); //How many items are there in shop now //If something was not sold if(itemCount >= spawnedCount) { - const std::string& parent = it->second.second; + const std::string& parent = it->first.second; // Security check for old saves: //If item is imported from old save(doesn't have an parent) and wasn't sold if(parent == "") { //Remove it, from shop, - remove(it->first, itemCount, ptr);//ptr is the NPC + remove(it->first.first, itemCount, ptr);//ptr is the NPC //And remove it from map, so that when we restock, the new item will have proper parent. - mLevelledItemMap.erase(it); + mLevelledItemMap.erase(it++); continue; - } //Create the entry if it does not exist yet std::map::iterator listInMap = allowedForReplace.insert( - std::make_pair(it->second.second, 0)).first; + std::make_pair(it->first.second, 0)).first; //And signal that we don't need to restock item from this list listInMap->second += std::abs(itemCount); } //If every of the item was sold else if (itemCount == 0) { - mLevelledItemMap.erase(it); + mLevelledItemMap.erase(it++); + continue; } //If some was sold, but some remain else { //Create entry if it does not exist yet std::map::iterator listInMap = allowedForReplace.insert( - std::make_pair(it->second.second, 0)).first; + std::make_pair(it->first.second, 0)).first; //And signal that we don't need to restock all items from this list listInMap->second += std::abs(itemCount); //And update itemCount so we don't mistake it next time. - it->second.first = itemCount; + it->second = itemCount; } + ++it; } //Restock: @@ -528,13 +529,12 @@ void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MW { std::map::iterator listInMap = allowedForReplace.find(itemOrList); - int restockNum = it-> mCount; + int restockNum = it->mCount; //If we know we must restock less, take it into account if(listInMap != allowedForReplace.end()) restockNum += listInMap->second;//We add, because list items have negative count //restock addInitialItem(itemOrList, owner, restockNum, true); - } else { diff --git a/apps/openmw/mwworld/containerstore.hpp b/apps/openmw/mwworld/containerstore.hpp index aaf83755a..876821f94 100644 --- a/apps/openmw/mwworld/containerstore.hpp +++ b/apps/openmw/mwworld/containerstore.hpp @@ -69,8 +69,8 @@ namespace MWWorld MWWorld::CellRefList repairs; MWWorld::CellRefList weapons; - std::map > mLevelledItemMap; - ///< Stores result of levelled item spawns. + std::map, int> mLevelledItemMap; + ///< Stores result of levelled item spawns. <(refId, spawningGroup), count> /// This is used to restock levelled items(s) if the old item was sold. mutable float mCachedWeight; diff --git a/components/esm/inventorystate.cpp b/components/esm/inventorystate.cpp index ad9e70af1..b24128ec3 100644 --- a/components/esm/inventorystate.cpp +++ b/components/esm/inventorystate.cpp @@ -44,7 +44,7 @@ void ESM::InventoryState::load (ESMReader &esm) if(esm.isNextSub("LGRP")) //Newest saves contain parent group parentGroup = esm.getHString(); - mLevelledItemMap[id] = std::make_pair(count, parentGroup); + mLevelledItemMap[std::make_pair(id, parentGroup)] = count; } while (esm.isNextSub("MAGI")) @@ -86,11 +86,11 @@ void ESM::InventoryState::save (ESMWriter &esm) const iter->save (esm, true); } - for (std::map >::const_iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end(); ++it) + for (std::map, int>::const_iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end(); ++it) { - esm.writeHNString ("LEVM", it->first); - esm.writeHNT ("COUN", it->second.first); - esm.writeHNString("LGRP", it->second.second); + esm.writeHNString ("LEVM", it->first.first); + esm.writeHNT ("COUN", it->second); + esm.writeHNString("LGRP", it->first.second); } for (TEffectMagnitudes::const_iterator it = mPermanentMagicEffectMagnitudes.begin(); it != mPermanentMagicEffectMagnitudes.end(); ++it) diff --git a/components/esm/inventorystate.hpp b/components/esm/inventorystate.hpp index a12be321f..f4bb0ab48 100644 --- a/components/esm/inventorystate.hpp +++ b/components/esm/inventorystate.hpp @@ -20,7 +20,7 @@ namespace ESM // std::map mEquipmentSlots; - std::map > mLevelledItemMap; + std::map, int> mLevelledItemMap; typedef std::map > > TEffectMagnitudes; TEffectMagnitudes mPermanentMagicEffectMagnitudes;