1pub 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#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
21pub struct ID(u32);
22
23impl ID {
24 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 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}