Implement invulnerability/intangibility and sakurai angle
CI / build-and-test (pull_request) Successful in 2m8s
CI / production-build (pull_request) Successful in 11m7s

This commit is contained in:
2026-09-29 19:36:48 +02:00
parent adf83ba03f
commit 895a8b8756
8 changed files with 175 additions and 41 deletions
+28 -8
View File
@@ -11,9 +11,27 @@ pub struct FighterAnimations {
pub baked: Handle<BakedFighterAnimations>,
}
#[derive(Clone, Copy, Default, PartialEq)]
pub enum LastKnownInvulnerabilityState {
#[default]
Vulnerable,
Intangible,
Invulnerable,
}
impl From<&FighterInvulnerabilityState> for LastKnownInvulnerabilityState {
fn from(value: &FighterInvulnerabilityState) -> Self {
match value {
FighterInvulnerabilityState::Vulnerable => Self::Vulnerable,
FighterInvulnerabilityState::Invulnerable { .. } => Self::Invulnerable,
FighterInvulnerabilityState::Intangible { .. } => Self::Intangible,
}
}
}
#[derive(Component, Clone, Default)]
pub struct FighterInvulnerabilityVisualState {
pub last_known_state: FighterInvulnerabilityState,
pub last_known_state: LastKnownInvulnerabilityState,
pub frames_in_state: u32,
}
@@ -27,8 +45,10 @@ pub fn update_status_colors(
game_settings: Res<GameSettings>,
) {
for (invuln_state, mut invuln_state_visual) in &mut fighters {
if *invuln_state != invuln_state_visual.last_known_state {
invuln_state_visual.last_known_state = *invuln_state;
let curr_state = invuln_state.into();
let last_known_state = invuln_state_visual.last_known_state;
if curr_state != last_known_state {
invuln_state_visual.last_known_state = curr_state;
invuln_state_visual.frames_in_state = 0;
}
}
@@ -38,18 +58,18 @@ pub fn update_status_colors(
.expect("Material should have relevant fighter available");
let status_color = match invuln_state_visual.last_known_state {
FighterInvulnerabilityState::Vulnerable => bevy::color::palettes::css::WHITE.into(),
FighterInvulnerabilityState::Invulnerable => {
LastKnownInvulnerabilityState::Vulnerable => bevy::color::palettes::css::WHITE.into(),
LastKnownInvulnerabilityState::Invulnerable => {
game_settings.fighter_common.intangible_color
}
FighterInvulnerabilityState::Intangible => {
LastKnownInvulnerabilityState::Intangible => {
game_settings.fighter_common.intangible_color
}
};
let intensity = match invuln_state_visual.last_known_state {
FighterInvulnerabilityState::Vulnerable => 0.0,
FighterInvulnerabilityState::Invulnerable | FighterInvulnerabilityState::Intangible => {
LastKnownInvulnerabilityState::Vulnerable => 0.0,
LastKnownInvulnerabilityState::Invulnerable | LastKnownInvulnerabilityState::Intangible => {
let cycle_frames = invuln_state_visual.frames_in_state
% game_settings.fighter_common.intangible_pulse_duration;
1.0 - cycle_frames as f32