diff options
Diffstat (limited to 'light-client/src/game.rs')
-rw-r--r-- | light-client/src/game.rs | 79 |
1 files changed, 78 insertions, 1 deletions
diff --git a/light-client/src/game.rs b/light-client/src/game.rs index ed1cb7fe..cf265344 100644 --- a/light-client/src/game.rs +++ b/light-client/src/game.rs @@ -20,12 +20,15 @@ use hurrycurry_protocol::{ glam::{IVec2, Vec2}, PacketC, PlayerID, TileIndex, }; +use log::{info, warn}; +use sdl2::rect::FRect; use std::collections::HashMap; pub struct Game { tiles: HashMap<IVec2, Tile>, tilemap: Tilemap, players: HashMap<PlayerID, Player>, + my_id: PlayerID, } pub struct Tile { @@ -34,6 +37,9 @@ pub struct Tile { pub struct Player { character: i32, position: Vec2, + name: String, + boosting: bool, + rot: f32, } impl Game { @@ -42,11 +48,13 @@ impl Game { tiles: HashMap::new(), players: HashMap::new(), tilemap: Tilemap::default(), + my_id: PlayerID(0), } } pub fn packet_in(&mut self, packet: PacketC, renderer: &mut SpriteRenderer) { match packet { + PacketC::Init { id } => self.my_id = id, PacketC::Data { data } => { self.tilemap.init(&data.tile_names, renderer.metadata()); } @@ -62,11 +70,80 @@ impl Game { } self.tilemap.set(tile, kind, neighbors); } + PacketC::AddPlayer { + id, + position, + character, + name, + } => { + info!("add player {} {name:?}", id.0); + self.players.insert( + id, + Player { + character, + position, + name, + boosting: false, + rot: 0., + }, + ); + } + PacketC::RemovePlayer { id } => { + info!("remove player {}", id.0); + self.players.remove(&id); + } + PacketC::Position { + player, + pos, + rot, + boosting, + } => { + if let Some(p) = self.players.get_mut(&player) { + p.position = pos; + p.rot = rot; + p.boosting = boosting; + } + } + PacketC::MoveItem { from, to } => (), + PacketC::SetItem { location, item } => (), + PacketC::SetProgress { + item, + progress, + warn, + } => (), + PacketC::Collide { player, force } => (), + PacketC::Communicate { + player, + message, + persist, + } => (), + PacketC::ServerMessage { text } => (), + PacketC::Score { + points, + demands_failed, + demands_completed, + time_remaining, + } => (), + PacketC::SetIngame { state, lobby } => (), + PacketC::Error { message } => { + warn!("server error: {message:?}") + } _ => (), } } pub fn draw(&self, ctx: &mut SpriteRenderer) { - self.tilemap.draw(ctx) + self.tilemap.draw(ctx); + + for p in self.players.values() { + let src = ctx.misc_textures().player; + let dst = FRect::new( + p.position.x - src.width() as f32 / 32. / 2., + p.position.y + 1. - src.height() as f32 / 24., + src.width() as f32 / 32., + src.height() as f32 / 24., + ); + ctx.draw(((dst.y + dst.h + 1.) * 24.) as i32, src, dst); + } } } |