diff options
Diffstat (limited to 'src/content/entities/entity_grenade.rs')
| -rw-r--r-- | src/content/entities/entity_grenade.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/content/entities/entity_grenade.rs b/src/content/entities/entity_grenade.rs new file mode 100644 index 0000000..ab7aaa4 --- /dev/null +++ b/src/content/entities/entity_grenade.rs @@ -0,0 +1,61 @@ +use glam::{IVec2, Vec2}; + +use crate::{ + content::materials::MaterialId, + sim::{ + cell::cell::Cell, + entity::{EntityBehaviour, EntityCells, EntityDef, EntityUpdateCtx}, + lib::force::apply_explosion, + sim_manager::SimCtx, + }, +}; + +struct GrenadeEntityBehaviour { + pub fuse: f32, +} + +impl EntityBehaviour for GrenadeEntityBehaviour { + fn update( + &mut self, + update_ctx: &mut EntityUpdateCtx, + ctx: &mut SimCtx, + delta_time: f32, + ) -> () { + self.fuse -= delta_time; + if self.fuse <= 0.0 { + apply_explosion( + ctx, + update_ctx.entity_data.transform(ctx).unwrap().0, + 15, + Vec2::new(0.0, -0.6), + 200.0, + ); + update_ctx.deferred_destroy(update_ctx.entity_data.id); + } + } +} + +pub fn entity_grenade_def(position: Vec2, fuse: f32) -> EntityDef { + let w = 3; + let h = 3; + let mut raw_cells = vec![Cell::void(); (w * h) as usize]; + + for x in 0..w { + for y in 0..h { + let cell_idx = x + y * w; + raw_cells[cell_idx as usize] = Cell::from_material(MaterialId::Steel); + raw_cells[cell_idx as usize].set_entity(true); + } + } + + let entity_cells = EntityCells { + cells: raw_cells, + size: IVec2::new(w, h), + }; + + EntityDef::from_cells( + position, + entity_cells, + Some(Box::new(GrenadeEntityBehaviour { fuse })), + ) +} |
