ensure key assignments are handled for consumed/deleted items
This commit is contained in:
parent
d11971126c
commit
f3af75bf44
5 changed files with 25 additions and 2 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue