From 89e31279be2414bd985c288411fcdf9b316ccaec Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 24 Dec 2024 02:56:17 -0500 Subject: [PATCH] Now have color and display char coming from assets/tiles.json but lighting still needs work. --- assets/tiles.json | 36 ++++++++++++++++++++++++++++++------ systems.cpp | 21 +++++---------------- tilemap.cpp | 32 +++++++++++++++++++++----------- tilemap.hpp | 19 +++++++++++++++---- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/assets/tiles.json b/assets/tiles.json index 125a3a8..f251855 100644 --- a/assets/tiles.json +++ b/assets/tiles.json @@ -1,8 +1,32 @@ { - "WALL_TILE": "\ua5b8", - "FLOOR_TILE": "\u2849", - "PLAYER_TILE": "\ua66b", - "ENEMY_TILE": "\u1d5c", - "BG_TILE": "█", - "WATER_TILE": "\u224b" + "WALL_TILE": { + "foreground": [230, 20, 0], + "background": [230, 20, 0], + "display": "\ua5b8" + }, + "FLOOR_TILE": { + "foreground": [80, 100, 0], + "background": [30, 20, 0], + "display":"\u2849" + }, + "PLAYER_TILE": { + "foreground": [255, 200, 0], + "background": [30, 20, 0], + "display":"\ua66b" + }, + "ENEMY_TILE": { + "foreground": [255, 200, 0], + "background": [30, 20, 0], + "display":"\u1d5c" + }, + "BG_TILE": { + "foreground": [230, 20, 0], + "background": [230, 20, 0], + "display":"█" + }, + "WATER_TILE": { + "foreground": [132, 200, 0], + "background": [147, 220, 0], + "display":"\u224b" + } } diff --git a/systems.cpp b/systems.cpp index deaa2ad..77cdae2 100644 --- a/systems.cpp +++ b/systems.cpp @@ -176,7 +176,6 @@ void System::draw_entities(DinkyECS::World &world, Map &game_map, const Matrix & void System::draw_map(DinkyECS::World &world, Map &game_map, const Matrix &lighting, ftxui::Canvas &canvas, size_t view_x, size_t view_y) { const auto& debug = world.get_the(); - const auto& config = world.get_the(); const auto& player = world.get_the(); const auto& player_position = world.get(player.entity); Point start = game_map.center_camera(player_position.location, view_x, view_y); @@ -188,15 +187,10 @@ void System::draw_map(DinkyECS::World &world, Map &game_map, const Matrix &light for(size_t y = 0; y < end_y; ++y) { for(size_t x = 0; x < end_x; ++x) { - const string& tile = tiles.at(start.x+x, start.y+y); + const TileCell& tile = tiles.at(start.x+x, start.y+y); int light_value = debug.LIGHT ? 160 : lighting[start.y+y][start.x+x]; - if(tile == config.WALL_TILE) { - canvas.DrawText(x * 2, y * 4, config.WALL_TILE, [light_value](auto &pixel) { - pixel.foreground_color = Color::HSV(230, 20, 10); - pixel.background_color = Color::HSV(230, 20, light_value / 2); - }); - } else if(debug.PATHS) { + if(debug.PATHS) { int dnum = paths[start.y+y][start.x+x]; string num = format("{:x}", dnum); num = num.size() > 2 ? "*" : num; @@ -205,15 +199,10 @@ void System::draw_map(DinkyECS::World &world, Map &game_map, const Matrix &light pixel.foreground_color = Color::HSV(dnum * 20, 150, 200); pixel.background_color = Color::HSV(30, 20, light_value / 5); }); - } else if(tile == config.WATER_TILE) { - canvas.DrawText(x * 2, y * 4, tile, [light_value](auto &pixel) { - pixel.foreground_color = Color::HSV(132, 200, std::min(int(light_value * 1.5), 200)); - pixel.background_color = Color::HSV(147, 220, light_value / 1.5); - }); } else { - canvas.DrawText(x * 2, y * 4, tile, [light_value](auto &pixel) { - pixel.foreground_color = Color::HSV(80, 100, light_value / 1.5); - pixel.background_color = Color::HSV(30, 20, light_value / 3); + canvas.DrawText(x * 2, y * 4, tile.display, [tile, light_value](auto &pixel) { + pixel.foreground_color = Color::HSV(tile.fg_h, tile.fg_s, light_value); + pixel.background_color = Color::HSV(tile.bg_h, tile.bg_s, light_value / 2); }); } } diff --git a/tilemap.cpp b/tilemap.cpp index 5128c74..44a5763 100644 --- a/tilemap.cpp +++ b/tilemap.cpp @@ -3,25 +3,27 @@ #include "constants.hpp" #include "render.hpp" +using nlohmann::json; +using ftxui::Color; + TileMap::TileMap(size_t width, size_t height) : $config("./assets/tiles.json"), $width(width), $height(height), $tile_ids(height, matrix::Row(width, SPACE_VALUE)), - $display(height, TileRow(width, "")) + $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]; + const TileCell &cell = $display[it.y][it.x]; if(int(it.x) == show_x && int(it.y) == show_y) { - fmt::print("{}<", cell); + fmt::print("{}<", cell.display); } else { - fmt::print("{} ", cell); + fmt::print("{} ", cell.display); } if(it.row) fmt::print("\n"); @@ -32,16 +34,24 @@ 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); - string tile_s = $config[tile_name]; - - $tile_ids[it.y][it.x] = tile[0]; - $display[it.y][it.x] = tile_s; + std::wstring tile_id = $config.wstring(tile_name, "display"); + json tile_conf = $config[tile_name]; + TileCell tile{ + tile_conf["display"], + tile_conf["foreground"][0], + tile_conf["foreground"][1], + tile_conf["foreground"][2], + tile_conf["background"][0], + tile_conf["background"][1], + tile_conf["background"][2]}; + + $tile_ids[it.y][it.x] = tile_id[0]; + $display[it.y][it.x] = tile; } } -const string &TileMap::at(size_t x, size_t y) { +const TileCell &TileMap::at(size_t x, size_t y) { return $display[y][x]; } diff --git a/tilemap.hpp b/tilemap.hpp index 407648e..a4e210e 100644 --- a/tilemap.hpp +++ b/tilemap.hpp @@ -7,9 +7,20 @@ #include "point.hpp" #include "matrix.hpp" #include "config.hpp" +#include -typedef std::vector TileRow; -typedef std::vector TileDisplay; +struct TileCell { + std::string display; + uint8_t fg_h; + uint8_t fg_s; + uint8_t fg_v; + uint8_t bg_h; + uint8_t bg_s; + uint8_t bg_v; +}; + +typedef std::vector TileRow; +typedef std::vector TileGrid; class TileMap { public: @@ -17,7 +28,7 @@ public: size_t $width; size_t $height; matrix::Matrix $tile_ids; - TileDisplay $display; + TileGrid $display; TileMap(size_t width, size_t height); @@ -27,7 +38,7 @@ public: size_t width() { return $width; } size_t height() { return $height; } void load(matrix::Matrix &walls); - const std::string &at(size_t x, size_t y); + const TileCell &at(size_t x, size_t y); void dump(int show_x=-1, int show_y=-1); bool INVARIANT();