1 // Copyright (C) 2007, 2008, 2014, 2015, 2017, 2020 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 <sigc++/functors/mem_fun.h>
19
20 #include "rewardlist.h"
21 #include "reward.h"
22 #include "xmlhelper.h"
23 #include "rnd.h"
24
25 Glib::ustring Rewardlist::d_tag = "rewardlist";
26
27 //#define debug(x) {std::cerr<<__FILE__<<": "<<__LINE__<<": "<<x<<std::endl<<std::flush;}
28 #define debug(x)
29
30 Rewardlist* Rewardlist::s_instance = 0;
31
getInstance()32 Rewardlist* Rewardlist::getInstance()
33 {
34 if (s_instance == 0)
35 s_instance = new Rewardlist();
36
37 return s_instance;
38 }
39
getInstance(XML_Helper * helper)40 Rewardlist* Rewardlist::getInstance(XML_Helper* helper)
41 {
42 if (s_instance)
43 deleteInstance();
44
45 s_instance = new Rewardlist(helper);
46 return s_instance;
47 }
48
deleteInstance()49 void Rewardlist::deleteInstance()
50 {
51 if (s_instance)
52 delete s_instance;
53
54 s_instance = 0;
55 }
56
deleteReward(const Reward * s)57 void Rewardlist::deleteReward(const Reward* s)
58 {
59 for (const_iterator it = this->begin(); it != this->end(); it++)
60 if ((*it) == s)
61 {
62 this->flRemove(s);
63 return;
64 }
65 }
66
Rewardlist()67 Rewardlist::Rewardlist()
68 {
69 }
70
~Rewardlist()71 Rewardlist::~Rewardlist()
72 {
73 flClear();
74 }
75
Rewardlist(Rewardlist * rewardlist)76 Rewardlist::Rewardlist(Rewardlist *rewardlist)
77 {
78 for (iterator it = rewardlist->begin(); it != rewardlist->end(); it++)
79 {
80 switch ((*it)->getType())
81 {
82 case Reward::GOLD:
83 push_back(new Reward_Gold(*dynamic_cast<Reward_Gold*>(*it)));
84 break;
85 case Reward::ALLIES:
86 push_back(new Reward_Allies(*dynamic_cast<Reward_Allies*>(*it)));
87 break;
88 case Reward::ITEM:
89 push_back(new Reward_Item(*dynamic_cast<Reward_Item*>(*it)));
90 break;
91 case Reward::RUIN:
92 push_back(new Reward_Ruin(*dynamic_cast<Reward_Ruin*>(*it)));
93 break;
94 case Reward::MAP:
95 push_back(new Reward_Map(*dynamic_cast<Reward_Map*>(*it)));
96 break;
97 }
98 }
99 }
100
Rewardlist(XML_Helper * helper)101 Rewardlist::Rewardlist(XML_Helper* helper)
102 {
103 helper->registerTag(Reward::d_tag, sigc::mem_fun((*this), &Rewardlist::load));
104 load(Rewardlist::d_tag, helper);
105 }
106
flClear()107 void Rewardlist::flClear()
108 {
109 for (iterator it = begin(); it != end(); it++)
110 delete (*it);
111
112 clear();
113 }
114
flErase(iterator object)115 Rewardlist::iterator Rewardlist::flErase(iterator object)
116 {
117 delete (*object);
118 return erase(object);
119 }
120
flRemove(const Reward * object)121 bool Rewardlist::flRemove(const Reward* object)
122 {
123 debug("removing reward with id " << object->getId() << endl);
124 const_iterator rewardit = find(begin(), end(), object);
125 if (rewardit != end())
126 {
127 delete object;
128 erase(rewardit);
129 return true;
130 }
131 return false;
132 }
133
save(XML_Helper * helper) const134 bool Rewardlist::save(XML_Helper* helper) const
135 {
136 bool retval = true;
137
138 retval &= helper->openTag(Rewardlist::d_tag);
139
140 //save rewards
141 for (const_iterator it = begin(); it != end(); it++)
142 {
143 if ((*it)->getType() == Reward::GOLD)
144 static_cast<Reward_Gold*>(*it)->save(helper);
145 else if ((*it)->getType() == Reward::ALLIES)
146 static_cast<Reward_Allies*>(*it)->save(helper);
147 else if ((*it)->getType() == Reward::ITEM)
148 static_cast<Reward_Item*>(*it)->save(helper);
149 else if ((*it)->getType() == Reward::RUIN)
150 static_cast<Reward_Ruin*>(*it)->save(helper);
151 else if ((*it)->getType() == Reward::MAP)
152 static_cast<Reward_Map*>(*it)->save(helper);
153 }
154
155 retval &= helper->closeTag();
156
157 return retval;
158 }
159
load(Glib::ustring tag,XML_Helper * helper)160 bool Rewardlist::load(Glib::ustring tag, XML_Helper* helper)
161 {
162 if (tag == Reward::d_tag)
163 {
164 Reward *s = Reward::handle_load(helper);
165 push_back(s);
166 return true;
167 }
168
169 return false;
170 }
171
pop(Reward::Type type)172 Reward *Rewardlist::pop (Reward::Type type)
173 {
174 Rewardlist::iterator iter;
175 std::vector<Reward*> rewards;
176 for (iter = begin(); iter != end(); iter++)
177 {
178 if ((*iter)->getType() == type)
179 rewards.push_back(*iter);
180 }
181 if (rewards.size())
182 {
183 Reward *newReward = rewards[Rnd::rand() % rewards.size()];
184 remove(newReward);
185 return newReward;
186 }
187 else
188 return NULL;
189 }
190 // End of file
191