From f4fa50a413b11e33a7584ee1f0092879dfcb3902 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 17 Jul 2025 10:50:09 -0400 Subject: [PATCH] Colors are now being loaded from assets/palette.json --- Makefile | 4 ++-- assets/devices.json | 20 +++++++++---------- assets/enemies.json | 24 +++++++++++----------- assets/items.json | 8 ++++---- assets/map_tiles.png | Bin 9791 -> 9795 bytes assets/palette.json | 46 +++++++++++++++++++++++++++++++++++++++++++ assets/tiles.json | 30 ++++++++++++++-------------- components.hpp | 4 ++-- meson.build | 2 +- palette.cpp | 15 +++++++++++++- palette.hpp | 2 ++ tests/palette.cpp | 2 +- tools/icongen.cpp | 8 ++++---- 13 files changed, 113 insertions(+), 52 deletions(-) diff --git a/Makefile b/Makefile index 23c0dc6..11b8c6b 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ tracy_build: meson compile -j 10 -C builddir test: asset_build build - ./builddir/runtests "[color-palette]" + ./builddir/runtests run: build test ifeq '$(OS)' 'Windows_NT' @@ -60,7 +60,7 @@ clean: meson compile --clean -C builddir debug_test: build - gdb --nx -x .gdbinit --ex run --args builddir/runtests -e "[color-palette]" + gdb --nx -x .gdbinit --ex run --args builddir/runtests -e win_installer: powershell 'start "C:\Program Files (x86)\solicus\InstallForge\bin\ifbuilderenvx86.exe" scripts\win_installer.ifp' diff --git a/assets/devices.json b/assets/devices.json index 4b412f2..2bf5533 100644 --- a/assets/devices.json +++ b/assets/devices.json @@ -8,8 +8,8 @@ "randomized": false, "components": [ {"_type": "Tile", "display": 10949, - "foreground": [24, 205, 189], - "background": [24, 205, 189] + "foreground": "devices/fg:stairs_down", + "background": "devices/bg:stairs_down" }, {"_type": "Device", "config": {}, @@ -25,8 +25,8 @@ "placement": "fixed", "components": [ {"_type": "Tile", "display": 8793, - "foreground": [24, 205, 189], - "background": [24, 205, 189] + "foreground": "devices/fg:stairs_up", + "background": "devices/fg:stairs_up" }, {"_type": "Device", "config": {}, @@ -41,8 +41,8 @@ "inventory_count": 0, "components": [ {"_type": "Tile", "display": 95, - "foreground": [24, 205, 189], - "background": [24, 205, 189] + "foreground": "devices/fg:tripwire", + "background": "devices/bg:tripwire" }, {"_type": "Device", "config": {}, "events": ["TRAP"]}, {"_type": "Sprite", "name": "tripwire_trap", "width": 256, "height": 256, "scale": 1.0} @@ -54,8 +54,8 @@ "description": "A small rotten barrel that may hold things.", "components": [ {"_type": "Tile", "display": 85, - "foreground": [150, 100, 189], - "background": [150, 100, 189] + "foreground": "devices/fg:barrel", + "background": "devices/bg:barrel" }, {"_type": "Device", "config": {}, "events": ["LOOT_CONTAINER"]}, {"_type": "Sprite", "name": "barrel_small", "width": 256, "height": 256, "scale": 1.0}, @@ -68,8 +68,8 @@ "description": "Something died here. Was this your doing?", "components": [ {"_type": "Tile", "display": 8687, - "foreground": [32, 123, 164], - "background": [24, 205, 189] + "foreground": "devices/fg:grave_stone", + "background": "devices/bg:grave_stone" }, {"_type": "Device", "config": {}, "events": ["LOOT_CONTAINER"]}, {"_type": "Sprite", "name": "grave_stone", "width": 256, "height": 256, "scale": 1.0}, diff --git a/assets/enemies.json b/assets/enemies.json index a72c7d0..18d3a36 100644 --- a/assets/enemies.json +++ b/assets/enemies.json @@ -3,8 +3,8 @@ "placement": "fixed", "components": [ {"_type": "Tile", "display": 41981, - "foreground": [255, 200, 125], - "background": [0,0,0] + "foreground": "enemies/fg:player", + "background": "color:transparent" }, {"_type": "Combat", "hp": 200, "max_hp": 200, "damage": 10, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, @@ -14,8 +14,8 @@ "GOLD_SAVIOR": { "components": [ {"_type": "Tile", "display": 42586, - "foreground": [131, 213, 238], - "background": [0,0,0] + "foreground": "enemies/fg:gold_savior", + "background": "color:transparent" }, {"_type": "Combat", "hp": 20, "max_hp": 20, "damage": 1, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, @@ -29,8 +29,8 @@ "KNIGHT": { "components": [ {"_type": "Tile", "display": 2189, - "foreground": [131, 213, 238], - "background": [0,0,0] + "foreground": "enemies/fg:knight", + "background": "color:transparent" }, {"_type": "Combat", "hp": 20, "max_hp": 20, "damage": 1, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, @@ -44,8 +44,8 @@ "AXE_RANGER": { "components": [ {"_type": "Tile", "display": 1898, - "foreground": [156, 172, 197], - "background": [0,0,0] + "foreground": "enemies/fg:axe_ranger", + "background": "color:transparent" }, {"_type": "Combat", "hp": 40, "max_hp": 40, "damage": 10, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": true}, @@ -59,8 +59,8 @@ "RAT_GIANT": { "components": [ {"_type": "Tile", "display": 2220, - "foreground": [205, 164, 246], - "background": [0,0,0] + "foreground": "enemies/fg:rat_giant", + "background": "color:transparent" }, {"_type": "Combat", "hp": 50, "max_hp": 50, "damage": 2, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, @@ -74,8 +74,8 @@ "SPIDER_GIANT_HAIRY": { "components": [ {"_type": "Tile", "display": 1218, - "foreground": [205, 164, 246], - "background": [0,0,0] + "foreground": "enemies/fg:spider_giant", + "background": "color:transparent" }, {"_type": "Combat", "hp": 20, "max_hp": 20, "damage": 20, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, diff --git a/assets/items.json b/assets/items.json index bfefd71..5c25db3 100644 --- a/assets/items.json +++ b/assets/items.json @@ -7,8 +7,8 @@ "components": [ {"_type": "LightSource", "strength": 50, "radius": 2.5}, {"_type": "Tile", "display": 3848, - "foreground": [24, 120, 189], - "background": [0,0,0] + "foreground": "items/fg:flame", + "background": "color:transparent" }, {"_type": "Sprite", "name": "torch_horizontal_floor", "width": 256, "height": 256, "scale": 1.0}, {"_type": "Sound", "attack": "pickup", "death": "blank"} @@ -21,8 +21,8 @@ "inventory_count": 1, "components": [ {"_type": "Tile", "display": 1003, - "foreground": [255, 205, 189], - "background": [0,0,0] + "foreground": "items/fg:potion", + "background": "color:transparent" }, {"_type": "Curative", "hp": 20}, {"_type": "Sprite", "name": "healing_potion_small", "width": 256, "height": 256, "scale": 1.0}, diff --git a/assets/map_tiles.png b/assets/map_tiles.png index 1c87bb792e9431cf5a2ae2de052eec15a169fcda..33cd57b0ec2f1a1add812108a90afeaee2d4ba4f 100644 GIT binary patch literal 9795 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 m|MCXMz8pQ<;Qs>cjWI|7 literal 9791 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 PFp$Mg>m7GZ@KOH(ago3L diff --git a/assets/palette.json b/assets/palette.json index 8ae68f2..116cf7d 100644 --- a/assets/palette.json +++ b/assets/palette.json @@ -1,4 +1,7 @@ { + "color": { + "transparent": [255, 255, 255, 255] + }, "gui/line": { "light": [200,200,200], "mid": [100,100,100], @@ -15,5 +18,48 @@ "light": [200,200,200], "mid": [100,100,100], "dark": [10,10,10] + }, + "items/fg": { + "flame": [24, 120, 189], + "potion": [255, 205, 189] + }, + "enemies/fg": { + "player": [255, 200, 125], + "gold_savior": [131, 213, 238], + "knight": [131, 213, 238], + "axe_ranger": [156, 172, 197], + "rat_giant": [205, 164, 246], + "spider_giant": [205, 164, 246] + }, + "tiles/fg": { + "floor_tile": [40, 40, 40], + "wall_plain": [100, 100, 100], + "wall_moss": [100, 150, 100], + "ceiling_black": [100, 100, 100], + "lava_floor": [200, 100, 100], + "gray_stone_floor_light": [40, 60, 180], + "wood_wall": [70, 70, 70], + "BAD": [255, 0, 0] + }, + "tiles/bg": { + "wall_plain": [10, 10, 10], + "wall_moss": [100, 100, 180], + "lava_floor": [100, 100, 50], + "gray_stone_floor_light": [80, 80, 80], + "wood_wall": [100, 100, 100] + }, + "devices/fg": { + "stairs_down": [24, 205, 189], + "stairs_up": [24, 205, 189], + "tripwire": [24, 205, 189], + "barrel": [150, 100, 189], + "grave_stone": [32, 123, 164] + }, + "devices/bg": { + "stairs_down": [24, 205, 189], + "stairs_up": [24, 205, 189], + "tripwire": [24, 205, 189], + "barrel": [150, 100, 189], + "grave_stone": [24, 205, 189] } } diff --git a/assets/tiles.json b/assets/tiles.json index 91fc600..b3908e9 100644 --- a/assets/tiles.json +++ b/assets/tiles.json @@ -5,7 +5,7 @@ "display": 8284, "ceiling": "ceiling_black", "light": 0, - "foreground": [40, 40, 40], + "foreground": "tiles/fg:floor_tile", "id": 0 }, "wall_plain": { @@ -13,8 +13,8 @@ "collision": true, "display": 9608, "light": 0, - "foreground": [100, 100, 100], - "background": [10, 10, 10], + "foreground": "tiles/fg:wall_plain", + "background": "tiles/bg:wall_plain", "id": 1 }, "wall_moss": { @@ -22,8 +22,8 @@ "collision": true, "display": 9256, "light": 20, - "background": [100, 100, 180], - "foreground": [100, 150, 100], + "background": "tiles/bg:wall_moss", + "foreground": "tiles/fg:wall_moss", "id": 2 }, "ceiling_black": { @@ -31,7 +31,7 @@ "collision": false, "display": 35, "light": 0, - "foreground": [100, 100, 100], + "foreground": "tiles/fg:ceiling_black", "id": 4 }, "lava_floor": { @@ -40,18 +40,18 @@ "display": 10899, "ceiling": "ceiling_black", "light": 20, - "foreground": [200, 100, 100], - "background": [100, 100, 50], + "foreground": "tiles/fg:lava_floor", + "background": "tiles/bg:lava_floor", "id": 5 }, "gray_stone_floor_light": { "texture": "assets/textures/gray_stone_floor_light.png", "collision": false, "display": 11590, - "ceiling": "zceiling_blue_light", + "ceiling": "zBUGceiling_blue_light", "light": 40, - "background": [80, 80, 80], - "foreground": [40, 60, 180], + "foreground": "tiles/fg:gray_stone_floor_light", + "background": "tiles/bg:gray_stone_floor_light", "id": 6 }, "wood_wall": { @@ -59,16 +59,16 @@ "collision": false, "display": 10747, "light": 0, - "foreground": [70, 70, 70], - "background": [100, 100, 100], + "foreground": "tiles/fg:wood_wall", + "background": "tiles/bg:wood_wall", "id": 8 }, - "zceiling_blue_light": { + "zBUGceiling_blue_light": { "texture": "assets/textures/ceiling_blue_light.png", "collision": false, "display": 8285, "light": 0, - "foreground": [100, 100, 100], + "foreground": "tiles/fg:BAD", "id": 7 } } diff --git a/components.hpp b/components.hpp index 6bb6744..e1bbd56 100644 --- a/components.hpp +++ b/components.hpp @@ -39,8 +39,8 @@ namespace components { struct Tile { wchar_t display; - std::array foreground; - std::array background; + std::string foreground; + std::string background; }; struct GameConfig { diff --git a/meson.build b/meson.build index 0a2221c..54ad88e 100644 --- a/meson.build +++ b/meson.build @@ -172,7 +172,7 @@ executable('zedcaster', dependencies: dependencies) executable('icongen', - [ 'textures.cpp', 'config.cpp', 'dbc.cpp', 'tools/icongen.cpp' ], + [ 'palette.cpp', 'textures.cpp', 'config.cpp', 'dbc.cpp', 'tools/icongen.cpp' ], cpp_args: cpp_args, link_args: link_args, override_options: exe_defaults, diff --git a/palette.cpp b/palette.cpp index 63c0c12..cb689fb 100644 --- a/palette.cpp +++ b/palette.cpp @@ -9,11 +9,13 @@ namespace palette { struct PaletteMgr { std::unordered_map palettes; + std::string config; }; static PaletteMgr COLOR; void init(const string &json_file) { + COLOR.config = json_file; Config config(json_file); json& colors = config.json(); @@ -23,7 +25,7 @@ namespace palette { for(auto [value, rgba] : value_specs.items()) { auto color_path = base_key + ":" + value; dbc::check(!COLOR.palettes.contains(color_path), - fmt::format("PALLETES already has a color path {}", color_path)); + fmt::format("PALLETES config {} already has a color path {}", COLOR.config, color_path)); uint8_t alpha = rgba.size() == 3 ? 255 : (uint8_t)rgba[3]; @@ -35,6 +37,17 @@ namespace palette { } sf::Color get(const string& key) { + dbc::check(COLOR.palettes.contains(key), + fmt::format("COLOR {} is missing from {}", key, COLOR.config)); return COLOR.palettes.at(key); } + + sf::Color get(const string& key, const string& value) { + std::string color{key + ":" + value}; + + dbc::check(COLOR.palettes.contains(color), + fmt::format("COLOR {} is missing from {}", color, COLOR.config)); + + return COLOR.palettes.at(color); + } } diff --git a/palette.hpp b/palette.hpp index ad4a39a..03686d1 100644 --- a/palette.hpp +++ b/palette.hpp @@ -7,4 +7,6 @@ namespace palette { void init(const std::string &config="assets/palette.json"); sf::Color get(const string &key); + + sf::Color get(const string &key, const string &value); } diff --git a/tests/palette.cpp b/tests/palette.cpp index c3d2bbd..1fd28c2 100644 --- a/tests/palette.cpp +++ b/tests/palette.cpp @@ -12,7 +12,7 @@ TEST_CASE("color palette test", "[color-palette]") { auto gui_text = palette::get("gui/text:dark"); REQUIRE(gui_text == expect); - gui_text = palette::get("gui/text:mid"); + gui_text = palette::get("gui/text", "mid"); REQUIRE(gui_text != expect); expect = {100, 100, 100, 255}; diff --git a/tools/icongen.cpp b/tools/icongen.cpp index 4d25ac7..63d2759 100644 --- a/tools/icongen.cpp +++ b/tools/icongen.cpp @@ -9,6 +9,7 @@ #include #include #include "textures.hpp" +#include "palette.hpp" namespace fs = std::filesystem; constexpr const int TILE_COUNT=10; @@ -217,16 +218,14 @@ void load_config(MapConfig& config, bool is_centered, std::string path, std::fun (int)display, (std::string)key)); if(data.contains("foreground")) { - auto fg_color = data["foreground"]; - sf::Color fg{fg_color[0], fg_color[1], fg_color[2]}; + auto fg = palette::get(data["foreground"]); config.colors.insert_or_assign(display, fg); } else { config.colors.insert_or_assign(display, DEFAULT_COLOR); } if(data.contains("background")) { - auto bg_color = data["background"]; - sf::Color bg{bg_color[0], bg_color[1], bg_color[2]}; + auto bg = palette::get(data["background"]); config.backgrounds.insert_or_assign(display, bg); } else { sf::Color bg{0, 0, 0, 0}; @@ -249,6 +248,7 @@ json& component_display(json& val) { } int main() { + palette::init(); MapConfig config; load_config(config, false, "./assets/tiles.json", [](json& val) -> json& {