1 // Copyright (C) 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
20 #include "rectangle.h"
21 #include <sigc++/functors/mem_fun.h>
24 #include "shieldset.h"
25 #include "shieldstyle.h"
30 std::string Shieldset::d_tag = "shieldset";
31 std::string Shieldset::file_extension = SHIELDSET_EXT;
33 #define debug(x) {cerr<<__FILE__<<": "<<__LINE__<<": "<<x<<endl<<flush;}
36 Shieldset::Shieldset(guint32 id, std::string name)
37 : d_id(id), d_name(name), d_copyright(""), d_license(""), d_info(""),
42 Shieldset::Shieldset(XML_Helper *helper, std::string directory)
45 setDirectory(directory);
46 helper->getData(d_id, "id");
47 helper->getData(d_name, "name");
48 helper->getData(d_copyright, "copyright");
49 helper->getData(d_license, "license");
50 helper->getData(d_info, "info");
51 helper->getData(d_small_width, "small_width");
52 helper->getData(d_small_height, "small_height");
53 helper->getData(d_medium_width, "medium_width");
54 helper->getData(d_medium_height, "medium_height");
55 helper->getData(d_large_width, "large_width");
56 helper->getData(d_large_height, "large_height");
57 helper->registerTag(Shield::d_tag,
58 sigc::mem_fun((*this), &Shieldset::loadShield));
59 helper->registerTag(ShieldStyle::d_tag, sigc::mem_fun((*this),
60 &Shieldset::loadShield));
64 Shieldset::~Shieldset()
66 uninstantiateImages();
67 for (iterator it = begin(); it != end(); it++)
71 ShieldStyle * Shieldset::lookupShieldByTypeAndColour(guint32 type, guint32 colour) const
73 for (const_iterator it = begin(); it != end(); it++)
75 for (Shield::const_iterator i = (*it)->begin(); i != (*it)->end(); i++)
77 if ((*i)->getType() == type && (*it)->getOwner() == colour)
84 Gdk::Color Shieldset::getColor(guint32 owner) const
86 for (const_iterator it = begin(); it != end(); it++)
88 if ((*it)->getOwner() == owner)
89 return (*it)->getColor();
91 return Gdk::Color("black");
94 bool Shieldset::loadShield(std::string tag, XML_Helper* helper)
96 if (tag == Shield::d_tag)
98 Shield* sh = new Shield(helper);
102 if (tag == ShieldStyle::d_tag)
104 ShieldStyle *sh = new ShieldStyle(helper);
105 (*back()).push_back(sh);
112 class ShieldsetLoader
115 ShieldsetLoader(std::string filename)
118 dir = File::get_dirname(filename);
119 if (File::nameEndsWith(filename, Shieldset::file_extension) == false)
120 filename += Shieldset::file_extension;
121 XML_Helper helper(filename, ios::in, false);
122 helper.registerTag(Shieldset::d_tag, sigc::mem_fun((*this), &ShieldsetLoader::load));
125 std::cerr << "Error, while loading an shieldset. Shieldset Name: ";
126 std::cerr <<File::get_basename(File::get_dirname(filename))<<
127 std::endl <<std::flush;
128 if (shieldset != NULL)
133 bool load(std::string tag, XML_Helper* helper)
135 if (tag == Shieldset::d_tag)
137 shieldset = new Shieldset(helper, dir);
143 Shieldset *shieldset;
146 Shieldset *Shieldset::create(std::string filename)
148 ShieldsetLoader d(filename);
152 void Shieldset::getFilenames(std::list<std::string> &files) const
154 for (const_iterator it = begin(); it != end(); it++)
155 for (Shield::const_iterator i = (*it)->begin(); i != (*it)->end(); i++)
157 std::string file = (*i)->getImageName();
158 if (std::find(files.begin(), files.end(), file) == files.end())
159 files.push_back(file);
163 bool Shieldset::save(XML_Helper *helper) const
167 retval &= helper->openTag(d_tag);
168 retval &= helper->saveData("id", d_id);
169 retval &= helper->saveData("name", d_name);
170 retval &= helper->saveData("copyright", d_copyright);
171 retval &= helper->saveData("license", d_license);
172 retval &= helper->saveData("info", d_info);
173 retval &= helper->saveData("small_width", d_small_width);
174 retval &= helper->saveData("small_height", d_small_height);
175 retval &= helper->saveData("medium_width", d_medium_width);
176 retval &= helper->saveData("medium_height", d_medium_height);
177 retval &= helper->saveData("large_width", d_large_width);
178 retval &= helper->saveData("large_height", d_large_height);
179 for (const_iterator it = begin(); it != end(); it++)
180 retval &= (*it)->save(helper);
181 retval &= helper->closeTag();
185 void Shieldset::instantiateImages()
187 for (iterator it = begin(); it != end(); it++)
188 (*it)->instantiateImages(this);
191 void Shieldset::uninstantiateImages()
193 for (iterator it = begin(); it != end(); it++)
194 (*it)->uninstantiateImages();
197 std::string Shieldset::getConfigurationFile() const
199 return getDirectory() + d_subdir + file_extension;
202 std::list<std::string> Shieldset::scanUserCollection()
204 return File::scanFiles(File::getUserShieldsetDir(), file_extension);
207 std::list<std::string> Shieldset::scanSystemCollection()
209 std::list<std::string> retlist = File::scanFiles(File::getShieldsetDir(),
213 std::cerr << "Couldn't find any shieldsets!" << std::endl;
214 std::cerr << "Please check the path settings in /etc/lordsawarrc or ~/.lordsawarrc" << std::endl;
215 std::cerr << "Exiting!" << std::endl;
223 bool Shieldset::validate() const
226 if (validateNumberOfShields() == false)
228 for (unsigned int i = Shield::WHITE; i <= Shield::NEUTRAL; i++)
230 if (validateShieldImages(Shield::Colour(i)) == false)
236 bool Shieldset::validateNumberOfShields() const
238 int players[MAX_PLAYERS + 1][3];
239 memset(players, 0, sizeof(players));
240 //need at least 3 complete player shields, one of which must be neutral.
241 for (const_iterator it = begin(); it != end(); it++)
243 for (Shield::const_iterator i = (*it)->begin(); i != (*it)->end(); i++)
246 switch ((*i)->getType())
248 case ShieldStyle::SMALL: idx = 0; break;
249 case ShieldStyle::MEDIUM: idx = 1; break;
250 case ShieldStyle::LARGE: idx = 2; break;
252 players[(*it)->getOwner()][idx]++;
256 for (unsigned int i = 0; i < MAX_PLAYERS + 1; i++)
258 if (players[i][0] > 0 && players[i][1] > 0 && players[i][2] > 0)
263 if (players[MAX_PLAYERS][0] == 0 || players[MAX_PLAYERS][1] == 0 || players[MAX_PLAYERS][2] == 0)
268 bool Shieldset::validateShieldImages(Shield::Colour c) const
270 //if we have a shield, it should have all 3 sizes.
272 memset(player, 0, sizeof(player));
273 for (const_iterator it = begin(); it != end(); it++)
275 if ((*it)->getOwner() != guint32(c))
277 for (Shield::const_iterator i = (*it)->begin(); i != (*it)->end(); i++)
280 switch ((*i)->getType())
282 case ShieldStyle::SMALL: idx = 0; break;
283 case ShieldStyle::MEDIUM: idx = 1; break;
284 case ShieldStyle::LARGE: idx = 2; break;
286 if ((*i)->getImageName().empty() == false)
290 int count = player[0] + player[1] + player[2];