summaryrefslogtreecommitdiffstats
path: root/sigmod/MapTrainerTeamMember.cpp
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2009-01-10 17:33:17 -0500
committerBen Boeckel <MathStuf@gmail.com>2009-01-10 17:33:17 -0500
commit177cbde2478dea633d738c958a13e9c12a8a24a4 (patch)
tree7e06b4f79dfac3092a8edc245f1e077214e46162 /sigmod/MapTrainerTeamMember.cpp
parent70d5061d020aba0429c0a3a1be174e6f2a4f8e33 (diff)
downloadsigen-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.cpp63
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()