Added system logic
parent
966ad4e5a4
commit
8ec3ece500
|
@ -5,21 +5,33 @@ use crate::{
|
||||||
ship::Ship,
|
ship::Ship,
|
||||||
ship::{OutfitSet, ShipPersonality},
|
ship::{OutfitSet, ShipPersonality},
|
||||||
};
|
};
|
||||||
use content::ShipHandle;
|
|
||||||
use galactica_content as content;
|
use galactica_content as content;
|
||||||
|
|
||||||
/// Keeps track of all objects in the galaxy.
|
/// Keeps track of all objects in the galaxy.
|
||||||
/// This struct does NO physics, it keeps track of data exclusively.
|
/// This struct does NO physics, it keeps track of data exclusively.
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct GameData {
|
pub struct GameData {
|
||||||
// Universal counter.
|
/// Universal counter.
|
||||||
// Used to create unique handles for game objects.
|
/// Used to create unique handles for game objects.
|
||||||
index: u64,
|
index: u64,
|
||||||
|
|
||||||
|
/// All ships in the galaxy
|
||||||
ships: HashMap<GameShipHandle, Ship>,
|
ships: HashMap<GameShipHandle, Ship>,
|
||||||
|
|
||||||
|
/// Ships indexed by the system they're in.
|
||||||
|
/// A ship must always be in exactly one system.
|
||||||
|
system_ship_table: HashMap<content::SystemHandle, Vec<GameShipHandle>>,
|
||||||
|
|
||||||
|
/// Systems indexed by which ships they contain.
|
||||||
|
/// A ship must always be in exactly one system.
|
||||||
|
ship_system_table: HashMap<GameShipHandle, content::SystemHandle>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GameData {
|
impl GameData {
|
||||||
pub fn new() -> Self {
|
pub fn new(ct: &content::Content) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
system_ship_table: ct.iter_systems().map(|s| (s, Vec::new())).collect(),
|
||||||
|
ship_system_table: HashMap::new(),
|
||||||
index: 0,
|
index: 0,
|
||||||
ships: HashMap::new(),
|
ships: HashMap::new(),
|
||||||
}
|
}
|
||||||
|
@ -29,19 +41,40 @@ impl GameData {
|
||||||
pub fn create_ship(
|
pub fn create_ship(
|
||||||
&mut self,
|
&mut self,
|
||||||
ct: &content::Content,
|
ct: &content::Content,
|
||||||
ship: ShipHandle,
|
ship: content::ShipHandle,
|
||||||
faction: content::FactionHandle,
|
faction: content::FactionHandle,
|
||||||
personality: ShipPersonality,
|
personality: ShipPersonality,
|
||||||
outfits: OutfitSet,
|
outfits: OutfitSet,
|
||||||
|
system: &content::SystemHandle,
|
||||||
) -> GameShipHandle {
|
) -> GameShipHandle {
|
||||||
let handle = GameShipHandle { index: self.index };
|
let handle = GameShipHandle {
|
||||||
|
index: self.index,
|
||||||
|
content: ship,
|
||||||
|
};
|
||||||
self.index += 1;
|
self.index += 1;
|
||||||
self.ships
|
|
||||||
.insert(handle, Ship::new(ct, ship, faction, personality, outfits));
|
self.ships.insert(
|
||||||
|
handle,
|
||||||
|
Ship::new(ct, handle, ship, faction, personality, outfits),
|
||||||
|
);
|
||||||
|
self.system_ship_table.get_mut(system).unwrap().push(handle);
|
||||||
|
self.ship_system_table.insert(handle, *system);
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public getters
|
||||||
|
impl GameData {
|
||||||
pub fn get_ship(&self, handle: GameShipHandle) -> Option<&Ship> {
|
pub fn get_ship(&self, handle: GameShipHandle) -> Option<&Ship> {
|
||||||
self.ships.get(&handle)
|
self.ships.get(&handle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_ship_mut(&mut self, handle: GameShipHandle) -> Option<&mut Ship> {
|
||||||
|
self.ships.get_mut(&handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn iter_ships(&self) -> impl Iterator<Item = &Ship> {
|
||||||
|
self.ships.values()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,33 @@
|
||||||
|
use std::hash::Hash;
|
||||||
|
|
||||||
|
use galactica_content::ShipHandle;
|
||||||
|
|
||||||
/// A lightweight representation of a ship in the galaxy
|
/// A lightweight representation of a ship in the galaxy
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct GameShipHandle {
|
pub struct GameShipHandle {
|
||||||
|
/// This ship's unique index
|
||||||
pub(crate) index: u64,
|
pub(crate) index: u64,
|
||||||
|
|
||||||
|
/// This ship's content handle
|
||||||
|
/// (technically redundant, but this greatly simplifies code)
|
||||||
|
pub(crate) content: ShipHandle,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GameShipHandle {
|
||||||
|
pub fn content_handle(&self) -> ShipHandle {
|
||||||
|
self.content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hash for GameShipHandle {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.index.hash(state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for GameShipHandle {}
|
||||||
|
impl PartialEq for GameShipHandle {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.index.eq(&other.index)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
use galactica_content as content;
|
|
||||||
|
|
||||||
// TODO: remove. projectiles only exist in physics
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Projectile {
|
|
||||||
pub content: content::Projectile,
|
|
||||||
pub lifetime: f32,
|
|
||||||
pub faction: content::FactionHandle,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Projectile {
|
|
||||||
pub fn tick(&mut self, t: f32) {
|
|
||||||
self.lifetime -= t;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_expired(&self) -> bool {
|
|
||||||
return self.lifetime < 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -29,7 +29,7 @@ pub enum OutfitRemoveResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A simple data class, used to keep track of delayed shield generators
|
/// A simple data class, used to keep track of delayed shield generators
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) struct ShieldGenerator {
|
pub(crate) struct ShieldGenerator {
|
||||||
pub outfit: OutfitHandle,
|
pub outfit: OutfitHandle,
|
||||||
pub delay: f32,
|
pub delay: f32,
|
||||||
|
@ -37,7 +37,7 @@ pub(crate) struct ShieldGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This struct keeps track of a ship's outfit loadout.
|
/// This struct keeps track of a ship's outfit loadout.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct OutfitSet {
|
pub struct OutfitSet {
|
||||||
/// What outfits does this statsum contain?
|
/// What outfits does this statsum contain?
|
||||||
outfits: HashMap<OutfitHandle, u32>,
|
outfits: HashMap<OutfitHandle, u32>,
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
|
use crate::GameShipHandle;
|
||||||
|
|
||||||
use super::{OutfitSet, ShipPersonality};
|
use super::{OutfitSet, ShipPersonality};
|
||||||
use galactica_content as content;
|
use galactica_content as content;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Ship {
|
pub struct Ship {
|
||||||
// Metadata values
|
// Metadata values
|
||||||
|
handle: GameShipHandle,
|
||||||
ct_handle: content::ShipHandle,
|
ct_handle: content::ShipHandle,
|
||||||
faction: content::FactionHandle,
|
faction: content::FactionHandle,
|
||||||
outfits: OutfitSet,
|
outfits: OutfitSet,
|
||||||
|
@ -25,6 +28,7 @@ pub struct Ship {
|
||||||
impl Ship {
|
impl Ship {
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
ct: &content::Content,
|
ct: &content::Content,
|
||||||
|
handle: GameShipHandle,
|
||||||
ct_handle: content::ShipHandle,
|
ct_handle: content::ShipHandle,
|
||||||
faction: content::FactionHandle,
|
faction: content::FactionHandle,
|
||||||
personality: ShipPersonality,
|
personality: ShipPersonality,
|
||||||
|
@ -33,6 +37,7 @@ impl Ship {
|
||||||
let s = ct.get_ship(ct_handle);
|
let s = ct.get_ship(ct_handle);
|
||||||
let shields = outfits.get_shield_strength();
|
let shields = outfits.get_shield_strength();
|
||||||
Ship {
|
Ship {
|
||||||
|
handle,
|
||||||
ct_handle,
|
ct_handle,
|
||||||
faction,
|
faction,
|
||||||
outfits,
|
outfits,
|
||||||
|
@ -84,10 +89,20 @@ impl Ship {
|
||||||
|
|
||||||
// Misc getters, so internal state is untouchable
|
// Misc getters, so internal state is untouchable
|
||||||
impl Ship {
|
impl Ship {
|
||||||
|
/// Get a handle to this ship game object
|
||||||
|
pub fn get_handle(&self) -> GameShipHandle {
|
||||||
|
self.handle
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a handle to this ship's content
|
||||||
|
pub fn get_content(&self) -> content::ShipHandle {
|
||||||
|
self.ct_handle
|
||||||
|
}
|
||||||
|
|
||||||
/// Get this ship's current hull.
|
/// Get this ship's current hull.
|
||||||
/// Use content handle to get maximum hull
|
/// Use content handle to get maximum hull
|
||||||
pub fn get_hull(&self) -> f32 {
|
pub fn get_hull(&self) -> f32 {
|
||||||
return self.hull;
|
self.hull
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get this ship's current shields.
|
/// Get this ship's current shields.
|
||||||
|
|
Loading…
Reference in New Issue