summaryrefslogtreecommitdiff
path: root/src/net/manaserv/stats.cpp
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-04-23 22:15:26 -0600
committerJared Adams <jaxad0127@gmail.com>2010-04-25 15:03:55 -0600
commit88524a71b8d3727b5ad4a8a60e146fd8e786b7ad (patch)
tree1ae5d143a22d8a94490e76994e9a253648a21651 /src/net/manaserv/stats.cpp
parent33481831b44f7e6fded6b9be29f1ea56bf74bfa2 (diff)
downloadmana-client-88524a71b8d3727b5ad4a8a60e146fd8e786b7ad.tar.gz
mana-client-88524a71b8d3727b5ad4a8a60e146fd8e786b7ad.tar.bz2
mana-client-88524a71b8d3727b5ad4a8a60e146fd8e786b7ad.tar.xz
mana-client-88524a71b8d3727b5ad4a8a60e146fd8e786b7ad.zip
Make ManaServ player stats softcoded
A new stats.xml file is parsed for player stats for ManaServ. The old hardcoded stats remain as backup. Reviewed-by: Bertram
Diffstat (limited to 'src/net/manaserv/stats.cpp')
-rw-r--r--src/net/manaserv/stats.cpp202
1 files changed, 202 insertions, 0 deletions
diff --git a/src/net/manaserv/stats.cpp b/src/net/manaserv/stats.cpp
new file mode 100644
index 00000000..b79b1fd9
--- /dev/null
+++ b/src/net/manaserv/stats.cpp
@@ -0,0 +1,202 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/manaserv/stats.h"
+
+#include "log.h"
+
+#include "gui/statuswindow.h"
+
+#include "resources/itemdb.h"
+
+#include "utils/gettext.h"
+#include "utils/xml.h"
+
+#include <list>
+#include <map>
+
+namespace ManaServ {
+namespace Stats {
+ typedef struct {
+ unsigned int id;
+ std::string name;
+ std::string tag;
+ std::string effect;
+ std::string description;
+ bool modifiable;
+ } Stat;
+
+ typedef std::map<unsigned int, Stat> StatMap;
+ StatMap stats;
+
+ static void loadBuiltins()
+ {
+ {
+ Stat s;
+ s.id = 16;
+ s.name = _("Strength");
+ s.tag = "str";
+ s.effect = _("Strength %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+
+ {
+ Stat s;
+ s.id = 17;
+ s.name = _("Agility");
+ s.tag = "agi";
+ s.effect = _("Agility %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+
+ {
+ Stat s;
+ s.id = 18;
+ s.name = _("Dexterity");
+ s.tag = "dex";
+ s.effect = _("Dexterity %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+
+ {
+ Stat s;
+ s.id = 19;
+ s.name = _("Vitality");
+ s.tag = "vit";
+ s.effect = _("Vitality %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+
+ {
+ Stat s;
+ s.id = 20;
+ s.name = _("Intelligence");
+ s.tag = "int";
+ s.effect = _("Intelligence %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+
+ {
+ Stat s;
+ s.id = 21;
+ s.name = _("Willpower");
+ s.tag = "will";
+ s.effect = _("Willpower %+d");
+ s.description = "";
+ s.modifiable = true;
+
+ stats[s.id] = s;
+ }
+ }
+
+ void load()
+ {
+ XML::Document doc("stats.xml");
+ xmlNodePtr rootNode = doc.rootNode();
+
+ if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "stats"))
+ {
+ logger->log("Stats: Error while loading stats.xml!");
+ loadBuiltins();
+ return;
+ }
+
+ for_each_xml_child_node(node, rootNode)
+ {
+ if (!xmlStrEqual(node->name, BAD_CAST "stat"))
+ continue;
+
+ int id = XML::getProperty(node, "id", 0);
+
+ if (id == 0)
+ {
+ logger->log("Stats: Invalid or missing stat ID in stats.xml!");
+ continue;
+ }
+ else if (stats.find(id) != stats.end())
+ {
+ logger->log("Stats: Redefinition of stat ID %d", id);
+ }
+
+ std::string name = XML::getProperty(node, "name", "");
+
+ if (name.empty())
+ {
+ logger->log("Stats: Invalid or missing stat name in "
+ "stats.xml!");
+ continue;
+ }
+
+ Stat s;
+ s.id = id;
+ s.name = name;
+ s.tag = XML::getProperty(node, "tag", "");
+ s.effect = XML::getProperty(node, "effect", "");
+ s.description = XML::getProperty(node, "desc", "");
+ s.modifiable = XML::getProperty(node, "modifiable", "false")
+ == "true";
+
+ stats[id] = s;
+ }
+ }
+
+ void unload()
+ {
+ stats.clear();
+ }
+
+ void informItemDB()
+ {
+ std::list<ItemDB::Stat> dbStats;
+
+ StatMap::const_iterator it, it_end;
+ for (it = stats.begin(), it_end = stats.end(); it != it_end; it++)
+ if (!it->second.tag.empty())
+ dbStats.push_back(ItemDB::Stat(it->second.tag,
+ it->second.effect));
+
+ ItemDB::setStatsList(dbStats);
+ }
+
+ void informStatusWindow()
+ {
+ StatMap::const_iterator it, it_end;
+ for (it = stats.begin(), it_end = stats.end(); it != it_end; it++)
+ statusWindow->addAttribute(it->second.id, it->second.name,
+ it->second.modifiable,
+ it->second.description);
+ }
+} // namespace Stats
+} // namespace ManaServ