World is navigated as discrete named locations; moving between them swaps the active room with no spatial continuity.
Discrete named rooms with no spatial continuity: walk through the exit door, the screen fades, and the next room loads with the hero at its entrance.
There's no spatial movement here — a “transition” is swapping which data record is active and re-rendering the shell around it.
Each location is a data record (a RoomData resource), not a place in space. Moving rooms means pointing at a different record.
class_name RoomData extends Resource
@export var title: String
@export var description: String
@export var exits: Dictionary # { "north": "hall", ... }A GameState singleton holds current_room. Swapping is just reassigning it and telling the UI to redraw.
# GameState.gd (autoload)
var current_room: RoomData
func go(room_id: String):
current_room = ROOMS[room_id]
room_changed.emit(current_room)The shared shell. One label re-populated from the active record on every swap — the screen IS the room.
func _on_room_changed(room: RoomData):
$Desc.text = room.description
rebuild_exit_buttons(room.exits)In short: current_room reference in GameState; loader populates UI from RoomData; direction input or verb triggers swap
20 catalogued game(s) use this mechanic, spanning 1986–2000.
▶ Explore Room Transition interactively — see every game + the Godot system