Path: Apply "!id" access to layer-crossing and no-route diagnostics
A stopped guest warp now reports CONNECTOR_UNAVAILABLE instead of GOAL_UNREACHABLE (P14-02 review r2 follow-up). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
28e3ffe146
commit
0f23d34e9f
@@ -2097,13 +2097,16 @@ func _edge_meets_vertical_policy(from_cell: Vector3i, edge: Dictionary) -> bool:
|
||||
or not StringName(edge[&"connector_id"]).is_empty() or edge[&"movement_type"] != MOVEMENT_WALK
|
||||
|
||||
|
||||
func _edge_is_accessible(edge: Dictionary, allowed_access_ids: Array[StringName]) -> bool:
|
||||
var required_access: StringName = edge[&"access_id"]
|
||||
# "!id" is open to everyone except actors that carry id (guest-only warp).
|
||||
## "" is public, "id" needs id, and "!id" is open to everyone except actors
|
||||
## that carry id (guest-only warp).
|
||||
static func _access_id_permits(required_access: StringName, allowed_access_ids: Array[StringName]) -> bool:
|
||||
if String(required_access).begins_with("!"):
|
||||
if StringName(String(required_access).substr(1)) in allowed_access_ids:
|
||||
return false
|
||||
elif not required_access.is_empty() and required_access not in allowed_access_ids:
|
||||
return StringName(String(required_access).substr(1)) not in allowed_access_ids
|
||||
return required_access.is_empty() or required_access in allowed_access_ids
|
||||
|
||||
|
||||
func _edge_is_accessible(edge: Dictionary, allowed_access_ids: Array[StringName]) -> bool:
|
||||
if not _access_id_permits(edge[&"access_id"], allowed_access_ids):
|
||||
return false
|
||||
var connector_id: StringName = edge[&"connector_id"]
|
||||
if connector_id.is_empty():
|
||||
@@ -2190,8 +2193,7 @@ func _cell_is_temporarily_blocked(cell: Vector3i) -> bool:
|
||||
## Only the absence of any permitted directed crossing proves unreachable.
|
||||
func _has_permitted_layer_crossing(from_layer: int, to_layer: int, allowed_access_ids: Array[StringName]) -> bool:
|
||||
for connector: Dictionary in _connectors.values():
|
||||
var access_id: StringName = connector[&"access_id"]
|
||||
if not access_id.is_empty() and access_id not in allowed_access_ids:
|
||||
if not _access_id_permits(connector[&"access_id"], allowed_access_ids):
|
||||
continue
|
||||
var from_cell: Vector3i = connector[&"from"]
|
||||
var to_cell: Vector3i = connector[&"to"]
|
||||
@@ -2257,8 +2259,7 @@ func _route_exists_with_overrides(
|
||||
neighbor_set[neighbor] = true
|
||||
for connector_id: StringName in connector_ids:
|
||||
var connector: Dictionary = _connectors[connector_id]
|
||||
var required_access: StringName = connector[&"access_id"]
|
||||
if not required_access.is_empty() and required_access not in allowed_access_ids:
|
||||
if not _access_id_permits(connector[&"access_id"], allowed_access_ids):
|
||||
continue
|
||||
if not allow_unavailable_connectors and not _connector_is_operational(connector):
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user