1 require 'observer_utils'
16 def initialize(game, kind = :local)
18 @players = { } # player => ready
24 return false if @history
25 return false if @players.has_key?(player)
26 return false if complete?
27 return false unless @game.players.include?(player.color)
29 @players[player] = false
30 fire :complete if complete?
35 return false if @history
36 return false unless complete?
37 return false unless @players[player] == false
39 @players[player] = true
40 if @players.values.all?
41 state = @game.state.new
43 @history = History.new(state)
51 def move(player, move, state = nil)
52 return false unless @history
53 # if player is nil, assume the current player is moving
55 player = current_player
57 return false unless @players.has_key?(player)
58 return false unless player.color == @history.state.turn
61 validate = @game.validator.new(@history.state)
62 valid = validate[move]
63 return false unless valid
65 old_state = @history.state
68 @history.add_move(state, move)
71 broadcast player, :move => {
75 :old_state => old_state }
80 @game.players.all? do |c|
81 @players.keys.find {|p| p.color == c }
95 def broadcast(player, event)
97 @players.each_key do |p|
98 p.update any_to_event(event) unless p == player
103 @players.keys.find {|p| p.color == state.turn }