diff --git a/data/levels/dm6.rgs b/data/levels/dm6.rgs index 2855b6e..9ed2c21 100644 Binary files a/data/levels/dm6.rgs and b/data/levels/dm6.rgs differ diff --git a/src/bot.rs b/src/bot.rs index f0e9566..835c332 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -37,10 +37,7 @@ use fyrox::{ transform::TransformBuilder, Scene, }, - utils::{ - log::{Log, MessageKind}, - navmesh::Navmesh, - }, + utils::log::{Log, MessageKind}, }; use std::{ ops::{Deref, DerefMut}, diff --git a/src/item.rs b/src/item.rs index a84c68c..f0b22fa 100644 --- a/src/item.rs +++ b/src/item.rs @@ -13,7 +13,7 @@ use fyrox::{ }; use std::{path::Path, sync::mpsc::Sender}; -#[derive(Copy, Clone, PartialEq, Eq, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, Debug, Visit)] pub enum ItemKind { Medkit, @@ -29,35 +29,7 @@ pub enum ItemKind { RocketLauncher, } -impl ItemKind { - fn from_id(id: u32) -> Result { - match id { - 0 => Ok(ItemKind::Medkit), - 1 => Ok(ItemKind::Plasma), - 2 => Ok(ItemKind::Ak47Ammo), - 3 => Ok(ItemKind::M4Ammo), - 4 => Ok(ItemKind::PlasmaGun), - 5 => Ok(ItemKind::Ak47), - 6 => Ok(ItemKind::M4), - 7 => Ok(ItemKind::RocketLauncher), - _ => Err(format!("Unknown item kind {}", id)), - } - } - - fn id(self) -> u32 { - match self { - ItemKind::Medkit => 0, - ItemKind::Plasma => 1, - ItemKind::Ak47Ammo => 2, - ItemKind::M4Ammo => 3, - ItemKind::PlasmaGun => 4, - ItemKind::Ak47 => 5, - ItemKind::M4 => 6, - ItemKind::RocketLauncher => 7, - } - } -} - +#[derive(Visit)] pub struct Item { kind: ItemKind, pivot: Handle, @@ -67,7 +39,7 @@ pub struct Item { offset_factor: f32, reactivation_timer: f32, active: bool, - definition: &'static ItemDefinition, + #[visit(skip)] pub sender: Option>, lifetime: Option, } @@ -83,7 +55,6 @@ impl Default for Item { offset_factor: 0.0, reactivation_timer: 0.0, active: true, - definition: Self::get_definition(ItemKind::Medkit), sender: None, lifetime: None, } @@ -249,8 +220,12 @@ impl Item { self.kind } + pub fn definition(&self) -> &'static ItemDefinition { + Self::get_definition(self.kind) + } + pub fn pick_up(&mut self) { - self.reactivation_timer = self.definition.reactivation_interval; + self.reactivation_timer = self.definition().reactivation_interval; self.active = false; } @@ -274,31 +249,6 @@ impl Item { } } -impl Visit for Item { - fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult { - visitor.enter_region(name)?; - - let mut kind = self.kind.id(); - kind.visit("Kind", visitor)?; - if visitor.is_reading() { - self.kind = ItemKind::from_id(kind)?; - } - - self.definition = Self::get_definition(self.kind); - self.model.visit("Model", visitor)?; - self.pivot.visit("Pivot", visitor)?; - self.offset.visit("Offset", visitor)?; - self.offset_factor.visit("OffsetFactor", visitor)?; - self.dest_offset.visit("DestOffset", visitor)?; - self.reactivation_timer - .visit("ReactivationTimer", visitor)?; - self.active.visit("Active", visitor)?; - self.lifetime.visit("Lifetime", visitor)?; - - visitor.leave_region() - } -} - #[derive(Visit)] pub struct ItemContainer { pool: Pool, diff --git a/src/level.rs b/src/level.rs index cd22794..75b10ab 100644 --- a/src/level.rs +++ b/src/level.rs @@ -830,7 +830,7 @@ impl Level { let scene = &mut engine.scenes[self.scene]; let weapon = &mut self.weapons[weapon_handle]; if weapon.try_shoot(scene, time) { - let kind = weapon.definition.projectile; + let kind = weapon.definition().projectile; let position = weapon.get_shot_position(&scene.graph); let direction = direction .unwrap_or_else(|| weapon.get_shot_direction(&scene.graph)) diff --git a/src/weapon.rs b/src/weapon.rs index f8f64d4..03d70cf 100644 --- a/src/weapon.rs +++ b/src/weapon.rs @@ -26,7 +26,7 @@ use std::{ sync::mpsc::Sender, }; -#[derive(Copy, Clone, PartialEq, Eq, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, Debug, Visit)] pub enum WeaponKind { M4, Ak47, @@ -34,27 +34,7 @@ pub enum WeaponKind { RocketLauncher, } -impl WeaponKind { - pub fn id(self) -> u32 { - match self { - WeaponKind::M4 => 0, - WeaponKind::Ak47 => 1, - WeaponKind::PlasmaRifle => 2, - WeaponKind::RocketLauncher => 3, - } - } - - pub fn new(id: u32) -> Result { - match id { - 0 => Ok(WeaponKind::M4), - 1 => Ok(WeaponKind::Ak47), - 2 => Ok(WeaponKind::PlasmaRifle), - 3 => Ok(WeaponKind::RocketLauncher), - _ => Err(format!("unknown weapon kind {}", id)), - } - } -} - +#[derive(Visit)] pub struct Weapon { kind: WeaponKind, model: Handle, @@ -66,7 +46,7 @@ pub struct Weapon { shot_position: Vector3, owner: Handle, ammo: u32, - pub definition: &'static WeaponDefinition, + #[visit(skip)] pub sender: Option>, } @@ -91,35 +71,11 @@ impl Default for Weapon { shot_position: Vector3::default(), owner: Handle::NONE, ammo: 250, - definition: Self::get_definition(WeaponKind::M4), sender: None, } } } -impl Visit for Weapon { - fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult { - visitor.enter_region(name)?; - - let mut kind_id = self.kind.id(); - kind_id.visit("KindId", visitor)?; - if visitor.is_reading() { - self.kind = WeaponKind::new(kind_id)? - } - - self.definition = Self::get_definition(self.kind); - self.model.visit("Model", visitor)?; - self.laser_dot.visit("LaserDot", visitor)?; - self.offset.visit("Offset", visitor)?; - self.dest_offset.visit("DestOffset", visitor)?; - self.last_shot_time.visit("LastShotTime", visitor)?; - self.owner.visit("Owner", visitor)?; - self.ammo.visit("Ammo", visitor)?; - - visitor.leave_region() - } -} - impl Weapon { pub fn get_definition(kind: WeaponKind) -> &'static WeaponDefinition { match kind { @@ -200,7 +156,6 @@ impl Weapon { laser_dot, model, shot_point, - definition, ammo: definition.ammo, sender: Some(sender), ..Default::default() @@ -302,8 +257,13 @@ impl Weapon { self.owner = owner; } + pub fn definition(&self) -> &'static WeaponDefinition { + Self::get_definition(self.kind) + } + pub fn try_shoot(&mut self, scene: &mut Scene, time: GameTime) -> bool { - if self.ammo != 0 && time.elapsed - self.last_shot_time >= self.definition.shoot_interval { + if self.ammo != 0 && time.elapsed - self.last_shot_time >= self.definition().shoot_interval + { self.ammo -= 1; self.offset = Vector3::new(0.0, 0.0, -0.05); @@ -314,7 +274,7 @@ impl Weapon { if let Some(sender) = self.sender.as_ref() { sender .send(Message::PlaySound { - path: PathBuf::from(self.definition.shot_sound), + path: PathBuf::from(self.definition().shot_sound), position, gain: 1.0, rolloff_factor: 5.0,