poke_data/models/pokemon_move/
meta.rs1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::pokemon_move_ailment::{PokemonMoveAilment, PokemonMoveAilmentId};
4use crate::models::pokemon_move_category::{PokemonMoveCategory, PokemonMoveCategoryId};
5use crate::types::stat::Stat;
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use std::sync::Arc;
9
10#[derive(Debug)]
11pub struct PokemonMoveMeta {
12 pub category: Arc<PokemonMoveCategory>,
13 pub ailment: Arc<PokemonMoveAilment>,
14 pub min_hits: Option<u8>,
15 pub max_hits: Option<u8>,
16 pub min_turns: Option<u8>,
17 pub max_turns: Option<u8>,
18 pub stat_changes: HashMap<Stat, i8>,
19 pub drain: i8,
20 pub healing: i8,
21 pub crit_rate: u8,
22 pub ailment_chance: u8,
23 pub flinch_chance: u8,
24 pub stat_chance: u8,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct UnlinkedPokemonMoveMeta {
29 pub category_id: PokemonMoveCategoryId,
30 pub ailment_id: PokemonMoveAilmentId,
31 pub min_hits: Option<u8>,
32 pub max_hits: Option<u8>,
33 pub min_turns: Option<u8>,
34 pub max_turns: Option<u8>,
35 pub stat_changes: HashMap<Stat, i8>,
36 pub drain: i8,
37 pub healing: i8,
38 pub crit_rate: u8,
39 pub ailment_chance: u8,
40 pub flinch_chance: u8,
41 pub stat_chance: u8,
42}
43
44impl Linkable for UnlinkedPokemonMoveMeta {
45 type Linked = PokemonMoveMeta;
46
47 fn link(&self, context: &LinkContext) -> Self::Linked {
48 let category = context
49 .move_categories
50 .get(&self.category_id)
51 .unwrap_or_else(|| {
52 panic!(
53 "No move category '{}' found for move meta data",
54 self.category_id
55 )
56 })
57 .clone();
58
59 let ailment = context
60 .move_ailments
61 .get(&self.ailment_id)
62 .unwrap_or_else(|| {
63 panic!(
64 "No move ailment '{}' found for move meta data",
65 self.ailment_id
66 )
67 })
68 .clone();
69
70 PokemonMoveMeta {
71 category,
72 ailment,
73 min_hits: self.min_hits,
74 max_hits: self.max_hits,
75 min_turns: self.min_turns,
76 max_turns: self.max_turns,
77 stat_changes: self.stat_changes.clone(),
78 drain: self.drain,
79 healing: self.healing,
80 crit_rate: self.crit_rate,
81 ailment_chance: self.ailment_chance,
82 flinch_chance: self.flinch_chance,
83 stat_chance: self.stat_chance,
84 }
85 }
86}