Implement damage UI, damage and stale moves. #45

Merged
EIREXE merged 6 commits from damage_ui into master 2026-09-19 15:40:44 +00:00
3 changed files with 24 additions and 4 deletions
Showing only changes of commit 31f400f7fb - Show all commits
+22 -4
View File
@@ -1,3 +1,5 @@
use std::collections::HashSet;
use bevy::prelude::*; use bevy::prelude::*;
use bevy_ggrs::prelude::GgrsSchedule; use bevy_ggrs::prelude::GgrsSchedule;
@@ -11,9 +13,9 @@ use crate::{
pub fn resolve_fighter_hits( pub fn resolve_fighter_hits(
mut pending_hits: ResMut<FighterPendingHits>, mut pending_hits: ResMut<FighterPendingHits>,
mut attacker: Query<( mut attacker: Query<(
&FighterStaleMoveQueue, &mut FighterStaleMoveQueue,
&FighterFacingDirection, &FighterFacingDirection,
&FighterHitboxes, &mut FighterHitboxes,
&Player, &Player,
&mut FighterHitstop, &mut FighterHitstop,
&mut FighterHitstopShake, &mut FighterHitstopShake,
@@ -26,6 +28,8 @@ pub fn resolve_fighter_hits(
let hits = std::mem::take(&mut pending_hits.0); let hits = std::mem::take(&mut pending_hits.0);
let mut hit_offset = 0; let mut hit_offset = 0;
let mut stalled_attackers = HashSet::<Entity>::new();
while hit_offset < hits.len() { while hit_offset < hits.len() {
let defender = hits[hit_offset].defender; let defender = hits[hit_offset].defender;
let next_defender = hits[hit_offset..] let next_defender = hits[hit_offset..]
@@ -42,7 +46,7 @@ pub fn resolve_fighter_hits(
let damage_data = hits[hit_offset..next_defender] let damage_data = hits[hit_offset..next_defender]
.iter() .iter()
.filter_map(|hit| { .filter_map(|hit| {
let Ok((stale_move_queue, facing_dir, _hitboxes, player, _, _)) = let Ok((stale_move_queue, facing_dir, _, player, _, _)) =
attacker.get(hit.attacker) attacker.get(hit.attacker)
else { else {
return None; return None;
@@ -91,6 +95,8 @@ pub fn resolve_fighter_hits(
angle angle
}; };
// Attacker hitstop and data
stalled_attackers.insert(attacker_entity);
let hitstop = HitStop::calculate(FighterDamage(attack_damage), false); let hitstop = HitStop::calculate(FighterDamage(attack_damage), false);
reactions.push(( reactions.push((
attacker_entity, attacker_entity,
@@ -109,7 +115,7 @@ pub fn resolve_fighter_hits(
receiver_damage.0 += total_damage_received_this_frame; receiver_damage.0 += total_damage_received_this_frame;
for (attacker_entity, _, reaction) in &reactions { 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; continue;
}; };
@@ -136,6 +142,18 @@ pub fn resolve_fighter_hits(
hit_offset = next_defender; 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(()) Ok(())
} }
+1
View File
@@ -259,6 +259,7 @@ pub struct FighterActiveAttack {
pub active_hitboxes: Vec<usize>, pub active_hitboxes: Vec<usize>,
pub solved_hitboxes: Vec<attack::FighterSolvedHitbox>, pub solved_hitboxes: Vec<attack::FighterSolvedHitbox>,
pub hit_fighters: Vec<Entity>, pub hit_fighters: Vec<Entity>,
pub stalled: bool
} }
#[derive(Component, Clone, Debug, Default, Hash)] #[derive(Component, Clone, Debug, Default, Hash)]
+1
View File
@@ -53,6 +53,7 @@ impl FighterStateImpl for GroundAttackState {
active_hitboxes: Vec::new(), active_hitboxes: Vec::new(),
solved_hitboxes: Vec::new(), solved_hitboxes: Vec::new(),
hit_fighters: Vec::new(), hit_fighters: Vec::new(),
stalled: false
}); });
} }