Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

83 linhas
2.4 KiB

  1. #![allow(dead_code)]
  2. use specs::{prelude::*, ParJoin, Read, ReadStorage, System, WriteStorage};
  3. use crate::{
  4. components::{Fleet, FleetOwned, Player, PlayerOwned, Position, Ship, ShipMoving, ShipType},
  5. resources::Global,
  6. };
  7. #[derive(Default)]
  8. pub struct ShipsMovement;
  9. #[derive(SystemData)]
  10. pub struct ShipsMovementData<'a> {
  11. positions: WriteStorage<'a, Position>,
  12. ships: ReadStorage<'a, Ship>,
  13. ships_moving: ReadStorage<'a, ShipMoving>,
  14. fleet_owned: ReadStorage<'a, FleetOwned>,
  15. fleets: ReadStorage<'a, Fleet>,
  16. player_owned: ReadStorage<'a, PlayerOwned>,
  17. players: ReadStorage<'a, Player>,
  18. global: Read<'a, Global>,
  19. }
  20. impl<'a> System<'a> for ShipsMovement {
  21. type SystemData = ShipsMovementData<'a>;
  22. fn run(&mut self, data: Self::SystemData) {
  23. let ShipsMovementData {
  24. mut positions,
  25. ships,
  26. ships_moving,
  27. fleet_owned,
  28. fleets,
  29. player_owned,
  30. players,
  31. global,
  32. } = data;
  33. (
  34. &mut positions,
  35. &player_owned,
  36. &fleet_owned,
  37. &ships,
  38. ships_moving.maybe(),
  39. )
  40. .par_join()
  41. .for_each(|(position, player_owned, fleet_owned, ship, ship_moving)| {
  42. let delta = global.delta * global.world_speed;
  43. let position = position.get_mut();
  44. let player_id = player_owned.owner();
  45. let player = players.get(player_id).unwrap();
  46. let ships_data = player.ships_data();
  47. let type_ = ship.type_();
  48. let speed = if ship_moving.is_some() {
  49. let fleet_id = fleet_owned.owner();
  50. let fleet = fleets.get(fleet_id).unwrap();
  51. let mut speed = ships_data[type_].speed;
  52. macro_rules! merge {
  53. ($t:path) => {
  54. if fleet.count()[$t] > 0 {
  55. speed = speed.min(ships_data[$t].speed);
  56. }
  57. };
  58. }
  59. merge!(ShipType::Fighter);
  60. merge!(ShipType::Bomber);
  61. merge!(ShipType::Transporter);
  62. speed
  63. } else {
  64. ships_data[type_].speed
  65. };
  66. *position += ship.dir() * speed * delta;
  67. });
  68. }
  69. }