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