From 903fad871f4c8ef04594b1d19ab1da36d6463349 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 2 Apr 2026 00:38:41 -0400 Subject: [PATCH] Now have all four screens showing up when needed, but now need to a way to restart the game. --- assets/config.json | 5 +++ assets/devices.json | 18 +++++++++ assets/enemies.json | 4 +- assets/sprites/open_vent.png | Bin 0 -> 9844 bytes src/combat/combat.cpp | 9 ++--- src/game/components.hpp | 2 +- src/game/systems.cpp | 7 ++-- src/gui/body_ui.cpp | 1 - src/gui/fsm.cpp | 73 +++++++++++++++++++++++++++++------ src/gui/fsm.hpp | 12 +++++- src/main.cpp | 5 ++- 11 files changed, 110 insertions(+), 26 deletions(-) create mode 100644 assets/sprites/open_vent.png diff --git a/assets/config.json b/assets/config.json index 7961f8b..4fff41e 100644 --- a/assets/config.json +++ b/assets/config.json @@ -27,6 +27,11 @@ "frame_width": 256, "frame_height": 256 }, + "open_vent": + {"path": "assets/sprites/open_vent.png", + "frame_width": 256, + "frame_height": 256 + }, "dead_body": {"path": "assets/sprites/dead_body.png", "frame_width": 256, diff --git a/assets/devices.json b/assets/devices.json index 70abeb3..e3bb67b 100644 --- a/assets/devices.json +++ b/assets/devices.json @@ -17,6 +17,24 @@ {"_type": "Sprite", "name": "ladder_down", "width": 256, "height": 256, "scale": 1.0} ] }, + "OPEN_VENT": { + "id": "OPEN_VENT", + "name": "Open Vent", + "placement": "fixed", + "description": "Your Goal.", + "inventory_count": 0, + "randomized": false, + "components": [ + {"_type": "Tile", "display": 6106, + "foreground": "devices/fg:stairs_down", + "background": "devices/bg:stairs_down" + }, + {"_type": "Device", + "config": {}, + "events": ["STAIRS_DOWN"]}, + {"_type": "Sprite", "name": "open_vent", "width": 256, "height": 256, "scale": 1.0} + ] + }, "DEAD_BODY_LOOTABLE": { "id": "DEAD_BODY_LOOTABLE", "name": "Grave Stone", diff --git a/assets/enemies.json b/assets/enemies.json index b874da5..dd3c0e0 100644 --- a/assets/enemies.json +++ b/assets/enemies.json @@ -6,7 +6,7 @@ "foreground": "enemies/fg:player", "background": "color:transparent" }, - {"_type": "Combat", "max_hp": 200, "max_ap": 12, "ap_delta": 6, "damage": 20, "dead": false, + {"_type": "Combat", "max_hp": 200, "max_ap": 12, "ap_delta": 6, "damage": 200, "body_parts": { "head": 200, "chest": 200, @@ -30,7 +30,7 @@ "foreground": "enemies/fg:rat_giant", "background": "color:transparent" }, - {"_type": "Combat", "max_hp": 50, "max_ap": 12, "ap_delta": 6,"damage": 30, "dead": false, + {"_type": "Combat", "max_hp": 50, "max_ap": 12, "ap_delta": 6,"damage": 30, "body_parts": { "head": 50, "chest": 50, diff --git a/assets/sprites/open_vent.png b/assets/sprites/open_vent.png new file mode 100644 index 0000000000000000000000000000000000000000..830490d1314bbd9f8932a7d7f3661a834e36e628 GIT binary patch literal 9844 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 literal 0 HcmV?d00001 diff --git a/src/combat/combat.cpp b/src/combat/combat.cpp index 6f93dd0..9ba9217 100644 --- a/src/combat/combat.cpp +++ b/src/combat/combat.cpp @@ -25,10 +25,7 @@ namespace components { dbc::check(hp >= 0, "HP went negative"); // don't hit dead parts - if(hp == 0) { - dbc::log("IT's zero."); - return; - } + if(hp == 0) return; // don't go below 0 body_parts[name] = std::max(0, hp - my_dmg); @@ -36,7 +33,9 @@ namespace components { } bool Combat::less_than(int level) { - return body_parts["head"] <= level || body_parts["stomach"] <= level || body_parts["chest"] <= level; + return body_parts["head"] <= level + || body_parts["stomach"] <= level + || body_parts["chest"] <= level; } bool Combat::is_dead() { diff --git a/src/game/components.hpp b/src/game/components.hpp index fcd9d95..bfc5ade 100644 --- a/src/game/components.hpp +++ b/src/game/components.hpp @@ -131,7 +131,7 @@ namespace components { int ap = 0; /* NOTE: This is used to _mark_ entities as dead, to detect ones that have just died. Don't make attack automatically set it.*/ - bool dead = false; + bool has_died = false; bool less_than(int level); int attack(Combat &target); diff --git a/src/game/systems.cpp b/src/game/systems.cpp index 5642b08..65d1c3e 100644 --- a/src/game/systems.cpp +++ b/src/game/systems.cpp @@ -195,13 +195,14 @@ void System::death() { world.query([&](auto ent, auto &combat) { // bring out yer dead - if(combat.is_dead() && !combat.dead) { - combat.dead = true; + if(!combat.has_died && combat.is_dead()) { + combat.has_died = true; if(ent != player.entity) { // we won't change out the player's components later dead_things.push_back(ent); } // we need to send this event for everything that dies + dbc::log("SENT DEATH!"); world.send(game::Event::DEATH, ent, {}); } else if(combat.almost_dead()) { // if enemies are below 50% health they are marked with bad health @@ -304,7 +305,7 @@ void System::collision() { for(auto entity : nearby) { if(world.has(entity)) { auto combat = world.get(entity); - if(!combat.dead) { + if(!combat.has_died) { combat_count++; world.send(game::Event::COMBAT_START, entity, entity); } diff --git a/src/gui/body_ui.cpp b/src/gui/body_ui.cpp index 43f6f0c..ffea011 100644 --- a/src/gui/body_ui.cpp +++ b/src/gui/body_ui.cpp @@ -29,7 +29,6 @@ namespace gui { auto gui_id = $gui.entity(name); $gui.set(gui_id, {guecs::to_wstring(name)}); - $gui.set(gui_id, {1, THEME.TRANSPARENT}); $gui.set(gui_id, {1.0f, THEME.DARK_MID, {}}); } diff --git a/src/gui/fsm.cpp b/src/gui/fsm.cpp index 38cf346..640630b 100644 --- a/src/gui/fsm.cpp +++ b/src/gui/fsm.cpp @@ -31,7 +31,10 @@ namespace gui { void FSM::event(Event ev, std::any data) { switch($state) { FSM_STATE(State, START, ev); - FSM_STATE(State, START_SCREEN, ev); + FSM_STATE(State, START_SCENE, ev); + FSM_STATE(State, DEATH_SCENE, ev); + FSM_STATE(State, WIN_SCENE, ev); + FSM_STATE(State, NEXT_LEVEL_SCENE, ev); FSM_STATE(State, MOVING, ev); FSM_STATE(State, ATTACKING, ev, data); FSM_STATE(State, ROTATING, ev); @@ -56,19 +59,16 @@ namespace gui { $status_ui.init(); run_systems(); - $cur_scene = $scenes["STARTING"]; - dbc::check($cur_scene != nullptr, "No STARTING scene?!"); - - state(State::START_SCREEN); + show_scene("STARTING"); + state(State::START_SCENE); } - void FSM::START_SCREEN(Event ev) { + void FSM::START_SCENE(Event ev) { using enum Event; switch(ev) { case MOUSE_CLICK: - dbc::log("CLICK!"); - $cur_scene = nullptr; + close_scene(); state(State::IDLE); break; case MOUSE_MOVE: { @@ -81,6 +81,46 @@ namespace gui { } } + void FSM::DEATH_SCENE(Event ev) { + using enum Event; + + switch(ev) { + case MOUSE_CLICK: + show_scene("STARTING"); + state(State::START_SCENE); + break; + default: + break; + } + } + + void FSM::WIN_SCENE(Event ev) { + using enum Event; + + switch(ev) { + case MOUSE_CLICK: + show_scene("STARTING"); + state(State::START_SCENE); + break; + default: + break; + } + } + + void FSM::NEXT_LEVEL_SCENE(Event ev) { + using enum Event; + + switch(ev) { + case MOUSE_CLICK: + next_level(); + close_scene(); + state(State::IDLE); + break; + default: + break; + } + } + void FSM::MOVING(Event ) { // this should be an optional that returns a point if(auto move_to = $main_ui.play_move()) { @@ -417,15 +457,17 @@ namespace gui { event(Event::ATTACK, data); break; case eGUI::STAIRS_DOWN: - next_level(); - state(State::IDLE); + show_scene("NEXT_LEVEL"); + state(State::NEXT_LEVEL_SCENE); break; case eGUI::DEATH: { $status_ui.update(); + if(entity != player.entity) { $main_ui.dead_entity(entity); } else { - dbc::log("NEED TO HANDLE PLAYER DYING."); + show_scene("DEATH"); + state(State::DEATH_SCENE); } } break; case eGUI::NOOP: { @@ -459,4 +501,13 @@ namespace gui { run_systems(); } + + void FSM::show_scene(const std::string& name) { + dbc::check($scenes.contains(name), $F("$scenes does not contain {}", name)); + $cur_scene = $scenes[name]; + } + + void FSM::close_scene() { + $cur_scene = nullptr; + } } diff --git a/src/gui/fsm.hpp b/src/gui/fsm.hpp index 3d6d6e4..d6b228f 100644 --- a/src/gui/fsm.hpp +++ b/src/gui/fsm.hpp @@ -16,7 +16,10 @@ namespace gui { enum class State { START=__LINE__, - START_SCREEN=__LINE__, + START_SCENE=__LINE__, + DEATH_SCENE=__LINE__, + WIN_SCENE=__LINE__, + NEXT_LEVEL_SCENE=__LINE__, MOVING=__LINE__, ATTACKING=__LINE__, ROTATING=__LINE__, @@ -50,7 +53,10 @@ namespace gui { void event(game::Event ev, std::any data={}); void START(game::Event ev); - void START_SCREEN(game::Event ev); + void START_SCENE(game::Event ev); + void WIN_SCENE(game::Event ev); + void DEATH_SCENE(game::Event ev); + void NEXT_LEVEL_SCENE(game::Event ev); void IDLE(game::Event ev, std::any data); void MOVING(game::Event ev); void ATTACKING(game::Event ev, std::any data); @@ -72,5 +78,7 @@ namespace gui { void next_level(); void debug_render(); void take_screenshot(); + void show_scene(const std::string& name); + void close_scene(); }; } diff --git a/src/main.cpp b/src/main.cpp index c5c41a1..88ece2e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,7 +33,10 @@ int main(int argc, char* argv[]) { // BUG: need to sort out how to deal with this in the FSM if(main.in_state(gui::State::IDLE) - || main.in_state(gui::State::START_SCREEN) + || main.in_state(gui::State::START_SCENE) + || main.in_state(gui::State::WIN_SCENE) + || main.in_state(gui::State::DEATH_SCENE) + || main.in_state(gui::State::NEXT_LEVEL_SCENE) || main.in_state(gui::State::LOOTING)) { main.handle_keyboard_mouse();