diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-05-11 13:18:07 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-05-11 13:26:25 +0300 |
commit | ad42810bb9484f4930252ecc34b91d83f37e3293 (patch) | |
tree | 69f3bcf9b26bbdb08dde7e3a0fa6648fc432cf12 /src/resources/map/maplayer.h | |
parent | 116349dac9b9d13d0e57e24e345590a8a0e70210 (diff) | |
download | plus-ad42810bb9484f4930252ecc34b91d83f37e3293.tar.gz plus-ad42810bb9484f4930252ecc34b91d83f37e3293.tar.bz2 plus-ad42810bb9484f4930252ecc34b91d83f37e3293.tar.xz plus-ad42810bb9484f4930252ecc34b91d83f37e3293.zip |
Move map related files into resources/map.
Diffstat (limited to 'src/resources/map/maplayer.h')
-rw-r--r-- | src/resources/map/maplayer.h | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/src/resources/map/maplayer.h b/src/resources/map/maplayer.h new file mode 100644 index 000000000..2c3fc23f1 --- /dev/null +++ b/src/resources/map/maplayer.h @@ -0,0 +1,328 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef RESOURCES_MAP_MAPLAYER_H +#define RESOURCES_MAP_MAPLAYER_H + +#include "position.h" +#include "main.h" + +#include "listeners/configlistener.h" + +#include "being/actor.h" + +#include <string> +#include <vector> + +class Image; +class MapItem; +class SpecialLayer; +class ImageVertexes; + +typedef std::vector<ImageVertexes*> MepRowImages; + +class MapRowVertexes final +{ + public: + MapRowVertexes() : + images() + { + images.reserve(30); + } + + A_DELETE_COPY(MapRowVertexes) + + ~MapRowVertexes(); + + MepRowImages images; +}; + +class MapObject final +{ + public: + MapObject(const int type0, const std::string &data0) : + type(type0), data(data0) + { + } + + int type; + std::string data; +}; + +class MapObjectList final +{ + public: + MapObjectList() : + objects() + { + } + + A_DELETE_COPY(MapObjectList) + + std::vector<MapObject> objects; +}; + +/** + * A map layer. Stores a grid of tiles and their offset, and implements layer + * rendering. + */ +class MapLayer final: public ConfigListener +{ + public: + enum Type + { + TILES = 0, + COLLISION, + HEIGHTS + }; + + friend class Map; + + /** + * Constructor, taking layer origin, size and whether this layer is the + * fringe layer. The fringe layer is the layer that draws the actors. + * There can be only one fringe layer per map. + */ + MapLayer(const int x, const int y, const int width, const int height, + const bool isFringeLayer, const int mask); + + A_DELETE_COPY(MapLayer) + + /** + * Destructor. + */ + ~MapLayer(); + + /** + * Set tile image, with x and y in layer coordinates. + */ + void setTile(const int x, const int y, Image *const img); + + /** + * Set tile image with x + y * width already known. + */ + void setTile(const int index, Image *const img) + { mTiles[index] = img; } + + /** + * Draws this layer to the given graphics context. The coordinates are + * expected to be in map range and will be translated to local layer + * coordinates and clipped to the layer's dimensions. + * + * The given actors are only drawn when this layer is the fringe + * layer. + */ + void draw(Graphics *const graphics, + int startX, int startY, int endX, int endY, + const int scrollX, const int scrollY, + const int mDebugFlags) const; + + void drawSDL(Graphics *const graphics); + +#ifdef USE_OPENGL + void drawOGL(Graphics *const graphics); + + void updateOGL(const Graphics *const graphics, + int startX, int startY, + int endX, int endY, + const int scrollX, const int scrollY, + const int mDebugFlags); +#endif + + void updateSDL(const Graphics *const graphics, + int startX, int startY, + int endX, int endY, + const int scrollX, const int scrollY, + const int mDebugFlags); + + void drawFringe(Graphics *const graphics, + int startX, int startY, + int endX, int endY, + const int scrollX, const int scrollY, + const Actors *const actors, + const int mDebugFlags, const int yFix) const; + + bool isFringeLayer() const A_WARN_UNUSED + { return mIsFringeLayer; } + + void setSpecialLayer(SpecialLayer *const val) + { mSpecialLayer = val; } + + void setTempLayer(SpecialLayer *const val) + { mTempLayer = val; } + + int getWidth() const A_WARN_UNUSED + { return mWidth; } + + int getHeight() const A_WARN_UNUSED + { return mHeight; } + + void optionChanged(const std::string &value) override final; + + static int getTileDrawWidth(const Image *img, + const int endX, + int &width) A_WARN_UNUSED; + + private: + int mX; + int mY; + int mWidth; + int mHeight; + Image **mTiles; + SpecialLayer *mSpecialLayer; + SpecialLayer *mTempLayer; + typedef std::vector<MapRowVertexes*> MapRows; + MapRows mTempRows; + int mMask; + bool mIsFringeLayer; /**< Whether the actors are drawn. */ + bool mHighlightAttackRange; +}; + +class SpecialLayer final +{ + public: + friend class Map; + friend class MapLayer; + + SpecialLayer(const int width, const int height); + + A_DELETE_COPY(SpecialLayer) + + ~SpecialLayer(); + + void draw(Graphics *const graphics, int startX, int startY, + int endX, int endY, + const int scrollX, const int scrollY) const; + + MapItem* getTile(const int x, const int y) const A_WARN_UNUSED; + + void setTile(const int x, const int y, MapItem *const item); + + void setTile(const int x, const int y, const int type); + + void addRoad(const Path &road); + + void clean() const; + + private: + int mWidth; + int mHeight; + MapItem **mTiles; +}; + +class MapItem final +{ + public: + friend class Map; + friend class MapLayer; + + enum ItemType + { + EMPTY = 0, + HOME = 1, + ROAD = 2, + CROSS = 3, + ARROW_UP = 4, + ARROW_DOWN = 5, + ARROW_LEFT = 6, + ARROW_RIGHT = 7, + PORTAL = 8, + MUSIC = 9, + ATTACK = 10, + PRIORITY = 11, + IGNORE_ = 12, + PICKUP = 13, + NOPICKUP = 14, + SEPARATOR = 15 + }; + + MapItem(); + + explicit MapItem(const int type); + + MapItem(const int type, std::string comment); + + MapItem(const int type, std::string comment, const int x, const int y); + + A_DELETE_COPY(MapItem) + + ~MapItem(); + + int getType() const A_WARN_UNUSED + { return mType; } + + void setType(const int type); + + void setPos(const int x, const int y); + + int getX() const A_WARN_UNUSED + { return mX; } + + int getY() const A_WARN_UNUSED + { return mY; } + + const std::string &getComment() const A_WARN_UNUSED + { return mComment; } + + void setComment(const std::string &comment) + { mComment = comment; } + + const std::string &getName() const A_WARN_UNUSED + { return mName; } + + void setName(const std::string &name) + { mName = name; } + + void draw(Graphics *const graphics, const int x, const int y, + const int dx, const int dy) const; + + private: + Image *mImage; + std::string mComment; + std::string mName; + int mType; + int mX; + int mY; +}; + +class ObjectsLayer final +{ + public: + ObjectsLayer(const unsigned width, const unsigned height); + + A_DELETE_COPY(ObjectsLayer) + + ~ObjectsLayer(); + + void addObject(const std::string &name, const int type, + const unsigned x, const unsigned y, + unsigned dx, unsigned dy); + + MapObjectList *getAt(const unsigned x, + const unsigned y) const A_WARN_UNUSED; + private: + MapObjectList **mTiles; + unsigned mWidth; + unsigned mHeight; +}; + +#endif // RESOURCES_MAP_MAPLAYER_H |