Created a separate FSM for the DND functionality that compiles but need to wire it in to work.

master
Zed A. Shaw 6 days ago
parent 1ab708c4eb
commit 82ee8f68f7
  1. 2
      events.hpp
  2. 160
      gui/dnd_loot.cpp
  3. 39
      gui/dnd_loot.hpp
  4. 137
      gui/fsm.cpp
  5. 14
      gui/fsm.hpp
  6. 3
      main.cpp
  7. 1
      meson.build

@ -4,7 +4,7 @@ namespace Events {
enum GUI {
START, COMBAT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP,
COMBAT_START, NO_NEIGHBORS, HP_STATUS,
ATTACK, BLOCK, EVADE, NEW_RITUAL,
ATTACK, NEW_RITUAL,
UPDATE_SPRITE, ENEMY_SPAWN, NOOP,
LOOT_ITEM, LOOT_CONTAINER,
LOOT_CLOSE, LOOT_SELECT, INV_SELECT, AIM_CLICK

@ -0,0 +1,160 @@
#define FSM_DEBUG 1
#include "gui/guecstra.hpp"
#include "gui/dnd_loot.hpp"
#include "gui/uisystems.hpp"
namespace gui {
DNDLoot::DNDLoot(StatusUI status_ui, LootUI loot_ui, sf::RenderWindow &window, routing::Router& router) :
$status_ui(status_ui),
$loot_ui(loot_ui),
$window(window),
$router(router)
{
}
bool DNDLoot::event(Event ev, std::any data) {
switch($state) {
FSM_STATE(DNDState, START, ev);
FSM_STATE(DNDState, LOOTING, ev, data);
FSM_STATE(DNDState, LOOT_GRAB, ev, data);
FSM_STATE(DNDState, INV_GRAB, ev, data);
FSM_STATE(DNDState, END, ev);
default:
dbc::log(fmt::format("event received with data but state={} is not handled", int($state)));
}
return in_state(DNDState::END);
}
void DNDLoot::START(Event ev) {
dbc::check(ev == Event::STARTED, "START not given a STARTED event.");
state(DNDState::LOOTING);
}
void DNDLoot::LOOTING(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
state(DNDState::END);
break;
case LOOT_SELECT:
$grab_source = UISystem::loot_grab($loot_ui.$gui, data);
if($grab_source) state(DNDState::LOOT_GRAB);
break;
case INV_SELECT:
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
if($grab_source) state(DNDState::INV_GRAB);
break;
case MOUSE_DRAG_START:
case MOUSE_CLICK:
mouse_action(false);
break;
default:
state(DNDState::LOOTING);
}
}
void DNDLoot::LOOT_GRAB(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
state(DNDState::END);
break;
case LOOT_SELECT:
$grab_source = UISystem::loot_grab($loot_ui.$gui, data);
if($grab_source) state(DNDState::LOOTING);
break;
case INV_SELECT:
if(UISystem::loot_drop($loot_ui.$gui,
$status_ui.$gui, $grab_source, data))
{
state(DNDState::LOOTING);
}
break;
case MOUSE_CLICK:
mouse_action(false);
break;
case MOUSE_DRAG:
case MOUSE_MOVE: {
if($grab_source) {
auto& source = $loot_ui.$gui.get<guecs::GrabSource>(*$grab_source);
source.move($window.mapPixelToCoords($router.position));
}
mouse_action(true);
} break;
case MOUSE_DRAG_START:
mouse_action(false);
break;
case MOUSE_DROP:
mouse_action(false);
break;
case TICK:
// do nothing
break;
default:
state(DNDState::LOOT_GRAB);
}
}
void DNDLoot::INV_GRAB(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
state(DNDState::END);
break;
case LOOT_SELECT:
if(UISystem::loot_drop($status_ui.$gui,
$loot_ui.$gui, $grab_source, data))
{
state(DNDState::LOOTING);
}
break;
case INV_SELECT:
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
state(DNDState::LOOTING);
break;
case MOUSE_CLICK:
mouse_action(false);
break;
case MOUSE_DRAG:
case MOUSE_MOVE: {
if($grab_source) {
auto& source = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
source.move($window.mapPixelToCoords($router.position));
}
mouse_action(true);
} break;
case MOUSE_DRAG_START: {
mouse_action(false);
} break;
case MOUSE_DROP:
mouse_action(false);
break;
default:
state(DNDState::INV_GRAB);
}
}
void DNDLoot::END(Event ev) {
dbc::check(ev == Event::STARTED, "END not given a STARTED event.");
$grab_source = std::nullopt;
state(DNDState::LOOTING);
}
sf::Vector2f DNDLoot::mouse_position() {
return $window.mapPixelToCoords($router.position);
}
void DNDLoot::mouse_action(bool hover) {
sf::Vector2f pos = mouse_position();
$status_ui.mouse(pos.x, pos.y, hover);
if($loot_ui.active) $loot_ui.mouse(pos.x, pos.y, hover);
}
}

