From bd10eec0009a0b90b246b07829d176a360d7bccb Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Wed, 29 Jun 2016 18:57:21 +0300
Subject: Add statdb. Move to statdb server related stats list.

---
 src/CMakeLists.txt                 |  2 +
 src/Makefile.am                    |  2 +
 src/client.cpp                     |  3 ++
 src/defaults.cpp                   |  3 ++
 src/net/eathena/generalhandler.cpp |  3 +-
 src/net/tmwa/generalhandler.cpp    |  3 +-
 src/resources/db/itemdb.cpp        |  9 +---
 src/resources/db/itemdb.h          |  7 ---
 src/resources/db/statdb.cpp        | 97 ++++++++++++++++++++++++++++++++++++++
 src/resources/db/statdb.h          | 47 ++++++++++++++++++
 10 files changed, 160 insertions(+), 16 deletions(-)
 create mode 100644 src/resources/db/statdb.cpp
 create mode 100644 src/resources/db/statdb.h

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8d9b10df4..7080937b4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -771,6 +771,8 @@ SET(SRCS
     resources/skilltype.h
     resources/db/sounddb.cpp
     resources/db/sounddb.h
+    resources/db/statdb.cpp
+    resources/db/statdb.h
     resources/db/statuseffectdb.cpp
     resources/db/statuseffectdb.h
     resources/db/weaponsdb.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 1ecd85058..18975b618 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1251,6 +1251,8 @@ manaplus_SOURCES += main.cpp \
 	      resources/db/skillunitdb.h \
 	      resources/db/sounddb.cpp \
 	      resources/db/sounddb.h \
+	      resources/db/statdb.cpp \
+	      resources/db/statdb.h \
 	      resources/db/statuseffectdb.cpp \
 	      resources/db/statuseffectdb.h \
 	      resources/db/weaponsdb.cpp \
diff --git a/src/client.cpp b/src/client.cpp
index 983341182..f0deaeca4 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -121,6 +121,7 @@
 #include "resources/db/palettedb.h"
 #include "resources/db/petdb.h"
 #include "resources/db/skillunitdb.h"
+#include "resources/db/statdb.h"
 #include "resources/db/statuseffectdb.h"
 #include "resources/db/weaponsdb.h"
 
@@ -594,6 +595,7 @@ void Client::gameClear()
 
     // Unload XML databases
     CharDB::unload();
+    StatDb::unload();
     DeadDB::unload();
     ColorDB::unload();
     SoundDB::unload();
@@ -1320,6 +1322,7 @@ int Client::gameExec()
 
                     // Load XML databases
                     CharDB::load();
+                    StatDb::load();
                     DeadDB::load();
                     PaletteDB::load();
                     ColorDB::load();
diff --git a/src/defaults.cpp b/src/defaults.cpp
index e6653942b..cacd7042f 100644
--- a/src/defaults.cpp
+++ b/src/defaults.cpp
@@ -621,6 +621,9 @@ DefaultsData* getPathsDefaults()
     AddDEF("badgesFile", "badges.xml");
     AddDEF("badgesPatchFile", "badges_patch.xml");
     AddDEF("badgesPatchDir", "badges.d");
+    AddDEF("statFile", "stats.xml");
+    AddDEF("statPatchFile", "stats_patch.xml");
+    AddDEF("statPatchDir", "stats.d");
     AddDEF("equipmentSlotsFile", "equipmentslots.xml");
     AddDEF("weaponsFile", "weapons.xml");
     AddDEF("poisonEffectName", "poison");
diff --git a/src/net/eathena/generalhandler.cpp b/src/net/eathena/generalhandler.cpp
index 0cc91b297..42a5ad974 100644
--- a/src/net/eathena/generalhandler.cpp
+++ b/src/net/eathena/generalhandler.cpp
@@ -69,6 +69,7 @@
 #include "net/eathena/vendinghandler.h"
 
 #include "resources/db/itemdbstat.h"
+#include "resources/db/statdb.h"
 
 #include "utils/delete2.h"
 #include "utils/gettext.h"
@@ -132,7 +133,7 @@ GeneralHandler::GeneralHandler() :
     // TRANSLATORS: player stat
     stats.push_back(ItemDB::Stat("luck", _("Luck %s")));
 
-    ItemDB::setStatsList(stats);
+    StatDb::setStatsList(stats);
 }
 
 GeneralHandler::~GeneralHandler()
diff --git a/src/net/tmwa/generalhandler.cpp b/src/net/tmwa/generalhandler.cpp
index 10b5cf5f2..4fef79f57 100644
--- a/src/net/tmwa/generalhandler.cpp
+++ b/src/net/tmwa/generalhandler.cpp
@@ -72,6 +72,7 @@
 #endif
 
 #include "resources/db/itemdbstat.h"
+#include "resources/db/statdb.h"
 
 #include "utils/delete2.h"
 #include "utils/gettext.h"
@@ -139,7 +140,7 @@ GeneralHandler::GeneralHandler() :
     // TRANSLATORS: player stat
     stats.push_back(ItemDB::Stat("luck", _("Luck %s")));
 
-    ItemDB::setStatsList(stats);
+    StatDb::setStatsList(stats);
 }
 
 GeneralHandler::~GeneralHandler()
