Added more gameobject infrastructure
parent
9e0551ae12
commit
1b9e1f2877
|
@ -0,0 +1,47 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use crate::{
|
||||
handles::GameShipHandle,
|
||||
ship::Ship,
|
||||
ship::{OutfitSet, ShipPersonality},
|
||||
};
|
||||
use content::ShipHandle;
|
||||
use galactica_content as content;
|
||||
|
||||
/// Keeps track of all objects in the galaxy.
|
||||
/// This struct does NO physics, it keeps track of data exclusively.
|
||||
pub struct GameData {
|
||||
// Universal counter.
|
||||
// Used to create unique handles for game objects.
|
||||
index: u64,
|
||||
ships: HashMap<GameShipHandle, Ship>,
|
||||
}
|
||||
|
||||
impl GameData {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
index: 0,
|
||||
ships: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Spawn a ship
|
||||
pub fn create_ship(
|
||||
&mut self,
|
||||
ct: &content::Content,
|
||||
ship: ShipHandle,
|
||||
faction: content::FactionHandle,
|
||||
personality: ShipPersonality,
|
||||
outfits: OutfitSet,
|
||||
) -> GameShipHandle {
|
||||
let handle = GameShipHandle { index: self.index };
|
||||
self.index += 1;
|
||||
self.ships
|
||||
.insert(handle, Ship::new(ct, ship, faction, personality, outfits));
|
||||
return handle;
|
||||
}
|
||||
|
||||
pub fn get_ship(&self, handle: GameShipHandle) -> Option<&Ship> {
|
||||
self.ships.get(&handle)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
/// A lightweight representation of a ship in the galaxy
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct GameShipHandle {
|
||||
pub(crate) index: u64,
|
||||
}
|
|
@ -4,10 +4,11 @@
|
|||
//! of every ship in the game, but it has no understanding of physics.
|
||||
//! That is done in `galactica_world`.
|
||||
|
||||
mod projectile;
|
||||
mod ship;
|
||||
mod gamedata;
|
||||
mod handles;
|
||||
pub mod ship;
|
||||
mod system;
|
||||
|
||||
pub use projectile::Projectile;
|
||||
pub use ship::Ship;
|
||||
pub use gamedata::*;
|
||||
pub use handles::*;
|
||||
pub use system::{System, SystemObject};
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
mod outfitset;
|
||||
mod personality;
|
||||
mod ship;
|
||||
|
||||
pub use outfitset::*;
|
||||
pub use personality::*;
|
||||
pub use ship::*;
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
/// Computer-controlled ship behavior variants.
|
||||
/// This is just a list, actual physics-aware
|
||||
/// behaviors are implemented in [`galactica-behavior`]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum ShipPersonality {
|
||||
/// This ship is controlled by a player
|
||||
Player,
|
||||
|
||||
/// Does nothing
|
||||
Dummy,
|
||||
|
||||
/// Points and shoots towards the nearest enemy
|
||||
Point,
|
||||
}
|
|
@ -1,30 +1,33 @@
|
|||
use std::time::Instant;
|
||||
|
||||
use super::OutfitSet;
|
||||
use super::{OutfitSet, ShipPersonality};
|
||||
use galactica_content as content;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Ship {
|
||||
// Metadata values
|
||||
pub ct_handle: content::ShipHandle,
|
||||
pub faction: content::FactionHandle,
|
||||
pub outfits: OutfitSet,
|
||||
ct_handle: content::ShipHandle,
|
||||
faction: content::FactionHandle,
|
||||
outfits: OutfitSet,
|
||||
|
||||
personality: ShipPersonality,
|
||||
|
||||
// State values
|
||||
// TODO: unified ship stats struct, like space
|
||||
pub hull: f32,
|
||||
pub shields: f32,
|
||||
// TODO: unified ship stats struct, like outfit space
|
||||
hull: f32,
|
||||
shields: f32,
|
||||
|
||||
// Utility values
|
||||
/// The last time this ship was damaged
|
||||
pub last_hit: Instant,
|
||||
last_hit: Instant,
|
||||
}
|
||||
|
||||
impl Ship {
|
||||
pub fn new(
|
||||
pub(crate) fn new(
|
||||
ct: &content::Content,
|
||||
ct_handle: content::ShipHandle,
|
||||
faction: content::FactionHandle,
|
||||
personality: ShipPersonality,
|
||||
outfits: OutfitSet,
|
||||
) -> Self {
|
||||
let s = ct.get_ship(ct_handle);
|
||||
|
@ -33,6 +36,7 @@ impl Ship {
|
|||
ct_handle,
|
||||
faction,
|
||||
outfits,
|
||||
personality,
|
||||
last_hit: Instant::now(),
|
||||
|
||||
// Initial stats
|
||||
|
@ -77,3 +81,38 @@ impl Ship {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Misc getters, so internal state is untouchable
|
||||
impl Ship {
|
||||
/// Get this ship's current hull.
|
||||
/// Use content handle to get maximum hull
|
||||
pub fn get_hull(&self) -> f32 {
|
||||
return self.hull;
|
||||
}
|
||||
|
||||
/// Get this ship's current shields.
|
||||
/// Use get_outfits() for maximum shields
|
||||
pub fn get_shields(&self) -> f32 {
|
||||
self.shields
|
||||
}
|
||||
|
||||
/// Get all outfits on this ship
|
||||
pub fn get_outfits(&self) -> &OutfitSet {
|
||||
&self.outfits
|
||||
}
|
||||
|
||||
/// Get this ship's personality
|
||||
pub fn get_personality(&self) -> ShipPersonality {
|
||||
self.personality
|
||||
}
|
||||
|
||||
/// Get this ship's faction
|
||||
pub fn get_faction(&self) -> content::FactionHandle {
|
||||
self.faction
|
||||
}
|
||||
|
||||
/// Get this ship's content handle
|
||||
pub fn get_ship(&self) -> content::ShipHandle {
|
||||
self.ct_handle
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue