From 5a4d3bf067df74f27f6f8edba28955a11a0f3353 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Thu, 17 Aug 2023 10:40:54 +0100 Subject: [PATCH] effects: triggers --- raws/props.json | 13 +++++-- src/trigger_system.rs | 89 ++++++++++++++----------------------------- 2 files changed, 39 insertions(+), 63 deletions(-) diff --git a/raws/props.json b/raws/props.json index a759520..caebe34 100644 --- a/raws/props.json +++ b/raws/props.json @@ -56,21 +56,28 @@ { "id": "trap_bear", "name": "bear trap", - "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "^", "fg": "#e6e6e6", "bg": "#000000", "order": 2 }, "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "effects": { "damage": "2d4" } }, + { + "id": "trap_mine", + "name": "mine", + "renderable": { "glyph": "^", "fg": "#ff1e00", "bg": "#000000", "order": 2 }, + "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], + "effects": { "damage": "2d8", "aoe": "3" } + }, { "id": "trap_stonefall", "name": "stonefall trap", - "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "^", "fg": "#beb5a7", "bg": "#000000", "order": 2 }, "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "effects": { "damage": "2d10" } }, { "id": "trap_confusion", "name": "magic trap", - "renderable": { "glyph": "^", "fg": "#800080", "bg": "#000000", "order": 2 }, + "renderable": { "glyph": "^", "fg": "#df07df", "bg": "#000000", "order": 2 }, "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "effects": { "confusion": "3" } } diff --git a/src/trigger_system.rs b/src/trigger_system.rs index 1333847..fbcac0d 100644 --- a/src/trigger_system.rs +++ b/src/trigger_system.rs @@ -1,8 +1,10 @@ use super::{ - effects::{add_effect, EffectType, Targets}, - gamelog, Confusion, EntityMoved, EntryTrigger, Hidden, InflictsDamage, Map, Name, ParticleBuilder, Position, - SingleActivation, + effects::{add_effect, aoe_tiles, EffectType, Targets}, + gamelog, + gui::renderable_colour, + EntityMoved, EntryTrigger, Map, Name, Point, Position, Renderable, AOE, }; +use rltk::prelude::*; use specs::prelude::*; pub struct TriggerSystem {} @@ -14,34 +16,14 @@ impl<'a> System<'a> for TriggerSystem { WriteStorage<'a, EntityMoved>, ReadStorage<'a, Position>, ReadStorage<'a, EntryTrigger>, - ReadStorage<'a, InflictsDamage>, - WriteStorage<'a, Confusion>, - WriteStorage<'a, Hidden>, - ReadStorage<'a, SingleActivation>, ReadStorage<'a, Name>, - WriteExpect<'a, ParticleBuilder>, Entities<'a>, - WriteExpect<'a, rltk::RandomNumberGenerator>, + ReadStorage<'a, AOE>, + ReadStorage<'a, Renderable>, ); fn run(&mut self, data: Self::SystemData) { - let ( - map, - mut entity_moved, - position, - entry_trigger, - inflicts_damage, - mut confusion, - mut hidden, - single_activation, - names, - mut particle_builder, - entities, - mut rng, - ) = data; - - // Iterate entities that moved, and their final position - let mut remove_entities: Vec = Vec::new(); + let (map, mut entity_moved, position, entry_trigger, names, entities, aoes, renderables) = data; for (entity, mut _entity_moved, pos) in (&entities, &mut entity_moved, &position).join() { let idx = map.xy_idx(pos.x, pos.y); crate::spatial::for_each_tile_content(idx, |entity_id| { @@ -50,46 +32,33 @@ impl<'a> System<'a> for TriggerSystem { match maybe_trigger { None => {} Some(_trigger) => { - // Something on this pos had a trigger - let name = names.get(entity_id); - hidden.remove(entity_id); - if let Some(name) = name { - particle_builder.trap_triggered(pos.x, pos.y); - gamelog::Logger::new().item_name(&name.name).append("triggers!").log(); - } - - let damage = inflicts_damage.get(entity_id); - if let Some(damage) = damage { - let damage_roll = rng.roll_dice(damage.n_dice, damage.sides) + damage.modifier; - particle_builder.damage_taken(pos.x, pos.y); - add_effect( - None, - EffectType::Damage { amount: damage_roll }, - Targets::Entity { target: entity }, - ); - } - - let confuses = confusion.get(entity_id); - if let Some(confuses) = confuses { - confusion - .insert(entity, Confusion { turns: confuses.turns }) - .expect("Unable to insert confusion"); - } - - let sa = single_activation.get(entity_id); - if let Some(_sa) = sa { - remove_entities.push(entity_id); + if map.visible_tiles[idx] == true { + if let Some(name) = names.get(entity_id) { + gamelog::Logger::new() + .append("The") + .colour(renderable_colour(&renderables, entity_id)) + .append(&name.name) + .colour(WHITE) + .append("triggers!") + .log(); + } } + add_effect( + Some(entity), + EffectType::TriggerFire { trigger: entity_id }, + if let Some(aoe) = aoes.get(entity_id) { + Targets::TileList { + targets: aoe_tiles(&*map, Point::new(pos.x, pos.y), aoe.radius), + } + } else { + Targets::Tile { target: idx } + }, + ); } } } }); } - - for trap in remove_entities.iter() { - entities.delete(*trap).expect("Unable to delete trap"); - } - entity_moved.clear(); } }