/* Copyright: (c) Kayne Ruse 2013 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. */ #ifndef REGION_HPP_ #define REGION_HPP_ #include "tile.hpp" #include /* A single section of the map. * This class stores the tiles relative to it's own position, but * there are functions for referencing the tiles' absolute position. * These functions simply wrap the normal functions. * * TODO: This class needs to be thoroughly tested. */ class Region { public: Region() = delete; Region(int x, int y, int width, int height); ~Region() = default; //create and insert a new tile, overwriting an existing tile at that location bool NewTileR(Tile const& tile); bool NewTileA(Tile const& tile) { return NewTileR({tile.x - x, tile.y - y, tile.depth, tile.value}); } //find the first tile at this location, with the specified minimum depth //since neither the Region or Tile classes store the tile sizes, //this function takes the sizes as arguments Tile GetTileR(int tx, int ty, int tw, int th, int minDepth); Tile GetTileA(int tx, int ty, int tw, int th, int minDepth) { return GetTileR(tx - x, ty - y, tw, th, minDepth); } //wrap the other delete functions bool DeleteTileR(int tx, int ty, int tw, int th, int minDepth) { return DeleteTileR(GetTileR(tx, ty, tw, th, minDepth)); } bool DeleteTileA(int tx, int ty, int tw, int th, int minDepth) { //explicitly skip one function call by adjusting from A to R return DeleteTileR(GetTileR(tx - x, ty - y, tw, th, minDepth)); } //delete the specified tile bool DeleteTileR(Tile const& tile); bool DeleteTileA(Tile const& tile) { return DeleteTileR({tile.x - x, tile.y - y, tile.depth, tile.value}); } //find if the specified location exists within the region's bounds bool InBoundsR(int i, int j) { return (i >= 0) && (j >= 0) && (i < width) && (j < height); } bool InBoundsA(int i, int j) { return InBoundsR(i - x, j - y); } //Raw accessors & mutators int GetX() const { return x; } int GetY() const { return y; } int GetWidth() const { return width; } int GetHeight() const { return height; } std::set* GetTiles() { return &tiles; } //sorting the regions by the locations friend bool operator<(Region const& lhs, Region const& rhs); friend bool operator>(Region const& lhs, Region const& rhs); friend bool operator==(Region const& lhs, Region const& rhs); public: //TMP int const x; int const y; int const width; int const height; std::set tiles; }; #endif