aboutsummaryrefslogtreecommitdiff
path: root/light-client/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'light-client/src/game.rs')
-rw-r--r--light-client/src/game.rs79
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);
+ }
}
}