diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-16 22:05:51 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-16 22:05:51 +0200 |
commit | 86a648021dd162570d995d2fd330448d8e5f2dd2 (patch) | |
tree | c96aaf3776675ef96e30d217bf0622c2d69cd31a /light-client/src | |
parent | fb30f4d264863291aaa879fb6f0908d54f346b00 (diff) | |
download | hurrycurry-86a648021dd162570d995d2fd330448d8e5f2dd2.tar hurrycurry-86a648021dd162570d995d2fd330448d8e5f2dd2.tar.bz2 hurrycurry-86a648021dd162570d995d2fd330448d8e5f2dd2.tar.zst |
connected walls
Diffstat (limited to 'light-client/src')
-rw-r--r-- | light-client/src/game.rs | 33 | ||||
-rw-r--r-- | light-client/src/tilemap.rs | 41 |
2 files changed, 63 insertions, 11 deletions
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 |