Now have all four screens showing up when needed, but now need to a way to restart the game.

This commit is contained in:
Zed A. Shaw 2026-04-02 00:38:41 -04:00
parent d03020cfef
commit 903fad871f
11 changed files with 110 additions and 26 deletions

View file

@ -29,7 +29,6 @@ namespace gui {
auto gui_id = $gui.entity(name);
$gui.set<Text>(gui_id, {guecs::to_wstring(name)});
$gui.set<Rectangle>(gui_id, {1, THEME.TRANSPARENT});
$gui.set<Meter>(gui_id, {1.0f, THEME.DARK_MID, {}});
}

View file

@ -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;
}
}

View file

@ -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();
};
}