X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=shogi_server%2Fleague.rb;h=b3e9c46d8c3d9ab89edb9ddf5b65336b0dc3bd1b;hp=82e3b568a6b90f5af2783bf3034e474724c263cd;hb=48caf92ecf5d5669a5ccef83bf351f612e8aab70;hpb=030eb1e45ea591a64ed2fc5b8df489cd701c4548 diff --git a/shogi_server/league.rb b/shogi_server/league.rb index 82e3b56..b3e9c46 100644 --- a/shogi_server/league.rb +++ b/shogi_server/league.rb @@ -1,7 +1,7 @@ ## $Id$ ## Copyright (C) 2004 NABEYA Kenichi (aka nanami@2ch) -## Copyright (C) 2007-2008 Daigo Moriwaki (daigo at debian dot org) +## Copyright (C) 2007-2012 Daigo Moriwaki (daigo at debian dot org) ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -26,23 +26,15 @@ module ShogiServer # for a namespace # class League - def initialize + def initialize(dir=File.dirname(__FILE__)) @mutex = Monitor.new # guard @players @games = Hash::new @players = Hash::new @event = nil - @dir = File.dirname(__FILE__) + @dir = dir end attr_accessor :players, :games, :event, :dir - def shutdown - @mutex.synchronize do - @players.each do |name, player| - @persistent.save(player) - end - end - end - # this should be called just after instanciating a League object. def setup_players_database filename = File.join(@dir, "players.yaml") @@ -57,16 +49,11 @@ class League end def delete(player) - @persistent.save(player) @mutex.synchronize do @players.delete(player.name) end end - def save(player) - @persistent.save(player) - end - def reload @mutex.synchronize do @players.each do |name, player| @@ -111,6 +98,31 @@ class League def rated_players return @persistent.get_players end + + # Find a rival for a player. + # Return, + # 1. symbol :continue for an error case + # 2. a rival player instance found + # 3. nil if rival not found + # + def find_rival(player, game_name) + case player.sente + when nil # no preference + if Login.handicapped_game_name?(game_name) + player.write_safe("##[ERROR] Random turn preference is not allowed for handicapped games\n") + return :continue + end + return get_player("game_waiting", game_name, nil, player) + when true # rival must be gote + return get_player("game_waiting", game_name, false, player) + when false # rival must be sente + return get_player("game_waiting", game_name, true, player) + else + write_safe("##[ERROR] bad game option: %s\n" % [my_sente_string]) + return :continue + end + end + end # class League end # ShogiServer