1use std::fmt;
58use std::fmt::Debug;
59use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, SubAssign};
60extern crate num;
61use serde::{Deserialize, Serialize};
62
63#[cfg(feature = "fltkform")]
64use fltk::{prelude::*, *};
65#[cfg(feature = "fltkform")]
66use fltk_form_derive::*;
67#[cfg(feature = "fltkform")]
68use fltk_form::FltkForm;
69
70use crate::random::Random;
72
73
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
89#[cfg_attr(feature = "fltkform", derive(FltkForm))]
90pub enum Rate {
91 Always,
93 Usually,
95 Often,
97 Some,
99 Hardly,
101 Barely,
103 None,
105}
106impl Random for Rate{
107 type Type = Rate;
108 fn random_type(&self) -> Self::Type {
109 let max = 7;
110 let val = self.random_rate(max);
111 match val {
112 0 => Rate::None,
113 1 => Rate::Often,
114 3 => Rate::Hardly,
115 4 => Rate::Some,
116 5 => Rate::Barely,
117 7 => Rate::Always,
118 _=> Rate::Usually,
119 }
120 }
121}
122impl Rate {
123 #[allow(unused)]
127 pub fn worked(&self) -> bool {
128 match *self {
129 Rate::Always => true, Rate::Usually => self.usually(),
131 Rate::Often => self.often(),
132 Rate::Some => self.half(), Rate::Hardly => self.hardly(),
134 Rate::Barely => self.barely(),
135 Rate::None => false, }
137 }
138}
139impl fmt::Display for Rate {
140 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
141 let v:String;
142 match *self {
143 Rate::Always => v = String::from("Always"),
144 Rate::Usually => v = String::from("Usually"),
145 Rate::Often => v = String::from("Often"),
146 Rate::Some => v = String::from("Some"),
147 Rate::Hardly => v = String::from("Hardly"),
148 Rate::Barely => v = String::from("Barely"),
149 Rate::None => v = String::from("None"),
150 }
151 write!(f, "{}", v.as_str())
152 }
153}
154
155#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
167#[cfg_attr(feature = "fltkform", derive(FltkForm))]
168pub enum Effectiveness {
169 Double,
171 HalfExtra,
173 Half,
175 Normal,
177 None,
179}
180impl Random for Effectiveness{
181 type Type = Effectiveness;
182 fn random_type(&self) -> Self::Type {
183 let max = 6;
184 let val = self.random_rate(max);
185 match val {
186 0 => Effectiveness::Double,
187 1 => Effectiveness::HalfExtra,
188 4 => Effectiveness::Half,
189 5 => Effectiveness::Normal,
190 _=> Effectiveness::None,
191 }
192 }
193}
194impl<T:Copy
195 + Default
196 + Debug
197 + AddAssign
198 + Add<Output = T>
199 + Div<Output = T>
200 + DivAssign
201 + Mul<Output = T>
202 + MulAssign
203 + Neg<Output = T>
204 + Rem<Output = T>
205 + RemAssign
206 + Sub<Output = T>
207 + SubAssign
208 + std::cmp::PartialOrd
209 + num::NumCast> Value<T> for Effectiveness {
210 type Type = T;
211 fn value(&self, input:T) -> Self::Type {
212 match *self {
213 Effectiveness::Double => input + input,
214 Effectiveness::HalfExtra => {
215 let half:T = input / num::cast(2).unwrap();
216 input + half
217 },
218 Effectiveness::Normal => input,
219 Effectiveness::Half => input / num::cast(2).unwrap(),
220 Effectiveness::None => num::cast(0).unwrap(),
221 }
222 }
223}
224impl Default for Effectiveness {
225 fn default() -> Self {
227 Self::None
228 }
229}
230impl fmt::Display for Effectiveness {
231 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
232 let v:String;
233 match *self {
234 Effectiveness::Double => v = String::from("Double"),
235 Effectiveness::HalfExtra => v = String::from("HalfExtra"),
236 Effectiveness::Half => v = String::from("Half"),
237 Effectiveness::Normal => v = String::from("Normal"),
238 Effectiveness::None => v = String::from("None"),
239 }
240 write!(f, "{}", v.as_str())
241 }
242}
243#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
244#[cfg_attr(feature = "fltkform", derive(FltkForm))]
245pub enum Stage {
251 Baby,
252 Toddler,
253 Kid,
254 Teen,
255 Young,
256 Grown,
257 Older,
258 Old,
259}
260impl Random for Stage{
261 type Type = Stage;
262 fn random_type(&self) -> Self::Type {
263 let max = 8;
264 let val = self.random_rate(max);
265 match val {
266 0 => Stage::Toddler,
267 1 => Stage::Kid,
268 3 => Stage::Teen,
269 4 => Stage::Young,
270 5 => Stage::Grown,
271 7 => Stage::Older,
272 8 => Stage::Old,
273 _=> Stage::Baby,
274 }
275 }
276}
277impl Stage {
278 #[allow(dead_code)]
280 fn default() -> Self {
281 Self::Teen
282 }
283}
284impl<T:Copy
285 + Default
286 + Debug
287 + AddAssign
288 + Add<Output = T>
289 + Div<Output = T>
290 + DivAssign
291 + Mul<Output = T>
292 + MulAssign
293 + Neg<Output = T>
294 + Rem<Output = T>
295 + RemAssign
296 + Sub<Output = T>
297 + SubAssign
298 + std::cmp::PartialOrd
299 + num::NumCast> Value<T> for Stage {
300 type Type = Stage;
303 fn value(&self, age:T) -> Self::Type {
304 if age < num::cast(2).unwrap() {
305 Stage::Baby
306 } else if age < num::cast(4).unwrap() {
307 Stage::Toddler
308 } else if age < num::cast(13).unwrap() {
309 Stage::Kid
310 } else if age < num::cast(20).unwrap() {
311 Stage::Teen
312 } else if age < num::cast(40).unwrap() {
313 Stage::Young
314 } else if age < num::cast(65).unwrap() {
315 Stage::Grown
316 } else if age < num::cast(85).unwrap() {
317 Stage::Older
318 } else {
319 Stage::Old
320 }
321
322 }
323}
324
325pub trait Value<T:Copy
326 + Default
327 + Debug
328 + AddAssign
329 + Add<Output = T>
330 + Div<Output = T>
331 + DivAssign
332 + Mul<Output = T>
333 + MulAssign
334 + Neg<Output = T>
335 + Rem<Output = T>
336 + RemAssign
337 + Sub<Output = T>
338 + SubAssign
339 + std::cmp::PartialOrd
340 + num::NumCast> {
341 type Type;
342 fn value(&self, input:T) -> Self::Type;
343}