3 ## Copyright (C) 2004 NABEYA Kenichi (aka nanami@2ch)
4 ## Copyright (C) 2007-2008 Daigo Moriwaki (daigo at debian dot org)
6 ## This program is free software; you can redistribute it and/or modify
7 ## it under the terms of the GNU General Public License as published by
8 ## the Free Software Foundation; either version 2 of the License, or
9 ## (at your option) any later version.
11 ## This program is distributed in the hope that it will be useful,
12 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ## GNU General Public License for more details.
16 ## You should have received a copy of the GNU General Public License
17 ## along with this program; if not, write to the Free Software
18 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 module ShogiServer # for a namespace
22 # Abstract class to caclulate thinking time.
26 def TimeClock.factory(least_time_per_move, game_name)
29 if (game_name =~ /-(\d+)-(\d+)$/)
33 total_time = total_time_str.to_i
34 byoyomi = byoyomi_str.to_i
36 if (byoyomi_str == "060")
37 @time_clock = StopWatchClock.new(least_time_per_move, total_time, byoyomi)
39 @time_clock = ChessClock.new(least_time_per_move, total_time, byoyomi)
43 def initialize(least_time_per_move, total_time, byoyomi)
44 @least_time_per_move = least_time_per_move
45 @total_time = total_time
49 # Returns thinking time duration
51 def time_duration(start_time, end_time)
56 # If thinking time runs out, returns true; false otherwise.
58 def timeout?(player, start_time, end_time)
63 # Updates a player's remaining time and returns thinking time.
65 def process_time(player, start_time, end_time)
66 t = time_duration(start_time, end_time)
69 if (player.mytime < 0)
77 # Calculates thinking time with chess clock.
79 class ChessClock < TimeClock
80 def initialize(least_time_per_move, total_time, byoyomi)
84 def time_duration(start_time, end_time)
85 return [(end_time - start_time).floor, @least_time_per_move].max
88 def timeout?(player, start_time, end_time)
89 t = time_duration(start_time, end_time)
91 if ((player.mytime - t <= -@byoyomi) &&
92 ((@total_time > 0) || (@byoyomi > 0)))
100 return "ChessClock: LeastTimePerMove %d; TotalTime %d; Byoyomi %d" % [@least_time_per_move, @total_time, @byoyomi]
104 class StopWatchClock < TimeClock
105 def initialize(least_time_per_move, total_time, byoyomi)
109 def time_duration(start_time, end_time)
110 t = [(end_time - start_time).floor, @least_time_per_move].max
111 return (t / @byoyomi) * @byoyomi
114 def timeout?(player, start_time, end_time)
115 t = time_duration(start_time, end_time)
117 if (player.mytime <= t)
125 return "StopWatchClock: LeastTimePerMove %d; TotalTime %d; Byoyomi %d" % [@least_time_per_move, @total_time, @byoyomi]