diff options
-rw-r--r-- | light-client/assets/connect.csv | 1 | ||||
-rw-r--r-- | light-client/assets/misc.ini | 2 | ||||
-rw-r--r-- | light-client/assets/tiles.ini | 10 | ||||
-rw-r--r-- | light-client/src/game.rs | 33 | ||||
-rw-r--r-- | light-client/src/tilemap.rs | 41 |
5 files changed, 71 insertions, 16 deletions
diff --git a/light-client/assets/connect.csv b/light-client/assets/connect.csv new file mode 100644 index 00000000..9278f64c --- /dev/null +++ b/light-client/assets/connect.csv @@ -0,0 +1 @@ +wall,door,wall-window,counter-window diff --git a/light-client/assets/misc.ini b/light-client/assets/misc.ini index 667517db..60a91e77 100644 --- a/light-client/assets/misc.ini +++ b/light-client/assets/misc.ini @@ -1,7 +1,7 @@ player=player -solid=solid costumer=costumer interact-target-thick=interact_target_thick interact-target-thin=interact_target_thin +solid=solid particle=particle diff --git a/light-client/assets/tiles.ini b/light-client/assets/tiles.ini index 080b7db2..e6adf4c5 100644 --- a/light-client/assets/tiles.ini +++ b/light-client/assets/tiles.ini @@ -1,8 +1,8 @@ chair=floor,chair table=floor,table -door=ns:floor,door_ns -door=we:floor,door_we +door=ns:floor,door_we +door=we:floor,door_ns wall=:wall_ns wall=w:wall_ns @@ -21,9 +21,11 @@ wall=wns:wall_wns wall=ens:wall_wns~hflip wall=wens:wall_wens -window=ns:wall_ns -window=we:window +wall-window=window +wall-window=ns:wall_ns +wall-window=we:window +counter-window=counter_window_ns counter-window=ns:counter_window_ns counter-window=we:counter_window_we diff --git a/light-client/src/game.rs b/light-client/src/game.rs index 1425a3f8..13e50a2e 100644 --- a/light-client/src/game.rs +++ b/light-client/src/game.rs @@ -16,7 +16,11 @@ */ use crate::{ - render::{misc::MiscTextures, sprite::Sprite, AtlasLayout, SpriteRenderer}, + render::{ + misc::MiscTextures, + sprite::{Sprite, SpriteDraw}, + AtlasLayout, SpriteRenderer, + }, tilemap::Tilemap, }; use hurrycurry_protocol::{ @@ -297,19 +301,38 @@ impl Game { for p in self.players.values() { ctx.draw_world(self.misc_textures.player.at(p.movement.position)); if let Some(item) = &p.item { - item.draw(ctx, &self.item_sprites) + item.draw(ctx, &self.item_sprites, &self.misc_textures) } } for tile in self.tiles.values() { if let Some(item) = &tile.item { - item.draw(ctx, &self.item_sprites) + item.draw(ctx, &self.item_sprites, &self.misc_textures) } } } } impl Item { - pub fn draw(&self, ctx: &mut SpriteRenderer, item_sprites: &[Sprite]) { - ctx.draw_world(item_sprites[self.kind.0].at(self.position)) + pub fn draw(&self, ctx: &mut SpriteRenderer, item_sprites: &[Sprite], misc: &MiscTextures) { + ctx.draw_world(item_sprites[self.kind.0].at(self.position)); + if let Some((progress, warn)) = self.progress { + let (bg, fg) = if warn { + ([100, 0, 0, 200], [255, 0, 0, 200]) + } else { + ([0, 100, 0, 200], [0, 255, 0, 200]) + }; + ctx.draw_world(SpriteDraw::overlay( + misc.solid, + self.position + Vec2::new(-0.5, -1.3), + Vec2::new(1., 0.2), + Some(bg), + )); + ctx.draw_world(SpriteDraw::overlay( + misc.solid, + self.position + Vec2::new(-0.5, -1.3), + Vec2::new(progress, 0.2), + Some(fg), + )) + } } } diff --git a/light-client/src/tilemap.rs b/light-client/src/tilemap.rs index e7341efa..768f79ba 100644 --- a/light-client/src/tilemap.rs +++ b/light-client/src/tilemap.rs @@ -16,8 +16,9 @@ */ use hurrycurry_protocol::{glam::IVec2, TileIndex}; +use log::warn; use sdl2::rect::Rect; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use crate::render::{ sprite::{Sprite, SpriteDraw}, @@ -26,19 +27,44 @@ use crate::render::{ #[derive(Default)] pub struct Tilemap { + connect_group_by_tile: Vec<Option<usize>>, + connect_members_by_group: Vec<HashSet<Option<TileIndex>>>, tile_srcs: Vec<[Rect; 16]>, tiles: HashMap<IVec2, SpriteDraw>, } impl Tilemap { pub fn init(&mut self, tile_names: &[String], sprite_rects: &HashMap<String, Rect>) { + let tile_index = tile_names + .iter() + .enumerate() + .map(|(t, i)| (i.to_string(), t)) + .collect::<HashMap<_, _>>(); + self.connect_group_by_tile = vec![None; tile_names.len()]; + self.connect_members_by_group = include_str!("../assets/connect.csv") + .lines() + .enumerate() + .map(|(gid, line)| { + line.split(",") + .flat_map(|tile| tile_index.get(tile).copied()) + .map(|ti| { + self.connect_group_by_tile[ti] = Some(gid); + Some(TileIndex(ti)) + }) + .collect::<HashSet<_>>() + }) + .collect::<Vec<_>>(); + self.tile_srcs = tile_names .iter() .map(|name| { let fallback = sprite_rects .get(&format!("{name}+a")) .copied() - .unwrap_or(Rect::new(0, 0, 0, 0)); + .unwrap_or_else(|| { + warn!("no sprite for tile {name:?}"); + Rect::new(0, 0, 0, 0) + }); [ sprite_rects.get(&format!("{name}+")), @@ -70,10 +96,13 @@ impl Tilemap { }; let mut idx = 0; - idx |= 0b0100 * (Some(tile) == neighbors[0]) as usize; - idx |= 0b0001 * (Some(tile) == neighbors[1]) as usize; - idx |= 0b1000 * (Some(tile) == neighbors[2]) as usize; - idx |= 0b0010 * (Some(tile) == neighbors[3]) as usize; + if let Some(gid) = self.connect_group_by_tile[tile.0] { + let cgroup = &self.connect_members_by_group[gid]; + idx |= 0b0100 * (cgroup.contains(&neighbors[0])) as usize; + idx |= 0b0001 * (cgroup.contains(&neighbors[1])) as usize; + idx |= 0b1000 * (cgroup.contains(&neighbors[2])) as usize; + idx |= 0b0010 * (cgroup.contains(&neighbors[3])) as usize; + } let src = self.tile_srcs[tile.0][idx]; self.tiles |