36 lines
1.4 KiB
Rust
36 lines
1.4 KiB
Rust
//! 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<StageManifestRegistry>,
|
|
stage_manifests: Res<Assets<StageManifest>>,
|
|
match_config: Res<MatchConfig>,
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
} |