diff options
Diffstat (limited to 'light-client/src/tilemap.rs')
-rw-r--r-- | light-client/src/tilemap.rs | 41 |
1 files changed, 35 insertions, 6 deletions
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 |