poke_data/data/
unlinked.rs

1use crate::collections::pokemon_type_efficacies::PokemonTypeEfficaciesCollection;
2use crate::data::link_context::LinkContext;
3use crate::data::linkable::Linkable;
4use crate::data::PokeData;
5use crate::models::ability::{AbilityId, UnlinkedAbility};
6use crate::models::berry::{BerryId, UnlinkedBerry};
7use crate::models::berry_firmness::{BerryFirmness, BerryFirmnessId};
8use crate::models::berry_flavor::{BerryFlavor, BerryFlavorId};
9use crate::models::color::{Color, ColorId};
10use crate::models::contest_effect::{ContestEffect, ContestEffectId};
11use crate::models::contest_type::{ContestType, ContestTypeId};
12use crate::models::damage_class::{DamageClass, DamageClassId};
13use crate::models::egg_group::{EggGroup, EggGroupId};
14use crate::models::encounter::{EncounterId, UnlinkedEncounter};
15use crate::models::encounter_condition::{EncounterCondition, EncounterConditionId};
16use crate::models::encounter_condition_value::{
17    EncounterConditionValueId, UnlinkedEncounterConditionValue,
18};
19use crate::models::encounter_method::{EncounterMethod, EncounterMethodId};
20use crate::models::evolution_trigger::{EvolutionTrigger, EvolutionTriggerId};
21use crate::models::generation::{GenerationId, UnlinkedGeneration};
22use crate::models::growth_rate::{GrowthRate, GrowthRateId};
23use crate::models::habitat::{Habitat, HabitatId};
24use crate::models::item::{ItemId, UnlinkedItem};
25use crate::models::item_category::{ItemCategoryId, UnlinkedItemCategory};
26use crate::models::item_flag::{ItemFlag, ItemFlagId};
27use crate::models::item_fling_effect::{ItemFlingEffect, ItemFlingEffectId};
28use crate::models::item_pocket::{ItemPocket, ItemPocketId};
29use crate::models::location::{LocationId, UnlinkedLocation};
30use crate::models::location_area::{LocationAreaId, UnlinkedLocationArea};
31use crate::models::pokedex::{PokedexId, UnlinkedPokedex};
32use crate::models::pokemon::{PokemonId, UnlinkedPokemon};
33use crate::models::pokemon_form::{PokemonFormId, UnlinkedPokemonForm};
34use crate::models::pokemon_move::{PokemonMoveId, UnlinkedPokemonMove};
35use crate::models::pokemon_move_ailment::{PokemonMoveAilment, PokemonMoveAilmentId};
36use crate::models::pokemon_move_category::{PokemonMoveCategory, PokemonMoveCategoryId};
37use crate::models::pokemon_move_effect::{PokemonMoveEffect, PokemonMoveEffectId};
38use crate::models::pokemon_move_flag::{PokemonMoveFlag, PokemonMoveFlagId};
39use crate::models::pokemon_move_method::{PokemonMoveMethod, PokemonMoveMethodId};
40use crate::models::pokemon_move_target::{PokemonMoveTarget, PokemonMoveTargetId};
41use crate::models::pokemon_type::{PokemonTypeId, UnlinkedPokemonType};
42use crate::models::pokemon_type_efficacies::{
43    PokemonTypeEfficacies, PokemonTypeEfficaciesByGeneration,
44};
45use crate::models::region::{Region, RegionId};
46use crate::models::shape::{Shape, ShapeId};
47use crate::models::species::{SpeciesId, UnlinkedSpecies};
48use crate::models::super_contest_effect::{SuperContestEffect, SuperContestEffectId};
49use crate::models::version::{UnlinkedVersion, VersionId};
50use crate::models::version_group::{UnlinkedVersionGroup, VersionGroupId};
51use crate::traits::into_arc_map::IntoArcMap;
52use serde::{Deserialize, Serialize};
53use std::collections::HashMap;
54use std::path::Path;
55
56#[derive(Debug, Default, Serialize, Deserialize)]
57pub struct UnlinkedPokeData {
58    pub abilities: HashMap<AbilityId, UnlinkedAbility>,
59    pub berries: HashMap<BerryId, UnlinkedBerry>,
60    pub berry_firmnesses: HashMap<BerryFirmnessId, BerryFirmness>,
61    pub berry_flavors: HashMap<BerryFlavorId, BerryFlavor>,
62    pub colors: HashMap<ColorId, Color>,
63    pub contest_effects: HashMap<ContestEffectId, ContestEffect>,
64    pub contest_types: HashMap<ContestTypeId, ContestType>,
65    pub damage_classes: HashMap<DamageClassId, DamageClass>,
66    pub encounters: HashMap<EncounterId, UnlinkedEncounter>,
67    pub encounter_conditions: HashMap<EncounterConditionId, EncounterCondition>,
68    pub encounter_condition_values:
69        HashMap<EncounterConditionValueId, UnlinkedEncounterConditionValue>,
70    pub encounter_methods: HashMap<EncounterMethodId, EncounterMethod>,
71    pub egg_groups: HashMap<EggGroupId, EggGroup>,
72    pub evolution_triggers: HashMap<EvolutionTriggerId, EvolutionTrigger>,
73    pub generations: HashMap<GenerationId, UnlinkedGeneration>,
74    pub growth_rates: HashMap<GrowthRateId, GrowthRate>,
75    pub habitats: HashMap<HabitatId, Habitat>,
76    pub items: HashMap<ItemId, UnlinkedItem>,
77    pub item_categories: HashMap<ItemCategoryId, UnlinkedItemCategory>,
78    pub item_flags: HashMap<ItemFlagId, ItemFlag>,
79    pub item_fling_effects: HashMap<ItemFlingEffectId, ItemFlingEffect>,
80    pub item_pockets: HashMap<ItemPocketId, ItemPocket>,
81    pub locations: HashMap<LocationId, UnlinkedLocation>,
82    pub location_areas: HashMap<LocationAreaId, UnlinkedLocationArea>,
83    pub moves: HashMap<PokemonMoveId, UnlinkedPokemonMove>,
84    pub move_ailments: HashMap<PokemonMoveAilmentId, PokemonMoveAilment>,
85    pub move_categories: HashMap<PokemonMoveCategoryId, PokemonMoveCategory>,
86    pub move_effects: HashMap<PokemonMoveEffectId, PokemonMoveEffect>,
87    pub move_flags: HashMap<PokemonMoveFlagId, PokemonMoveFlag>,
88    pub move_methods: HashMap<PokemonMoveMethodId, PokemonMoveMethod>,
89    pub move_targets: HashMap<PokemonMoveTargetId, PokemonMoveTarget>,
90    pub pokedexes: HashMap<PokedexId, UnlinkedPokedex>,
91    pub pokemon: HashMap<PokemonId, UnlinkedPokemon>,
92    pub pokemon_forms: HashMap<PokemonFormId, UnlinkedPokemonForm>,
93    pub pokemon_types: HashMap<PokemonTypeId, UnlinkedPokemonType>,
94    pub pokemon_type_efficacies: PokemonTypeEfficacies,
95    pub pokemon_type_efficacies_past: PokemonTypeEfficaciesByGeneration,
96    pub regions: HashMap<RegionId, Region>,
97    pub shapes: HashMap<ShapeId, Shape>,
98    pub species: HashMap<SpeciesId, UnlinkedSpecies>,
99    pub super_contest_effects: HashMap<SuperContestEffectId, SuperContestEffect>,
100    pub versions: HashMap<VersionId, UnlinkedVersion>,
101    pub version_groups: HashMap<VersionGroupId, UnlinkedVersionGroup>,
102}
103
104impl UnlinkedPokeData {
105    pub fn load(compressed_data_path: &Path) -> Result<Self, Box<dyn std::error::Error>> {
106        let data = std::fs::read(compressed_data_path)?;
107        let decompressed_data = zstd::decode_all(data.as_slice())?;
108        Ok(bincode::deserialize(&decompressed_data)?)
109    }
110
111    pub fn from_bytes(data: &[u8]) -> Result<Self, Box<dyn std::error::Error>> {
112        Ok(bincode::deserialize(data)?)
113    }
114
115    pub fn initialize(&self) -> PokeData {
116        let mut context = LinkContext::default();
117        context.berry_firmnesses = self.berry_firmnesses.clone().into_arc_map();
118        context.berry_flavors = self.berry_flavors.clone().into_arc_map();
119        context.colors = self.colors.clone().into_arc_map();
120        context.contest_effects = self.contest_effects.clone().into_arc_map();
121        context.contest_types = self.contest_types.clone().into_arc_map();
122        context.damage_classes = self.damage_classes.clone().into_arc_map();
123        context.encounter_conditions = self.encounter_conditions.clone().into_arc_map();
124        context.encounter_methods = self.encounter_methods.clone().into_arc_map();
125        context.egg_groups = self.egg_groups.clone().into_arc_map();
126        context.evolution_triggers = self.evolution_triggers.clone().into_arc_map();
127        context.growth_rates = self.growth_rates.clone().into_arc_map();
128        context.habitats = self.habitats.clone().into_arc_map();
129        context.item_flags = self.item_flags.clone().into_arc_map();
130        context.item_fling_effects = self.item_fling_effects.clone().into_arc_map();
131        context.item_pockets = self.item_pockets.clone().into_arc_map();
132        context.move_ailments = self.move_ailments.clone().into_arc_map();
133        context.move_categories = self.move_categories.clone().into_arc_map();
134        context.move_effects = self.move_effects.clone().into_arc_map();
135        context.move_flags = self.move_flags.clone().into_arc_map();
136        context.move_methods = self.move_methods.clone().into_arc_map();
137        context.move_targets = self.move_targets.clone().into_arc_map();
138        context.regions = self.regions.clone().into_arc_map();
139        context.shapes = self.shapes.clone().into_arc_map();
140        context.super_contest_effects = self.super_contest_effects.clone().into_arc_map();
141        context.pokemon_type_efficacies =
142            PokemonTypeEfficaciesCollection::build_from_unlinked(self);
143
144        context.item_categories = self.item_categories.link(&context);
145        context.items = self.items.link(&context);
146
147        context.berries = self.berries.link(&context);
148
149        context.generations = self.generations.link(&context);
150
151        context.version_groups = self.version_groups.link(&context);
152        context.versions = self.versions.link(&context);
153
154        context.pokemon_forms = self.pokemon_forms.link(&context);
155
156        context.moves = self.moves.link(&context);
157
158        context.encounter_condition_values = self.encounter_condition_values.link(&context);
159
160        context.encounters = self.encounters.link(&context);
161
162        context.locations = self.locations.link(&context);
163        context.location_areas = self.location_areas.link(&context);
164
165        context.abilities = self.abilities.link(&context);
166        context.pokemon_types = self.pokemon_types.link(&context);
167
168        context.species = self.species.link(&context);
169
170        context.pokemon = self.pokemon.link(&context);
171
172        context.pokedexes = self.pokedexes.link(&context);
173
174        context.build_data()
175    }
176}