From 1788b8fb284408b88d54ec64d09e20cd5cf4a939 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sat, 2 Aug 2025 23:11:59 -0400 Subject: [PATCH] Now items drop where you aim, and won't let you drop on a floor. But maybe one more change. --- gui/dnd_loot.cpp | 14 +++++++------- gui/status_ui.cpp | 18 +++--------------- systems.cpp | 34 +++++++++++++--------------------- 3 files changed, 23 insertions(+), 43 deletions(-) diff --git a/gui/dnd_loot.cpp b/gui/dnd_loot.cpp index 4cbb2dc..57ae8a0 100644 --- a/gui/dnd_loot.cpp +++ b/gui/dnd_loot.cpp @@ -112,8 +112,7 @@ namespace gui { case AIM_CLICK: { // take from inventory, drop on floor bool worked = throw_on_floor($status_ui.$gui, true); - dbc::check(worked, "Need to fix this, should be able to abort."); - END(CLOSE); + if(worked) END(CLOSE); } break; case INV_SELECT: { auto drop_id = std::any_cast(data); @@ -139,8 +138,7 @@ namespace gui { case AIM_CLICK: { // THIS IS PUT IT BACK ON THE FLOOR bool worked = throw_on_floor($loot_ui.$gui, false); - dbc::check(worked, "Failed to drop it back on the floor."); - END(CLOSE); + if(worked) END(CLOSE); } break; default: handle_mouse(ev, $loot_ui.$gui); @@ -196,7 +194,6 @@ namespace gui { } void DNDLoot::clear_grab() { - dbc::log("CLEARED!"); $grab_source = std::nullopt; $grab_sprite = nullptr; } @@ -291,7 +288,6 @@ namespace gui { "StatusUI doesn't actually have that GrabSource in the gui."); auto& grab = gui.get(*$grab_source); - grab.commit(); bool result = false; @@ -301,7 +297,11 @@ namespace gui { result = $loot_ui.drop_item(grab.world_entity); } - clear_grab(); + if(result) { + grab.commit(); + clear_grab(); + } + return result; } diff --git a/gui/status_ui.cpp b/gui/status_ui.cpp index 19999f6..5e68071 100644 --- a/gui/status_ui.cpp +++ b/gui/status_ui.cpp @@ -102,8 +102,7 @@ namespace gui { bool StatusUI::place_slot(guecs::Entity gui_id, DinkyECS::Entity world_entity) { auto& slot_name = $gui.name_for(gui_id); - auto player = $level.world->get_the(); - auto& inventory = $level.world->get(player.entity); + auto& inventory = $level.world->get($level.player); if(inventory.add(slot_name, world_entity)) { $level.world->make_constant(world_entity); @@ -123,18 +122,8 @@ namespace gui { // NOTE: do I need this or how does it relate to drop_item? void StatusUI::remove_slot(guecs::Entity slot_id) { - // NOTE: really the System should coordinate either dropping on the - // ground or moving from one container or another, so when loot_ui - // moves to use an ECS id to a container I can have the System - // do it. auto& slot_name = $gui.name_for(slot_id); - - auto player = $level.world->get_the(); - auto& inventory = $level.world->get(player.entity); - - auto world_entity = inventory.get(slot_name); - inventory.remove(world_entity); - + System::remove_from_container(*$level.world, $level.player, slot_name); $gui.remove(slot_id); $gui.remove(slot_id); } @@ -143,8 +132,7 @@ namespace gui { if(gui_a != gui_b) { auto& a_name = $gui.name_for(gui_a); auto& b_name = $gui.name_for(gui_b); - auto player = $level.world->get_the(); - System::inventory_swap($level, player.entity, a_name, b_name); + System::inventory_swap($level, $level.player, a_name, b_name); } update(); diff --git a/systems.cpp b/systems.cpp index 267eebe..501db00 100644 --- a/systems.cpp +++ b/systems.cpp @@ -444,30 +444,22 @@ bool System::drop_item(GameLevel& level, Entity item) { auto& map = *level.map; auto& collision = *level.collision; - auto player = world.get_the(); - auto player_pos = world.get(player.entity); - auto& player_inv = world.get(player.entity); - - // doesn't compass already avoid walls? - for(matrix::box it{map.walls(), player_pos.location.x, player_pos.location.y, 1}; it.next();) - { - Position pos{it.x, it.y}; - - if(map.can_move(pos.location) && !collision.occupied(pos.location)) { - world.set(item, pos); - collision.insert(pos.location, item, false); - // BUG: really there should be another system that handles loot->inv moves - if(player_inv.has(item)) player_inv.remove(item); - level.world->send(Events::GUI::ENTITY_SPAWN, item, {}); - level.world->not_constant(item); - return true; - } - } + auto player_pos = world.get(level.player); + + Position pos{player_pos.aiming_at.x, player_pos.aiming_at.y}; - return false; + 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; + } } -// NOTE: I tink pickup and this need to be different +// NOTE: I think pickup and this need to be different bool System::place_in_container(World& world, Entity cont_id, const std::string& name, Entity world_entity) { auto& container = world.get(cont_id);