diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2009-01-10 17:33:17 -0500 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2009-01-10 17:33:17 -0500 |
| commit | 177cbde2478dea633d738c958a13e9c12a8a24a4 (patch) | |
| tree | 7e06b4f79dfac3092a8edc245f1e077214e46162 /sigmod/MapTrainerTeamMember.cpp | |
| parent | 70d5061d020aba0429c0a3a1be174e6f2a4f8e33 (diff) | |
| download | sigen-177cbde2478dea633d738c958a13e9c12a8a24a4.tar.gz sigen-177cbde2478dea633d738c958a13e9c12a8a24a4.tar.xz sigen-177cbde2478dea633d738c958a13e9c12a8a24a4.zip | |
Changed item handling in MapTrainerTeamMember to use a map instead of a list (since it can have duplicates)
Diffstat (limited to 'sigmod/MapTrainerTeamMember.cpp')
| -rw-r--r-- | sigmod/MapTrainerTeamMember.cpp | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/sigmod/MapTrainerTeamMember.cpp b/sigmod/MapTrainerTeamMember.cpp index bfe34d66..b2948bcc 100644 --- a/sigmod/MapTrainerTeamMember.cpp +++ b/sigmod/MapTrainerTeamMember.cpp @@ -66,7 +66,10 @@ void Sigmod::MapTrainerTeamMember::validate() TEST_LIST(ability); if (sigmod()->rules()->maxHeldItems() < m_item.size()) emit(error("Too many held items")); - TEST_LIST(item); + TEST_MAP(item); + const Species* species = sigmod()->speciesById(m_species); + if (species && ((species->maxHoldWeight() < heldWeight()))) + emit(error("Cannot carry that much weight")); if (sigmod()->rules()->maxMoves() < m_move.size()) emit(error("Too many moves")); TEST_LIST(move); @@ -82,7 +85,7 @@ void Sigmod::MapTrainerTeamMember::load(const QDomElement& xml) LOAD(species); LOAD(level); LOAD_LIST(ability); - LOAD_LIST(item); + LOAD_MAP(item); LOAD_LIST(move); LOAD_LIST(nature); } @@ -93,7 +96,7 @@ QDomElement Sigmod::MapTrainerTeamMember::save() const SAVE(species); SAVE(level); SAVE_LIST(ability); - SAVE_LIST(item); + SAVE_MAP(item); SAVE_LIST(move); SAVE_LIST(nature); return xml; @@ -103,26 +106,35 @@ SETTER(MapTrainerTeamMember, int, Species, species) SETTER(MapTrainerTeamMember, int, Level, level) SETTER_LIST_LIMIT(MapTrainerTeamMember, Ability, ability, sigmod()->rules()->maxAbilities(), "Cannot have anymore abilities") -void Sigmod::MapTrainerTeamMember::setItem(const int item, const bool state) +void Sigmod::MapTrainerTeamMember::setItem(const int item, const int count) { - if (itemCheck(item) && state && !m_item.contains(item)) + TBOUNDS("item count", 0, INT_MAX, count); + if (count && itemCheck(item) && (!m_item.contains(item) || (count != m_item[item]))) { - if (m_item.size() < sigmod()->rules()->maxHeldItems()) + const QList<int> items = m_item.keys(); + int total = count; + foreach (int itemCount, items) + { + if (itemCount == item) + continue; + total += m_item[itemCount]; + } + if (total <= sigmod()->rules()->maxHeldItems()) { - if (checkWeight(item)) + if (checkWeight(item, count)) { - m_item.append(item); + m_item[item] = count; emit(changed()); } else ERROR("Cannot carry that much weight"); } else - ERROR("Cannot hold any more items"); + ERROR("Cannot hold that many items"); } - else if (m_item.contains(item)) + else if (!count && m_item.contains(item)) { - m_item.removeAll(item); + m_item.remove(item); emit(changed()); } } @@ -160,7 +172,7 @@ SETTER_LIST_LIMIT(MapTrainerTeamMember, Nature, nature, sigmod()->rules()->maxNa GETTER(MapTrainerTeamMember, int, species) GETTER(MapTrainerTeamMember, int, level) GETTER_LIST(MapTrainerTeamMember, ability) -GETTER_LIST(MapTrainerTeamMember, item) +GETTER_MAP(MapTrainerTeamMember, item) GETTER_LIST(MapTrainerTeamMember, move) GETTER_LIST(MapTrainerTeamMember, nature) @@ -185,19 +197,28 @@ Sigmod::MapTrainerTeamMember& Sigmod::MapTrainerTeamMember::operator=(const MapT return *this; } -bool Sigmod::MapTrainerTeamMember::checkWeight(const int item) +int Sigmod::MapTrainerTeamMember::heldWeight(const QMap<int, int>& items) const { - const Species* species = sigmod()->speciesById(m_species); - if (!species) - return true; - int totalWeight = sigmod()->itemById(item)->weight(); - foreach (int itemId, m_item) + int totalWeight = 0; + QMap<int, int> itemsToCheck = (items.empty() ? m_item : items); + QList<int> itemIds = itemsToCheck.keys(); + foreach (int itemId, itemIds) { const Item* item = sigmod()->itemById(itemId); - if (!item) - totalWeight += item->weight(); + if (item) + totalWeight += itemsToCheck[itemId] * item->weight(); } - return (totalWeight <= species->maxHoldWeight()); + return totalWeight; +} + +bool Sigmod::MapTrainerTeamMember::checkWeight(const int item, const int count) const +{ + const Species* species = sigmod()->speciesById(m_species); + if (!species) + return true; + QMap<int, int> temp = m_item; + temp[item] = count; + return (heldWeight(temp) <= species->maxHoldWeight()); } void Sigmod::MapTrainerTeamMember::clear() |