@ -0,0 +1,39 @@
#pragma once
#include "simplefsm.hpp"
#include <guecs/ui.hpp>
#include "gui/status_ui.hpp"
#include "gui/loot_ui.hpp"
#include "gui/event_router.hpp"
namespace gui {
enum class DNDState {
START=0,
LOOTING=1,
LOOT_GRAB=2,
INV_GRAB=3,
END=4
};
class DNDLoot : public DeadSimpleFSM<DNDState, Event> {
public:
std::optional<guecs::Entity> $grab_source = std::nullopt;
StatusUI& $status_ui;
LootUI& $loot_ui;
sf::RenderWindow& $window;
routing::Router& $router;
DNDLoot(StatusUI status_ui,
LootUI loot_ui, sf::RenderWindow& window,
routing::Router& router);
bool event(Event ev, std::any data={});
void START(Event ev);
void LOOTING(Event ev, std::any data);
void LOOT_GRAB(Event ev, std::any data);
void INV_GRAB(Event ev, std::any data);
void END(Event ev);
void mouse_action(bool hover);
sf::Vector2f mouse_position();
};
}

@ -1,3 +1,4 @@
#define FSM_DEBUG 1
#include "gui/fsm.hpp"
#include <iostream>
#include <chrono>
@ -26,12 +27,13 @@ namespace gui {
$map_ui($level),
$mini_map($level),
$loot_ui($level),
$font{FONT_FILE_NAME}
$font{FONT_FILE_NAME},
$dnd_loot($status_ui, $loot_ui, $window, $router)
{
$window.setPosition({0,0});
}
void FSM::event(Event ev) {
void FSM::event(Event ev, std::any data) {
switch($state) {
FSM_STATE(State, START, ev);
FSM_STATE(State, MOVING, ev);
@ -42,20 +44,7 @@ namespace gui {
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, NEXT_LEVEL, ev);
FSM_STATE(State, END, ev);
FSM_STATE(State, LOOTING, ev, std::make_any<int>(-1));
FSM_STATE(State, LOOT_GRAB, ev, std::make_any<int>(-1));
FSM_STATE(State, INV_GRAB, ev, std::make_any<int>(-1));
}
}
void FSM::event(Event ev, std::any data) {
switch($state) {
FSM_STATE(State, LOOTING, ev, data);
FSM_STATE(State, LOOT_GRAB, ev, data);
FSM_STATE(State, INV_GRAB, ev, data);
FSM_STATE(State, IDLE, ev);
default:
dbc::log(fmt::format("event received with data but state={} is not handled", int($state)));
}
}
@ -125,113 +114,11 @@ namespace gui {
}
}
void FSM::LOOT_GRAB(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
state(State::IDLE);
break;
case LOOT_SELECT:
$grab_source = UISystem::loot_grab($loot_ui.$gui, data);
if($grab_source) state(State::LOOTING);
break;
case INV_SELECT:
if(UISystem::loot_drop($loot_ui.$gui,
$status_ui.$gui, $grab_source, data))
{
state(State::LOOTING);
}
break;
case MOUSE_CLICK:
mouse_action(false);
break;
case MOUSE_DRAG:
case MOUSE_MOVE: {
if($grab_source) {
auto& source = $loot_ui.$gui.get<guecs::GrabSource>(*$grab_source);
source.move($window.mapPixelToCoords($router.position));
}
mouse_action(true);
} break;
case MOUSE_DRAG_START:
mouse_action(false);
break;
case MOUSE_DROP:
mouse_action(false);
break;
case TICK:
// do nothing
break;
default:
state(State::LOOT_GRAB);
}
}
void FSM::INV_GRAB(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
state(State::IDLE);
break;
case LOOT_SELECT:
if(UISystem::loot_drop($status_ui.$gui,
$loot_ui.$gui, $grab_source, data))
{
state(State::LOOTING);
}
break;
case INV_SELECT:
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
state(State::LOOTING);
break;
case MOUSE_CLICK:
mouse_action(false);
break;
case MOUSE_DRAG:
case MOUSE_MOVE: {
if($grab_source) {
auto& source = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
source.move($window.mapPixelToCoords($router.position));
}
mouse_action(true);
} break;
case MOUSE_DRAG_START: {
mouse_action(false);
} break;
case MOUSE_DROP:
mouse_action(false);
break;
default:
state(State::INV_GRAB);
}
}
void FSM::LOOTING(Event ev, std::any data) {
using enum Event;
switch(ev) {
case LOOT_OPEN:
$loot_ui.active = false;
if(!$dnd_loot.event(ev, data)) {
state(State::IDLE);
break;
case LOOT_SELECT:
$grab_source = UISystem::loot_grab($loot_ui.$gui, data);
if($grab_source) state(State::LOOT_GRAB);
break;
case INV_SELECT:
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
if($grab_source) state(State::INV_GRAB);
break;
case MOUSE_DRAG_START:
case MOUSE_CLICK:
mouse_action(false);
break;
default:
state(State::LOOTING);
} else {
dbc::log("!!!!!!!!! LOOTING ENDED!");
}
}
@ -283,6 +170,7 @@ namespace gui {
state(State::NEXT_LEVEL);
break;
case LOOT_OPEN:
$dnd_loot.event(Event::STARTED);
$loot_ui.active = true;
state(State::LOOTING);
break;
@ -386,8 +274,11 @@ namespace gui {
if($debug_ui.active) $debug_ui.mouse(pos.x, pos.y, hover);
$combat_ui.mouse(pos.x, pos.y, hover);
$status_ui.mouse(pos.x, pos.y, hover);
if($loot_ui.active) {
$loot_ui.mouse(pos.x, pos.y, hover);
} else {
$main_ui.mouse(pos.x, pos.y, hover);
if($loot_ui.active) $loot_ui.mouse(pos.x, pos.y, hover);
}
}
void FSM::handle_keyboard_mouse() {
@ -582,10 +473,6 @@ namespace gui {
case eGUI::NEW_RITUAL:
$combat_ui.init();
break;
case eGUI::EVADE:
case eGUI::BLOCK:
dbc::log("YOU NEED TO IMPLEMENT THIS!!!!!");
break;
case eGUI::ATTACK:
$temp_attack_id = std::any_cast<int>(data);
event(Event::ATTACK);

@ -13,6 +13,7 @@
#include "gui/mini_map.hpp"
#include "events.hpp"
#include "gui/event_router.hpp"
#include "gui/dnd_loot.hpp"
namespace gui {
enum class State {
@ -24,10 +25,8 @@ namespace gui {
ROTATING=5,
NEXT_LEVEL=6,
LOOTING=7,
LOOT_GRAB=8,
INV_GRAB=9,
IDLE=10,
END=11
IDLE=8,
END=9
};
class FSM : public DeadSimpleFSM<State, Event> {
@ -49,12 +48,11 @@ namespace gui {
LootUI $loot_ui;
sf::Font $font;
gui::routing::Router $router;
std::optional<guecs::Entity> $grab_source;
DNDLoot $dnd_loot;
FSM();
void event(Event ev);
void event(Event ev, std::any data);
void event(Event ev, std::any data={});
void autowalk();
void start_autowalk(double rot_speed);
@ -68,8 +66,6 @@ namespace gui {
void COMBAT_ROTATE(Event ev);
void NEXT_LEVEL(Event ev);
void LOOTING(Event ev, std::any data);
void LOOT_GRAB(Event ev, std::any data);
void INV_GRAB(Event ev, std::any data);
void END(Event ev);
void try_move(int dir, bool strafe);

@ -35,8 +35,6 @@ int main(int argc, char* argv[]) {
if(main.in_state(gui::State::IDLE)
|| main.in_state(gui::State::NEXT_LEVEL)
|| main.in_state(gui::State::LOOTING)
|| main.in_state(gui::State::LOOT_GRAB)
|| main.in_state(gui::State::INV_GRAB)
|| main.in_state(gui::State::IN_COMBAT))
{
if(main.autowalking) {
@ -45,6 +43,7 @@ int main(int argc, char* argv[]) {
main.handle_keyboard_mouse();
}
} else{
dbc::log("NOT IN STATE");
main.event(gui::Event::TICK);
}

@ -95,6 +95,7 @@ sources = [
'gui/boss_fight_ui.cpp',
'gui/combat_ui.cpp',
'gui/debug_ui.cpp',
'gui/dnd_loot.cpp',
'gui/event_router.cpp',
'gui/fsm.cpp',
'gui/guecstra.cpp',

Loading…
Cancel
Save