Files
TheTree_mock/scripts/data/facility_catalog.gd
T
TakeshiandClaude Opus 5.5 8917c190cf 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>
2026-10-20 13:48:14 +09:00

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