diff options
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/client.cpp | 3 | ||||
-rw-r--r-- | src/gui/charcreatedialog.cpp | 7 | ||||
-rw-r--r-- | src/net/tmwa/charserverhandler.cpp | 28 | ||||
-rw-r--r-- | src/net/tmwa/charserverhandler.h | 11 | ||||
-rw-r--r-- | src/resources/chardb.cpp | 132 | ||||
-rw-r--r-- | src/resources/chardb.h | 48 |
7 files changed, 218 insertions, 13 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 32ac5426..946f4ba6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -369,6 +369,8 @@ SET(SRCS resources/attributes.h resources/beinginfo.cpp resources/beinginfo.h + resources/chardb.cpp + resources/chardb.h resources/dye.cpp resources/dye.h resources/emotedb.cpp diff --git a/src/client.cpp b/src/client.cpp index 1b413a7f..e6ab9191 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -64,6 +64,7 @@ #include "net/net.h" #include "net/worldinfo.h" +#include "resources/chardb.h" #include "resources/hairdb.h" #include "resources/emotedb.h" #include "resources/image.h" @@ -451,6 +452,7 @@ Client::~Client() SDL_RemoveTimer(mSecondsCounterId); // Unload XML databases + CharDB::unload(); hairDB.unload(); EmoteDB::unload(); delete itemDb; @@ -762,6 +764,7 @@ int Client::exec() Event::trigger(Event::ClientChannel, Event::LoadingDatabases); // Load XML databases + CharDB::load(); hairDB.load(); switch (Net::getNetworkType()) { diff --git a/src/gui/charcreatedialog.cpp b/src/gui/charcreatedialog.cpp index 8fee148b..a3c03a31 100644 --- a/src/gui/charcreatedialog.cpp +++ b/src/gui/charcreatedialog.cpp @@ -41,6 +41,7 @@ #include "net/charhandler.h" #include "net/net.h" +#include "resources/chardb.h" #include "resources/hairdb.h" #include "utils/gettext.h" @@ -56,6 +57,10 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot): mPlayer = new Being(0, ActorSprite::PLAYER, 0, NULL); mPlayer->setGender(GENDER_MALE); + const std::vector<int> &items = CharDB::getDefaultItems(); + for (size_t i = 0; i < items.size(); ++i) + mPlayer->setSprite(i + 1, items.at(i)); + mHairStylesIds = hairDB.getHairStyleIds( Net::getCharHandler()->getCharCreateMaxHairStyleId()); mHairStyleId = rand() * mHairStylesIds.size() / RAND_MAX; @@ -196,7 +201,9 @@ void CharCreateDialog::action(const gcn::ActionEvent &event) } } else if (event.getId() == "cancel") + { scheduleDelete(); + } else if (event.getId() == "nextcolor") { ++mHairColorId; diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index cc242951..7c5f5c88 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -39,6 +39,7 @@ #include "net/tmwa/protocol.h" #include "resources/attributes.h" +#include "resources/chardb.h" #include "resources/hairdb.h" #include "utils/dtor.h" @@ -279,10 +280,17 @@ void CharServerHandler::setCharCreateDialog(CharCreateDialog *window) const Token &token = static_cast<LoginHandler*>(Net::getLoginHandler())->getToken(); - mCharCreateDialog->setAttributes(attributes, - Attributes::getCreationPoints(), - Attributes::getAttributeMinimum(), - Attributes::getAttributeMaximum()); + unsigned minStat = CharDB::getMinStat(); + if (minStat == 0) + minStat = Attributes::getAttributeMinimum(); + unsigned maxStat = CharDB::getMaxStat(); + if (maxStat == 0) + maxStat = Attributes::getAttributeMaximum(); + unsigned sumStat = CharDB::getSumStat(); + if (sumStat == 0) + sumStat = Attributes::getCreationPoints(); + + mCharCreateDialog->setAttributes(attributes, sumStat, minStat, maxStat); mCharCreateDialog->setFixedGender(true, token.sex); } @@ -346,6 +354,18 @@ unsigned int CharServerHandler::maxSprite() const return SPRITE_VECTOREND; } +int CharServerHandler::getCharCreateMaxHairColorId() const +{ + const int max = CharDB::getMaxHairColor(); + return max ? max : 11; // default maximum +} + +int CharServerHandler::getCharCreateMaxHairStyleId() const +{ + const int max = CharDB::getMaxHairStyle(); + return max ? max : 19; // default maximum +} + void CharServerHandler::connect() { const Token &token = diff --git a/src/net/tmwa/charserverhandler.h b/src/net/tmwa/charserverhandler.h index c9f44e0f..7e4fc2d9 100644 --- a/src/net/tmwa/charserverhandler.h +++ b/src/net/tmwa/charserverhandler.h @@ -69,15 +69,8 @@ class CharServerHandler : public MessageHandler, public Net::CharHandler unsigned int maxSprite() const; - // Must be < 12 at character creation time, but can be higher - // after that. - int getCharCreateMaxHairColorId() const - { return 11; } - - // Must be < 20 at character creation time, but can be higher - // after that. - int getCharCreateMaxHairStyleId() const - { return 19; } + int getCharCreateMaxHairColorId() const; + int getCharCreateMaxHairStyleId() const; void connect(); diff --git a/src/resources/chardb.cpp b/src/resources/chardb.cpp new file mode 100644 index 00000000..40ecd999 --- /dev/null +++ b/src/resources/chardb.cpp @@ -0,0 +1,132 @@ +/* + * Character creation settings + * Copyright (C) 2011-2013 The ManaPlus Developers + * Copyright (C) 2013 The Mana 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/chardb.h" + +#include "log.h" + +#include "utils/xml.h" + +namespace +{ + bool mLoaded = false; + unsigned mMinHairColor = 0; + unsigned mMaxHairColor = 0; + unsigned mMinHairStyle = 0; + unsigned mMaxHairStyle = 0; + unsigned mMinStat = 0; + unsigned mMaxStat = 0; + unsigned mSumStat = 0; + std::vector<int> mDefaultItems; +} + +static void loadMinMax(xmlNodePtr node, unsigned *min, unsigned *max) +{ + *min = XML::getProperty(node, "min", 1); + *max = XML::getProperty(node, "max", 10); +} + +void CharDB::load() +{ + if (mLoaded) + unload(); + + XML::Document doc("charcreation.xml"); + xmlNodePtr root = doc.rootNode(); + + if (!root || !xmlStrEqual(root->name, BAD_CAST "chars")) + { + logger->log("CharDB: Failed to parse charcreation.xml."); + return; + } + + for_each_xml_child_node(node, root) + { + if (xmlStrEqual(node->name, BAD_CAST "haircolor")) + { + loadMinMax(node, &mMinHairColor, &mMaxHairColor); + } + else if (xmlStrEqual(node->name, BAD_CAST "hairstyle")) + { + loadMinMax(node, &mMinHairStyle, &mMaxHairStyle); + } + else if (xmlStrEqual(node->name, BAD_CAST "stat")) + { + loadMinMax(node, &mMinStat, &mMaxStat); + mSumStat = XML::getProperty(node, "sum", 0); + } + else if (xmlStrEqual(node->name, BAD_CAST "item")) + { + const int id = XML::getProperty(node, "id", 0); + if (id > 0) + mDefaultItems.push_back(id); + } + } + + mLoaded = true; +} + +void CharDB::unload() +{ + logger->log("Unloading chars database..."); + + mLoaded = false; +} + +unsigned CharDB::getMinHairColor() +{ + return mMinHairColor; +} + +unsigned CharDB::getMaxHairColor() +{ + return mMaxHairColor; +} + +unsigned CharDB::getMinHairStyle() +{ + return mMinHairStyle; +} + +unsigned CharDB::getMaxHairStyle() +{ + return mMaxHairStyle; +} + +unsigned CharDB::getMinStat() +{ + return mMinStat; +} + +unsigned CharDB::getMaxStat() +{ + return mMaxStat; +} + +unsigned CharDB::getSumStat() +{ + return mSumStat; +} + +const std::vector<int> &CharDB::getDefaultItems() +{ + return mDefaultItems; +} diff --git a/src/resources/chardb.h b/src/resources/chardb.h new file mode 100644 index 00000000..10530b26 --- /dev/null +++ b/src/resources/chardb.h @@ -0,0 +1,48 @@ +/* + * Character creation settings + * Copyright (C) 2011-2013 The ManaPlus Developers + * Copyright (C) 2013 The Mana 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_CHARDB_H +#define RESOURCES_CHARDB_H + +#include <vector> + +/** + * Character creation settings. + */ +namespace CharDB +{ + void load(); + void unload(); + + unsigned getMinHairColor(); + unsigned getMaxHairColor(); + + unsigned getMinHairStyle(); + unsigned getMaxHairStyle(); + + unsigned getMinStat(); + unsigned getMaxStat(); + unsigned getSumStat(); + + const std::vector<int> &getDefaultItems(); +} + +#endif // RESOURCES_CHARDB_H |