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:
Binary file not shown.
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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![],
|
||||
|
||||
@@ -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![],
|
||||
|
||||
Reference in New Issue
Block a user