parent
290affa49a
commit
b66a3154c7
@ -0,0 +1,26 @@ |
|||||||
|
#include <catch2/catch_test_macros.hpp> |
||||||
|
#include <fmt/core.h> |
||||||
|
#include "map.hpp" |
||||||
|
#include "worldbuilder.hpp" |
||||||
|
#include "tilemap.hpp" |
||||||
|
#include "config.hpp" |
||||||
|
#include "rand.hpp" |
||||||
|
|
||||||
|
using namespace fmt; |
||||||
|
using std::string; |
||||||
|
|
||||||
|
TEST_CASE("tilemap can load tiles and make a map", "[tilemap]") { |
||||||
|
size_t width = Random::uniform<size_t>(10, 25); |
||||||
|
size_t height = Random::uniform<size_t>(10, 33); |
||||||
|
|
||||||
|
Map map(width,height); |
||||||
|
WorldBuilder builder(map); |
||||||
|
builder.generate(); |
||||||
|
|
||||||
|
Config config("./assets/tiles.json"); |
||||||
|
TileMap tiles(config, width, height); |
||||||
|
auto& walls = map.walls(); |
||||||
|
tiles.load(walls); |
||||||
|
tiles.dump(); |
||||||
|
REQUIRE(tiles.INVARIANT()); |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
#include "tilemap.hpp" |
||||||
|
#include "dbc.hpp" |
||||||
|
#include "constants.hpp" |
||||||
|
#include "render.hpp" |
||||||
|
|
||||||
|
TileMap::TileMap(Config& config, size_t width, size_t height) |
||||||
|
: $config(config), |
||||||
|
$width(width), |
||||||
|
$height(height), |
||||||
|
$tile_ids(height, matrix::Row(width, SPACE_VALUE)), |
||||||
|
$display(height, TileRow(width, "")) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
void TileMap::dump(int show_x, int show_y) { |
||||||
|
SFMLRender::init_terminal(); |
||||||
|
for(matrix::each_row it{$tile_ids}; it.next();) { |
||||||
|
string cell = $display[it.y][it.x]; |
||||||
|
|
||||||
|
if(int(it.x) == show_x && int(it.y) == show_y) { |
||||||
|
fmt::print("{}<", cell); |
||||||
|
} else { |
||||||
|
fmt::print("{} ", cell); |
||||||
|
} |
||||||
|
|
||||||
|
if(it.row) fmt::print("\n"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void TileMap::load(matrix::Matrix &walls) { |
||||||
|
for(matrix::each_cell it{walls}; it.next();) { |
||||||
|
string tile_name = walls[it.y][it.x] == SPACE_VALUE ? "FLOOR_TILE" : "WALL_TILE"; |
||||||
|
|
||||||
|
std::wstring tile = $config.wstring(tile_name); |
||||||
|
std::string tile_s = $config[tile_name]; |
||||||
|
|
||||||
|
$tile_ids[it.y][it.x] = tile[0]; |
||||||
|
$display[it.y][it.x] = tile_s; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bool TileMap::INVARIANT() { |
||||||
|
dbc::check(matrix::height($tile_ids) == $height, "$tile_ids has wrong height"); |
||||||
|
dbc::check(matrix::width($tile_ids) == $width, "$tile_ids has wrong width"); |
||||||
|
return true; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
#pragma once |
||||||
|
#include <vector> |
||||||
|
#include <utility> |
||||||
|
#include <string> |
||||||
|
#include <algorithm> |
||||||
|
#include <fmt/core.h> |
||||||
|
#include "point.hpp" |
||||||
|
#include "matrix.hpp" |
||||||
|
#include "config.hpp" |
||||||
|
|
||||||
|
typedef std::vector<std::string> TileRow; |
||||||
|
typedef std::vector<TileRow> TileDisplay; |
||||||
|
|
||||||
|
class TileMap { |
||||||
|
public: |
||||||
|
Config &$config; |
||||||
|
size_t $width; |
||||||
|
size_t $height; |
||||||
|
matrix::Matrix $tile_ids; |
||||||
|
TileDisplay $display; |
||||||
|
|
||||||
|
TileMap(Config &config, size_t width, size_t height); |
||||||
|
|
||||||
|
// disable copying
|
||||||
|
TileMap(TileMap &map) = delete; |
||||||
|
|
||||||
|
size_t width() { return $width; } |
||||||
|
size_t height() { return $height; } |
||||||
|
void load(matrix::Matrix &walls); |
||||||
|
|
||||||
|
void dump(int show_x=-1, int show_y=-1); |
||||||
|
bool INVARIANT(); |
||||||
|
}; |
Loading…
Reference in new issue