From 7413e7fd113d737321689595161dc6e8eece578d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Thu, 29 Jul 2021 22:04:40 +0300 Subject: [PATCH] Prettify aura system --- common/systems/src/aura.rs | 96 +++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/common/systems/src/aura.rs b/common/systems/src/aura.rs index 38873a9632..96638d4067 100644 --- a/common/systems/src/aura.rs +++ b/common/systems/src/aura.rs @@ -118,28 +118,22 @@ impl<'a> System<'a> for Sys { || *target_uid == uid }; - match aura.target { - AuraTarget::GroupOf(uid) => { - if !same_group(uid) { - return; - } - }, - AuraTarget::NotGroupOf(uid) => { - if same_group(uid) { - return; - } - }, - AuraTarget::All => {}, - } + let is_target = match aura.target { + AuraTarget::GroupOf(uid) => same_group(uid), + AuraTarget::NotGroupOf(uid) => !same_group(uid), + AuraTarget::All => true, + }; - activate_aura( - aura, - target, - health, - &mut target_buffs, - &read_data, - &mut server_emitter, - ); + if is_target { + activate_aura( + aura, + target, + health, + &mut target_buffs, + &read_data, + &mut server_emitter, + ); + } } }); } @@ -165,39 +159,39 @@ fn activate_aura( read_data: &ReadData, server_emitter: &mut Emitter, ) { - let should_activate = |aura: &Aura| { - match aura.aura_kind { - AuraKind::Buff { kind, source, .. } => { + let should_activate = match aura.aura_kind { + AuraKind::Buff { kind, source, .. } => { + let conditions_held = match kind { + BuffKind::CampfireHeal => { + let target_state = read_data.char_states.get(target); + matches!(target_state, Some(CharacterState::Sit)) + && health.current() < health.maximum() + }, + // Add other specific buff conditions here + _ => true, + }; + let avoid_harm = || { let owner = match source { BuffSource::Character { by } => { read_data.uid_allocator.retrieve_entity_internal(by.into()) }, _ => None, }; - let avoid_harm = owner.map_or(false, |attacker| { + owner.map_or(false, |attacker| { let attacker = read_data.players.get(attacker); let target = read_data.players.get(target); combat::avoid_harm(attacker, target) - }); - let conditions_held = match kind { - BuffKind::CampfireHeal => { - let target_state = read_data.char_states.get(target); - matches!(target_state, Some(CharacterState::Sit)) - && health.current() < health.maximum() - }, - // Add other specific buff conditions here - _ => true, - }; + }) + }; - if conditions_held { - if kind.is_buff() { true } else { !avoid_harm } - } else { - false - } - }, - } + conditions_held && (kind.is_buff() || !avoid_harm()) + }, }; + if !should_activate { + return; + } + // TODO: When more aura kinds (besides Buff) are // implemented, match on them here match aura.aura_kind { @@ -207,14 +201,11 @@ fn activate_aura( category, source, } => { - if !should_activate(aura) { - return; - } - // Checks that target is not already receiving a buff from - // an aura, where - // the buff is of the same kind, and is of at least - // the same strength and of at least the same duration - // If no such buff is present, adds the buff + // Checks that target is not already receiving a buff + // from an aura, where the buff is of the same kind, + // and is of at least the same strength + // and of at least the same duration. + // If no such buff is present, adds the buff. let emit_buff = !target_buffs.buffs.iter().any(|(_, buff)| { buff.cat_ids .iter() @@ -237,9 +228,8 @@ fn activate_aura( }); } // Finds all buffs on target that are from an aura, are of - // the - // same buff kind, and are of at most the same strength - // For any such buffs, marks it as recently applied + // the same buff kind, and are of at most the same strength. + // For any such buffs, marks it as recently applied. for (_, buff) in target_buffs.buffs.iter_mut().filter(|(_, buff)| { buff.cat_ids .iter()