From d7eccba2055cd7784a0db6d9ee8692a4f3510931 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sat, 15 Aug 2026 22:46:53 -0700 Subject: fire, optimize viewport rendering --- src/sim/materials/fire.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/sim/materials/fire.rs (limited to 'src/sim/materials/fire.rs') diff --git a/src/sim/materials/fire.rs b/src/sim/materials/fire.rs new file mode 100644 index 0000000..b155986 --- /dev/null +++ b/src/sim/materials/fire.rs @@ -0,0 +1,53 @@ +use rand::RngExt; + +use crate::sim::{cell::Cell, materials::MaterialId, sim::UpdateCtx}; + +trait FireCellView { + fn get_ticks_lived(self) -> u16; + fn set_ticks_lived(&mut self, ticks: u16) -> (); + fn is_flammable(self) -> bool; +} + +impl FireCellView for Cell { + fn get_ticks_lived(self) -> u16 { + self.data + } + fn set_ticks_lived(&mut self, ticks: u16) -> () { + self.data = ticks; + } + // this could be a property of the material def, I think it's better here for now + fn is_flammable(self) -> bool { + [MaterialId::Wood].contains(&self.material) + } +} + +#[inline] +pub fn sim_update(ctx: &mut UpdateCtx) { + let ticks_lived = ctx.cell.get_ticks_lived(); + // 2 seconds + if ticks_lived > 240 { + // kill ourselves, with a chance to turn into ash + if ctx.rng.random_range(0.0..1.0) > 0.8 { + // TODO ash material + ctx.set_cell(0, 0, Cell::from_material(MaterialId::Sand)); + } else { + ctx.set_cell(0, 0, Cell::void()); + } + return; + } + + // 4 times in our lifespan, try to spread in a random direction + // since it's random, fire may die out if there's nothing in that direction + // a 1-thick line of flammable cells has a 31% chance to die each iteration + if ticks_lived % 60 == 0 { + let (dx, dy) = (ctx.rng.random_range(-1..=1), ctx.rng.random_range(-1..=1)); + if let Some(target) = ctx.get_cell(dx, dy) + && target.is_flammable() + { + ctx.set_cell(dx, dy, Cell::from_material(MaterialId::Fire)); + } + } + + ctx.cell.set_ticks_lived(ticks_lived + 1); + ctx.set_cell(0, 0, *ctx.cell); +} -- cgit v1.3.1