diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2007-08-22 16:07:11 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2007-08-22 16:07:11 +0000 |
commit | 10ebf4484985b98e9248c8de84b35af9b6e26d3a (patch) | |
tree | 29a1f79bd66505a80e4dfeda31230ed2df97798d | |
parent | 353560a2829fb9b1d9d26121658ce83589c4f5ef (diff) | |
download | mana-10ebf4484985b98e9248c8de84b35af9b6e26d3a.tar.gz mana-10ebf4484985b98e9248c8de84b35af9b6e26d3a.tar.bz2 mana-10ebf4484985b98e9248c8de84b35af9b6e26d3a.tar.xz mana-10ebf4484985b98e9248c8de84b35af9b6e26d3a.zip |
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.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | src/gui/itemshortcutcontainer.cpp | 8 | ||||
-rw-r--r-- | src/keyboardconfig.cpp | 2 | ||||
-rw-r--r-- | src/net/beinghandler.cpp | 16 | ||||
-rw-r--r-- | src/net/equipmenthandler.cpp | 8 | ||||
-rw-r--r-- | src/resources/equipmentdb.cpp | 356 | ||||
-rw-r--r-- | src/resources/equipmentdb.h | 104 | ||||
-rw-r--r-- | src/resources/itemdb.cpp | 2 | ||||
-rw-r--r-- | src/resources/itemdb.h | 2 |
9 files changed, 262 insertions, 243 deletions
@@ -5,6 +5,13 @@ * data/graphics/gui/CMakeLists.txt, data/graphics/gui/Makefile.am: Added close button and item shortcut backgrounds to files that will be installed. + * src/gui/itemshortcutcontainer.cpp: Make sure mGridWidth and + mGridHeight are initialized properly (fixes arithmetic exception in + ItemShortcutContainer::draw). + * src/keyboardconfig.cpp: Changed default sitting key back to 's'. + * src/net/equipmenthandler.cpp: Removed a line that attempted to set + the player's weapon sprite with each kind of equipment. Seems to work + fine without as well. 2007-08-22 Philipp Sehmisch <tmw@crushnet.org> 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 <equipment>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 <sprite>s and <sound>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 <cassert> + +#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 <equipment>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 <sprite>s and <sound>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 <map>
-
-#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<int, EquipmentInfo*> 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 <map> + +#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<int, EquipmentInfo*> 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
|