#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub const RED: Color = Color { r: 1.0, g: 0.0, b: 0.0 };
pub const PINK: Color = Color { r: 1.0, g: 0.4, b: 0.6 };
pub const ORANGE: Color = Color { r: 1.0, g: 0.5, b: 0.0 };
pub const BEIGE: Color = Color { r: 0.9, g: 0.75, b: 0.5 };
pub const YELLOW: Color = Color { r: 1.0, g: 1.0, b: 0.0 };
pub const LIME: Color = Color { r: 0.6, g: 1.0, b: 0.2 };
pub const GREEN: Color = Color { r: 0.0, g: 0.85, b: 0.0 };
pub const CYAN: Color = Color { r: 0.0, g: 0.9, b: 0.9 };
pub const SKY: Color = Color { r: 0.3, g: 0.6, b: 1.0 };
pub const BLUE: Color = Color { r: 0.2, g: 0.2, b: 1.0 };
pub const PURPLE: Color = Color { r: 0.6, g: 0.2, b: 1.0 };
pub const MAGENTA: Color = Color { r: 1.0, g: 0.2, b: 0.6 };
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Color {
r: f32,
g: f32,
b: f32,
}
impl Eq for Color {}
impl Color {
pub fn new(r: f32, g: f32, b: f32) -> Self {
Self { r, g, b }
}
pub fn r(&self) -> f32 {
self.r
}
pub fn g(&self) -> f32 {
self.g
}
pub fn b(&self) -> f32 {
self.b
}
pub fn set_r(&mut self, r: f32) {
self.r = r;
}
pub fn set_g(&mut self, g: f32) {
self.g = g;
}
pub fn set_b(&mut self, b: f32) {
self.b = b;
}
pub fn apply_health(&self, health: f32) -> Color {
Color {
r: self.r * health,
g: self.g * health,
b: self.b * health,
}
}
pub fn color_name(&self) -> Option<&'static str> {
match *self {
RED => Some("red"),
PINK => Some("pink"),
ORANGE => Some("orange"),
BEIGE => Some("beige"),
YELLOW => Some("yellow"),
LIME => Some("lime"),
GREEN => Some("green"),
CYAN => Some("cyan"),
SKY => Some("sky"),
BLUE => Some("blue"),
PURPLE => Some("purple"),
MAGENTA => Some("magenta"),
_ => None,
}
}
}
pub fn all_colors() -> impl Iterator<Item = Color> {
[
RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA,
ORANGE, SKY, LIME, PURPLE, BEIGE, PINK,
]
.into_iter()
}
impl Default for Color {
fn default() -> Self {
Self::new(0.0, 0.0, 0.0)
}
}
impl std::fmt::Display for Color {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.color_name() {
Some(name) => write!(f, "{}", name),
None => write!(f, "Color(r={:.2}, g={:.2}, b={:.2})", self.r, self.g, self.b),
}
}
}