use core::ops::Range;
use super::{scale::SUBPIXELS, stream::Plume, DEFAULT_LIFETIME, FULL_SCALE};
#[cfg(feature = "physics")]
use crate::physics::Wind;
use crate::{Color, Context, Direction, Graphics};
#[derive(Debug)]
pub struct Fire<const SCALE: usize = FULL_SCALE, const LIFETIME: usize = DEFAULT_LIFETIME> {
plume: Plume<SCALE, LIFETIME>,
}
impl<const SCALE: usize, const LIFETIME: usize> Fire<SCALE, LIFETIME> {
pub const fn new(x: i16, y: i16) -> Self {
Self {
plume: Plume::new(x, y, FIRE_SPEED, Some(DEFAULT_LIFETIME)),
}
}
pub const fn with_direction(mut self, direction: Direction) -> Self {
self.plume.set_direction(direction);
self
}
pub const fn with_puffs(mut self, puffs: usize) -> Self {
self.plume.set_puffs(puffs);
self
}
pub fn set_direction(&mut self, direction: Direction) {
self.plume.set_direction(direction);
}
pub fn set_puffing(&mut self, puffing: bool) {
self.plume.set_puffing(puffing);
}
pub fn move_to(&mut self, x: i16, y: i16) {
self.plume.move_to(x, y);
}
#[cfg(feature = "physics")]
pub fn blown_by(&mut self, wind: &Wind) {
self.plume.blown_by(wind);
}
pub fn update(&mut self, ctx: &mut Context) {
self.plume.update(ctx);
}
pub fn draw(&self, gfx: &mut Graphics) {
self.plume.draw(gfx, FIRE_BIRTH_COLOR, &FIRE_COLOR_STOPS);
}
}
pub type SmokingFire<const SCALE: usize = FULL_SCALE> = Fire<SCALE, SMOKING_FIRE_LIFETIME>;
pub const SMOKING_FIRE_LIFETIME: usize = 2 * DEFAULT_LIFETIME;
const FIRE_BIRTH_COLOR: Color = Color::WHITE;
const FIRE_COLOR_STOPS: [(usize, Color); 4] = [
(4, Color::YELLOW),
(10, Color::ORANGE),
(DEFAULT_LIFETIME, Color::LIGHT_GREY),
(DEFAULT_LIFETIME + 10, Color::DARK_GREY),
];
pub(super) const FIRE_SPEED: Range<i32> = SUBPIXELS / 2..SUBPIXELS * 3 / 2;
#[cfg(test)]
mod tests {
use super::*;
const FIRE: Fire<5> = Fire::new(3, 4)
.with_direction(Direction::Left)
.with_puffs(3);
#[test]
fn the_const_built_fire_runs_like_any_other() {
let mut fire = FIRE;
let mut ctx = Context { _private: () };
fire.update(&mut ctx);
}
}