use bevy::prelude::*;
use crate::model::{CALM_FLICKER_DEPTH, FLICKER_DEPTH, WHIPPING_FLICKER_DEPTH, flicker_rate};
use crate::{FlameSite, Flicker};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Reflect)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FireKind {
Candle,
Lantern,
Torch,
Brazier,
Campfire,
Bonfire,
}
impl FireKind {
pub const ALL: [FireKind; 6] = [
FireKind::Candle,
FireKind::Lantern,
FireKind::Torch,
FireKind::Brazier,
FireKind::Campfire,
FireKind::Bonfire,
];
pub const fn diameter(self) -> f32 {
match self {
FireKind::Candle => 0.013,
FireKind::Lantern => 0.04,
FireKind::Torch => 0.10,
FireKind::Brazier => 0.34,
FireKind::Campfire => 0.8,
FireKind::Bonfire => 3.0,
}
}
pub const fn depth(self) -> f32 {
match self {
FireKind::Candle => 0.10,
FireKind::Lantern => CALM_FLICKER_DEPTH,
FireKind::Torch => WHIPPING_FLICKER_DEPTH,
FireKind::Brazier => FLICKER_DEPTH,
FireKind::Campfire => 0.20,
FireKind::Bonfire => 0.25,
}
}
pub const fn height(self) -> f32 {
match self {
FireKind::Candle => 0.04,
FireKind::Lantern => 0.12,
FireKind::Torch => 0.35,
FireKind::Brazier => 1.1,
FireKind::Campfire => 0.7,
FireKind::Bonfire => 2.0,
}
}
pub fn rate(self) -> f32 {
flicker_rate(self.diameter())
}
pub const fn name(self) -> &'static str {
match self {
FireKind::Candle => "Candle",
FireKind::Lantern => "Lantern",
FireKind::Torch => "Torch",
FireKind::Brazier => "Brazier",
FireKind::Campfire => "Campfire",
FireKind::Bonfire => "Bonfire",
}
}
pub fn flicker(self, mean: f32) -> Flicker {
Flicker { diameter: Some(self.diameter()), ..Flicker::at_mean(mean, self.depth()) }
}
pub fn site(self) -> FlameSite {
FlameSite {
height: self.height(),
phase: 0.0,
kindle: 0.0,
diameter: Some(self.diameter()),
depth: self.depth(),
depth_fade: false,
fire: None,
}
}
}