diff --git a/src/fighter/attack/reaction.rs b/src/fighter/attack/reaction.rs index 8d9e1ad..5c5fb18 100644 --- a/src/fighter/attack/reaction.rs +++ b/src/fighter/attack/reaction.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use bevy::prelude::*; use bevy_ggrs::prelude::GgrsSchedule; @@ -11,9 +13,9 @@ use crate::{ pub fn resolve_fighter_hits( mut pending_hits: ResMut, mut attacker: Query<( - &FighterStaleMoveQueue, + &mut FighterStaleMoveQueue, &FighterFacingDirection, - &FighterHitboxes, + &mut FighterHitboxes, &Player, &mut FighterHitstop, &mut FighterHitstopShake, @@ -26,6 +28,8 @@ pub fn resolve_fighter_hits( let hits = std::mem::take(&mut pending_hits.0); let mut hit_offset = 0; + let mut stalled_attackers = HashSet::::new(); + while hit_offset < hits.len() { let defender = hits[hit_offset].defender; let next_defender = hits[hit_offset..] @@ -42,7 +46,7 @@ pub fn resolve_fighter_hits( let damage_data = hits[hit_offset..next_defender] .iter() .filter_map(|hit| { - let Ok((stale_move_queue, facing_dir, _hitboxes, player, _, _)) = + let Ok((stale_move_queue, facing_dir, _, player, _, _)) = attacker.get(hit.attacker) else { return None; @@ -91,6 +95,8 @@ pub fn resolve_fighter_hits( angle }; + // Attacker hitstop and data + stalled_attackers.insert(attacker_entity); let hitstop = HitStop::calculate(FighterDamage(attack_damage), false); reactions.push(( attacker_entity, @@ -109,7 +115,7 @@ pub fn resolve_fighter_hits( receiver_damage.0 += total_damage_received_this_frame; for (attacker_entity, _, reaction) in &reactions { - let Ok((.., mut hitstop, mut hitstop_shake)) = attacker.get_mut(*attacker_entity) else { + let Ok((.., _, mut hitstop, mut hitstop_shake)) = attacker.get_mut(*attacker_entity) else { continue; }; @@ -136,6 +142,18 @@ pub fn resolve_fighter_hits( hit_offset = next_defender; } + for hit in hits { + let Ok((mut stale_move_queue, _facing_direction, mut hitboxes, ..)) = attacker.get_mut(hit.attacker) else { + continue; + }; + + if let Some(ref mut hitbox) = hitboxes.0 { + if !hitbox.stalled { + stale_move_queue.push(hitbox.kind); + } + } + } + Ok(()) } diff --git a/src/fighter/mod.rs b/src/fighter/mod.rs index 24d1317..9eb70f5 100644 --- a/src/fighter/mod.rs +++ b/src/fighter/mod.rs @@ -259,6 +259,7 @@ pub struct FighterActiveAttack { pub active_hitboxes: Vec, pub solved_hitboxes: Vec, pub hit_fighters: Vec, + pub stalled: bool } #[derive(Component, Clone, Debug, Default, Hash)] diff --git a/src/fighter/state/ground_attack.rs b/src/fighter/state/ground_attack.rs index 3f60990..59bfee2 100644 --- a/src/fighter/state/ground_attack.rs +++ b/src/fighter/state/ground_attack.rs @@ -53,6 +53,7 @@ impl FighterStateImpl for GroundAttackState { active_hitboxes: Vec::new(), solved_hitboxes: Vec::new(), hit_fighters: Vec::new(), + stalled: false }); }