You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.3 KiB

  1. use space_crush_common::{
  2. components::{Fleet, MeetingPoint, Position},
  3. misc::LogResult,
  4. };
  5. use specs::{prelude::*, ReadExpect, ReadStorage, System, World};
  6. use crate::{
  7. misc::{HorizontalAlign, Text, TextManager, VerticalAlign},
  8. resources::{Camera, GameState},
  9. Error,
  10. };
  11. pub struct Fleets {
  12. text: Text,
  13. }
  14. #[derive(SystemData)]
  15. pub struct FleetData<'a> {
  16. game_state: ReadExpect<'a, GameState>,
  17. camera: ReadExpect<'a, Camera>,
  18. positions: ReadStorage<'a, Position>,
  19. meeting_points: ReadStorage<'a, MeetingPoint>,
  20. fleets: ReadStorage<'a, Fleet>,
  21. }
  22. impl Fleets {
  23. pub fn new(manager: &TextManager) -> Result<Self, Error> {
  24. let cache = manager.create_cache()?;
  25. let text = cache
  26. .new_text()
  27. .scale(20.0)
  28. .font("resources/fonts/DroidSansMono.ttf")
  29. .color(0.7, 0.7, 0.7, 1.0)
  30. .vert_align(VerticalAlign::Center)
  31. .horz_align(HorizontalAlign::Center)
  32. .text("")
  33. .build()?;
  34. Ok(Self { text })
  35. }
  36. }
  37. impl<'a> System<'a> for Fleets {
  38. type SystemData = FleetData<'a>;
  39. fn run(&mut self, data: Self::SystemData) {
  40. let FleetData {
  41. game_state,
  42. camera,
  43. positions,
  44. meeting_points,
  45. fleets,
  46. } = data;
  47. let player_index = game_state.player_index();
  48. gl::enable(gl::BLEND);
  49. for (position, meeting_point) in (&positions, &meeting_points).join() {
  50. let fleet_id = match meeting_point.fleet(player_index) {
  51. Some(fleet_id) => fleet_id,
  52. None => continue,
  53. };
  54. let fleet = fleets.get(fleet_id).unwrap();
  55. gl::blend_func(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA);
  56. gl::blend_equation(gl::FUNC_SUBTRACT);
  57. self.text
  58. .update(
  59. 0,
  60. format!(
  61. "F:{}\nB:{}\nT:{}",
  62. fleet.count().fighter,
  63. fleet.count().bomber,
  64. fleet.count().transporter
  65. ),
  66. )
  67. .panic("Unable to update text")
  68. .render_offset(&camera.world_to_window(*position.get()));
  69. }
  70. gl::blend_equation(gl::FUNC_ADD);
  71. gl::disable(gl::BLEND);
  72. }
  73. }