#![allow(dead_code)] use specs::{prelude::*, ParJoin, Read, ReadStorage, System, WriteStorage}; use crate::{ components::{Player, PlayerOwned, Position, Ship}, resources::Global, }; #[derive(Default)] pub struct ShipMovement; #[derive(SystemData)] pub struct ShipMovementData<'a> { positions: WriteStorage<'a, Position>, ships: ReadStorage<'a, Ship>, player_owned: ReadStorage<'a, PlayerOwned>, players: ReadStorage<'a, Player>, global: Read<'a, Global>, } impl<'a> System<'a> for ShipMovement { type SystemData = ShipMovementData<'a>; fn run(&mut self, data: Self::SystemData) { let ShipMovementData { mut positions, ships, player_owned, players, global, } = data; (&mut positions, &player_owned, &ships).par_join().for_each( |(position, player_owned, ship)| { let delta = global.delta * global.world_speed; let position = position.get_mut(); let type_ = ship.type_(); let player_id = player_owned.owner(); let player = players.get(player_id).unwrap(); let ship_data = player.ship_data(type_); *position += ship.dir() * ship_data.speed * delta; }, ); } }