diff options
Diffstat (limited to 'games/rstnode/rst-client/src/state/mod.rs')
-rw-r--r-- | games/rstnode/rst-client/src/state/mod.rs | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/games/rstnode/rst-client/src/state/mod.rs b/games/rstnode/rst-client/src/state/mod.rs new file mode 100644 index 000000000000..45e69eee10bb --- /dev/null +++ b/games/rstnode/rst-client/src/state/mod.rs @@ -0,0 +1,129 @@ +//! Game client state handling + +mod map; +pub use map::*; + +mod if_impl; + +use crate::{ + assets::Assets, + graphics::{ + entities::{Coordinates, NodeRndr}, + Renderer, + }, + input::InputHandle, + viewport::Viewport, + GameSettings, +}; +use ggez::{event::EventHandler, graphics, Context, GameResult}; +use rst_core::{ + data::{Color, Level, Link, Node, Owner, Player, Upgrade}, + io::Io, +}; +use std::sync::Arc; + +pub struct ClientState { + assets: Assets, + settings: GameSettings, + input: InputHandle, + vp: Viewport, + + // Game state + node1: NodeRndr, + node2: NodeRndr, + link: Arc<Link>, +} + +impl ClientState { + pub fn new(settings: GameSettings, assets: Assets) -> Self { + let link = Arc::new(Link { + id: 0, + a: 0, + b: 1, + length: 12, + pp: vec![], + io: Io::default(), + }); + + Self { + assets, + settings, + vp: Viewport::new(), + input: InputHandle::new(), + node1: NodeRndr { + loc: Coordinates(512.0, 512.0), + inner: Arc::new(Node { + id: 0, + health: 100.into(), + max_health: 100.into(), + owner: Owner::Player(Player { + id: 0, + name: "kookie".into(), + color: Color::blue(), + money: 1000.into(), + }), + type_: Upgrade::Relay(Level::One), + links: 1, + router: None, + link_states: vec![Arc::clone(&link)], + buffer: vec![].into(), + }), + }, + node2: NodeRndr { + loc: Coordinates(128.0, 128.0), + inner: Arc::new(Node { + id: 0, + health: 100.into(), + max_health: 100.into(), + owner: Owner::Neutral, + type_: Upgrade::Relay(Level::One), + links: 1, + router: None, + link_states: vec![Arc::clone(&link)], + buffer: vec![].into(), + }), + }, + link, + } + } + + pub fn viewport(&mut self) -> &mut Viewport { + &mut self.vp + } + + pub fn assets(&self) -> &Assets { + &self.assets + } +} + +impl EventHandler for ClientState { + fn update(&mut self, ctx: &mut Context) -> GameResult<()> { + // TODO: get simulation updates + + // Get new input state + self.input.update(ctx)?; + + // Apply inputs to viewpoirt + self.vp.apply(ctx, &self.input)?; + + // Update viewport + self.vp.update(ctx)?; + Ok(()) + } + + fn mouse_wheel_event(&mut self, ctx: &mut Context, x: f32, y: f32) { + self.input.mouse_wheel_event(ctx, x, y); + let zoom = self.input.scroll_offset; + self.viewport().zoom(zoom); + } + + fn draw(&mut self, ctx: &mut Context) -> GameResult<()> { + graphics::clear(ctx, graphics::Color::from_rgb(15, 15, 15)); + + // Render the node + self.node1.draw(&self, ctx).unwrap(); + self.node2.draw(&self, ctx).unwrap(); + + graphics::present(ctx) + } +} |