Implement stale move queue
This commit is contained in:
@@ -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<FighterPendingHits>,
|
||||
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::<Entity>::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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user