Tried to use Ragel to create state machines but its lacking an incremental mode and doesn't do any logging of state activity so debugging is harder. Put it in scratchpad for reference though.
This commit is contained in:
parent
7fc32b0248
commit
d99d9a68c8
10 changed files with 541 additions and 313 deletions
|
@ -1,148 +0,0 @@
|
|||
#include <iostream>
|
||||
#include "gui/dnd_events.hpp"
|
||||
#include <any>
|
||||
#include "gui/guecstra.hpp"
|
||||
#include "gui/uisystems.hpp"
|
||||
#include <guecs/ui.hpp>
|
||||
#include "gui/status_ui.hpp"
|
||||
#include "gui/loot_ui.hpp"
|
||||
#include "gui/event_router.hpp"
|
||||
|
||||
|
||||
%%{
|
||||
machine DNDLoot;
|
||||
alphtype int;
|
||||
|
||||
import "../gui/dnd_events.hpp";
|
||||
|
||||
action loot_close {
|
||||
$loot_ui.active = false;
|
||||
}
|
||||
|
||||
action loot_grab {
|
||||
// NOTE: when grab_source could work to do the if that was here
|
||||
$grab_source = UISystem::loot_grab($loot_ui.$gui, data);
|
||||
}
|
||||
|
||||
action inv_grab {
|
||||
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
|
||||
}
|
||||
|
||||
action loot_drop {
|
||||
if(UISystem::loot_drop($status_ui.$gui,
|
||||
$loot_ui.$gui, $grab_source, data))
|
||||
{
|
||||
fnext looting;
|
||||
}
|
||||
}
|
||||
|
||||
action inv_drop {
|
||||
if(UISystem::loot_drop($loot_ui.$gui,
|
||||
$status_ui.$gui, $grab_source, data))
|
||||
{
|
||||
fnext looting;
|
||||
}
|
||||
}
|
||||
|
||||
action end {
|
||||
$grab_source = std::nullopt;
|
||||
}
|
||||
|
||||
action mouse_click {
|
||||
mouse_action(false);
|
||||
}
|
||||
|
||||
action mouse_move {
|
||||
if($grab_source) {
|
||||
auto& source = $loot_ui.$gui.get<guecs::GrabSource>(*$grab_source);
|
||||
source.move($window.mapPixelToCoords($router.position));
|
||||
}
|
||||
mouse_action(true);
|
||||
}
|
||||
|
||||
mouse_click = (MOUSE_DRAG_START | MOUSE_CLICK | MOUSE_DROP);
|
||||
mouse_move = (MOUSE_MOVE | MOUSE_DRAG);
|
||||
|
||||
main :=
|
||||
start: (
|
||||
STARTED -> looting
|
||||
),
|
||||
looting: (
|
||||
LOOT_OPEN @loot_close -> looting |
|
||||
LOOT_SELECT @loot_grab -> loot_grab |
|
||||
INV_SELECT @inv_grab -> inv_grab |
|
||||
mouse_click @mouse_click -> looting |
|
||||
mouse_move @mouse_move -> looting
|
||||
),
|
||||
loot_grab: (
|
||||
LOOT_OPEN @loot_grab -> end |
|
||||
LOOT_SELECT @loot_grab -> looting |
|
||||
INV_SELECT @inv_drop -> looting |
|
||||
mouse_click @mouse_click -> loot_grab |
|
||||
mouse_move @mouse_move -> loot_grab
|
||||
),
|
||||
inv_grab: (
|
||||
LOOT_OPEN @loot_close -> end |
|
||||
LOOT_SELECT @loot_drop -> looting |
|
||||
INV_SELECT @inv_grab -> looting |
|
||||
mouse_click @mouse_click -> inv_grab |
|
||||
mouse_move @mouse_move -> inv_grab
|
||||
),
|
||||
end: (
|
||||
LOOT_ITEM @loot_grab -> loot_grab |
|
||||
LOOT_OPEN -> looting
|
||||
);
|
||||
}%%
|
||||
|
||||
%% write data;
|
||||
|
||||
namespace gui {
|
||||
|
||||
class DNDLoot2 {
|
||||
public:
|
||||
std::optional<guecs::Entity> $grab_source = std::nullopt;
|
||||
StatusUI& $status_ui;
|
||||
LootUI& $loot_ui;
|
||||
sf::RenderWindow& $window;
|
||||
routing::Router& $router;
|
||||
|
||||
DNDLoot2(StatusUI& status_ui,
|
||||
LootUI& loot_ui, sf::RenderWindow& window,
|
||||
routing::Router& router);
|
||||
|
||||
bool event(DNDEvent ev, std::any data={});
|
||||
void mouse_action(bool hover);
|
||||
sf::Vector2f mouse_position();
|
||||
};
|
||||
|
||||
sf::Vector2f DNDLoot2::mouse_position() {
|
||||
return $window.mapPixelToCoords($router.position);
|
||||
}
|
||||
|
||||
void DNDLoot2::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);
|
||||
}
|
||||
|
||||
DNDLoot2::DNDLoot2(StatusUI& status_ui, LootUI& loot_ui, sf::RenderWindow &window, routing::Router& router) :
|
||||
$status_ui(status_ui),
|
||||
$loot_ui(loot_ui),
|
||||
$window(window),
|
||||
$router(router)
|
||||
{
|
||||
event(DNDEvent::STARTED);
|
||||
}
|
||||
|
||||
bool DNDLoot2::event(DNDEvent event, std::any data) {
|
||||
|
||||
int cs = 0;
|
||||
int *p = (int *)&event;
|
||||
int *pe = p+1;
|
||||
|
||||
%%write init;
|
||||
%%write exec;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue