use alloc::string::String;
use hashbrown::HashSet;
use serde::{
Deserialize,
Serialize,
};
use crate::{
HitEffect,
ItemFlag,
ItemInput,
ItemTarget,
Type,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FlingData {
pub power: u32,
#[serde(default)]
pub use_item: bool,
pub hit_effect: Option<HitEffect>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NaturalGiftData {
pub power: u32,
#[serde(rename = "type")]
pub typ: Type,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct JudgmentData {
#[serde(rename = "type")]
pub typ: Type,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TechnoBlastData {
#[serde(rename = "type")]
pub typ: Type,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MultiAttackData {
#[serde(rename = "type")]
pub typ: Type,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MegaEvolutionData {
pub from: String,
pub into: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ZCrystalSource {
#[serde(rename = "from")]
Move(String),
#[serde(rename = "type")]
Type(Type),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UltraBurstData {
pub from: HashSet<String>,
pub into: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ZCrystalData {
#[serde(flatten)]
pub source: Option<ZCrystalSource>,
pub into: String,
#[serde(default)]
pub users: HashSet<String>,
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Serialize, Deserialize)]
pub struct SpecialItemData {
pub mega_evolution: Option<MegaEvolutionData>,
pub z_crystal: Option<ZCrystalData>,
pub ultra_burst: Option<UltraBurstData>,
pub fling: Option<FlingData>,
pub natural_gift: Option<NaturalGiftData>,
pub judgment: Option<JudgmentData>,
pub techno_blast: Option<TechnoBlastData>,
pub multi_attack: Option<MultiAttackData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ItemData {
pub name: String,
pub target: Option<ItemTarget>,
pub input: Option<ItemInput>,
#[serde(default)]
pub special_data: SpecialItemData,
pub force_forme: Option<String>,
pub flags: HashSet<ItemFlag>,
#[serde(default)]
pub effect: serde_json::Value,
#[serde(default)]
pub condition: serde_json::Value,
}