use crate::shared::ability::*; use crate::shared::stats::*; use crate::shared::*; use bevy::utils::*; use std::str::FromStr; #[derive(Component, Message, Clone, Copy, Serialize, Deserialize, PartialEq, Debug)] pub enum Champion { Meele, Ranged, } impl Default for Champion { fn default() -> Champion { Champion::Meele } } impl FromStr for Champion { type Err = String; fn from_str(s: &str) -> Result { match s { "ranged" => Ok(Champion::Ranged), "meele" => Ok(Champion::Meele), _ => Err(format!("unknown champion: {}", s)), } } } impl Champion { pub fn base_stats(self) -> BaseStats { match self { Champion::Meele => BaseStats(Stats { attack_range: 25., attack_speed: 0.75, max_health: 150., movement_speed: 75., }), Champion::Ranged => BaseStats(Stats { attack_range: 60., attack_speed: 1.5, max_health: 100., movement_speed: 85., }), } } pub fn ability(self, ability_slot: AbilitySlot) -> Ability { match self { Champion::Meele => match ability_slot { AbilitySlot::Q => Ability::Activated(ActivatedAbility::Shield(Shield { blocked_damage: 35., duration: 2., })), AbilitySlot::W => Ability::Directional(DirectionalAbility::Dash(Dash { max_distance: 60., damage: 15., })), AbilitySlot::E => Ability::Directional(DirectionalAbility::Pull(Pull { max_distance: 60., damage: 10., })), AbilitySlot::R => { Ability::Targeted(TargetedAbility::MeeleAttack(MeeleAttack { damage: 45. })) } AbilitySlot::G => { Ability::Activated(ActivatedAbility::Speed(Speed { duration: 2.5 })) } _ => Ability::Targeted(TargetedAbility::MeeleAttack(MeeleAttack { damage: 5. })), }, Champion::Ranged => match ability_slot { AbilitySlot::E => Ability::Directional(DirectionalAbility::Spear(Spear { max_distance: 250., damage: 25., })), AbilitySlot::R => { Ability::Activated(ActivatedAbility::Focus(Focus { duration: 5. })) } AbilitySlot::G => { Ability::Activated(ActivatedAbility::Speed(Speed { duration: 2.5 })) } _ => Ability::Targeted(TargetedAbility::RangedAttack(RangedAttack { damage: 8. })), }, } } pub fn base_cooldown(self) -> BaseCooldown { match self { Champion::Meele => { BaseCooldown([0., 5., 5., 10., 25., 50., 50.].map(Duration::from_secs_f32)) } Champion::Ranged => { BaseCooldown([0., 10., 10., 15., 35., 50., 50.].map(Duration::from_secs_f32)) } } } }