Implement invulnerability/intangibility and sakurai angle (#78)
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:
+35
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user