… | |
… | |
186 | package game; |
186 | package game; |
187 | |
187 | |
188 | use KGS::Constants; |
188 | use KGS::Constants; |
189 | use KGS::Game::Board; |
189 | use KGS::Game::Board; |
190 | |
190 | |
|
|
191 | use Gtk2::GoBoard; |
|
|
192 | |
191 | use base KGS::Listener::Game; |
193 | use base KGS::Listener::Game; |
192 | use base KGS::Game; |
194 | use base KGS::Game; |
193 | |
195 | |
194 | use base gtk::widget; |
196 | use base gtk::widget; |
195 | |
197 | |
… | |
… | |
263 | |
265 | |
264 | $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0); |
266 | $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0); |
265 | $hbox->add (($self->{userpanel}[WHITE] = new game::userpanel colour => WHITE)->widget); |
267 | $hbox->add (($self->{userpanel}[WHITE] = new game::userpanel colour => WHITE)->widget); |
266 | $hbox->add (($self->{userpanel}[BLACK] = new game::userpanel colour => BLACK)->widget); |
268 | $hbox->add (($self->{userpanel}[BLACK] = new game::userpanel colour => BLACK)->widget); |
267 | |
269 | |
268 | $vbox->pack_start(($self->{text} = new gtk::text)->widget, 1, 1, 0); |
270 | $vbox->pack_start(($self->{chat} = new chat), 1, 1, 0); |
269 | |
271 | |
270 | $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); |
|
|
271 | $self->{entry}->signal_connect(activate => sub { |
272 | $self->{chat}->signal_connect(command => sub { |
272 | my $text = $self->{entry}->get_text; |
273 | my ($chat, $cmd, $arg) = @_; |
273 | $self->say($text) if $text =~ /\S/; |
274 | if ($cmd eq "rsave") { |
274 | $self->{entry}->set_text(""); |
275 | Storable::nstore { tree => $self->{tree}, curnode => $self->{curnode}, move => $self->{move} }, $arg;#d# |
|
|
276 | } else { |
|
|
277 | $self->{app}->do_command ($chat, $cmd, $arg, userlist => $self->{userlist}, game => $self); |
|
|
278 | } |
275 | }); |
279 | }); |
276 | |
280 | |
277 | $self->event_update_game; |
281 | $self->event_update_game; |
278 | $self; |
282 | $self; |
279 | } |
283 | } |
… | |
… | |
289 | $important{$self->{user1}{name}}++; |
293 | $important{$self->{user1}{name}}++; |
290 | $important{$self->{user2}{name}}++; |
294 | $important{$self->{user2}{name}}++; |
291 | $important{$self->{user3}{name}}++; |
295 | $important{$self->{user3}{name}}++; |
292 | |
296 | |
293 | if (my @users = grep $important{$_->{name}}, @$add) { |
297 | if (my @users = grep $important{$_->{name}}, @$add) { |
294 | $self->{text}->append_text ("\n<header>Joins:</header>"); |
298 | $self->{chat}->append_text ("\n<header>Joins:</header>"); |
295 | $self->{text}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
299 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
296 | } |
300 | } |
297 | if (my @users = grep $important{$_->{name}}, @$remove) { |
301 | if (my @users = grep $important{$_->{name}}, @$remove) { |
298 | $self->{text}->append_text ("\n<header>Parts:</header>"); |
302 | $self->{chat}->append_text ("\n<header>Parts:</header>"); |
299 | $self->{text}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
303 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
300 | } |
304 | } |
301 | |
305 | |
302 | } |
306 | } |
303 | |
307 | |
304 | sub join { |
308 | sub join { |
… | |
… | |
394 | }sgexi; |
398 | }sgexi; |
395 | |
399 | |
396 | $text .= $_; |
400 | $text .= $_; |
397 | } |
401 | } |
398 | |
402 | |
399 | $self->{text}->append_text ($text); |
403 | $self->{chat}->append_text ($text); |
400 | } |
404 | } |
401 | |
405 | |
402 | sub event_join { |
406 | sub event_join { |
403 | my ($self) = @_; |
407 | my ($self) = @_; |
404 | $self->SUPER::event_join; |
408 | $self->SUPER::event_join; |
… | |
… | |
416 | } |
420 | } |
417 | |
421 | |
418 | sub event_update_game { |
422 | sub event_update_game { |
419 | my ($self) = @_; |
423 | my ($self) = @_; |
420 | $self->SUPER::event_update_game; |
424 | $self->SUPER::event_update_game; |
|
|
425 | |
|
|
426 | return unless $self->{window}; |
421 | |
427 | |
422 | my $title = defined $self->{channel} |
428 | my $title = defined $self->{channel} |
423 | ? $self->owner->as_string . " " . $self->opponent_string |
429 | ? $self->owner->as_string . " " . $self->opponent_string |
424 | : "Game Window"; |
430 | : "Game Window"; |
425 | $self->{window}->set_title("KGS Game $title"); |
431 | $self->{window}->set_title("KGS Game $title"); |
… | |
… | |
476 | $text .= "</infoblock>"; |
482 | $text .= "</infoblock>"; |
477 | |
483 | |
478 | $self->{gatext} = \@ga; |
484 | $self->{gatext} = \@ga; |
479 | }; |
485 | }; |
480 | |
486 | |
481 | $self->{text}->append_text ($text); |
487 | $self->{chat}->append_text ($text); |
482 | } |
488 | } |
483 | |
489 | |
484 | sub event_update_rules { |
490 | sub event_update_rules { |
485 | my ($self, $rules) = @_; |
491 | my ($self, $rules) = @_; |
486 | |
492 | |
… | |
… | |
506 | } elsif ($rules->{timesys} == TIMESYS_CANADIAN) { |
512 | } elsif ($rules->{timesys} == TIMESYS_CANADIAN) { |
507 | $text .= util::format_time $rules->{time}; |
513 | $text .= util::format_time $rules->{time}; |
508 | $text .= sprintf " + %s/%d CAN", util::format_time $rules->{interval}, $rules->{count}; |
514 | $text .= sprintf " + %s/%d CAN", util::format_time $rules->{interval}, $rules->{count}; |
509 | } |
515 | } |
510 | |
516 | |
511 | $self->{text}->append_text ("<infoblock>$text</infoblock>"); |
517 | $self->{chat}->append_text ("<infoblock>$text</infoblock>"); |
512 | } |
518 | } |
513 | |
519 | |
514 | sub inject_resign_game { |
520 | sub inject_resign_game { |
515 | my ($self, $msg) = @_; |
521 | my ($self, $msg) = @_; |
516 | |
522 | |
517 | sound::play 3, "resign"; |
523 | sound::play 3, "resign"; |
518 | |
524 | |
519 | $self->{text}->append_text ("\n<infoblock><header>Resign</header>" |
525 | $self->{chat}->append_text ("\n<infoblock><header>Resign</header>" |
520 | . "\n<user>" |
526 | . "\n<user>" |
521 | . (util::toxml $self->{user}[$msg->{player}]->as_string) |
527 | . (util::toxml $self->{user}[$msg->{player}]->as_string) |
522 | . "</user> resigned.</infoblock>"); |
528 | . "</user> resigned.</infoblock>"); |
523 | } |
529 | } |
524 | |
530 | |
525 | sub inject_final_result { |
531 | sub inject_final_result { |
526 | my ($self, $msg) = @_; |
532 | my ($self, $msg) = @_; |
527 | |
533 | |
528 | $self->{text}->append_text ("<infoblock>\n<header>Game Over</header>" |
534 | $self->{chat}->append_text ("<infoblock>\n<header>Game Over</header>" |
529 | . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string) |
535 | . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string) |
530 | . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string) |
536 | . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string) |
531 | . "</infoblock>" |
537 | . "</infoblock>" |
532 | ); |
538 | ); |
533 | } |
539 | } |
534 | |
540 | |
535 | sub event_challenge { |
541 | sub event_challenge { |
536 | my ($self, $challenge) = @_; |
542 | my ($self, $challenge) = @_; |
537 | |
543 | |
538 | use KGS::Listener::Debug; |
544 | use KGS::Listener::Debug; |
539 | $self->{text}->append_text ("\n".KGS::Listener::Debug::dumpval($challenge)); |
545 | $self->{chat}->append_text ("\n".KGS::Listener::Debug::dumpval($challenge)); |
540 | } |
546 | } |
541 | |
547 | |
542 | sub destroy { |
548 | sub destroy { |
543 | my ($self) = @_; |
549 | my ($self) = @_; |
544 | |
550 | |