diff --git a/src/components.rs b/src/components.rs index 9184dda..0e41714 100644 --- a/src/components.rs +++ b/src/components.rs @@ -477,6 +477,9 @@ pub struct EquipmentChanged {} #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct WantsToRemoveKey {} +#[derive(Component, Debug, Serialize, Deserialize, Clone)] +pub struct WantsToDelete {} + #[derive(Component, Debug, Serialize, Deserialize, Clone)] pub struct Key { pub idx: usize, diff --git a/src/damage_system.rs b/src/damage_system.rs index 65a63cd..723863d 100644 --- a/src/damage_system.rs +++ b/src/damage_system.rs @@ -11,6 +11,8 @@ use super::{ Position, Renderable, RunState, + WantsToRemoveKey, + WantsToDelete, }; use bracket_lib::prelude::*; use specs::prelude::*; @@ -65,7 +67,17 @@ pub fn delete_the_dead(ecs: &mut World) { } } } - let (items_to_delete, loot_to_spawn) = handle_dead_entity_items(ecs, &dead); + let (mut items_to_delete, loot_to_spawn) = handle_dead_entity_items(ecs, &dead); + { + let entities = ecs.entities(); + let removekeys = ecs.read_storage::(); + let delete = ecs.read_storage::(); + // Add items marked for deletion to the list, but only if they've already had their key + // assignments handled, to ensure we don't leave any dangling references behind. + for (e, _d, _r) in (&entities, &delete, !&removekeys).join() { + items_to_delete.push(e); + } + } for loot in loot_to_spawn { crate::raws::spawn_named_entity( &crate::raws::RAWS.lock().unwrap(), diff --git a/src/effects/triggers.rs b/src/effects/triggers.rs index 5dd66dd..0d40a17 100644 --- a/src/effects/triggers.rs +++ b/src/effects/triggers.rs @@ -33,6 +33,8 @@ use crate::{ KnownSpells, Position, Viewshed, + WantsToRemoveKey, + WantsToDelete, }; use crate::consts::messages::*; use bracket_lib::prelude::*; @@ -57,7 +59,10 @@ pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: let did_something = event_trigger(source, item, target, ecs); // If it's a consumable, delete it if did_something && ecs.read_storage::().get(item).is_some() { - ecs.entities().delete(item).expect("Failed to delete item"); + let mut removekey = ecs.write_storage::(); + removekey.insert(item, WantsToRemoveKey {}).expect("Unable to insert WantsToRemoveKey"); + let mut delete = ecs.write_storage::(); + delete.insert(item, WantsToDelete {}).expect("Unable to insert WantsToDelete"); } } diff --git a/src/main.rs b/src/main.rs index 81695f5..15ec604 100644 --- a/src/main.rs +++ b/src/main.rs @@ -137,6 +137,7 @@ fn setup(gfx: &mut Graphics) -> State { gs.ecs.register::(); gs.ecs.register::(); gs.ecs.register::(); + gs.ecs.register::(); gs.ecs.register::>(); gs.ecs.register::(); gs.ecs.register::(); diff --git a/src/saveload_system.rs b/src/saveload_system.rs index e4a8528..01ebe98 100644 --- a/src/saveload_system.rs +++ b/src/saveload_system.rs @@ -141,6 +141,7 @@ pub fn save_game(ecs: &mut World) { Charges, WantsToApproach, WantsToAssignKey, + WantsToDelete, WantsToDropItem, WantsToFlee, WantsToMelee, @@ -277,6 +278,7 @@ pub fn load_game(ecs: &mut World) { Charges, WantsToApproach, WantsToAssignKey, + WantsToDelete, WantsToDropItem, WantsToFlee, WantsToMelee,