From ce00af080901ab76742599bb65c21adf3ff2b0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Rom=C3=A1n=20N=C3=BA=C3=B1ez?= Date: Sat, 26 Sep 2026 18:05:10 +0000 Subject: [PATCH] Add the ability to debug draw blastzones & update blastzone formatting (#69) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.eirexe.moe/EIREXE/shinespark/pulls/69 Co-authored-by: Álex Román Núñez --- src/debug_tools.rs | 13 +++++++++++++ src/stage/debug.rs | 30 +++++++++++++++++++++++++++++- src/stage/manifest.rs | 13 +++++++------ src/stage/mod.rs | 13 +++++++++---- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/debug_tools.rs b/src/debug_tools.rs index f420345..6273bae 100644 --- a/src/debug_tools.rs +++ b/src/debug_tools.rs @@ -109,6 +109,7 @@ impl FighterDebugRowKind { enum DebugFlag { Network, Ecb, + BlastZones, StageCollision, AnimationBones, AttackHitboxes, @@ -150,6 +151,10 @@ const FIGHTER_MENU: &[DebugMenuEntry] = &[ label: "ECB", flag: DebugFlag::Ecb, }, + DebugMenuEntry::Toggle { + label: "Blast Zones", + flag: DebugFlag::BlastZones, + }, DebugMenuEntry::Toggle { label: "Animation bones", flag: DebugFlag::AnimationBones, @@ -243,6 +248,7 @@ pub struct DebugSettings { pub frame_stepping: bool, pub network: bool, pub ecb: bool, + pub blast_zones: bool, pub stage_collision: bool, pub animation_bones: bool, pub attack_hitboxes: bool, @@ -264,6 +270,7 @@ impl Default for DebugSettings { frame_stepping: false, network: false, ecb: false, + blast_zones: false, stage_collision: false, animation_bones: false, attack_hitboxes: false, @@ -328,6 +335,7 @@ impl DebugSettings { match flag { DebugFlag::Network => self.network, DebugFlag::Ecb => self.ecb, + DebugFlag::BlastZones => self.blast_zones, DebugFlag::StageCollision => self.stage_collision, DebugFlag::AnimationBones => self.animation_bones, DebugFlag::AttackHitboxes => self.attack_hitboxes, @@ -342,6 +350,7 @@ impl DebugSettings { match flag { DebugFlag::Network => self.network = !self.network, DebugFlag::Ecb => self.ecb = !self.ecb, + DebugFlag::BlastZones => self.blast_zones = !self.blast_zones, DebugFlag::StageCollision => self.stage_collision = !self.stage_collision, DebugFlag::AnimationBones => self.animation_bones = !self.animation_bones, DebugFlag::AttackHitboxes => self.attack_hitboxes = !self.attack_hitboxes, @@ -884,6 +893,10 @@ pub fn stage_collision_enabled(settings: Res) -> bool { settings.stage_collision } +pub fn blast_zones_enabled(settings: Res) -> bool { + settings.blast_zones +} + pub fn animation_bones_enabled(settings: Res) -> bool { settings.animation_bones } diff --git a/src/stage/debug.rs b/src/stage/debug.rs index 3bb8737..e6a0625 100644 --- a/src/stage/debug.rs +++ b/src/stage/debug.rs @@ -1,6 +1,12 @@ use bevy::{color::palettes::css::RED, prelude::*}; -use crate::stage::line::StageCollision; +use crate::{ + match_loading::MatchConfig, + stage::{ + line::StageCollision, + manifest::{StageManifest, StageManifestRegistry}, + }, +}; pub fn debug_draw_scene(mut gizmos: Gizmos, stage_collision: Res) { for poly in stage_collision.stage_polys.iter() { @@ -16,3 +22,25 @@ pub fn debug_draw_scene(mut gizmos: Gizmos, stage_collision: Res } } } + +pub fn debug_draw_blast_zones( + mut gizmos: Gizmos, + stage_registry: Res, + stage_manifests: Res>, + match_config: Res, +) { + 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; + }; + + let top_left = stage_manifest.blast_zone_top_left.to_vec2(); + let bottom_right = stage_manifest.blast_zone_bottom_right.to_vec2(); + let center = (top_left + bottom_right) / 2.0; + let size = (bottom_right - top_left).abs(); + + gizmos.rect(Vec3::new(center.x, center.y, 0.0), size, bevy::color::palettes::css::BLUE); +} diff --git a/src/stage/manifest.rs b/src/stage/manifest.rs index 42f3401..5871d6e 100644 --- a/src/stage/manifest.rs +++ b/src/stage/manifest.rs @@ -7,14 +7,10 @@ use strum::IntoEnumIterator; use strum_macros::EnumIter; use crate::{ - AppState, - game_settings::GameSettings, - math::vec::FGVec2, - stage::{ + AppState, game_settings::GameSettings, math::{vec::FGVec2}, stage::{ StagePoly, line::{StageCollision, StagePolyLineSegmentType, StagePolyType}, - }, - texture_reference::TextureReference, + }, texture_reference::TextureReference, }; use bevy::prelude::*; @@ -87,6 +83,11 @@ pub struct StageManifest { pub icon: TextureReference, pub camera: StageCameraProfile, pub polygons: Vec, + + #[reflect(ignore)] + pub blast_zone_top_left: FGVec2, + #[reflect(ignore)] + pub blast_zone_bottom_right: FGVec2, } #[derive(Resource)] diff --git a/src/stage/mod.rs b/src/stage/mod.rs index e38aea2..01a7190 100644 --- a/src/stage/mod.rs +++ b/src/stage/mod.rs @@ -10,7 +10,7 @@ pub mod scene; pub use line::{StagePlaneIntersectResult, StagePoly}; -use crate::stage::{line::StageCollision, manifest::StageCameraProfile}; +use crate::{match_loading::MatchConfig, stage::{line::StageCollision, manifest::StageCameraProfile}}; /// Owns the stage geometry: which scene gets spawned and how it is drawn. #[derive(Default)] @@ -20,9 +20,14 @@ impl Plugin for StagePlugin { fn build(&self, app: &mut App) { app.add_systems( Update, - debug::debug_draw_scene - .run_if(resource_exists::) - .run_if(crate::debug_tools::stage_collision_enabled), + ( + (debug::debug_draw_scene + .run_if(resource_exists::) + .run_if(crate::debug_tools::stage_collision_enabled)), + (debug::debug_draw_blast_zones + .run_if(resource_exists::) + .run_if(crate::debug_tools::blast_zones_enabled),), + ), ); } }