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