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 | 
