aboutsummaryrefslogtreecommitdiff
path: root/light-client/src/tilemap.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-16 02:02:14 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-16 02:02:14 +0200
commit1ab54f3155eff431fb1bd65a0bcad71701e9d9b5 (patch)
tree8f58d6846a45db402cf167f62960ae6647ebd8d8 /light-client/src/tilemap.rs
parent1671370f1e95b3ae0cdede6e16511fd91ea4feac (diff)
downloadhurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar
hurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar.bz2
hurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar.zst
render connected tiles
Diffstat (limited to 'light-client/src/tilemap.rs')
-rw-r--r--light-client/src/tilemap.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/light-client/src/tilemap.rs b/light-client/src/tilemap.rs
new file mode 100644
index 00000000..cd0f13ac
--- /dev/null
+++ b/light-client/src/tilemap.rs
@@ -0,0 +1,77 @@
+use crate::sprite_renderer::SpriteRenderer;
+use hurrycurry_protocol::{glam::IVec2, TileIndex};
+use sdl2::rect::{FRect, Rect};
+use std::collections::HashMap;
+
+#[derive(Default)]
+pub struct Tilemap {
+ tile_srcs: Vec<[Rect; 16]>,
+ tiles: HashMap<IVec2, (Rect, FRect)>,
+}
+
+impl Tilemap {
+ pub fn init(&mut self, tile_names: &[String], sprite_rects: &HashMap<String, Rect>) {
+ 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));
+
+ [
+ sprite_rects.get(&format!("{name}+")),
+ sprite_rects.get(&format!("{name}+w")),
+ sprite_rects.get(&format!("{name}+e")),
+ sprite_rects.get(&format!("{name}+we")),
+ sprite_rects.get(&format!("{name}+n")),
+ sprite_rects.get(&format!("{name}+wn")),
+ sprite_rects.get(&format!("{name}+en")),
+ sprite_rects.get(&format!("{name}+wen")),
+ sprite_rects.get(&format!("{name}+s")),
+ sprite_rects.get(&format!("{name}+ws")),
+ sprite_rects.get(&format!("{name}+es")),
+ sprite_rects.get(&format!("{name}+wes")),
+ sprite_rects.get(&format!("{name}+ns")),
+ sprite_rects.get(&format!("{name}+wns")),
+ sprite_rects.get(&format!("{name}+ens")),
+ sprite_rects.get(&format!("{name}+wens")),
+ ]
+ .map(|e| e.copied().unwrap_or(fallback))
+ })
+ .collect();
+ }
+
+ pub fn set(&mut self, pos: IVec2, tile: Option<TileIndex>, neighbors: [Option<TileIndex>; 4]) {
+ let Some(tile) = tile else {
+ self.tiles.remove(&pos);
+ return;
+ };
+
+ 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;
+
+ let src = self.tile_srcs[tile.0][idx];
+ self.tiles.insert(
+ pos,
+ (
+ src,
+ FRect::new(
+ pos.x as f32,
+ pos.y as f32 + 1. - src.height() as f32 / 24.,
+ src.width() as f32 / 32.,
+ src.height() as f32 / 24.,
+ ),
+ ),
+ );
+ }
+
+ pub fn draw(&self, ctx: &mut SpriteRenderer) {
+ for &(src, dst) in self.tiles.values() {
+ ctx.draw(((dst.y + dst.h) * 32.) as i32, src, dst);
+ }
+ }
+}