From 93e258cb1b6dc75ecfdd189b8200772aa18104d2 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 12 Jun 2025 01:30:03 -0400 Subject: [PATCH] Basic UI grid around the work computer. --- main.cpp | 125 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 89 insertions(+), 36 deletions(-) diff --git a/main.cpp b/main.cpp index 0b83610..6a925e0 100644 --- a/main.cpp +++ b/main.cpp @@ -5,17 +5,18 @@ #include #include #include +#include +#include "dbc.hpp" constexpr const int SCREEN_WIDTH=1280; constexpr const int SCREEN_HEIGHT=720; constexpr const int FRAME_LIMIT=60; constexpr const bool VSYNC=true; -bool GO_TO_WORK = false; using std::string, std::wstring; enum class Event { - CLICKER, A_BUTTON + CLICKER, GIVE_TREAT, GIVE_FOOD, GIVE_WATER, GIVE_PETS, WORK }; struct Shake { @@ -68,6 +69,27 @@ struct Shake { } }; +struct GameState { + bool at_work = false; +}; + +static GameState GAME; +std::unordered_map STATS { + {"Food", 0L}, + {"Water", 0L}, + {"Money", 100L}, + {"Mood", 0L} +}; + +std::unordered_map EVENTS { + {"GiveTreat", Event::GIVE_TREAT}, + {"GiveFood", Event::GIVE_FOOD}, + {"GiveWater", Event::GIVE_WATER}, + {"GivePets", Event::GIVE_PETS}, + {"Work", Event::WORK} +}; + + struct ClickerUI { guecs::UI $gui; guecs::Entity $clicker; @@ -75,11 +97,16 @@ struct ClickerUI { ClickerUI() { $gui.position(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); $gui.layout( - "[FoodBowl|_|*%(300,400)clicker|_|_|_]" - "[WaterBowl|_|_ |_|_|_]" + "[Food|_|*%(300,400)clicker|_|_|_]" + "[Water|_|_ |_|_|_]" "[Mood|_|_ |_|_|_]" "[Money|_|_ |_|_|_]" - "[Treat|Food|Water|Pet|Work]"); + "[GiveTreat|GiveFood|GiveWater|GivePets|Work]"); + } + + std::wstring make_stat_label(const std::string& name) { + return fmt::format(L"{}:\n{}", guecs::to_wstring(name), + STATS.at(name)); } void init() { @@ -89,18 +116,16 @@ struct ClickerUI { auto id = $gui.entity(name); if(name != "clicker") { $gui.set(id, {}); - $gui.set(id, {}); - $gui.set(id, { guecs::to_wstring(name) }); - - if(name == "Work") { - $gui.set(id, { [&](auto, auto) { - GO_TO_WORK = true; - fmt::println("Going to Work!"); - } }); + if(STATS.contains(name)) { + $gui.set(id, { make_stat_label(name) }); } else { + dbc::check(EVENTS.contains(name), fmt::format("INVALID EVENT {}, not in EVENTS map", name)); + + $gui.set(id, {}); $gui.set(id, { - [&](auto, auto) { handle_button(Event::A_BUTTON); } + [&](auto, auto) { handle_button(EVENTS.at(name)); } }); + $gui.set(id, { guecs::to_wstring(name) }); } } } @@ -136,22 +161,52 @@ struct ClickerUI { $gui.mouse(x, y, hover); } + void update_stats() { + for(auto& [name, stat] : STATS) { + auto gui_id = $gui.entity(name); + auto& text = $gui.get(gui_id); + text.update(make_stat_label(name)); + } + } + void handle_button(Event ev) { + bool is_happy = false; + auto& shaker = $gui.get($clicker); + auto& sprite = $gui.get($clicker); + using enum Event; switch(ev) { - case CLICKER: { - auto& shaker = $gui.get($clicker); - auto& sprite = $gui.get($clicker); - shaker.play(sprite); - fmt::println("CLICKER LOVES YOU!"); - } break; - case A_BUTTON: - fmt::println("a button clicked"); - break; - + case CLICKER: // fallthrough + case GIVE_PETS: + STATS["Mood"]++; + is_happy = true; + break; + case GIVE_TREAT: + STATS["Food"]++; + STATS["Mood"]++; + STATS["Money"]--; + is_happy = true; + break; + case GIVE_FOOD: + STATS["Food"]++; + STATS["Money"]--; + is_happy = true; + break; + case GIVE_WATER: + STATS["Water"]++; + STATS["Money"]--; + is_happy = true; + break; + case WORK: + GAME.at_work = true; + break; default: - assert(false && "invalid event"); + assert(false && "invalid event"); } + + + update_stats(); + if(is_happy) shaker.play(sprite); } }; @@ -161,26 +216,24 @@ struct WorkComputerUI { WorkComputerUI() { $gui.position(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - $gui.layout("[computer]"); + $gui.layout( + "[*%(100,200)clicker|a2 |a3|a4|a5 |*%(100,200)postit1]" + "[_ |a9 |*%(300,300)computer|_|_|_]" + "[a15 |a16|_ |_|_|*%(100,200)postit2]" + "[*%(100,200)coffee |a23|_ |_|_|_]" + "[_ |a50|a51|a52|a53|a54]"); } void init() { guecs::Background bg{$gui.$parser}; bg.set_sprite("work_computer"); $gui.set($gui.MAIN, bg); - - auto computer = $gui.entity("computer"); - $gui.set(computer, {L"Work Computer"}); - $gui.set(computer, { [&](auto, auto) { - GO_TO_WORK = false; - fmt::println("Leaving Work!"); - } }); - $gui.init(); } void render(sf::RenderWindow& window) { $gui.render(window); + $gui.debug_layout(window); } void mouse(float x, float y, bool hover) { @@ -213,7 +266,7 @@ int main() { if(const auto* mouse = event->getIf()) { if(mouse->button == sf::Mouse::Button::Left) { sf::Vector2f pos = window.mapPixelToCoords(mouse->position); - if(GO_TO_WORK) { + if(GAME.at_work) { computer.mouse(pos.x, pos.y, false); } else { clicker.mouse(pos.x, pos.y, false); @@ -222,7 +275,7 @@ int main() { } } - if(GO_TO_WORK) { + if(GAME.at_work) { window.clear(); computer.render(window); } else {