use galactica_content::{Content, SystemHandle, SystemObjectHandle}; use rapier2d::geometry::ColliderHandle; use winit::event::{ElementState, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode}; use crate::{camera::Camera, inputstatus::InputStatus, PlayerStatus}; /// What the player has selected #[derive(Debug, Clone, Copy)] pub enum PlayerSelection { /// We have nothing selected None, /// We have a system body selected OrbitingBody(SystemObjectHandle), /// We have a ship selected Ship(ColliderHandle), } impl PlayerSelection { pub fn get_planet(&self) -> Option { match self { Self::OrbitingBody(h) => Some(*h), _ => None, } } } pub struct PlayerAgent { /// Which ship this player is controlling pub ship: Option, /// What the player has selected pub selection: PlayerSelection, /// This player's camera pub camera: Camera, /// What buttons this player is pressing pub input: InputStatus, } impl PlayerAgent { pub fn new(ship: ColliderHandle) -> Self { Self { input: InputStatus::new(), camera: Camera::new(), ship: Some(ship), selection: PlayerSelection::OrbitingBody(SystemObjectHandle { system_handle: SystemHandle { index: 0 }, body_index: 1, }), } } pub fn set_camera_aspect(&mut self, v: f32) { self.camera.aspect = v } pub fn process_key(&mut self, state: &ElementState, key: &VirtualKeyCode) { self.input.process_key(state, key) } pub fn process_click(&mut self, state: &ElementState, key: &MouseButton) { self.input.process_click(state, key) } pub fn process_scroll(&mut self, delta: &MouseScrollDelta, phase: &TouchPhase) { self.input.process_scroll(delta, phase) } pub fn step(&mut self, ct: &Content, status: PlayerStatus) { if self.input.get_v_scroll() != 0.0 { self.camera.zoom = (self.camera.zoom + self.input.get_v_scroll()) .clamp(ct.get_config().zoom_min, ct.get_config().zoom_max); } if status.pos.is_some() { self.camera.pos = status.pos.unwrap(); } } }