diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-10-07 00:12:32 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-10-07 00:12:32 +0000 |
commit | a246c08cef5e4d598fc07a681eb971bfbcf01519 (patch) | |
tree | ff1813b11379ddef2c5be627aafcf3329170a293 /src | |
parent | 09db562f2fca5c49fa1a92ba0b6dc60db479ae08 (diff) | |
download | mana-client-a246c08cef5e4d598fc07a681eb971bfbcf01519.tar.gz mana-client-a246c08cef5e4d598fc07a681eb971bfbcf01519.tar.bz2 mana-client-a246c08cef5e4d598fc07a681eb971bfbcf01519.tar.xz mana-client-a246c08cef5e4d598fc07a681eb971bfbcf01519.zip |
Modified finding NPC as by timonator's suggestion in order to allow NPCs to be
clicked on their heads too. Also made start to tile engine improvement by
adding the Sprite class that is now used by the floor items for being displayed
on the map. Finally added documentation to Item class and splitted out
Properties class from Map.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/being.cpp | 13 | ||||
-rw-r--r-- | src/engine.cpp | 15 | ||||
-rw-r--r-- | src/engine.h | 2 | ||||
-rwxr-xr-x | src/floor_item.cpp | 72 | ||||
-rwxr-xr-x | src/floor_item.h | 39 | ||||
-rw-r--r-- | src/game.cpp | 2 | ||||
-rw-r--r-- | src/gui/gui.cpp | 19 | ||||
-rw-r--r-- | src/item.cpp | 16 | ||||
-rw-r--r-- | src/item.h | 185 | ||||
-rw-r--r-- | src/map.cpp | 49 | ||||
-rw-r--r-- | src/map.h | 31 | ||||
-rw-r--r-- | src/properties.h | 84 | ||||
-rw-r--r-- | src/resources/itemmanager.cpp | 10 | ||||
-rw-r--r-- | src/resources/resourcemanager.cpp | 2 | ||||
-rw-r--r-- | src/sprite.h | 76 |
16 files changed, 425 insertions, 194 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 0cf92c0f..25f60cf7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -172,9 +172,11 @@ tmw_SOURCES = graphic/spriteset.cpp \ openglgraphics.cpp\ openglgraphics.h \ playerinfo.h \ + properties.h \ serverinfo.h \ sound.cpp \ - sound.h + sound.h \ + sprite.h # set the include path found by configure INCLUDES = \ diff --git a/src/being.cpp b/src/being.cpp index 4301b0a9..5cdd8c01 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -118,7 +118,11 @@ Being *findNode(Uint16 x, Uint16 y) for (i = beings.begin(); i != beings.end(); i++) { Being *being = (*i); // Return being if found and it is not a dead monster - if (being->x == x && being->y == y && being->action != Being::MONSTER_DEAD) { + if (being->x == x && + (being->y == y || + (being->getType() == Being::NPC && being->y == y + 1)) && + being->action != Being::MONSTER_DEAD) + { return being; } } @@ -131,8 +135,11 @@ Being* findNode(Uint16 x, Uint16 y, Being::Type type) for (i = beings.begin(); i != beings.end(); i++) { Being *being = (*i); // Check if is a NPC (only low job ids) - if (being->x == x && being->y == y && - being->getType() == type && being->action != Being::MONSTER_DEAD) + if (being->x == x && + (being->y == y || + (being->getType() == Being::NPC && being->y == y + 1)) && + being->getType() == type && + being->action != Being::MONSTER_DEAD) { return being; } diff --git a/src/engine.cpp b/src/engine.cpp index 1dd7c752..4d934504 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -65,6 +65,7 @@ gcn::Label *debugInfo; std::map<int, Spriteset*> monsterset; ItemManager *itemDb; /**< Item database object */ +Spriteset *itemset; char hairtable[16][4][2] = { // S(x,y) W(x,y) N(x,y) E(x,y) @@ -294,20 +295,6 @@ void Engine::draw() mCurrentMap->draw(graphics, map_x, map_y, 1); } - // Draw items - for (std::list<FloorItem*>::iterator i = floorItems.begin(); i != floorItems.end(); i++) - { - FloorItem *floorItem = (*i); - if (itemDb->getItemInfo(floorItem->getItemId())->getImage() > 0) { - Image *image = itemset->spriteset[itemDb->getItemInfo( - floorItem->getItemId())->getImage() - 1]; - - graphics->drawImage(image, - floorItem->getX() * 32 - map_x, - floorItem->getY() * 32 - map_y); - } - } - // Draw nodes for (std::list<Being*>::iterator i = beings.begin(); i != beings.end(); i++) { diff --git a/src/engine.h b/src/engine.h index 03b33b5e..49a307f5 100644 --- a/src/engine.h +++ b/src/engine.h @@ -69,7 +69,7 @@ class Engine void draw(); private: - Spriteset *emotionset, *npcset, *weaponset, *itemset; + Spriteset *emotionset, *npcset, *weaponset; Map *mCurrentMap; Image *attackTarget; }; diff --git a/src/floor_item.cpp b/src/floor_item.cpp index 691c5acd..a1b83a75 100755 --- a/src/floor_item.cpp +++ b/src/floor_item.cpp @@ -22,14 +22,52 @@ */ #include "floor_item.h" +#include "sprite.h" +#include "graphic/spriteset.h" +#include "resources/itemmanager.h" +#include "resources/iteminfo.h" #include <list> -std::list<FloorItem*> floorItems; +extern Spriteset *itemset; + +typedef std::list<FloorItem*> FloorItems; +FloorItems floorItems; + +FloorItem::FloorItem(unsigned int id, + unsigned int itemId, + unsigned short x, + unsigned short y, + Map *map): + mId(id), + mItemId(itemId), + mX(x), + mY(y), + mMap(map) +{ + // Retrieve item image using a global itemset and itemDb (alternative?) + Image *image = itemset->spriteset[ + itemDb->getItemInfo(itemId)->getImage() - 1]; + + // Create the sprite representing this floor item + mSprite = new Sprite(mX * map->getTileWidth(), + mY * map->getTileHeight(), + image); + + // Add the representative sprite to the map + mSpriteIterator = mMap->addSprite(mSprite); +} + +FloorItem::~FloorItem() +{ + // Remove and delete the representative sprite + mMap->removeSprite(mSpriteIterator); + delete mSprite; +} void empty_floor_items() { - std::list<FloorItem *>::iterator i; + FloorItems::iterator i; for (i = floorItems.begin(); i != floorItems.end(); i++) { delete (*i); } @@ -41,11 +79,14 @@ void add_floor_item(FloorItem *floorItem) floorItems.push_back(floorItem); } -void remove_floor_item(unsigned int int_id) +void remove_floor_item(unsigned int id) { - std::list<FloorItem *>::iterator i; - for (i = floorItems.begin(); i != floorItems.end(); i++) { - if ((*i)->getId() == int_id) { + FloorItems::iterator i; + + for (i = floorItems.begin(); i != floorItems.end(); i++) + { + if ((*i)->getId() == id) + { delete (*i); floorItems.erase(i); return; @@ -55,25 +96,34 @@ void remove_floor_item(unsigned int int_id) unsigned int find_floor_item_by_cor(unsigned short x, unsigned short y) { - std::list<FloorItem *>::iterator i; - for (i = floorItems.begin(); i != floorItems.end(); i++) { + FloorItems::iterator i; + + for (i = floorItems.begin(); i != floorItems.end(); i++) + { FloorItem *floorItem = (*i); + if (floorItem->getX() == x && floorItem->getY() == y) { return floorItem->getId(); } } + return 0; } FloorItem *find_floor_item_by_id(unsigned int int_id) { - std::list<FloorItem*>::iterator i; - for (i = floorItems.begin(); i != floorItems.end(); i++) { + FloorItems::iterator i; + + for (i = floorItems.begin(); i != floorItems.end(); i++) + { FloorItem *floorItem = (*i); - if (floorItem->getId() == int_id) { + + if (floorItem->getId() == int_id) + { return floorItem; } } + return NULL; } diff --git a/src/floor_item.h b/src/floor_item.h index cd3293b4..5563da24 100755 --- a/src/floor_item.h +++ b/src/floor_item.h @@ -21,8 +21,12 @@ * $Id$ */ -#ifndef _TMW_FLOORITEM_H -#define _TMW_FLOORITEM_H +#ifndef _TMW_FLOORITEM_H_ +#define _TMW_FLOORITEM_H_ + +class Map; + +#include "map.h" /** * An item lying on the floor. @@ -36,38 +40,41 @@ class FloorItem FloorItem(unsigned int id, unsigned int itemId, unsigned short x, - unsigned short y): - id(itemId), - int_id(id), - x(x), - y(y) - { - } + unsigned short y, + Map *map); + + /** + * Destructor. + */ + ~FloorItem(); /** * Returns instance id of this item. */ - unsigned int getId() { return int_id; } + unsigned int getId() { return mId; } /** * Returns the item id. */ - unsigned int getItemId() { return id; } + unsigned int getItemId() { return mItemId; } /** * Returns the x coordinate. */ - unsigned short getX() { return x; } + unsigned short getX() { return mX; } /** * Returns the y coordinate. */ - unsigned short getY() { return y; } + unsigned short getY() { return mY; } private: - unsigned int id; - unsigned int int_id; - unsigned short x, y; + unsigned int mId; + unsigned int mItemId; + unsigned short mX, mY; + Sprite *mSprite; + Sprites::iterator mSpriteIterator; + Map *mMap; }; /** Removes all items from the list */ diff --git a/src/game.cpp b/src/game.cpp index 5c220155..51848441 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1859,7 +1859,7 @@ void do_parse() Uint16 y = msg.readShort(); msg.skip(4); // amount,subX,subY / subX,subY,amount - add_floor_item(new FloorItem(id, itemId, x, y)); + add_floor_item(new FloorItem(id, itemId, x, y, tiledMap)); } break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 48cbd522..365d8eba 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -192,7 +192,8 @@ Gui::~Gui() delete guiInput; } -void Gui::logic() +void +Gui::logic() { gcn::Gui::logic(); @@ -201,7 +202,8 @@ void Gui::logic() mFocusHandler->applyChanges(); } -void Gui::draw() +void +Gui::draw() { mGraphics->pushClipArea(mTop->getDimension()); mTop->draw(mGraphics); @@ -212,19 +214,24 @@ void Gui::draw() if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS || button & SDL_BUTTON(1)) && mCustomCursor) { - dynamic_cast<Graphics*>(mGraphics)->drawImage(mMouseCursor, mouseX - 5, mouseY - 2); + dynamic_cast<Graphics*>(mGraphics)->drawImage(mMouseCursor, + mouseX - 5, + mouseY - 2); } mGraphics->popClipArea(); } -void Gui::mousePress(int mx, int my, int button) +void +Gui::mousePress(int mx, int my, int button) { // Mouse pressed on window container (basically, the map) // When conditions for walking are met, set new player destination - if (player_node && player_node->action != Being::DEAD && current_npc == 0 && - button == gcn::MouseInput::LEFT) + if (player_node && + player_node->action != Being::DEAD && + current_npc == 0 && + button == gcn::MouseInput::LEFT) { Map *tiledMap = engine->getCurrentMap(); int tilex = mx / 32 + camera_x; diff --git a/src/item.cpp b/src/item.cpp index e49de630..3cea30e5 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -21,19 +21,3 @@ * $Id$ */ -#include "item.h" -#include "resources/itemmanager.h" - -Item::Item(int id, int quantity, bool equipment, bool equipped): - id(id), quantity(quantity), equipment(equipment), equipped(equipped) -{ -} - -Item::~Item() -{ -} - -ItemInfo* Item::getInfo() -{ - return itemDb->getItemInfo(id); -} @@ -21,99 +21,112 @@ * $Id$ */ -#ifndef _ITEM_H -#define _ITEM_H +#ifndef _ITEM_H_ +#define _ITEM_H_ -class ItemInfo; +#include "resources/itemmanager.h" +/** + * Represents one or more instances of a certain item type. + */ class Item { public: - Item(int id=-1, int quantity=0, - bool equipment=false, bool equipped=false); - - ~Item(); - - void setId(int id); - int getId(); - - void setQuantity(int quantity); - void increaseQuantity(int amount); - int getQuantity(); - - void setEquipment(bool equipment); - bool isEquipment(); - - void setEquipped(bool equipped); - bool isEquipped(); - - int getInvIndex(); - void setInvIndex(int index); - - ItemInfo* getInfo(); + /** + * Constructor. + */ + Item(int id = -1, int quantity = 0, + bool equipment = false, bool equipped = false): + mId(id), + mQuantity(quantity), + mEquipment(equipment), + mEquipped(equipped) + { + } + + /** + * Destructor. + */ + ~Item() {} + + /** + * Sets the item id, identifying the item type. + */ + void + setId(int id) { mId = id; } + + /** + * Returns the item id. + */ + int + getId() const { return mId; } + + /** + * Sets the number of items. + */ + void + setQuantity(int quantity) { mQuantity = quantity; } + + /** + * Increases the number of items by the given amount. + */ + void + increaseQuantity(int amount) { mQuantity += amount; } + + /** + * Returns the number of items. + */ + int + getQuantity() const { return mQuantity; } + + /** + * Sets wether this item is considered equipment. + */ + void + setEquipment(bool equipment) { mEquipment = equipment; } + + /** + * Returns wether this item is considered equipment. + */ + bool + isEquipment() const { return mEquipment; } + + /** + * Sets wether this item is equipped. + */ + void + setEquipped(bool equipped) { mEquipped = equipped; } + + /** + * Returns wether this item is equipped. + */ + bool + isEquipped() const { return mEquipped; } + + /** + * Sets the inventory index of this item. + */ + void + setInvIndex(int index) { mInvIndex = index; } + + /** + * Returns the inventory index of this item. + */ + int + getInvIndex() const { return mInvIndex; } + + /** + * Returns information about this item type. + */ + ItemInfo* + getInfo() const { return itemDb->getItemInfo(mId); } protected: - int id; - int quantity; - bool equipment; - bool equipped; - - int invIndex; + int mId; /**< Item type id. */ + int mQuantity; /**< Number of items. */ + bool mEquipment; /**< Item is equipment. */ + bool mEquipped; /**< Item is equipped. */ + int mInvIndex; /**< Inventory index. */ }; -inline void Item::setId(int id) -{ - this->id = id; -} - -inline int Item::getId() -{ - return id; -} - -inline void Item::setQuantity(int quantity) -{ - this->quantity = quantity; -} - -inline void Item::increaseQuantity(int amount) -{ - this->quantity += amount; -} - -inline int Item::getQuantity() -{ - return quantity; -} - -inline void Item::setEquipment(bool equipment) -{ - this->equipment = equipment; -} - -inline bool Item::isEquipment() -{ - return equipment; -} - -inline void Item::setEquipped(bool equipped) -{ - this->equipped = equipped; -} - -inline bool Item::isEquipped() -{ - return equipped; -} - -inline int Item::getInvIndex() -{ - return invIndex; -} - -inline void Item::setInvIndex(int index) -{ - this->invIndex = index; -} - #endif diff --git a/src/map.cpp b/src/map.cpp index 583a01be..3237b54a 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -26,6 +26,7 @@ #include "being.h" #include "graphics.h" #include "resources/image.h" +#include "sprite.h" #include <queue> @@ -85,9 +86,22 @@ Map::addTileset(Tileset *tileset) tilesets.push_back(tileset); } +bool spriteCompare(const Sprite *a, const Sprite *b) +{ + return a->getY() < b->getY(); +} + void Map::draw(Graphics *graphics, int scrollX, int scrollY, int layer) { + // If drawing the fringe layer, make sure sprites are sorted + Sprites::iterator si; + if (layer == 1) + { + mSprites.sort(spriteCompare); + si = mSprites.begin(); + } + int startX = scrollX / 32; int startY = scrollY / 32; int endX = (graphics->getWidth() + scrollX + 31) / 32; @@ -100,6 +114,17 @@ Map::draw(Graphics *graphics, int scrollX, int scrollY, int layer) for (int y = startY; y < endY; y++) { + // If drawing the fringe layer, make sure all sprites above this row of + // tiles have been drawn + if (layer == 1) + { + while (si != mSprites.end() && (*si)->getY() < y * 32) + { + (*si)->draw(graphics, -scrollX, -scrollY); + si++; + } + } + for (int x = startX; x < endX; x++) { Image *img = getTile(x, y, layer); @@ -220,29 +245,17 @@ Map::getMetaTile(int x, int y) return &metaTiles[x + y * mWidth]; } -std::string -Map::getProperty(const std::string &name) -{ - std::map<std::string,std::string>::iterator i = properties.find(name); - - if (i != properties.end()) - { - return (*i).second; - } - - return ""; -} - -bool -Map::hasProperty(const std::string &name) +Sprites::iterator +Map::addSprite(Sprite *sprite) { - return (properties.find(name) != properties.end()); + mSprites.push_front(sprite); + return mSprites.begin(); } void -Map::setProperty(const std::string &name, const std::string &value) +Map::removeSprite(Sprites::iterator iterator) { - properties[name] = value; + mSprites.erase(iterator); } std::list<PATH_NODE> @@ -21,20 +21,25 @@ * $Id$ */ -#ifndef _TMW_MAP_H -#define _TMW_MAP_H +#ifndef _TMW_MAP_H_ +#define _TMW_MAP_H_ #include <list> #include <map> #include <vector> +#include "properties.h" class Being; class Graphics; class Image; class Tileset; +class Sprite; struct PATH_NODE; +typedef std::vector<Tileset*> Tilesets; +typedef std::list<Sprite*> Sprites; + /** * A meta tile stores additional information about a location on a tile map. * This is information that doesn't need to be repeated for each tile in each @@ -81,7 +86,7 @@ class Location /** * A tile map. */ -class Map +class Map : public Properties { public: /** @@ -178,22 +183,16 @@ class Map findPath(int startX, int startY, int destX, int destY); /** - * Get a map property. - * - * @return the value of the given property or an empty string when it - * doesn't exist. + * Adds a sprite to the map. */ - std::string getProperty(const std::string &name); + Sprites::iterator + addSprite(Sprite *sprite); /** - * Returns whether a certain property is available. + * Removes a sprite from the map. */ - bool hasProperty(const std::string &name); - - /** - * Set a map property. - */ - void setProperty(const std::string &name, const std::string &value); + void + removeSprite(Sprites::iterator iterator); private: /** @@ -215,8 +214,8 @@ class Map Image **tiles; std::map<std::string,std::string> properties; - typedef std::vector<Tileset*> Tilesets; Tilesets tilesets; + Sprites mSprites; // Pathfinding members int onClosedList, onOpenList; diff --git a/src/properties.h b/src/properties.h new file mode 100644 index 00000000..ccf8cd00 --- /dev/null +++ b/src/properties.h @@ -0,0 +1,84 @@ +/* + * The Mana World + * Copyright 2004 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_PROPERTIES_H_ +#define _TMW_PROPERTIES_H_ + +#include <map> +#include <string> + +/** + * A class holding a set of properties. + */ +class Properties +{ + public: + virtual + ~Properties() {} + + /** + * Get a map property. + * + * @return the value of the given property or an empty string when it + * doesn't exist. + */ + const std::string& + getProperty(const std::string &name) + { + const static std::string undefined = ""; + std::map<std::string, std::string>::const_iterator i = + properties.find(name); + + if (i != properties.end()) + { + return (*i).second; + } + else + { + return undefined; + } + } + + /** + * Returns whether a certain property is available. + */ + bool + hasProperty(const std::string &name) + { + return (properties.find(name) != properties.end()); + } + + /** + * Set a map property. + */ + void + setProperty(const std::string &name, const std::string &value) + { + properties[name] = value; + } + + private: + std::map<std::string, std::string> properties; +}; + +#endif diff --git a/src/resources/itemmanager.cpp b/src/resources/itemmanager.cpp index caa26f5b..6fac63fd 100644 --- a/src/resources/itemmanager.cpp +++ b/src/resources/itemmanager.cpp @@ -20,7 +20,7 @@ * * $Id$ */ - + #include <libxml/tree.h> #include "iteminfo.h" @@ -126,11 +126,15 @@ ItemManager::~ItemManager() delete unknown; } -ItemInfo *ItemManager::getItemInfo(int id) +ItemInfo* +ItemManager::getItemInfo(int id) { if (db.find(id) != db.end()) + { return db[id]; + } else + { return unknown; + } } - diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index 4a8a010a..e9595093 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -31,7 +31,6 @@ #include "soundeffect.h" #include "../log.h" -#include "../gui/button.h" ResourceManager *ResourceManager::instance = NULL; @@ -50,7 +49,6 @@ ResourceManager::~ResourceManager() { Resource *res = resources.begin()->second; std::string id = res->getIdPath(); - int references = 0; do { diff --git a/src/sprite.h b/src/sprite.h new file mode 100644 index 00000000..97851138 --- /dev/null +++ b/src/sprite.h @@ -0,0 +1,76 @@ +/* + * The Mana World + * Copyright 2004 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_SPRITE_H_ +#define _TMW_SPRITE_H_ + +#include "graphics.h" + +/** + * A sprite is some visible object on a map. + */ +class Sprite +{ + public: + /** + * Constructor. + */ + Sprite(int x = 0, int y = 0, Image *image = NULL): + mX(x), + mY(y), + mImage(image) + { + } + + /** + * Draws the sprite to the given graphics context. + * + * Note: this function could be simplified if the graphics context + * would support setting a translation offset. It already does this + * partly with the clipping rectangle support. + */ + void + draw(Graphics *graphics, int offsetX, int offsetY) + { + graphics->drawImage(mImage, mX + offsetX, mY + offsetY); + } + + /** + * Returns the X coordinate of the sprite. + */ + int + getY() const { return mY; } + + /** + * Returns the Y coordinate of the sprite. + */ + int + getX() const { return mX; } + + private: + int mX; /**< X coordinate in pixels. */ + int mY; /**< Y coordinate in pixels. */ + Image *mImage; /**< The image currently representing this sprite. */ +}; + +#endif |