use godot::{ classes::{HBoxContainer, IPanel, Label, Panel}, prelude::*, }; use crate::game_manager::Game; #[derive(GodotClass)] #[class(base=Panel, init)] pub struct GameFinishedScreen { #[export] title_container: Option>, base: Base, } #[godot_api] impl IPanel for GameFinishedScreen { fn ready(&mut self) { self.produce_title(); } } impl GameFinishedScreen { fn produce_title(&mut self) { if let Some(game) = Game::singleton() { let max_goals = game .bind() .goals .iter() .map(|(_, v)| v) .max() .copied() .unwrap_or(0); let winning_team_ids = game .bind() .goals .iter() .filter(|(_, goals)| **goals == max_goals) .map(|(team, _)| *team) .collect::>(); let winning_teams = game .bind() .get_teams() .iter_shared() .enumerate() .filter(|(id, _)| winning_team_ids.contains(&((*id) as u8))) .map(|(_, team)| team) .collect::>(); if let Some(container) = &mut self.title_container { for (idx, team) in winning_teams.iter().enumerate() { let mut label = Label::new_alloc(); label.set_text(&team.bind().name); label.set_modulate(team.bind().color); if idx > 0 { let mut and_label = Label::new_alloc(); and_label.set_text(" and "); container.add_child(&and_label); } container.add_child(&label); } let mut end = Label::new_alloc(); end.set_text(" victory!"); container.add_child(&end); } } } }