diff --git a/gui/dnd_loot.cpp b/gui/dnd_loot.cpp index 57ae8a0..9178430 100644 --- a/gui/dnd_loot.cpp +++ b/gui/dnd_loot.cpp @@ -111,8 +111,8 @@ namespace gui { switch(ev) { case AIM_CLICK: { // take from inventory, drop on floor - bool worked = throw_on_floor($status_ui.$gui, true); - if(worked) END(CLOSE); + throw_on_floor($status_ui.$gui, true); + END(CLOSE); } break; case INV_SELECT: { auto drop_id = std::any_cast(data); @@ -137,8 +137,8 @@ namespace gui { break; case AIM_CLICK: { // THIS IS PUT IT BACK ON THE FLOOR - bool worked = throw_on_floor($loot_ui.$gui, false); - if(worked) END(CLOSE); + throw_on_floor($loot_ui.$gui, false); + END(CLOSE); } break; default: handle_mouse(ev, $loot_ui.$gui); @@ -282,27 +282,21 @@ namespace gui { * Dropping on the ground is only possible from the * status_ui for now. */ - bool DNDLoot::throw_on_floor(guecs::UI& gui, bool from_status) { + void DNDLoot::throw_on_floor(guecs::UI& gui, bool from_status) { dbc::check($grab_source != std::nullopt, "attempt to commit_drop but no grab_source set"); dbc::check(gui.has(*$grab_source), "StatusUI doesn't actually have that GrabSource in the gui."); auto& grab = gui.get(*$grab_source); - bool result = false; - if(from_status) { - result = $status_ui.drop_item(grab.world_entity); + $status_ui.drop_item(grab.world_entity); } else { - result = $loot_ui.drop_item(grab.world_entity); - } - - if(result) { - grab.commit(); - clear_grab(); + $loot_ui.drop_item(grab.world_entity); } - return result; + grab.commit(); + clear_grab(); } /* diff --git a/gui/dnd_loot.hpp b/gui/dnd_loot.hpp index 9978e1d..a701bfe 100644 --- a/gui/dnd_loot.hpp +++ b/gui/dnd_loot.hpp @@ -53,7 +53,7 @@ namespace gui { std::optional source_id, guecs::Entity drop_id); bool hold_item(guecs::UI& gui, guecs::Entity gui_id); - bool throw_on_floor(guecs::UI& gui, bool from_status); + void throw_on_floor(guecs::UI& gui, bool from_status); void clear_grab(); diff --git a/gui/loot_ui.cpp b/gui/loot_ui.cpp index 22fc8ca..e65cd72 100644 --- a/gui/loot_ui.cpp +++ b/gui/loot_ui.cpp @@ -127,10 +127,9 @@ namespace gui { update(); } - bool LootUI::drop_item(DinkyECS::Entity item_id) { - bool dropped = System::drop_item($level, item_id); - if(dropped) update(); - return dropped; + void LootUI::drop_item(DinkyECS::Entity item_id) { + System::drop_item($level, item_id); + update(); } bool LootUI::mouse(float x, float y, bool hover) { diff --git a/gui/loot_ui.hpp b/gui/loot_ui.hpp index d1d87ba..f5481e3 100644 --- a/gui/loot_ui.hpp +++ b/gui/loot_ui.hpp @@ -32,7 +32,7 @@ namespace gui { void remove_slot(guecs::Entity slot_id); bool place_slot(guecs::Entity gui_id, DinkyECS::Entity world_entity); void add_loose_item(DinkyECS::Entity entity); - bool drop_item(DinkyECS::Entity item_id); + void drop_item(DinkyECS::Entity item_id); bool occupied(guecs::Entity gui_id); void swap(guecs::Entity gui_a, guecs::Entity gui_b); }; diff --git a/gui/status_ui.cpp b/gui/status_ui.cpp index 5e68071..302d972 100644 --- a/gui/status_ui.cpp +++ b/gui/status_ui.cpp @@ -114,10 +114,9 @@ namespace gui { } } - bool StatusUI::drop_item(DinkyECS::Entity item_id) { - bool dropped = System::drop_item($level, item_id); - if(dropped) update(); - return dropped; + void StatusUI::drop_item(DinkyECS::Entity item_id) { + System::drop_item($level, item_id); + update(); } // NOTE: do I need this or how does it relate to drop_item? diff --git a/gui/status_ui.hpp b/gui/status_ui.hpp index 387be3b..f4a4092 100644 --- a/gui/status_ui.hpp +++ b/gui/status_ui.hpp @@ -29,7 +29,7 @@ namespace gui { void remove_slot(guecs::Entity slot_id); bool place_slot(guecs::Entity gui_id, DinkyECS::Entity world_entity); - bool drop_item(DinkyECS::Entity item_id); + void drop_item(DinkyECS::Entity item_id); void swap(guecs::Entity gui_a, guecs::Entity gui_b); bool occupied(guecs::Entity slot); diff --git a/systems.cpp b/systems.cpp index 501db00..a2ae0cf 100644 --- a/systems.cpp +++ b/systems.cpp @@ -439,24 +439,24 @@ Entity System::spawn_item(World& world, const std::string& name) { return item_id; } -bool System::drop_item(GameLevel& level, Entity item) { +void System::drop_item(GameLevel& level, Entity item) { auto& world = *level.world; auto& map = *level.map; auto& collision = *level.collision; auto player_pos = world.get(level.player); - Position pos{player_pos.aiming_at.x, player_pos.aiming_at.y}; + dbc::check(map.can_move(player_pos.location), "impossible, the player can't be in a wall"); - if(map.can_move(pos.location)) { - world.set(item, pos); - collision.insert(pos.location, item, false); - level.world->not_constant(item); - level.world->send(Events::GUI::ENTITY_SPAWN, item, {}); - return true; - } else { - return false; - } + Position drop_spot = {player_pos.aiming_at.x, player_pos.aiming_at.y}; + + // if they're aiming at a wall then drop at their feet + if(!map.can_move(drop_spot.location)) drop_spot = player_pos; + + world.set(item, drop_spot); + collision.insert(drop_spot.location, item, false); + level.world->not_constant(item); + level.world->send(Events::GUI::ENTITY_SPAWN, item, {}); } // NOTE: I think pickup and this need to be different diff --git a/systems.hpp b/systems.hpp index 9e99996..7a04982 100644 --- a/systems.hpp +++ b/systems.hpp @@ -19,7 +19,7 @@ namespace System { void device(World &world, Entity actor, Entity item); void plan_motion(World& world, Position move_to); Entity spawn_item(World& world, const string& name); - bool drop_item(GameLevel& level, Entity item); + void drop_item(GameLevel& level, Entity item); void enemy_ai(GameLevel &level); void combat(GameLevel& level, int attack_id);