rpg_stat/
effect.rs

1/*!
2# Effect
3This composes the various Effects in-game related to a character's Stats
4
5
6*/
7use std::fmt;
8use std::fmt::Debug;
9extern crate num;
10use serde::{Deserialize, Serialize};
11
12#[cfg(feature = "fltkform")]
13use fltk::{prelude::*, *};
14#[cfg(feature = "fltkform")]
15use fltk_form_derive::*;
16#[cfg(feature = "fltkform")]
17use fltk_form::FltkForm;
18use crate::random::Random;
19
20/*
21# Basic 
22
23*/
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
25#[cfg_attr(feature = "fltkform", derive(FltkForm))]
26pub enum Basic {
27    /// no effect aka a player or something else that should not have an effect, like a key
28    None,
29    /// add or remove HP based on the attack/item/special's HP
30    HP,
31    /// add or remove MP based on the attack/item/special's MP
32    MP,
33    /// add or remove XP. enemies all have this effect
34    XP,
35    /// add or remove GP.
36    GP,
37}
38impl Default for Basic {
39    fn default() -> Self {
40        Self::None
41    }
42}
43impl fmt::Display for Basic {
44    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45        let v:String;
46        match *self {
47            Basic::HP => v = String::from("HP"),
48            Basic::MP => v = String::from("MP"),
49            Basic::GP => v = String::from("GP"),
50            Basic::XP => v = String::from("XP"),
51            Basic::None => v = String::from("None"),
52        }
53        write!(f, "{}", v.as_str())
54    }
55}
56impl Random for Basic {
57    type Type = Basic;
58    fn random_type(&self) -> Self::Type {
59        let max = 4;
60        let val = self.random_rate(max);
61        match val {
62            0 => Basic::HP,
63            1 => Basic::MP,
64            2 => Basic::XP,
65            3 => Basic::GP,
66            _=> Basic::None,
67        }
68    }
69}
70
71/*
72# Normal 
73
74*/
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
76#[cfg_attr(feature = "fltkform", derive(FltkForm))]
77pub enum Normal {
78    /// no effect aka a player or something else that should not have an effect, like a key
79    None,
80    /// add or remove HP based on the attack/item/special's HP
81    HP,
82    /// add or remove MP based on the attack/item/special's MP
83    MP,
84    /// add or remove XP. enemies all have this effect
85    XP,
86    /// add or remove GP.
87    GP,
88/// # These next five continously drain HP/MP until remedy, or duration runs out
89    /// hp drain
90    Burn,
91    /// hp drain, very minor mp drain
92    Poison,
93    /// minor hp drain, very minor mp drain, no movement
94    Freeze,
95    /// hp drain, minor mp drain
96    Sick,
97    /// mp drain
98    Sap,
99/// # These next two continuously add HP/MP
100    /// mp add
101    Bless,
102    /// hp add
103    Heal,
104/// # Blocker/locker effects
105    /// no movement
106    Stuck,
107    /// no attack
108    Bound,
109    /// no mana attack
110    Blocked,
111    /// a lock to prevent access
112    Locked,  
113}
114impl Default for Normal {
115    fn default() -> Self {
116        Self::None
117    }
118}
119impl fmt::Display for Normal {
120    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
121        let v:String;
122        match *self {
123            Normal::None => v = "None".to_string(),
124            Normal::HP => v = "HP".to_string(),
125            Normal::MP => v = "MP".to_string(),
126            Normal::XP => v = "XP".to_string(),
127            Normal::GP => v = String::from("GP"),
128            Normal::Burn => v = "Burn".to_string(),
129            Normal::Poison => v = "Poison".to_string(),
130            Normal::Freeze => v = "Freeze".to_string(),
131            Normal::Sick => v = "Sick".to_string(),
132            Normal::Sap => v = "Sap".to_string(),
133            Normal::Bless => v = "Bless".to_string(),
134            Normal::Heal => v = "Heal".to_string(),
135            Normal::Stuck => v = "Stuck".to_string(),
136            Normal::Bound => v = "Bound".to_string(),
137            Normal::Blocked => v = "Blocked".to_string(),
138            Normal::Locked => v = "Locked".to_string(),
139        }
140        write!(f, "{}", v.as_str())
141    }
142}
143impl Random for Normal {
144    type Type = Normal;
145    fn random_type(&self) -> Self::Type {
146        let max = 15;
147        let val = self.random_rate(max);
148        match val {
149            0 => Normal::HP,
150            1 => Normal::MP,
151            2 => Normal::XP,
152            3 => Normal::GP,
153            4 => Normal::Burn,
154            5 => Normal::Poison,
155            7 => Normal::Freeze,
156            8 => Normal::Sick,
157            9 => Normal::Sap,
158            10 => Normal::Bless,
159            11 => Normal::Heal,
160            12 => Normal::Stuck,
161            13 => Normal::Bound,
162            14 => Normal::Blocked,
163            15 => Normal::Locked,
164            _=> Normal::None,
165        }
166    }
167}
168/*
169# Advanced 
170
171*/
172//TODO more effects
173#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
174#[cfg_attr(feature = "fltkform", derive(FltkForm))]
175pub enum Advanced {
176    /// no effect aka a player or something else that should not have an effect, like a key
177    None,
178    /// add or remove HP based on the attack/item/special's HP
179    HP,
180    /// add or remove MP based on the attack/item/special's MP
181    MP,
182    /// add or remove XP. enemies all have this effect
183    XP,
184    /// add or remove GP.
185    GP,
186/// # These next five continously drain HP/MP until remedy, or duration runs out
187    /// hp drain
188    Burn,
189    /// hp drain, very minor mp drain
190    Poison,
191    /// minor hp drain, very minor mp drain, no movement
192    Freeze,
193    /// hp drain, minor mp drain
194    Sick,
195    /// mp drain
196    Sap,
197/// # These next two continuously add HP/MP
198    /// mp add
199    Bless,
200    /// hp add
201    Heal,
202/// # Blocker/locker effects
203    /// no movement
204    Stuck,
205    /// no attack
206    Bound,
207    /// no mana attack
208    Blocked,
209    /// a lock to prevent access
210    Locked,  
211}
212impl Default for Advanced {
213    fn default() -> Self {
214        Self::None
215    }
216}
217impl fmt::Display for Advanced {
218    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
219        let v:String;
220        match *self {
221            Advanced::None => v = "None".to_string(),
222            Advanced::HP => v = "HP".to_string(),
223            Advanced::MP => v = "MP".to_string(),
224            Advanced::XP => v = "XP".to_string(),
225            Advanced::GP => v = String::from("GP"),
226            Advanced::Burn => v = "Burn".to_string(),
227            Advanced::Poison => v = "Poison".to_string(),
228            Advanced::Freeze => v = "Freeze".to_string(),
229            Advanced::Sick => v = "Sick".to_string(),
230            Advanced::Sap => v = "Sap".to_string(),
231            Advanced::Bless => v = "Bless".to_string(),
232            Advanced::Heal => v = "Heal".to_string(),
233            Advanced::Stuck => v = "Stuck".to_string(),
234            Advanced::Bound => v = "Bound".to_string(),
235            Advanced::Blocked => v = "Blocked".to_string(),
236            Advanced::Locked => v = "Locked".to_string(),
237        }
238        write!(f, "{}", v.as_str())
239    }
240}