X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmap%2FMap.cpp;h=2e05e8bf9025832bd810e20d8a0d1861574e8e95;hb=65f855e8181613291670bf1ef84623fabc4594d9;hp=450c00463ab7d3aa28ae90fcafd067f3620d833f;hpb=59c4aea0762cbc5f1bf74c5b1b35629408fb92af;p=l2e.git diff --git a/src/map/Map.cpp b/src/map/Map.cpp index 450c004..2e05e8b 100644 --- a/src/map/Map.cpp +++ b/src/map/Map.cpp @@ -10,6 +10,8 @@ #include "Area.h" #include "../graphics/Sprite.h" +#include + using geometry::Vector; namespace map { @@ -23,6 +25,25 @@ Map::Map() } +const Area &Map::AreaAt(const Vector &offset) const { + if (numAreas > 0) { + Vector tileOffset(offset.X() / tileset->Width(), offset.Y() / tileset->Height()); + Vector areaOffset(tileOffset.X() / areas[0].Width(), tileOffset.Y() / areas[0].Height()); + int areaIndex(areaOffset.Y() * width + areaOffset.X()); + if (areaIndex < numAreas) { + return areas[areaIndex]; + } + } + throw std::out_of_range("area offset out of bounds"); +} + +const Tile &Map::TileAt(const Vector &offset) const { + const Area &area(AreaAt(offset)); + Vector tileOffset((offset.X() / tileset->Width()) % area.Width(), (offset.Y() / tileset->Height()) % area.Height()); + return area.TileAt(tileOffset); +} + + void Map::Render(SDL_Surface *dest, const Vector &inOffset) const { // TODO: skip invisible areas for (int i(0); i < numAreas; ++i) {