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.4 by pcg, Sat May 31 13:58:31 2003 UTC vs.
Revision 1.26 by pcg, Sun Jun 1 13:09:47 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 $timer - int $timer;
81}
82
83sub set_time {
84 my ($self, $time) = @_;
85
86 $self->{start} = $time->[0];
87 $self->{set}->($time->[1], $time->[2]);
88
89 $self->refresh ($time->[0]);
90}
91
92sub start {
93 my ($self) = @_;
94
95 return if $self->{timeout};
96
97 my $timeout; $timeout = sub {
98 my $next = int ($self->refresh (Time::HiRes::time) * 1000);
99 $self->{timeout} = add Glib::Timeout $next, $timeout;
100 0;
101 };
102
103 $timeout->();
104}
105
106sub stop {
107 my ($self) = @_;
108
109 remove Glib::Source delete $self->{timeout} if $self->{timeout};
110}
111
112sub destroy {
113 my ($self) = @_;
114 $self->stop;
115 $self->SUPER::destroy;
116}
117
118package game::userpanel;
119
120use base gtk::widget;
121
122sub new {
123 my $class = shift;
124 my $self = $class->SUPER::new(@_);
125
126 $self->{widget} = new Gtk2::HBox;
127
128 $self->{widget}->add (my $vbox = new Gtk2::VBox);
129
130 $vbox->add ($self->{name} = new Gtk2::Label $self->{name});
131 $vbox->add ($self->{info} = new Gtk2::Label "");
132 $vbox->add (($self->{clock} = new game::goclock)->widget);
133
134 $self;
135}
136
137sub set_rules {
138 my ($self, $rules) = @_;
139
140 if ($self->{name}->get_text ne $rules->{player}[$self->{colour}]) {
141 $self->{name}->set_text ($rules->{player}[$self->{colour}]);
142
143 # the big picture...
144 appwin::userpic ($rules->{player}[$self->{colour}], sub {
145 $self->{widget}->add (gtk::image_from_data $_[0]) if $_[0];
146 $self->{widget}->show_all;
147 # undef => show sth. funny
148 });
149 }
150
151 $self->{clock}->set_rules (@{$rules->{rules}}{qw(timesys time interval count)});
152}
153
154sub set_state {
155 my ($self, $captures, $timer, $running) = @_;
156
157 $self->{clock}->set_time ($timer);
158 $running ? $self->{clock}->start : $self->{clock}->stop;
159 $self->{info}->set_text ("$captures pris.");
160}
161
1package game; 162package game;
2 163
3use KGS::Constants; 164use KGS::Constants;
4use KGS::Game::Board; 165use KGS::Game::Board;
5 166
6use base KGS::Listener::Game; 167use base KGS::Listener::Game;
7use base KGS::Game; 168use base KGS::Game;
8 169
9use base gtk::widget; 170use base gtk::widget;
171
172use POSIX qw(ceil);
10 173
11sub new { 174sub new {
12 my $self = shift; 175 my $self = shift;
13 $self = $self->SUPER::new(@_); 176 $self = $self->SUPER::new(@_);
14 177
15 $self->listen($self->{conn}); 178 $self->listen($self->{conn});
16 179
17 $self->{window} = new Gtk2::Window 'toplevel'; 180 $self->{window} = new Gtk2::Window 'toplevel';
18 my $title = $self->{channel} ? $self->owner->{name}." ".$self->opponent_string : "Game Window"; 181 my $title = $self->{channel} ? $self->owner->as_string." ".$self->opponent_string : "Game Window";
19 $self->{window}->set_title("KGS Game $title"); 182 $self->{window}->set_title("KGS Game $title");
20 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500]; 183 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500];
21 184
22 $self->{window}->signal_connect(delete_event => sub { 185 $self->{window}->signal_connect(delete_event => sub {
23 if ($self->{joined}) {
24 $self->part; 186 $self->part;
25 } else { 187 $self->destroy;
26 $self->event_part;
27 }
28 1; 188 1;
29 }); 189 });
30 190
31 $self->{window}->add($self->{hpane} = new Gtk2::HPaned); 191 $self->{window}->add($self->{hpane} = new Gtk2::HPaned);
32 gtk::state $self->{hpane}, "game::hpane", undef, position => 500; 192 gtk::state $self->{hpane}, "game::hpane", undef, position => 500;
33 193
34 $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1); 194 $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1);
35 195
36 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0); 196 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0);
37 197
38 # grrr...
39 { 198 {
199 # grrr...
40 $frame->add(my $vbox = new Gtk2::VBox); 200 $frame->add(my $vbox = new Gtk2::VBox);
41 $vbox->add($self->{title} = new Gtk2::Label $title); 201 $vbox->add($self->{title} = new Gtk2::Label $title);
42 202
43 $self->{moveadj} = new Gtk2::Adjustment 0, 0, 1, 0.01, 0.1, 0; 203 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0;
44 204
45 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); 205 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj});
46 $scale->set_draw_value (0); 206 $scale->set_draw_value (0);
47 207
48 $self->{moveadj}->signal_connect (value_changed => sub { 208 $self->{moveadj}->signal_connect (value_changed => sub { $self->update_board });
49 return unless $self->{path};
50
51 my $move = int (@{$self->{path}} * $_[0]->get_value);
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 } 209 }
61 210
62 #Gtk2::Widget->push_visual (Gtk2::Gdk::Rgb->get_visual); #d# gdk_rgb_* not yet implemented(?) 211 $vbox->pack_start((my $aspect_frame = new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0);
63 #Gtk2::Widget->push_colormap (Gtk2::Gdk::Rgb->get_cmap); 212 $aspect_frame->set (border_width => 0, shadow_type => 'none', label_xalign => 0.5);
64 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0); 213 $self->{board_label} = $aspect_frame->get_label_widget;
65 #Gtk2::Widget->pop_colormap; 214
66 #Gtk2::Widget->pop_visual; 215 $aspect_frame->add($self->{canvas} = new Gtk2::DrawingArea);
216 $self->{canvas}->double_buffered (0) if $::config->{conserve_memory};
67 217
68 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 218 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
69 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 219 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
220
221 # RIGHT PANE
70 222
71 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); 223 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0);
72 $self->{hpane}->set(position_set => 1); 224 $self->{hpane}->set(position_set => 1);
73 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; 225 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80;
74 226
75 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); 227 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow);
76 $sw->set_policy("automatic", "always"); 228 $sw->set_policy("automatic", "always");
77 229
78 $sw->add(($self->{userlist} = new gtk::userlist)->widget); 230 $sw->add(($self->{userlist} = new userlist)->widget);
79 231
80 $self->{vpane}->add(my $vbox = new Gtk2::VBox); 232 $self->{vpane}->add(my $vbox = new Gtk2::VBox);
233
234 $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0);
235 $hbox->add (($self->{userpanel}[WHITE] = new game::userpanel colour => WHITE)->widget);
236 $hbox->add (($self->{userpanel}[BLACK] = new game::userpanel colour => BLACK)->widget);
81 237
82 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); 238 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0);
83 $sw->set_policy("automatic", "always"); 239 $sw->set_policy("never", "always");
84 240
85 $sw->add(($self->{text} = new gtk::text)->widget); 241 $sw->add(($self->{text} = new gtk::text)->widget);
86 242
87 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); 243 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0);
88 $self->{entry}->signal_connect(activate => sub { 244 $self->{entry}->signal_connect(activate => sub {
89 my $text = $self->{entry}->get_text; 245 my $text = $self->{entry}->get_text;
90 # add message 246 $self->say($text) if $text =~ /\S/;
91 $self->{entry}->set_text(""); 247 $self->{entry}->set_text("");
92 }); 248 });
93 249
94 $self; 250 $self;
95} 251}
96 252
97sub event_update_users { 253sub event_update_users {
98 my ($self) = @_; 254 my ($self, $add, $update, $remove) = @_;
99 255
100 $self->{userlist}->update($self->{users}); 256 $self->{userlist}->update ($add, $update, $remove);
101} 257}
102 258
103sub join { 259sub join {
104 my ($self) = @_; 260 my ($self) = @_;
261 return if $self->{joined};
262
105 $self->SUPER::join; 263 $self->SUPER::join;
106 264
107 $self->{window}->show_all; 265 $self->{window}->show_all;
108} 266}
109 267
110sub part { 268sub part {
111 my ($self) = @_; 269 my ($self) = @_;
270
112 $self->SUPER::part; 271 $self->SUPER::part;
113 272 $self->destroy;
114 $self->{window}->hide;
115} 273}
116 274
117sub configure_event { 275sub configure_event {
118 my ($widget, $event, $self) = @_; 276 my ($widget, $event, $self) = @_;
119 delete $self->{stack}; 277 delete $self->{stack};
120 delete $self->{pixbuf}; 278 delete $self->{pixbuf};
121 delete $self->{board_shown}; 279 delete $self->{board_shown};
122 delete $self->{background}; 280 delete $self->{background};
123 $self->repaint_board; 281 $self->repaint_board;
124 1; 282 0;
283}
284
285sub expose_event {
286 my ($widget, $event, $self) = @_;
287
288 $self->{pixbuf} or return;
289
290 my $area = $event->area;
291
292 $self->redraw ($area);
293
294 0;
125} 295}
126 296
127# something Gtk2 fixed 297# something Gtk2 fixed
128sub INTERP_NEAREST (){ 'nearest' } 298sub INTERP_NEAREST (){ 'nearest' }
129sub INTERP_TILES (){ 'tiles' } 299sub INTERP_TILES (){ 'tiles' }
164 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { 334 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) {
165 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000; 335 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000;
166 336
167 # zeroeth the shadow 337 # zeroeth the shadow
168 if ($mark & (MARK_B | MARK_W)) { 338 if ($mark & (MARK_B | MARK_W)) {
169 $::black_img[0]->composite ( 339 $::shadow_img->composite (
170 $base, $shadow, $shadow, $size, $size, $shadow-0.5, $shadow-0.5, 340 $base, $shadow, $shadow, $size, $size, $shadow - 0.5, $shadow - 0.5,
171 $size / $stone->get_width, $size / $stone->get_height, 341 $size / $stone->get_width, $size / $stone->get_height,
172 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 128 342 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192
173 ); 343 );
174 } 344 }
175 345
176 # first the big stones (handicap stones different for effect) 346 # first the big stones (handicap stones different for effect)
177 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192], 347 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192],
179 [MARK_GRAY_B, 128], 349 [MARK_GRAY_B, 128],
180 [MARK_GRAY_W, 128]) { 350 [MARK_GRAY_W, 128]) {
181 my ($mask, $alpha) = @$_; 351 my ($mask, $alpha) = @$_;
182 if ($mark & $mask) { 352 if ($mark & $mask) {
183 $stone->composite ( 353 $stone->composite (
184 $base, 0, 0, $size, $size, -0.5, -0.5, 354 $base, 0, 0, $size, $size, 0, 0,
185 $size / $stone->get_width, $size / $stone->get_height, 355 $size / $stone->get_width, $size / $stone->get_height,
186 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha 356 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha
187 ); 357 );
188 } 358 }
189 } 359 }
190 360
191 # then the samll stones 361 # then the small stones
192 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], 362 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]],
193 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { 363 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) {
194 my ($mask, $img) = @$_; 364 my ($mask, $img) = @$_;
195 if ($mark & $mask) { 365 if ($mark & $mask) {
196 $img->composite ( 366 $img->composite (
197 $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2, 367 $base, (ceil ($size / 4)) x2, (ceil ($size / 2)) x2, (ceil ($size / 4)) x2,
198 $size / $img->get_width / 2, $size / $img->get_height / 2, 368 $size / $img->get_width / 2, $size / $img->get_height / 2,
199 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 369 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 224
200 ); 370 );
201 } 371 }
202 } 372 }
203 373
204 # and lastly any markers 374 # and lastly any markers
239 $x -= ($W * $s + $spacing * (@c - 1)) * 0.5; 409 $x -= ($W * $s + $spacing * (@c - 1)) * 0.5;
240 $y -= $height * 0.5; 410 $y -= $height * 0.5;
241 411
242 for (@c) { 412 for (@c) {
243 my $w = $_->get_width * $s; 413 my $w = $_->get_width * $s;
414 # +2 == don't fight the rounding
244 $_->composite ($pixbuf, 415 $_->composite ($pixbuf,
245 $x, $y, $w+0.999, $height+0.999, $x, $y, $s, $s, 416 $x, $y, $w+2, $height+2, $x, $y, $s, $s,
246 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); 417 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255);
247 418
248 $x += $w + $spacing; 419 $x += $w + $spacing;
249 } 420 }
250 } 421 }
264 my $expose_area = undef; 435 my $expose_area = undef;
265 436
266 return $expose_area unless $self->{board}; 437 return $expose_area unless $self->{board};
267 438
268 my ($w, $h) = ($canvas->allocation->values)[2,3]; 439 my ($w, $h) = ($canvas->allocation->values)[2,3];
440
441 die "FATAL: board aspect ratio != 1" unless $w == $h;
269 442
270 my $s = $w > $h ? $h : $w; 443 my $s = $w;
444
445 return unless $s >= 200;
271 446
272 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s];
273
274 my $size = $self->{size}; 447 my $size = $self->{size};
275 448
449 # we leave enough space for the shadows.. I like smaller stones, and we
450 # do no need to do the nifty recursive screen updates that goban2 does
276 my $border = int ($s / ($size + 3) * 0.5); 451 my $border = int ($s / ($size + 3) * 0.5);
277 my $s2 = $s - $border * 2; 452 my $s2 = $s - $border * 2;
278 my $edge = int ($s2 / ($size + 1) * 0.95) - ($::config->{randomize} ? 3 : 0); 453 my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0);
279 my $ofs = int ($edge / 2); 454 my $ofs = int ($edge / 2);
280 455
281 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size; 456 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size;
282 457
283 my $pixbuf; 458 my $pixbuf;
287 if ($self->{background}) { 462 if ($self->{background}) {
288 if ($oldboard = $self->{board_shown}) { 463 if ($oldboard = $self->{board_shown}) {
289 $pixbuf = $self->{pixbuf}; 464 $pixbuf = $self->{pixbuf};
290 } else { 465 } else {
291 $pixbuf = $self->{background}->copy; 466 $pixbuf = $self->{background}->copy;
292 $expose_area = [0, 0, $s, $s]; 467 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
293 } 468 }
294 } else { 469 } else {
295 $expose_area = [0, 0, $s, $s]; 470 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
296 471
297 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); 472 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height);
298 473
299 if ($s < $bw && $s < $bh) { 474 if ($s < $bw && $s < $bh) {
300 $pixbuf = new_pixbuf $s, $s, 0; 475 $pixbuf = new_pixbuf $s, $s, 0;
326 501
327 $a++; 502 $a++;
328 $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK... 503 $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK...
329 } 504 }
330 505
331 unless ($::config->{conserve_memory}) { 506 unless ($::config->{conserve_memory} > 1) {
332 $self->{background} = $pixbuf; 507 $self->{background} = $pixbuf;
333 $pixbuf = $pixbuf->copy; 508 $pixbuf = $pixbuf->copy;
334 } 509 }
335 } 510 }
336 511
405sub redraw { 580sub redraw {
406 my ($self, $area) = @_; 581 my ($self, $area) = @_;
407 582
408 if ($area && $self->{pixbuf}) { 583 if ($area && $self->{pixbuf}) {
409 my ($x, $y, $w, $h) = $area->values; 584 my ($x, $y, $w, $h) = $area->values;
410 my ($ox, $oy, $s) = @{$self->{offsets}};
411 585
412 $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf}, 586 $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf},
413 $x, $y, $x + $ox, $y + $oy, $w, $h, 587 $x, $y, $x, $y, $w, $h,
414 "normal", 0, 0); 588 "normal", 0, 0);
415 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, 589 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0,
416 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; 590 $x - 1, $y - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE;
417 } 591 }
418} 592}
419 593
420sub expose_event { 594sub update_board {
421 my ($widget, $event, $self) = @_; 595 my ($self) = @_;
596 return unless $self->{path};
422 597
423 $self->{pixbuf} or return; 598 $self->{NOW} = Time::HiRes::time; #d# get from msg(!)
424 599
425 my $area = $event->area; 600 my $move = int (@{$self->{path}} * $self->{moveadj}->get_value);
426 my ($ox, $oy, $s) = @{$self->{offsets}};
427 601
428 $self->redraw ( 602 my $running = $move == @{$self->{path}};
429 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
430 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
431 );
432 603
433 1; 604 $self->{board_label}->set_text ("Move $move");
605
606 $self->{board} = new KGS::Game::Board $self->{size};
607 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]);
608
609 $self->{userpanel}[WHITE]->set_state ($self->{board}{captures}[WHITE],
610 $self->{board}{timer}[WHITE],
611 $running && $self->{board}{last} == BLACK);
612 $self->{userpanel}[BLACK]->set_state ($self->{board}{captures}[BLACK],
613 $self->{board}{timer}[BLACK],
614 $running && $self->{board}{last} == WHITE);
615
616 $self->redraw ($self->repaint_board);
617
618 $self->{text}->set_text ($self->{board}{comment});
434} 619}
435 620
436sub event_update_tree { 621sub event_update_tree {
437 my ($self) = @_; 622 my ($self) = @_;
438 623
439 $self->{path} = $self->get_path; 624 $self->{path} = $self->get_path;
625 $self->{userpanel}[WHITE]->set_rules ($self->{path}[0]); # should be onload only
626 $self->{userpanel}[BLACK]->set_rules ($self->{path}[0]); # should be onload only
440 627
441 $self->{moveadj}->value_changed (); 628 $self->{moveadj}->value_changed if $self->{moveadj};
442} 629}
443 630
444sub event_part { 631sub event_part {
445 my ($self) = @_; 632 my ($self) = @_;
446 $self->SUPER::event_part; 633 $self->SUPER::event_part;
447 delete $appwin::gamelist->{game}{$self->{channel}};
448 $self->destroy;
449} 634}
450 635
451sub event_move { 636sub event_move {
452 my ($self, $pass) = @_; 637 my ($self, $pass) = @_;
453 sound::play 1, $pass ? "pass" : "move"; 638 sound::play 1, $pass ? "pass" : "move";
454} 639}
455 640
641sub event_update_game {
642 my ($self) = @_;
643 $self->SUPER::event_update_game;
644 warn "UPDATE GAME";#d#
645}
646
647sub destroy {
648 my ($self) = @_;
649 (delete $self->{userpanel}[WHITE])->destroy if $self->{userpanel}[WHITE];
650 (delete $self->{userpanel}[BLACK])->destroy if $self->{userpanel}[BLACK];
651 $self->SUPER::destroy;
652 delete $appwin::gamelist->{game}{$self->{channel}};
653}
654
4561; 6551;
457 656

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines