Skip to main content

nil_core/battle/
luck.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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}