1use derive_more::Deref;
5use serde::{Deserialize, Serialize};
6use std::ops::{Mul, MulAssign};
7
8#[derive(Clone, Copy, Debug, Deref, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)]
9pub struct Luck(i8);
10
11impl Luck {
12 pub const MIN: Luck = Luck(-20);
13 pub const MAX: Luck = Luck(20);
14
15 #[inline]
16 pub fn new(value: i8) -> Self {
17 Self(value.clamp(Self::MIN.0, Self::MAX.0))
18 }
19
20 pub fn random() -> Self {
21 Self(rand::random_range(Self::MIN.0..=Self::MAX.0))
22 }
23}
24
25impl Default for Luck {
26 fn default() -> Self {
27 Self::random()
28 }
29}
30
31impl From<Luck> for f64 {
32 fn from(luck: Luck) -> Self {
33 f64::from(luck.0) / 100.0
34 }
35}
36
37impl Mul<Luck> for f64 {
38 type Output = f64;
39
40 fn mul(self, rhs: Luck) -> Self::Output {
41 self * f64::from(rhs)
42 }
43}
44
45impl MulAssign<Luck> for f64 {
46 fn mul_assign(&mut self, rhs: Luck) {
47 *self = *self * rhs;
48 }
49}