1 require 'observer_utils'
16 def initialize(game, opts = {})
18 @players = { } # player => ready
20 @kind = opts[:kind] || :local
21 @editable = opts.fetch(:editable, true)
25 return false if @history
26 return false if @players.has_key?(player)
27 return false if complete?
28 return false unless @game.players.include?(player.color)
30 @players[player] = false
31 fire :complete if complete?
36 return false if @history
37 return false unless complete?
38 return false unless @players[player] == false
40 @players[player] = true
41 if @players.values.all?
42 state = @game.state.new
44 @history = History.new(state)
52 def move(player, move, state = nil)
53 return false unless @history
54 # if player is nil, assume the current player is moving
56 player = current_player
58 return false unless @players.has_key?(player)
59 return false unless player.color == @history.state.turn
62 validate = @game.validator.new(@history.state)
63 valid = validate[move]
64 return false unless valid
66 old_state = @history.state
69 @history.add_move(state, move)
72 broadcast player, :move => {
76 :old_state => old_state }
81 @game.players.all? do |c|
82 @players.keys.find {|p| p.color == c }
100 def broadcast(player, event)
102 @players.each_key do |p|
103 p.update any_to_event(event) unless p == player
108 @players.keys.find {|p| p.color == state.turn }