poke_data/models/
encounter.rs1use 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}