ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/game.pl
(Generate patch)

Comparing kgsueme/kgsueme/game.pl (file contents):
Revision 1.22 by pcg, Sun Jun 1 07:20:56 2003 UTC vs.
Revision 1.23 by pcg, Sun Jun 1 10:10:21 2003 UTC

1package game::goclock;
2
3use Time::HiRes ();
4
5use KGS::Constants;
6
7use base gtk::widget;
8
9sub new {
10 my $class = shift;
11 my $self = $class->SUPER::new(@_);
12
13 $self->{widget} = new Gtk2::Label;
14
15 $self->{set} = sub { };
16 $self->{format} = sub { "ERROR" };
17
18 $self;
19}
20
21sub append_text {
22 my ($self, $text) = @_;
23
24 $self->{buffer}->insert ($self->{buffer}->get_end_iter, $text);
25}
26
27sub format_time {
28 my ($time) = @_;
29
30 $time > 60*60
31 ? sprintf "%d:%02d:%02d", $time / (60 * 60), $time / 60 % 60, $time % 60
32 : sprintf "%d:%02d", $time / 60 % 60, $time % 60;
33}
34
35sub set_rules {
36 my ($self, $timesys, $main, $interval, $count) = @_;
37
38 if ($timesys == TIMESYS_ABSOLUTE) {
39 $self->{set} = sub { $self->{time} = $_[0] };
40 $self->{format} = sub { format_time $_[0] };
41
42 } elsif ($timesys == TIMESYS_BYO_YOMI) {
43 my $low = $interval * $count;
44
45 $self->{set} = sub { $self->{time} = $_[0] };
46
47 $self->{format} = sub {
48 if ($_[0] > $low) {
49 format_time $_[0];
50 } else {
51 sprintf "%s (%d)", (format_time int ($_[0] % $interval) || $interval), $_[0] / $interval;
52 }
53 };
54
55 } elsif ($timesys == TIMESYS_CANADIAN) {
56 my $low = $interval;
57
58 $self->{set} = sub { $self->{time} = $_[0]; $self->{moves} = $_[1] };
59
60 $self->{format} = sub {
61 if ($_[0] > $low) {
62 format_time $_[0];
63 } else {
64 sprintf "%s / %d", (format_time int($_[0] % $interval) || $interval), $self->{moves};
65 }
66 };
67
68 } else {
69 # none, or unknown
70 $self->{set} = sub { };
71 $self->{format} = sub { "---" }
72 }
73}
74
75sub refresh {
76 my ($self, $timestamp) = @_;
77 my $timer = $self->{time} + $self->{start} - $timestamp;
78 $self->{widget}->set_text ($self->{format}->($timer));
79
80 warn "Timer $timer\n";
81 $timer - int $timer;
82}
83
84sub set_time {
85 my ($self, $time) = @_;
86
87 $self->{start} = $time->[0];
88 $self->{set}->($time->[1], $time->[2]);
89
90 $self->refresh ($time->[0]);
91}
92
93sub start {
94 my ($self) = @_;
95
96 return if $self->{timeout};
97
98 my $timeout; $timeout = sub {
99 my $next = int ($self->refresh (Time::HiRes::time) * 1000);
100 warn "next $next\n";
101 $self->{timeout} = add Glib::Timeout $next, $timeout;
102 0;
103 };
104
105 $timeout->();
106}
107
108sub stop {
109 my ($self) = @_;
110
111 remove Glib::Source delete $self->{timeout} if $self->{timeout};
112}
113
114package game::userpanel;
115
116use base gtk::widget;
117
118sub new {
119 my $class = shift;
120 my $self = $class->SUPER::new(@_);
121
122 $self->{widget} = new Gtk2::VBox;
123
124 $self->{widget}->add ($self->{name} = new Gtk2::Label $self->{name});
125 $self->{widget}->add ($self->{info} = new Gtk2::Label "");
126 $self->{widget}->add (($self->{clock} = new game::goclock)->widget);
127
128 $self;
129}
130
131sub set_rules {
132 my ($self, $rules) = @_;
133
134 $self->{name}->set_text ($rules->{player}[$self->{colour}]);
135 $self->{clock}->set_rules (@{$rules->{rules}}{qw(timesys time interval count)});
136}
137
138sub set_state {
139 my ($self, $captures, $timer, $running) = @_;
140
141 $self->{clock}->set_time ($timer);
142 $running ? $self->{clock}->start : $self->{clock}->stop;
143 $self->{info}->set_text ("$captures pris.");
144}
145
1package game; 146package game;
2 147
3use KGS::Constants; 148use KGS::Constants;
4use KGS::Game::Board; 149use KGS::Game::Board;
5 150
41 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0; 186 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0;
42 187
43 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); 188 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj});
44 $scale->set_draw_value (0); 189 $scale->set_draw_value (0);
45 190
46 $self->{moveadj}->signal_connect (value_changed => sub { 191 $self->{moveadj}->signal_connect (value_changed => sub { $self->update_board });
47 return unless $self->{path};
48
49 my $move = int (@{$self->{path}} * $_[0]->get_value);
50
51 $self->{board_label}->set_text ("Move $move");
52
53 $self->{board} = new KGS::Game::Board $self->{size};
54 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]);
55
56 $self->redraw ($self->repaint_board);
57
58 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
59 });
60 } 192 }
61 193
62 $vbox->pack_start((my $aspect_frame = new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0); 194 $vbox->pack_start((my $aspect_frame = new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0);
63 $aspect_frame->set (border_width => 0, shadow_type => 'none', label_xalign => 0.5); 195 $aspect_frame->set (border_width => 0, shadow_type => 'none', label_xalign => 0.5);
64 $self->{board_label} = $aspect_frame->get_label_widget; 196 $self->{board_label} = $aspect_frame->get_label_widget;
67 $self->{canvas}->double_buffered (0) if $::config->{conserve_memory}; 199 $self->{canvas}->double_buffered (0) if $::config->{conserve_memory};
68 200
69 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 201 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
70 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 202 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
71 203
204 # RIGHT PANE
205
72 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); 206 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0);
73 $self->{hpane}->set(position_set => 1); 207 $self->{hpane}->set(position_set => 1);
74 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; 208 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80;
75 209
76 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); 210 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow);
77 $sw->set_policy("automatic", "always"); 211 $sw->set_policy("automatic", "always");
78 212
79 $sw->add(($self->{userlist} = new userlist)->widget); 213 $sw->add(($self->{userlist} = new userlist)->widget);
80 214
81 $self->{vpane}->add(my $vbox = new Gtk2::VBox); 215 $self->{vpane}->add(my $vbox = new Gtk2::VBox);
216
217 $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0);
218 $hbox->add (($self->{user0} = new game::userpanel colour => WHITE)->widget);
219 $hbox->add (($self->{user1} = new game::userpanel colour => BLACK)->widget);
82 220
83 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); 221 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0);
84 $sw->set_policy("never", "always"); 222 $sw->set_policy("never", "always");
85 223
86 $sw->add(($self->{text} = new gtk::text)->widget); 224 $sw->add(($self->{text} = new gtk::text)->widget);
434 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, 572 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0,
435 $x - 1, $y - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; 573 $x - 1, $y - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE;
436 } 574 }
437} 575}
438 576
577sub update_board {
578 my ($self) = @_;
579 return unless $self->{path};
580
581 $self->{NOW} = Time::HiRes::time; #d# get from msg(!)
582
583 my $move = int (@{$self->{path}} * $self->{moveadj}->get_value);
584
585 my $running = $move == @{$self->{path}};
586
587 $self->{board_label}->set_text ("Move $move");
588
589 $self->{board} = new KGS::Game::Board $self->{size};
590 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]);
591
592 $self->{user0}->set_state ($self->{board}{captures}[0],
593 $self->{board}{timer}[0],
594 $running && $self->{board}{last} == WHITE);
595 $self->{user1}->set_state ($self->{board}{captures}[1],
596 $self->{board}{timer}[1],
597 $running && $self->{board}{last} == BLACK);
598
599 $self->redraw ($self->repaint_board);
600
601 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
602}
603
439sub event_update_tree { 604sub event_update_tree {
440 my ($self) = @_; 605 my ($self) = @_;
441 606
442 $self->{path} = $self->get_path; 607 $self->{path} = $self->get_path;
608 $self->{user0}->set_rules ($self->{path}[0]);
609 $self->{user1}->set_rules ($self->{path}[0]);
610
443 $self->{moveadj}->value_changed if $self->{moveadj}; 611 $self->{moveadj}->value_changed if $self->{moveadj};
444} 612}
445 613
446sub event_part { 614sub event_part {
447 my ($self) = @_; 615 my ($self) = @_;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines