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}