P14-02: Add buildable Mana warp (A07)

2x2 FRONT warp at 3000G/30 materials/360 min, 15G/day and 1 Mana upkeep.
Every completed warp pair is linked by one path connector, so crossing is a
single step; a 3-Mana fare per rider is charged once in the step's tick.
Warps close while either end is unpowered, the reserve is empty or below one
fare, and blocked arrivals offer no step. Saves validate the derived links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Takeshi
2026-10-20 10:45:28 +09:00
co-authored by Claude Opus 5.5
parent 7e6e540837
commit 0cfaec1626
14 changed files with 431 additions and 9 deletions
@@ -35,6 +35,7 @@ const KIND_GUEST_ELEVATOR: StringName = &"guest_elevator"
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 SUPPORTED_KINDS: Array[StringName] = [
KIND_GUEST_CORRIDOR,
KIND_SERVICE_CORRIDOR,
@@ -43,6 +44,7 @@ const SUPPORTED_KINDS: Array[StringName] = [
KIND_SERVICE_ELEVATOR,
KIND_GUEST_STAIRS,
KIND_SERVICE_STAIRS,
KIND_MANA_WARP,
]
const KNOWN_KINDS: Array[StringName] = [
KIND_GUEST_CORRIDOR,
@@ -52,6 +54,7 @@ const KNOWN_KINDS: Array[StringName] = [
KIND_SERVICE_ELEVATOR,
KIND_GUEST_STAIRS,
KIND_SERVICE_STAIRS,
KIND_MANA_WARP,
]
const UNSUPPORTED_VERTICAL_KINDS: Array[StringName] = []
@@ -692,6 +695,17 @@ static func _kind_schema(kind: StringName) -> Dictionary:
&"guest_access", &"movement", &"schema_facility_proxy", &"vertical_connector",
]),
}
KIND_MANA_WARP:
# Walkable FRONT cells; WarpService links every warp pair (A07).
return {
&"layer": PathType.FRONT,
&"footprint": Vector2i(2, 2),
&"pass_through": true,
&"staff_only": false,
&"tags": _sorted_name_array([
&"guest_access", &"movement", &"schema_facility_proxy", &"warp",
]),
}
KIND_SERVICE_ELEVATOR:
return {
&"layer": PathType.BACK,
+9
View File
@@ -1420,6 +1420,15 @@ func has_connector(connector_id: StringName) -> bool:
return _connectors.has(connector_id)
func get_connector_ids_with_prefix(prefix: String) -> Array[StringName]:
var ids: Array[StringName] = []
for connector_id: Variant in _connectors:
if String(connector_id).begins_with(prefix):
ids.append(StringName(connector_id))
ids.sort_custom(func(a: StringName, b: StringName) -> bool: return String(a) < String(b))
return ids
func get_connector(connector_id: StringName) -> Dictionary:
if not _connectors.has(connector_id):
return {}