diff options
author | Andrei Karas <akaras@inbox.ru> | 2017-10-10 22:14:45 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2017-10-10 22:15:57 +0300 |
commit | aa3f63fd497558a02feb3ddbc44f31eac091f39b (patch) | |
tree | 0e28b9b1f0501dd8be9e1a38db4ec1777fa3fbfa /src/resources/map | |
parent | 7c10a6b61e9d06a4ae9cc9f942dfacb6fcfd9d3d (diff) | |
download | plus-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.gz plus-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.bz2 plus-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.xz plus-aa3f63fd497558a02feb3ddbc44f31eac091f39b.zip |
Remove most unused files.
Diffstat (limited to 'src/resources/map')
24 files changed, 0 insertions, 4938 deletions
diff --git a/src/resources/map/location.h b/src/resources/map/location.h deleted file mode 100644 index 44d2619a7..000000000 --- a/src/resources/map/location.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_LOCATION_H -#define RESOURCES_MAP_LOCATION_H - -#include "resources/map/metatile.h" - -#include "localconsts.h" - -/** - * A location on a tile map. Used for pathfinding, open list. - */ -struct Location final -{ - /** - * Constructor. - */ - Location(const int px, - const int py, - MetaTile *const ptile) : - x(px), - y(py), - tile(ptile) - {} - - A_DEFAULT_COPY(Location) - - /** - * Comparison operator. - */ - bool operator< (const Location &loc) const - { - return tile->Fcost > loc.tile->Fcost; - } - - int x, y; - MetaTile *tile; -}; - -#endif // RESOURCES_MAP_LOCATION_H diff --git a/src/resources/map/map.cpp b/src/resources/map/map.cpp deleted file mode 100644 index 6a70048e8..000000000 --- a/src/resources/map/map.cpp +++ /dev/null @@ -1,1786 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/map.h" - -#include "configuration.h" -#include "render/graphics.h" -#include "notifymanager.h" -#include "settings.h" - -#include "being/localplayer.h" - -#include "enums/resources/notifytypes.h" - -#include "enums/resources/map/blockmask.h" -#include "enums/resources/map/mapitemtype.h" - -#include "fs/mkdir.h" - -#include "gui/userpalette.h" - -#include "particle/particle.h" - -#include "resources/ambientlayer.h" - -#include "resources/image/subimage.h" - -#include "resources/loaders/imageloader.h" - -#include "resources/map/location.h" -#include "resources/map/mapheights.h" -#include "resources/map/mapobjectlist.h" -#include "resources/map/maplayer.h" -#include "resources/map/mapitem.h" -#include "resources/map/objectslayer.h" -#include "resources/map/speciallayer.h" -#include "resources/map/tileanimation.h" -#include "resources/map/tileset.h" -#include "resources/map/walklayer.h" - - -#ifdef USE_OPENGL -#include "render/renderers.h" -#endif // USE_OPENGL - -#include "utils/checkutils.h" -#include "utils/delete2.h" -#include "utils/dtor.h" -#include "utils/foreach.h" -#include "utils/timer.h" - -#include <queue> - -#include <sys/stat.h> - -#include <climits> - -#include "debug.h" - -class ActorFunctuator final -{ - public: - A_DEFAULT_COPY(ActorFunctuator) - - bool operator()(const Actor *const a, - const Actor *const b) const - { - if ((a == nullptr) || (b == nullptr)) - return false; - return a->getSortPixelY() < b->getSortPixelY(); - } -} actorCompare; - -Map::Map(const std::string &name, - const int width, - const int height, - const int tileWidth, - const int tileHeight) : - Properties(), - mWidth(width), mHeight(height), - mTileWidth(tileWidth), mTileHeight(tileHeight), - mMaxTileHeight(height), - mMetaTiles(new MetaTile[mWidth * mHeight]), - mWalkLayer(nullptr), - mLayers(), - mDrawUnderLayers(), - mDrawOverLayers(), - mTilesets(), - mActors(), - mHasWarps(false), - mDrawLayersFlags(MapType::NORMAL), - mOnClosedList(1), - mOnOpenList(2), - mBackgrounds(), - mForegrounds(), - mLastAScrollX(0.0F), - mLastAScrollY(0.0F), - mParticleEffects(), - mMapPortals(), - mTileAnimations(), - mName(name), - mOverlayDetail(config.getIntValue("OverlayDetail")), - mOpacity(config.getFloatValue("guialpha")), -#ifdef USE_OPENGL - mOpenGL(intToRenderType(config.getIntValue("opengl"))), -#else // USE_OPENGL - mOpenGL(RENDER_SOFTWARE), -#endif // USE_OPENGL - mPvp(0), - mTilesetsIndexed(false), - mIndexedTilesets(nullptr), - mIndexedTilesetsSize(0), - mActorFixX(0), - mActorFixY(0), - mVersion(0), - mSpecialLayer(new SpecialLayer("special layer", width, height)), - mTempLayer(new SpecialLayer("temp layer", width, height)), - mObjects(new ObjectsLayer(width, height)), - mFringeLayer(nullptr), - mLastX(-1), - mLastY(-1), - mLastScrollX(-1), - mLastScrollY(-1), - mDrawX(-1), - mDrawY(-1), - mDrawScrollX(-1), - mDrawScrollY(-1), - mMask(1), - mAtlas(nullptr), - mHeights(nullptr), - mRedrawMap(true), - mBeingOpacity(false), -#ifdef USE_OPENGL - mCachedDraw(mOpenGL == RENDER_NORMAL_OPENGL || - mOpenGL == RENDER_GLES_OPENGL || - mOpenGL == RENDER_GLES2_OPENGL || - mOpenGL == RENDER_MODERN_OPENGL), -#else // USE_OPENGL - mCachedDraw(false), -#endif // USE_OPENGL - mCustom(false), - mDrawOnlyFringe(false) -{ - config.addListener("OverlayDetail", this); - config.addListener("guialpha", this); - config.addListener("beingopacity", this); - - if (mOpacity != 1.0F) - mBeingOpacity = config.getBoolValue("beingopacity"); - else - mBeingOpacity = false; -} - -Map::~Map() -{ - config.removeListeners(this); - CHECKLISTENERS - - if (mWalkLayer != nullptr) - { - mWalkLayer->decRef(); - mWalkLayer = nullptr; - } - mFringeLayer = nullptr; - delete_all(mLayers); - delete_all(mTilesets); - delete_all(mForegrounds); - delete_all(mBackgrounds); - delete_all(mTileAnimations); - delete2(mSpecialLayer); - delete2(mTempLayer); - delete2(mObjects); - delete_all(mMapPortals); - if (mAtlas != nullptr) - { - mAtlas->decRef(); - mAtlas = nullptr; - } - delete2(mHeights); - delete [] mMetaTiles; -} - -void Map::optionChanged(const std::string &restrict value) restrict2 -{ - if (value == "OverlayDetail") - { - mOverlayDetail = config.getIntValue("OverlayDetail"); - } - else if (value == "guialpha") - { - mOpacity = config.getFloatValue("guialpha"); - if (mOpacity != 1.0F) - mBeingOpacity = config.getBoolValue("beingopacity"); - else - mBeingOpacity = false; - } - else if (value == "beingopacity") - { - if (mOpacity != 1.0F) - mBeingOpacity = config.getBoolValue("beingopacity"); - else - mBeingOpacity = false; - } -} - -void Map::initializeAmbientLayers() restrict2 -{ - // search for "foreground*" or "overlay*" (old term) in map properties - for (int i = 0; /* terminated by a break */; i++) - { - std::string name; - if (hasProperty(std::string("foreground").append( - toString(i)).append("image"))) - { - name = "foreground" + toString(i); - } - else if (hasProperty(std::string("overlay").append( - toString(i)).append("image"))) - { - name = "overlay" + toString(i); - } - else - { - break; // the FOR loop - } - - Image *restrict const img = Loader::getImage( - getProperty(name + "image")); - if (img != nullptr) - { - int mask = atoi(getProperty(name + "mask").c_str()); - if (mask == 0) - mask = 1; - const float parallax = getFloatProperty(name + "parallax"); - mForegrounds.push_back(new AmbientLayer( - name, - img, - getFloatProperty(name + "parallaxX", parallax), - getFloatProperty(name + "parallaxY", parallax), - getFloatProperty(name + "posX"), - getFloatProperty(name + "posY"), - getFloatProperty(name + "scrollX"), - getFloatProperty(name + "scrollY"), - getBoolProperty(name + "keepratio"), - mask)); - - // The AmbientLayer takes control over the image. - img->decRef(); - } - } - - // search for "background*" in map properties - for (int i = 0; hasProperty(std::string("background").append( - toString(i)).append("image")); i ++) - { - const std::string name("background" + toString(i)); - Image *restrict const img = Loader::getImage( - getProperty(name + "image")); - - if (img != nullptr) - { - int mask = atoi(getProperty(name + "mask").c_str()); - if (mask == 0) - mask = 1; - - const float parallax = getFloatProperty(name + "parallax"); - mBackgrounds.push_back(new AmbientLayer( - name, - img, - getFloatProperty(name + "parallaxX", parallax), - getFloatProperty(name + "parallaxY", parallax), - getFloatProperty(name + "posX"), - getFloatProperty(name + "posY"), - getFloatProperty(name + "scrollX"), - getFloatProperty(name + "scrollY"), - getBoolProperty(name + "keepratio"), - mask)); - - // The AmbientLayer takes control over the image. - img->decRef(); - } - } -} - -void Map::addLayer(MapLayer *const layer) restrict2 -{ - mLayers.push_back(layer); - if (layer->isFringeLayer() && (mFringeLayer == nullptr)) - mFringeLayer = layer; -} - -void Map::addTileset(Tileset *const tileset) restrict2 -{ - mTilesets.push_back(tileset); - const int height = tileset->getHeight(); - if (height > mMaxTileHeight) - mMaxTileHeight = height; -} - -void Map::update(const int ticks) restrict2 -{ - // Update animated tiles - FOR_EACH (TileAnimationMapCIter, iAni, mTileAnimations) - { - TileAnimation *restrict const tileAni = iAni->second; - if ((tileAni != nullptr) && tileAni->update(ticks)) - mRedrawMap = true; - } -} - -void Map::draw(Graphics *restrict const graphics, - int scrollX, int scrollY) restrict2 -{ - if (localPlayer == nullptr) - return; - - BLOCK_START("Map::draw") - // Calculate range of tiles which are on-screen - const int endPixelY = graphics->mHeight + scrollY + mTileHeight - 1 - + mMaxTileHeight - mTileHeight; - const int startX = scrollX / mTileWidth - 2; - const int startY = scrollY / mTileHeight; - const int endX = (graphics->mWidth + scrollX + mTileWidth - 1) - / mTileWidth + 1; - const int endY = endPixelY / mTileHeight + 1; - - // Make sure actors are sorted ascending by Y-coordinate - // so that they overlap correctly - BLOCK_START("Map::draw sort") - mActors.sort(actorCompare); - BLOCK_END("Map::draw sort") - - // update scrolling of all ambient layers - updateAmbientLayers(static_cast<float>(scrollX), - static_cast<float>(scrollY)); - - // Draw backgrounds - drawAmbientLayers(graphics, - MapLayerPosition::BACKGROUND_LAYERS, - mOverlayDetail); - - if (mDrawLayersFlags == MapType::BLACKWHITE && (userPalette != nullptr)) - { - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::WALKABLE_HIGHLIGHT)); - - graphics->fillRectangle(Rect(0, 0, - graphics->mWidth, graphics->mHeight)); - } - -#ifdef USE_OPENGL - int updateFlag = 0; - - if (mCachedDraw) - { - if (mLastX != startX || mLastY != startY || mLastScrollX != scrollX - || mLastScrollY != scrollY) - { // player moving - mLastX = startX; - mLastY = startY; - mLastScrollX = scrollX; - mLastScrollY = scrollY; - updateFlag = 2; - } - else if (mRedrawMap || startX != mDrawX || startY != mDrawY || - scrollX != mDrawScrollX || scrollY != mDrawScrollY) - { // player mode to new position - mRedrawMap = false; - mDrawX = startX; - mDrawY = startY; - mDrawScrollX = scrollX; - mDrawScrollY = scrollY; - updateFlag = 1; - } - } -#endif // USE_OPENGL - - if (mDrawOnlyFringe) - { - if (mFringeLayer != nullptr) - { - mFringeLayer->setSpecialLayer(mSpecialLayer); - mFringeLayer->setTempLayer(mTempLayer); - mFringeLayer->drawFringe(graphics, - startX, startY, - endX, endY, - scrollX, scrollY, - mActors); - } - } - else - { -#ifdef USE_OPENGL - if (mCachedDraw) - { - if (updateFlag != 0) - { - FOR_EACH (Layers::iterator, it, mDrawUnderLayers) - { - (*it)->updateOGL(graphics, - startX, startY, - endX, endY, - scrollX, scrollY); - } - FOR_EACH (Layers::iterator, it, mDrawOverLayers) - { - (*it)->updateOGL(graphics, - startX, startY, - endX, endY, - scrollX, scrollY); - } - } - - FOR_EACH (Layers::iterator, it, mDrawUnderLayers) - (*it)->drawOGL(graphics); - - if (mFringeLayer != nullptr) - { - mFringeLayer->setSpecialLayer(mSpecialLayer); - mFringeLayer->setTempLayer(mTempLayer); - mFringeLayer->drawFringe(graphics, - startX, startY, - endX, endY, - scrollX, scrollY, - mActors); - } - - FOR_EACH (Layers::iterator, it, mDrawOverLayers) - (*it)->drawOGL(graphics); - } - else -#endif // USE_OPENGL - { - FOR_EACH (Layers::iterator, it, mDrawUnderLayers) - { - (*it)->draw(graphics, - startX, startY, - endX, endY, - scrollX, scrollY); - } - - if (mFringeLayer != nullptr) - { - mFringeLayer->setSpecialLayer(mSpecialLayer); - mFringeLayer->setTempLayer(mTempLayer); - mFringeLayer->drawFringe(graphics, - startX, startY, - endX, endY, - scrollX, scrollY, - mActors); - } - - FOR_EACH (Layers::iterator, it, mDrawOverLayers) - { - (*it)->draw(graphics, startX, startY, - endX, endY, - scrollX, scrollY); - } - } - } - - // Don't draw if gui opacity == 1 - if (mBeingOpacity) - { - // Draws beings with a lower opacity to make them visible - // even when covered by a wall or some other elements... - ActorsCIter ai = mActors.begin(); - const ActorsCIter ai_end = mActors.end(); - - if (mOpenGL == RENDER_SOFTWARE) - { - while (ai != ai_end) - { - if (Actor *restrict const actor = *ai) - { - const int x = actor->getTileX(); - const int y = actor->getTileY(); - if (x < startX || x > endX || y < startY || y > endY) - { - ++ai; - continue; - } - // For now, just draw actors with only one layer. - if (actor->getNumberOfLayers() == 1) - { - actor->setAlpha(0.3F); - actor->draw(graphics, -scrollX, -scrollY); - actor->setAlpha(1.0F); - } - } - ++ai; - } - } - else - { - while (ai != ai_end) - { - if (Actor *const actor = *ai) - { - actor->setAlpha(0.3F); - actor->draw(graphics, -scrollX, -scrollY); - actor->setAlpha(1.0F); - } - ++ai; - } - } - } - - drawAmbientLayers(graphics, - MapLayerPosition::FOREGROUND_LAYERS, - mOverlayDetail); - BLOCK_END("Map::draw") -} - -#define fillCollision(collision, color) \ - if (x < endX && mMetaTiles[tilePtr].blockmask & collision)\ - {\ - width = mapTileSize;\ - for (int x2 = tilePtr + 1; x < endX; x2 ++)\ - {\ - if (!(mMetaTiles[x2].blockmask & collision))\ - break;\ - width += mapTileSize;\ - x ++;\ - tilePtr ++;\ - }\ - if (width && userPalette)\ - {\ - graphics->setColor(userPalette->getColorWithAlpha(\ - UserColorId::color));\ - graphics->fillRectangle(Rect(\ - x0 * mTileWidth - scrollX, \ - y * mTileHeight - scrollY, \ - width, mapTileSize));\ - }\ - }\ - -void Map::drawCollision(Graphics *restrict const graphics, - const int scrollX, - const int scrollY, - const MapTypeT drawFlags) const restrict2 -{ - const int endPixelY = graphics->mHeight + scrollY + mTileHeight - 1; - int startX = scrollX / mTileWidth; - int startY = scrollY / mTileHeight; - int endX = (graphics->mWidth + scrollX + mTileWidth - 1) / mTileWidth; - int endY = endPixelY / mTileHeight; - - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - if (drawFlags < MapType::SPECIAL) - { - graphics->setColor(userPalette->getColorWithAlpha(UserColorId::NET)); - graphics->drawNet( - startX * mTileWidth - scrollX, - startY * mTileHeight - scrollY, - endX * mTileWidth - scrollX, - endY * mTileHeight - scrollY, - mapTileSize, mapTileSize); - } - - for (int y = startY; y < endY; y++) - { - const int yWidth = y * mWidth; - int tilePtr = startX + yWidth; - for (int x = startX; x < endX; x++, tilePtr++) - { - int width = 0; - const int x0 = x; - - fillCollision(BlockMask::WALL, COLLISION_HIGHLIGHT); - fillCollision(BlockMask::AIR, AIR_COLLISION_HIGHLIGHT); - fillCollision(BlockMask::WATER, WATER_COLLISION_HIGHLIGHT); - fillCollision(BlockMask::GROUNDTOP, GROUNDTOP_COLLISION_HIGHLIGHT); - fillCollision(BlockMask::PLAYERWALL, COLLISION_HIGHLIGHT); - fillCollision(BlockMask::MONSTERWALL, MONSTER_COLLISION_HIGHLIGHT); - } - } -} - -void Map::updateAmbientLayers(const float scrollX, - const float scrollY) restrict2 -{ - BLOCK_START("Map::updateAmbientLayers") - static int lastTick = tick_time; - - if (mLastAScrollX == 0.0F && mLastAScrollY == 0.0F) - { - // First call - initialisation - mLastAScrollX = scrollX; - mLastAScrollY = scrollY; - } - - // Update Overlays - const float dx = scrollX - mLastAScrollX; - const float dy = scrollY - mLastAScrollY; - const int timePassed = get_elapsed_time(lastTick); - - // need check mask to update or not to update - - FOR_EACH (AmbientLayerVectorIter, i, mBackgrounds) - { - AmbientLayer *const layer = *i; - if ((layer != nullptr) && ((layer->mMask & mMask) != 0)) - layer->update(timePassed, dx, dy); - } - - FOR_EACH (AmbientLayerVectorIter, i, mForegrounds) - { - AmbientLayer *const layer = *i; - if ((layer != nullptr) && ((layer->mMask & mMask) != 0)) - layer->update(timePassed, dx, dy); - } - - mLastAScrollX = scrollX; - mLastAScrollY = scrollY; - lastTick = tick_time; - BLOCK_END("Map::updateAmbientLayers") -} - -void Map::drawAmbientLayers(Graphics *restrict const graphics, - const MapLayerPositionT type, - const int detail) const restrict2 -{ - BLOCK_START("Map::drawAmbientLayers") - // Detail 0 = no ambient effects except background image - if (detail <= 0 && type != MapLayerPosition::BACKGROUND_LAYERS) - { - BLOCK_END("Map::drawAmbientLayers") - return; - } - - // find out which layer list to draw - const AmbientLayerVector *restrict layers = nullptr; - switch (type) - { - case MapLayerPosition::FOREGROUND_LAYERS: - layers = &mForegrounds; - break; - case MapLayerPosition::BACKGROUND_LAYERS: - layers = &mBackgrounds; - break; - default: - return; - } - - // Draw overlays - FOR_EACHP (AmbientLayerVectorCIter, i, layers) - { - const AmbientLayer *restrict const layer = *i; - // need check mask to draw or not to draw - if ((layer != nullptr) && ((layer->mMask & mMask) != 0)) - (layer)->draw(graphics, graphics->mWidth, graphics->mHeight); - - // Detail 1: only one overlay, higher: all overlays - if (detail == 1) - break; - } - BLOCK_END("Map::drawAmbientLayers") -} - -const Tileset *Map::getTilesetWithGid(const int gid) const restrict2 -{ - if (gid >= 0 && gid < mIndexedTilesetsSize) - return mIndexedTilesets[gid]; - return nullptr; -} - -void Map::addBlockMask(const int x, const int y, - const BlockTypeT type) restrict2 -{ - if (type == BlockType::NONE || !contains(x, y)) - return; - - const int tileNum = x + y * mWidth; - - switch (type) - { - case BlockType::WALL: - mMetaTiles[tileNum].blockmask |= BlockMask::WALL; - break; - case BlockType::AIR: - mMetaTiles[tileNum].blockmask |= BlockMask::AIR; - break; - case BlockType::WATER: - mMetaTiles[tileNum].blockmask |= BlockMask::WATER; - break; - case BlockType::GROUND: - mMetaTiles[tileNum].blockmask |= BlockMask::GROUND; - break; - case BlockType::GROUNDTOP: - mMetaTiles[tileNum].blockmask |= BlockMask::GROUNDTOP; - break; - case BlockType::PLAYERWALL: - mMetaTiles[tileNum].blockmask |= BlockMask::PLAYERWALL; - break; - case BlockType::MONSTERWALL: - mMetaTiles[tileNum].blockmask |= BlockMask::MONSTERWALL; - break; - default: - case BlockType::NONE: - case BlockType::NB_BLOCKTYPES: - // Do nothing. - break; - } -} - -void Map::setBlockMask(const int x, const int y, - const BlockTypeT type) restrict2 -{ - if (type == BlockType::NONE || !contains(x, y)) - return; - - const int tileNum = x + y * mWidth; - - switch (type) - { - case BlockType::WALL: - mMetaTiles[tileNum].blockmask = BlockMask::WALL; - break; - case BlockType::AIR: - mMetaTiles[tileNum].blockmask = BlockMask::AIR; - break; - case BlockType::WATER: - mMetaTiles[tileNum].blockmask = BlockMask::WATER; - break; - case BlockType::GROUND: - mMetaTiles[tileNum].blockmask = BlockMask::GROUND; - break; - case BlockType::GROUNDTOP: - mMetaTiles[tileNum].blockmask = BlockMask::GROUNDTOP; - break; - case BlockType::PLAYERWALL: - mMetaTiles[tileNum].blockmask = BlockMask::PLAYERWALL; - break; - case BlockType::MONSTERWALL: - mMetaTiles[tileNum].blockmask = BlockMask::MONSTERWALL; - break; - default: - case BlockType::NONE: - case BlockType::NB_BLOCKTYPES: - // Do nothing. - break; - } -} - -bool Map::getWalk(const int x, const int y, - const unsigned char blockWalkMask) const restrict2 -{ - // You can't walk outside of the map - if (x < 0 || y < 0 || x >= mWidth || y >= mHeight) - return false; - - // Check if the tile is walkable - return (mMetaTiles[x + y * mWidth].blockmask & blockWalkMask) == 0; -} - -unsigned char Map::getBlockMask(const int x, - const int y) const restrict2 -{ - // You can't walk outside of the map - if (x < 0 || y < 0 || x >= mWidth || y >= mHeight) - return 0; - - // Check if the tile is walkable - return mMetaTiles[x + y * mWidth].blockmask; -} - -void Map::setWalk(const int x, const int y) restrict2 -{ - addBlockMask(x, y, BlockType::GROUNDTOP); -} - -bool Map::contains(const int x, const int y) const restrict2 -{ - return x >= 0 && y >= 0 && x < mWidth && y < mHeight; -} - -const MetaTile *Map::getMetaTile(const int x, const int y) const restrict2 -{ - return &mMetaTiles[x + y * mWidth]; -} - -Actors::iterator Map::addActor(Actor *const actor) restrict2 -{ - mActors.push_front(actor); -// mSpritesUpdated = true; - return mActors.begin(); -} - -void Map::removeActor(const Actors::iterator &restrict iterator) restrict2 -{ - mActors.erase(iterator); -// mSpritesUpdated = true; -} - -const std::string Map::getMusicFile() const restrict2 -{ - return getProperty("music"); -} - -const std::string Map::getName() const restrict2 -{ - if (hasProperty("name")) - return getProperty("name"); - - return getProperty("mapname"); -} - -const std::string Map::getFilename() const restrict2 -{ - const std::string fileName = getProperty("_filename"); - const size_t lastSlash = fileName.rfind('/') + 1; - return fileName.substr(lastSlash, fileName.rfind('.') - lastSlash); -} - -const std::string Map::getGatName() const restrict2 -{ - const std::string fileName = getProperty("_filename"); - const size_t lastSlash = fileName.rfind('/') + 1; - return fileName.substr(lastSlash, - fileName.rfind('.') - lastSlash).append(".gat"); -} - -Path Map::findPath(const int startX, const int startY, - const int destX, const int destY, - const unsigned char blockWalkMask, - const int maxCost) restrict2 -{ - BLOCK_START("Map::findPath") - // The basic walking cost of a tile. - static const int basicCost = 100; - const int basicCost2 = 100 * 362 / 256; - const float basicCostF = 100.0 * 362 / 256; - - // Path to be built up (empty by default) - Path path; - - if (startX >= mWidth || startY >= mHeight || startX < 0 || startY < 0) - { - BLOCK_END("Map::findPath") - return path; - } - - // Return when destination not walkable - if (!getWalk(destX, destY, blockWalkMask)) - { - BLOCK_END("Map::findPath") - return path; - } - - // Reset starting tile's G cost to 0 - MetaTile *const startTile = &mMetaTiles[startX + startY * mWidth]; - if (startTile == nullptr) - { - BLOCK_END("Map::findPath") - return path; - } - - startTile->Gcost = 0; - - // Declare open list, a list with open tiles sorted on F cost - std::priority_queue<Location> openList; - - // Add the start point to the open list - openList.push(Location(startX, startY, startTile)); - - bool foundPath = false; - - // Keep trying new open tiles until no more tiles to try or target found - while (!openList.empty() && !foundPath) - { - // Take the location with the lowest F cost from the open list. - const Location curr = openList.top(); - openList.pop(); - - const MetaTile *const tile = curr.tile; - - // If the tile is already on the closed list, this means it has already - // been processed with a shorter path to the start point (lower G cost) - if (tile->whichList == mOnClosedList) - continue; - - // Put the current tile on the closed list - curr.tile->whichList = mOnClosedList; - - const int curWidth = curr.y * mWidth; - const int tileGcost = tile->Gcost; - - // Check the adjacent tiles - for (int dy = -1; dy <= 1; dy++) - { - const int y = curr.y + dy; - if (y < 0 || y >= mHeight) - continue; - - const int yWidth = y * mWidth; - const int dy1 = std::abs(y - destY); - - for (int dx = -1; dx <= 1; dx++) - { - // Calculate location of tile to check - const int x = curr.x + dx; - - // Skip if if we're checking the same tile we're leaving from, - // or if the new location falls outside of the map boundaries - if ((dx == 0 && dy == 0) || x < 0 || x >= mWidth) - continue; - - MetaTile *const newTile = &mMetaTiles[x + yWidth]; - - // Skip if the tile is on the closed list or is not walkable - // unless its the destination tile - // +++ probably here "newTile->blockmask & BlockMask::WALL" - // can be removed. It left here only for protect from - // walk on wall in any case - if (newTile->whichList == mOnClosedList || - (((newTile->blockmask & blockWalkMask) != 0) - && !(x == destX && y == destY)) - || ((newTile->blockmask & BlockMask::WALL) != 0)) - { - continue; - } - - // When taking a diagonal step, verify that we can skip the - // corner. - if (dx != 0 && dy != 0) - { - const MetaTile *const t1 = &mMetaTiles[curr.x + - (curr.y + dy) * mWidth]; - const MetaTile *const t2 = &mMetaTiles[curr.x + - dx + curWidth]; - - // on player abilities. - if (((t1->blockmask | t2->blockmask) & blockWalkMask) != 0) - continue; - } - - // Calculate G cost for this route, ~sqrt(2) for moving diagonal - int Gcost = tileGcost + (dx == 0 || dy == 0 - ? basicCost : basicCost2); - - /* Demote an arbitrary direction to speed pathfinding by - adding a defect - Important: as long as the total defect along any path is - less than the basicCost, the pathfinder will still find one - of the shortest paths! */ - if (dx == 0 || dy == 0) - { - // Demote horizontal and vertical directions, so that two - // consecutive directions cannot have the same Fcost. - ++Gcost; - } - -/* - // It costs extra to walk through a being (needs to be enough - // to make it more attractive to walk around). - if (occupied(x, y)) - { - Gcost += 3 * basicCost; - } -*/ - - // Skip if Gcost becomes too much - // Warning: probably not entirely accurate - if (maxCost > 0 && Gcost > maxCost * basicCost) - continue; - - if (newTile->whichList != mOnOpenList) - { - // Found a new tile (not on open nor on closed list) - - /* Update Hcost of the new tile. The pathfinder does not - work reliably if the heuristic cost is higher than the - real cost. In particular, using Manhattan distance is - forbidden here. */ - const int dx1 = std::abs(x - destX); - newTile->Hcost = std::abs(dx1 - dy1) * basicCost + - std::min(dx1, dy1) * (basicCostF); - - // Set the current tile as the parent of the new tile - newTile->parentX = curr.x; - newTile->parentY = curr.y; - - // Update Gcost and Fcost of new tile - newTile->Gcost = Gcost; - newTile->Fcost = Gcost + newTile->Hcost; - - if (x != destX || y != destY) - { - // Add this tile to the open list - newTile->whichList = mOnOpenList; - openList.push(Location(x, y, newTile)); - } - else - { - // Target location was found - foundPath = true; - } - } - else if (Gcost < newTile->Gcost) - { - // Found a shorter route. - // Update Gcost and Fcost of the new tile - newTile->Gcost = Gcost; - newTile->Fcost = Gcost + newTile->Hcost; - - // Set the current tile as the parent of the new tile - newTile->parentX = curr.x; - newTile->parentY = curr.y; - - // Add this tile to the open list (it's already - // there, but this instance has a lower F score) - openList.push(Location(x, y, newTile)); - } - } - } - } - - // Two new values to indicate whether a tile is on the open or closed list, - // this way we don't have to clear all the values between each pathfinding. - if (mOnOpenList > UINT_MAX - 2) - { - // We reset the list memebers value. - mOnClosedList = 1; - mOnOpenList = 2; - - // Clean up the metaTiles - const int size = mWidth * mHeight; - for (int i = 0; i < size; ++i) - mMetaTiles[i].whichList = 0; - } - else - { - mOnClosedList += 2; - mOnOpenList += 2; - } - - // If a path has been found, iterate backwards using the parent locations - // to extract it. - if (foundPath) - { - int pathX = destX; - int pathY = destY; - - while (pathX != startX || pathY != startY) - { - // Add the new path node to the start of the path list - path.push_front(Position(pathX, pathY)); - - // Find out the next parent - const MetaTile *const tile = &mMetaTiles[pathX + pathY * mWidth]; - pathX = tile->parentX; - pathY = tile->parentY; - } - } - - BLOCK_END("Map::findPath") - return path; -} - -void Map::addParticleEffect(const std::string &effectFile, - const int x, const int y, - const int w, const int h) restrict2 -{ - ParticleEffectData newEffect(effectFile, x, y, w, h); - mParticleEffects.push_back(newEffect); -} - -void Map::initializeParticleEffects() const restrict2 -{ - BLOCK_START("Map::initializeParticleEffects") - if (particleEngine == nullptr) - { - BLOCK_END("Map::initializeParticleEffects") - return; - } - - if (config.getBoolValue("particleeffects")) - { - for (STD_VECTOR<ParticleEffectData>::const_iterator - i = mParticleEffects.begin(); - i != mParticleEffects.end(); - ++i) - { - Particle *const p = particleEngine->addEffect( - i->file, - i->x, - i->y); - if ((p != nullptr) && - i->w > 0 && - i->h > 0) - { - p->adjustEmitterSize(i->w, i->h); - } - } - } - BLOCK_END("Map::initializeParticleEffects") -} - -void Map::addExtraLayer() restrict2 -{ - BLOCK_START("Map::addExtraLayer") - if (mSpecialLayer == nullptr) - { - logger->log1("No special layer"); - BLOCK_END("Map::addExtraLayer") - return; - } - const std::string mapFileName = pathJoin(getUserMapDirectory(), - "extralayer.txt"); - logger->log("loading extra layer: " + mapFileName); - struct stat statbuf; - if (stat(mapFileName.c_str(), &statbuf) == 0 && - S_ISREG(statbuf.st_mode)) - { - std::ifstream mapFile; - mapFile.open(mapFileName.c_str(), std::ios::in); - if (!mapFile.is_open()) - { - mapFile.close(); - BLOCK_END("Map::addExtraLayer") - return; - } - char line[201]; - - while (mapFile.getline(line, 200)) - { - std::string buf; - std::string str = line; - if (!str.empty()) - { - std::string x; - std::string y; - std::string type1; - std::string comment; - std::stringstream ss(str); - ss >> x; - ss >> y; - ss >> type1; - ss >> comment; - while (ss >> buf) - comment.append(" ").append(buf); - - const int type = atoi(type1.c_str()); - - if (comment.empty()) - { - if (type < MapItemType::ARROW_UP - || type > MapItemType::ARROW_RIGHT) - { - comment = "unknown"; - } - } - if (type == MapItemType::PORTAL) - { - updatePortalTile(comment, type, atoi(x.c_str()), - atoi(y.c_str()), false); - } - else if (type == MapItemType::HOME) - { - updatePortalTile(comment, type, atoi(x.c_str()), - atoi(y.c_str())); - } - else - { - addPortalTile(comment, type, atoi(x.c_str()), - atoi(y.c_str())); - } - } - } - mapFile.close(); - } - BLOCK_END("Map::addExtraLayer") -} - -void Map::saveExtraLayer() const restrict2 -{ - if (mSpecialLayer == nullptr) - { - logger->log1("No special layer"); - return; - } - const std::string mapFileName = pathJoin(getUserMapDirectory(), - "extralayer.txt"); - logger->log("saving extra layer: " + mapFileName); - - if (mkdir_r(getUserMapDirectory().c_str()) != 0) - { - logger->log(strprintf("%s doesn't exist and can't be created! " - "Exiting.", getUserMapDirectory().c_str())); - return; - } - - std::ofstream mapFile; - mapFile.open(mapFileName.c_str(), std::ios::binary); - if (!mapFile.is_open()) - { - reportAlways("Error opening file for writing: %s", - mapFileName.c_str()); - return; - } - - const int width = mSpecialLayer->mWidth; - const int height = mSpecialLayer->mHeight; - - for (int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - const MapItem *restrict const item = mSpecialLayer->getTile(x, y); - if ((item != nullptr) && item->mType != MapItemType::EMPTY - && item->mType != MapItemType::HOME) - { - mapFile << x << " " << y << " " - << CAST_S32(item->mType) << " " - << item->mComment << std::endl; - } - } - } - mapFile.close(); -} - -std::string Map::getUserMapDirectory() const restrict2 -{ - return pathJoin(settings.serverConfigDir, - getProperty("_realfilename")); -} - -void Map::addRange(const std::string &restrict name, - const int type, - const int x, const int y, - const int dx, const int dy) restrict2 -{ - if (mObjects == nullptr) - return; - - mObjects->addObject(name, type, x / mapTileSize, y / mapTileSize, - dx / mapTileSize, dy / mapTileSize); -} - -void Map::addPortal(const std::string &restrict name, - const int type, - const int x, const int y, - const int dx, const int dy) restrict2 -{ - addPortalTile(name, type, (x / mapTileSize) + (dx / mapTileSize / 2), - (y / mapTileSize) + (dy / mapTileSize / 2)); -} - -void Map::addPortalTile(const std::string &restrict name, - const int type, - const int x, const int y) restrict2 -{ - if (mSpecialLayer != nullptr) - { - mSpecialLayer->setTile(x, y, new MapItem(type, name, x, y)); - mSpecialLayer->updateCache(); - } - - mMapPortals.push_back(new MapItem(type, name, x, y)); -} - -void Map::updatePortalTile(const std::string &restrict name, - const int type, - const int x, const int y, - const bool addNew) restrict2 -{ - MapItem *restrict item = findPortalXY(x, y); - if (item != nullptr) - { - item->mComment = name; - item->setType(type); - item->mX = x; - item->mY = y; - if (mSpecialLayer != nullptr) - { - item = new MapItem(type, name, x, y); - mSpecialLayer->setTile(x, y, item); - mSpecialLayer->updateCache(); - } - } - else if (addNew) - { - addPortalTile(name, type, x, y); - } -} - -MapItem *Map::findPortalXY(const int x, const int y) const restrict2 -{ - FOR_EACH (STD_VECTOR<MapItem*>::const_iterator, it, mMapPortals) - { - if (*it == nullptr) - continue; - - MapItem *restrict const item = *it; - if (item->mX == x && item->mY == y) - return item; - } - return nullptr; -} - -const TileAnimation *Map::getAnimationForGid(const int gid) const restrict2 -{ - if (mTileAnimations.empty()) - return nullptr; - - const TileAnimationMapCIter i = mTileAnimations.find(gid); - return (i == mTileAnimations.end()) ? nullptr : i->second; -} - -void Map::setPvpMode(const int mode) restrict2 -{ - const int oldMode = mPvp; - - if (mode == 0) - mPvp = 0; - else - mPvp |= mode; - - if (mPvp != oldMode && (localPlayer != nullptr)) - { - switch (mPvp) - { - case 0: - NotifyManager::notify(NotifyTypes::PVP_OFF_GVG_OFF); - break; - case 1: - NotifyManager::notify(NotifyTypes::PVP_ON); - break; - case 2: - NotifyManager::notify(NotifyTypes::GVG_ON); - break; - case 3: - NotifyManager::notify(NotifyTypes::PVP_ON_GVG_ON); - break; - default: - NotifyManager::notify(NotifyTypes::PVP_UNKNOWN); - break; - } - } -} - -std::string Map::getObjectData(const unsigned x, const unsigned y, - const int type) const restrict2 -{ - if (mObjects == nullptr) - return ""; - - MapObjectList *restrict const list = mObjects->getAt(x, y); - if (list == nullptr) - return ""; - - STD_VECTOR<MapObject>::const_iterator it = list->objects.begin(); - const STD_VECTOR<MapObject>::const_iterator it_end = list->objects.end(); - while (it != it_end) - { - if ((*it).type == type) - return (*it).data; - ++ it; - } - - return ""; -} - -void Map::indexTilesets() restrict2 -{ - if (mTilesetsIndexed) - return; - - mTilesetsIndexed = true; - - const Tileset *restrict s = nullptr; - size_t sSz = 0; - FOR_EACH (Tilesets::const_iterator, it, mTilesets) - { - const size_t sz = (*it)->size(); - if ((s == nullptr) || CAST_SIZE(s->getFirstGid()) + sSz - < CAST_SIZE((*it)->getFirstGid()) + sz) - { - s = *it; - sSz = sz; - } - } - if (s == nullptr) - { - mIndexedTilesetsSize = 0; - mIndexedTilesets = nullptr; - return; - } - - const int size = CAST_S32(s->getFirstGid()) - + CAST_S32(s->size()); - mIndexedTilesetsSize = size; - mIndexedTilesets = new Tileset*[CAST_SIZE(size)]; - std::fill_n(mIndexedTilesets, size, static_cast<Tileset*>(nullptr)); - - FOR_EACH (Tilesets::const_iterator, it, mTilesets) - { - Tileset *restrict const s2 = *it; - if (s2 != nullptr) - { - const int start = s2->getFirstGid(); - const int end = start + CAST_S32(s2->size()); - for (int f = start; f < end; f ++) - { - if (f < size) - mIndexedTilesets[f] = s2; - } - } - } -} - -void Map::clearIndexedTilesets() restrict2 -{ - if (!mTilesetsIndexed) - return; - - mTilesetsIndexed = false; - delete [] mIndexedTilesets; - mIndexedTilesetsSize = 0; -} - -void Map::reduce() restrict2 -{ -#ifdef USE_SDL2 - return; -#else // USE_SDL2 - - if ((mFringeLayer == nullptr) || - mOpenGL != RENDER_SOFTWARE || - !config.getBoolValue("enableMapReduce")) - { - return; - } - - int cnt = 0; - for (int x = 0; x < mWidth; x ++) - { - for (int y = 0; y < mHeight; y ++) - { - bool correct(true); - bool dontHaveAlpha(false); - - FOR_EACH (LayersCIter, layeri, mLayers) - { - const MapLayer *restrict const layer = *layeri; - if (x >= layer->mWidth || y >= layer->mHeight) - continue; - - // skip layers with flags - if (layer->mTileCondition != -1 || layer->mMask != 1) - continue; - - Image *restrict const img = - layer->mTiles[x + y * layer->mWidth].image; - if (img != nullptr) - { - if (img->hasAlphaChannel() && img->isAlphaCalculated()) - { - if (!img->isAlphaVisible()) - { - dontHaveAlpha = true; - img->setAlphaVisible(false); - } - } - else if (img->mBounds.w > mapTileSize - || img->mBounds.h > mapTileSize) - { - correct = false; - img->setAlphaVisible(true); - break; - } - else if (!img->isHasAlphaChannel()) - { - dontHaveAlpha = true; - img->setAlphaVisible(false); - } - else if (img->hasAlphaChannel()) - { - const uint8_t *restrict const arr = - img->SDLgetAlphaChannel(); - if (arr == nullptr) - continue; - - bool bad(false); - bool stop(false); - int width; - const SubImage *restrict const subImg - = dynamic_cast<SubImage*>(img); - if (subImg != nullptr) - width = subImg->mInternalBounds.w; - else - width = img->mBounds.w; - - for (int f = img->mBounds.x; - f < img->mBounds.x + img->mBounds.w; f ++) - { - for (int d = img->mBounds.y; - d < img->mBounds.y + img->mBounds.h; d ++) - { - const uint8_t chan = arr[f + d * width]; - if (chan != 255) - { - bad = true; - stop = true; - break; - } - } - if (stop) - break; - } - if (!bad) - { - dontHaveAlpha = true; - img->setAlphaVisible(false); - } - else - { - img->setAlphaVisible(true); - } - } - img->setAlphaCalculated(true); - } - } - if (!correct || !dontHaveAlpha) - continue; - - Layers::reverse_iterator ri = mLayers.rbegin(); - while (ri != mLayers.rend()) - { - const MapLayer *restrict const layer = *ri; - if (x >= layer->mWidth || y >= layer->mHeight) - { - ++ ri; - continue; - } - - // skip layers with flags - if (layer->mTileCondition != -1 || layer->mMask != 1) - { - ++ ri; - continue; - } - - const Image *restrict img = - layer->mTiles[x + y * layer->mWidth].image; - if ((img != nullptr) && !img->isAlphaVisible()) - { // removing all down tiles - ++ ri; - while (ri != mLayers.rend()) - { - MapLayer *restrict const layer2 = *ri; - // skip layers with flags - if (layer2->mTileCondition != -1 || layer2->mMask != 1) - { - ++ ri; - continue; - } - const size_t pos = CAST_SIZE( - x + y * layer2->mWidth); - img = layer2->mTiles[pos].image; - if (img != nullptr) - { - layer2->mTiles[pos].image = nullptr; - cnt ++; - } - ++ ri; - } - break; - } - ++ ri; - } - } - } - logger->log("tiles reduced: %d", cnt); -#endif // USE_SDL2 -} - -void Map::addHeights(const MapHeights *restrict const heights) restrict2 -{ - delete mHeights; - mHeights = heights; -} - -uint8_t Map::getHeightOffset(const int x, const int y) const restrict2 -{ - if (mHeights == nullptr) - return 0; - return mHeights->getHeight(x, y); -} - -void Map::updateDrawLayersList() restrict2 -{ - mDrawUnderLayers.clear(); - mDrawOverLayers.clear(); - - if (mDrawOnlyFringe) - return; - - LayersCIter layers = mLayers.begin(); - const LayersCIter layers_end = mLayers.end(); - for (; layers != layers_end; ++ layers) - { - MapLayer *const layer = *layers; - if ((layer->mMask & mMask) == 0) - continue; - - if (layer->isFringeLayer()) - { - ++ layers; - break; - } - - mDrawUnderLayers.push_back(layer); - } - - if (mDrawLayersFlags == MapType::SPECIAL2) - return; - - for (; layers != layers_end; ++ layers) - { - MapLayer *const layer = *layers; - if ((layer->mMask & mMask) == 0) - continue; - - mDrawOverLayers.push_back(layer); - } -} - -void Map::setMask(const int mask) restrict2 -{ - if (mask != mMask) - { - mRedrawMap = true; - mMask = mask; - updateDrawLayersList(); - } -} - -void Map::setMusicFile(const std::string &restrict file) restrict2 -{ - setProperty("music", file); -} - -void Map::addAnimation(const int gid, - TileAnimation *restrict const animation) restrict2 -{ - std::map<int, TileAnimation*>::iterator it = mTileAnimations.find(gid); - if (it != mTileAnimations.end()) - { - logger->log("duplicate map animation with gid = %d", gid); - delete (*it).second; - } - mTileAnimations[gid] = animation; -} - -void Map::setDrawLayersFlags(const MapTypeT &restrict n) restrict2 -{ - mDrawLayersFlags = n; - if (mDrawLayersFlags == MapType::SPECIAL3 || - mDrawLayersFlags == MapType::SPECIAL4 || - mDrawLayersFlags == MapType::BLACKWHITE) - { - mDrawOnlyFringe = true; - } - else - { - mDrawOnlyFringe = false; - } - updateDrawLayersList(); - FOR_EACH (Layers::iterator, it, mLayers) - { - MapLayer *restrict const layer = *it; - layer->setDrawLayerFlags(mDrawLayersFlags); - } -} - -void Map::setActorsFix(const int x, const int y) restrict2 -{ - mActorFixX = x; - mActorFixY = y; - if (mFringeLayer != nullptr) - mFringeLayer->setActorsFix(y); -} - -void Map::updateConditionLayers() restrict2 -{ - mRedrawMap = true; - - FOR_EACH (LayersCIter, it, mLayers) - { - MapLayer *restrict const layer = *it; - if ((layer == nullptr) || layer->mTileCondition == -1) - continue; - layer->updateConditionTiles(mMetaTiles, - mWidth, mHeight); - } -} - -void Map::preCacheLayers() restrict2 -{ - FOR_EACH (LayersCIter, it, mLayers) - { - MapLayer *restrict const layer = *it; - if (layer != nullptr) - layer->updateCache(mWidth, mHeight); - } -} - -int Map::calcMemoryLocal() const -{ - return static_cast<int>(sizeof(Map) + - mName.capacity() + - sizeof(MetaTile) * mWidth * mHeight + - sizeof(MapLayer*) * (mLayers.capacity() + - mDrawUnderLayers.capacity() + - mDrawOverLayers.capacity()) + - sizeof(Tileset*) * mTilesets.capacity() + - sizeof(Actor*) * mActors.size() + - sizeof(AmbientLayer*) * (mBackgrounds.capacity() - + mForegrounds.capacity()) + - sizeof(ParticleEffectData) * mParticleEffects.capacity() + - sizeof(MapItem) * mMapPortals.capacity() + - (sizeof(TileAnimation) + sizeof(int)) * mTileAnimations.size() + - sizeof(Tileset*) * mIndexedTilesetsSize); -} - -int Map::calcMemoryChilds(const int level) const -{ - int sz = 0; - - if (mWalkLayer != nullptr) - sz += mWalkLayer->calcMemory(level + 1); - FOR_EACH (LayersCIter, it, mLayers) - { - sz += (*it)->calcMemory(level + 1); - } - FOR_EACH (Tilesets::const_iterator, it, mTilesets) - { - sz += (*it)->calcMemory(level + 1); - } - FOR_EACH (AmbientLayerVectorCIter, it, mBackgrounds) - { - sz += (*it)->calcMemory(level + 1); - } - FOR_EACH (AmbientLayerVectorCIter, it, mForegrounds) - { - sz += (*it)->calcMemory(level + 1); - } - if (mSpecialLayer != nullptr) - mSpecialLayer->calcMemory(level + 1); - if (mTempLayer != nullptr) - mTempLayer->calcMemory(level + 1); - if (mObjects != nullptr) - mObjects->calcMemory(level + 1); - if (mHeights != nullptr) - mHeights->calcMemory(level + 1); - return sz; -} diff --git a/src/resources/map/map.h b/src/resources/map/map.h deleted file mode 100644 index dc05cb2ea..000000000 --- a/src/resources/map/map.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_MAP_H -#define RESOURCES_MAP_MAP_H - -#include "position.h" - -#include "being/actor.h" - -#include "enums/render/rendertype.h" - -#include "enums/resources/map/blocktype.h" -#include "enums/resources/map/maplayerposition.h" -#include "enums/resources/map/maptype.h" - -#include "listeners/configlistener.h" - -#include "utils/vector.h" - -#include "resources/memorycounter.h" - -#include "resources/map/properties.h" - -class AmbientLayer; -class MapHeights; -class MapItem; -class MapLayer; -class ObjectsLayer; -class Resource; -class SpecialLayer; -class Tileset; -class TileAnimation; -class WalkLayer; - -struct MetaTile; - -typedef STD_VECTOR<Tileset*> Tilesets; -typedef STD_VECTOR<MapLayer*> Layers; -typedef Layers::const_iterator LayersCIter; - -typedef STD_VECTOR<AmbientLayer*> AmbientLayerVector; -typedef AmbientLayerVector::const_iterator AmbientLayerVectorCIter; -typedef AmbientLayerVector::iterator AmbientLayerVectorIter; - -/** - * A tile map. - */ -class Map final : public Properties, - public ConfigListener, - public MemoryCounter -{ - public: - /** - * Constructor, taking map and tile size as parameters. - */ - Map(const std::string &name, - const int width, - const int height, - const int tileWidth, - const int tileHeight); - - A_DELETE_COPY(Map) - - /** - * Destructor. - */ - ~Map(); - - /** - * Initialize ambient layers. Has to be called after all the properties - * are set. - */ - void initializeAmbientLayers() restrict2; - - /** - * Updates animations. Called as needed. - */ - void update(const int ticks = 1) restrict2; - - /** - * Draws the map to the given graphics output. This method draws all - * layers, actors and overlay effects. - */ - void draw(Graphics *restrict const graphics, - int scrollX, - int scrollY) restrict2 A_NONNULL(2); - - /** - * Visualizes collision layer for debugging - */ - void drawCollision(Graphics *restrict const graphics, - const int scrollX, - const int scrollY, - const MapTypeT drawFlags) const - restrict2 A_NONNULL(2); - - /** - * Adds a layer to this map. The map takes ownership of the layer. - */ - void addLayer(MapLayer *const layer) restrict2 A_NONNULL(2); - - /** - * Adds a tileset to this map. The map takes ownership of the tileset. - */ - void addTileset(Tileset *const tileset) restrict2 A_NONNULL(2); - - /** - * Finds the tile set that a tile with the given global id is part of. - */ - const Tileset *getTilesetWithGid(const int gid) const - restrict2 A_WARN_UNUSED; - - /** - * Get tile reference. - */ - const MetaTile *getMetaTile(const int x, - const int y) const - restrict2 A_WARN_UNUSED; - - void addBlockMask(const int x, const int y, - const BlockTypeT type) restrict2; - - void setBlockMask(const int x, const int y, - const BlockTypeT type) restrict2; - - /** - * Gets walkability for a tile with a blocking bitmask. When called - * without walkmask, only blocks against colliding tiles. - */ - bool getWalk(const int x, const int y, - const unsigned char blockWalkMask) const - restrict2 A_WARN_UNUSED; - - void setWalk(const int x, const int y) restrict2; - - unsigned char getBlockMask(const int x, - const int y) const restrict2; - - /** - * Returns the width of this map in tiles. - */ - int getWidth() const restrict2 noexcept2 A_WARN_UNUSED - { return mWidth; } - - /** - * Returns the height of this map in tiles. - */ - int getHeight() const restrict2 noexcept2 A_WARN_UNUSED - { return mHeight; } - - /** - * Returns the tile width of this map. - */ - int getTileWidth() const restrict2 noexcept2 A_WARN_UNUSED - { return mTileWidth; } - - /** - * Returns the tile height used by this map. - */ - int getTileHeight() const restrict2 noexcept2 A_WARN_UNUSED - { return mTileHeight; } - - const std::string getMusicFile() const restrict2 A_WARN_UNUSED; - - void setMusicFile(const std::string &restrict file) restrict2; - - const std::string getName() const restrict2 A_WARN_UNUSED; - - /** - * Gives the map id based on filepath (ex: 009-1) - */ - const std::string getFilename() const restrict2 A_WARN_UNUSED; - - const std::string getGatName() const restrict2 A_WARN_UNUSED; - - /** - * Find a path from one location to the next. - */ - Path findPath(const int startX, const int startY, - const int destX, const int destY, - const unsigned char blockWalkmask, - const int maxCost = 20) restrict2 A_WARN_UNUSED; - - /** - * Adds a particle effect - */ - void addParticleEffect(const std::string &restrict effectFile, - const int x, - const int y, - const int w = 0, - const int h = 0) restrict2; - - /** - * Initializes all added particle effects - */ - void initializeParticleEffects() const restrict2; - - /** - * Adds a tile animation to the map - */ - void addAnimation(const int gid, - TileAnimation *restrict const animation) restrict2 - A_NONNULL(3); - - void setDrawLayersFlags(const MapTypeT &restrict n) restrict2; - - MapTypeT getDrawLayersFlags() const restrict2 A_WARN_UNUSED - { return mDrawLayersFlags; } - - void addExtraLayer() restrict2; - - void saveExtraLayer() const restrict2; - - SpecialLayer *getTempLayer() const restrict2 noexcept2 A_WARN_UNUSED - { return mTempLayer; } - - SpecialLayer *getSpecialLayer() const restrict2 noexcept2 A_WARN_UNUSED - { return mSpecialLayer; } - - void setHasWarps(const bool n) restrict2 noexcept2 - { mHasWarps = n; } - - bool getHasWarps() const restrict2 noexcept2 A_WARN_UNUSED - { return mHasWarps; } - - std::string getUserMapDirectory() const restrict2 A_WARN_UNUSED; - - void addPortal(const std::string &restrict name, - const int type, - const int x, const int y, - const int dx, const int dy) restrict2; - - void addRange(const std::string &restrict name, - const int type, - const int x, const int y, - const int dx, const int dy) restrict2; - - void addPortalTile(const std::string &restrict name, - const int type, - const int x, const int y) restrict2; - - void updatePortalTile(const std::string &restrict name, - const int type, - const int x, const int y, - const bool addNew = true) restrict2; - - const STD_VECTOR<MapItem*> &getPortals() const restrict2 noexcept2 - A_WARN_UNUSED - { return mMapPortals; } - - /** - * Gets the tile animation for a specific gid - */ - const TileAnimation *getAnimationForGid(const int gid) - const restrict2 A_WARN_UNUSED; - - void optionChanged(const std::string &restrict value) - restrict2 override final; - - MapItem *findPortalXY(const int x, - const int y) const restrict2 A_WARN_UNUSED; - - int getActorsCount() const restrict2 A_WARN_UNUSED - { return CAST_S32(mActors.size()); } - - void setPvpMode(const int mode) restrict2; - - int getPvpMode() const restrict2 noexcept2 A_WARN_UNUSED - { return mPvp; } - - const ObjectsLayer* getObjectsLayer() const restrict2 noexcept2 - A_WARN_UNUSED - { return mObjects; } - - std::string getObjectData(const unsigned x, - const unsigned y, - const int type) const - restrict2 A_WARN_UNUSED; - - void indexTilesets() restrict2; - - void clearIndexedTilesets() restrict2; - - void setActorsFix(const int x, const int y) restrict2; - - int getVersion() const restrict2 noexcept2 A_WARN_UNUSED - { return mVersion; } - - void setVersion(const int n) restrict2 noexcept2 - { mVersion = n; } - - void reduce() restrict2; - - void redrawMap() restrict2 noexcept2 - { mRedrawMap = true; } - - bool empty() const restrict2 A_WARN_UNUSED - { return mLayers.empty(); } - - void setCustom(const bool b) restrict2 noexcept2 - { mCustom = b; } - - bool isCustom() const restrict2 noexcept2 A_WARN_UNUSED - { return mCustom; } - - const std::map<int, TileAnimation*> &getTileAnimations() const - restrict2 noexcept2 A_WARN_UNUSED - { return mTileAnimations; } - - void setAtlas(Resource *restrict const atlas) restrict2 noexcept2 - { mAtlas = atlas; } - - const MetaTile *getMetaTiles() const restrict2 noexcept2 - { return mMetaTiles; } - - const WalkLayer *getWalkLayer() const restrict2 noexcept2 - { return mWalkLayer; } - - void setWalkLayer(WalkLayer *restrict const layer) restrict2 noexcept2 - { mWalkLayer = layer; } - - void addHeights(const MapHeights *restrict const heights) restrict2 - A_NONNULL(2); - - uint8_t getHeightOffset(const int x, const int y) const restrict2; - - void setMask(const int mask) restrict2; - - void updateDrawLayersList() restrict2; - - bool isHeightsPresent() const restrict2 noexcept2 - { return mHeights != nullptr; } - - void updateConditionLayers() restrict2; - - void preCacheLayers() restrict2; - - int calcMemoryLocal() const override final; - - int calcMemoryChilds(const int level) const override final; - - std::string getCounterName() const override final - { return mName; } - - bool haveAtlas() const - { return mAtlas != nullptr; } - - protected: - friend class Actor; - friend class Minimap; - - /** - * Adds an actor to the map. - */ - Actors::iterator addActor(Actor *const actor) restrict2 A_NONNULL(2); - - /** - * Removes an actor from the map. - */ - void removeActor(const Actors::iterator &restrict iterator) restrict2; - - private: - /** - * Updates scrolling of ambient layers. Has to be called each game tick. - */ - void updateAmbientLayers(const float scrollX, - const float scrollY) restrict2; - - /** - * Draws the foreground or background layers to the given graphics output. - */ - void drawAmbientLayers(Graphics *restrict const graphics, - const MapLayerPositionT type, - const int detail) const restrict2 A_NONNULL(2); - - /** - * Tells whether the given coordinates fall within the map boundaries. - */ - bool contains(const int x, - const int y) const restrict2 A_WARN_UNUSED; - - const int mWidth; - const int mHeight; - const int mTileWidth; - const int mTileHeight; - int mMaxTileHeight; - MetaTile *const mMetaTiles; - WalkLayer *mWalkLayer; - Layers mLayers; - Layers mDrawUnderLayers; - Layers mDrawOverLayers; - Tilesets mTilesets; - Actors mActors; - bool mHasWarps; - - // draw flags - MapTypeT mDrawLayersFlags; - - // Pathfinding members - unsigned int mOnClosedList; - unsigned int mOnOpenList; - - // Overlay data - AmbientLayerVector mBackgrounds; - AmbientLayerVector mForegrounds; - float mLastAScrollX; - float mLastAScrollY; - - // Particle effect data - struct ParticleEffectData final - { - ParticleEffectData(const std::string &restrict file0, - const int x0, - const int y0, - const int w0, - const int h0) noexcept2 : - file(file0), - x(x0), - y(y0), - w(w0), - h(h0) - { - } - - A_DEFAULT_COPY(ParticleEffectData) - - const2 std::string file; - const2 int x; - const2 int y; - const2 int w; - const2 int h; - }; - STD_VECTOR<ParticleEffectData> mParticleEffects; - - STD_VECTOR<MapItem*> mMapPortals; - - std::map<int, TileAnimation*> mTileAnimations; - - std::string mName; - int mOverlayDetail; - float mOpacity; - const RenderType mOpenGL; - int mPvp; - bool mTilesetsIndexed; - Tileset** mIndexedTilesets; - int mIndexedTilesetsSize; - int mActorFixX; - int mActorFixY; - int mVersion; - - SpecialLayer *mSpecialLayer; - SpecialLayer *mTempLayer; - ObjectsLayer *mObjects; - MapLayer *mFringeLayer; - - int mLastX; - int mLastY; - int mLastScrollX; - int mLastScrollY; - - int mDrawX; - int mDrawY; - int mDrawScrollX; - int mDrawScrollY; - int mMask; - Resource *mAtlas; - const MapHeights *mHeights; - bool mRedrawMap; - bool mBeingOpacity; - bool mCachedDraw; - bool mCustom; - bool mDrawOnlyFringe; -}; - -#endif // RESOURCES_MAP_MAP_H diff --git a/src/resources/map/mapheights.cpp b/src/resources/map/mapheights.cpp deleted file mode 100644 index a6309bbce..000000000 --- a/src/resources/map/mapheights.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 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/>. - */ - -#include "resources/map/mapheights.h" - -#include "debug.h" - -MapHeights::MapHeights(const int width, - const int height) : - MemoryCounter(), - mWidth(width), - mHeight(height), - mTiles(new uint8_t[mWidth * mHeight]) -{ - memset(mTiles, 0, mWidth * mHeight); -} - -MapHeights::~MapHeights() -{ - delete [] mTiles; -} - -void MapHeights::setHeight(const int x, const int y, const uint8_t height) -{ - mTiles[x + y * mWidth] = height; -} - -int MapHeights::calcMemoryLocal() const -{ - return static_cast<int>(sizeof(MapHeights)) + - mWidth * mHeight; -} diff --git a/src/resources/map/mapheights.h b/src/resources/map/mapheights.h deleted file mode 100644 index ef8c4151b..000000000 --- a/src/resources/map/mapheights.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 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_MAPHEIGHTS_H -#define RESOURCES_MAP_MAPHEIGHTS_H - -#include "resources/memorycounter.h" - -#include "utils/cast.h" - -#include "localconsts.h" - -class MapHeights final : public MemoryCounter -{ - public: - friend class Map; - - MapHeights(const int width, const int height); - - A_DELETE_COPY(MapHeights) - - ~MapHeights(); - - void setHeight(const int x, const int y, const uint8_t height); - - uint8_t getHeight(const int x, const int y) const - { - return x < mWidth && - y < mHeight ? mTiles[x + y * mWidth] : CAST_U8(0U); - } - - int calcMemoryLocal() const override final; - - std::string getCounterName() const override final - { return "heights layer"; } - - private: - int mWidth; - int mHeight; - uint8_t *mTiles; -}; - -#endif // RESOURCES_MAP_MAPHEIGHTS_H diff --git a/src/resources/map/mapitem.cpp b/src/resources/map/mapitem.cpp deleted file mode 100644 index ff4b6b13e..000000000 --- a/src/resources/map/mapitem.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/mapitem.h" - -#include "enums/resources/map/mapitemtype.h" - -#include "gui/gui.h" -#include "gui/userpalette.h" - -#include "gui/fonts/font.h" - -#include "resources/image/image.h" - -#include "resources/loaders/imageloader.h" - -#include "render/graphics.h" - -#include "debug.h" - -MapItem::MapItem() : - mImage(nullptr), - mComment(), - mName(), - mType(MapItemType::EMPTY), - mX(-1), - mY(-1) -{ - setType(MapItemType::EMPTY); -} - -MapItem::MapItem(const int type) : - mImage(nullptr), - mComment(), - mName(), - mType(type), - mX(-1), - mY(-1) -{ - setType(type); -} - -MapItem::MapItem(const int type, - const std::string &comment) : - mImage(nullptr), - mComment(comment), - mName(), - mType(type), - mX(-1), - mY(-1) -{ - setType(type); -} - -MapItem::MapItem(const int type, - const std::string &comment, - const int x, - const int y) : - mImage(nullptr), - mComment(comment), - mName(), - mType(type), - mX(x), - mY(y) -{ - setType(type); -} - -MapItem::~MapItem() -{ - if (mImage != nullptr) - { - mImage->decRef(); - mImage = nullptr; - } -} - -void MapItem::setType(const int type) -{ - std::string name; - mType = type; - if (mImage != nullptr) - mImage->decRef(); - - switch (type) - { - case MapItemType::ARROW_UP: - name = "graphics/sprites/arrow_up.png"; - break; - case MapItemType::ARROW_DOWN: - name = "graphics/sprites/arrow_down.png"; - break; - case MapItemType::ARROW_LEFT: - name = "graphics/sprites/arrow_left.png"; - break; - case MapItemType::ARROW_RIGHT: - name = "graphics/sprites/arrow_right.png"; - break; - default: - break; - } - - if (!name.empty()) - mImage = Loader::getImage(name); - else - mImage = nullptr; -} - -void MapItem::setPos(const int x, const int y) -{ - mX = x; - mY = y; -} - -void MapItem::draw(Graphics *const graphics, const int x, const int y, - const int dx, const int dy) const -{ - BLOCK_START("MapItem::draw") - if (mImage != nullptr) - graphics->drawImage(mImage, x, y); - - switch (mType) - { - case MapItemType::ROAD: - case MapItemType::CROSS: - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::ROAD_POINT)); - graphics->fillRectangle(Rect(x + dx / 3, y + dy / 3, - dx / 3, dy / 3)); - break; - case MapItemType::HOME: - { - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::HOME_PLACE)); - graphics->fillRectangle(Rect(x, y, dx, dy)); - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::HOME_PLACE_BORDER)); - graphics->drawRectangle(Rect(x, y, dx, dy)); - break; - } - default: - break; - } - if (!mName.empty() - && mType != MapItemType::PORTAL - && mType != MapItemType::EMPTY) - { - Font *const font = gui->getFont(); - const Color &color = userPalette->getColor(UserColorId::BEING); - font->drawString(graphics, - color, - color, - mName, - x, y); - } - BLOCK_END("MapItem::draw") -} diff --git a/src/resources/map/mapitem.h b/src/resources/map/mapitem.h deleted file mode 100644 index cefbaea57..000000000 --- a/src/resources/map/mapitem.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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_MAPITEM_H -#define RESOURCES_MAP_MAPITEM_H - -#include <string> - -#include "localconsts.h" - -class Graphics; -class Image; - -class MapItem final -{ - public: - friend class Map; - friend class MapLayer; - friend class SpecialLayer; - - MapItem(); - - explicit MapItem(const int type); - - MapItem(const int type, - const std::string &comment); - - MapItem(const int type, - const std::string &comment, - const int x, - const int y); - - A_DELETE_COPY(MapItem) - - ~MapItem(); - - int getType() const noexcept2 A_WARN_UNUSED - { return mType; } - - void setType(const int type); - - void setPos(const int x, const int y); - - int getX() const noexcept2 A_WARN_UNUSED - { return mX; } - - int getY() const noexcept2 A_WARN_UNUSED - { return mY; } - - const std::string &getComment() const noexcept2 A_WARN_UNUSED - { return mComment; } - - void setComment(const std::string &comment) noexcept2 - { mComment = comment; } - - const std::string &getName() const noexcept2 A_WARN_UNUSED - { return mName; } - - void setName(const std::string &name) noexcept2 - { mName = name; } - - void draw(Graphics *const graphics, - const int x, const int y, - const int dx, const int dy) const A_NONNULL(2); - - private: - Image *mImage; - std::string mComment; - std::string mName; - int mType; - int mX; - int mY; -}; - -#endif // RESOURCES_MAP_MAPITEM_H diff --git a/src/resources/map/maplayer.cpp b/src/resources/map/maplayer.cpp deleted file mode 100644 index b55637143..000000000 --- a/src/resources/map/maplayer.cpp +++ /dev/null @@ -1,853 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/maplayer.h" - -#include "configuration.h" - -#include "being/localplayer.h" - -#include "enums/resources/map/blockmask.h" -#include "enums/resources/map/mapitemtype.h" - -#include "gui/userpalette.h" - -#ifdef USE_OPENGL -#include "utils/foreach.h" -#endif // USE_OPENGL - -#include "render/graphics.h" - -#include "resources/image/image.h" - -#include "resources/map/mapitem.h" -#include "resources/map/maprowvertexes.h" -#include "resources/map/metatile.h" -#include "resources/map/speciallayer.h" - -#include "debug.h" - -MapLayer::MapLayer(const std::string &name, - const int x, - const int y, - const int width, - const int height, - const bool fringeLayer, - const int mask, - const int tileCondition) : - mX(x), - mY(y), - mPixelX(mX * mapTileSize), - mPixelY(mY * mapTileSize + mapTileSize), - mWidth(width), - mHeight(height), - mTiles(new TileInfo[mWidth * mHeight]), - mDrawLayerFlags(MapType::NORMAL), - mSpecialLayer(nullptr), - mTempLayer(nullptr), - mName(name), - mTempRows(), - mMask(mask), - mTileCondition(tileCondition), - mActorsFix(0), - mIsFringeLayer(fringeLayer), - mHighlightAttackRange(config.getBoolValue("highlightAttackRange")), - mSpecialFlag(true) -{ -// std::fill_n(mTiles, mWidth * mHeight, static_cast<Image*>(nullptr)); - - config.addListener("highlightAttackRange", this); -} - -MapLayer::~MapLayer() -{ - config.removeListener("highlightAttackRange", this); - CHECKLISTENERS - delete []mTiles; - delete_all(mTempRows); - mTempRows.clear(); -} - -void MapLayer::optionChanged(const std::string &value) restrict -{ - if (value == "highlightAttackRange") - { - mHighlightAttackRange = - config.getBoolValue("highlightAttackRange"); - } -} - -void MapLayer::setTile(const int x, - const int y, - Image *const img) restrict -{ - mTiles[x + y * mWidth].image = img; -} - -void MapLayer::draw(Graphics *const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) const restrict -{ - BLOCK_START("MapLayer::draw") - startX -= mX; - startY -= mY; - endX -= mX; - endY -= mY; - - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - const int dx = mPixelX - scrollX; - const int dy = mPixelY - scrollY; - for (int y = startY; y < endY; y++) - { - const int y32 = y * mapTileSize; - const int yWidth = y * mWidth; - - const int py0 = y32 + dy; - - int x0 = startX; - TileInfo *tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (tilePtr->isEnabled == false) - { - if (x0 + tilePtr->nextTile + 1 >= endX) - { - continue; - } - x0 += tilePtr->nextTile + 1; - tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (mTiles[x0 + yWidth].isEnabled == false) - { - continue; - } - } - for (int x = x0; x < endX; x++, tilePtr++) - { - const int x32 = x * mapTileSize; - - const Image *const img = tilePtr->image; - const int px = x32 + dx; - const int py = py0 - img->mBounds.h; - if (mSpecialFlag || - img->mBounds.h <= mapTileSize) - { - if (tilePtr->count == 0) - { - graphics->drawImage(img, px, py); - } - else - { - graphics->drawPattern(img, - px, - py, - tilePtr->width, - img->mBounds.h); - } - } - - const int nextTile = tilePtr->nextTile; - x += nextTile; - tilePtr += nextTile; - } - } - BLOCK_END("MapLayer::draw") -} - -void MapLayer::drawSDL(Graphics *const graphics) const restrict2 -{ - BLOCK_START("MapLayer::drawSDL") - MapRows::const_iterator rit = mTempRows.begin(); - const MapRows::const_iterator rit_end = mTempRows.end(); - while (rit != rit_end) - { - MapRowImages *const images = &(*rit)->images; - MapRowImages::const_iterator iit = images->begin(); - const MapRowImages::const_iterator iit_end = images->end(); - while (iit != iit_end) - { - graphics->drawTileVertexes(*iit); - ++ iit; - } - ++ rit; - } - BLOCK_END("MapLayer::drawSDL") -} - -#ifdef USE_OPENGL -void MapLayer::updateSDL(const Graphics *const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) restrict2 -{ - BLOCK_START("MapLayer::updateSDL") - delete_all(mTempRows); - mTempRows.clear(); - - startX -= mX; - startY -= mY; - endX -= mX; - endY -= mY; - - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - const int dx = mPixelX - scrollX; - const int dy = mPixelY - scrollY; - - for (int y = startY; y < endY; y++) - { - MapRowVertexes *const row = new MapRowVertexes; - mTempRows.push_back(row); - - const Image *lastImage = nullptr; - ImageVertexes *imgVert = nullptr; - - const int yWidth = y * mWidth; - const int py0 = y * mapTileSize + dy; - TileInfo *tilePtr = &mTiles[CAST_SIZE(startX + yWidth)]; - - for (int x = startX; x < endX; x++, tilePtr++) - { - if (!tilePtr->isEnabled) - continue; - Image *const img = (*tilePtr).image; - const int px = x * mapTileSize + dx; - const int py = py0 - img->mBounds.h; - if (mSpecialFlag || - img->mBounds.h <= mapTileSize) - { - if (lastImage != img) - { - imgVert = new ImageVertexes; - imgVert->image = img; - row->images.push_back(imgVert); - lastImage = img; - } - graphics->calcTileSDL(imgVert, px, py); - } - } - } - BLOCK_END("MapLayer::updateSDL") -} - -void MapLayer::updateOGL(Graphics *const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) restrict2 -{ - BLOCK_START("MapLayer::updateOGL") - delete_all(mTempRows); - mTempRows.clear(); - - startX -= mX; - startY -= mY; - endX -= mX; - endY -= mY; - - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - const int dx = mPixelX - scrollX; - const int dy = mPixelY - scrollY; - - MapRowVertexes *const row = new MapRowVertexes; - mTempRows.push_back(row); - Image *lastImage = nullptr; - ImageVertexes *imgVert = nullptr; - typedef std::map<int, ImageVertexes*> ImageVertexesMap; - ImageVertexesMap imgSet; - - for (int y = startY; y < endY; y++) - { - const int yWidth = y * mWidth; - const int py0 = y * mapTileSize + dy; - TileInfo *tilePtr = &mTiles[CAST_SIZE(startX + yWidth)]; - for (int x = startX; x < endX; x++, tilePtr++) - { - if (!tilePtr->isEnabled) - continue; - Image *const img = (*tilePtr).image; - const int px = x * mapTileSize + dx; - const int py = py0 - img->mBounds.h; - const GLuint imgGlImage = img->mGLImage; - if (mSpecialFlag || - img->mBounds.h <= mapTileSize) - { - if ((lastImage == nullptr) || - lastImage->mGLImage != imgGlImage) - { - if (img->mBounds.w > mapTileSize) - imgSet.clear(); - - if (imgSet.find(imgGlImage) != imgSet.end()) - { - imgVert = imgSet[imgGlImage]; - } - else - { - if (lastImage != nullptr) - imgSet[lastImage->mGLImage] = imgVert; - imgVert = new ImageVertexes; - imgVert->ogl.init(); - imgVert->image = img; - row->images.push_back(imgVert); - } - } - lastImage = img; - graphics->calcTileVertexes(imgVert, lastImage, px, py); - } - } - } - FOR_EACH (MapRowImages::iterator, it, row->images) - { - graphics->finalize(*it); - } - BLOCK_END("MapLayer::updateOGL") -} - -void MapLayer::drawOGL(Graphics *const graphics) const restrict2 -{ - BLOCK_START("MapLayer::drawOGL") - MapRows::const_iterator rit = mTempRows.begin(); - const MapRows::const_iterator rit_end = mTempRows.end(); - while (rit != rit_end) - { - const MapRowImages *const images = &(*rit)->images; - MapRowImages::const_iterator iit = images->begin(); - const MapRowImages::const_iterator iit_end = images->end(); - while (iit != iit_end) - { - graphics->drawTileVertexes(*iit); - ++ iit; - } - ++ rit; - } - BLOCK_END("MapLayer::drawOGL") -} -#endif // USE_OPENGL - -void MapLayer::drawSpecialLayer(Graphics *const graphics, - const int y, - const int startX, - const int endX, - const int scrollX, - const int scrollY) const restrict -{ - const int y32 = y * mapTileSize; - const int py1 = y32 - scrollY; - int endX1 = endX; - int specialWidth = mSpecialLayer->mWidth; - int ptr = y * specialWidth; - if (endX1 > specialWidth) - endX1 = specialWidth; - if (endX1 < 0) - endX1 = 0; - int x0 = startX; - const MapItem *item0 = mSpecialLayer->mTiles[ptr + startX]; - if ((item0 == nullptr) || item0->mType == MapItemType::EMPTY) - { - x0 += mSpecialLayer->mCache[ptr + startX] + 1; - } - for (int x = x0; x < endX1; x++) - { - const int px1 = x * mapTileSize - scrollX; - const MapItem *const item = mSpecialLayer->mTiles[ptr + x]; - if (item != nullptr) - { - item->draw(graphics, px1, py1, - mapTileSize, mapTileSize); - } - x += mSpecialLayer->mCache[ptr + x]; - } - - x0 = startX; - specialWidth = mTempLayer->mWidth; - ptr = y * specialWidth; - endX1 = endX; - if (endX1 > specialWidth) - endX1 = specialWidth; - item0 = mTempLayer->mTiles[ptr + startX]; - if ((item0 == nullptr) || item0->mType == MapItemType::EMPTY) - { - x0 += mTempLayer->mCache[ptr + startX] + 1; - } - for (int x = x0; x < endX1; x++) - { - const int px1 = x * mapTileSize - scrollX; - const MapItem *const item = mTempLayer->mTiles[ptr + x]; - item->draw(graphics, px1, py1, - mapTileSize, mapTileSize); - x += mTempLayer->mCache[ptr + x]; - } -} - -void MapLayer::drawFringe(Graphics *const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY, - const Actors &actors) const restrict -{ - BLOCK_START("MapLayer::drawFringe") - if ((localPlayer == nullptr) || - (mSpecialLayer == nullptr) || - (mTempLayer == nullptr)) - { - BLOCK_END("MapLayer::drawFringe") - return; - } - - startX -= mX; - startY -= mY; - endX -= mX; - endY -= mY; - - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - ActorsCIter ai = actors.begin(); - const ActorsCIter ai_end = actors.end(); - - const int dx = mPixelX - scrollX; - const int dy = mPixelY - scrollY; - - const int specialHeight = mSpecialLayer->mHeight; - - const bool flag = mDrawLayerFlags == MapType::SPECIAL3 || - mDrawLayerFlags == MapType::SPECIAL4 || - mDrawLayerFlags == MapType::BLACKWHITE; - - const int minEndY = std::min(specialHeight, endY); - - if (flag) - { // flag - for (int y = startY; y < minEndY; y ++) - { - const int y32s = (y + mActorsFix) * mapTileSize; - - BLOCK_START("MapLayer::drawFringe drawmobs") - // If drawing the fringe layer, make sure all actors above this - // row of tiles have been drawn - while (ai != ai_end && (*ai)->getSortPixelY() <= y32s) - { - (*ai)->draw(graphics, -scrollX, -scrollY); - ++ ai; - } - BLOCK_END("MapLayer::drawFringe drawmobs") - - // remove this condition, because it always true - if (y < specialHeight) - { - drawSpecialLayer(graphics, - y, - startX, - endX, - scrollX, - scrollY); - } - } - - for (int y = minEndY; y < endY; y++) - { - const int y32s = (y + mActorsFix) * mapTileSize; - - BLOCK_START("MapLayer::drawFringe drawmobs") - // If drawing the fringe layer, make sure all actors above this - // row of tiles have been drawn - while (ai != ai_end && (*ai)->getSortPixelY() <= y32s) - { - (*ai)->draw(graphics, -scrollX, -scrollY); - ++ ai; - } - BLOCK_END("MapLayer::drawFringe drawmobs") - } - } - else - { // !flag - for (int y = startY; y < minEndY; y ++) - { - const int y32 = y * mapTileSize; - const int y32s = (y + mActorsFix) * mapTileSize; - const int yWidth = y * mWidth; - - BLOCK_START("MapLayer::drawFringe drawmobs") - // If drawing the fringe layer, make sure all actors above this - // row of tiles have been drawn - while (ai != ai_end && - (*ai)->getSortPixelY() <= y32s) - { - (*ai)->draw(graphics, -scrollX, -scrollY); - ++ ai; - } - BLOCK_END("MapLayer::drawFringe drawmobs") - - const int py0 = y32 + dy; - - int x0 = startX; - TileInfo *tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (tilePtr->isEnabled == false) - { - drawSpecialLayer(graphics, - y, - 0, - std::min(x0 + tilePtr->nextTile + 1, endX), - scrollX, - scrollY); - if (x0 + tilePtr->nextTile + 1 >= endX) - { - continue; - } - x0 += tilePtr->nextTile + 1; - tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (mTiles[x0 + yWidth].isEnabled == false) - continue; - } - for (int x = x0; x < endX; x++, tilePtr++) - { - const int x32 = x * mapTileSize; - const Image *const img = tilePtr->image; - if (mSpecialFlag || - img->mBounds.h <= mapTileSize) - { - const int px = x32 + dx; - const int py = py0 - img->mBounds.h; - - if (tilePtr->count == 0) - { - graphics->drawImage(img, px, py); - } - else - { - graphics->drawPattern(img, - px, - py, - tilePtr->width, - img->mBounds.h); - } - } - - const int nextTile = tilePtr->nextTile; - // remove this condition, because it always true - if (y < specialHeight) - { - drawSpecialLayer(graphics, - y, - x, - std::min(x + nextTile + 1, endX), - scrollX, - scrollY); - } - x += nextTile; - tilePtr += nextTile; - } - } - - for (int y = minEndY; y < endY; y++) - { - const int y32 = y * mapTileSize; - const int y32s = (y + mActorsFix) * mapTileSize; - const int yWidth = y * mWidth; - - BLOCK_START("MapLayer::drawFringe drawmobs") - // If drawing the fringe layer, make sure all actors above this - // row of tiles have been drawn - while (ai != ai_end && (*ai)->getSortPixelY() <= y32s) - { - (*ai)->draw(graphics, -scrollX, -scrollY); - ++ ai; - } - BLOCK_END("MapLayer::drawFringe drawmobs") - - const int py0 = y32 + dy; - - int x0 = startX; - TileInfo *tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (tilePtr->isEnabled == false) - { - if (x0 + tilePtr->nextTile + 1 >= endX) - continue; - x0 += tilePtr->nextTile + 1; - tilePtr = &mTiles[CAST_SIZE(x0 + yWidth)]; - if (mTiles[x0 + yWidth].isEnabled == false) - continue; - } - for (int x = x0; x < endX; x++, tilePtr++) - { - const int x32 = x * mapTileSize; - const Image *const img = tilePtr->image; - const int px = x32 + dx; - const int py = py0 - img->mBounds.h; - if (mSpecialFlag || - img->mBounds.h <= mapTileSize) - { - const int c = tilePtr->count; - - if (c == 0) - { - graphics->drawImage(img, px, py); - } - else - { - graphics->drawPattern(img, - px, - py, - tilePtr->width, - img->mBounds.h); - } - } - const int nextTile = tilePtr->nextTile; - x += nextTile; - tilePtr += nextTile; - } - } - } // !flag - - // Draw any remaining actors - if (mDrawLayerFlags != MapType::SPECIAL3 && - mDrawLayerFlags != MapType::SPECIAL4) - { - BLOCK_START("MapLayer::drawFringe drawmobs") - while (ai != ai_end) - { - (*ai)->draw(graphics, -scrollX, -scrollY); - ++ai; - } - BLOCK_END("MapLayer::drawFringe drawmobs") - if (mHighlightAttackRange) - { - const int px = localPlayer->getPixelX() - - scrollX - mapTileSize / 2; - const int py = localPlayer->getPixelY() - scrollY - mapTileSize; - const int attackRange = localPlayer->getAttackRange() - * mapTileSize; - - int x = px - attackRange; - int y = py - attackRange; - int w = 2 * attackRange + mapTileSize; - int h = w; - if (attackRange <= mapTileSize) - { - x -= mapTileSize / 2; - y -= mapTileSize / 2; - w += mapTileSize; - h += mapTileSize; - } - - if (userPalette != nullptr) - { - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::ATTACK_RANGE)); - graphics->fillRectangle(Rect(x, y, w, h)); - graphics->setColor(userPalette->getColorWithAlpha( - UserColorId::ATTACK_RANGE_BORDER)); - graphics->drawRectangle(Rect(x, y, w, h)); - } - } - } - BLOCK_END("MapLayer::drawFringe") -} - -int MapLayer::getTileDrawWidth(const TileInfo *restrict tilePtr, - const int endX, - int &restrict width, - int &restrict nextTile) -{ - BLOCK_START("MapLayer::getTileDrawWidth") - const Image *const img1 = tilePtr->image; - int c = 0; - width = img1->mBounds.w; - for (int x = 1; x < endX; x++) - { - tilePtr ++; - const Image *const img = tilePtr->image; - if (img == nullptr || - tilePtr->isEnabled == false) - { - break; - } - if (img != img1) - { - nextTile = c; - BLOCK_END("MapLayer::getTileDrawWidth") - return c; - } - c ++; - width += img->mBounds.w; - } - int c2 = c; - for (int x2 = c2 + 1; x2 < endX; x2++) - { - if (tilePtr->image != nullptr && - tilePtr->isEnabled == true) - { - break; - } - c2 ++; - tilePtr ++; - } - nextTile = c2; - BLOCK_END("MapLayer::getTileDrawWidth") - return c; -} - -int MapLayer::getEmptyTileDrawWidth(const TileInfo *restrict tilePtr, - const int endX, - int &restrict nextTile) -{ - BLOCK_START("MapLayer::getEmptyTileDrawWidth") - int c = 0; - for (int x = 1; x < endX; x++) - { - tilePtr ++; - const Image *const img = tilePtr->image; - if (img != nullptr && tilePtr->isEnabled == true) - break; - c ++; - } - BLOCK_END("MapLayer::getEmptyTileDrawWidth") - - nextTile = c; - return c; -} - -void MapLayer::setDrawLayerFlags(const MapTypeT &n) restrict -{ - mDrawLayerFlags = n; - mSpecialFlag = (mDrawLayerFlags != MapType::SPECIAL && - mDrawLayerFlags != MapType::SPECIAL2 && - mDrawLayerFlags != MapType::SPECIAL4); -} - -void MapLayer::updateConditionTiles(const MetaTile *const metaTiles, - const int width, - const int height) restrict -{ - const int width1 = width < mWidth ? width : mWidth; - const int height1 = height < mHeight ? height : mHeight; - - for (int y = mY; y < height1; y ++) - { - const MetaTile *metaPtr = metaTiles + (y - mY) * width; - TileInfo *tilePtr = mTiles + y * mWidth; - for (int x = mX; x < width1; x ++, metaPtr ++, tilePtr ++) - { - if (tilePtr->image != nullptr && - (((metaPtr->blockmask & mTileCondition) != 0) || - (metaPtr->blockmask == 0 && - mTileCondition == BlockMask::GROUND))) - { - tilePtr->isEnabled = true; - } - else - { - tilePtr->isEnabled = false; - } - } - } -} - -void MapLayer::updateCache(const int width, - const int height) restrict -{ - const int width1 = width < mWidth ? width : mWidth; - const int height1 = height < mHeight ? height : mHeight; - - for (int y = mY; y < height1; y ++) - { - for (int x = mX; x < width1; x ++) - { - TileInfo *tilePtr = mTiles + y * mWidth + x; - int nextTile = 0; - if (tilePtr->image == nullptr || tilePtr->isEnabled == false) - { - tilePtr->isEnabled = false; - tilePtr->count = getEmptyTileDrawWidth(tilePtr, - width1 - x, - nextTile); - tilePtr->width = 0; - } - else - { - int tileWidth = 0; - tilePtr->count = getTileDrawWidth(tilePtr, - width1 - x, - tileWidth, - nextTile); - tilePtr->width = tileWidth; - } - tilePtr->nextTile = nextTile; - } - } -} - -int MapLayer::calcMemoryLocal() const -{ - return static_cast<int>(sizeof(MapLayer) + - sizeof(TileInfo) * mWidth * mHeight + - sizeof(MapRowVertexes) * mTempRows.capacity()); -} - -int MapLayer::calcMemoryChilds(const int level) const -{ - int sz = 0; - if (mSpecialLayer != nullptr) - sz += mSpecialLayer->calcMemory(level + 1); - if (mTempLayer != nullptr) - sz += mTempLayer->calcMemory(level + 1); - return sz; -} diff --git a/src/resources/map/maplayer.h b/src/resources/map/maplayer.h deleted file mode 100644 index c21ac33bc..000000000 --- a/src/resources/map/maplayer.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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 "listeners/configlistener.h" - -#include "resources/memorycounter.h" - -#include "being/actor.h" - -#include "enums/resources/map/maptype.h" - -#include "utils/vector.h" - -#include "resources/map/tileinfo.h" - -class Image; -class MapRowVertexes; -class SpecialLayer; - -struct MetaTile; - -/** - * A map layer. Stores a grid of tiles and their offset, and implements layer - * rendering. - */ -class MapLayer final: public MemoryCounter, public ConfigListener -{ - public: - 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 std::string &name, - const int x, - const int y, - const int width, - const int height, - const bool isFringeLayer, - const int mask, - const int tileCondition); - - 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 *restrict const img) restrict; - - /** - * Set tile image with x + y * width already known. - */ - void setTile(const int index, - Image *restrict const img) restrict - { mTiles[index].image = 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 *restrict const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) const restrict A_NONNULL(2); - - void drawSDL(Graphics *restrict const graphics) const restrict2 - A_NONNULL(2); - -#ifdef USE_OPENGL - void drawOGL(Graphics *restrict const graphics) const restrict2 - A_NONNULL(2); - - void updateOGL(Graphics *restrict const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) restrict2 A_NONNULL(2); -#endif // USE_OPENGL - - void updateSDL(const Graphics *restrict const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY) restrict2 A_NONNULL(2); - - void drawFringe(Graphics *restrict const graphics, - int startX, - int startY, - int endX, - int endY, - const int scrollX, - const int scrollY, - const Actors &actors) const restrict A_NONNULL(2); - - bool isFringeLayer() const restrict noexcept2 A_WARN_UNUSED - { return mIsFringeLayer; } - - void setSpecialLayer(const SpecialLayer *restrict const val) restrict - { mSpecialLayer = val; } - - void setTempLayer(const SpecialLayer *restrict const val) restrict - { mTempLayer = val; } - - int getWidth() const restrict noexcept2 A_WARN_UNUSED - { return mWidth; } - - int getHeight() const restrict noexcept2 A_WARN_UNUSED - { return mHeight; } - - void optionChanged(const std::string &restrict value) - restrict override final; - - void setDrawLayerFlags(const MapTypeT &restrict n) restrict; - - void setActorsFix(const int y) restrict - { mActorsFix = y; } - - int calcMemoryLocal() const override final; - - int calcMemoryChilds(const int level) const override final; - - std::string getCounterName() const override final - { return mName; } - -#ifdef UNITTESTS - TileInfo *getTiles() const - { - return mTiles; - } - - void setTileCondition(const int c) - { - mTileCondition = c; - } -#endif // UNITTESTS - -#ifndef UNITTESTS - protected: -#endif // UNITTESTS - static int getTileDrawWidth(const TileInfo *restrict img, - const int endX, - int &restrict width, - int &restrict nextTile) - A_WARN_UNUSED A_NONNULL(1); - - static int getEmptyTileDrawWidth(const TileInfo *restrict img, - const int endX, - int &restrict nextTile) - A_WARN_UNUSED A_NONNULL(1); - - void updateConditionTiles(const MetaTile *restrict const metaTiles, - const int width, - const int height) restrict A_NONNULL(2); - - void updateCache(const int width, - const int height) restrict; - - void drawSpecialLayer(Graphics *const graphics, - const int y, - const int startX, - const int endX, - const int scrollX, - const int scrollY) const restrict; - - private: - const int mX; - const int mY; - const int mPixelX; - const int mPixelY; - const int mWidth; - const int mHeight; - TileInfo *restrict const mTiles; - MapTypeT mDrawLayerFlags; - const SpecialLayer *restrict mSpecialLayer; - const SpecialLayer *restrict mTempLayer; - const std::string mName; - typedef STD_VECTOR<MapRowVertexes*> MapRows; - MapRows mTempRows; - int mMask; - int mTileCondition; - int mActorsFix; - const bool mIsFringeLayer; /**< Whether the actors are drawn. */ - bool mHighlightAttackRange; - bool mSpecialFlag; -}; - -#endif // RESOURCES_MAP_MAPLAYER_H diff --git a/src/resources/map/mapobject.h b/src/resources/map/mapobject.h deleted file mode 100644 index 07b25d3ec..000000000 --- a/src/resources/map/mapobject.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_MAPOBJECT_H -#define RESOURCES_MAP_MAPOBJECT_H - -#include <string> - -#include "localconsts.h" - -class MapObject final -{ - public: - MapObject(const int type0, - const std::string &data0) : - type(type0), - data(data0) - { - } - - A_DEFAULT_COPY(MapObject) - - int type; - std::string data; -}; - -#endif // RESOURCES_MAP_MAPOBJECT_H diff --git a/src/resources/map/mapobjectlist.h b/src/resources/map/mapobjectlist.h deleted file mode 100644 index 327c9da9e..000000000 --- a/src/resources/map/mapobjectlist.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_MAPOBJECTLIST_H -#define RESOURCES_MAP_MAPOBJECTLIST_H - -#include "resources/map/mapobject.h" - -#include "utils/vector.h" - -#include "localconsts.h" - -class MapObjectList final -{ - public: - MapObjectList() : - objects() - { - } - - A_DELETE_COPY(MapObjectList) - - STD_VECTOR<MapObject> objects; -}; - -#endif // RESOURCES_MAP_MAPOBJECTLIST_H diff --git a/src/resources/map/maprowvertexes.h b/src/resources/map/maprowvertexes.h deleted file mode 100644 index 0b64bed57..000000000 --- a/src/resources/map/maprowvertexes.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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_MAPROWVERTEXES_H -#define RESOURCES_MAP_MAPROWVERTEXES_H - -#include "utils/dtor.h" - -#include "render/vertexes/imagevertexes.h" - -#include "localconsts.h" - -typedef STD_VECTOR<ImageVertexes*> MapRowImages; - -class MapRowVertexes final -{ - public: - MapRowVertexes() : - images() - { - images.reserve(30); - } - - A_DELETE_COPY(MapRowVertexes) - - ~MapRowVertexes() - { - delete_all(images); - images.clear(); - } - - MapRowImages images; -}; - -#endif // RESOURCES_MAP_MAPROWVERTEXES_H diff --git a/src/resources/map/metatile.h b/src/resources/map/metatile.h deleted file mode 100644 index 74cb5f217..000000000 --- a/src/resources/map/metatile.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_METATILE_H -#define RESOURCES_MAP_METATILE_H - -#include "localconsts.h" - -/** - * 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. - */ -struct MetaTile final -{ - /** - * Constructor. - */ - MetaTile() : Fcost(0), Gcost(0), Hcost(0), whichList(0), - parentX(0), parentY(0), blockmask(0) - {} - - A_DELETE_COPY(MetaTile) - - // Pathfinding members - int Fcost; /**< Estimation of total path cost */ - int Gcost; /**< Cost from start to this location */ - int Hcost; /**< Estimated cost to goal */ - unsigned whichList; /**< No list, open list or closed list */ - int parentX; /**< X coordinate of parent tile */ - int parentY; /**< Y coordinate of parent tile */ - unsigned char blockmask; /**< Blocking properties of this tile */ -}; -#endif // RESOURCES_MAP_METATILE_H diff --git a/src/resources/map/objectslayer.cpp b/src/resources/map/objectslayer.cpp deleted file mode 100644 index 05d00c61e..000000000 --- a/src/resources/map/objectslayer.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/objectslayer.h" - -#include "utils/cast.h" - -#include "resources/map/mapobjectlist.h" - -#include "debug.h" - -ObjectsLayer::ObjectsLayer(const unsigned width, - const unsigned height) : - MemoryCounter(), - mTiles(new MapObjectList*[width * height]), - mWidth(width), - mHeight(height) -{ - std::fill_n(mTiles, width * height, static_cast<MapObjectList*>(nullptr)); -} - -ObjectsLayer::~ObjectsLayer() -{ - const unsigned size = mWidth * mHeight; - for (unsigned f = 0; f < size; f ++) - delete mTiles[f]; - - delete [] mTiles; - mTiles = nullptr; -} - -void ObjectsLayer::addObject(const std::string &name, const int type, - const unsigned x, const unsigned y, - unsigned dx, unsigned dy) -{ - if (mTiles == nullptr) - return; - - if (x + dx > mWidth) - dx = mWidth - x; - if (y + dy > mHeight) - dy = mHeight - y; - - for (unsigned y1 = y; y1 < y + dy; y1 ++) - { - const unsigned idx1 = x + y1 * mWidth; - const unsigned idx2 = idx1 + dx; - - for (unsigned i = idx1; i < idx2; i ++) - { - if (mTiles[i] == nullptr) - mTiles[i] = new MapObjectList; - mTiles[i]->objects.push_back(MapObject(type, name)); - } - } -} - -MapObjectList *ObjectsLayer::getAt(const unsigned x, const unsigned y) const -{ - if (x >= mWidth || y >= mHeight) - return nullptr; - return mTiles[x + y * mWidth]; -} - -int ObjectsLayer::calcMemoryLocal() const -{ - return CAST_S32(sizeof(ObjectsLayer) + - (sizeof(MapObjectList) + sizeof(MapObjectList*)) * mWidth * mHeight); -} diff --git a/src/resources/map/objectslayer.h b/src/resources/map/objectslayer.h deleted file mode 100644 index 3deed3d36..000000000 --- a/src/resources/map/objectslayer.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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_OBJECTSLAYER_H -#define RESOURCES_MAP_OBJECTSLAYER_H - -#include "resources/memorycounter.h" - -#include "localconsts.h" - -class MapObjectList; - -class ObjectsLayer final : public MemoryCounter -{ - 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; - - int calcMemoryLocal() const override final; - - std::string getCounterName() const override final - { return "objects layer"; } - - private: - MapObjectList **mTiles; - unsigned mWidth; - unsigned mHeight; -}; - -#endif // RESOURCES_MAP_OBJECTSLAYER_H diff --git a/src/resources/map/properties.h b/src/resources/map/properties.h deleted file mode 100644 index 31d8cfe77..000000000 --- a/src/resources/map/properties.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_PROPERTIES_H -#define RESOURCES_MAP_PROPERTIES_H - -#include "localconsts.h" - -#include <map> -#include <sstream> - -/** - * A class holding a set of properties. - */ -class Properties notfinal -{ - public: - Properties() : - mProperties() - { - } - - A_DELETE_COPY(Properties) - - /** - * Destructor. - */ - virtual ~Properties() - { } - - /** - * Get a map property. - * - * @param name The name of the property. - * @param def Default value, empty string by default. - * @return the value of the given property or the given default when it - * doesn't exist. - */ - const std::string getProperty(const std::string &name, - const std::string &def = "") - const A_WARN_UNUSED - { - const PropertyMap::const_iterator i = mProperties.find(name); - return (i != mProperties.end()) ? i->second : def; - } - - /** - * Gets a map property as a float. - * - * @param name The name of the property. - * @param def Default value, 0.0F by default. - * @return the value of the given property or the given default when it - * doesn't exist. - */ - float getFloatProperty(const std::string &name, - const float def = 0.0F) const A_WARN_UNUSED - { - const PropertyMap::const_iterator i = mProperties.find(name); - float ret = def; - if (i != mProperties.end()) - { - std::stringstream ss; - ss.str(i->second); - ss >> ret; - } - return ret; - } - - /** - * Gets a map property as a boolean. - * - * @param name The name of the property. - * @param def Default value, false by default. - * @return the value of the given property or the given default when it - * doesn't exist. - */ - bool getBoolProperty(const std::string &name, - const bool def = false) const A_WARN_UNUSED - { - const PropertyMap::const_iterator i = mProperties.find(name); - bool ret = def; - if (i != mProperties.end()) - { - if (i->second == "true") - ret = true; - if (i->second == "false") - ret = false; - } - return ret; - } - - /** - * Returns whether a certain property is available. - * - * @param name The name of the property. - * @return <code>true</code> when a property is defined, - * <code>false</code> otherwise. - */ - bool hasProperty(const std::string &name) const A_WARN_UNUSED - { return (mProperties.find(name) != mProperties.end()); } - - /** - * Set a map property. - * - * @param name The name of the property. - * @param value The value of the property. - */ - void setProperty(const std::string &name, const std::string &value) - { mProperties[name] = value; } - - - private: - typedef std::map<std::string, std::string> PropertyMap; - PropertyMap mProperties; -}; - -#endif // RESOURCES_MAP_PROPERTIES_H diff --git a/src/resources/map/speciallayer.cpp b/src/resources/map/speciallayer.cpp deleted file mode 100644 index ad186c2d9..000000000 --- a/src/resources/map/speciallayer.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/speciallayer.h" - -#include "const/resources/map/map.h" - -#include "enums/resources/map/mapitemtype.h" - -#include "resources/map/mapitem.h" - -#include "utils/delete2.h" -#include "utils/foreach.h" - -#include "debug.h" - -SpecialLayer::SpecialLayer(const std::string &name, - const int width, - const int height) : - MemoryCounter(), - mName(name), - mTiles(new MapItem*[width * height]), - mCache(new int[width * height]), - mWidth(width), - mHeight(height) -{ - std::fill_n(mTiles, mWidth * mHeight, static_cast<MapItem*>(nullptr)); - std::fill_n(mCache, mWidth * mHeight, 10000); -} - -SpecialLayer::~SpecialLayer() -{ - for (int f = 0; f < mWidth * mHeight; f ++) - delete2(mTiles[f]) - delete [] mTiles; - delete [] mCache; -} - -MapItem* SpecialLayer::getTile(const int x, const int y) const -{ - if (x < 0 || x >= mWidth || - y < 0 || y >= mHeight) - { - return nullptr; - } - return mTiles[x + y * mWidth]; -} - -void SpecialLayer::setTile(const int x, const int y, MapItem *const item) -{ - if (x < 0 || x >= mWidth || - y < 0 || y >= mHeight) - { - return; - } - - const int idx = x + y * mWidth; - delete mTiles[idx]; - if (item != nullptr) - item->setPos(x, y); - mTiles[idx] = item; -} - -void SpecialLayer::setTile(const int x, const int y, const int type) -{ - if (x < 0 || x >= mWidth || - y < 0 || y >= mHeight) - { - return; - } - - const int idx = x + y * mWidth; - MapItem *const tile = mTiles[idx]; - if (tile != nullptr) - { - tile->setType(type); - tile->setPos(x, y); - } - else - { - mTiles[idx] = new MapItem(type); - mTiles[idx]->setPos(x, y); - } -} - -void SpecialLayer::addRoad(const Path &road) -{ - FOR_EACH (Path::const_iterator, i, road) - { - const Position &pos = *i; - MapItem *const item = getTile(pos.x, pos.y); - if (item == nullptr) - setTile(pos.x, pos.y, new MapItem(MapItemType::ROAD)); - else - item->setType(MapItemType::ROAD); - } - updateCache(); -} - -void SpecialLayer::clean() -{ - if (mTiles == nullptr) - return; - - for (int f = 0; f < mWidth * mHeight; f ++) - { - MapItem *const item = mTiles[f]; - if (item != nullptr) - item->setType(MapItemType::EMPTY); - } - updateCache(); -} - -void SpecialLayer::draw(Graphics *const graphics, int startX, int startY, - int endX, int endY, - const int scrollX, const int scrollY) const -{ - BLOCK_START("SpecialLayer::draw") - if (startX < 0) - startX = 0; - if (startY < 0) - startY = 0; - if (endX > mWidth) - endX = mWidth; - if (endY > mHeight) - endY = mHeight; - - for (int y = startY; y < endY; y ++) - { - const int py = y * mapTileSize - scrollY; - const int y2 = y * mWidth; - for (int x = startX; x < endX; x ++) - { - const MapItem *const item = mTiles[x + y2]; - if (item != nullptr) - { - item->draw(graphics, x * mapTileSize - scrollX, py, - mapTileSize, mapTileSize); - } - } - } - BLOCK_END("SpecialLayer::draw") -} - -int SpecialLayer::calcMemoryLocal() const -{ - return static_cast<int>(sizeof(SpecialLayer) + - sizeof(MapItem) * mWidth * mHeight); -} - -void SpecialLayer::updateCache() -{ - for (int y = 0; y < mHeight; y ++) - { - const int y2 = y * mWidth; - for (int x = 0; x < mWidth; x ++) - { - int c = 10000; - for (int f = x + 1; f < mWidth; f ++) - { - MapItem *const item = mTiles[f + y2]; - if (item != nullptr && - item->mType != MapItemType::EMPTY) - { - c = f - x - 1; - break; - } - } - mCache[x + y2] = c; - } - } -} diff --git a/src/resources/map/speciallayer.h b/src/resources/map/speciallayer.h deleted file mode 100644 index 8f6f914d3..000000000 --- a/src/resources/map/speciallayer.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2017 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_SPECIALLAYER_H -#define RESOURCES_MAP_SPECIALLAYER_H - -#include "resources/memorycounter.h" - -#include "position.h" - -#include "localconsts.h" - -class Graphics; -class MapItem; - -class SpecialLayer final : public MemoryCounter -{ - public: - friend class Map; - friend class MapLayer; - - SpecialLayer(const std::string &name, - 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 A_NONNULL(2); - - 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(); - - int calcMemoryLocal() const override final; - - std::string getCounterName() const override final - { return mName; } - - void updateCache(); - -#ifdef UNITTESTS - const int *getCache() const - { return mCache; } - - MapItem **getTiles() const - { return mTiles; } -#endif // UNITTESTS - - private: - const std::string mName; - MapItem **mTiles; - int *mCache; - int mWidth; - int mHeight; -}; - -#endif // RESOURCES_MAP_SPECIALLAYER_H diff --git a/src/resources/map/tileanimation.cpp b/src/resources/map/tileanimation.cpp deleted file mode 100644 index fee4ef150..000000000 --- a/src/resources/map/tileanimation.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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/>. - */ - -#include "resources/map/tileanimation.h" - -#include "resources/animation/simpleanimation.h" - -#include "resources/map/maplayer.h" - -#include "utils/delete2.h" -#include "utils/foreach.h" - -#include "debug.h" - -TileAnimation::TileAnimation(Animation *const ani) : - mAffected(), - mAnimation(new SimpleAnimation(ani)), - mLastImage(nullptr) -{ -} - -TileAnimation::~TileAnimation() -{ - delete2(mAnimation); -} - -bool TileAnimation::update(const int ticks) -{ - if (mAnimation == nullptr) - return false; - - // update animation - if (!mAnimation->update(ticks)) - return false; - - // exchange images - Image *const img = mAnimation->getCurrentImage(); - if (img != mLastImage) - { - FOR_EACH (TilePairVectorCIter, i, mAffected) - { - if (i->first != nullptr) - i->first->setTile(i->second, img); - } - mLastImage = img; - } - return true; -} diff --git a/src/resources/map/tileanimation.h b/src/resources/map/tileanimation.h deleted file mode 100644 index a9b5cc281..000000000 --- a/src/resources/map/tileanimation.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_TILEANIMATION_H -#define RESOURCES_MAP_TILEANIMATION_H - -#include "utils/vector.h" - -#include <map> - -#include "localconsts.h" - -class Animation; -class Image; -class MapLayer; -class SimpleAnimation; - -typedef STD_VECTOR<std::pair<MapLayer*, int> > TilePairVector; -typedef TilePairVector::const_iterator TilePairVectorCIter; - -/** - * Animation cycle of a tile image which changes the map accordingly. - */ -class TileAnimation final -{ - public: - explicit TileAnimation(Animation *const ani); - - ~TileAnimation(); - - A_DELETE_COPY(TileAnimation) - - bool update(const int ticks = 1); - - void addAffectedTile(MapLayer *const layer, const int index) - { mAffected.push_back(std::make_pair(layer, index)); } - - private: - TilePairVector mAffected; - SimpleAnimation *mAnimation; - Image *mLastImage; -}; - -typedef std::map<int, TileAnimation*> TileAnimationMap; -typedef TileAnimationMap::const_iterator TileAnimationMapCIter; - -#endif // RESOURCES_MAP_TILEANIMATION_H diff --git a/src/resources/map/tileinfo.h b/src/resources/map/tileinfo.h deleted file mode 100644 index bb92be4fc..000000000 --- a/src/resources/map/tileinfo.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2015-2017 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_TILEINFO_H -#define RESOURCES_MAP_TILEINFO_H - -#include "localconsts.h" - -class Image; - -struct TileInfo final -{ - TileInfo() : - image(nullptr), - width(0), - count(1), - nextTile(1), - isEnabled(true) - { - } - - A_DELETE_COPY(TileInfo) - - /* tile image */ - Image *image; - /* repeated tile width in pixels */ - int width; - /* repeated tiles count - 1 */ - int count; - /* number of tiles to get next tile */ - int nextTile; - /* is tile enabled flag. if set to true, also mean image is non null */ - bool isEnabled; -}; - -#endif // RESOURCES_MAP_TILEINFO_H diff --git a/src/resources/map/tileset.h b/src/resources/map/tileset.h deleted file mode 100644 index 942a18b51..000000000 --- a/src/resources/map/tileset.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 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_TILESET_H -#define RESOURCES_MAP_TILESET_H - -#include "resources/imageset.h" - -#include <map> - -/** - * A tileset, which is basically just an image set but it stores a firstgid. - */ -class Tileset final : public ImageSet -{ - public: - /** - * Constructor. - */ - Tileset(Image *const img, - const int w, - const int h, - const int firstGid, - const int margin, - const int spacing) : - ImageSet(img, w, h, margin, spacing), - mFirstGid(firstGid), - mProperties() - { - } - - A_DELETE_COPY(Tileset) - - /** - * Returns the first gid. - */ - int getFirstGid() const noexcept2 A_WARN_UNUSED - { return mFirstGid; } - - /** - * Set tileset property. - */ - void setProperties(const std::map<std::string, - std::string> &props) noexcept2 - { mProperties = props; } - - /** - * Returns property value. - */ - std::string getProperty(const std::string &name) A_WARN_UNUSED - { - const std::map<std::string, std::string>::const_iterator - it = mProperties.find(name); - if (it == mProperties.end()) - return ""; - return mProperties[name]; - } - - int calcMemoryLocal() const override final - { - int sz = ImageSet::calcMemoryLocal() + - static_cast<int>(sizeof(Tileset)); - const std::map<std::string, std::string>::const_iterator it_end = - mProperties.end(); - std::map<std::string, std::string>::const_iterator it = - mProperties.begin(); - while (it != it_end) - { - sz += static_cast<int>((*it).first.capacity() + - (*it).second.capacity()); - ++ it; - } - return sz; - } - - private: - int mFirstGid; - - std::map<std::string, std::string> mProperties; -}; - -#endif // RESOURCES_MAP_TILESET_H diff --git a/src/resources/map/walklayer.cpp b/src/resources/map/walklayer.cpp deleted file mode 100644 index 04b6a3cff..000000000 --- a/src/resources/map/walklayer.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 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/>. - */ - -#include "resources/map/walklayer.h" - -#include "debug.h" - -WalkLayer::WalkLayer(const int width, const int height) : - Resource(), - mWidth(width), - mHeight(height), - mTiles(new int[width * height]) -{ - std::fill_n(mTiles, width * height, 0); -} - -WalkLayer::~WalkLayer() -{ - delete [] mTiles; -} - -int WalkLayer::getDataAt(const int x, const int y) const -{ - if (x < 0 || x >= mWidth || y < 0 || y >= mHeight) - return 0; - return mTiles[x + y * mWidth]; -} - -int WalkLayer::calcMemoryLocal() const -{ - return Resource::calcMemoryLocal() + - static_cast<int>(sizeof(WalkLayer) + - sizeof(int) * mWidth * mHeight); -} diff --git a/src/resources/map/walklayer.h b/src/resources/map/walklayer.h deleted file mode 100644 index 4e5cc9c65..000000000 --- a/src/resources/map/walklayer.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 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_WALKLAYER_H -#define RESOURCES_MAP_WALKLAYER_H - -#include "resources/resource.h" - -#include "localconsts.h" - -class WalkLayer final : public Resource -{ - public: - WalkLayer(const int width, const int height); - - A_DELETE_COPY(WalkLayer) - - ~WalkLayer(); - - int *getData() - { return mTiles; } - - int getDataAt(const int x, const int y) const; - - int calcMemoryLocal() const override final; - - std::string getCounterName() const override final - { return "walk layer"; } - - private: - int mWidth; - int mHeight; - int *mTiles; -}; - -#endif // RESOURCES_MAP_WALKLAYER_H |