Cleaned everything up more so that it's using better events, but I need to rewrite the event handlers.
This commit is contained in:
parent
1179d6eb43
commit
a47e004d37
6 changed files with 47 additions and 129 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,5 +46,8 @@ namespace game {
|
|||
UPDATE_SPRITE=__LINE__,
|
||||
USE_ITEM=__LINE__,
|
||||
LEVEL_UP=__LINE__,
|
||||
WIN=__LINE__,
|
||||
NEXT_LEVEL=__LINE__,
|
||||
NEW_GAME=__LINE__,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
138
src/gui/fsm.cpp
138
src/gui/fsm.cpp
|
|
@ -1,3 +1,4 @@
|
|||
#define FSM_DEBUG 1
|
||||
#include "gui/fsm.hpp"
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
|
|
@ -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<components::CombatResult&>(data);
|
||||
}
|
||||
break;
|
||||
case eGUI::COMBAT_START:
|
||||
event(Event::COMBAT_START);
|
||||
break;
|
||||
case eGUI::ENTITY_SPAWN: {
|
||||
auto& sprite = world->get<components::Sprite>(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<components::InventoryItem>(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<std::string>(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<State, game::Event> {
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<game::Event>(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<game::Event>(event, gui_id, data);
|
||||
}};
|
||||
}
|
||||
|
|
|
|||
10
src/main.cpp
10
src/main.cpp
|
|
@ -20,11 +20,8 @@ void play_game(std::shared_ptr<gui::FSM> 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<gui::FSM>(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<gui::FSM>(window);
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue