diff --git a/assets/scenes.json b/assets/scenes.json index da7274d..94d186c 100644 --- a/assets/scenes.json +++ b/assets/scenes.json @@ -17,7 +17,7 @@ "[_]" ], "actions": { - "Restart": 43, + "Restart": 51, "Quit": 38 } } @@ -42,7 +42,7 @@ "[_]" ], "actions": { - "Continue": 43, + "Continue": 50, "Quit": 38 } } @@ -66,7 +66,6 @@ ], "actions": { "Start": 43, - "About": 43, "Quit": 38 } } @@ -89,7 +88,7 @@ "[_]" ], "actions": { - "Restart": 43, + "Restart": 51, "Quit": 38 } } diff --git a/src/events.hpp b/src/events.hpp index 7460aa2..8c57856 100644 --- a/src/events.hpp +++ b/src/events.hpp @@ -46,5 +46,8 @@ namespace game { UPDATE_SPRITE=__LINE__, USE_ITEM=__LINE__, LEVEL_UP=__LINE__, + WIN=__LINE__, + NEXT_LEVEL=__LINE__, + NEW_GAME=__LINE__, }; } diff --git a/src/gui/fsm.cpp b/src/gui/fsm.cpp index 646d18d..c1eae13 100644 --- a/src/gui/fsm.cpp +++ b/src/gui/fsm.cpp @@ -1,3 +1,4 @@ +#define FSM_DEBUG 1 #include "gui/fsm.hpp" #include #include @@ -29,18 +30,14 @@ namespace gui { switch($state) { FSM_STATE(State, START, ev); FSM_STATE(State, INTRO, 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, SHOW_SCREEN, ev); FSM_STATE(State, MOVING, ev); FSM_STATE(State, ATTACKING, ev, data); FSM_STATE(State, ROTATING, ev); FSM_STATE(State, IDLE, ev, data); FSM_STATE(State, LOOTING, ev, data); FSM_STATE(State, END_QUIT, ev); - FSM_STATE(State, END_PLAY_AGAIN, ev); - FSM_STATE(State, END_PLAYER_DIED, ev); + FSM_STATE(State, END_NEW_GAME, ev); } } @@ -60,7 +57,6 @@ namespace gui { run_systems(); show_scene("STARTING"); - state(State::START_SCENE); } void FSM::INTRO(Event ev) { @@ -76,7 +72,7 @@ namespace gui { } } - void FSM::START_SCENE(Event ev) { + void FSM::SHOW_SCREEN(Event ev) { using enum Event; switch(ev) { @@ -84,7 +80,7 @@ namespace gui { mouse_action(guecs::NO_MODS); break; case MOUSE_MOVE: { - mouse_action({1 << guecs::ModBit::hover}); + mouse_action({1 << guecs::ModBit::hover}); } break; case START: close_scene(); @@ -92,6 +88,15 @@ namespace gui { $story->init(); state(State::INTRO); break; + case NEW_GAME: + close_scene(); + state(State::END_NEW_GAME); + break; + case NEXT_LEVEL: + next_level(); + close_scene(); + state(State::IDLE); + break; case QUIT: FSM::IDLE(ev, {}); break; @@ -103,73 +108,6 @@ namespace gui { } } - void FSM::DEATH_SCENE(Event ev) { - using enum Event; - - switch(ev) { - case MOUSE_CLICK: - mouse_action(guecs::NO_MODS); - break; - case MOUSE_MOVE: { - mouse_action({1 << guecs::ModBit::hover}); - } break; - case START: - close_scene(); - state(State::END_PLAYER_DIED); - break; - case QUIT: - FSM::IDLE(ev, {}); - break; - default: - break; - } - } - - void FSM::WIN_SCENE(Event ev) { - using enum Event; - - switch(ev) { - case MOUSE_CLICK: - mouse_action(guecs::NO_MODS); - break; - case MOUSE_MOVE: { - mouse_action({1 << guecs::ModBit::hover}); - } break; - case START: - close_scene(); - state(State::END_PLAY_AGAIN); - break; - case QUIT: - FSM::IDLE(ev, {}); - break; - default: - break; - } - } - - void FSM::NEXT_LEVEL_SCENE(Event ev) { - using enum Event; - - switch(ev) { - case MOUSE_CLICK: - mouse_action(guecs::NO_MODS); - break; - case MOUSE_MOVE: { - mouse_action({1 << guecs::ModBit::hover}); - } break; - case START: - next_level(); - close_scene(); - state(State::IDLE); - break; - case QUIT: - FSM::IDLE(ev, {}); - break; - default: - break; - } - } - void FSM::MOVING(Event ) { // this should be an optional that returns a point if(auto move_to = $main_ui.play_move()) { @@ -311,14 +249,10 @@ namespace gui { dbc::log($F("END_QUIT: received event after done: {}", int(ev))); } - void FSM::END_PLAYER_DIED(Event ev) { + void FSM::END_NEW_GAME(Event ev) { dbc::log($F("END_PLAYER_DIED: received event after done: {}", int(ev))); } - void FSM::END_PLAY_AGAIN(Event ev) { - dbc::log($F("END_PLAY_AGAIN: received event after done: {}", int(ev))); - } - sf::Vector2f FSM::mouse_position() { return $window.mapPixelToCoords($router.position); } @@ -454,8 +388,7 @@ namespace gui { bool FSM::active() { return !(in_state(State::END_QUIT) - || in_state(State::END_PLAY_AGAIN) - || in_state(State::END_PLAYER_DIED)); + || in_state(State::END_NEW_GAME)); } void FSM::handle_world_events() { @@ -473,9 +406,6 @@ namespace gui { auto &damage = std::any_cast(data); } break; - case eGUI::COMBAT_START: - event(Event::COMBAT_START); - break; case eGUI::ENTITY_SPAWN: { auto& sprite = world->get(entity); $main_ui.$rayview->update_sprite(entity, sprite); @@ -489,9 +419,6 @@ namespace gui { // BUG: need to resolve GUI events vs. FSM events better event(Event::LOOT_OPEN); break; - case eGUI::LOOT_SELECT: - event(Event::LOOT_SELECT, data); - break; case eGUI::INV_SELECT: { if($router.left_button) { event(Event::INV_SELECT, data); @@ -499,9 +426,6 @@ namespace gui { event(Event::USE_ITEM, data); } } break; - case eGUI::AIM_CLICK: - event(Event::AIM_CLICK); - break; case eGUI::LOOT_ITEM: { dbc::check(world->has(entity), "INVALID LOOT_ITEM, that entity has no InventoryItem"); @@ -513,15 +437,26 @@ namespace gui { $loot_ui.update(); event(Event::LOOT_OPEN); } break; - case eGUI::ATTACK: - event(Event::ATTACK, data); - break; + case eGUI::STAIRS_DOWN: check_player_wins(); break; - case eGUI::START: - event(Event::START, data); + + case eGUI::COMBAT_START: + case eGUI::AIM_CLICK: + event(game::Event(evt)); break; + + case eGUI::LOOT_SELECT: + case eGUI::ATTACK: + case eGUI::QUIT: + case eGUI::WIN: + case eGUI::START: + case eGUI::NEXT_LEVEL: + case eGUI::NEW_GAME: + event(game::Event(evt), data); + break; + case eGUI::DEATH: { $status_ui.update(); @@ -531,11 +466,6 @@ namespace gui { player_died(); } } break; - case eGUI::NOOP: { - if(data.type() == typeid(std::string)) { - auto name = std::any_cast(data); - } - } break; default: dbc::log($F("Unhandled event: evt={}; enemy={}; data={}", evt, entity, data.type().name())); @@ -566,6 +496,7 @@ namespace gui { void FSM::show_scene(const std::string& name) { $screens.set_active(name); $screens.set_visible(true); + state(State::SHOW_SCREEN); } void FSM::close_scene() { @@ -574,7 +505,6 @@ namespace gui { void FSM::player_died() { show_scene("DEATH"); - state(State::DEATH_SCENE); } void FSM::check_player_wins() { @@ -585,10 +515,8 @@ namespace gui { if(level.index < levels_to_win) { show_scene("NEXT_LEVEL"); $screens.active_ui()->set_text(fmt::format("ENTERING\nLEVEL\n{}", level.index+2)); - state(State::NEXT_LEVEL_SCENE); } else { show_scene("WIN"); - state(State::WIN_SCENE); } } diff --git a/src/gui/fsm.hpp b/src/gui/fsm.hpp index b97d9ae..6529cac 100644 --- a/src/gui/fsm.hpp +++ b/src/gui/fsm.hpp @@ -19,18 +19,14 @@ namespace gui { enum class State { START=__LINE__, INTRO=__LINE__, - START_SCENE=__LINE__, - DEATH_SCENE=__LINE__, - WIN_SCENE=__LINE__, - NEXT_LEVEL_SCENE=__LINE__, + SHOW_SCREEN=__LINE__, MOVING=__LINE__, ATTACKING=__LINE__, ROTATING=__LINE__, LOOTING=__LINE__, IDLE=__LINE__, END_QUIT=__LINE__, - END_PLAYER_DIED=__LINE__, - END_PLAY_AGAIN=__LINE__, + END_NEW_GAME=__LINE__, }; class FSM : public DeadSimpleFSM { @@ -61,10 +57,7 @@ namespace gui { void START(game::Event ev); void INTRO(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 SHOW_SCREEN(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,8 +65,7 @@ namespace gui { void ROTATING(game::Event ev); void LOOTING(game::Event ev, std::any data); void END_QUIT(game::Event ev); - void END_PLAYER_DIED(game::Event ev); - void END_PLAY_AGAIN(game::Event ev); + void END_NEW_GAME(game::Event ev); void try_move(int dir, bool strafe); sf::Vector2f mouse_position(); diff --git a/src/gui/guecstra.cpp b/src/gui/guecstra.cpp index b4a58a1..d79e1c9 100644 --- a/src/gui/guecstra.cpp +++ b/src/gui/guecstra.cpp @@ -6,6 +6,7 @@ namespace guecs { Clickable make_action(guecs::Entity gui_id, game::Event event) { return {[&, gui_id, event](auto){ auto world = GameDB::current_world(); + fmt::println("!!!!! SENDING EVENT: {}", int(event)); world->send(event, gui_id, {}); }}; } @@ -13,6 +14,7 @@ namespace guecs { Clickable make_action(guecs::Entity gui_id, game::Event event, std::any data) { return {[&, event, data](auto){ auto world = GameDB::current_world(); + fmt::println("!!!!! SENDING EVENT with data: {}", int(event)); world->send(event, gui_id, data); }}; } diff --git a/src/main.cpp b/src/main.cpp index a50ae52..be7d117 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,11 +20,8 @@ void play_game(std::shared_ptr main) { // 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_SCENE) + || main->in_state(gui::State::SHOW_SCREEN) || main->in_state(gui::State::INTRO) - || 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(); @@ -60,10 +57,7 @@ int main(int argc, char* argv[]) { if(main->in_state(gui::State::END_QUIT)) { return 0; - } else if(main->in_state(gui::State::END_PLAYER_DIED)) { - System::restart(); - main = std::make_shared(window); - } else if(main->in_state(gui::State::END_PLAY_AGAIN)) { + } else if(main->in_state(gui::State::END_NEW_GAME)) { System::restart(); main = std::make_shared(window); } else {