Compare commits

...

2 commits

Author SHA1 Message Date
Zed A. Shaw
0f20f5b6e3 Now INV_SELECT and USE_ITEM are moved out. 2026-08-09 12:35:37 -04:00
Zed A. Shaw
79dc86809f Event router wasn't sending button press information correctly. 2026-08-09 12:34:06 -04:00
9 changed files with 61 additions and 59 deletions

View file

@ -33,7 +33,6 @@ namespace game {
MOVE_LEFT=__LINE__,
MOVE_RIGHT=__LINE__,
NEW_RITUAL=__LINE__,
NOOP=__LINE__,
NO_NEIGHBORS=__LINE__,
QUIT=__LINE__,
ROTATE_LEFT=__LINE__,

View file

@ -2,6 +2,7 @@
#include "event_router.hpp"
#include "dbc.hpp"
#include "events.hpp"
#include <magic_enum/magic_enum.hpp>
namespace gui {
namespace routing {
@ -15,28 +16,17 @@ namespace gui {
return {game::Event::QUIT, guecs::NO_MODS};
}
mouse_mods = guecs::NO_MODS;
if(const auto* mouse = ev->getIf<sf::Event::MouseButtonPressed>()) {
if(mouse->button == sf::Mouse::Button::Left || mouse->button == sf::Mouse::Button::Right) {
left_button = mouse->button == sf::Mouse::Button::Left;
position = mouse->position;
if(left_button) {
mouse_mods = {1 << guecs::ModBit::left};
} else {
mouse_mods = {1 << guecs::ModBit::right};
}
event(MOUSE_DOWN);
}
set_mouse(mouse);
event(MOUSE_DOWN);
} else if(const auto* mouse = ev->getIf<sf::Event::MouseButtonReleased>()) {
// need to sort this out but if you don't do this it thinks you're always pressing it
if(mouse->button == sf::Mouse::Button::Left || mouse->button == sf::Mouse::Button::Right) {
left_button = mouse->button == sf::Mouse::Button::Left;
position = mouse->position;
mouse_mods = guecs::NO_MODS;
event(MOUSE_UP);
}
set_mouse(mouse);
event(MOUSE_UP);
} else if(const auto* mouse = ev->getIf<sf::Event::MouseMoved>()) {
mouse_mods.set(guecs::ModBit::hover);
position = mouse->position;
mouse_mods = {1 << guecs::ModBit::hover};
event(MOUSE_MOVE);
}
@ -99,8 +89,11 @@ namespace gui {
set_event(game::Event::KEY_PRESS);
state(State::IDLE);
break;
case MOUSE_DOWN:
dbc::log("IGNORED! MOUSE_DOWN received while in MOUSE_ACTIVE");
break;
default:
dbc::sentinel("invalid event");
dbc::sentinel($F("INVALID EVENT: {}", magic_enum::enum_name(ev)));
}
}

View file

@ -46,6 +46,19 @@ namespace gui {
void set_event(game::Event ev) {
$next_event = ev;
}
void set_mouse(const auto* mouse) {
if(mouse->button == sf::Mouse::Button::Left) {
mouse_mods.set(guecs::ModBit::left);
}
if(mouse->button == sf::Mouse::Button::Right) {
mouse_mods.set(guecs::ModBit::right);
}
// need to sort this out but if you don't do this it thinks you're always pressing it
position = mouse->position;
}
};
}
}

View file

