Player selects a verb (Look, Use, Take, Open) and applies it to a world object; the system looks up the result based on current state and updates accordingly.
LucasArts SCUMM (Monkey Island): pick a verb then the objects to build a command — 'Use key on door' — and the world resolves it.
The verb-noun loop is a lookup, not a node graph: (verb, object) indexes into the room's interaction table, the result is gated by flags, and success mutates flags. This is the Shadowgate engine.
Each room's interactions are data: a list of (verb, object) entries with required flags and a result. Content lives in resources, logic stays generic.
class_name Interaction extends Resource
@export var verb: String
@export var object: String
@export var requires: Array[String]
@export var result_text: String
@export var sets_flags: Array[String]Flags gate every result. The same verb on the same object yields different outcomes as world state changes — that's the whole adventure-game feel.
func resolve(verb, obj):
for i in room.interactions:
if i.verb == verb and i.object == obj and met(i.requires):
apply(i); return i.result_text
return "Nothing happens."Emit verb_selected from the UI and interaction_done from the resolver, so input, log text, and flag mutation stay loosely coupled.
signal verb_selected(verb, object)
verb_selected.connect(func(v,o): log.append(resolve(v,o)))In short: Verb signal (verb: String, object: String) → lookup in RoomData.interactions array → check flags → execute result + set flags
14 catalogued game(s) use this mechanic, spanning 1989–2000.
▶ Explore Verb Object Interaction interactively — see every game + the Godot system