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>
151 lines
5.1 KiB
GDScript
151 lines
5.1 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",
|
|
&"mana_warp",
|
|
]
|
|
|
|
const INFRASTRUCTURE_FACILITY_PATHS: Array[String] = [
|
|
"res://data/facilities/infrastructure/guest_stairs.tres",
|
|
"res://data/facilities/infrastructure/service_stairs.tres",
|
|
"res://data/facilities/infrastructure/mana_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
|