# HG changeset patch # User unC0Rr # Date 1542890391 -3600 # Node ID 3152d9fdb499bef7b900a2e17c9a630dc13aca67 # Parent 1aac8a62be6f730d2fa484c51457decbcb2cd946 - Move EngineInstance into a separate module - Refactor ipc a bit and process messages diff -r 1aac8a62be6f -r 3152d9fdb499 rust/hedgewars-engine-messages/src/messages.rs --- a/rust/hedgewars-engine-messages/src/messages.rs Thu Nov 22 10:58:55 2018 +0100 +++ b/rust/hedgewars-engine-messages/src/messages.rs Thu Nov 22 13:39:51 2018 +0100 @@ -1,12 +1,12 @@ use byteorder::{BigEndian, WriteBytesExt}; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum KeystrokeAction { Press, Release, } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum SyncedEngineMessage { Left(KeystrokeAction), Right(KeystrokeAction), @@ -32,13 +32,13 @@ Heartbeat, } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum UnsyncedEngineMessage { TeamControlGained(String), TeamControlLost(String), } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum UnorderedEngineMessage { Ping, Pong, @@ -53,7 +53,7 @@ PauseToggled, } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum ConfigEngineMessage { GameType(u8), ConfigRequest, @@ -126,7 +126,7 @@ SetShoppaBorder(bool), } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Clone)] pub enum EngineMessage { Unknown, Empty, diff -r 1aac8a62be6f -r 3152d9fdb499 rust/lib-hedgewars-engine/src/instance.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/src/instance.rs Thu Nov 22 13:39:51 2018 +0100 @@ -0,0 +1,63 @@ +use hedgewars_engine_messages::messages::{ + ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*, + UnorderedEngineMessage::*, UnsyncedEngineMessage::*, * +}; + +use super::{ipc::IPC, world::World}; + +#[repr(C)] +pub struct EngineInstance { + pub world: World, + pub ipc: IPC, +} + +impl EngineInstance { + pub fn new() -> Self { + let world = World::new(); + Self { + world, + ipc: IPC::new(), + } + } + + pub fn render( + &self, + context: &mut gfx::Encoder, + target: &gfx::handle::RenderTargetView, + ) where + R: gfx::Resources, + C: gfx::CommandBuffer, + { + context.clear(target, [0.0, 0.5, 0.0, 1.0]); + } + + fn process_unordered_message(&mut self, message: &UnorderedEngineMessage) { + match message { + Pong => println!("Pong!"), + _ => unimplemented!(), + } + } + + fn process_config_message(&mut self, message: &ConfigEngineMessage) { + match message { + SetSeed(seed) => self.world.set_seed(seed.as_bytes()), + _ => unimplemented!(), + } + } + + pub fn process_ipc_queue(&mut self) { + let messages: Vec = self.ipc.iter().collect(); + + for message in messages { + println!("Processing message: {:?}", message); + match message { + Unknown => println!("Unknown message"), + Empty => println!("Empty message") , + Synced(_, _) => unimplemented!(), + Unsynced(_) => unimplemented!(), + Unordered(unordered_message) => self.process_unordered_message(&unordered_message), + Config(config_message) => self.process_config_message(&config_message) + } + } + } +} diff -r 1aac8a62be6f -r 3152d9fdb499 rust/lib-hedgewars-engine/src/ipc.rs --- a/rust/lib-hedgewars-engine/src/ipc.rs Thu Nov 22 10:58:55 2018 +0100 +++ b/rust/lib-hedgewars-engine/src/ipc.rs Thu Nov 22 13:39:51 2018 +0100 @@ -18,6 +18,10 @@ pub fn send_message(&mut self, message: &EngineMessage) { self.out_buffer.write(&message.to_bytes()).unwrap(); } + + pub fn iter(& mut self) -> IPCMessagesIterator { + IPCMessagesIterator::new(self) + } } impl Write for IPC { @@ -40,13 +44,25 @@ } } -impl Iterator for IPC { +pub struct IPCMessagesIterator<'a> { + ipc: &'a mut IPC +} + +impl<'a> IPCMessagesIterator<'a> { + pub fn new(ipc: &'a mut IPC) -> Self { + Self { + ipc + } + } +} + +impl<'a> Iterator for IPCMessagesIterator<'a> { type Item = EngineMessage; fn next(&mut self) -> Option { - let (consumed, message) = extract_message(&self.in_buffer[..])?; + let (consumed, message) = extract_message(&self.ipc.in_buffer[..])?; - self.in_buffer.consume(consumed); + self.ipc.in_buffer.consume(consumed); Some(message) } diff -r 1aac8a62be6f -r 3152d9fdb499 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Thu Nov 22 10:58:55 2018 +0100 +++ b/rust/lib-hedgewars-engine/src/lib.rs Thu Nov 22 13:39:51 2018 +0100 @@ -1,36 +1,10 @@ mod ipc; mod world; +mod instance; use std::io::{Read, Write}; -use self::ipc::IPC; - -#[repr(C)] -pub struct EngineInstance { - world: world::World, - ipc: IPC, -} - -impl EngineInstance { - pub fn new() -> Self { - let world = world::World::new(); - Self { - world, - ipc: IPC::new(), - } - } - - pub fn render( - &self, - context: &mut gfx::Encoder, - target: &gfx::handle::RenderTargetView, - ) where - R: gfx::Resources, - C: gfx::CommandBuffer, - { - context.clear(target, [0.0, 0.5, 0.0, 1.0]); - } -} +use self::instance::EngineInstance; #[repr(C)] #[derive(Copy, Clone)] @@ -55,6 +29,8 @@ #[no_mangle] pub extern "C" fn generate_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) { + (*engine_state).process_ipc_queue(); + (*engine_state).world.generate_preview(); let land_preview = (*engine_state).world.preview(); @@ -68,19 +44,19 @@ } #[no_mangle] -pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const [u8], size: usize) { +pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const u8, size: usize) { unsafe { - (*engine_state).ipc.write(&(*buf)[0..size]); + (*engine_state).ipc.write(std::slice::from_raw_parts(buf, size)).unwrap(); } } #[no_mangle] pub extern "C" fn read_ipc( engine_state: &mut EngineInstance, - buf: *mut [u8], + buf: *mut u8, size: usize, ) -> usize { - unsafe { (*engine_state).ipc.read(&mut (*buf)[0..size]).unwrap_or(0) } + unsafe { (*engine_state).ipc.read(std::slice::from_raw_parts_mut(buf, size)).unwrap_or(0) } } #[no_mangle] diff -r 1aac8a62be6f -r 3152d9fdb499 rust/lib-hedgewars-engine/src/world.rs --- a/rust/lib-hedgewars-engine/src/world.rs Thu Nov 22 10:58:55 2018 +0100 +++ b/rust/lib-hedgewars-engine/src/world.rs Thu Nov 22 13:39:51 2018 +0100 @@ -19,6 +19,10 @@ } } + pub fn set_seed(&mut self, seed: &[u8]) { + self.random_numbers_gen = LaggedFibonacciPRNG::new(seed); + } + pub fn preview(&self) -> &Land2D { &self.preview }