use noisy_float::prelude::*;
use serde::{Deserialize, Serialize};
use crate::cost::Cost;
use crate::ids::*;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct Ability {
pub id: AbilityId,
pub name: String,
pub target: AbilityTarget,
pub cast_range: Option<R32>,
pub energy_cost: Option<u32>,
pub cost: Cost,
pub effect: Vec<()>, pub buff: Vec<()>, pub cooldown: Option<R32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum AbilityTarget {
None,
Point,
Unit,
PointOrUnit,
PointOrNone,
Morph(AbilityUnit),
MorphPlace(AbilityUnit),
Train(AbilityUnit),
TrainPlace(AbilityUnit),
Build(AbilityUnit),
BuildOnUnit(AbilityUnit),
BuildInstant(AbilityUnit),
Research(AbilityResearch),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct AbilityUnit {
produces: UnitTypeId,
#[serde(default)]
double: bool,
#[serde(default)]
cost: Cost,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct AbilityResearch {
pub upgrade: UpgradeId,
}