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>
156 lines
5.4 KiB
GDScript
156 lines
5.4 KiB
GDScript
class_name FacilityCatalog
|
|
extends RefCounted
|
|
|
|
## Canonical MVP order from GAME_SPECIFICATION section 7.6.
|
|
##
|
|
## DefinitionRegistry deliberately sorts its query results by stable ID. This
|
|
## list instead preserves the design-table order for tools that present the
|
|
## baseline catalog to designers or players.
|
|
const BASELINE_FACILITY_IDS: Array[StringName] = [
|
|
&"reception",
|
|
&"standard_room",
|
|
&"cafeteria",
|
|
&"kitchen",
|
|
&"public_bath",
|
|
&"warehouse",
|
|
&"staff_waiting_room",
|
|
&"security_station",
|
|
&"tavern",
|
|
&"massage_room",
|
|
&"guest_elevator",
|
|
&"service_elevator",
|
|
&"staff_door",
|
|
&"guest_corridor",
|
|
&"service_corridor",
|
|
&"adult_private_room",
|
|
]
|
|
|
|
const FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/reception.tres",
|
|
"res://data/facilities/standard_room.tres",
|
|
"res://data/facilities/cafeteria.tres",
|
|
"res://data/facilities/kitchen.tres",
|
|
"res://data/facilities/public_bath.tres",
|
|
"res://data/facilities/warehouse.tres",
|
|
"res://data/facilities/staff_waiting_room.tres",
|
|
"res://data/facilities/security_station.tres",
|
|
"res://data/facilities/tavern.tres",
|
|
"res://data/facilities/massage_room.tres",
|
|
"res://data/facilities/guest_elevator.tres",
|
|
"res://data/facilities/service_elevator.tres",
|
|
"res://data/facilities/staff_door.tres",
|
|
"res://data/facilities/guest_corridor.tres",
|
|
"res://data/facilities/service_corridor.tres",
|
|
"res://data/facilities/adult_private_room.tres",
|
|
]
|
|
|
|
## Required movement infrastructure added after the original sixteen-facility
|
|
## catalog. Separate paths preserve the baseline design table and legacy scans.
|
|
## Original-spec facilities integrated into normal construction beyond baseline.
|
|
const ORIGINAL_FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/expansion/cleaning_room.tres",
|
|
"res://data/facilities/expansion/chapel.tres",
|
|
"res://data/facilities/expansion/premium_room.tres",
|
|
"res://data/facilities/expansion/staff_dormitory.tres",
|
|
]
|
|
|
|
const RESCUE_FACILITY_PATHS: Array[String] = ["res://data/facilities/rescue/infirmary.tres"]
|
|
|
|
const INFRASTRUCTURE_FACILITY_IDS: Array[StringName] = [
|
|
&"guest_stairs",
|
|
&"service_stairs",
|
|
]
|
|
|
|
const INFRASTRUCTURE_FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/infrastructure/guest_stairs.tres",
|
|
"res://data/facilities/infrastructure/service_stairs.tres",
|
|
]
|
|
|
|
## A07 Mana warp: original 10.7 transport, kept apart from the stair list.
|
|
const TRANSPORT_FACILITY_IDS: Array[StringName] = [&"mana_warp", &"service_warp"]
|
|
const TRANSPORT_FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/infrastructure/mana_warp.tres",
|
|
"res://data/facilities/infrastructure/service_warp.tres",
|
|
]
|
|
|
|
## Optional post-MVP expansion definitions. They live below a subdirectory so
|
|
## DefinitionRegistry's baseline directory scan remains exactly compatible with
|
|
## existing saves and the sixteen-facility acceptance fixture.
|
|
const EXPANSION_FACILITY_IDS: Array[StringName] = [
|
|
&"premium_room",
|
|
&"tea_lounge",
|
|
&"general_store",
|
|
&"clinic",
|
|
&"guild_counter",
|
|
&"underground_guest_room",
|
|
&"private_bath",
|
|
&"secret_tavern",
|
|
&"black_market",
|
|
&"vip_private_salon",
|
|
&"laundry",
|
|
&"cold_storage",
|
|
&"mana_control_room",
|
|
&"maintenance_workshop",
|
|
&"staff_dormitory",
|
|
&"waste_processing",
|
|
]
|
|
|
|
const EXPANSION_FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/expansion/premium_room.tres",
|
|
"res://data/facilities/expansion/tea_lounge.tres",
|
|
"res://data/facilities/expansion/general_store.tres",
|
|
"res://data/facilities/expansion/clinic.tres",
|
|
"res://data/facilities/expansion/guild_counter.tres",
|
|
"res://data/facilities/expansion/underground_guest_room.tres",
|
|
"res://data/facilities/expansion/private_bath.tres",
|
|
"res://data/facilities/expansion/secret_tavern.tres",
|
|
"res://data/facilities/expansion/black_market.tres",
|
|
"res://data/facilities/expansion/vip_private_salon.tres",
|
|
"res://data/facilities/expansion/laundry.tres",
|
|
"res://data/facilities/expansion/cold_storage.tres",
|
|
"res://data/facilities/expansion/mana_control_room.tres",
|
|
"res://data/facilities/expansion/maintenance_workshop.tres",
|
|
"res://data/facilities/expansion/staff_dormitory.tres",
|
|
"res://data/facilities/expansion/waste_processing.tres",
|
|
]
|
|
|
|
static func load_all() -> Array[FacilityDefinition]:
|
|
var result: Array[FacilityDefinition] = []
|
|
for path in FACILITY_PATHS:
|
|
var definition := load(path) as FacilityDefinition
|
|
if definition != null:
|
|
result.append(definition)
|
|
return result
|
|
|
|
static func load_expansion() -> Array[FacilityDefinition]:
|
|
var result: Array[FacilityDefinition] = []
|
|
for path in EXPANSION_FACILITY_PATHS:
|
|
var definition := load(path) as FacilityDefinition
|
|
if definition != null:
|
|
result.append(definition)
|
|
return result
|
|
|
|
static func load_infrastructure() -> Array[FacilityDefinition]:
|
|
var result: Array[FacilityDefinition] = []
|
|
for path in INFRASTRUCTURE_FACILITY_PATHS:
|
|
var definition := load(path) as FacilityDefinition
|
|
if definition != null:
|
|
result.append(definition)
|
|
return result
|
|
|
|
static func load_available(include_expansion := false) -> Array[FacilityDefinition]:
|
|
var result := load_all()
|
|
if include_expansion:
|
|
result.append_array(load_expansion())
|
|
return result
|
|
|
|
static func by_id(facility_id: StringName) -> FacilityDefinition:
|
|
var definitions := load_available(true)
|
|
definitions.append_array(load_infrastructure())
|
|
for path: String in RESCUE_FACILITY_PATHS + ORIGINAL_FACILITY_PATHS:
|
|
definitions.append(load(path) as FacilityDefinition)
|
|
for definition in definitions:
|
|
if definition.id == facility_id:
|
|
return definition
|
|
return null
|