fix(client): decode tile_kind and fix entity alignment (#412)
Protocol decoder now reads tile_kind from VisibleTile and maps it to the client's tile type string (floor/wall/door/object). GameState falls back to visible_tiles when the test-mode tiles array is absent, enabling live server tile rendering. Fix entity-to-tile alignment: server sends tile-center render coords (tile 16 -> 16.5) but entity renderer was using raw floats, placing entities half a tile off. Now floors the coords to get the tile index. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -43,8 +43,16 @@ func apply_snapshot(snapshot: Dictionary) -> void:
|
|||||||
push_warning("GameState: no Player entity found in %d entities" % [
|
push_warning("GameState: no Player entity found in %d entities" % [
|
||||||
visible_entities.size()])
|
visible_entities.size()])
|
||||||
|
|
||||||
|
# Tiles for rendering: test mode sends "tiles", live server sends tile data in "visible_tiles"
|
||||||
if snapshot.has("tiles"):
|
if snapshot.has("tiles"):
|
||||||
visible_tiles = snapshot.tiles
|
visible_tiles = snapshot.tiles
|
||||||
|
elif snapshot.has("visible_tiles") and snapshot.visible_tiles is Array and snapshot.visible_tiles.size() > 0:
|
||||||
|
# Live server: visible_tiles now includes type from tile_kind field
|
||||||
|
var has_type := false
|
||||||
|
if snapshot.visible_tiles.size() > 0 and snapshot.visible_tiles[0] is Dictionary:
|
||||||
|
has_type = snapshot.visible_tiles[0].has("type")
|
||||||
|
if has_type:
|
||||||
|
visible_tiles = snapshot.visible_tiles
|
||||||
|
|
||||||
if snapshot.has("visible_positions"):
|
if snapshot.has("visible_positions"):
|
||||||
visible_positions.clear()
|
visible_positions.clear()
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ static func decode_snapshot(bytes: PackedByteArray) -> Variant:
|
|||||||
if raw_facing is String:
|
if raw_facing is String:
|
||||||
player_facing = raw_facing
|
player_facing = raw_facing
|
||||||
|
|
||||||
# visible_tiles: Array of {x, y, z, visibility}
|
# visible_tiles: Array of {x, y, z, visibility, tile_kind}
|
||||||
var visible_tiles: Array = []
|
var visible_tiles: Array = []
|
||||||
var raw_vtiles: Variant = raw.get("visible_tiles")
|
var raw_vtiles: Variant = raw.get("visible_tiles")
|
||||||
if raw_vtiles is Array:
|
if raw_vtiles is Array:
|
||||||
@@ -77,6 +77,12 @@ static func decode_snapshot(bytes: PackedByteArray) -> Variant:
|
|||||||
var vis: Variant = raw_tile.get("visibility")
|
var vis: Variant = raw_tile.get("visibility")
|
||||||
if vis is String:
|
if vis is String:
|
||||||
tile_entry["visibility"] = vis
|
tile_entry["visibility"] = vis
|
||||||
|
# tile_kind: Floor/Wall/Door/Object — map to client tile type strings
|
||||||
|
var kind: Variant = raw_tile.get("tile_kind")
|
||||||
|
if kind is String:
|
||||||
|
tile_entry["type"] = kind.to_lower()
|
||||||
|
else:
|
||||||
|
tile_entry["type"] = "floor"
|
||||||
visible_tiles.append(tile_entry)
|
visible_tiles.append(tile_entry)
|
||||||
|
|
||||||
# v4: nearby_interactions (#404/#405)
|
# v4: nearby_interactions (#404/#405)
|
||||||
|
|||||||
@@ -71,11 +71,12 @@ func _update_entity_node(entity_id: int, entity_data: Dictionary) -> void:
|
|||||||
|
|
||||||
var entity_node = entity_nodes[entity_id]
|
var entity_node = entity_nodes[entity_id]
|
||||||
|
|
||||||
# Update position from x, y fields (Protocol format), centered within tile
|
# Update position from x, y fields (Protocol format), centered within tile.
|
||||||
|
# Server sends tile-center coords (tile 16 → 16.5), floor to get tile index.
|
||||||
if entity_data.has("x") and entity_data.has("y"):
|
if entity_data.has("x") and entity_data.has("y"):
|
||||||
entity_node.position = Vector2(
|
entity_node.position = Vector2(
|
||||||
entity_data.x * TILE_SIZE + ENTITY_OFFSET,
|
floorf(entity_data.x) * TILE_SIZE + ENTITY_OFFSET,
|
||||||
entity_data.y * TILE_SIZE + ENTITY_OFFSET
|
floorf(entity_data.y) * TILE_SIZE + ENTITY_OFFSET
|
||||||
)
|
)
|
||||||
|
|
||||||
# v2: Peripheral vision dimming (D-015)
|
# v2: Peripheral vision dimming (D-015)
|
||||||
|
|||||||
Reference in New Issue
Block a user