1 require 'observer_utils'
15 def initialize(game, kind = :local)
17 @players = { } # player => ready
23 return false if @history
24 return false if @players.has_key?(player)
25 return false if complete?
26 return false unless @game.players.include?(player.color)
28 @players[player] = false
29 fire :complete if complete?
34 return false if @history
35 return false unless complete?
36 return false unless @players[player] == false
38 @players[player] = true
39 if @players.values.all?
40 state = @game.state.new
42 @history = History.new(state)
49 def move(player, move, state = nil)
50 return false unless @history
51 # if player is nil, assume the current player is moving
53 player = current_player
55 return false unless @players.has_key?(player)
56 return false unless player.color == @history.state.turn
59 validate = @game.validator.new(@history.state)
60 valid = validate[move]
61 return false unless valid
63 old_state = @history.state
66 @history.add_move(state, move)
68 broadcast player, :move => {
72 :old_state => old_state }
77 @game.players.all? do |c|
78 @players.keys.find {|p| p.color == c }
96 def broadcast(player, event)
98 @players.each_key do |p|
99 p.update any_to_event(event) unless p == player
104 @players.keys.find {|p| p.color == state.turn }