1 require 'observer_utils'
18 def initialize(game, opts = {})
20 @players = { } # player => ready
22 @kind = opts[:kind] || :local
23 @editable = opts.fetch(:editable, true)
28 return false if @history
29 return false if @players.has_key?(player)
30 return false if complete?
31 return false unless @game.players.include?(player.color)
33 @players[player] = false
34 fire :complete if complete?
39 return false if @history
40 return false unless complete?
41 return false unless @players[player] == false
43 @players[player] = true
44 if @players.values.all?
45 state = @game.state.new
47 @history = History.new(state)
55 def move(player, move, state = nil)
56 return false unless @history
57 # if player is nil, assume the current player is moving
59 player = current_player
61 return false unless @players.has_key?(player)
62 return false unless player.color == @history.state.turn
65 validate = @game.validator.new(@history.state)
66 valid = validate[move]
67 return false unless valid
69 old_state = @history.state
72 @history.add_move(state, move)
75 broadcast player, :move => {
79 :old_state => old_state }
84 broadcast nil, :time => time
88 @game.players.all? do |c|
89 @players.keys.find {|p| p.color == c }
106 @players.keys.find{|p| p.color == color }
109 def close(result = nil, message = nil)
110 @info[:result] = result if result
111 broadcast nil, :close => {
113 :message => message }
117 @info.merge(:players => @players.keys)
121 @info = @info.merge(infos)
122 infos[:players].each do |col, name|
130 def history=(history)
132 @index = history.size - 1
137 def broadcast(player, event)
139 @players.each_key do |p|
140 p.update any_to_event(event) unless p == player
145 @players.keys.find {|p| p.color == state.turn }