From b42dbb1ac4b05fc137ca3f18b4af43905ce5bcf0 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 26 Oct 2015 18:50:11 +0300 Subject: Add basic npc dialog db loading. --- src/CMakeLists.txt | 4 ++ src/Makefile.am | 4 ++ src/client.cpp | 3 + src/defaults.cpp | 3 + src/resources/db/npcdialogdb.cpp | 142 +++++++++++++++++++++++++++++++++++++++ src/resources/db/npcdialogdb.h | 54 +++++++++++++++ src/resources/npcbuttoninfo.h | 44 ++++++++++++ src/resources/npcdialoginfo.h | 42 ++++++++++++ 8 files changed, 296 insertions(+) create mode 100644 src/resources/db/npcdialogdb.cpp create mode 100644 src/resources/db/npcdialogdb.h create mode 100644 src/resources/npcbuttoninfo.h create mode 100644 src/resources/npcdialoginfo.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8e303516d..016c59f6f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -672,12 +672,16 @@ SET(SRCS resources/mstack.h resources/notificationinfo.h resources/notifications.h + resources/npcbuttoninfo.h + resources/npcdialoginfo.h enums/resources/notifyflags.h enums/resources/notifytypes.h resources/db/monsterdb.cpp resources/db/monsterdb.h resources/db/npcdb.cpp resources/db/npcdb.h + resources/db/npcdialogdb.cpp + resources/db/npcdialogdb.h resources/openglimagehelper.cpp resources/openglimagehelper.h resources/questeffect.h diff --git a/src/Makefile.am b/src/Makefile.am index ee6f870cd..2d583f5b3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -337,6 +337,8 @@ SRC += events/actionevent.h \ resources/mstack.h \ resources/notificationinfo.h \ resources/notifications.h \ + resources/npcbuttoninfo.h \ + resources/npcdialoginfo.h \ enums/resources/notifyflags.h \ enums/resources/notifytypes.h \ resources/imagerect.h \ @@ -1079,6 +1081,8 @@ manaplus_SOURCES += main.cpp \ resources/db/monsterdb.h \ resources/db/npcdb.cpp \ resources/db/npcdb.h \ + resources/db/npcdialogdb.cpp \ + resources/db/npcdialogdb.h \ resources/db/palettedb.cpp \ resources/db/palettedb.h \ resources/db/petdb.cpp \ diff --git a/src/client.cpp b/src/client.cpp index cf4d236fe..82099adc4 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -113,6 +113,7 @@ #include "resources/db/moddb.h" #include "resources/db/monsterdb.h" #include "resources/db/npcdb.h" +#include "resources/db/npcdialogdb.h" #include "resources/db/palettedb.h" #include "resources/db/petdb.h" #include "resources/db/weaponsdb.h" @@ -563,6 +564,7 @@ void Client::gameClear() HomunculusDB::unload(); MonsterDB::unload(); NPCDB::unload(); + NpcDialogDB::unload(); AvatarDB::unload(); BadgesDB::unload(); WeaponsDB::unload(); @@ -1254,6 +1256,7 @@ int Client::gameExec() BadgesDB::load(); WeaponsDB::load(); NPCDB::load(); + NpcDialogDB::load(); PETDB::load(); HorseDB::load(); EmoteDB::load(); diff --git a/src/defaults.cpp b/src/defaults.cpp index 4e7c518a1..a5d39d8fa 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -594,6 +594,9 @@ DefaultsData* getPathsDefaults() AddDEF("mapsFile", "maps.xml"); AddDEF("mapsPatchFile", "maps_patch.xml"); AddDEF("mapsPatchDir", "maps.d"); + AddDEF("npcDialogsFile", "npcdialogs.xml"); + AddDEF("npcDialogsPatchFile", "npcdialogs_patch.xml"); + AddDEF("npcDialogsPatchDir", "npcdialogs.d"); AddDEF("deadMessagesFile", "deadmessages.xml"); AddDEF("deadMessagesPatchFile", "deadmessages_patch.xml"); AddDEF("deadMessagesPatchDir", "deadmessages.d"); diff --git a/src/resources/db/npcdialogdb.cpp b/src/resources/db/npcdialogdb.cpp new file mode 100644 index 000000000..79918307a --- /dev/null +++ b/src/resources/db/npcdialogdb.cpp @@ -0,0 +1,142 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 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 . + */ + +#include "resources/db/npcdialogdb.h" + +#include "configuration.h" +#include "logger.h" + +#include "resources/beingcommon.h" + +#include "utils/dtor.h" + +#include "debug.h" + +namespace +{ + bool mLoaded = false; + NpcDialogDB::Dialogs mDialogs; +} + +void NpcDialogDB::load() +{ + if (mLoaded) + unload(); + + logger->log1("Loading npcdialog database..."); + loadXmlFile(paths.getStringValue("npcDialogsFile")); + loadXmlFile(paths.getStringValue("npcDialogsPatchFile")); + loadXmlDir("npcDialogsPatchDir", loadXmlFile); + + mLoaded = true; +} + +static void loadNpcDialog(NpcDialogInfo *const dialog, + const XmlNodePtrConst node) +{ + for_each_xml_child_node(childNode, node) + { + if (xmlNameEqual(childNode, "button")) + { + const std::string name = XML::getProperty(childNode, "name", ""); + if (name.empty()) + continue; + + const std::string value = XML::getProperty(childNode, "value", ""); + if (value.empty()) + continue; + + NpcButtonInfo *const button = new NpcButtonInfo; + button->x = XML::getIntProperty( + childNode, "x", 0, 0, 10000); + button->y = XML::getIntProperty( + childNode, "y", 0, 0, 10000); + button->name = name; + button->value = value; + dialog->buttons.push_back(button); + } + } +} + +void NpcDialogDB::loadXmlFile(const std::string &fileName) +{ + XML::Document *const doc = new XML::Document(fileName, + UseResman_true, + SkipError_false); + + const XmlNodePtrConst root = doc->rootNode(); + if (!root) + { + delete doc; + return; + } + + for_each_xml_child_node(node, root) + { + if (xmlNameEqual(node, "dialog")) + { + const std::string name = XML::getProperty(node, "name", ""); + if (name.empty()) + continue; + + deleteDialog(name); + NpcDialogInfo *const dialog = new NpcDialogInfo; + dialog->name = name; + mDialogs[name] = dialog; + loadNpcDialog(dialog, node); + } + else if (xmlNameEqual(node, "include")) + { + const std::string name = XML::getProperty(node, "name", ""); + if (!name.empty()) + loadXmlFile(name); + continue; + } + } + + delete doc; +} + +void NpcDialogDB::deleteDialog(const std::string &name) +{ + DialogsIter it = mDialogs.find(name); + if (it == mDialogs.end()) + return; + + NpcDialogInfo *dialog = (*it).second; + delete_all(dialog->buttons); + mDialogs.erase(it); + delete dialog; +} + +void NpcDialogDB::unload() +{ + logger->log1("Unloading npcdialog database..."); + + FOR_EACH(DialogsIter, it, mDialogs) + { + NpcDialogInfo *dialog = (*it).second; + delete_all(dialog->buttons); + delete dialog; + } + mDialogs.clear(); + + mLoaded = false; +} diff --git a/src/resources/db/npcdialogdb.h b/src/resources/db/npcdialogdb.h new file mode 100644 index 000000000..8b2caac65 --- /dev/null +++ b/src/resources/db/npcdialogdb.h @@ -0,0 +1,54 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 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 . + */ + +#ifndef RESOURCES_DB_NPCDIALOGDB_H +#define RESOURCES_DB_NPCDIALOGDB_H + +#include "resources/npcdialoginfo.h" + +#include + +#include "localconsts.h" + +/** + * Color information database. + */ +namespace NpcDialogDB +{ + /** + * Loads the map remap data from maps\remap.xml. + */ + void load(); + + void loadXmlFile(const std::string &fileName); + + /** + * Clear the remap data + */ + void unload(); + + void deleteDialog(const std::string &name); + + typedef std::map Dialogs; + typedef Dialogs::iterator DialogsIter; + +} // namespace NpcDialogDB + +#endif // RESOURCES_DB_NPCDIALOGDB_H diff --git a/src/resources/npcbuttoninfo.h b/src/resources/npcbuttoninfo.h new file mode 100644 index 000000000..19de87891 --- /dev/null +++ b/src/resources/npcbuttoninfo.h @@ -0,0 +1,44 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 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 . + */ + +#ifndef RESOURCES_NPCBUTTONINFO_H +#define RESOURCES_NPCBUTTONINFO_H + +#include + +#include "localconsts.h" + +struct NpcButtonInfo final +{ + NpcButtonInfo() : + name(), + value(), + x(0), + y(0) + { + } + + std::string name; + std::string value; + int x; + int y; +}; + +#endif // RESOURCES_NPCBUTTONINFO_H diff --git a/src/resources/npcdialoginfo.h b/src/resources/npcdialoginfo.h new file mode 100644 index 000000000..c1c7b8c1a --- /dev/null +++ b/src/resources/npcdialoginfo.h @@ -0,0 +1,42 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 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 . + */ + +#ifndef RESOURCES_NPCDIALOGINFO_H +#define RESOURCES_NPCDIALOGINFO_H + +#include "resources/npcbuttoninfo.h" + +#include "utils/stringvector.h" + +#include "localconsts.h" + +struct NpcDialogInfo final +{ + NpcDialogInfo() : + buttons(), + name() + { + } + + std::vector buttons; + std::string name; +}; + +#endif // RESOURCES_NPCDIALOGINFO_H -- cgit v1.2.3-60-g2f50