use bevy::prelude::*; use crate::{ fighter::{attack::FighterDamage, manifest::FighterManifest}, match_loading::{MatchPlayer}, match_runtime::MatchState, player::Player, ui::stock_icon::BattleUIStockIcon, }; #[derive(Component, FromTemplate)] pub struct FighterInfoUI { percentage_text: Entity, stock_icon_container: Entity, _name_text: Entity, player_handle: usize, visible_damage: FighterDamage, visible_stocks: u8, } impl FighterInfoUI { pub fn build(_manifest: &FighterManifest, match_player: &MatchPlayer) -> impl Scene { let fighter_name = "El grande padre"; bsn! { FighterInfoUI { percentage_text: #PercentageText, stock_icon_container: #StockIconContainer, _name_text: #NameText, player_handle: {match_player.handle} } Node { flex_direction: FlexDirection::Column, align_items: AlignItems::Center, justify_content: JustifyContent::Center, } Children [ ( #StockIconContainer Node ) ( #PercentageText Text("0.00%") TextFont { font_size: px(crate::menus::style::H2_SIZE), } ), ( #NameText Text({fighter_name}) ) ] } } } pub fn update_fighter_info_damage( fighters: Query<(&Player, &FighterDamage)>, ui_elements: Query<&mut FighterInfoUI>, mut commands: Commands, ) { for mut ui_element in ui_elements { let Some((_, damage)) = fighters .iter() .find(|(player, _)| player.handle == ui_element.player_handle) else { continue; }; if *damage != ui_element.visible_damage { commands .entity(ui_element.percentage_text) .insert(Text(format!("{}%", damage))); ui_element.visible_damage = damage.clone(); } } } pub fn update_fighter_info_stocks( match_state: Res, ui_elements: Query<&mut FighterInfoUI>, mut commands: Commands, ) { for mut ui_element in ui_elements { let handle = ui_element.player_handle; let Some(match_player) = match_state.players.get(handle) else { continue; }; let Some(stocks) = match_player.stocks_remaining else { continue; }; if stocks != ui_element.visible_stocks { commands .entity(ui_element.stock_icon_container) .despawn_children() .with_children(|spawner| { for _ in 0..stocks { spawner.spawn_empty().apply_scene(BattleUIStockIcon::scene()); } }); ui_element.visible_stocks = stocks; } } }