104 lines
3.0 KiB
Rust
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;
|
|
}
|
|
}
|
|
}
|