use space_crush_common::{ components::{Fleet, MeetingPoint, Position}, misc::LogResult, }; use specs::{prelude::*, ReadExpect, ReadStorage, System, World}; use crate::{ misc::{HorizontalAlign, Text, TextManager, VerticalAlign}, resources::{Camera, GameState}, Error, }; pub struct Fleets { text: Text, } #[derive(SystemData)] pub struct FleetData<'a> { game_state: ReadExpect<'a, GameState>, camera: ReadExpect<'a, Camera>, positions: ReadStorage<'a, Position>, meeting_points: ReadStorage<'a, MeetingPoint>, fleets: ReadStorage<'a, Fleet>, } impl Fleets { pub fn new(manager: &TextManager) -> Result { let cache = manager.create_cache()?; let text = cache .new_text() .scale(20.0) .font("resources/fonts/DroidSansMono.ttf") .color(0.7, 0.7, 0.7, 1.0) .vert_align(VerticalAlign::Center) .horz_align(HorizontalAlign::Center) .text("") .build()?; Ok(Self { text }) } } impl<'a> System<'a> for Fleets { type SystemData = FleetData<'a>; fn run(&mut self, data: Self::SystemData) { let FleetData { game_state, camera, positions, meeting_points, fleets, } = data; let player_index = game_state.player_index(); gl::enable(gl::BLEND); for (position, meeting_point) in (&positions, &meeting_points).join() { let fleet_id = match meeting_point.fleet(player_index) { Some(fleet_id) => fleet_id, None => continue, }; let fleet = fleets.get(fleet_id).unwrap(); gl::blend_func(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA); gl::blend_equation(gl::FUNC_SUBTRACT); self.text .update( 0, format!( "F:{}\nB:{}\nT:{}", fleet.count().fighter, fleet.count().bomber, fleet.count().transporter ), ) .panic("Unable to update text") .render_offset(&camera.world_to_window(*position.get())); } gl::blend_equation(gl::FUNC_ADD); gl::disable(gl::BLEND); } }