lib/gamefic/scriptable.rb



# frozen_string_literal: true


require 'set'

module Gamefic
  # A class module that enables scripting.

  #

  # Narratives extend Scriptable to enable definition of scripts and seeds.

  # Modules can also be extended with Scriptable to make them includable to

  # other Scriptables.

  #

  # @example Include a scriptable module in a plot

  #   module MyScript

  #     extend Gamefic::Scriptable

  #

  #     respond :myscript do |actor|

  #       actor.tell "This command was added by MyScript"

  #     end

  #   end

  #

  #   class MyPlot < Gamefic::Plot

  #     include MyScript

  #   end

  #

  module Scriptable
    require 'gamefic/scriptable/hooks'
    require 'gamefic/scriptable/queries'
    require 'gamefic/scriptable/syntaxes'
    require 'gamefic/scriptable/responses'
    require 'gamefic/scriptable/scenes'
    require 'gamefic/scriptable/seeds'

    include Hooks
    include Queries
    include Responses
    include Scenes
    include Seeds
    include Syntaxes

    def included_scripts
      ancestors.that_are(Scriptable).uniq
    end
  end
end