aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--light-client/assets/connect.csv1
-rw-r--r--light-client/assets/misc.ini2
-rw-r--r--light-client/assets/tiles.ini10
-rw-r--r--light-client/src/game.rs33
-rw-r--r--light-client/src/tilemap.rs41
5 files changed, 71 insertions, 16 deletions
diff --git a/light-client/assets/connect.csv b/light-client/assets/connect.csv
new file mode 100644
index 00000000..9278f64c
--- /dev/null
+++ b/light-client/assets/connect.csv
@@ -0,0 +1 @@
+wall,door,wall-window,counter-window
diff --git a/light-client/assets/misc.ini b/light-client/assets/misc.ini
index 667517db..60a91e77 100644
--- a/light-client/assets/misc.ini
+++ b/light-client/assets/misc.ini
@@ -1,7 +1,7 @@
player=player
-solid=solid
costumer=costumer
interact-target-thick=interact_target_thick
interact-target-thin=interact_target_thin
+solid=solid
particle=particle
diff --git a/light-client/assets/tiles.ini b/light-client/assets/tiles.ini
index 080b7db2..e6adf4c5 100644
--- a/light-client/assets/tiles.ini
+++ b/light-client/assets/tiles.ini
@@ -1,8 +1,8 @@
chair=floor,chair
table=floor,table
-door=ns:floor,door_ns
-door=we:floor,door_we
+door=ns:floor,door_we
+door=we:floor,door_ns
wall=:wall_ns
wall=w:wall_ns
@@ -21,9 +21,11 @@ wall=wns:wall_wns
wall=ens:wall_wns~hflip
wall=wens:wall_wens
-window=ns:wall_ns
-window=we:window
+wall-window=window
+wall-window=ns:wall_ns
+wall-window=we:window
+counter-window=counter_window_ns
counter-window=ns:counter_window_ns
counter-window=we:counter_window_we
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