aboutsummaryrefslogtreecommitdiff
path: root/light-client/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-16 22:05:51 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-16 22:05:51 +0200
commit86a648021dd162570d995d2fd330448d8e5f2dd2 (patch)
treec96aaf3776675ef96e30d217bf0622c2d69cd31a /light-client/src
parentfb30f4d264863291aaa879fb6f0908d54f346b00 (diff)
downloadhurrycurry-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.rs33
-rw-r--r--light-client/src/tilemap.rs41
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