1 // Copyright (C) 2008, 2010, 2014, 2015 Ben Asselstine
2 //
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU Library General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 // 02110-1301, USA.
17
18 #include <iostream>
19 #include <sstream>
20 #include <sigc++/functors/mem_fun.h>
21
22 #include "Backpack.h"
23
24 #include "xmlhelper.h"
25
26 #include "Item.h"
27
28 Glib::ustring Backpack::d_tag = "backpack";
29
30 //#define debug(x) {std::cerr<<__FILE__<<": "<<__LINE__<<": "<<x<<std::endl<<flush;}
31 #define debug(x)
32
33
Backpack()34 Backpack::Backpack()
35 {
36 debug("Backpack()");
37 }
38
Backpack(XML_Helper * helper)39 Backpack::Backpack(XML_Helper* helper)
40 {
41 helper->registerTag(Item::d_tag, sigc::mem_fun(this, &Backpack::loadItem));
42 }
43
Backpack(const Backpack & backpack)44 Backpack::Backpack(const Backpack& backpack)
45 : std::list<Item*>()
46 {
47 for (const_iterator it = backpack.begin(); it != backpack.end(); it++)
48 push_back(new Item(**it));
49 }
50
~Backpack()51 Backpack::~Backpack()
52 {
53 for (iterator it = begin(); it != end(); it++)
54 delete (*it);
55 }
56
saveData(XML_Helper * helper) const57 bool Backpack::saveData(XML_Helper* helper) const
58 {
59 bool retval = true;
60 for (const_iterator it = begin(); it != end(); it++)
61 retval &= (*it)->save(helper);
62 return true;
63 }
64
save(XML_Helper * helper) const65 bool Backpack::save(XML_Helper* helper) const
66 {
67 bool retval = true;
68
69 retval &= helper->openTag(Backpack::d_tag);
70 retval &= saveData(helper);
71 retval &= helper->closeTag();
72
73 return retval;
74 }
75
loadItem(Glib::ustring tag,XML_Helper * helper)76 bool Backpack::loadItem(Glib::ustring tag, XML_Helper* helper)
77 {
78 if (tag == Backpack::d_tag)
79 return true;
80
81 if (tag == Item::d_tag)
82 {
83 Item* item = new Item(helper);
84 push_back(item);
85 return true;
86 }
87
88 return false;
89 }
90
countStrengthBonuses()91 guint32 Backpack::countStrengthBonuses()
92 {
93 guint32 bonus = 0;
94 for (iterator it = begin(); it != end(); it++)
95 {
96 if ((*it)->getBonus(Item::ADD1STR))
97 bonus += 1;
98 if ((*it)->getBonus(Item::ADD2STR))
99 bonus += 2;
100 if ((*it)->getBonus(Item::ADD3STR))
101 bonus += 3;
102 }
103 return bonus;
104 }
105
countStackStrengthBonuses()106 guint32 Backpack::countStackStrengthBonuses()
107 {
108 guint32 bonus = 0;
109 for (iterator it = begin(); it != end(); it++)
110 {
111 if ((*it)->getBonus(Item::ADD1STACK))
112 bonus += 1;
113 if ((*it)->getBonus(Item::ADD2STACK))
114 bonus += 2;
115 if ((*it)->getBonus(Item::ADD3STACK))
116 bonus += 3;
117 }
118 return bonus;
119 }
120
countGoldBonuses()121 guint32 Backpack::countGoldBonuses()
122 {
123 guint32 bonus = 0;
124 for (iterator it = begin(); it != end(); it++)
125 {
126 if ((*it)->getBonus(Item::ADD2GOLDPERCITY))
127 bonus += 2;
128 if ((*it)->getBonus(Item::ADD3GOLDPERCITY))
129 bonus += 3;
130 if ((*it)->getBonus(Item::ADD4GOLDPERCITY))
131 bonus += 4;
132 if ((*it)->getBonus(Item::ADD5GOLDPERCITY))
133 bonus += 5;
134 }
135 return bonus;
136 }
137
countMovementDoublers()138 guint32 Backpack::countMovementDoublers()
139 {
140 guint32 bonus = 0;
141 for (iterator it = begin(); it != end(); it++)
142 if ((*it)->getBonus(Item::DOUBLEMOVESTACK))
143 bonus++;
144 return bonus;
145 }
146
countStackFlightGivers()147 guint32 Backpack::countStackFlightGivers()
148 {
149 guint32 bonus = 0;
150 for (iterator it = begin(); it != end(); it++)
151 if ((*it)->getBonus(Item::FLYSTACK))
152 bonus++;
153 return bonus;
154 }
155
countPlantableItems()156 guint32 Backpack::countPlantableItems()
157 {
158 guint32 count = 0;
159 for (iterator it = begin(); it != end(); it++)
160 if ((*it)->isPlantable())
161 count++;
162 return count;
163 }
164
getPlantableItem(Player * player)165 Item *Backpack::getPlantableItem(Player *player)
166 {
167 for (iterator it = begin(); it != end(); it++)
168 if ((*it)->isPlantable() && (*it)->getPlantableOwner() == player)
169 return *it;
170 return NULL;
171 }
172
getItemById(guint32 id)173 Item *Backpack::getItemById(guint32 id)
174 {
175 for (iterator it = begin(); it != end(); it++)
176 if ((*it)->getId() == id)
177 return *it;
178 return NULL;
179 }
180
addToBackpack(Item * item,int position)181 bool Backpack::addToBackpack(Item* item, int position)
182 {
183 iterator it = begin();
184 for (; position > 0; position--, it++);
185 insert(it, item);
186 return true;
187 }
188
addToBackpack(Item * item)189 bool Backpack::addToBackpack(Item* item)
190 {
191 iterator it = end();
192 insert(it, item);
193 return true;
194 }
195
removeFromBackpack(Item * item)196 bool Backpack::removeFromBackpack(Item* item)
197 {
198 for (iterator it = begin(); it != end(); it++)
199 if ((*it) == item)
200 {
201 //FIXME: delete the item?
202 erase(it);
203 return true;
204 }
205
206 return false;
207 }
208
removeAllFromBackpack()209 void Backpack::removeAllFromBackpack()
210 {
211 while (!empty())
212 removeFromBackpack(front());
213 }
214
add(Backpack * backpack)215 void Backpack::add(Backpack *backpack)
216 {
217 for (Backpack::iterator it = backpack->begin(); it != backpack->end(); it++)
218 addToBackpack(new Item(**it));
219 }
220
hasUsableItem() const221 bool Backpack::hasUsableItem() const
222 {
223 for (Backpack::const_iterator it = begin(); it != end(); it++)
224 {
225 if ((*it)->isUsable())
226 return true;
227 }
228 return false;
229 }
230
getUsableItems(std::list<Item * > & items) const231 void Backpack::getUsableItems(std::list<Item*> &items) const
232 {
233 for (Backpack::const_iterator it = begin(); it != end(); it++)
234 {
235 if ((*it)->isUsable())
236 items.push_back(*it);
237 }
238 return;
239 }
240
useItem(Item * item)241 bool Backpack::useItem(Item *item)
242 {
243 if (item->isUsable() && item->use())
244 return removeFromBackpack(item);
245 return false;
246 }
247 // End of file
248