ensure key assignments are handled for consumed/deleted items

This commit is contained in:
Llywelwyn 2023-10-05 01:05:00 +01:00
parent d11971126c
commit f3af75bf44
5 changed files with 25 additions and 2 deletions

View file

@ -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,

View file

@ -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::<WantsToRemoveKey>();
let delete = ecs.read_storage::<WantsToDelete>();
// 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(),

View file

@ -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<Entity>, 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::<Consumable>().get(item).is_some() {
ecs.entities().delete(item).expect("Failed to delete item");
let mut removekey = ecs.write_storage::<WantsToRemoveKey>();
removekey.insert(item, WantsToRemoveKey {}).expect("Unable to insert WantsToRemoveKey");
let mut delete = ecs.write_storage::<WantsToDelete>();
delete.insert(item, WantsToDelete {}).expect("Unable to insert WantsToDelete");
}
}

View file

@ -137,6 +137,7 @@ fn setup(gfx: &mut Graphics) -> State {
gs.ecs.register::<WantsToAssignKey>();
gs.ecs.register::<Key>();
gs.ecs.register::<WantsToRemoveKey>();
gs.ecs.register::<WantsToDelete>();
gs.ecs.register::<SimpleMarker<SerializeMe>>();
gs.ecs.register::<SerializationHelper>();
gs.ecs.register::<DMSerializationHelper>();

View file

@ -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,