blue_archive/types/
mod.rs

1//! Contains many structures that make up the deserialized data.
2
3pub mod currency;
4pub mod enemy;
5pub mod equipment;
6pub mod raids;
7pub mod students;
8pub mod summons;
9
10pub use raids::RaidData;
11use serde::{Deserialize, Serialize};
12use serde_aux::prelude::*;
13use strum_macros::{Display, EnumString};
14pub use students::{Age, Released, Student};
15pub use summons::Summon;
16
17/// **A Blue Archive ID**.
18///
19/// Basically wraps around a [`u32`], and exists for representation of an identifier that can be filtered and have extra functionality.
20#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
21pub struct ID(u32);
22
23impl ID {
24    /// Gets the inner value stored in the **[`ID`]** struct as a **[`u32`]**.
25    pub fn to_u32(&self) -> u32 {
26        self.0
27    }
28}
29
30impl std::fmt::Display for ID {
31    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        write!(f, "{}", self.0)
33    }
34}
35
36#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
37pub enum SkillKind {
38    #[serde(alias = "weaponpassive")]
39    WeaponPassive,
40    #[serde(alias = "sub")]
41    Sub,
42    #[serde(alias = "ex")]
43    Ex,
44    #[serde(alias = "normal")]
45    Normal,
46    #[serde(alias = "autoattack")]
47    AutoAttack,
48    #[serde(alias = "passive")]
49    Passive,
50    #[serde(alias = "gearnormal")]
51    GearNormal,
52    #[serde(other)]
53    Unknown,
54}
55
56#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
57#[serde(rename_all = "PascalCase")]
58#[serde(tag = "Type")]
59pub enum Effect {
60    Accumulation {
61        #[serde(alias = "Scale")]
62        scale: ScaleValue,
63    },
64    BuffSelf {
65        #[serde(alias = "Stat")]
66        stat: String,
67        #[serde(alias = "StackSame")]
68        stack_same: Option<u8>,
69        #[serde(alias = "Value")]
70        value: Option<Vec<Vec<i32>>>,
71        #[serde(alias = "Scale")]
72        scale: Option<Vec<i32>>,
73        #[serde(alias = "Channel")]
74        channel: Option<i32>,
75        #[serde(alias = "Icon")]
76        icon: Option<String>,
77    },
78    BuffTarget {
79        #[serde(alias = "Restrictions")]
80        restrictions: Option<Vec<Restriction>>,
81        #[serde(alias = "Value")]
82        value: Vec<Vec<i32>>,
83        #[serde(alias = "Stat")]
84        stat: String,
85        #[serde(alias = "Channel")]
86        channel: i32,
87    },
88    DMGSingle {
89        #[serde(alias = "SourceStat")]
90        source_stat: Option<String>,
91        #[serde(alias = "Critical")]
92        critical: Option<i8>,
93        #[serde(alias = "CriticalCheck")]
94        critical_check: Option<CriticalCheck>,
95        #[serde(alias = "Scale")]
96        scale: ScaleValue,
97        #[serde(alias = "IgnoreDef")]
98        ignore_def: Option<Vec<i32>>,
99        #[serde(alias = "Hits")]
100        hits: Option<Vec<i32>>,
101        #[serde(alias = "Frames")]
102        frames: Option<Frames>,
103    },
104    DMGMulti {
105        #[serde(alias = "Critical")]
106        critical: Option<i8>,
107        #[serde(alias = "CriticalCheck")]
108        critical_check: Option<CriticalCheck>,
109        #[serde(alias = "SubstituteCondition")]
110        substitute_condition: Option<String>,
111        #[serde(alias = "Hits")]
112        hits: Vec<i32>,
113        #[serde(alias = "HitsParameter")]
114        hits_parameter: Option<i8>,
115        #[serde(alias = "Scale")]
116        scale: ScaleValue,
117        #[serde(alias = "SubstituteScale")]
118        substitute_scale: Option<Vec<i32>>,
119        #[serde(alias = "IgnoreDef")]
120        ignore_def: Option<Vec<i32>>,
121        #[serde(alias = "Frames")]
122        frames: Option<Frames>,
123    },
124    DMGEcho {
125        #[serde(alias = "CriticalCheck")]
126        critical_check: CriticalCheck,
127        #[serde(alias = "Scale")]
128        scale: ScaleValue,
129        #[serde(alias = "IgnoreDef")]
130        ignore_def: Option<Vec<i32>>,
131    },
132    DMGDot {
133        #[serde(
134            deserialize_with = "deserialize_number_from_string",
135            alias = "Duration"
136        )]
137        duration: u32,
138        #[serde(deserialize_with = "deserialize_number_from_string", alias = "Period")]
139        period: u32,
140        #[serde(alias = "Icon")]
141        icon: String,
142        #[serde(alias = "Scale")]
143        scale: ScaleValue,
144    },
145    DMGZone {
146        #[serde(alias = "ZoneHitInterval")]
147        zone_hit_interval: Option<i32>,
148        #[serde(alias = "ZoneDuration")]
149        zone_duration: Option<i32>,
150        #[serde(alias = "HitFrames")]
151        hit_frames: Option<Vec<u16>>,
152        #[serde(alias = "CriticalCheck")]
153        critical_check: CriticalCheck,
154        #[serde(alias = "Hits")]
155        hits: Option<Vec<i32>>,
156        #[serde(alias = "HitsParameter")]
157        hits_parameter: Option<i8>,
158        #[serde(alias = "Scale")]
159        scale: ScaleValue,
160    },
161    DMGByHit {
162        #[serde(alias = "Icon")]
163        icon: String,
164        #[serde(alias = "Scale")]
165        scale: ScaleValue,
166    },
167    DMGEchoWithScaling {
168        #[serde(alias = "CriticalCheck")]
169        critical_check: CriticalCheck,
170        #[serde(alias = "Scale")]
171        scale: ScaleValue,
172    },
173    HealDot {
174        #[serde(
175            deserialize_with = "deserialize_number_from_string",
176            alias = "Duration"
177        )]
178        duration: u32,
179        #[serde(deserialize_with = "deserialize_number_from_string", alias = "Period")]
180        period: u32,
181        #[serde(alias = "Scale")]
182        scale: ScaleValue,
183    },
184    Heal {
185        #[serde(alias = "Scale")]
186        scale: ScaleValue,
187    },
188    HealZone {
189        #[serde(alias = "HitFrames")]
190        hit_frames: Vec<i32>,
191        #[serde(alias = "Scale")]
192        scale: ScaleValue,
193    },
194    CrowdControl {
195        #[serde(deserialize_with = "deserialize_number_from_string", alias = "Chance")]
196        chance: u32,
197        #[serde(alias = "Icon")]
198        icon: String,
199        #[serde(alias = "Scale")]
200        scale: ScaleValue,
201    },
202    BuffAlly {
203        #[serde(alias = "Restrictions")]
204        restrictions: Option<Vec<Restriction>>,
205        #[serde(alias = "Value")]
206        value: Vec<Vec<i32>>,
207        #[serde(alias = "Stat")]
208        stat: String,
209        #[serde(alias = "Channel")]
210        channel: i32,
211    },
212    Shield {
213        #[serde(alias = "Scale")]
214        scale: ScaleValue,
215    },
216    FormChange {
217        #[serde(alias = "HideFormChangeIcon")]
218        hide_form_change_icon: Option<bool>,
219        #[serde(alias = "Frames")]
220        frames: Frames,
221        #[serde(alias = "Hits")]
222        hits: Vec<i32>,
223        #[serde(alias = "CriticalCheck")]
224        critical_check: Option<CriticalCheck>,
225        #[serde(alias = "Scale")]
226        scale: Option<Vec<i32>>,
227    },
228    IgnoreDelay {
229        #[serde(alias = "Scale")]
230        scale: Vec<u8>,
231    },
232    #[serde(other)]
233    Unknown,
234}
235
236#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
237#[serde(untagged)]
238pub enum ScaleValue {
239    D1(Vec<i32>),
240    D2(Vec<Vec<i32>>),
241}
242#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
243#[serde(rename_all = "PascalCase")]
244pub struct Restriction {
245    pub property: String,
246    pub operand: String,
247    /// A restriction value which can contain a **[`i32`]** or **[`String`]**.
248    pub value: RestrictValue,
249}
250
251#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
252#[serde(untagged)]
253pub enum RestrictValue {
254    String(String),
255    I32(i32),
256}
257
258#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
259#[serde(rename_all = "PascalCase")]
260pub struct Frames {
261    pub attack_enter_duration: u8,
262    pub attack_start_duration: u8,
263    pub attack_end_duration: u8,
264    pub attack_burst_round_over_delay: u8,
265    #[serde(alias = "AttackIngDuration")]
266    pub attacking_duration: u8,
267    pub attack_reload_duration: u8,
268}
269
270#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
271pub enum CriticalCheck {
272    Check,
273    Always,
274    #[serde(other)]
275    Unknown,
276}
277
278#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
279pub enum RadiusType {
280    Circle,
281    Bounce,
282    Fan,
283}
284
285#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
286#[serde(rename_all = "PascalCase")]
287pub struct Radius {
288    #[serde(alias = "Type")]
289    kind: RadiusType,
290    radius: u32,
291}
292
293#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, EnumString, Display)]
294pub enum Rarity {
295    #[strum(to_string = "Normal")]
296    N,
297    #[strum(to_string = "Rare")]
298    R,
299    #[strum(to_string = "Super Rare")]
300    SR,
301    #[strum(to_string = "Super Special Rare")]
302    SSR,
303}