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