use bevy::prelude::*; use crate::{ AppState, match_loading::{MatchConfig, MatchRules}, match_runtime::{MatchState, PauseState}, }; pub mod battle_ui; pub mod errors; pub mod fighter_info; pub mod stock_icon; #[derive(Component)] pub struct PauseOverlay; #[derive(Default)] pub struct InGameUIPlugin; impl Plugin for InGameUIPlugin { fn build(&self, app: &mut App) { app.add_systems(OnEnter(AppState::InMatch), battle_ui::spawn_battle_ui) .add_systems(OnExit(AppState::InMatch), battle_ui::cleanup_battle_ui) .add_systems(PostUpdate, fighter_info::update_fighter_info_damage) .add_systems( PostUpdate, fighter_info::update_fighter_info_stocks.run_if( resource_exists:: .and_then(resource_exists::) .and_then(|match_config: Res| { if let MatchRules::Stock { .. } = match_config.rules { true } else { false } }), ), ) .add_systems(Update, sync_pause_overlay); } } pub fn sync_pause_overlay( pause: Res, overlay: Query>, mut commands: Commands, ) { if !pause.is_changed() { return; } if pause.paused { if overlay.is_empty() { commands.spawn(( PauseOverlay, Node { position_type: PositionType::Absolute, left: px(0), right: px(0), top: px(0), bottom: px(0), align_items: AlignItems::Center, justify_content: JustifyContent::Center, flex_direction: FlexDirection::Column, ..default() }, BackgroundColor(Color::srgba(0.0, 0.0, 0.0, 0.7)), ZIndex(100), children![ ( Text::new("Paused"), TextFont::from_font_size(crate::menus::style::H1_SIZE as f32), TextColor(Color::WHITE), ), ( Text::new("Press Esc or Start to resume"), TextFont::from_font_size(crate::menus::style::TEXT_SIZE as f32), TextColor(Color::WHITE), ), ], )); } } else { for entity in &overlay { commands.entity(entity).despawn(); } } }