sc2_techtree/
ability.rs

1use noisy_float::prelude::*;
2use serde::{Deserialize, Serialize};
3
4use crate::cost::Cost;
5use crate::ids::*;
6
7/// Ability
8#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
9pub struct Ability {
10    /// Id
11    pub id: AbilityId,
12    /// Name
13    pub name: String,
14    /// Target type and data
15    pub target: AbilityTarget,
16    /// Cast range
17    pub cast_range: Option<R32>,
18    /// Energy cost
19    pub energy_cost: Option<u32>,
20    /// Monetary / time cost
21    pub cost: Cost,
22    /// Effects
23    pub effect: Vec<()>, // TODO
24    /// Buffs
25    pub buff: Vec<()>, // TODO
26    /// Cooldown
27    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    /// Self-mutating morphs
38    Morph(AbilityUnit),
39    /// Self-mutating morphs locking to specific position
40    MorphPlace(AbilityUnit),
41    /// Unit training
42    Train(AbilityUnit),
43    /// Protoss warp-ins
44    TrainPlace(AbilityUnit),
45    /// Normal structures
46    Build(AbilityUnit),
47    /// Vespene gaysers
48    BuildOnUnit(AbilityUnit),
49    /// Add-ons
50    BuildInstant(AbilityUnit),
51    /// Research
52    Research(AbilityResearch),
53}
54
55#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
56pub struct AbilityUnit {
57    produces: UnitTypeId,
58    /// Zerglings are created in pairs, false for everything else
59    #[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}