fix(simulation): add TileKind to VisibleTile wire protocol (#412)

Server was sending visible_tiles without tile type data, so the client
could not distinguish floor from wall in live mode. Add TileKind enum
(Floor/Wall/Door/Object) to VisibleTile, populated from WalkabilityMap
in the NaturalVision perception query. Update test fixtures to include
the new field. Uses #[serde(default)] for backward compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 02:07:19 +01:00
co-authored by Claude Opus 4.6
parent 33f4f6078c
commit 29c5003403
5 changed files with 34 additions and 7 deletions
Binary file not shown.
+15 -1
View File
@@ -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.
+14 -6
View File
@@ -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();
+3
View File
@@ -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![],
+2
View File
@@ -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![],