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