1use noisy_float::prelude::*;
2use serde::{Deserialize, Serialize};
3
4use crate::cost::Cost;
5use crate::ids::*;
6
7#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
9pub struct Ability {
10 pub id: AbilityId,
12 pub name: String,
14 pub target: AbilityTarget,
16 pub cast_range: Option<R32>,
18 pub energy_cost: Option<u32>,
20 pub cost: Cost,
22 pub effect: Vec<()>, pub buff: Vec<()>, pub cooldown: Option<R32>,
28}
29
30#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
31pub enum AbilityTarget {
32 None,
33 Point,
34 Unit,
35 PointOrUnit,
36 PointOrNone,
37 Morph(AbilityUnit),
39 MorphPlace(AbilityUnit),
41 Train(AbilityUnit),
43 TrainPlace(AbilityUnit),
45 Build(AbilityUnit),
47 BuildOnUnit(AbilityUnit),
49 BuildInstant(AbilityUnit),
51 Research(AbilityResearch),
53}
54
55#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
56pub struct AbilityUnit {
57 produces: UnitTypeId,
58 #[serde(default)]
60 double: bool,
61 #[serde(default)]
62 cost: Cost,
63}
64
65#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
66pub struct AbilityResearch {
67 pub upgrade: UpgradeId,
68}