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