poke_data/models/
encounter.rs

1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::encounter_condition_value::{
4    EncounterConditionValue, EncounterConditionValueId,
5};
6use crate::models::encounter_method::{EncounterMethod, EncounterMethodId};
7use crate::models::location_area::LocationAreaId;
8use crate::models::pokemon::PokemonId;
9use crate::models::version::{Version, VersionId};
10use crate::models::version_group::{VersionGroup, VersionGroupId};
11use serde::{Deserialize, Serialize};
12use std::sync::Arc;
13
14pub type EncounterId = u32;
15
16#[derive(Debug)]
17pub struct Encounter {
18    pub id: EncounterId,
19    pub location_area_id: LocationAreaId,
20    pub pokemon_id: PokemonId,
21    pub encounter_method: Arc<EncounterMethod>,
22    pub version: Arc<Version>,
23    pub version_group: Arc<VersionGroup>,
24    pub encounter_condition_values: Vec<Arc<EncounterConditionValue>>,
25    pub slot: Option<u8>,
26    pub rarity: u8,
27    pub min_level: u8,
28    pub max_level: u8,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct UnlinkedEncounter {
33    pub id: EncounterId,
34    pub location_area_id: LocationAreaId,
35    pub pokemon_id: PokemonId,
36    pub encounter_method_id: EncounterMethodId,
37    pub version_id: VersionId,
38    pub version_group_id: VersionGroupId,
39    pub encounter_condition_value_ids: Vec<EncounterConditionValueId>,
40    pub slot: Option<u8>,
41    pub rarity: u8,
42    pub min_level: u8,
43    pub max_level: u8,
44}
45
46impl Linkable for UnlinkedEncounter {
47    type Linked = Arc<Encounter>;
48
49    fn link(&self, context: &LinkContext) -> Self::Linked {
50        let encounter_method = context
51            .encounter_methods
52            .get(&self.encounter_method_id)
53            .unwrap_or_else(|| {
54                panic!(
55                    "No encounter method '{}' found for encounter '{}'",
56                    self.encounter_method_id, self.id
57                )
58            })
59            .clone();
60
61        let version = context
62            .versions
63            .get(&self.version_id)
64            .unwrap_or_else(|| {
65                panic!(
66                    "No version '{}' found for encounter '{}'",
67                    self.version_id, self.id
68                )
69            })
70            .clone();
71
72        let version_group = context
73            .version_groups
74            .get(&self.version_group_id)
75            .unwrap_or_else(|| {
76                panic!(
77                    "No version group '{}' found for encounter '{}'",
78                    self.version_group_id, self.id
79                )
80            })
81            .clone();
82
83        let encounter_condition_values = self
84            .encounter_condition_value_ids
85            .iter()
86            .map(|id| {
87                context
88                    .encounter_condition_values
89                    .get(id)
90                    .unwrap_or_else(|| {
91                        panic!(
92                            "No encounter condition value '{}' found for encounter '{}'",
93                            id, self.id
94                        )
95                    })
96                    .clone()
97            })
98            .collect();
99
100        let encounter = Encounter {
101            id: self.id,
102            location_area_id: self.location_area_id,
103            pokemon_id: self.pokemon_id,
104            encounter_method,
105            version,
106            version_group,
107            encounter_condition_values,
108            slot: self.slot,
109            rarity: self.rarity,
110            min_level: self.min_level,
111            max_level: self.max_level,
112        };
113
114        Arc::new(encounter)
115    }
116}