From d0b6b3d1c96e437d12410703a8e530decd0b028f Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Thu, 27 Jul 2006 17:20:22 +0000 Subject: First step toward a restructured class hierarchy for world actors: add MovingObject and Player classes. --- src/account.cpp | 62 +++------ src/account.h | 51 ++----- src/accounthandler.cpp | 99 +++++-------- src/being.cpp | 300 ++-------------------------------------- src/being.h | 277 ++++++++++++++++--------------------- src/chatchannelmanager.cpp | 4 +- src/dal/dalexcept.h | 5 - src/dal/dataprovider.cpp | 4 - src/dal/dataprovider.h | 6 - src/dal/dataproviderfactory.cpp | 4 - src/dal/dataproviderfactory.h | 5 - src/dal/mysqldataprovider.cpp | 3 - src/dal/mysqldataprovider.h | 5 - src/dal/pqdataprovider.cpp | 4 - src/dal/pqdataprovider.h | 5 - src/dal/recordset.cpp | 5 - src/dal/recordset.h | 4 - src/dal/sqlitedataprovider.cpp | 3 - src/dal/sqlitedataprovider.h | 5 - src/dalstorage.cpp | 112 ++++++--------- src/dalstorage.h | 8 -- src/gamehandler.cpp | 28 ++-- src/gamehandler.h | 6 +- src/main.cpp | 10 +- src/map.cpp | 5 - src/map.h | 6 - src/mapmanager.cpp | 7 - src/mapmanager.h | 6 +- src/mapreader.cpp | 6 - src/mapreader.h | 6 +- src/object.cpp | 129 ----------------- src/object.h | 129 +++++++---------- src/state.cpp | 118 +++++++--------- src/state.h | 30 ++-- src/storage.cpp | 7 - src/storage.h | 11 +- src/utils/cipher.cpp | 3 - src/utils/cipher.h | 5 - src/utils/countedptr.h | 22 +-- src/utils/logger.cpp | 4 - src/utils/logger.h | 17 +-- src/utils/singleton.h | 5 - src/utils/stringfilter.cpp | 3 - src/utils/stringfilter.h | 5 +- 44 files changed, 396 insertions(+), 1143 deletions(-) (limited to 'src') diff --git a/src/account.cpp b/src/account.cpp index b5a7903b..11a1232a 100644 --- a/src/account.cpp +++ b/src/account.cpp @@ -24,10 +24,6 @@ #include "utils/functors.h" -namespace tmwserv -{ - - /** * Constructor with initial account info. */ @@ -50,7 +46,7 @@ Account::Account(const std::string& name, Account::Account(const std::string& name, const std::string& password, const std::string& email, - const Beings& characters) + const Players& characters) : mName(name), mPassword(password), mEmail(email), @@ -64,8 +60,7 @@ Account::Account(const std::string& name, /** * Destructor. */ -Account::~Account(void) - throw() +Account::~Account() { // mCharacters is a list of smart pointers which will take care about // deallocating the memory so nothing to deallocate here :) @@ -157,7 +152,7 @@ Account::getLevel(void) const * Set the characters. */ void -Account::setCharacters(const Beings& characters) +Account::setCharacters(const Players& characters) { mCharacters = characters; } @@ -167,7 +162,7 @@ Account::setCharacters(const Beings& characters) * Add a new character. */ void -Account::addCharacter(BeingPtr character) +Account::addCharacter(PlayerPtr character) { if (character.get() != 0) { mCharacters.push_back(character); @@ -177,32 +172,23 @@ Account::addCharacter(BeingPtr character) /** * Remove a character. */ -bool -Account::delCharacter(std::string name) +bool Account::delCharacter(std::string const &name) { - Beings::iterator it = - std::find_if(mCharacters.begin(), - mCharacters.end(), - std::bind2nd(obj_name_is(), name) - ); + Players::iterator + end = mCharacters.end(), + it = std::find_if(mCharacters.begin(), end, + std::bind2nd(obj_name_is(), name)); - if (it != mCharacters.end()) { - // Exists, delete it. - mCharacters.erase(it++); - return true; - } - else - { - return false; - } + if (it == end) return false; + mCharacters.erase(it); + return true; } /** * Get all the characters. */ -Beings& -Account::getCharacters(void) +Players &Account::getCharacters() { return mCharacters; } @@ -211,21 +197,13 @@ Account::getCharacters(void) /** * Get a character by name. */ -Being* -Account::getCharacter(const std::string& name) +PlayerPtr Account::getCharacter(const std::string& name) { - Beings::iterator it = - std::find_if(mCharacters.begin(), - mCharacters.end(), - std::bind2nd(obj_name_is(), name) - ); + Players::iterator + end = mCharacters.end(), + it = std::find_if(mCharacters.begin(), end, + std::bind2nd(obj_name_is(), name)); - if (it != mCharacters.end()) { - return (*it).get(); - } - - return 0; + if (it != end) return *it; + return PlayerPtr(); } - - -} // namespace tmwserv diff --git a/src/account.h b/src/account.h index 2d9da17a..b1ba59d0 100644 --- a/src/account.h +++ b/src/account.h @@ -30,10 +30,6 @@ #include "being.h" -namespace tmwserv -{ - - /** * Notes: * - change from the previous implementation: this class does not encrypt @@ -76,14 +72,13 @@ class Account Account(const std::string& name, const std::string& password, const std::string& email, - const Beings& characters); + const Players& characters); /** * Destructor. */ - ~Account(void) - throw(); + ~Account(); /** @@ -101,7 +96,7 @@ class Account * @return the user name. */ const std::string& - getName(void) const; + getName() const; /** @@ -155,7 +150,7 @@ class Account * @return the account level. */ AccountLevels - getLevel(void) const; + getLevel() const; /** @@ -164,7 +159,7 @@ class Account * @param characters a list of characters. */ void - setCharacters(const Beings& characters); + setCharacters(const Players& characters); /** @@ -173,7 +168,7 @@ class Account * @param character the new character. */ void - addCharacter(BeingPtr character); + addCharacter(PlayerPtr character); /** * Remove a character. @@ -181,7 +176,7 @@ class Account * @param name The character's name to delete. */ bool - delCharacter(std::string name); + delCharacter(std::string const &name); /** @@ -189,44 +184,29 @@ class Account * * @return all the characters. */ - Beings& - getCharacters(void); + Players& + getCharacters(); /** * Get a character by name. * * @return the character if found, NULL otherwise. */ - Being* + PlayerPtr getCharacter(const std::string& name); private: - /** - * Default constructor. - */ - Account(void) - throw(); - - - /** - * Copy constructor. - */ - Account(const Account& rhs); - - - /** - * Assignment operator. - */ - Account& - operator=(const Account& rhs); + Account(); + Account(Account const &rhs); + Account &operator=(Account const &rhs); private: std::string mName; /**< user name */ std::string mPassword; /**< user password (encrypted) */ std::string mEmail; /**< user email address */ - Beings mCharacters; /**< player data */ + Players mCharacters; /**< player data */ AccountLevels mLevel; /**< account level */ }; @@ -237,7 +217,4 @@ class Account typedef utils::CountedPtr AccountPtr; -} // namespace tmwserv - - #endif // _TMWSERV_ACCOUNT_H_ diff --git a/src/accounthandler.cpp b/src/accounthandler.cpp index 885fd7ff..a07fc2a7 100644 --- a/src/accounthandler.cpp +++ b/src/accounthandler.cpp @@ -37,11 +37,6 @@ #include "utils/logger.h" #include "utils/stringfilter.h" -using tmwserv::Account; -using tmwserv::AccountPtr; -using tmwserv::BeingPtr; -using tmwserv::Storage; - class AccountClient: public NetComputer { public: @@ -73,7 +68,7 @@ class AccountClient: public NetComputer /** * Set the selected character associated with connection. */ - void setCharacter(BeingPtr ch); + void setCharacter(PlayerPtr ch); /** * Deselect the character associated with connection. @@ -83,14 +78,14 @@ class AccountClient: public NetComputer /** * Get character associated with the connection */ - BeingPtr getCharacter() { return mCharacterPtr; } + PlayerPtr getCharacter() { return mCharacterPtr; } private: /** Account associated with connection */ AccountPtr mAccountPtr; /** Selected character */ - BeingPtr mCharacterPtr; + PlayerPtr mCharacterPtr; }; AccountClient::AccountClient(AccountHandler *handler, ENetPeer *peer): @@ -112,7 +107,7 @@ void AccountClient::setAccount(AccountPtr acc) mAccountPtr = acc; } -void AccountClient::setCharacter(BeingPtr ch) +void AccountClient::setCharacter(PlayerPtr ch) { unsetCharacter(); mCharacterPtr = ch; @@ -127,7 +122,7 @@ void AccountClient::unsetAccount() void AccountClient::unsetCharacter() { if (mCharacterPtr.get() == NULL) return; - mCharacterPtr = BeingPtr(NULL); + mCharacterPtr = PlayerPtr(NULL); } NetComputer *AccountHandler::computerConnected(ENetPeer *peer) @@ -202,7 +197,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) } // see if the account exists - tmwserv::AccountPtr acc = store.getAccount(username); + AccountPtr acc = store.getAccount(username); if (!acc.get() || acc->getPassword() != password) { // account doesn't exist -- send error to client @@ -220,7 +215,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) result.writeByte(ERRMSG_OK); // Return information about available characters - tmwserv::Beings &chars = computer.getAccount()->getCharacters(); + Players &chars = computer.getAccount()->getCharacters(); result.writeByte(chars.size()); LOG_INFO(username << "'s account has " << chars.size() << " character(s).", 1); @@ -282,7 +277,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) LOG_INFO(username << " is trying to register.", 1); // see if the account exists - tmwserv::AccountPtr accPtr = store.getAccount(username); + AccountPtr accPtr = store.getAccount(username); if ( accPtr.get() ) // Account already exists. { result.writeByte(REGISTER_EXISTS_USERNAME); @@ -349,7 +344,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) } // see if the account exists - tmwserv::AccountPtr accPtr = store.getAccount(username); + AccountPtr accPtr = store.getAccount(username); if (!accPtr.get() || accPtr->getPassword() != password) { LOG_INFO("Account does not exist of bad password for " << username << ".", 1); @@ -480,7 +475,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) } // A player shouldn't have more than 3 characters. - tmwserv::Beings &chars = computer.getAccount()->getCharacters(); + Players &chars = computer.getAccount()->getCharacters(); if (chars.size() >= MAX_OF_CHARACTERS) { result.writeByte(CREATE_TOO_MUCH_CHARACTERS); @@ -543,20 +538,8 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) // LATER_ON: Add race, face and maybe special attributes. // Customization of player's stats... - std::vector rawStats; - rawStats.reserve(6); - // strength - rawStats.push_back((unsigned short)message.readShort()); - // agility - rawStats.push_back((unsigned short)message.readShort()); - // vitality - rawStats.push_back((unsigned short)message.readShort()); - // intelligence - rawStats.push_back((unsigned short)message.readShort()); - // dexterity - rawStats.push_back((unsigned short)message.readShort()); - // luck - rawStats.push_back((unsigned short)message.readShort()); + RawStatistics rawStats; + for (int i = 0; i < NB_RSTAT; ++i) rawStats.stats[i] = message.readShort(); // We see if the difference between the lowest stat and the highest isn't too // big. @@ -564,32 +547,16 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) unsigned short highestStat = 0; unsigned int totalStats = 0; bool validNonZeroRawStats = true; - for ( std::vector::iterator i = rawStats.begin(); i != rawStats.end();) + for (int i = 0; i < NB_RSTAT; ++i) { + unsigned short stat = rawStats.stats[i]; // For good total stat check. - totalStats = totalStats + *i; + totalStats = totalStats + stat; // For checking if all stats are at least > 0 - if (*i <= 0) validNonZeroRawStats = false; - if (lowestStat != 0) - { - if (lowestStat > *i) lowestStat = *i; - } - else - { - // We take the first value - lowestStat = *i; - } - if (highestStat != 0) - { - if (highestStat < *i) highestStat = *i; - } - else - { - // We take the first value - highestStat = *i; - } - ++i; + if (stat <= 0) validNonZeroRawStats = false; + if (lowestStat == 0 || lowestStat > stat) lowestStat = stat; + if (highestStat == 0 || highestStat < stat) highestStat = stat; } if ( totalStats > POINTS_TO_DISTRIBUTES_AT_LVL1 ) @@ -617,11 +584,14 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) break; } - // The reserve(6) method allows us to be sure that rawStats[5] will work. - tmwserv::RawStatistics stats = {rawStats[0], rawStats[1], rawStats[2], - rawStats[3], rawStats[4], rawStats[5]}; - tmwserv::BeingPtr newCharacter(new tmwserv::Being(name, gender, hairStyle, hairColor, - 1 /* level */, 0 /* Money */, stats)); + PlayerPtr newCharacter(new Player(name)); + for (int i = 0; i < NB_RSTAT; ++i) + newCharacter->setRawStat(i, rawStats.stats[i]); + newCharacter->setMoney(0); + newCharacter->setLevel(1); + newCharacter->setGender(gender); + newCharacter->setHairStyle(hairStyle); + newCharacter->setHairColor(hairColor); newCharacter->setMapId((int)config.getValue("defaultMap", 1)); newCharacter->setXY((int)config.getValue("startX", 0), (int)config.getValue("startY", 0)); @@ -648,7 +618,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) unsigned char charNum = message.readByte(); - tmwserv::Beings &chars = computer.getAccount()->getCharacters(); + Players &chars = computer.getAccount()->getCharacters(); // Character ID = 0 to Number of Characters - 1. if (charNum >= chars.size()) { // invalid char selection @@ -662,7 +632,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) // it. And SELECT_NO_MAPS error return value when the default map couldn't // be loaded in setCharacter(). Not implemented yet for tests purpose... computer.setCharacter(chars[charNum]); - tmwserv::BeingPtr selectedChar = computer.getCharacter(); + PlayerPtr selectedChar = computer.getCharacter(); result.writeByte(ERRMSG_OK); std::string mapName = store.getMapNameFromId(selectedChar->getMapId()); result.writeString(mapName); @@ -687,7 +657,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) unsigned char charNum = message.readByte(); - tmwserv::Beings &chars = computer.getAccount()->getCharacters(); + Players &chars = computer.getAccount()->getCharacters(); // Character ID = 0 to Number of Characters - 1. if (charNum >= chars.size()) { // invalid char selection @@ -729,7 +699,7 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) result.writeByte(ERRMSG_OK); // Return information about available characters - tmwserv::Beings &chars = computer.getAccount()->getCharacters(); + Players &chars = computer.getAccount()->getCharacters(); result.writeByte(chars.size()); LOG_INFO(computer.getAccount()->getName() << "'s account has " @@ -745,13 +715,8 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message) result.writeByte(chars[i]->getHairStyle()); result.writeByte(chars[i]->getHairColor()); result.writeByte(chars[i]->getLevel()); - result.writeShort(chars[i]->getMoney()); - result.writeShort(chars[i]->getStrength()); - result.writeShort(chars[i]->getAgility()); - result.writeShort(chars[i]->getVitality()); - result.writeShort(chars[i]->getIntelligence()); - result.writeShort(chars[i]->getDexterity()); - result.writeShort(chars[i]->getLuck()); + for (int j = 0; j < NB_RSTAT; ++j) + result.writeShort(chars[i]->getRawStat(j)); mapName = store.getMapNameFromId(chars[i]->getMapId()); result.writeString(mapName); result.writeShort(chars[i]->getX()); diff --git a/src/being.cpp b/src/being.cpp index 3138f4e1..c95136af 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -24,309 +24,40 @@ #include "being.h" -namespace tmwserv -{ - - PATH_NODE::PATH_NODE(unsigned short x, unsigned short y): x(x), y(y) { } -/** - * Constructor. - */ -Being::Being(const std::string& name, - const Genders gender, - const unsigned short hairStyle, - const unsigned short hairColor, - const unsigned short level, - const unsigned int money, - const RawStatistics& stats) - : mName(name), - mGender(gender), - mHairStyle(hairStyle), - mHairColor(hairColor), - mLevel(level), - mMoney(money), - mRawStats(stats) -{ - // NOOP -} - - -/** - * Destructor. - */ -Being::~Being(void) - throw() -{ - // NOOP -} - - -/** - * Get the name. - */ -const std::string& -Being::getName(void) const -{ - return mName; -} - - -/** - * Get the gender. - */ -Genders -Being::getGender(void) const -{ - return mGender; -} - - -/** - * Get the Hair Style. - */ -unsigned short -Being::getHairStyle(void) const -{ - return mHairStyle; -} - - -/** - * Get the Hair Color. - */ -unsigned short -Being::getHairColor(void) const -{ - return mHairColor; -} - - -/** - * Set the level. - */ -void -Being::setLevel(const unsigned short level) -{ - mLevel = level; -} - - -/** - * Get the level. - */ -unsigned short -Being::getLevel(void) const -{ - return mLevel; -} - - -/** - * Set the money. - */ -void -Being::setMoney(const unsigned int amount) -{ - mMoney = amount; -} - - -/** - * Get the amount of money. - */ -unsigned int -Being::getMoney(void) const -{ - return mMoney; -} - - -/** - * Set the strength. - */ -void -Being::setStrength(const unsigned short strength) -{ - mRawStats.strength = strength; - mNeedUpdate = true; -} - - -/** - * Get the strength. - */ -unsigned short -Being::getStrength(void) const -{ - return mRawStats.strength; -} - - -/** - * Set the agility. - */ -void -Being::setAgility(const unsigned short agility) -{ - mRawStats.agility = agility; - mNeedUpdate = true; -} - - -/** - * Get the agility. - */ -unsigned short -Being::getAgility(void) const -{ - return mRawStats.agility; -} - - -/** - * Set the vitality. - */ -void -Being::setVitality(const unsigned short vitality) -{ - mRawStats.vitality = vitality; - mNeedUpdate = true; -} - - -/** - * Get the vitality. - */ -unsigned short -Being::getVitality(void) const -{ - return mRawStats.vitality; -} - - -/** - * Set the intelligence. - */ -void -Being::setIntelligence(const unsigned short intelligence) -{ - mRawStats.intelligence = intelligence; - mNeedUpdate = true; -} - - -/** -* Get the intelligence. -* -* @return the intelligence. -*/ -unsigned short -Being::getIntelligence(void) const -{ - return mRawStats.intelligence; -} - - -/** - * Set the dexterity. - */ -void -Being::setDexterity(const unsigned short dexterity) -{ - mRawStats.dexterity = dexterity; - mNeedUpdate = true; -} - - -/** - * Get the dexterity. - */ -unsigned short -Being::getDexterity(void) const -{ - return mRawStats.dexterity; -} - - -/** - * Set the luck. - */ -void -Being::setLuck(const unsigned short luck) -{ - mRawStats.luck = luck; - mNeedUpdate = true; -} - - -/** - * Get the luck. - */ -unsigned short -Being::getLuck(void) const -{ - return mRawStats.luck; -} - - -/** - * Set the raw statistics. - */ -void -Being::setRawStatistics(const RawStatistics& stats) -{ - mRawStats = stats; - mNeedUpdate = true; -} - - -/** - * Get the raw statistics. - */ -RawStatistics& -Being::getRawStatistics(void) -{ - return mRawStats; -} - - /** * Update the internal status. */ -void -Being::update(void) +void Player::update() { // computed stats. - mStats.health = 20 + (20 * mRawStats.vitality); - mStats.attack = 10 + mRawStats.strength; - mStats.defense = 10 + mRawStats.strength; - mStats.magic = 10 + mRawStats.intelligence; - mStats.accuracy = 50 + mRawStats.dexterity; - mStats.speed = mRawStats.dexterity; + setStat(STAT_HEA, 20 + (20 * mRawStats.stats[STAT_VIT])); + setStat(STAT_ATT, 10 + mRawStats.stats[STAT_STR]); + setStat(STAT_DEF, 10 + mRawStats.stats[STAT_STR]); + setStat(STAT_MAG, 10 + mRawStats.stats[STAT_INT]); + setStat(STAT_ACC, 50 + mRawStats.stats[STAT_DEX]); + setStat(STAT_SPD, mRawStats.stats[STAT_DEX]); mNeedUpdate = false; } -void -Being::setInventory(const std::vector &inven) +void Player::setInventory(const std::vector &inven) { inventory = inven; } -bool -Being::addInventory(unsigned int itemId) +bool Player::addInventory(unsigned int itemId) { // If required weight could be tallied to see if player can pick up more. inventory.push_back(itemId); return true; } -bool -Being::delInventory(unsigned int itemId) +bool Player::delInventory(unsigned int itemId) { for (std::vector::iterator i = inventory.begin(); i != inventory.end(); i++) { @@ -338,8 +69,7 @@ Being::delInventory(unsigned int itemId) return false; } -bool -Being::hasItem(unsigned int itemId) +bool Player::hasItem(unsigned int itemId) { for (std::vector::iterator i = inventory.begin(); i != inventory.end(); i++) @@ -350,8 +80,7 @@ Being::hasItem(unsigned int itemId) return false; } -bool -Being::equip(unsigned int itemId, unsigned char slot) +bool Player::equip(unsigned int itemId, unsigned char slot) { // currently this is too simplistic and doesn't check enough // but until further functionality is implemented in the @@ -363,12 +92,9 @@ Being::equip(unsigned int itemId, unsigned char slot) return false; } -bool -Being::unequip(unsigned char slot) +bool Player::unequip(unsigned char slot) { // NOTE: 0 will be invalid item id (or we could use key/value pairs) equipment[slot] = 0; return true; } - -} // namespace tmwserv diff --git a/src/being.h b/src/being.h index 80b73012..f19df9c0 100644 --- a/src/being.h +++ b/src/being.h @@ -34,10 +34,6 @@ const unsigned int MAX_EQUIP_SLOTS = 5; /**< Maximum number of equipped slots */ -namespace tmwserv -{ - - struct PATH_NODE { /** * Constructor. @@ -48,225 +44,192 @@ struct PATH_NODE { }; /** - * Structure type for the raw statistics of a Being. + * Raw statistics of a Player + */ + +enum { STAT_STR = 0, STAT_AGI, STAT_VIT, STAT_INT, STAT_DEX, STAT_LUK, NB_RSTAT }; + +/** + * Structure types for the raw statistics of a Player */ + struct RawStatistics { - unsigned short strength; - unsigned short agility; - unsigned short vitality; - unsigned short intelligence; - unsigned short dexterity; - unsigned short luck; + unsigned short stats[NB_RSTAT]; }; +/* + * Computed statistics of a Being + */ + +enum { STAT_HEA = 0, STAT_ATT, STAT_DEF, STAT_MAG, STAT_ACC, STAT_SPD, NB_CSTAT }; + +/** + * Structure type for the computed statistics of a Being. + */ +struct Statistics +{ + unsigned short stats[NB_CSTAT]; +}; /** * Generic Being (living object). * Used for players & monsters (all animated objects). */ -class Being: public Object +class Being: public MovingObject { public: /** - * Constructor. - */ - Being(const std::string& name, - const Genders gender, - const unsigned short hairStyle, - const unsigned short hairColor, - const unsigned short level, - const unsigned int money, - const RawStatistics& stats); - - /** - * Destructor. - */ - ~Being(void) - throw(); - - /** - * Gets the name. - * - * @return the name. - */ - const std::string& - getName(void) const; - - /** - * Gets the hair Style. - * - * @return the Hair style value. - */ - unsigned short - getHairStyle(void) const; - - /** - * Gets the Hair Color. - * - * @return the Hair Color value. + * Proxy constructor. */ - unsigned short - getHairColor(void) const; + Being(int type) + : MovingObject(type) + {} /** - * Gets the gender. + * Sets a computed statistic. * - * @return the gender. + * @param numStat the statistic number. + * @param value the new value. */ - Genders - getGender(void) const; - + void setStat(int numStat, unsigned short value) + { mStats.stats[numStat] = value; } /** - * Sets the level. + * Gets a computed statistic. * - * @param level the new level. + * @param numStat the statistic number. + * @return the statistic value. */ - void - setLevel(const unsigned short level); + unsigned short getStat(int numStat) + { return mStats.stats[numStat]; } - /** - * Gets the level. - * - * @return the level. - */ - unsigned short - getLevel(void) const; + private: + Being(Being const &rhs); + Being &operator=(Being const &rhs); - /** - * Sets the money. - * - * @param amount the new amount. - */ - void - setMoney(const unsigned int amount); + Statistics mStats; /**< stats modifiers or computed stats */ +}; - /** - * Gets the amount of money. - * - * @return the amount of money. - */ - unsigned int - getMoney(void) const; +class Player: public Being +{ + public: - /** - * Sets the strength. - * - * @param strength the new strength. - */ - void - setStrength(const unsigned short strength); + Player(std::string const &name) + : Being(OBJECT_PLAYER), + mName(name) + {} /** - * Gets the strength. + * Gets the name. * - * @return the strength. + * @return the name. */ - unsigned short - getStrength(void) const; + std::string const &getName() const + { return mName; } /** - * Sets the agility. + * Sets the hair style. * - * @param agility the new agility. + * @param style the new hair style. */ - void - setAgility(const unsigned short agility); + void setHairStyle(unsigned char style) + { mHairStyle = style; } /** - * Gets the agility. + * Gets the hair style. * - * @return the agility. + * @return the hair style value. */ - unsigned short - getAgility(void) const; + unsigned char getHairStyle() const + { return mHairStyle; } /** - * Sets the vitality. + * Sets the hair color. * - * @param vitality the new vitality. + * @param color the new hair color. */ - void - setVitality(const unsigned short vitality); + void setHairColor(unsigned char color) + { mHairColor = color; } /** - * Gets the vitality. + * Gets the hair color. * - * @return the vitality. + * @return the hair color value. */ - unsigned short - getVitality(void) const; + unsigned char getHairColor() const + { return mHairColor; } /** - * Sets the intelligence. + * Sets the gender. * - * @param intelligence the new intelligence. + * @param gender the new gender. */ - void - setIntelligence(const unsigned short intelligence); + void setGender(Genders gender) + { mGender = gender; } /** - * Gets the intelligence. + * Gets the gender. * - * @return the intelligence. + * @return the gender. */ - unsigned short - getIntelligence(void) const; + Genders getGender() const + { return mGender; } /** - * Sets the dexterity. + * Sets the level. * - * @param dexterity the new dexterity. + * @param level the new level. */ - void - setDexterity(const unsigned short dexterity); + void setLevel(unsigned char level) + { mLevel = level; } /** - * Gets the dexterity. + * Gets the level. * - * @return the dexterity. + * @return the level. */ - unsigned short - getDexterity(void) const; + unsigned char getLevel() const + { return mLevel; } /** - * Sets the luck. + * Sets the money. * - * @param luck the new luck. + * @param amount the new amount. */ - void - setLuck(const unsigned short luck); + void setMoney(unsigned int amount) + { mMoney = amount; } /** - * Gets the luck. + * Gets the amount of money. * - * @return the luck. + * @return the amount of money. */ - unsigned short - getLuck(void) const; + unsigned int getMoney() const + { return mMoney; } /** - * Sets the raw statistics. + * Sets a raw statistic. * - * @param stats the new raw statistics. + * @param numStat the statistic number. + * @param value the new value. */ - void - setRawStatistics(const RawStatistics& stats); + void setRawStat(int numStat, unsigned short value) + { mRawStats.stats[numStat] = value; } /** - * Gets the raw statistics. + * Gets a raw statistic. * - * @return the raw statistics. + * @param numStat the statistic number. + * @return the statistic value. */ - RawStatistics& - getRawStatistics(void); + unsigned short getRawStat(int numStat) + { return mRawStats.stats[numStat]; } /** * Updates the internal status. */ - void - update(void); + void update(); /** * Sets inventory. @@ -315,43 +278,39 @@ class Being: public Object unequip(unsigned char slot); private: - /** - * Copy constructor. - */ - Being(const Being& rhs); - - /** - * Assignment operator. - */ - Being& - operator=(const Being& rhs); + Player(Player const &); + Player &operator=(Player const &); std::string mName; /**< name of the being */ Genders mGender; /**< gender of the being */ - unsigned short mHairStyle;/**< Hair Style of the being */ - unsigned short mHairColor;/**< Hair Color of the being */ - unsigned short mLevel; /**< level of the being */ + unsigned char mHairStyle;/**< Hair Style of the being */ + unsigned char mHairColor;/**< Hair Color of the being */ + unsigned char mLevel; /**< level of the being */ unsigned int mMoney; /**< wealth of the being */ RawStatistics mRawStats; /**< raw stats of the being */ std::vector inventory; /**< Player inventory */ unsigned int equipment[MAX_EQUIP_SLOTS]; /**< Equipped item ID's (from inventory) */ -}; - +}; /** * Type definition for a smart pointer to Being. */ typedef utils::CountedPtr BeingPtr; - /** * Type definition for a list of Beings. */ typedef std::vector Beings; +/** + * Type definition for a smart pointer to Player. + */ +typedef utils::CountedPtr PlayerPtr; -} // namespace tmwserv - +/** + * Type definition for a list of Players. + */ +typedef std::vector Players; #endif // _TMWSERV_BEING_H_ diff --git a/src/chatchannelmanager.cpp b/src/chatchannelmanager.cpp index 0d64c311..3f91f9ed 100644 --- a/src/chatchannelmanager.cpp +++ b/src/chatchannelmanager.cpp @@ -30,14 +30,14 @@ ChatChannelManager::ChatChannelManager() { //Load stored public chat channels from db - tmwserv::Storage &store = tmwserv::Storage::instance("tmw"); + Storage &store = Storage::instance("tmw"); mChatChannels = store.getChannelList(); } ChatChannelManager::~ChatChannelManager() { - tmwserv::Storage &store = tmwserv::Storage::instance("tmw"); + Storage &store = Storage::instance("tmw"); store.updateChannels(mChatChannels); mChatChannels.clear(); } diff --git a/src/dal/dalexcept.h b/src/dal/dalexcept.h index 6edf2938..e2d5b2b1 100644 --- a/src/dal/dalexcept.h +++ b/src/dal/dalexcept.h @@ -27,9 +27,6 @@ #include - -namespace tmwserv -{ namespace dal { @@ -191,7 +188,5 @@ class RsColumnHeadersNotSet: public std::exception } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_DAL_EXCEPT_H_ diff --git a/src/dal/dataprovider.cpp b/src/dal/dataprovider.cpp index 29e0e6cc..93de865c 100644 --- a/src/dal/dataprovider.cpp +++ b/src/dal/dataprovider.cpp @@ -23,9 +23,6 @@ #include "dataprovider.h" - -namespace tmwserv -{ namespace dal { @@ -78,4 +75,3 @@ DataProvider::getDbName(void) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/dataprovider.h b/src/dal/dataprovider.h index fe034873..07d29b4e 100644 --- a/src/dal/dataprovider.h +++ b/src/dal/dataprovider.h @@ -29,13 +29,9 @@ #include "recordset.h" - -namespace tmwserv -{ namespace dal { - /** * Enumeration type for the database backends. */ @@ -153,7 +149,5 @@ class DataProvider } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_DATA_PROVIDER_H_ diff --git a/src/dal/dataproviderfactory.cpp b/src/dal/dataproviderfactory.cpp index 74897d93..d9c144f4 100644 --- a/src/dal/dataproviderfactory.cpp +++ b/src/dal/dataproviderfactory.cpp @@ -33,9 +33,6 @@ #error "no database backend defined" #endif - -namespace tmwserv -{ namespace dal { @@ -80,4 +77,3 @@ DataProviderFactory::createDataProvider(void) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/dataproviderfactory.h b/src/dal/dataproviderfactory.h index 165113bd..89db1eb8 100644 --- a/src/dal/dataproviderfactory.h +++ b/src/dal/dataproviderfactory.h @@ -23,9 +23,6 @@ #ifndef _TMWSERV_DATA_PROVIDER_FACTORY_H_ #define _TMWSERV_DATA_PROVIDER_FACTORY_H_ - -namespace tmwserv -{ namespace dal { class DataProvider; @@ -79,7 +76,5 @@ class DataProviderFactory } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_DATA_PROVIDER_FACTORY_H_ diff --git a/src/dal/mysqldataprovider.cpp b/src/dal/mysqldataprovider.cpp index 69b4937e..85084dc8 100644 --- a/src/dal/mysqldataprovider.cpp +++ b/src/dal/mysqldataprovider.cpp @@ -24,8 +24,6 @@ #include "dalexcept.h" -namespace tmwserv -{ namespace dal { @@ -198,4 +196,3 @@ MySqlDataProvider::disconnect(void) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/mysqldataprovider.h b/src/dal/mysqldataprovider.h index 698c9fc5..f2466033 100644 --- a/src/dal/mysqldataprovider.h +++ b/src/dal/mysqldataprovider.h @@ -31,9 +31,6 @@ #include "dataprovider.h" - -namespace tmwserv -{ namespace dal { @@ -114,7 +111,5 @@ class MySqlDataProvider: public DataProvider } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_MYSQL_DATA_PROVIDER_H_ diff --git a/src/dal/pqdataprovider.cpp b/src/dal/pqdataprovider.cpp index 2a30ef9e..ee4f5e34 100644 --- a/src/dal/pqdataprovider.cpp +++ b/src/dal/pqdataprovider.cpp @@ -23,9 +23,6 @@ #include "pqdataprovider.h" - -namespace tmwserv -{ namespace dal { @@ -165,4 +162,3 @@ PqDataProvider::disconnect(void) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/pqdataprovider.h b/src/dal/pqdataprovider.h index 73d5c8d7..a3d6084f 100644 --- a/src/dal/pqdataprovider.h +++ b/src/dal/pqdataprovider.h @@ -30,9 +30,6 @@ #include "dataprovider.h" - -namespace tmwserv -{ namespace dal { @@ -113,7 +110,5 @@ class PqDataProvider: public DataProvider } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_PQDATAPROVIDER_H_ diff --git a/src/dal/recordset.cpp b/src/dal/recordset.cpp index d59447c7..6b2211ea 100644 --- a/src/dal/recordset.cpp +++ b/src/dal/recordset.cpp @@ -27,8 +27,6 @@ #include "dalexcept.h" -namespace tmwserv -{ namespace dal { @@ -210,8 +208,6 @@ RecordSet::operator()(const unsigned int row, std::ostream& operator<<(std::ostream& out, const RecordSet& rhs) { - using namespace tmwserv::dal; - // print the field names first. if (rhs.mHeaders.size() > 0) { out << "|"; @@ -244,4 +240,3 @@ operator<<(std::ostream& out, const RecordSet& rhs) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/recordset.h b/src/dal/recordset.h index 0300c926..761e7242 100644 --- a/src/dal/recordset.h +++ b/src/dal/recordset.h @@ -26,8 +26,6 @@ #include #include -namespace tmwserv -{ namespace dal { @@ -198,7 +196,5 @@ class RecordSet } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_RECORDSET_H_ diff --git a/src/dal/sqlitedataprovider.cpp b/src/dal/sqlitedataprovider.cpp index e0f67f55..5c5e692f 100644 --- a/src/dal/sqlitedataprovider.cpp +++ b/src/dal/sqlitedataprovider.cpp @@ -27,8 +27,6 @@ #include "dalexcept.h" -namespace tmwserv -{ namespace dal { @@ -199,4 +197,3 @@ SqLiteDataProvider::disconnect(void) } // namespace dal -} // namespace tmwserv diff --git a/src/dal/sqlitedataprovider.h b/src/dal/sqlitedataprovider.h index 60ac7b6e..b791025b 100644 --- a/src/dal/sqlitedataprovider.h +++ b/src/dal/sqlitedataprovider.h @@ -28,9 +28,6 @@ #include "dataprovider.h" - -namespace tmwserv -{ namespace dal { @@ -111,7 +108,5 @@ class SqLiteDataProvider: public DataProvider } // namespace dal -} // namespace tmwserv - #endif // _TMWSERV_SQLITE_DATA_PROVIDER_H_ diff --git a/src/dalstorage.cpp b/src/dalstorage.cpp index b86219dc..e20a5508 100644 --- a/src/dalstorage.cpp +++ b/src/dalstorage.cpp @@ -32,10 +32,6 @@ #include "utils/functors.h" #include "utils/logger.h" -namespace tmwserv -{ - - /** * Constructor. */ @@ -226,7 +222,7 @@ DALStorage::getAccount(const std::string& userName) const RecordSet& charInfo = mDb->execSql(sql); if (!charInfo.isEmpty()) { - Beings beings; + Players players; LOG_INFO(userName << "'s account has " << charInfo.rows() << " character(s) in database.", 1); @@ -246,48 +242,34 @@ DALStorage::getAccount(const std::string& userName) unsigned int charRows = charInfo.rows(); for (unsigned int k = 0; k < charRows; ++k) { - RawStatistics stats = { - toUshort(strCharInfo[k][11]), // strength - toUshort(strCharInfo[k][12]), // agility - toUshort(strCharInfo[k][13]), // vitality - toUshort(strCharInfo[k][14]), // intelligence - toUshort(strCharInfo[k][15]), // dexterity - toUshort(strCharInfo[k][16]) // luck - }; - - BeingPtr being( - new Being(strCharInfo[k][2], // name - // while the implicit type conversion from - // a short to an enum is invalid, the explicit - // type cast works :D - (Genders) toUshort(strCharInfo[k][3]), // gender - toUshort(strCharInfo[k][4]), // hair style - toUshort(strCharInfo[k][5]), // hair color - toUshort(strCharInfo[k][6]), // level - toUint(strCharInfo[k][7]), // money - stats - )); + PlayerPtr player(new Player(strCharInfo[k][2])); + player->setGender((Genders)toUshort(strCharInfo[k][3])); + player->setHairStyle(toUshort(strCharInfo[k][4])); + player->setHairColor(toUshort(strCharInfo[k][5])); + player->setLevel(toUshort(strCharInfo[k][6])); + player->setMoney(toUint(strCharInfo[k][7])); + player->setXY(toUshort(strCharInfo[k][8]), + toUshort(strCharInfo[k][9])); + for (int i = 0; i < NB_RSTAT; ++i) + player->setRawStat(i, toUshort(strCharInfo[k][11 + i])); unsigned int mapId = toUint(strCharInfo[k][10]); if ( mapId > 0 ) { - being->setMapId(mapId); + player->setMapId(mapId); } else { // Set player to default map and one of the default location // Default map is to be 1, as not found return value will be 0. - being->setMapId((int)config.getValue("defaultMap", 1)); + player->setMapId((int)config.getValue("defaultMap", 1)); } - being->setXY(toUshort(strCharInfo[k][8]), - toUshort(strCharInfo[k][9])); - - mCharacters.push_back(being); - beings.push_back(being); + mCharacters.push_back(player); + players.push_back(player); } // End of for each characters - account->setCharacters(beings); + account->setCharacters(players); } // End if there are characters. return account; @@ -738,12 +720,10 @@ DALStorage::_addAccount(const AccountPtr& account) (account_it->second).id = toUint(accountInfo(0, 0)); // insert the characters. - Beings& characters = account->getCharacters(); + Players &characters = account->getCharacters(); - Beings::const_iterator it = characters.begin(); - Beings::const_iterator it_end = characters.end(); + Players::const_iterator it = characters.begin(), it_end = characters.end(); for (; it != it_end; ++it) { - RawStatistics& stats = (*it)->getRawStatistics(); std::ostringstream sql3; sql3 << "insert into " << CHARACTERS_TBL_NAME << " (name, gender, hair_style, hair_color, level, money, x, y, " @@ -754,17 +734,17 @@ DALStorage::_addAccount(const AccountPtr& account) << (*it)->getGender() << ", " << (int)(*it)->getHairStyle() << ", " << (int)(*it)->getHairColor() << ", " - << (*it)->getLevel() << ", " + << (int)(*it)->getLevel() << ", " << (*it)->getMoney() << ", " << (*it)->getX() << ", " << (*it)->getY() << ", " << (int)(*it)->getMapId() << ", " - << stats.strength << ", " - << stats.agility << ", " - << stats.vitality << ", " - << stats.intelligence << ", " - << stats.dexterity << ", " - << stats.luck + << (*it)->getRawStat(STAT_STR) << ", " + << (*it)->getRawStat(STAT_AGI) << ", " + << (*it)->getRawStat(STAT_VIT) << ", " + << (*it)->getRawStat(STAT_INT) << ", " + << (*it)->getRawStat(STAT_DEX) << ", " + << (*it)->getRawStat(STAT_LUK) << ");"; mDb->execSql(sql3.str()); @@ -816,11 +796,10 @@ DALStorage::_updAccount(const AccountPtr& account) mDb->execSql(sql1.str()); // get the list of characters that belong to this account. - Beings& characters = account->getCharacters(); + Players &characters = account->getCharacters(); // insert or update the characters. - Beings::const_iterator it = characters.begin(); - Beings::const_iterator it_end = characters.end(); + Players::const_iterator it = characters.begin(), it_end = characters.end(); using namespace dal; for (; it != it_end; ++it) { @@ -831,8 +810,6 @@ DALStorage::_updAccount(const AccountPtr& account) << " where name = \"" << (*it)->getName() << "\";"; const RecordSet& charInfo = mDb->execSql(sql2.str()); - RawStatistics& stats = (*it)->getRawStatistics(); - std::ostringstream sql3; if (charInfo.rows() == 0) { sql3 << "insert into " << CHARACTERS_TBL_NAME @@ -849,19 +826,19 @@ DALStorage::_updAccount(const AccountPtr& account) #endif << (*it)->getName() << "\", " << (*it)->getGender() << ", " - << (*it)->getHairStyle() << ", " - << (*it)->getHairColor() << ", " - << (*it)->getLevel() << ", " + << (int)(*it)->getHairStyle() << ", " + << (int)(*it)->getHairColor() << ", " + << (int)(*it)->getLevel() << ", " << (*it)->getMoney() << ", " << (*it)->getX() << ", " << (*it)->getY() << ", " << (*it)->getMapId() << ", " - << stats.strength << ", " - << stats.agility << ", " - << stats.vitality << ", " - << stats.intelligence << ", " - << stats.dexterity << ", " - << stats.luck << ");"; + << (*it)->getRawStat(STAT_STR) << ", " + << (*it)->getRawStat(STAT_AGI) << ", " + << (*it)->getRawStat(STAT_VIT) << ", " + << (*it)->getRawStat(STAT_INT) << ", " + << (*it)->getRawStat(STAT_DEX) << ", " + << (*it)->getRawStat(STAT_LUK) << ");"; } else { sql3 << "update " << CHARACTERS_TBL_NAME @@ -874,16 +851,16 @@ DALStorage::_updAccount(const AccountPtr& account) << " x = " << (*it)->getX() << ", " << " y = " << (*it)->getY() << ", " << " map_id = " << (*it)->getMapId() << ", " - << " str = " << stats.strength << ", " - << " agi = " << stats.agility << ", " - << " vit = " << stats.vitality << ", " + << " str = " << (*it)->getRawStat(STAT_STR) << ", " + << " agi = " << (*it)->getRawStat(STAT_AGI) << ", " + << " vit = " << (*it)->getRawStat(STAT_VIT) << ", " #if defined(MYSQL_SUPPORT) || defined(POSTGRESQL_SUPPORT) - << " `int` = " << stats.intelligence << ", " + << " `int` = " << (*it)->getRawStat(STAT_INT) << ", " #else - << " int = " << stats.intelligence << ", " + << " int = " << (*it)->getRawStat(STAT_INT) << ", " #endif - << " dex = " << stats.dexterity << ", " - << " luck = " << stats.luck + << " dex = " << (*it)->getRawStat(STAT_DEX) << ", " + << " luck = " << (*it)->getRawStat(STAT_LUK) << " where id = " << charInfo(0, 0) << ";"; } mDb->execSql(sql3.str()); @@ -1038,6 +1015,3 @@ DALStorage::_delAccount(const std::string& userName) sql += "';"; mDb->execSql(sql); } - - -} // namespace tmwserv diff --git a/src/dalstorage.h b/src/dalstorage.h index e7b17022..c3848ed9 100644 --- a/src/dalstorage.h +++ b/src/dalstorage.h @@ -28,10 +28,6 @@ #include "dal/dataprovider.h" -namespace tmwserv -{ - - /** * A storage class that relies on DAL. * @@ -226,8 +222,4 @@ class DALStorage: public Storage std::auto_ptr mDb; /**< the data provider */ }; - -} // namespace tmwserv - - #endif // _TMWSERV_DALSTORAGE_H_ diff --git a/src/gamehandler.cpp b/src/gamehandler.cpp index ebda00d6..8fd89919 100644 --- a/src/gamehandler.cpp +++ b/src/gamehandler.cpp @@ -34,8 +34,6 @@ #include "state.h" #include "utils/logger.h" -using tmwserv::BeingPtr; - class GameClient: public NetComputer { public: @@ -52,7 +50,7 @@ class GameClient: public NetComputer /** * Set the selected character associated with connection. */ - void setCharacter(BeingPtr ch); + void setCharacter(PlayerPtr ch); /** * Deselect the character associated with connection. @@ -62,11 +60,11 @@ class GameClient: public NetComputer /** * Get character associated with the connection. */ - BeingPtr getCharacter() { return mCharacterPtr; } + PlayerPtr getCharacter() { return mCharacterPtr; } private: /** Character associated with the conneciton. */ - BeingPtr mCharacterPtr; + PlayerPtr mCharacterPtr; }; GameClient::GameClient(GameHandler *handler, ENetPeer *peer): @@ -81,25 +79,25 @@ GameClient::~GameClient() } -void GameClient::setCharacter(tmwserv::BeingPtr ch) +void GameClient::setCharacter(PlayerPtr ch) { assert(mCharacterPtr.get() == NULL); mCharacterPtr = ch; - gameState->addBeing(mCharacterPtr); - gameState->informBeing(mCharacterPtr); + gameState->addObject(ObjectPtr(mCharacterPtr)); + gameState->informPlayer(mCharacterPtr); } void GameClient::unsetCharacter() { if (mCharacterPtr.get() == NULL) return; // remove being from world - gameState->removeBeing(mCharacterPtr); - mCharacterPtr = tmwserv::BeingPtr(NULL); + gameState->removeObject(ObjectPtr(mCharacterPtr)); + mCharacterPtr = PlayerPtr(NULL); } struct GamePendingLogin { - tmwserv::BeingPtr character; + PlayerPtr character; int timeout; }; @@ -109,7 +107,7 @@ static GamePendingLogins pendingLogins; typedef std::map< std::string, GameClient * > GamePendingClients; static GamePendingClients pendingClients; -void registerGameClient(std::string const &token, tmwserv::BeingPtr ch) +void registerGameClient(std::string const &token, PlayerPtr ch) { GamePendingClients::iterator i = pendingClients.find(token); if (i != pendingClients.end()) @@ -264,7 +262,7 @@ void GameHandler::processMessage(NetComputer *comp, MessageIn &message) void GameHandler::sayAround(GameClient &computer, std::string const &text) { - BeingPtr beingPtr = computer.getCharacter(); + PlayerPtr beingPtr = computer.getCharacter(); MessageOut msg; msg.writeShort(GPMSG_SAY); msg.writeString(beingPtr->getName()); @@ -275,7 +273,7 @@ void GameHandler::sayAround(GameClient &computer, std::string const &text) i != i_end; ++i) { // See if the other being is near enough, then send the message - tmwserv::Being const *listener = static_cast< GameClient * >(*i)->getCharacter().get(); + Player const *listener = static_cast< GameClient * >(*i)->getCharacter().get(); if (!listener || listener->getMapId() != speakerMapId) continue; std::pair listenerXY = listener->getXY(); if (abs(listenerXY.first - speakerXY.first ) > (int)AROUND_AREA_IN_TILES) continue; @@ -284,7 +282,7 @@ void GameHandler::sayAround(GameClient &computer, std::string const &text) } } -void GameHandler::sendTo(BeingPtr beingPtr, MessageOut &msg) +void GameHandler::sendTo(PlayerPtr beingPtr, MessageOut &msg) { for (NetComputers::iterator i = clients.begin(), i_end = clients.end(); i != i_end; ++i) { diff --git a/src/gamehandler.h b/src/gamehandler.h index 6a2da6e9..520f290c 100644 --- a/src/gamehandler.h +++ b/src/gamehandler.h @@ -39,9 +39,9 @@ class GameHandler: public ConnectionHandler void process(); /** - * Send message to the given being. + * Send message to the given player. */ - void sendTo(tmwserv::BeingPtr beingPtr, MessageOut &msg); + void sendTo(PlayerPtr playerPtr, MessageOut &msg); protected: NetComputer *computerConnected(ENetPeer *); @@ -66,7 +66,7 @@ class GameHandler: public ConnectionHandler /** * Register future client attempt. Temporary until physical server split. */ -void registerGameClient(std::string const &, tmwserv::BeingPtr); +void registerGameClient(std::string const &, PlayerPtr); extern GameHandler *gameHandler; diff --git a/src/main.cpp b/src/main.cpp index 8a5dd5b6..8f418ce4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,7 +86,7 @@ Skill skillTree("base"); /**< Skill tree */ Configuration config; /**< XML config reader */ -tmwserv::utils::StringFilter *stringFilter; /**< Slang's Filter */ +utils::StringFilter *stringFilter; /**< Slang's Filter */ /** Account message handler */ AccountHandler *accountHandler; @@ -100,7 +100,7 @@ ChatChannelManager *chatChannelManager; GameHandler *gameHandler; /** Global game state */ -tmwserv::State *gameState; +State *gameState; /** * Initializes the server. @@ -143,7 +143,7 @@ void initialize() #endif // defined LOG_FILE // initialize the logger. - using namespace tmwserv::utils; + using namespace utils; Logger::instance().setLogFile(logPath); // write the messages to both the screen and the log file. @@ -245,7 +245,7 @@ void deinitialize() delete chatChannelManager; // Get rid of persistent data storage - tmwserv::Storage::destroy(); + Storage::destroy(); PHYSFS_deinit(); } @@ -295,7 +295,7 @@ void parseOptions(int argc, char *argv[]) // Set Verbosity to level unsigned short verbosityLevel; verbosityLevel = atoi(optarg); - tmwserv::utils::Logger::instance().setVerbosity(verbosityLevel); + utils::Logger::instance().setVerbosity(verbosityLevel); LOG_INFO("Setting Log Verbosity Level to " << verbosityLevel, 0); break; case 'p': diff --git a/src/map.cpp b/src/map.cpp index 843e9664..436a9c42 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -27,9 +27,6 @@ #include "being.h" -namespace tmwserv -{ - MetaTile::MetaTile(): whichList(0) @@ -333,5 +330,3 @@ Map::findPath(int startX, int startY, int destX, int destY) return path; } - -} // namespace tmwserv diff --git a/src/map.h b/src/map.h index e51572df..0f31d7b4 100644 --- a/src/map.h +++ b/src/map.h @@ -28,10 +28,6 @@ #include #include -namespace tmwserv -{ - - struct PATH_NODE; /** @@ -190,6 +186,4 @@ class Map int onClosedList, onOpenList; }; -} // namespace tmwserv - #endif diff --git a/src/mapmanager.cpp b/src/mapmanager.cpp index caacbecc..b1a307db 100644 --- a/src/mapmanager.cpp +++ b/src/mapmanager.cpp @@ -29,10 +29,6 @@ #include "utils/logger.h" -namespace tmwserv -{ - - MapManager::~MapManager() throw() { @@ -100,6 +96,3 @@ MapManager::isLoaded(const unsigned int mapId) const { return maps.find(mapId) != maps.end(); } - - -} // namespace tmwserv diff --git a/src/mapmanager.h b/src/mapmanager.h index 14d0a159..71e3327c 100644 --- a/src/mapmanager.h +++ b/src/mapmanager.h @@ -28,9 +28,7 @@ #include "utils/singleton.h" -namespace tmwserv -{ - class Map; +class Map; /** @@ -80,6 +78,4 @@ class MapManager: public utils::Singleton std::map maps; }; -} // namespace tmwserv - #endif diff --git a/src/mapreader.cpp b/src/mapreader.cpp index 5e213fd8..f16886c9 100644 --- a/src/mapreader.cpp +++ b/src/mapreader.cpp @@ -32,10 +32,6 @@ #include "utils/base64.h" #include "utils/logger.h" -namespace tmwserv -{ - - const unsigned int DEFAULT_TILE_WIDTH = 32; const unsigned int DEFAULT_TILE_HEIGHT = 32; @@ -382,5 +378,3 @@ void MapReader::setTileWithGid(Map *map, int x, int y, int layer, int gid) map->setWalk(x, y, !set || (gid - set->getFirstGid() == 0)); } } - -} // namespace tmwserv diff --git a/src/mapreader.h b/src/mapreader.h index 3ed67153..fe395e35 100644 --- a/src/mapreader.h +++ b/src/mapreader.h @@ -27,9 +27,7 @@ #include #include -namespace tmwserv -{ - class Map; +class Map; /** @@ -108,6 +106,4 @@ class MapReader static std::vector tilesets; }; -} // namespace tmwserv - #endif diff --git a/src/object.cpp b/src/object.cpp index 82be242a..cab2622e 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -22,132 +22,3 @@ #include "object.h" - - -namespace tmwserv -{ - - -/** - * Default constructor. - */ -Object::Object(void) - : mNeedUpdate(false), - mX(0), - mY(0) -{ - mStats.health = 0; - mStats.attack = 0; - mStats.defense = 0; - mStats.magic = 0; - mStats.accuracy = 0; - mStats.speed = 0; -} - - -/** - * Destructor. - */ -Object::~Object(void) - throw() -{ - // NOOP -} - - -/** - * Set the x coordinate. - */ -void -Object::setX(unsigned int x) -{ - mX = x; -} - - -/** - * Get the x coordinate. - */ -unsigned int -Object::getX(void) const -{ - return mX; -} - - -/** - * Set the y coordinate. - */ -void -Object::setY(unsigned int y) -{ - mY = y; -} - - -/** - * Get the y coordinate. - */ -unsigned int -Object::getY(void) const -{ - return mY; -} - - -/** - * Set the coordinates. - */ -void -Object::setXY(unsigned int x, unsigned int y) -{ - mX = x; - mY = y; -} - - -/** - * Get the coordinates. - */ -std::pair -Object::getXY(void) const -{ - return std::make_pair(mX, mY); -} - - -/** - * Set the statistics. - */ -void -Object::setStatistics(const Statistics& stats) -{ - mStats = stats; -} - - -/** - * Get the statistics. - */ -Statistics& -Object::getStatistics(void) -{ - if (mNeedUpdate) { - update(); - } - - return mStats; -} - -unsigned int -Object::getMapId() const -{ - return mMapId; -} - -void -Object::setMapId(const unsigned int mapId) { - mMapId = mapId; -} - -} // namespace tmwserv diff --git a/src/object.h b/src/object.h index 962f8202..77705801 100644 --- a/src/object.h +++ b/src/object.h @@ -27,30 +27,9 @@ #include #include +#include "defines.h" #include "utils/countedptr.h" -namespace tmwserv -{ - -/** - * Structure type for the statistics. - * - * Notes: - * - the structure can be used to define stats modifiers (i.e. how an - * object would modify the stats of a being when it is equipped) or - * computed stats of a being. - * - the attributes are not unsigned to allow negative values. - */ -struct Statistics -{ - int health; - int attack; - int defense; - int magic; - int accuracy; - int speed; -}; - /** * Generic in-game object definition. * Base class for in-game objects. @@ -59,54 +38,57 @@ class Object { public: /** - * Default constructor. + * Constructor. */ - Object(void); - + Object(int type) + : mType(type), + mNeedUpdate(false) + {} /** - * Destructor. + * Empty virtual destructor. */ - virtual - ~Object(void) - throw(); + virtual ~Object() {} + /** + * Get type. + * + * @return the type. + */ + unsigned int getType() const + { return mType; } /** * Set the x coordinate. * * @param x the new x coordinate. */ - void - setX(unsigned int x); - + void setX(unsigned int x) + { mX = x; } /** * Get the x coordinate. * * @return the x coordinate. */ - unsigned int - getX(void) const; - + unsigned int getX() const + { return mX; } /** * Set the y coordinate. * * @param y the new y coordinate. */ - void - setY(unsigned int y); - + void setY(unsigned int y) + { mY = y; } /** * Get the y coordinate. * * @return the y coordinate. */ - unsigned int - getY(void) const; - + unsigned int getY() const + { return mY; } /** * Set the coordinates. @@ -114,67 +96,59 @@ class Object * @param x the x coordinate. * @param y the y coordinate. */ - void - setXY(unsigned int x, unsigned int y); - + void setXY(unsigned int x, unsigned int y) + { mX = x; mY = y; } /** * Get the coordinates. * * @return the coordinates as a pair. */ - std::pair - getXY(void) const; - - - /** - * Set the statistics. - * - * @param stats the statistics. - */ - void - setStatistics(const Statistics& stats); - - - /** - * Get the statistics. - * - * @return the statistics. - */ - Statistics& - getStatistics(void); - + std::pair getXY() const + { return std::make_pair(mX, mY); } /** * Update the internal status. */ virtual void - update(void) = 0; + update() = 0; /** * Get map name where being is * * @return Name of map being is located. */ - unsigned int - getMapId() const; + unsigned int getMapId() const + { return mMapId; } /** * Set map being is located */ - void - setMapId(const unsigned int mapId); - - protected: - Statistics mStats; /**< stats modifiers or computed stats */ - bool mNeedUpdate; /**< update() must be invoked if true */ - + void setMapId(unsigned int mapId) + { mMapId = mapId; } private: + int mType; /**< Object type */ unsigned int mX; /**< x coordinate */ unsigned int mY; /**< y coordinate */ - unsigned int mMapId; /**< id of the map being is on */ + + protected: + bool mNeedUpdate; /**< update() must be invoked if true */ +}; + +/** + * Base class for in-game moving objects. + */ +class MovingObject: public Object +{ + public: + /** + * Proxy constructor. + */ + MovingObject(int type) + : Object(type) + {} }; /** @@ -188,7 +162,4 @@ typedef utils::CountedPtr ObjectPtr; */ typedef std::vector Objects; -} // namespace tmwserv - - #endif // _TMWSERV_OBJECT_H_ diff --git a/src/state.cpp b/src/state.cpp index bcd63f5d..53ddb7ac 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -30,9 +30,6 @@ #include "utils/logger.h" -namespace tmwserv -{ - State::State() { } @@ -47,72 +44,82 @@ State::~State() { void State::update() { // update game state (update AI, etc.) - for (std::map::iterator i = maps.begin(); - i != maps.end(); - i++) { - for (Beings::iterator b = i->second.beings.begin(); - b != i->second.beings.end(); - b++) { - b->get()->update(); + for (std::map::iterator m = maps.begin(), + m_end = maps.end(); m != m_end; ++m) { + for (Objects::iterator o = m->second.objects.begin(), + o_end = m->second.objects.end(); o != o_end; ++o) { + (*o)->update(); } } } -void State::addBeing(BeingPtr beingPtr) { - unsigned mapId = beingPtr->getMapId(); +void State::addObject(ObjectPtr objectPtr) { + unsigned mapId = objectPtr->getMapId(); if (!loadMap(mapId)) return; - Beings &beings = maps[mapId].beings; - beings.push_back(beingPtr); + maps[mapId].objects.push_back(objectPtr); + if (objectPtr->getType() != OBJECT_PLAYER) return; + PlayerPtr playerPtr(objectPtr); + Players &players = maps[mapId].players; + players.push_back(playerPtr); MessageOut msg; msg.writeShort(GPMSG_BEING_ENTER); msg.writeByte(OBJECT_PLAYER); msg.writeLong(0); // ID - msg.writeString(beingPtr->getName()); - msg.writeByte(beingPtr->getHairStyle()); - msg.writeByte(beingPtr->getHairColor()); - msg.writeByte(beingPtr->getGender()); - for (Beings::iterator b = beings.begin(), end = beings.end(); - b != end; ++b) { - gameHandler->sendTo(*b, msg); + msg.writeString(playerPtr->getName()); + msg.writeByte(playerPtr->getHairStyle()); + msg.writeByte(playerPtr->getHairColor()); + msg.writeByte(playerPtr->getGender()); + for (Players::iterator p = players.begin(), + p_end = players.end(); p != p_end; ++p) { + gameHandler->sendTo(*p, msg); } } -void State::removeBeing(BeingPtr beingPtr) { - unsigned mapId = beingPtr->getMapId(); - std::map::iterator i = maps.find(mapId); - if (i == maps.end()) return; - Beings &beings = i->second.beings; +void State::removeObject(ObjectPtr objectPtr) { + unsigned mapId = objectPtr->getMapId(); + std::map::iterator m = maps.find(mapId); + if (m == maps.end()) return; + Objects &objects = m->second.objects; + for (Objects::iterator o = objects.begin(), + o_end = objects.end(); o != o_end; ++o) { + if (o->get() == objectPtr.get()) { + objects.erase(o); + break; + } + } + if (objectPtr->getType() != OBJECT_PLAYER) return; + PlayerPtr playerPtr(objectPtr); + Players &players = maps[mapId].players; MessageOut msg; msg.writeShort(GPMSG_BEING_LEAVE); msg.writeByte(OBJECT_PLAYER); msg.writeLong(0); // ID - Beings::iterator j = beings.end(); - for (Beings::iterator b = beings.begin(), end = beings.end(); - b != end; ++b) { - if (b->get() == beingPtr.get()) - j = b; + Players::iterator p_end = players.end(), j = p_end; + for (Players::iterator p = players.begin(); p != p_end; ++p) { + if (p->get() == playerPtr.get()) + j = p; else - gameHandler->sendTo(*b, msg); + gameHandler->sendTo(*p, msg); } - if (j != beings.end()) beings.erase(j); + if (j != players.end()) players.erase(j); } -void State::informBeing(BeingPtr beingPtr) { - unsigned mapId = beingPtr->getMapId(); - std::map::iterator i = maps.find(mapId); - if (i == maps.end()) return; - Beings &beings = i->second.beings; - for (Beings::iterator b = beings.begin(), end = beings.end(); - b != end; ++b) { +void State::informPlayer(PlayerPtr playerPtr) { + unsigned mapId = playerPtr->getMapId(); + std::map::iterator m = maps.find(mapId); + if (m == maps.end()) return; + Players &players = m->second.players; + for (Players::iterator p = players.begin(), + p_end = players.end(); p != p_end; ++p) { MessageOut msg; msg.writeShort(GPMSG_BEING_ENTER); msg.writeByte(OBJECT_PLAYER); msg.writeLong(0); // ID - msg.writeString((*b)->getName()); - msg.writeByte((*b)->getHairStyle()); - msg.writeByte((*b)->getHairColor()); - msg.writeByte((*b)->getGender()); - gameHandler->sendTo(beingPtr, msg); + msg.writeString((*p)->getName()); + msg.writeByte((*p)->getHairStyle()); + msg.writeByte((*p)->getHairColor()); + msg.writeByte((*p)->getGender()); + gameHandler->sendTo(playerPtr, msg); } } @@ -126,24 +133,3 @@ bool State::loadMap(const unsigned int mapId) { return true; // We let true for testing on beings } - -void State::addObject(ObjectPtr objectPtr) { - unsigned mapId = objectPtr->getMapId(); - if (!loadMap(mapId)) return; - maps[mapId].objects.push_back(objectPtr); -} - -void State::removeObject(ObjectPtr objectPtr) { - unsigned mapId = objectPtr->getMapId(); - std::map::iterator i = maps.find(mapId); - if (i == maps.end()) return; - for (Objects::iterator b = i->second.objects.begin(), end = i->second.objects.end(); - b != end; ++b) { - if (b->get() == objectPtr.get()) { - i->second.objects.erase(b); - return; - } - } -} - -} // namespace tmwserv diff --git a/src/state.h b/src/state.h index 2ebf8b1e..b9654f92 100644 --- a/src/state.h +++ b/src/state.h @@ -28,9 +28,7 @@ #include "being.h" -namespace tmwserv -{ - class Map; +class Map; /** * Combined map/entity structure @@ -47,14 +45,14 @@ struct MapComposite { Map *map; /** - * Beings located on the map + * Objects (items, players, monsters, etc) located on the map */ - Beings beings; + Objects objects; /** - * Items located on the map + * Players located on the map */ - Objects objects; + Players players; }; /** @@ -78,19 +76,9 @@ class State void update(); /** - * Add being to game world at specified map - */ - void addBeing(BeingPtr beingPtr); - - /** - * Remove being from game world + * Send game state to given player */ - void removeBeing(BeingPtr beingPtr); - - /** - * Send game state to given being - */ - void informBeing(BeingPtr beingPtr); + void informPlayer(PlayerPtr playerPtr); /** * Load map into game world @@ -108,8 +96,6 @@ class State void removeObject(ObjectPtr objectPtr); }; -} // namespace tmwserv - -extern tmwserv::State * gameState; +extern State *gameState; #endif diff --git a/src/storage.cpp b/src/storage.cpp index 0ba23616..ed31bad4 100644 --- a/src/storage.cpp +++ b/src/storage.cpp @@ -24,10 +24,6 @@ #include "dalstorage.h" -namespace tmwserv -{ - - // initialize the static attributes. Storage* Storage::mInstance = 0; std::string Storage::mName(""); @@ -148,6 +144,3 @@ Storage::getPassword(void) const { return mPassword; } - - -} // namespace tmwserv diff --git a/src/storage.h b/src/storage.h index eb410139..75cea54a 100644 --- a/src/storage.h +++ b/src/storage.h @@ -31,11 +31,6 @@ #include "account.h" #include "chatchannel.h" - -namespace tmwserv -{ - - /** * Enumeration type for the account status: * @@ -367,7 +362,7 @@ class Storage protected: Accounts mAccounts; /**< list of accounts in memory */ - Beings mCharacters; /**< the loaded characters */ + Players mCharacters; /**< the loaded characters */ bool mIsOpen; /**< flag is true if the storage is open */ @@ -378,8 +373,4 @@ class Storage static std::string mPassword; /**< the user password */ }; - -} // namespace tmwserv - - #endif // _TMWSERV_STORAGE_H_ diff --git a/src/utils/cipher.cpp b/src/utils/cipher.cpp index 6eda3ec5..083f6924 100644 --- a/src/utils/cipher.cpp +++ b/src/utils/cipher.cpp @@ -28,8 +28,6 @@ #include #include -namespace tmwserv -{ namespace utils { @@ -95,4 +93,3 @@ Cipher::toHex(const unsigned char* str, } // namespace utils -} // namespace tmwserv diff --git a/src/utils/cipher.h b/src/utils/cipher.h index bfca4cb1..3dfb5ef2 100644 --- a/src/utils/cipher.h +++ b/src/utils/cipher.h @@ -28,9 +28,6 @@ #include "singleton.h" - -namespace tmwserv -{ namespace utils { @@ -108,7 +105,5 @@ class Cipher: public Singleton } // namespace utils -} // namespace tmwserv - #endif // _TMWSERV_CIPHER_H_ diff --git a/src/utils/countedptr.h b/src/utils/countedptr.h index f8dbcd51..3edc9c3d 100644 --- a/src/utils/countedptr.h +++ b/src/utils/countedptr.h @@ -24,9 +24,6 @@ #ifndef _TMWSERV_COUNTED_PTR_H_ #define _TMWSERV_COUNTED_PTR_H_ - -namespace tmwserv -{ namespace utils { @@ -84,6 +81,17 @@ class CountedPtr ++*count; } + /** + * Copy pointer with static cast (one more owner). + */ + template + explicit CountedPtr(const CountedPtr& p) + throw() + : ptr(static_cast(p.ptr)), + count(p.count) + { + ++*count; + } /** * Assignment (unshare old and share new value). @@ -102,7 +110,6 @@ class CountedPtr return *this; } - /** * Access the value to which the pointer refers. */ @@ -149,15 +156,12 @@ class CountedPtr } } - - private: T* ptr; /**< pointer to the value */ long* count; /**< shared number of owners */ -}; + template friend class CountedPtr; +}; } // namespace utils -} // namespace tmwserv - #endif // _TMWSERV_COUNTED_PTR_H_ diff --git a/src/utils/logger.cpp b/src/utils/logger.cpp index 93dd289b..36d43f80 100644 --- a/src/utils/logger.cpp +++ b/src/utils/logger.cpp @@ -30,9 +30,6 @@ #include #endif - -namespace tmwserv -{ namespace utils { @@ -290,4 +287,3 @@ Logger::getCurrentTime(void) } // namespace utils -} // namespace tmwserv diff --git a/src/utils/logger.h b/src/utils/logger.h index d3f0d1a6..e37f33af 100644 --- a/src/utils/logger.h +++ b/src/utils/logger.h @@ -30,9 +30,6 @@ #include "singleton.h" - -namespace tmwserv -{ namespace utils { @@ -293,8 +290,6 @@ class Logger: public Singleton } // namespace utils -} // namespace tmwserv - // HELPER MACROS @@ -303,42 +298,42 @@ class Logger: public Singleton do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().log(os.str(), atVerbosity); \ + ::utils::Logger::instance().log(os.str(), atVerbosity); \ } while(0) #define LOG_DEBUG(msg, atVerbosity) \ do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().debug(os.str(), atVerbosity); \ + ::utils::Logger::instance().debug(os.str(), atVerbosity); \ } while (0) #define LOG_INFO(msg, atVerbosity) \ do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().info(os.str(), atVerbosity); \ + ::utils::Logger::instance().info(os.str(), atVerbosity); \ } while (0) #define LOG_WARN(msg, atVerbosity) \ do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().warn(os.str(), atVerbosity); \ + ::utils::Logger::instance().warn(os.str(), atVerbosity); \ } while (0) #define LOG_ERROR(msg, atVerbosity) \ do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().error(os.str(), atVerbosity); \ + ::utils::Logger::instance().error(os.str(), atVerbosity); \ } while (0) #define LOG_FATAL(msg, atVerbosity) \ do { \ std::ostringstream os; \ os << msg; \ - ::tmwserv::utils::Logger::instance().fatal(os.str(), atVerbosity); \ + ::utils::Logger::instance().fatal(os.str(), atVerbosity); \ } while (0) #endif // _TMWSERV_LOGGER_H_ diff --git a/src/utils/singleton.h b/src/utils/singleton.h index 4b3589f3..92f6bebe 100644 --- a/src/utils/singleton.h +++ b/src/utils/singleton.h @@ -24,9 +24,6 @@ #ifndef _TMWSERV_SINGLETON_H_ #define _TMWSERV_SINGLETON_H_ - -namespace tmwserv -{ namespace utils { @@ -90,7 +87,5 @@ class Singleton } // namespace utils -} // namespace tmwserv - #endif // _TMWSERV_SINGLETON_H_ diff --git a/src/utils/stringfilter.cpp b/src/utils/stringfilter.cpp index cbb075a4..79480838 100644 --- a/src/utils/stringfilter.cpp +++ b/src/utils/stringfilter.cpp @@ -27,8 +27,6 @@ #include "../configuration.h" #include "../defines.h" -namespace tmwserv -{ namespace utils { @@ -129,4 +127,3 @@ bool StringFilter::findDoubleQuotes(const std::string& text) } } // ::utils -} // ::tmwserv diff --git a/src/utils/stringfilter.h b/src/utils/stringfilter.h index e48faa31..5002ca1e 100644 --- a/src/utils/stringfilter.h +++ b/src/utils/stringfilter.h @@ -29,8 +29,6 @@ class Configuration; -namespace tmwserv -{ namespace utils { @@ -95,8 +93,7 @@ class StringFilter }; } // ::utils -} // ::tmwserv -extern tmwserv::utils::StringFilter *stringFilter; +extern utils::StringFilter *stringFilter; #endif -- cgit v1.2.3-70-g09d2