diff options
Diffstat (limited to 'light-client/src/game.rs')
-rw-r--r-- | light-client/src/game.rs | 103 |
1 files changed, 79 insertions, 24 deletions
diff --git a/light-client/src/game.rs b/light-client/src/game.rs index ac5c3571..1425a3f8 100644 --- a/light-client/src/game.rs +++ b/light-client/src/game.rs @@ -16,7 +16,7 @@ */ use crate::{ - render::{sprite::Sprite, MiscTextures, SpriteRenderer}, + render::{misc::MiscTextures, sprite::Sprite, AtlasLayout, SpriteRenderer}, tilemap::Tilemap, }; use hurrycurry_protocol::{ @@ -42,25 +42,38 @@ pub struct Game { misc_textures: MiscTextures, item_sprites: Vec<Sprite>, movement_send_cooldown: f32, + interacting: bool, + score: Score, +} + +#[derive(Debug, Default)] +pub struct Score { + points: i64, + demands_failed: usize, + demands_completed: usize, + time_remaining: f32, } pub struct Tile { - kind: TileIndex, + _kind: TileIndex, item: Option<Item>, } + pub struct Player { movement: MovementBase, item: Option<Item>, - name: String, - character: i32, + _name: String, + _character: i32, } + pub struct Item { position: Vec2, kind: ItemIndex, + progress: Option<(f32, bool)>, } impl Game { - pub fn new(renderer: &SpriteRenderer) -> Self { + pub fn new(layout: &AtlasLayout) -> Self { Self { tiles: HashMap::new(), players: HashMap::new(), @@ -69,8 +82,10 @@ impl Game { data: ClientGamedata::default(), collision_map: HashSet::new(), movement_send_cooldown: 0., - misc_textures: MiscTextures::init(renderer), + misc_textures: MiscTextures::init(layout), item_sprites: Vec::new(), + interacting: false, + score: Score::default(), } } @@ -78,18 +93,21 @@ impl Game { match packet { PacketC::Init { id } => self.my_id = id, PacketC::Data { data } => { - self.tilemap.init(&data.tile_names, renderer.metadata()); + self.tilemap.init(&data.tile_names, renderer.atlas_layout()); self.item_sprites = data .item_names .iter() .map(|name| { Sprite::new( renderer - .metadata() - .get(&format!("{name}:a")) + .atlas_layout() + .get(&format!("{name}+a")) .copied() - .unwrap_or(Rect::new(0, 0, 32, 24)), - Vec2::ZERO, + .unwrap_or_else(|| { + warn!("no sprite for item {name:?}"); + Rect::new(0, 0, 32, 24) + }), + Vec2::new(0., 0.0), 0.1, ) }) @@ -102,7 +120,13 @@ impl Game { neighbors, } => { if let Some(kind) = kind { - self.tiles.insert(tile, Tile { kind, item: None }); + self.tiles.insert( + tile, + Tile { + _kind: kind, + item: None, + }, + ); if self.data.tile_collide[kind.0] { self.collision_map.remove(&tile); } else { @@ -124,8 +148,8 @@ impl Game { self.players.insert( id, Player { - character, - name, + _character: character, + _name: name, item: None, movement: MovementBase { position, @@ -161,27 +185,40 @@ impl Game { *self.get_item(location) = item.map(|kind| Item { kind, position: Vec2::ZERO, + progress: None, }) } PacketC::SetProgress { item, progress, warn, + } => { + self.get_item(item).as_mut().unwrap().progress = progress.map(|s| (s, warn)); + } + PacketC::Collide { + player: _, + force: _, } => (), - PacketC::Collide { player, force } => (), - PacketC::Communicate { - player, - message, - persist, - } => (), - PacketC::ServerMessage { text } => (), + PacketC::Communicate { .. } => { + // TODO + } + PacketC::ServerMessage { text: _ } => { + // TODO + } PacketC::Score { points, demands_failed, demands_completed, time_remaining, - } => (), - PacketC::SetIngame { state, lobby } => (), + } => { + self.score.points = points; + self.score.demands_completed = demands_completed; + self.score.demands_failed = demands_failed; + self.score.time_remaining = time_remaining.unwrap_or(-1.); + } + PacketC::SetIngame { state: _, lobby: _ } => { + // TODO + } PacketC::Error { message } => { warn!("server error: {message:?}") } @@ -197,7 +234,7 @@ impl Game { } pub fn tick(&mut self, dt: f32, keyboard: &KeyboardState, packet_out: &mut VecDeque<PacketS>) { - let direction = IVec2::new( + let mut direction = IVec2::new( keyboard.is_scancode_pressed(Scancode::D) as i32 - keyboard.is_scancode_pressed(Scancode::A) as i32, keyboard.is_scancode_pressed(Scancode::S) as i32 @@ -208,12 +245,30 @@ impl Game { let interact = keyboard.is_scancode_pressed(Scancode::Space) | keyboard.is_scancode_pressed(Scancode::J); + if interact { + direction *= 0.; + } + self.movement_send_cooldown -= dt; let send_movement = self.movement_send_cooldown < 0.; if send_movement { self.movement_send_cooldown += 0.04 } + self.score.time_remaining -= dt; + self.score.time_remaining -= self.score.time_remaining.max(0.); + + if interact != self.interacting { + if interact { + packet_out.push_back(PacketS::Interact { + pos: Some(self.players[&self.my_id].movement.get_interact_target()), + }); + } else { + packet_out.push_back(PacketS::Interact { pos: None }); + } + self.interacting = interact; + } + for (pid, player) in &mut self.players { if *pid == self.my_id { let movement_packet = |