diff --git a/client/tests/fixtures/msgpack/snapshot_v2_full.msgpack b/client/tests/fixtures/msgpack/snapshot_v2_full.msgpack index b63af93c9..7fe0e2d3d 100644 Binary files a/client/tests/fixtures/msgpack/snapshot_v2_full.msgpack and b/client/tests/fixtures/msgpack/snapshot_v2_full.msgpack differ diff --git a/server/src/bridge/types.rs b/server/src/bridge/types.rs index 06e9cb311..056bc47f0 100644 --- a/server/src/bridge/types.rs +++ b/server/src/bridge/types.rs @@ -73,7 +73,7 @@ pub enum FacingDirection { Northwest, } -/// A tile visible to the observer with its visibility quality +/// A tile visible to the observer with its visibility quality and type #[derive(Debug, Clone, Serialize, Deserialize)] pub struct VisibleTile { pub x: i32, @@ -81,6 +81,20 @@ pub struct VisibleTile { pub z: i32, /// Which vision cone sector this tile falls in (D-015) pub visibility: VisibilitySector, + /// Tile type for client rendering (floor, wall, door, object) + #[serde(default)] + pub tile_kind: TileKind, +} + +/// Tile type for rendering. Derived from WalkabilityMap on the server side. +/// v0.1: Floor (walkable) and Wall (blocked). Door and Object for future use. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)] +pub enum TileKind { + #[default] + Floor, + Wall, + Door, + Object, } /// Vision cone sectors per D-015. diff --git a/server/src/perception/query.rs b/server/src/perception/query.rs index a632191b2..92114bd0e 100644 --- a/server/src/perception/query.rs +++ b/server/src/perception/query.rs @@ -9,7 +9,7 @@ use std::collections::{HashMap, HashSet}; use bevy_ecs::prelude::*; -use crate::bridge::types::{FacingDirection, VisibilitySector, VisibleTile}; +use crate::bridge::types::{FacingDirection, TileKind, VisibilitySector, VisibleTile}; use crate::perception::shadowcast::compute_fov; use crate::perception::vision_cone::{apply_vision_cone, VisionConeConfig}; use crate::simulation::movement::{TilePosition, WalkabilityMap}; @@ -67,11 +67,19 @@ impl PerceptionQuery for NaturalVision { let visible_tiles = cone_tiles .iter() - .map(|&(x, y, sector)| VisibleTile { - x, - y, - z, - visibility: sector, + .map(|&(x, y, sector)| { + let tile_kind = if walkability.can_move_to(&TilePosition::new(x, y, z)) { + TileKind::Floor + } else { + TileKind::Wall + }; + VisibleTile { + x, + y, + z, + visibility: sector, + tile_kind, + } }) .collect(); diff --git a/server/tests/gen_fixtures.rs b/server/tests/gen_fixtures.rs index 3ba0d4f78..9cf73a5c9 100644 --- a/server/tests/gen_fixtures.rs +++ b/server/tests/gen_fixtures.rs @@ -176,18 +176,21 @@ fn generate_msgpack_fixtures() { y: 10, z: 0, visibility: VisibilitySector::Forward, + tile_kind: TileKind::Floor, }, VisibleTile { x: 11, y: 10, z: 0, visibility: VisibilitySector::Peripheral, + tile_kind: TileKind::Floor, }, VisibleTile { x: 10, y: 9, z: 0, visibility: VisibilitySector::Forward, + tile_kind: TileKind::Floor, }, ], nearby_interactions: vec![], diff --git a/server/tests/serialization.rs b/server/tests/serialization.rs index 4b5f2ca91..fc2dfeef2 100644 --- a/server/tests/serialization.rs +++ b/server/tests/serialization.rs @@ -205,12 +205,14 @@ fn snapshot_v2_fields_roundtrip() { y: 10, z: 0, visibility: VisibilitySector::Forward, + tile_kind: TileKind::Floor, }, VisibleTile { x: 6, y: 10, z: 0, visibility: VisibilitySector::Peripheral, + tile_kind: TileKind::Wall, }, ], nearby_interactions: vec![],