-module ShogiServer # for a namespace
-
-class GameResult
- attr_reader :players, :black, :white
-
- def initialize(game, p1, p2)
- @game = game
- @players = [p1, p2]
- if p1.sente && !p2.sente
- @black, @white = p1, p2
- elsif !p1.sente && p2.sente
- @black, @white = p2, p1
- else
- raise "Never reached!"
- end
- @players.each do |player|
- player.status = "connected"
- LEAGUE.save(player)
- end
- end
-
- def process
- raise "Implement me!"
- end
-
- def log(str)
- @game.log_game(str)
- end
-
- def log_board
- log(@game.board.to_s.gsub(/^/, "\'"))
- end
-
- def log_rating
- log("'rating:%s\n" % [self.to_s]) if @game.rated?
- end
-
- def to_s
- black_name = @black.rated? ? @black.player_id : @black.name
- white_name = @white.rated? ? @white.player_id : @white.name
- return "%s:%s" % [black_name, white_name]
- end
-
- def notify_monitor(type)
- @game.each_monitor do |monitor|
- monitor.write_safe(sprintf("##[MONITOR][%s] %s\n", @game.game_id, type))
- end
- end
-end
-
-class GameResultWin < GameResult
- attr_reader :winner, :loser
-
- def initialize(game, winner, loser)
- super
- @winner, @loser = winner, loser
- @winner.last_game_win = true
- @loser.last_game_win = false
- end
-
- def log_summary(type)
- log_board
-
- black_result = white_result = ""
- if @black == @winner
- black_result = "win"
- white_result = "lose"
- else
- black_result = "lose"
- white_result = "win"
- end
- log("'summary:%s:%s %s:%s %s\n" % [type,
- @black.name, black_result,
- @white.name, white_result])
-
- log_rating
- end
-end
-
-class GameResultAbnormalWin < GameResultWin
- def process
- @winner.write_safe("%TORYO\n#RESIGN\n#WIN\n")
- @loser.write_safe( "%TORYO\n#RESIGN\n#LOSE\n")
- log("%%TORYO\n")
- log_summary("abnormal")
- notify_monitor("%%TORYO")
- end
-end
-
-class GameResultTimeoutWin < GameResultWin
- def process
- @winner.write_safe("#TIME_UP\n#WIN\n")
- @loser.write_safe( "#TIME_UP\n#LOSE\n")
- log_summary("time up")
- notify_monitor("#TIME_UP")
- end
-end
-
-# A player declares (successful) Kachi
-class GameResultKachiWin < GameResultWin
- def process
- @winner.write_safe("%KACHI\n#JISHOGI\n#WIN\n")
- @loser.write_safe( "%KACHI\n#JISHOGI\n#LOSE\n")
- log("%%KACHI\n")
- log_summary("kachi")
- notify_monitor("%%KACHI")
- end
-end
-
-# A player declares wrong Kachi
-class GameResultIllegalKachiWin < GameResultWin
- def process
- @winner.write_safe("%KACHI\n#ILLEGAL_MOVE\n#WIN\n")
- @loser.write_safe( "%KACHI\n#ILLEGAL_MOVE\n#LOSE\n")
- log("%%KACHI\n")
- log_summary("illegal kachi")
- notify_monitor("%%KACHI")
- end
-end
-
-class GameResultIllegalWin < GameResultWin
- def initialize(game, winner, loser, cause)
- super(game, winner, loser)
- @cause = cause
- end
-
- def process
- @winner.write_safe("#ILLEGAL_MOVE\n#WIN\n")
- @loser.write_safe( "#ILLEGAL_MOVE\n#LOSE\n")
- log_summary(@cause)
- notify_monitor("#ILLEGAL_MOVE")
- end
-end
-
-class GameResultIllegalMoveWin < GameResultIllegalWin
- def initialize(game, winner, loser)
- super(game, winner, loser, "illegal move")
- end
-end
-
-class GameResultUchifuzumeWin < GameResultIllegalWin
- def initialize(game, winner, loser)
- super(game, winner, loser, "uchifuzume")
- end
-end