@ -194,7 +194,7 @@ namespace gui {
if($boss_scene->playing()) {
if(ev == game::Event::MOUSE_CLICK) {
dbc::log("exiting cut scene");
$boss_scene->mouse(0,0, 0);
$boss_scene->mouse(0,0, $router.mouse_mods);
state(State::BOSS_FIGHT);
}
} else {
@ -398,21 +398,8 @@ namespace gui {
// HERE: this has to go, unify these events and just use them in the state machine directly
switch(evt) {
case eGUI::COMBAT: {
auto &damage = std::any_cast<components::CombatResult&>(data);
if(damage.enemy_did > 0) {
$map_ui.log($F(L"Enemy HIT YOU for {} damage!", damage.enemy_did));
} else {
$map_ui.log(L"Enemy MISSED YOU.");
}
if(damage.player_did > 0) {
$map_ui.log($F(L"You HIT enemy for {} damage!", damage.player_did));
} else {
$map_ui.log(L"You MISSED the enemy.");
}
}
case eGUI::COMBAT:
$map_ui.log(std::any_cast<components::CombatResult&>(data));
break;
case eGUI::COMBAT_START:
$main_ui.show_combat();
@ -421,19 +408,6 @@ namespace gui {
case eGUI::NO_NEIGHBORS:
$main_ui.close_combat();
break;
case eGUI::ENTITY_SPAWN: {
auto& sprite = world->get<components::Sprite>(entity);
$main_ui.$rayview->update_sprite(entity, sprite);
$main_ui.dirty();
run_systems();
} break;
case eGUI::INV_SELECT: {
if($router.left_button) {
event(Event::INV_SELECT, data);
} else {
event(Event::USE_ITEM, data);
}
} break;
case eGUI::STAIRS_DOWN:
event(Event::BOSS_START);
break;
@ -462,14 +436,8 @@ namespace gui {
dbc::log("NEED TO HANDLE PLAYER DYING.");
}
} break;
case eGUI::NOOP: {
if(data.type() == typeid(std::string)) {
auto name = std::any_cast<std::string>(data);
$map_ui.log($F(L"NOOP EVENT! {},{}", evt, entity));
}
} break;
case eGUI::INV_SELECT:
case eGUI::USE_ITEM:
case eGUI::AIM_CLICK:
case eGUI::LOOT_SELECT:
case eGUI::LOOT_CLOSE:

View file

@ -13,8 +13,17 @@ namespace guecs {
}};
}
Clickable make_action(guecs::Entity gui_id, game::Event left, game::Event right, std::any data, const std::source_location location) {
return {[&, gui_id, left, right, data, location](guecs::Modifiers mods){
game::Event event = mods.test(guecs::ModBit::left) ? left : right;
auto world = GameDB::current_world();
dbc::log($F("SENDING EVENT: {}", magic_enum::enum_name(event)), location);
world->send<game::Event>(event, gui_id, data);
}};
}
Clickable make_action(guecs::Entity gui_id, game::Event event, std::any data, const std::source_location location) {
return {[&, event, data, location](auto){
return {[&, gui_id, event, data, location](auto){
auto world = GameDB::current_world();
dbc::log($F("SENDING EVENT: {}", magic_enum::enum_name(event)), location);
world->send<game::Event>(event, gui_id, data);

View file

@ -7,9 +7,13 @@
namespace guecs {
Clickable make_action(guecs::Entity gui_id, game::Event event,
const std::source_location location = std::source_location::current());
Clickable make_action(guecs::Entity gui_id, game::Event event, std::any data,
const std::source_location location = std::source_location::current());
Clickable make_action(guecs::Entity gui_id, game::Event left, game::Event right, std::any data,
const std::source_location location = std::source_location::current());
struct GrabSource {
DinkyECS::Entity world_entity;
std::function<void()> commit;

View file

@ -72,4 +72,19 @@ namespace gui {
}
update();
}
void MapViewUI::log(components::CombatResult& damage) {
if(damage.enemy_did > 0) {
log($F(L"Enemy HIT YOU for {} damage!", damage.enemy_did));
} else {
log(L"Enemy MISSED YOU.");
}
if(damage.player_did > 0) {
log($F(L"You HIT enemy for {} damage!", damage.player_did));
} else {
log(L"You MISSED the enemy.");
}
}
}

View file

@ -22,6 +22,7 @@ namespace gui {
void init();
void render(sf::RenderWindow &window, int compass_dir);
void log(std::wstring msg);
void log(components::CombatResult& damage);
void update();
};
}

View file

@ -44,7 +44,7 @@ namespace gui {
} else {
$gui.set<Text>(gui_id, {guecs::to_wstring(name)});
$gui.set<Clickable>(gui_id, {
guecs::make_action(gui_id, game::Event::INV_SELECT, {gui_id})
guecs::make_action(gui_id, game::Event::INV_SELECT, game::Event::USE_ITEM, {gui_id})
});
$gui.set<DropTarget>(gui_id, {
.commit=[&, gui_id](DinkyECS::Entity world_target) -> bool {