class Gamefic::Dispatcher

The action selector for character commands.

Attributes

actions[R]

@return [Array<Action>]

actor[R]

@return [Actor]

commands[R]

@return [Array<Command>]

Public Class Methods

dispatch(actor, command) click to toggle source

@param actor [Active] @param command [String] @return [Dispatcher]

# File lib/gamefic/dispatcher.rb, line 41
def self.dispatch actor, command
  group = actor.playbooks.reverse.map { |p| p.dispatch(actor, command) }
  dispatcher = Dispatcher.new(actor)
  group.each { |d| dispatcher.merge d }
  dispatcher
end
dispatch_from_params(actor, verb, params) click to toggle source

@param actor [Active] @param verb [Symbol] @param params [Array<Object>] @return [Dispatcher]

# File lib/gamefic/dispatcher.rb, line 52
def self.dispatch_from_params actor, verb, params
  group = actor.playbooks.reverse.map { |p| p.dispatch_from_params(actor, verb, params) }
  dispatcher = Dispatcher.new(actor)
  group.each { |d| dispatcher.merge d }
  dispatcher
end
new(actor, commands = [], actions = []) click to toggle source

@param actor [Actor] @param commands [Array<Command>] @param actions [Array<Action>]

# File lib/gamefic/dispatcher.rb, line 8
def initialize actor, commands = [], actions = []
  @actor = actor
  @commands = commands
  @actions = actions
end

Public Instance Methods

merge(dispatcher) click to toggle source
# File lib/gamefic/dispatcher.rb, line 14
def merge dispatcher
  commands.concat dispatcher.commands
  actions.concat dispatcher.actions
end
next() click to toggle source
# File lib/gamefic/dispatcher.rb, line 19
def next
  instance = nil
  while instance.nil? && !@actions.empty?
    action = actions.shift
    commands.each do |cmd|
      instance = action.attempt(actor, cmd)
      if instance
        unless instance.meta?
          actor.playbooks.reverse.each do |playbook|
            return nil unless validate_playbook(playbook, instance)
          end
        end
        break
      end
    end
  end
  instance
end

Private Instance Methods

validate_playbook(playbook, action) click to toggle source
# File lib/gamefic/dispatcher.rb, line 72
def validate_playbook playbook, action
  playbook.validators.all? { |v| v.call(actor, action.verb, action.parameters) != false }
end