diff --git a/src/resources/db/itemdb.cpp b/src/resources/db/itemdb.cpp
index 0421d7d88..323412e08 100644
--- a/src/resources/db/itemdb.cpp
+++ b/src/resources/db/itemdb.cpp
@@ -37,6 +37,7 @@
 
 #include "resources/db/itemdbstat.h"
 #include "resources/db/itemfielddb.h"
+#include "resources/db/statdb.h"
 
 #include "net/serverfeatures.h"
 
@@ -77,13 +78,6 @@ static void loadOrderSprite(ItemInfo *const itemInfo,
 static int parseSpriteName(const std::string &name);
 static int parseDirectionName(const std::string &name);
 
-static std::vector<ItemDB::Stat> extraStats;
-
-void ItemDB::setStatsList(const std::vector<ItemDB::Stat> &stats)
-{
-    extraStats = stats;
-}
-
 static ItemDbTypeT itemTypeFromString(const std::string &name)
 {
     const size_t sz = sizeof(itemTypeMap) / sizeof(itemTypeMap[0]);
@@ -519,6 +513,7 @@ void ItemDB::loadXmlFile(const std::string &fileName,
         std::string effect;
         readFields(effect, node, requiredFields);
         readFields(effect, node, addFields);
+        const std::vector<Stat> &extraStats = StatDb::getExtraStats();
         FOR_EACH (std::vector<Stat>::const_iterator, it, extraStats)
         {
             std::string value = XML::getProperty(
diff --git a/src/resources/db/itemdb.h b/src/resources/db/itemdb.h
index cc94145ab..3a992b90c 100644
--- a/src/resources/db/itemdb.h
+++ b/src/resources/db/itemdb.h
@@ -33,11 +33,6 @@
 
 class ItemInfo;
 
-namespace ItemDB
-{
-    struct Stat;
-}
-
 /**
  * Item information database.
  */
@@ -77,8 +72,6 @@ namespace ItemDB
 #endif
 
     int getTagId(const std::string &tagName) A_WARN_UNUSED;
-
-    void setStatsList(const std::vector<Stat> &stats);
 }  // namespace ItemDB
 
 #endif  // RESOURCES_DB_ITEMDB_H
diff --git a/src/resources/db/statdb.cpp b/src/resources/db/statdb.cpp
new file mode 100644
index 000000000..2fc2d592c
--- /dev/null
+++ b/src/resources/db/statdb.cpp
@@ -0,0 +1,97 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2016  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus 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 "resources/db/statdb.h"
+
+#include "configuration.h"
+
+#include "utils/checkutils.h"
+#include "utils/dtor.h"
+
+#include "resources/beingcommon.h"
+
+#include "resources/item/itemfieldtype.h"
+
+#include "debug.h"
+
+namespace
+{
+    bool mLoaded = false;
+    static std::vector<ItemDB::Stat> extraStats;
+}  // namespace
+
+void StatDb::setStatsList(const std::vector<ItemDB::Stat> &stats)
+{
+    extraStats = stats;
+}
+
+const std::vector<ItemDB::Stat> &StatDb::getExtraStats()
+{
+    return extraStats;
+}
+
+void StatDb::load()
+{
+    if (mLoaded)
+        unload();
+
+    logger->log1("Initializing stat database...");
+
+    loadXmlFile(paths.getStringValue("statFile"), SkipError_false);
+    loadXmlFile(paths.getStringValue("statPatchFile"), SkipError_true);
+    loadXmlDir("statPatchDir", loadXmlFile);
+    mLoaded = true;
+}
+
+void StatDb::loadXmlFile(const std::string &fileName,
+                              const SkipError skipError)
+{
+    XML::Document doc(fileName,
+        UseResman_true,
+        skipError);
+    const XmlNodePtrConst rootNode = doc.rootNode();
+
+    if (!rootNode || !xmlNameEqual(rootNode, "stats"))
+    {
+        logger->log("StatDb: Error while loading %s!",
+            fileName.c_str());
+        return;
+    }
+
+    for_each_xml_child_node(node, rootNode)
+    {
+        if (xmlNameEqual(node, "include"))
+        {
+            const std::string name = XML::getProperty(node, "name", "");
+            if (!name.empty())
+                loadXmlFile(name, skipError);
+            continue;
+        }
+
+
+    }
+}
+
+void StatDb::unload()
+{
+    logger->log1("Unloading stat database...");
+
+    mLoaded = false;
+}
diff --git a/src/resources/db/statdb.h b/src/resources/db/statdb.h
new file mode 100644
index 000000000..860235439
--- /dev/null
+++ b/src/resources/db/statdb.h
@@ -0,0 +1,47 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2016  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus 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/>.
+ */
+
+#ifndef RESOURCES_DB_STATDB_H
+#define RESOURCES_DB_STATDB_H
+
+#include "enums/simpletypes/skiperror.h"
+
+#include "resources/db/itemdbstat.h"
+
+#include <string>
+#include <vector>
+
+#include "localconsts.h"
+
+namespace StatDb
+{
+    void load();
+
+    void unload();
+
+    void loadXmlFile(const std::string &fileName,
+                     const SkipError skipError);
+
+    void setStatsList(const std::vector<ItemDB::Stat> &stats);
+
+    const std::vector<ItemDB::Stat> &getExtraStats();
+}  // namespace StatDb
+
+#endif  // RESOURCES_DB_STATDB_H
-- 
cgit v1.2.3-70-g09d2