P14-02: Split warps into guest FRONT and staff BACK service warp (A08)

The FRONT Mana warp is guest-only: its connectors carry the "!staff" access,
which path access checks treat as open to everyone except staff. A new 2x2
BACK service warp links only to other service warps for staff, with A07
values. Registry and palette now hold 25 definitions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Takeshi
2026-10-20 13:48:14 +09:00
co-authored by Claude Opus 5.5
parent 619b5e07ed
commit 8917c190cf
16 changed files with 102 additions and 25 deletions
@@ -36,6 +36,7 @@ const KIND_SERVICE_ELEVATOR: StringName = &"service_elevator"
const KIND_GUEST_STAIRS: StringName = &"guest_stairs"
const KIND_SERVICE_STAIRS: StringName = &"service_stairs"
const KIND_MANA_WARP: StringName = &"mana_warp"
const KIND_SERVICE_WARP: StringName = &"service_warp"
const SUPPORTED_KINDS: Array[StringName] = [
KIND_GUEST_CORRIDOR,
KIND_SERVICE_CORRIDOR,
@@ -45,6 +46,7 @@ const SUPPORTED_KINDS: Array[StringName] = [
KIND_GUEST_STAIRS,
KIND_SERVICE_STAIRS,
KIND_MANA_WARP,
KIND_SERVICE_WARP,
]
const KNOWN_KINDS: Array[StringName] = [
KIND_GUEST_CORRIDOR,
@@ -55,6 +57,7 @@ const KNOWN_KINDS: Array[StringName] = [
KIND_GUEST_STAIRS,
KIND_SERVICE_STAIRS,
KIND_MANA_WARP,
KIND_SERVICE_WARP,
]
const UNSUPPORTED_VERTICAL_KINDS: Array[StringName] = []
@@ -706,6 +709,16 @@ static func _kind_schema(kind: StringName) -> Dictionary:
&"guest_access", &"movement", &"schema_facility_proxy", &"warp",
]),
}
KIND_SERVICE_WARP:
return {
&"layer": PathType.BACK,
&"footprint": Vector2i(2, 2),
&"pass_through": true,
&"staff_only": true,
&"tags": _sorted_name_array([
&"movement", &"schema_facility_proxy", &"staff_only", &"warp",
]),
}
KIND_SERVICE_ELEVATOR:
return {
&"layer": PathType.BACK,
+5 -1
View File
@@ -2099,7 +2099,11 @@ func _edge_meets_vertical_policy(from_cell: Vector3i, edge: Dictionary) -> bool:
func _edge_is_accessible(edge: Dictionary, allowed_access_ids: Array[StringName]) -> bool:
var required_access: StringName = edge[&"access_id"]
if not required_access.is_empty() and required_access not in allowed_access_ids:
# "!id" is open to everyone except actors that carry id (guest-only warp).
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 false
var connector_id: StringName = edge[&"connector_id"]
if connector_id.is_empty():