//! Various interactions with the blast zones use bevy::prelude::*; use crate::{fighter::{FighterPendingRespawn, FighterTranslation, state::FighterState}, match_loading::MatchConfig, stage::manifest::{StageManifest, StageManifestRegistry}}; pub fn apply_blast_zones( stage_registry: Res, stage_manifests: Res>, match_config: Res, fighters: Query<(&FighterTranslation, &mut FighterPendingRespawn, &FighterState)> ) { let Some(stage_manifest_handle) = stage_registry.get(match_config.stage) else { return; }; let Some(stage_manifest) = stage_manifests.get(&stage_manifest_handle) else { return; }; for (translation, mut pending_respawn, state) in fighters { let is_off_the_left = translation.x < stage_manifest.blast_zone_top_left.x; let is_off_the_right = translation.x > stage_manifest.blast_zone_bottom_right.x; let is_off_the_top = translation.y > stage_manifest.blast_zone_top_left.y; let is_off_the_bottom = translation.y < stage_manifest.blast_zone_bottom_right.y; if is_off_the_left || is_off_the_bottom || is_off_the_right { pending_respawn.0 = true; } else if is_off_the_top { let is_in_hitstun = matches!(state, FighterState::Hitstun(..)); if is_in_hitstun { pending_respawn.0 = true; } } } }