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