Movement gate
Three states, CLOSED, AJAR and OPEN, plus locked, held, blocked and jammed. Keys are ids; a master key lists the keys it stands in for. A close never completes into a body.
try_open · may_pass · grant_key
godot-doors · a Godot 4.7 addon
godot-doors is a rooms and doors system for Godot. One autoload decides who may pass a door, who can hear or see through it, who knocks and who answers, who gets caught where they should not be, and which rooms keep living while the player is somewhere else.
In 2014 Liz England answered “what does a game designer do?” with a door. In The Door Problem she points out that the simplest object in a level makes almost every discipline on a team decide something, and each team decides it again for each game, usually as bugs.
England's post is a list of questions. This addon is one set of answers, for games about houses full of people with secrets, where a door does five jobs at once.
No script keeps its own “is this door open”. Everything
asks the RoomsAndDoors autoload; Door.tscn
and RoomArea are thin views of its state. Every
discipline gets the same answers.
Three states, CLOSED, AJAR and OPEN, plus locked, held, blocked and jammed. Keys are ids; a master key lists the keys it stands in for. A close never completes into a body.
try_open · may_pass · grant_key
Sound travels the door graph. A closed door passes its hearing factor, an ajar one more, an open one all of it. An ear against the door hears names. A keyhole shows a glimpse, then faces.
hear_check · sight_check · witnesses_of
Presence is not permission. Admission is computed: owner, resident, invited, on duty, or none. Chores grant bounded access. A servant on duty is invisible; one minute after, she is a discovery.
knock · admission · set_duty · discovery
Restricted scenes declare door preconditions instead of checking by hand: closed, locked, private enough. One build flag resolves them to the scene or to a fade.
scene_preconditions_met · request_scene
Rooms one door from the player always run in full. Two doors out, at lower fidelity. Further, on the clock. A scene that started without you is joined in progress, never restarted.
simulation_tier · resident_rooms · start_activity
Moving between rooms with no open door between them is flagged. 130 acceptance checks run headless. F3 draws the room graph, door states, witnesses and the last twenty events.
door_clip_detected · debug overlay
A conversation in the study, loudness 0.4, and the maid in the gallery outside. Heard means above 0.08; identified, above 0.35. The numbers are the addon's defaults, and the demo plays them.
You are the new maid. Tonight the master has a visitor, the mistress is writing a letter, and every door in the house listens back. Find out what the house is hiding before it finds out what you are doing. About ten minutes; keyboard required.
A Godot web export: Compatibility renderer, no threads. The HUD is one UXML document loaded by godot-uxml; room names and speech are Typesetter text; the house is generated from a table of rooms and doors. Desktop builds are on the releases page.
addons/rooms_and_doors into your project.RoomsAndDoors → res://addons/rooms_and_doors/rooms_and_doors.gd.RoomArea in each room and a Door.tscn in each doorway, then register your characters.The design, section by section, is in docs/design.md; the README lists every choice made where the design was open.
RoomsAndDoors.register_character(&"maid", $Maid, { "role": &"servant" })
RoomsAndDoors.set_duty(&"maid", &"study", { "duration": 120.0 })
var r := RoomsAndDoors.try_open(&"study_door", &"maid", { "quiet": true })
if not r.ok:
print(r.reason) # LOCKED, NO_KEY, BLOCKED, HELD …
var h := RoomsAndDoors.hear_check(&"maid", &"study", RAD.LOUD_CONVERSATION)
if h.identified:
print(h.participants)
RoomsAndDoors.discovery.connect(func(who, finder, room, ctx):
print(finder, " found ", who, " in ", room))
Door.tscn with placeholder clips and procedural sounds, RoomArea in 3D and 2D, KeyItem, NpcDoorAgent, the debug overlay.RoomArea2D exists; the ajar sight cone is 3D only.Copyright 2026 Jetha Chan. godot-doors is available under the MIT License. The demo vendors godot-uxml (Apache 2.0) and Typesetter (MIT); both draw Inter (SIL OFL 1.1). The addon itself depends on neither. “The Door Problem” is Liz England's essay; this project borrows its name with thanks and is not affiliated with her.