1use alloc::{
2 string::String,
3 vec::Vec,
4};
5
6use hashbrown::HashSet;
7use serde::{
8 Deserialize,
9 Serialize,
10};
11use serde_string_enum::{
12 DeserializeLabeledStringEnum,
13 SerializeLabeledStringEnum,
14};
15
16use crate::{
17 Accuracy,
18 BoostTable,
19 Fraction,
20 MonOverride,
21 MoveCategory,
22 MoveFlag,
23 MoveTarget,
24 MultihitType,
25 OhkoType,
26 SelfDestructType,
27 Stat,
28 SwitchType,
29 Type,
30};
31
32#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct HitEffect {
35 pub boosts: Option<BoostTable>,
37 pub heal_percent: Option<Fraction<u16>>,
39 pub status: Option<String>,
41 pub volatile_status: Option<String>,
43 pub side_condition: Option<String>,
45 pub slot_condition: Option<String>,
47 pub weather: Option<String>,
49 pub pseudo_weather: Option<String>,
51 pub terrain: Option<String>,
53 #[serde(default)]
55 pub force_switch: bool,
56}
57
58#[derive(Debug, Default, Clone, Serialize, Deserialize)]
60pub struct SecondaryEffectData {
61 pub chance: Option<Fraction<u16>>,
63 pub target: Option<HitEffect>,
65 pub user: Option<HitEffect>,
67 #[serde(default)]
69 pub effect: serde_json::Value,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
74pub enum ZPower {
75 #[serde(rename = "boosts")]
76 Boosts(BoostTable),
77 #[serde(rename = "effect")]
78 Effect(String),
79}
80
81#[derive(Debug, Default, Clone, Serialize, Deserialize)]
83pub struct ZMoveData {
84 #[serde(default)]
86 pub base_power: u32,
87 #[serde(flatten)]
89 pub z_power: Option<ZPower>,
90}
91
92#[derive(Debug, Default, Clone, Serialize, Deserialize)]
94pub struct MaxMoveData {
95 pub base_power: u32,
97}
98#[derive(Debug, Default, Clone, SerializeLabeledStringEnum, DeserializeLabeledStringEnum)]
100pub enum RecoilBase {
101 #[default]
103 #[string = "Damage"]
104 Damage,
105 #[string = "UserMaxHp"]
107 UserMaxHp,
108 #[string = "UserBaseMaxHp"]
110 UserBaseMaxHp,
111}
112
113#[derive(Debug, Default, Clone, Serialize, Deserialize)]
115pub struct RecoilData {
116 #[serde(default)]
118 pub base: RecoilBase,
119 pub percent: Fraction<u16>,
121 #[serde(default)]
123 pub struggle: bool,
124}
125
126fn default_crit_ratio() -> Option<u8> {
127 Some(1)
128}
129
130#[derive(Debug, Default, Clone, Serialize, Deserialize)]
137pub struct MoveData {
138 pub name: String,
140 pub category: MoveCategory,
142 pub primary_type: Type,
144 #[serde(default)]
146 pub base_power: u32,
147 pub accuracy: Accuracy,
149 #[serde(default)]
151 pub pp: u8,
152 #[serde(default)]
154 pub priority: i8,
155 pub target: MoveTarget,
157 pub flags: HashSet<MoveFlag>,
159
160 pub damage: Option<u16>,
162 #[serde(default)]
164 pub no_pp_boosts: bool,
165
166 pub ohko_type: Option<OhkoType>,
170 pub user_switch: Option<SwitchType>,
172 pub self_destruct: Option<SelfDestructType>,
174 pub recoil: Option<RecoilData>,
176 pub drain_percent: Option<Fraction<u16>>,
178 #[serde(default)]
180 pub typeless: bool,
181 #[serde(default)]
183 pub force_stab: bool,
184
185 pub hit_effect: Option<HitEffect>,
189 pub user_effect: Option<HitEffect>,
193 pub user_effect_chance: Option<Fraction<u16>>,
195 #[serde(default)]
197 pub secondary_effects: Vec<SecondaryEffectData>,
198
199 pub override_offensive_mon: Option<MonOverride>,
203 pub override_offensive_stat: Option<Stat>,
207 pub override_defensive_mon: Option<MonOverride>,
211 pub override_defensive_stat: Option<Stat>,
215
216 #[serde(default = "default_crit_ratio")]
218 pub crit_ratio: Option<u8>,
219 #[serde(default)]
221 pub ignore_accuracy: bool,
222 #[serde(default)]
224 pub ignore_defensive: bool,
225 #[serde(default)]
227 pub ignore_evasion: bool,
228 #[serde(default)]
230 pub ignore_offensive: bool,
231 #[serde(default)]
233 pub multiaccuracy: bool,
234 pub multihit: Option<MultihitType>,
236 #[serde(default)]
238 pub tracks_target: bool,
239 #[serde(default)]
241 pub will_crit: bool,
242 #[serde(default)]
244 pub no_random_target: bool,
245
246 pub z_move: Option<ZMoveData>,
248 pub max_move: Option<MaxMoveData>,
250
251 #[serde(default)]
253 pub effect: serde_json::Value,
254 #[serde(default)]
256 pub condition: serde_json::Value,
257}