From 10ebf4484985b98e9248c8de84b35af9b6e26d3a Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Wed, 22 Aug 2007 16:07:11 +0000 Subject: Fixed an arithmetic exception in ItemShortcutContainer::draw. Changed default sitting key back to 's'. Fixed a problem with all equipment being interpreted as weapon sprite. --- src/gui/itemshortcutcontainer.cpp | 8 +- src/keyboardconfig.cpp | 2 +- src/net/beinghandler.cpp | 16 +- src/net/equipmenthandler.cpp | 8 +- src/resources/equipmentdb.cpp | 356 +++++++++++++++++++------------------- src/resources/equipmentdb.h | 104 +++++------ src/resources/itemdb.cpp | 2 +- src/resources/itemdb.h | 2 +- 8 files changed, 255 insertions(+), 243 deletions(-) (limited to 'src') diff --git a/src/gui/itemshortcutcontainer.cpp b/src/gui/itemshortcutcontainer.cpp index d9ece8d0..1943ef93 100644 --- a/src/gui/itemshortcutcontainer.cpp +++ b/src/gui/itemshortcutcontainer.cpp @@ -33,6 +33,8 @@ #include "../utils/tostring.h" ItemShortcutContainer::ItemShortcutContainer(): + mGridWidth(1), + mGridHeight(1), mItemClicked(false), mItemMoved(NULL) { @@ -126,8 +128,8 @@ ItemShortcutContainer::setWidth(int width) mGridWidth = 1; } - setHeight(((mMaxItems / mGridWidth) + - (mMaxItems % mGridWidth > 0 ? 1 : 0)) * mBoxHeight); + setHeight((mMaxItems / mGridWidth + + (mMaxItems % mGridWidth > 0 ? 1 : 0)) * mBoxHeight); mGridHeight = getHeight() / mBoxHeight; if (mGridHeight < 1) { @@ -213,7 +215,7 @@ ItemShortcutContainer::getIndexFromGrid(int pointX, int pointY) const return -1; } const int index = ((pointY / mBoxHeight) * mGridWidth) + - (pointX / mBoxWidth); + pointX / mBoxWidth; if (index >= mMaxItems) { return -1; diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp index 649d60b6..271961c8 100644 --- a/src/keyboardconfig.cpp +++ b/src/keyboardconfig.cpp @@ -47,7 +47,7 @@ static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = { {"keyTargetClosest", SDLK_a, "Target Closest"}, {"keyPickup", SDLK_z, "Pickup"}, {"keyHideWindows", SDLK_h, "Hide Windows"}, - {"keyBeingSit", SDLK_g, "Sit"}, + {"keyBeingSit", SDLK_s, "Sit"}, {"keyShortcut0", SDLK_0, "Item Shortcut 0"}, {"keyShortcut1", SDLK_1, "Item Shortcut 1"}, {"keyShortcut2", SDLK_2, "Item Shortcut 2"}, diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 3bec6369..c6e03c86 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -107,7 +107,8 @@ void BeingHandler::handleMessage(MessageIn *msg) dstBeing->setWalkSpeed(speed); dstBeing->mJob = job; dstBeing->setHairStyle(msg->readInt16()); - dstBeing->setVisibleEquipment(Being::WEAPON_SPRITE, msg->readInt16() * 10000); + dstBeing->setVisibleEquipment( + Being::WEAPON_SPRITE, msg->readInt16() * 10000); dstBeing->setVisibleEquipment( Being::BOTTOMCLOTHES_SPRITE, msg->readInt16()); @@ -117,9 +118,10 @@ void BeingHandler::handleMessage(MessageIn *msg) } msg->readInt16(); // shield - dstBeing->setVisibleEquipment(Being::HAT_SPRITE, msg->readInt16()); - dstBeing->setVisibleEquipment( - Being::TOPCLOTHES_SPRITE, msg->readInt16()); + headTop = msg->readInt16(); + headMid = msg->readInt16(); + dstBeing->setVisibleEquipment(Being::HAT_SPRITE, headTop); + dstBeing->setVisibleEquipment(Being::TOPCLOTHES_SPRITE, headMid); dstBeing->setHairColor(msg->readInt16()); msg->readInt16(); // unknown msg->readInt16(); // head dir @@ -224,10 +226,12 @@ void BeingHandler::handleMessage(MessageIn *msg) } Particle *levelupFX; if (msg->readInt32() == 0) { // type - levelupFX = particleEngine->addEffect("graphics/particles/levelup.particle.xml", 0, 0); + levelupFX = particleEngine->addEffect( + "graphics/particles/levelup.particle.xml", 0, 0); } else { - levelupFX = particleEngine->addEffect("graphics/particles/skillup.particle.xml", 0, 0); + levelupFX = particleEngine->addEffect( + "graphics/particles/skillup.particle.xml", 0, 0); } beingManager->findBeing(id)->controlParticle(levelupFX); break; diff --git a/src/net/equipmenthandler.cpp b/src/net/equipmenthandler.cpp index 579b6ed3..60be5c74 100644 --- a/src/net/equipmenthandler.cpp +++ b/src/net/equipmenthandler.cpp @@ -125,16 +125,18 @@ void EquipmentHandler::handleMessage(MessageIn *msg) item = player_node->getInvItem(index); player_node->mEquipment->setEquipment(position, item); - player_node->setVisibleEquipment( - Being::WEAPON_SPRITE, item->getId()); break; case 0x01d7: - // Equipment related + // Equipment related. At least confirmed to be required for weapon + // changes to appear on the local player. being = beingManager->findBeing(msg->readInt32()); msg->readInt8(); // equip point itemId = msg->readInt16(); msg->readInt16(); // item id 2 + logger->log("0x01d7 (%s, itemId = %d)", + (being == player_node) ? "player" : "somebody else", + itemId); if (!being) break; diff --git a/src/resources/equipmentdb.cpp b/src/resources/equipmentdb.cpp index 9b963720..55107050 100644 --- a/src/resources/equipmentdb.cpp +++ b/src/resources/equipmentdb.cpp @@ -1,176 +1,180 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World 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. - * - * The Mana World 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 The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "equipmentdb.h" - -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - EquipmentDB::EquipmentInfos mEquipmentInfos; - EquipmentInfo mUnknown; - bool mLoaded = false; -} - -void -EquipmentDB::load() -{ - if (mLoaded) - return; - - logger->log("Initializing equipment database..."); - mUnknown.setSprite("error.xml", 0); - mUnknown.setSprite("error.xml", 1); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("equipment.xml", size); - - if (!data) - { - logger->error("Equipment Database: Could not find equipment.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("Equipment Database: Error while parsing equipment database (equipment.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "equipments")) - { - logger->error("Equipment Database: equipment.xml is not a valid database file!"); - } - - //iterate s - for_each_xml_child_node(equipmentNode, rootNode) - { - if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) - { - continue; - } - - EquipmentInfo *currentInfo = new EquipmentInfo(); - - currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); - currentInfo->setAttackType (XML::getProperty(equipmentNode, "attacktype", "")); - - //iterate s and s - for_each_xml_child_node(spriteNode, equipmentNode) - { - if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) - { - std::string gender = XML::getProperty(spriteNode, "gender", "unisex"); - std::string filename = (const char*) spriteNode->xmlChildrenNode->content; - - if (gender == "male" || gender == "unisex") - { - currentInfo->setSprite(filename, 0); - } - - if (gender == "female" || gender == "unisex") - { - currentInfo->setSprite(filename, 1); - } - } - - if (xmlStrEqual(spriteNode->name, BAD_CAST "sound")) - { - std::string event = XML::getProperty(spriteNode, "event", ""); - const char *filename; - filename = (const char*) spriteNode->xmlChildrenNode->content; - - if (event == "hit") - { - currentInfo->addSound(EQUIP_EVENT_HIT, filename); - } - else if (event == "strike") - { - currentInfo->addSound(EQUIP_EVENT_STRIKE, filename); - } - else - { - logger->log("EquipmentDB: Warning, sound effect %s for unknown event %s", - filename, event.c_str()); - } - } - } - - setEquipment( XML::getProperty(equipmentNode, "id", 0), - currentInfo); - } - - mLoaded = true; -} - -void -EquipmentDB::unload() -{ - // kill EquipmentInfos - for_each ( mEquipmentInfos.begin(), mEquipmentInfos.end(), - make_dtor(mEquipmentInfos)); - mEquipmentInfos.clear(); - - mLoaded = false; -} - -EquipmentInfo* -EquipmentDB::get(int id) -{ - if (!mLoaded) { - logger->error("Error: Equipment database used before initialization!"); - } - - EquipmentInfoIterator i = mEquipmentInfos.find(id); - - if (i == mEquipmentInfos.end() ) - { - logger->log("EquipmentDB: Error, unknown equipment ID# %d", id); - return &mUnknown; - } - else - { - return i->second; - } -} - -void -EquipmentDB::setEquipment(int id, EquipmentInfo* equipmentInfo) -{ - if (mEquipmentInfos.find(id) != mEquipmentInfos.end()) { - logger->log("Warning: Equipment Piece with ID %d defined multiple times", - id); - delete equipmentInfo; - } - else { - mEquipmentInfos[id] = equipmentInfo; - }; -} +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include + +#include "equipmentdb.h" + +#include "resourcemanager.h" + +#include "../log.h" + +#include "../utils/dtor.h" +#include "../utils/xml.h" + +namespace +{ + EquipmentDB::EquipmentInfos mEquipmentInfos; + EquipmentInfo mUnknown; + bool mLoaded = false; +} + +void +EquipmentDB::load() +{ + if (mLoaded) + return; + + logger->log("Initializing equipment database..."); + mUnknown.setSprite("error.xml", 0); + mUnknown.setSprite("error.xml", 1); + + ResourceManager *resman = ResourceManager::getInstance(); + int size; + char *data = (char*)resman->loadFile("equipment.xml", size); + + if (!data) + { + logger->error("Equipment Database: Could not find equipment.xml!"); + } + + xmlDocPtr doc = xmlParseMemory(data, size); + free(data); + + if (!doc) + { + logger->error("Equipment Database: Error while parsing equipment database (equipment.xml)!"); + } + + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "equipments")) + { + logger->error("Equipment Database: equipment.xml is not a valid database file!"); + } + + //iterate s + for_each_xml_child_node(equipmentNode, rootNode) + { + if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) + { + continue; + } + + EquipmentInfo *currentInfo = new EquipmentInfo(); + + currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); + currentInfo->setAttackType (XML::getProperty(equipmentNode, "attacktype", "")); + + //iterate s and s + for_each_xml_child_node(spriteNode, equipmentNode) + { + if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) + { + std::string gender = XML::getProperty(spriteNode, "gender", "unisex"); + std::string filename = (const char*) spriteNode->xmlChildrenNode->content; + + if (gender == "male" || gender == "unisex") + { + currentInfo->setSprite(filename, 0); + } + + if (gender == "female" || gender == "unisex") + { + currentInfo->setSprite(filename, 1); + } + } + + if (xmlStrEqual(spriteNode->name, BAD_CAST "sound")) + { + std::string event = XML::getProperty(spriteNode, "event", ""); + const char *filename; + filename = (const char*) spriteNode->xmlChildrenNode->content; + + if (event == "hit") + { + currentInfo->addSound(EQUIP_EVENT_HIT, filename); + } + else if (event == "strike") + { + currentInfo->addSound(EQUIP_EVENT_STRIKE, filename); + } + else + { + logger->log("EquipmentDB: Warning, sound effect %s for unknown event %s", + filename, event.c_str()); + } + } + } + + setEquipment( XML::getProperty(equipmentNode, "id", 0), + currentInfo); + } + + mLoaded = true; +} + +void +EquipmentDB::unload() +{ + // kill EquipmentInfos + for_each(mEquipmentInfos.begin(), mEquipmentInfos.end(), + make_dtor(mEquipmentInfos)); + mEquipmentInfos.clear(); + + mLoaded = false; +} + +EquipmentInfo* +EquipmentDB::get(int id) +{ + if (!mLoaded) { + logger->error("Error: Equipment database used before initialization!"); + } + + EquipmentInfoIterator i = mEquipmentInfos.find(id); + + assert(i != mEquipmentInfos.end()); + + if (i == mEquipmentInfos.end()) + { + logger->log("EquipmentDB: Error, unknown equipment ID# %d", id); + return &mUnknown; + } + else + { + return i->second; + } +} + +void +EquipmentDB::setEquipment(int id, EquipmentInfo* equipmentInfo) +{ + if (mEquipmentInfos.find(id) != mEquipmentInfos.end()) { + logger->log("Warning: Equipment Piece with ID %d defined multiple times", + id); + delete equipmentInfo; + } + else { + mEquipmentInfos[id] = equipmentInfo; + }; +} diff --git a/src/resources/equipmentdb.h b/src/resources/equipmentdb.h index b8618f5f..76866961 100644 --- a/src/resources/equipmentdb.h +++ b/src/resources/equipmentdb.h @@ -1,52 +1,52 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World 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. - * - * The Mana World 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 The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#ifndef _TMW_EQUIPMENT_DB_H -#define _TMW_EQUIPMENT_DB_H - -#include - -#include "equipmentinfo.h" - -namespace EquipmentDB -{ - /** - * Loads the equipment info from Items.xml - */ - void load(); - - /** - * Frees equipment data - */ - void unload(); - - void setEquipment(int id, EquipmentInfo* equipmentInfo); - - EquipmentInfo* get(int id); - - // Equipment database types - typedef std::map EquipmentInfos; - typedef EquipmentInfos::iterator EquipmentInfoIterator; -} - -#endif +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_EQUIPMENT_DB_H +#define _TMW_EQUIPMENT_DB_H + +#include + +#include "equipmentinfo.h" + +namespace EquipmentDB +{ + /** + * Loads the equipment info from Items.xml + */ + void load(); + + /** + * Frees equipment data + */ + void unload(); + + void setEquipment(int id, EquipmentInfo* equipmentInfo); + + EquipmentInfo* get(int id); + + // Equipment database types + typedef std::map EquipmentInfos; + typedef EquipmentInfos::iterator EquipmentInfoIterator; +} + +#endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 70ead6ab..7f30ebe6 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: + * $Id$ */ #include "itemdb.h" diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h index c080194b..54a07c46 100644 --- a/src/resources/itemdb.h +++ b/src/resources/itemdb.h @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: itemdb.h 2650 2006-09-03 15:00:47Z b_lindeijer $ + * $Id$ */ #ifndef _TMW_ITEM_MANAGER_H -- cgit v1.2.3-70-g09d2