/* * 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 */ #ifndef _TMW_MAP_H #define _TMW_MAP_H #include #include #include const unsigned int DEFAULT_TILE_WIDTH = 32; const unsigned int DEFAULT_TILE_HEIGHT = 32; struct PATH_NODE { PATH_NODE(unsigned short u, unsigned short v) : x(u), y(v) {} unsigned short x, y; }; /** * 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 * layer of the map. */ class MetaTile { public: /** * Constructor. */ MetaTile(); // Pathfinding members int Fcost; /**< Estimation of total path cost */ int Gcost; /**< Cost from start to this location */ int Hcost; /**< Estimated cost to goal */ int whichList; /**< No list, open list or closed list */ int parentX; /**< X coordinate of parent tile */ int parentY; /**< Y coordinate of parent tile */ char blockmask; /**< walkability bitfield */ }; /** * A location on a tile map. Used for pathfinding, open list. */ class Location { public: /** * Constructor. */ Location(int x, int y, MetaTile *tile); /** * Comparison operator. */ bool operator< (const Location &loc) const; int x, y; MetaTile *tile; }; /** * A tile map. */ class Map { public: enum BlockType { BLOCKTYPE_NONE = -1, BLOCKTYPE_WALL, BLOCKTYPE_CHARACTER, BLOCKTYPE_MONSTER, NB_BLOCKTYPES }; /** * Constructor that takes initial map size as parameters. */ Map(int width = 0, int height = 0, int twidth = 32, int theight = 32); /** * Destructor. */ ~Map(); /** * Sets the size of the map. This will destroy any existing map data. */ void setSize(int mWidth, int height); /** * Get tile reference. */ MetaTile *getMetaTile(int x, int y); /** * Marks a tile as occupied */ void blockTile(int x, int y, BlockType type); /** * Marks a tile as unoccupied */ void freeTile(int x, int y, BlockType type); /** * Gets walkability for a tile with a blocking bitmask */ bool getWalk(int x, int y, char walkmask = BLOCKMASK_WALL) const; /** * Returns the width of this map. */ int getWidth() const { return mWidth; } /** * Returns the height of this map. */ int getHeight() const { return mHeight; } /** * Returns the tile width of this map. */ int getTileWidth() const { return tileWidth; } /** * Returns the tile height used by this map. */ int getTileHeight() const { return tileHeight; } /** * Returns a general map property defined in the map file */ const std::string &getProperty(const std::string &key) const; /** * Sets a map property */ void setProperty(const std::string& key, const std::string& val) { mProperties[key] = val; } /** * Find a path from one location to the next. */ std::list findPath(int startX, int startY, int destX, int destY, unsigned char walkmask, int maxCost = 20); /** * Finds a simple path from location to the next. */ std::list findSimplePath(int startX, int startY, int destX, int destY, unsigned char walkmask); private: /** * Blockmasks for different entities */ static const unsigned char BLOCKMASK_WALL = 0x80; // = bin 1000 0000 static const unsigned char BLOCKMASK_CHARACTER = 0x01;// = bin 0000 0001 static const unsigned char BLOCKMASK_MONSTER = 0x02; // = bin 0000 0010 int *mOccupation[NB_BLOCKTYPES]; // map properties int mWidth, mHeight; int tileWidth, tileHeight; std::map mProperties; // Pathfinding members MetaTile *mMetaTiles; int onClosedList, onOpenList; }; #endif