From 18edc1092bd68955e34b7fd6161e0a186975ffb5 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 2 Mar 2021 17:19:38 -0500 Subject: [PATCH] Basic beam now generates combo. Healing beam now consumes combo, and requires combo to heal. --- .../common/abilities/sceptre/healingbeam.ron | 2 +- .../abilities/sceptre/lifestealbeam.ron | 2 +- .../common/abilities/staff/flamethrower.ron | 2 +- .../abilities/staffsimple/flamethrower.ron | 2 +- .../unique/quadlowbeam/healingbeam.ron | 2 +- .../unique/quadlowbreathe/flamethrower.ron | 2 +- .../abilities/unique/turret/flamethrower.ron | 2 +- common/src/combat.rs | 30 ++++++++++++++++--- common/src/states/basic_beam.rs | 3 +- common/src/states/healing_beam.rs | 5 ++-- common/sys/src/beam.rs | 6 ++-- common/sys/src/melee.rs | 7 ++++- common/sys/src/projectile.rs | 6 ++-- common/sys/src/shockwave.rs | 6 ++-- server/src/events/entity_manipulation.rs | 2 ++ 15 files changed, 57 insertions(+), 22 deletions(-) diff --git a/assets/common/abilities/sceptre/healingbeam.ron b/assets/common/abilities/sceptre/healingbeam.ron index 44f321e1c4..930ad025d4 100644 --- a/assets/common/abilities/sceptre/healingbeam.ron +++ b/assets/common/abilities/sceptre/healingbeam.ron @@ -2,7 +2,7 @@ HealingBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 1.0, - heal: 80, + heal: 40, tick_rate: 2.0, range: 25.0, max_angle: 1.0, diff --git a/assets/common/abilities/sceptre/lifestealbeam.ron b/assets/common/abilities/sceptre/lifestealbeam.ron index e010e5a77e..7fcdc5932f 100644 --- a/assets/common/abilities/sceptre/lifestealbeam.ron +++ b/assets/common/abilities/sceptre/lifestealbeam.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 1.0, - damage: 80, + damage: 40, tick_rate: 2.0, range: 25.0, max_angle: 1.0, diff --git a/assets/common/abilities/staff/flamethrower.ron b/assets/common/abilities/staff/flamethrower.ron index 3a0849658e..968285b222 100644 --- a/assets/common/abilities/staff/flamethrower.ron +++ b/assets/common/abilities/staff/flamethrower.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 1.0, - damage: 150, + damage: 50, tick_rate: 3.0, range: 20.0, max_angle: 10.0, diff --git a/assets/common/abilities/staffsimple/flamethrower.ron b/assets/common/abilities/staffsimple/flamethrower.ron index 8932d5c031..e87a65dca1 100644 --- a/assets/common/abilities/staffsimple/flamethrower.ron +++ b/assets/common/abilities/staffsimple/flamethrower.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.5, recover_duration: 0.5, beam_duration: 1.0, - damage: 150, + damage: 50, tick_rate: 3.0, range: 20.0, max_angle: 0.1, diff --git a/assets/common/abilities/unique/quadlowbeam/healingbeam.ron b/assets/common/abilities/unique/quadlowbeam/healingbeam.ron index 0c1b67dd20..089c906bc8 100644 --- a/assets/common/abilities/unique/quadlowbeam/healingbeam.ron +++ b/assets/common/abilities/unique/quadlowbeam/healingbeam.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 1.0, - damage: 60, + damage: 30, //base_hps: 60, Don't merge until this comment is removed tick_rate: 2.0, range: 25.0, diff --git a/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron b/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron index 8a9be0de54..2b8313cfea 100644 --- a/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron +++ b/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.4, recover_duration: 0.25, beam_duration: 0.5, - damage: 150, + damage: 50, tick_rate: 3.0, range: 15.0, max_angle: 22.5, diff --git a/assets/common/abilities/unique/turret/flamethrower.ron b/assets/common/abilities/unique/turret/flamethrower.ron index e734cb12be..b06e2cf39e 100644 --- a/assets/common/abilities/unique/turret/flamethrower.ron +++ b/assets/common/abilities/unique/turret/flamethrower.ron @@ -2,7 +2,7 @@ BasicBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 0.5, - damage: 9001, + damage: 3000, tick_rate: 3.0, range: 30.0, max_angle: 1.0, diff --git a/common/src/combat.rs b/common/src/combat.rs index 474fc06e8c..023b77770f 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -13,8 +13,8 @@ use crate::{ }, poise::PoiseChange, skills::{SkillGroupKind, SkillSet}, - Body, Energy, EnergyChange, EnergySource, Health, HealthChange, HealthSource, Inventory, - Stats, + Body, Combo, Energy, EnergyChange, EnergySource, Health, HealthChange, HealthSource, + Inventory, Stats, }, event::ServerEvent, uid::Uid, @@ -45,6 +45,7 @@ pub struct AttackerInfo<'a> { pub entity: EcsEntity, pub uid: Uid, pub energy: Option<&'a Energy>, + pub combo: Option<&'a Combo>, } #[cfg(not(target_arch = "wasm32"))] @@ -229,7 +230,7 @@ impl Attack { { if match &effect.requirement { Some(CombatRequirement::AnyDamage) => accumulated_damage > 0.0, - Some(CombatRequirement::SufficientEnergy(r)) => { + Some(CombatRequirement::Energy(r)) => { if let Some(AttackerInfo { entity, energy: Some(e), @@ -252,6 +253,26 @@ impl Attack { false } }, + Some(CombatRequirement::Combo(r)) => { + if let Some(AttackerInfo { + entity, + combo: Some(c), + .. + }) = attacker + { + let sufficient_combo = c.counter() >= *r; + if sufficient_combo { + emit(ServerEvent::ComboChange { + entity, + change: -(*r as i32), + }); + } + + sufficient_combo + } else { + false + } + }, None => true, } { match effect.effect { @@ -405,7 +426,8 @@ pub enum CombatEffect { #[derive(Clone, Debug, Serialize, Deserialize)] pub enum CombatRequirement { AnyDamage, - SufficientEnergy(f32), + Energy(f32), + Combo(u32), } #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] diff --git a/common/src/states/basic_beam.rs b/common/src/states/basic_beam.rs index c04fe495cf..c39182ef59 100644 --- a/common/src/states/basic_beam.rs +++ b/common/src/states/basic_beam.rs @@ -132,7 +132,8 @@ impl CharacterBehavior for Data { let attack = Attack::default() .with_damage(damage) .with_crit(crit_chance, crit_mult) - .with_effect(energy); + .with_effect(energy) + .with_combo_increment(); let properties = beam::Properties { attack, diff --git a/common/src/states/healing_beam.rs b/common/src/states/healing_beam.rs index 24ec6c3322..94b2163fff 100644 --- a/common/src/states/healing_beam.rs +++ b/common/src/states/healing_beam.rs @@ -96,9 +96,8 @@ impl CharacterBehavior for Data { Some(GroupTarget::InGroup), CombatEffect::Heal(self.static_data.heal), ) - .with_requirement(CombatRequirement::SufficientEnergy( - self.static_data.energy_cost, - )); + .with_requirement(CombatRequirement::Energy(self.static_data.energy_cost)) + .with_requirement(CombatRequirement::Combo(1)); let attack = Attack::default().with_effect(heal); let properties = beam::Properties { diff --git a/common/sys/src/beam.rs b/common/sys/src/beam.rs index ff008a05cd..82766f28ad 100644 --- a/common/sys/src/beam.rs +++ b/common/sys/src/beam.rs @@ -1,8 +1,8 @@ use common::{ combat::{AttackerInfo, TargetInfo}, comp::{ - Beam, BeamSegment, Body, Energy, Group, Health, HealthSource, Inventory, Last, Ori, Pos, - Scale, Stats, + Beam, BeamSegment, Body, Combo, Energy, Group, Health, HealthSource, Inventory, Last, Ori, + Pos, Scale, Stats, }, event::{EventBus, ServerEvent}, resources::{DeltaTime, Time}, @@ -35,6 +35,7 @@ pub struct ReadData<'a> { groups: ReadStorage<'a, Group>, energies: ReadStorage<'a, Energy>, stats: ReadStorage<'a, Stats>, + combos: ReadStorage<'a, Combo>, } /// This system is responsible for handling beams that heal or do damage @@ -162,6 +163,7 @@ impl<'a> System<'a> for Sys { entity, uid, energy: read_data.energies.get(entity), + combo: read_data.combos.get(entity), }); let target_info = TargetInfo { diff --git a/common/sys/src/melee.rs b/common/sys/src/melee.rs index 5890bf5b68..49222486b8 100644 --- a/common/sys/src/melee.rs +++ b/common/sys/src/melee.rs @@ -1,6 +1,9 @@ use common::{ combat::{AttackerInfo, TargetInfo}, - comp::{Body, CharacterState, Energy, Group, Health, Inventory, Melee, Ori, Pos, Scale, Stats}, + comp::{ + Body, CharacterState, Combo, Energy, Group, Health, Inventory, Melee, Ori, Pos, Scale, + Stats, + }, event::{EventBus, ServerEvent}, uid::Uid, util::Dir, @@ -27,6 +30,7 @@ pub struct ReadData<'a> { char_states: ReadStorage<'a, CharacterState>, server_bus: Read<'a, EventBus>, stats: ReadStorage<'a, Stats>, + combos: ReadStorage<'a, Combo>, } /// This system is responsible for handling accepted inputs like moving or @@ -113,6 +117,7 @@ impl<'a> System<'a> for Sys { entity: attacker, uid: *uid, energy: read_data.energies.get(attacker), + combo: read_data.combos.get(attacker), }); let target_info = TargetInfo { diff --git a/common/sys/src/projectile.rs b/common/sys/src/projectile.rs index 0255a884ea..124af72606 100644 --- a/common/sys/src/projectile.rs +++ b/common/sys/src/projectile.rs @@ -1,8 +1,8 @@ use common::{ combat::{AttackerInfo, TargetInfo}, comp::{ - projectile, Energy, Group, HealthSource, Inventory, Ori, PhysicsState, Pos, Projectile, - Stats, Vel, + projectile, Combo, Energy, Group, HealthSource, Inventory, Ori, PhysicsState, Pos, + Projectile, Stats, Vel, }, event::{EventBus, ServerEvent}, resources::DeltaTime, @@ -30,6 +30,7 @@ pub struct ReadData<'a> { groups: ReadStorage<'a, Group>, energies: ReadStorage<'a, Energy>, stats: ReadStorage<'a, Stats>, + combos: ReadStorage<'a, Combo>, } /// This system is responsible for handling projectile effect triggers @@ -110,6 +111,7 @@ impl<'a> System<'a> for Sys { entity, uid, energy: read_data.energies.get(entity), + combo: read_data.combos.get(entity), } }); diff --git a/common/sys/src/shockwave.rs b/common/sys/src/shockwave.rs index d5b1c9846c..e89eee5efe 100644 --- a/common/sys/src/shockwave.rs +++ b/common/sys/src/shockwave.rs @@ -1,8 +1,8 @@ use common::{ combat::{AttackerInfo, TargetInfo}, comp::{ - Body, Energy, Group, Health, HealthSource, Inventory, Last, Ori, PhysicsState, Pos, Scale, - Shockwave, ShockwaveHitEntities, Stats, + Body, Combo, Energy, Group, Health, HealthSource, Inventory, Last, Ori, PhysicsState, Pos, + Scale, Shockwave, ShockwaveHitEntities, Stats, }, event::{EventBus, ServerEvent}, resources::{DeltaTime, Time}, @@ -36,6 +36,7 @@ pub struct ReadData<'a> { physics_states: ReadStorage<'a, PhysicsState>, energies: ReadStorage<'a, Energy>, stats: ReadStorage<'a, Stats>, + combos: ReadStorage<'a, Combo>, } /// This system is responsible for handling accepted inputs like moving or @@ -184,6 +185,7 @@ impl<'a> System<'a> for Sys { entity, uid, energy: read_data.energies.get(entity), + combo: read_data.combos.get(entity), }); let target_info = TargetInfo { diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 2a42c497ab..32d6e564af 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -676,6 +676,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3, explosion: Explosion, o }, RadiusEffect::Attack(attack) => { let energies = &ecs.read_storage::(); + let combos = &ecs.read_storage::(); for (entity_b, pos_b, _health_b, inventory_b_maybe, stats_b_maybe) in ( &ecs.entities(), &ecs.read_storage::(), @@ -715,6 +716,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3, explosion: Explosion, o entity, uid, energy: energies.get(entity), + combo: combos.get(entity), }); let target_info = combat::TargetInfo {