From 144d6201929ebd84f48f6ab5b056b3cf1d2dc5af Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 26 Sep 2014 04:12:27 +0200 Subject: [PATCH] Implement a very simple map file format for further testing --- resources/map/test.map | 104 +++++++++++++++++++++++++++ resources/sprite/tile/grass.png | Bin 0 -> 1296 bytes resources/sprite/tile/road_left.png | Bin 0 -> 245 bytes resources/sprite/tile/road_right.png | Bin 0 -> 242 bytes src/model/Map.cpp | 86 ++++++++++++++++------ 5 files changed, 170 insertions(+), 20 deletions(-) create mode 100644 resources/map/test.map create mode 100644 resources/sprite/tile/grass.png create mode 100644 resources/sprite/tile/road_left.png create mode 100644 resources/sprite/tile/road_right.png diff --git a/resources/map/test.map b/resources/map/test.map new file mode 100644 index 0000000..35fada7 --- /dev/null +++ b/resources/map/test.map @@ -0,0 +1,104 @@ +32 32 2 + +G 0 grass +< 0 road_left +> 0 road_right + +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 +11111111111111111111111111111111 + +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG +GGGGGGGGGGG<>GGGGGGGGGGGGGGGGGGG + +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ diff --git a/resources/sprite/tile/grass.png b/resources/sprite/tile/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..7835867c844e5d76968a421f04ab39c2c1d14bfe GIT binary patch literal 1296 zcmV+r1@HQaP)7nP31=2iS(= z(4z$keHkX#w~U_xh4Hs;ufkrCjT!<$XJ`n5_Qb3@NJIA8kf;Hpe2w^Jf}wV0E3*wL zcr!4^gW|$#TXJbGHpKf-BLX!F0FCIf{*PsR9WgO?X>0nW)0w~J_^$r3BY*$~>dP44 zI%d_aYL*t0lSa*o^Qc*nsYFV%`iHqb4GrZ%5!Y?p4qnH&?|$Vl(h#o$LakjuJr^?l zO(Qv;vJz2b$}b#_xCs<^V17+?ud~t4z5TpG0W&~GK4rXZ^?>%%)G5JTI~~;<{M)W1LJ;> zz*an1eo1t|U}w^Tc;T2@JNMd?B-g@DIB*=Koeb2RnhQ~NpXy)`%P>22kQl;Hel3}) zJl-{bV|Hm8(u~~7evW!74CI5xzh)%H)y6d~RV_Yz|=)VoDBI+4DQ7x*D z_QJ_eO0V{Aq4aH?6fg7Mu`_bOEvh;BOA;$gCL#Z%U6E_}BwM(9mmUsdNj6M5q z*oy7aU}Z1eE@>-PQYaX0BB=hUqkt!&G`7XYckU&<-Te`LB2Ll=(mgU z(zRz50gSuMyP*<*%6Q;hfq~HJ`R0n|M#MlfiR5EU9)H~^L!A`48(ZKI>=8QUFL=b z0Bn3q8ZcP9>i5+@st%P8X=h-9Wt97M@*H;x8lvw_qNu|b`VN{l;zP+>f(zN@{R7=#d4K_@5Tid6z334pI%CQ)*X zXUrcK0Mq+6t*rKlV|^EK)E{=N@5lZTJ@YuyJNxmF&WzoI6z?feSmzcksAB z>{#EA{Uh>05Z+|&Gb-z^yz7+Yi??K;c=0z(k~_`~9zL8t>Xgyipk zJeI93j`h9fO)=-u<0*OzWg)7T(7$Ea(8iL1)CJ865?TwpWSUV32t zyX&=c#Va(v-E$A0)i8NcSKqo-yBJ;6k9Sq5O^9T&cet$iVDGkOfiv761TM}o78X`C zGBgrmV$pXn_$?QmovNhdv}npCeK!7%c17pGY#9=>&8ygQu&X%Q~loCIDurTyp>b literal 0 HcmV?d00001 diff --git a/src/model/Map.cpp b/src/model/Map.cpp index cb1cb30..ac0b6ee 100644 --- a/src/model/Map.cpp +++ b/src/model/Map.cpp @@ -26,6 +26,10 @@ #include "Map.hpp" +#include +#include +#include + namespace RPGEdit { @@ -85,32 +89,74 @@ void Map::finishEntityTransition(Entity *entity) { } std::unique_ptr Map::load(__attribute__((unused)) const std::string &name) { - std::unique_ptr map(new Map(16, 16, 2)); + std::string filename = "../resources/map/" + name + ".map"; - map->tileset.emplace_back("dirt", 0); - map->tileset.emplace_back("horizontal_bar", 0); - map->tileset.emplace_back("horizontal_bar", 2); + std::ifstream file; - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - if (4 <= i && i < 12 && 4 <= j && j < 12) { - map->setTileAt(0, Position{i, j}, 1); - map->setCollisionAt(Position{i, j}, CollisionType::EMPTY); - } - else { - map->setTileAt(0, Position{i, j}, 0); - } + file.exceptions(std::ifstream::failbit | std::ifstream::badbit); + file.open(filename.c_str()); - if (4 <= i && i < 12 && j == 7) - map->setTileAt(1, Position{i, j}, 3); - else if (4 <= i && i < 12 && j == 8) - map->setTileAt(1, Position{i, j}, 2); - else - map->setTileAt(1, Position{i, j}, 0); + std::string line; + + std::getline(file, line); + size_t w, h, layers; + if (std::sscanf(line.c_str(), "%zu %zu %zu", &w, &h, &layers) != 3) + throw std::invalid_argument("invalid map file"); + + std::unique_ptr map(new Map(w, h, layers)); + + std::getline(file, line); + if (line.length()) + throw std::invalid_argument("invalid map file"); + + size_t n = 1; + std::unordered_map tileset; + + for (std::getline(file, line); line.length(); std::getline(file, line)) { + char c; + unsigned rot; + char *tile = nullptr; + + if (std::sscanf(line.c_str(), "%c %u %ms", &c, &rot, &tile) != 3) { + std::free(tile); + throw std::invalid_argument("invalid map file"); + } + + tileset.emplace(c, n++); + map->tileset.emplace_back(tile, rot); + std::free(tile); + } + + for (size_t i = 0; i < h; i++) { + std::getline(file, line); + if (line.length() != w) + throw std::invalid_argument("invalid map file"); + + for (size_t j = 0; j < w; j++) { + if (line[j] == '1') + map->setCollisionAt(Position{int(j), int(i)}, CollisionType::EMPTY); + else if (line[j] != '0') + throw std::invalid_argument("invalid map file"); } } - map->addEntity("square", Model::Position{6, 6}); + for (size_t layer = 0; layer < layers; layer++) { + std::getline(file, line); + if (line.length()) + throw std::invalid_argument("invalid map file"); + + for (size_t i = 0; i < h; i++) { + std::getline(file, line); + if (line.length() != w) + throw std::invalid_argument("invalid map file"); + + for (size_t j = 0; j < w; j++) { + auto it = tileset.find(line[j]); + if (it != tileset.end()) + map->setTileAt(layer, Position{int(j), int(i)}, it->second); + } + } + } return map; }