Implement invulnerability/intangibility and sakurai angle (#78)
CI / build-and-test (push) Successful in 1m22s
CI / production-build (push) Successful in 11m48s

Reviewed-on: #78
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #78.
This commit is contained in:
2026-10-03 10:47:00 +00:00
committed by EIREXE
parent aca3886113
commit 02d444f749
8 changed files with 170 additions and 44 deletions
+35 -4
View File
@@ -85,12 +85,12 @@ pub struct FighterHitstop {
pub remaining_frames: u32,
}
#[derive(Component, Default, Copy, Clone, Hash, PartialEq, Eq)]
#[derive(Component, Default, Copy, Clone, Hash)]
pub enum FighterInvulnerabilityState {
#[default]
Vulnerable,
Invulnerable,
Intangible
Invulnerable { frames_remaining: Option<u32> },
Intangible { frames_remaining: Option<u32> }
}
impl FighterFacingDirection {
@@ -179,7 +179,7 @@ impl Plugin for FighterPlugin {
)
.add_systems(
GgrsSchedule,
(state::state_update_system, decay_hitstop)
(state::state_update_system, decay_hitstop, decay_invulnerability)
.chain()
.in_set(GameplaySet::StateUpdate),
)
@@ -360,3 +360,34 @@ pub fn decay_hitstop(query: Query<(&mut FighterHitstop, &mut FighterHitstopShake
hitstop_shake.remaining_frames = hitstop_shake.remaining_frames.saturating_sub(1);
}
}
pub fn decay_invulnerability(query: Query<&mut FighterInvulnerabilityState>) {
for invuln_state in query {
let invuln_state = invuln_state.into_inner();
let frames_remaining = match invuln_state {
FighterInvulnerabilityState::Vulnerable => None,
FighterInvulnerabilityState::Invulnerable { frames_remaining } => {
if let Some(frames_remaining) = frames_remaining {
*frames_remaining = frames_remaining.saturating_sub(1);
Some(*frames_remaining)
} else {
None
}
},
FighterInvulnerabilityState::Intangible { frames_remaining } => {
if let Some(frames_remaining) = frames_remaining {
*frames_remaining = frames_remaining.saturating_sub(1);
Some(*frames_remaining)
} else {
None
}
},
};
if let Some(frames_remaining) = frames_remaining {
if frames_remaining == 0 {
*invuln_state = FighterInvulnerabilityState::Vulnerable;
}
}
}
}