The world is stored as discrete data records rather than a contiguous spatial map; the active record is loaded into a shared UI shell.
The world is discrete data records loaded into one shared shell, not a contiguous space.
The world is stored as records, not a contiguous map. A pointer selects the active record; a loader pours it into one shared UI shell. This is the data backbone behind room_transition.
Each location is a RoomData resource — description, exits, items present. The map is an array of these, edited as data.
class_name RoomData extends Resource
@export var id: String
@export var description: String
@export var exits: Dictionary
@export var items: Array[String]Index rooms by id for O(1) lookup. current_room is just a key — travel is changing which key the shell reads from.
var rooms := {} # id -> RoomData
var current := "foyer"
func room(): return rooms[current]A loader in GameState reads the active record and populates the shared UI — description label, exit buttons, item list — from data.
func load_room(id):
current = id
room_loaded.emit(rooms[id])In short: Array of RoomData Resources; current_room pointer in GameState; loader reads record and populates description, exits, and item list
15 catalogued game(s) use this mechanic, spanning 1989–1997.
▶ Explore Room Database interactively — see every game + the Godot system