use crate::prelude::*;
pub(crate) struct TechTypeData {
pub(crate) mineral_price: i32,
pub(crate) gas_price: i32,
pub(crate) what_uses: &'static [UnitType],
pub(crate) research_time: i32,
pub(crate) energy_cost: i32,
pub(crate) weapon: WeaponType,
pub(crate) targets_unit: bool,
pub(crate) targets_position: bool,
pub(crate) order: Order,
pub(crate) what_researches: UnitType,
pub(crate) required_unit: UnitType,
pub(crate) race: Race,
pub(crate) name: &'static str,
}
pub(crate) static TECH_TYPE_DATA: [TechTypeData; 38] = [
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Terran_Marine,
UnitType::Terran_Firebat,
UnitType::Hero_Jim_Raynor_Marine,
UnitType::Hero_Gui_Montag,
],
research_time: 1200,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Terran_Academy,
required_unit: UnitType::None,
race: Race::Terran,
name: "Stim_Packs",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[
UnitType::Terran_Ghost,
UnitType::Hero_Alexei_Stukov,
UnitType::Hero_Infested_Duran,
UnitType::Hero_Samir_Duran,
UnitType::Hero_Sarah_Kerrigan,
],
research_time: 1500,
energy_cost: 100,
weapon: WeaponType::Lockdown,
targets_unit: true,
targets_position: false,
order: Order::CastLockdown,
what_researches: UnitType::Terran_Covert_Ops,
required_unit: UnitType::None,
race: Race::Terran,
name: "Lockdown",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Terran_Science_Vessel, UnitType::Hero_Magellan],
research_time: 1800,
energy_cost: 100,
weapon: WeaponType::EMP_Shockwave,
targets_unit: true,
targets_position: true,
order: Order::CastEMPShockwave,
what_researches: UnitType::Terran_Science_Facility,
required_unit: UnitType::None,
race: Race::Terran,
name: "EMP_Shockwave",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Terran_Vulture, UnitType::Hero_Jim_Raynor_Vulture],
research_time: 1200,
energy_cost: 0,
weapon: WeaponType::Spider_Mines,
targets_unit: false,
targets_position: true,
order: Order::PlaceMine,
what_researches: UnitType::Terran_Machine_Shop,
required_unit: UnitType::None,
race: Race::Terran,
name: "Spider_Mines",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Terran_Comsat_Station],
research_time: 0,
energy_cost: 50,
weapon: WeaponType::None,
targets_unit: true,
targets_position: true,
order: Order::CastScannerSweep,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Terran,
name: "Scanner_Sweep",
},
TechTypeData {
mineral_price: 150,
gas_price: 150,
what_uses: &[
UnitType::Terran_Siege_Tank_Tank_Mode,
UnitType::Terran_Siege_Tank_Siege_Mode,
UnitType::Hero_Edmund_Duke_Tank_Mode,
UnitType::Hero_Edmund_Duke_Siege_Mode,
],
research_time: 1200,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Terran_Machine_Shop,
required_unit: UnitType::None,
race: Race::Terran,
name: "Tank_Siege_Mode",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Terran_Science_Vessel, UnitType::Hero_Magellan],
research_time: 0,
energy_cost: 100,
weapon: WeaponType::None,
targets_unit: true,
targets_position: false,
order: Order::CastDefensiveMatrix,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Terran,
name: "Defensive_Matrix",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Terran_Science_Vessel, UnitType::Hero_Magellan],
research_time: 1200,
energy_cost: 75,
weapon: WeaponType::Irradiate,
targets_unit: true,
targets_position: false,
order: Order::CastIrradiate,
what_researches: UnitType::Terran_Science_Facility,
required_unit: UnitType::None,
race: Race::Terran,
name: "Irradiate",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Terran_Battlecruiser,
UnitType::Hero_Gerard_DuGalle,
UnitType::Hero_Hyperion,
UnitType::Hero_Norad_II,
],
research_time: 1800,
energy_cost: 150,
weapon: WeaponType::Yamato_Gun,
targets_unit: true,
targets_position: false,
order: Order::FireYamatoGun,
what_researches: UnitType::Terran_Physics_Lab,
required_unit: UnitType::None,
race: Race::Terran,
name: "Yamato_Gun",
},
TechTypeData {
mineral_price: 150,
gas_price: 150,
what_uses: &[UnitType::Terran_Wraith, UnitType::Hero_Tom_Kazansky],
research_time: 1500,
energy_cost: 25,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Terran_Control_Tower,
required_unit: UnitType::None,
race: Race::Terran,
name: "Cloaking_Field",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Terran_Ghost,
UnitType::Hero_Alexei_Stukov,
UnitType::Hero_Infested_Duran,
UnitType::Hero_Samir_Duran,
UnitType::Hero_Sarah_Kerrigan,
UnitType::Hero_Infested_Kerrigan,
],
research_time: 1200,
energy_cost: 25,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Terran_Covert_Ops,
required_unit: UnitType::None,
race: Race::Terran,
name: "Personnel_Cloaking",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Zerg_Zergling,
UnitType::Zerg_Hydralisk,
UnitType::Zerg_Drone,
UnitType::Zerg_Defiler,
UnitType::Zerg_Infested_Terran,
UnitType::Hero_Unclean_One,
UnitType::Hero_Hunter_Killer,
UnitType::Hero_Devouring_One,
UnitType::Zerg_Lurker,
],
research_time: 1200,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Zerg_Hatchery,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Burrowing",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Zerg_Queen, UnitType::Hero_Matriarch],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: true,
targets_position: false,
order: Order::CastInfestation,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Infestation",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Zerg_Queen, UnitType::Hero_Matriarch],
research_time: 1200,
energy_cost: 150,
weapon: WeaponType::Spawn_Broodlings,
targets_unit: true,
targets_position: false,
order: Order::CastSpawnBroodlings,
what_researches: UnitType::Zerg_Queens_Nest,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Spawn_Broodlings",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Zerg_Defiler, UnitType::Hero_Unclean_One],
research_time: 0,
energy_cost: 100,
weapon: WeaponType::Dark_Swarm,
targets_unit: true,
targets_position: true,
order: Order::CastDarkSwarm,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Dark_Swarm",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Zerg_Defiler, UnitType::Hero_Unclean_One],
research_time: 1500,
energy_cost: 150,
weapon: WeaponType::Plague,
targets_unit: true,
targets_position: true,
order: Order::CastPlague,
what_researches: UnitType::Zerg_Defiler_Mound,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Plague",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Zerg_Defiler,
UnitType::Hero_Unclean_One,
UnitType::Hero_Infested_Kerrigan,
UnitType::Hero_Infested_Duran,
],
research_time: 1500,
energy_cost: 0,
weapon: WeaponType::Consume,
targets_unit: true,
targets_position: false,
order: Order::CastConsume,
what_researches: UnitType::Zerg_Defiler_Mound,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Consume",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[
UnitType::Zerg_Queen,
UnitType::Hero_Matriarch,
UnitType::Hero_Infested_Kerrigan,
],
research_time: 1200,
energy_cost: 75,
weapon: WeaponType::Ensnare,
targets_unit: true,
targets_position: true,
order: Order::CastEnsnare,
what_researches: UnitType::Zerg_Queens_Nest,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Ensnare",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Zerg_Queen, UnitType::Hero_Matriarch],
research_time: 0,
energy_cost: 75,
weapon: WeaponType::Parasite,
targets_unit: true,
targets_position: false,
order: Order::CastParasite,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Zerg,
name: "Parasite",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[
UnitType::Protoss_High_Templar,
UnitType::Hero_Tassadar,
UnitType::Hero_Infested_Kerrigan,
],
research_time: 1800,
energy_cost: 75,
weapon: WeaponType::Psionic_Storm,
targets_unit: true,
targets_position: true,
order: Order::CastPsionicStorm,
what_researches: UnitType::Protoss_Templar_Archives,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Psionic_Storm",
},
TechTypeData {
mineral_price: 150,
gas_price: 150,
what_uses: &[UnitType::Protoss_High_Templar, UnitType::Hero_Tassadar],
research_time: 1200,
energy_cost: 100,
weapon: WeaponType::None,
targets_unit: true,
targets_position: false,
order: Order::CastHallucination,
what_researches: UnitType::Protoss_Templar_Archives,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Hallucination",
},
TechTypeData {
mineral_price: 150,
gas_price: 150,
what_uses: &[UnitType::Protoss_Arbiter, UnitType::Hero_Danimoth],
research_time: 1800,
energy_cost: 150,
weapon: WeaponType::None,
targets_unit: true,
targets_position: true,
order: Order::CastRecall,
what_researches: UnitType::Protoss_Arbiter_Tribunal,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Recall",
},
TechTypeData {
mineral_price: 150,
gas_price: 150,
what_uses: &[UnitType::Protoss_Arbiter, UnitType::Hero_Danimoth],
research_time: 1500,
energy_cost: 100,
weapon: WeaponType::Stasis_Field,
targets_unit: true,
targets_position: true,
order: Order::CastStasisField,
what_researches: UnitType::Protoss_Arbiter_Tribunal,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Stasis_Field",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Protoss_High_Templar],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: true,
targets_position: false,
order: Order::None,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Archon_Warp",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Terran_Medic],
research_time: 1200,
energy_cost: 50,
weapon: WeaponType::Restoration,
targets_unit: true,
targets_position: false,
order: Order::CastRestoration,
what_researches: UnitType::Terran_Academy,
required_unit: UnitType::None,
race: Race::Terran,
name: "Restoration",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Protoss_Corsair, UnitType::Hero_Raszagal],
research_time: 1200,
energy_cost: 125,
weapon: WeaponType::Disruption_Web,
targets_unit: true,
targets_position: true,
order: Order::CastDisruptionWeb,
what_researches: UnitType::Protoss_Fleet_Beacon,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Disruption_Web",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::None,
name: "Unused_26",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Protoss_Dark_Archon],
research_time: 1800,
energy_cost: 150,
weapon: WeaponType::Mind_Control,
targets_unit: true,
targets_position: false,
order: Order::CastMindControl,
what_researches: UnitType::Protoss_Templar_Archives,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Mind_Control",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Protoss_Dark_Templar],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: true,
targets_position: false,
order: Order::None,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Dark_Archon_Meld",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Protoss_Dark_Archon],
research_time: 1800,
energy_cost: 50,
weapon: WeaponType::Feedback,
targets_unit: true,
targets_position: false,
order: Order::CastFeedback,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Feedback",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Terran_Medic],
research_time: 1800,
energy_cost: 75,
weapon: WeaponType::Optical_Flare,
targets_unit: true,
targets_position: false,
order: Order::CastOpticalFlare,
what_researches: UnitType::Terran_Academy,
required_unit: UnitType::None,
race: Race::Terran,
name: "Optical_Flare",
},
TechTypeData {
mineral_price: 100,
gas_price: 100,
what_uses: &[UnitType::Protoss_Dark_Archon],
research_time: 1500,
energy_cost: 100,
weapon: WeaponType::Maelstrom,
targets_unit: true,
targets_position: true,
order: Order::CastMaelstrom,
what_researches: UnitType::Protoss_Templar_Archives,
required_unit: UnitType::None,
race: Race::Protoss,
name: "Maelstrom",
},
TechTypeData {
mineral_price: 200,
gas_price: 200,
what_uses: &[UnitType::Zerg_Hydralisk],
research_time: 1800,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::Zerg_Hydralisk_Den,
required_unit: UnitType::Zerg_Lair,
race: Race::Zerg,
name: "Lurker_Aspect",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::None,
name: "Unused_33",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Terran_Medic],
research_time: 0,
energy_cost: 1,
weapon: WeaponType::None,
targets_unit: true,
targets_position: true,
order: Order::MedicHeal,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Terran,
name: "Healing",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::None,
targets_unit: false,
targets_position: false,
order: Order::None,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::None,
name: "None",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[UnitType::Terran_Ghost],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::Nuclear_Strike,
targets_unit: true,
targets_position: true,
order: Order::NukePaint,
what_researches: UnitType::None,
required_unit: UnitType::None,
race: Race::Terran,
name: "Nuclear_Strike",
},
TechTypeData {
mineral_price: 0,
gas_price: 0,
what_uses: &[],
research_time: 0,
energy_cost: 0,
weapon: WeaponType::Unknown,
targets_unit: false,
targets_position: false,
order: Order::Unknown,
what_researches: UnitType::Unknown,
required_unit: UnitType::None,
race: Race::Unknown,
name: "Unknown",
},
];
impl TechType {
fn d(&self) -> &TechTypeData {
&TECH_TYPE_DATA[*self as usize]
}
pub fn mineral_price(&self) -> i32 {
self.d().mineral_price
}
pub fn gas_price(&self) -> i32 {
self.d().gas_price
}
pub fn what_uses(&self) -> &'static [UnitType] {
self.d().what_uses
}
pub fn research_time(&self) -> i32 {
self.d().research_time
}
pub fn energy_cost(&self) -> i32 {
self.d().energy_cost
}
pub fn get_weapon(&self) -> WeaponType {
self.d().weapon
}
pub fn targets_unit(&self) -> bool {
self.d().targets_unit
}
pub fn targets_position(&self) -> bool {
self.d().targets_position
}
pub fn get_order(&self) -> Order {
self.d().order
}
pub fn what_researches(&self) -> UnitType {
self.d().what_researches
}
pub fn required_unit(&self) -> UnitType {
self.d().required_unit
}
pub fn get_race(&self) -> Race {
self.d().race
}
pub fn name(&self) -> &'static str {
self.d().name
}
}