1 // Copyright (C) 2007, 2008, 2009 Ben Asselstine
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.
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.
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
21 #include <sigc++/functors/mem_fun.h>
25 #include "armysetlist.h"
26 #include "playerlist.h"
29 #include "rewardlist.h"
34 #include "ucompose.hpp"
37 std::string Reward::d_tag = "reward";
41 Reward::Reward(Type type, std::string name)
42 :d_type(type), d_name(name)
46 Reward::Reward(XML_Helper *helper)
49 helper->getData(type_str, "type");
50 d_type = rewardTypeFromString(type_str);
51 helper->getData(d_name, "name");
54 Reward::Reward (const Reward& orig)
55 :d_type(orig.d_type), d_name(orig.d_name)
63 Reward* Reward::handle_load(XML_Helper* helper)
67 helper->getData(type_str, "type");
68 t = rewardTypeFromString(type_str);
73 return (new Reward_Gold(helper));
75 return (new Reward_Allies(helper));
77 return (new Reward_Item(helper));
79 return (new Reward_Ruin(helper));
81 return (new Reward_Map(helper));
87 Reward_Gold::Reward_Gold(guint32 gold)
88 :Reward(Reward::GOLD), d_gold(gold)
92 Reward_Gold::Reward_Gold(XML_Helper* helper)
95 helper->getData(d_gold, "gold");
98 Reward_Gold::Reward_Gold (const Reward_Gold & orig)
99 :Reward(orig), d_gold(orig.d_gold)
103 bool Reward_Gold::save(XML_Helper* helper) const
106 retval &= helper->openTag(Reward::d_tag);
107 std::string type_str = rewardTypeToString(Reward::Type(d_type));
108 retval &= helper->saveData("type", type_str);
109 retval &= helper->saveData("name", d_name);
110 retval &= helper->saveData("gold", d_gold);
111 retval &= helper->closeTag();
115 Reward_Gold::~Reward_Gold()
119 guint32 Reward_Gold::getRandomGoldPieces()
121 return 310 + (rand() % 1000);
124 Reward_Allies::Reward_Allies(guint32 army_type, guint32 army_set, guint32 count)
125 :Reward(Reward::ALLIES), d_count(count)
127 Armysetlist *al = Armysetlist::getInstance();
128 d_army_type = army_type;
129 d_army_set = army_set;
130 d_army = al->getArmy (army_set, army_type);
133 Reward_Allies::Reward_Allies(const ArmyProto *army, guint32 count)
134 :Reward(Reward::ALLIES), d_count(count)
136 d_army_type = army->getTypeId();
137 d_army_set = army->getArmyset();
141 Reward_Allies::Reward_Allies(XML_Helper* helper)
144 Armysetlist *al = Armysetlist::getInstance();
145 helper->getData(d_count, "num_allies");
146 helper->getData(d_army_type, "ally_type");
147 helper->getData(d_army_set, "ally_armyset");
148 d_army = al->getArmy (d_army_set, d_army_type);
151 Reward_Allies::Reward_Allies (const Reward_Allies& orig)
152 :Reward(orig), d_army(orig.d_army), d_army_type(orig.d_army_type),
153 d_army_set(orig.d_army_set), d_count(orig.d_count)
157 bool Reward_Allies::save(XML_Helper* helper) const
160 retval &= helper->openTag(Reward::d_tag);
161 std::string type_str = rewardTypeToString(Reward::Type(d_type));
162 retval &= helper->saveData("type", type_str);
163 retval &= helper->saveData("name", d_name);
164 retval &= helper->saveData("num_allies", d_count);
165 retval &= helper->saveData("ally_type", d_army_type);
166 retval &= helper->saveData("ally_armyset", d_army_set);
167 retval &= helper->closeTag();
171 const guint32 Reward_Allies::getRandomAmountOfAllies()
173 int percent = rand() % 100;
176 else if (percent < 50)
178 else if (percent < 70)
180 else if (percent < 80)
182 else if (percent < 85)
184 else if (percent < 90)
186 else if (percent < 95)
188 else if (percent < 100)
194 const ArmyProto* Reward_Allies::randomArmyAlly()
196 Armysetlist *al = Armysetlist::getInstance();
197 Player *p = Playerlist::getInstance()->getActiveplayer();
199 p = Playerlist::getInstance()->getNeutral();
200 return al->getArmyset(p->getArmyset())->getRandomAwardableAlly();
203 bool Reward_Allies::addAllies(Player *p, Vector<int> pos, const ArmyProto *army, guint32 alliesCount)
205 for (unsigned int i = 0; i < alliesCount; i++)
207 Army* ally = new Army(*army, p);
209 if (GameMap::getInstance()->addArmyAtPos(pos, ally) == NULL)
215 bool Reward_Allies::addAllies(Player *p, Location *l, const Army *army, guint32 alliesCount)
217 for (unsigned int i = 0; i < alliesCount; i++)
219 Army* ally = new Army(*army, p);
221 if (GameMap::getInstance()->addArmy(l, ally) == NULL)
228 Reward_Allies::~Reward_Allies()
232 Reward_Item::Reward_Item(Item *item)
233 :Reward(Reward::ITEM), d_item(item)
237 bool Reward_Item::loadItem(std::string tag, XML_Helper* helper)
239 if (tag == Item::d_tag)
241 d_item = new Item(helper);
248 Reward_Item::Reward_Item(XML_Helper* helper)
251 helper->registerTag(Item::d_tag, sigc::mem_fun(this, &Reward_Item::loadItem));
254 Reward_Item::Reward_Item (const Reward_Item& orig)
255 :Reward(orig), d_item(orig.d_item)
259 bool Reward_Item::save(XML_Helper* helper) const
262 retval &= helper->openTag(Reward::d_tag);
263 std::string type_str = rewardTypeToString(Reward::Type(d_type));
264 retval &= helper->saveData("type", type_str);
265 retval &= helper->saveData("name", d_name);
266 retval &= d_item->save(helper);
267 retval &= helper->closeTag();
271 Item *Reward_Item::getRandomItem()
273 Itemlist *il = Itemlist::getInstance();
274 Itemlist::iterator it = il->begin();
275 std::advance(it, rand() % il->size());
276 ItemProto *i = it->second;
280 Reward_Item::~Reward_Item()
286 Reward_Ruin::Reward_Ruin(Ruin *ruin)
287 :Reward(Reward::RUIN), d_ruin_pos(ruin->getPos())
291 Reward_Ruin::Reward_Ruin(XML_Helper* helper)
296 helper->getData(x, "x");
297 helper->getData(y, "y");
298 d_ruin_pos = Vector<int>(x,y);
301 Reward_Ruin::Reward_Ruin (const Reward_Ruin& orig)
302 :Reward(orig), d_ruin_pos(orig.d_ruin_pos)
305 bool Reward_Ruin::save(XML_Helper* helper) const
308 retval &= helper->openTag(Reward::d_tag);
309 std::string type_str = rewardTypeToString(Reward::Type(d_type));
310 retval &= helper->saveData("type", type_str);
311 retval &= helper->saveData("name", d_name);
312 retval &= helper->saveData("x", getRuin()->getPos().x);
313 retval &= helper->saveData("y", getRuin()->getPos().y);
314 retval &= helper->closeTag();
318 Ruin *Reward_Ruin::getRandomHiddenRuin()
320 std::vector<Ruin *>hidden_ruins;
321 Ruinlist *rl = Ruinlist::getInstance();
322 Rewardlist *rw = Rewardlist::getInstance();
323 for (Ruinlist::iterator it = rl->begin(); it != rl->end(); it++)
325 if ((*it)->isHidden())
326 if ((*it)->getOwner() == NULL ||
327 (*it)->getOwner() == Playerlist::getInstance()->getNeutral())
329 //is it already being pointed to by a reward in the rewardlist?
331 for (Rewardlist::iterator i = rw->begin(); i != rw->end(); i++)
333 if ((*i)->getType() == Reward::RUIN)
335 Ruin *r = static_cast<Reward_Ruin*>(*i)->getRuin();
338 if (r->getPos() == (*it)->getPos())
347 hidden_ruins.push_back(*it);
350 if (hidden_ruins.empty())
352 return hidden_ruins[rand() % hidden_ruins.size()];
355 Reward_Ruin::~Reward_Ruin()
359 Reward_Map::Reward_Map(Vector<int> pos, std::string name,
360 guint32 height, guint32 width)
361 :Reward(Reward::MAP, name)
363 d_sightmap = new SightMap(name, pos, height, width);
366 bool Reward_Map::loadMap(std::string tag, XML_Helper* helper)
368 if (tag == SightMap::d_tag)
370 d_sightmap = new SightMap(helper);
378 Reward_Map::Reward_Map(XML_Helper* helper)
381 helper->registerTag(SightMap::d_tag, sigc::mem_fun(this, &Reward_Map::loadMap));
384 Reward_Map::Reward_Map (const Reward_Map& orig)
387 d_sightmap = new SightMap(*orig.d_sightmap);
390 bool Reward_Map::save(XML_Helper* helper) const
393 retval &= helper->openTag(Reward::d_tag);
394 std::string type_str = rewardTypeToString(Reward::Type(d_type));
395 retval &= helper->saveData("type", type_str);
396 retval &= helper->saveData("name", d_sightmap->getName());
397 retval &= d_sightmap->save(helper);
398 retval &= helper->closeTag();
402 void Reward_Map::getRandomMap(int *x, int *y, int *width, int *height)
404 int map_width = GameMap::getInstance()->getWidth();
405 *x = rand() % (map_width - (map_width / 10));
406 int map_height = GameMap::getInstance()->getHeight();
407 *y = rand() % (map_height - (map_height / 10));
408 *width = ((rand() % (map_width - *x)) + (map_width / 10));
409 *height = ((rand() % (map_height - *y)) + (map_height / 10));
412 Reward_Map::~Reward_Map()
418 std::string Reward::getDescription() const
420 Glib::ustring s = "";
425 const Reward_Gold *g = dynamic_cast<const Reward_Gold*>(this);
426 s += String::ucompose(ngettext("%1 Gold Piece", "%1 Gold Pieces",
427 g->getGold()), g->getGold());
432 const Reward_Allies *a = dynamic_cast<const Reward_Allies *>(this);
434 s += String::ucompose(_("Allies: %1 x %2"), a->getArmy()->getName(),
440 const Reward_Item *i = dynamic_cast<const Reward_Item *>(this);
442 s += String::ucompose(_("Item: %1"), i->getItem()->getName());
447 const Reward_Ruin *r = dynamic_cast<const Reward_Ruin *>(this);
449 s += String::ucompose(_("Site: %1"), r->getRuin()->getName());
454 const Reward_Map *m = dynamic_cast<const Reward_Map *>(this);
455 s += String::ucompose(_("Map: %1,%2 %3x%4"),
466 std::string Reward::rewardTypeToString(const Reward::Type type)
471 return "Reward::GOLD";
474 return "Reward::ALLIES";
477 return "Reward::ITEM";
480 return "Reward::RUIN";
483 return "Reward::MAP";
486 return "Reward::GOLD";
489 Reward::Type Reward::rewardTypeFromString(const std::string str)
491 if (str.size() > 0 && isdigit(str.c_str()[0]))
492 return Reward::Type(atoi(str.c_str()));
493 if (str == "Reward::GOLD")
495 else if (str == "Reward::ALLIES")
496 return Reward::ALLIES;
497 else if (str == "Reward::ITEM")
499 else if (str == "Reward::RUIN")
501 else if (str == "Reward::MAP")
506 Reward* Reward::copy(const Reward* r)
511 return (new Reward_Gold(*dynamic_cast<const Reward_Gold*>(r)));
513 return (new Reward_Allies(*dynamic_cast<const Reward_Allies*>(r)));
515 return (new Reward_Item(*dynamic_cast<const Reward_Item*>(r)));
517 return (new Reward_Ruin(*dynamic_cast<const Reward_Ruin*>(r)));
519 return (new Reward_Map(*dynamic_cast<const Reward_Map*>(r)));