diff --git a/combat_ui.cpp b/combat_ui.cpp index 3f9cea6..dbbd7b3 100644 --- a/combat_ui.cpp +++ b/combat_ui.cpp @@ -17,20 +17,24 @@ namespace gui { void CombatUI::render() { for(auto& [name, cell] : $layout.cells) { - sf::RectangleShape button; - button.setPosition({float(cell.x + 10), float(cell.y + 10)}); - button.setSize({float(cell.w - 20), float(cell.h - 20)}); - button.setFillColor({100, 100, 100}); - button.setOutlineColor({200, 200, 200}); - button.setOutlineThickness(5); - $shapes.insert_or_assign(name, button); - - sf::Text label($font, name); - auto bounds = label.getLocalBounds(); - auto label_cell = lel::center(bounds.size.x, bounds.size.y, cell); - // this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box - label.setPosition({float(label_cell.x), float(label_cell.y) - label_cell.h / 2}); - $labels.push_back(label); + sf::RectangleShape shape; + shape.setPosition({float(cell.x + 3), float(cell.y + 3)}); + shape.setSize({float(cell.w - 6), float(cell.h - 6)}); + shape.setFillColor({100, 100, 100}); + + if(name.starts_with("button_")) { + shape.setOutlineColor({200, 200, 200}); + shape.setOutlineThickness(1); + + sf::Text label($font, name); + auto bounds = label.getLocalBounds(); + auto label_cell = lel::center(bounds.size.x, bounds.size.y, cell); + // this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box + label.setPosition({float(label_cell.x), float(label_cell.y) - label_cell.h / 2}); + $labels.push_back(label); + } + + $shapes.insert_or_assign(name, shape); } } @@ -50,8 +54,10 @@ namespace gui { void CombatUI::click(int x, int y) { if(auto name = $layout.hit(x, y)) { - auto& shape = $shapes.at(*name); - shape.setFillColor({100, 0, 0}); + if((*name).starts_with("button_")) { + auto& shape = $shapes.at(*name); + shape.setFillColor({100, 0, 0}); + } } } } diff --git a/combat_ui.hpp b/combat_ui.hpp index 49a1e03..4416628 100644 --- a/combat_ui.hpp +++ b/combat_ui.hpp @@ -11,8 +11,8 @@ namespace gui { class CombatUI { public: std::string $grid = - "[hp | ap ]" - "[attack1 | attack2 | attack3 | heal]"; + "[*%(100,150)button_attack1 | *%(100,150)button_attack2 | *%(100,150)button_attack3 | *%(100,150)button_heal]" + "[*%.(200,50)bar_hp | _ | %.(100,50)bar_ap ]"; lel::Parser $layout; GameLevel $level; sf::Font $font; diff --git a/lel.cpp b/lel.cpp index 8fca207..52cc236 100644 --- a/lel.cpp +++ b/lel.cpp @@ -17,12 +17,13 @@ namespace lel { } void Parser::id(std::string name) { - dbc::check(!cells.contains(name), - fmt::format("duplicate cell name {}", name)); - cells.insert_or_assign(name, cur); + if(name != "_") { + dbc::check(!cells.contains(name), + fmt::format("duplicate cell name {}", name)); + cells.insert_or_assign(name, cur); + } cur = {cur.col + 1, cur.row}; - auto& row = grid.back(); row.push_back(name); } @@ -32,8 +33,10 @@ namespace lel { int cell_height = grid_h / rows; for(auto& row : grid) { + size_t columns = row.size(); + for(auto& name : row) { - size_t columns = row.size(); + if(name == "_") continue; auto& cell = cells.at(name); int cell_width = grid_w / columns; diff --git a/tests/lel.cpp b/tests/lel.cpp index 2254d13..2bd3088 100644 --- a/tests/lel.cpp +++ b/tests/lel.cpp @@ -23,13 +23,17 @@ TEST_CASE("test basic ops", "[lel]") { for(size_t colcount = 0; colcount < row.size(); colcount++) { auto &name = row[colcount]; - auto &cell = parser.cells.at(name); - REQUIRE(cell.row == int(rowcount)); - REQUIRE(cell.col == int(colcount)); + if(name == "_") { + REQUIRE(!parser.cells.contains(name)); + } else { + auto &cell = parser.cells.at(name); + REQUIRE(cell.row == int(rowcount)); + REQUIRE(cell.col == int(colcount)); + } } } - REQUIRE(parser.cells.size() == 12); + REQUIRE(parser.cells.size() == 11); REQUIRE(parser.cells.at("label2").right == true); REQUIRE(parser.cells.at("text1").expand == true); REQUIRE(parser.cells.at("text1").w == 300);