Files
shinespark/src/ui/fighter_info.rs
T
EIREXE 15f07edaaf
CI / build-and-test (push) Successful in 1m16s
CI / production-build (push) Successful in 9m38s
Add stocks UI (#52)
Reviewed-on: #52
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
2026-09-20 11:34:45 +00:00

104 lines
3.0 KiB
Rust

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<MatchState>,
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;
}
}
}