-- Dialogable: a mixin that makes any Entity subclass talkable. `include` it and -- give the entity a `self.book` (an Ink book); bumping the entity then opens the -- modal Dialogue. npcs, signs, artifacts — anything you can talk to — are just -- Dialogables. For now an entity carries one book; later it can swap books as it -- progresses. All it does is route a bump to the dialogue manager. Dialogable = {} function Dialogable:onBump() if self.book then local wasOpen = Dialogue.isOpen() Dialogue.open(self.book, self:dialogueBindings()) if Sound and not wasOpen then Sound.jabber() end end return true end -- Ink external functions exposed to this talker's book. A walking NPC (one that -- includes Walker) can be sent to a named Mark with `~ walk_to("mark_name")`, -- e.g. to leave after a conversation. function Dialogable:dialogueBindings() local talker = self return { walk_to = function(markName) if talker.sendTo then talker:sendTo(markName) end end, } end