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.110 by root, Mon May 31 17:06:19 2004 UTC vs.
Revision 1.111 by root, Mon May 31 17:14:25 2004 UTC

1use utf8; 1use utf8;
2 2
3use Scalar::Util (); 3use Scalar::Util ();
4
5### GO CLOCK WIDGET #########################################################
4 6
5package game::goclock; 7package game::goclock;
6 8
7# Lo and Behold! I admit it! The rounding stuff etc.. in goclock 9# Lo and Behold! I admit it! The rounding stuff etc.. in goclock
8# is completely borked. 10# is completely borked.
127 my ($self) = @_; 129 my ($self) = @_;
128 130
129 remove Glib::Source delete $self->{timeout} if $self->{timeout}; 131 remove Glib::Source delete $self->{timeout} if $self->{timeout};
130} 132}
131 133
134### USER PANEL ##############################################################
135
132package game::userpanel; 136package game::userpanel;
133 137
134use Glib::Object::Subclass 138use Glib::Object::Subclass
135 Gtk2::HBox, 139 Gtk2::HBox,
136 properties => [ 140 properties => [
187sub set_timer { 191sub set_timer {
188 my ($self, $start, $time, $moves) = @_; 192 my ($self, $start, $time, $moves) = @_;
189 193
190 $self->{clock}->set_time ($start, $time, $moves); 194 $self->{clock}->set_time ($start, $time, $moves);
191} 195}
196
197### GAME WINDOW #############################################################
192 198
193package game; 199package game;
194 200
195use Scalar::Util qw(weaken); 201use Scalar::Util qw(weaken);
196 202
316 } 322 }
317 }); 323 });
318 } 324 }
319} 325}
320 326
327### JOIN/LEAVE ##############################################################
328
329sub join {
330 my ($self) = @_;
331 return if $self->{joined};
332
333 $self->SUPER::join;
334}
335
336sub event_join {
337 my ($self) = @_;
338
339 $self->SUPER::event_join (@_);
340 $self->init_tree;
341 $self->event_update_game;
342}
343
344sub event_part {
345 my ($self) = @_;
346
347 $self->SUPER::event_part;
348 $self->destroy;
349}
350
351### USERS ###################################################################
352
353sub draw_users {
354 my ($self, $inlay) = @_;
355
356 for (sort keys %{$self->{users}}) {
357 $inlay->append_text (" <user>" . $self->{users}{$_}->as_string . "</user>");
358 }
359}
360
321sub event_update_users { 361sub event_update_users {
322 my ($self, $add, $update, $remove) = @_; 362 my ($self, $add, $update, $remove) = @_;
323 363
324# $self->{userlist}->update ($add, $update, $remove); 364# $self->{userlist}->update ($add, $update, $remove);
325 365
341 $self->{chat}->append_text ("\n<header>Parts:</header>"); 381 $self->{chat}->append_text ("\n<header>Parts:</header>");
342 $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; 382 $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users;
343 } 383 }
344} 384}
345 385
346sub join { 386### GAME INFO ###############################################################
387
388sub draw_setup {
347 my ($self) = @_; 389 my ($self, $inlay) = @_;
390
348 return if $self->{joined}; 391 return unless $self->{joined};
349 392
350 $self->SUPER::join; 393 my $rules = $self->{rules};
394
395 my $text = "";
396
397 $text .= "\nTeacher: <user>" . (util::toxml $self->{teacher}) . "</user>"
398 if $self->{teacher};
399
400 $text .= "\nOwner: <user>" . (util::toxml $self->{owner}->as_string) . "</user>"
401 if $self->{owner}->is_valid;
402
403 if ($self->is_inprogress) {
404 $text .= "\nPlayers: <user>" . (util::toxml $self->{white}->as_string) . "</user>"
405 . " vs. <user>" . (util::toxml $self->{black}->as_string) . "</user>";
406 }
407 $text .= "\nType: " . util::toxml $gametype{$self->type};
408
409 $text .= "\nRuleset: " . $ruleset{$rules->{ruleset}};
410
411 $text .= "\nTime: ";
412
413 if ($rules->{timesys} == TIMESYS_NONE) {
414 $text .= "UNLIMITED";
415 } elsif ($rules->{timesys} == TIMESYS_ABSOLUTE) {
416 $text .= util::format_time $rules->{time};
417 $text .= " ABS";
418 } elsif ($rules->{timesys} == TIMESYS_BYO_YOMI) {
419 $text .= util::format_time $rules->{time};
420 $text .= sprintf " + %s (%d) BY", util::format_time $rules->{interval}, $rules->{count};
421 } elsif ($rules->{timesys} == TIMESYS_CANADIAN) {
422 $text .= util::format_time $rules->{time};
423 $text .= sprintf " + %s/%d CAN", util::format_time $rules->{interval}, $rules->{count};
424 }
425
426 $text .= "\nFlags:";
427 $text .= " private" if $self->is_private;
428 $text .= " started" if $self->is_inprogress;
429 $text .= " adjourned" if $self->is_adjourned;
430 $text .= " scored" if $self->is_scored;
431 $text .= " saved" if $self->is_saved;
432
433 if ($self->is_inprogress) {
434 $text .= "\nHandicap: " . $self->{handicap};
435 $text .= "\nKomi: " . $self->{komi};
436 $text .= "\nSize: " . $self->size_string;
437 }
438
439 if ($self->is_scored) {
440 $text .= "\nResult: " . $self->score_string;
441 }
442
443 $inlay->append_text ("<infoblock>$text</infoblock>");
444
445}
446
447sub event_update_game {
448 my ($self) = @_;
449
450 $self->SUPER::event_update_game;
451
452 return unless $self->{joined};
453
454 $self->{colour} = $self->player_colour ($self->{conn}{name});
455
456 my $title = defined $self->{channel}
457 ? $self->owner->as_string . " " . $self->opponent_string
458 : "Game Window";
459 $self->set_title ("KGS Game $title");
460 $self->{title}->set_text ($title);
461
462 $self->{user}[COLOUR_BLACK] = $self->{black};
463 $self->{user}[COLOUR_WHITE] = $self->{white};
464
465 # show board
466 if ($self->is_inprogress) {
467 if (!$self->{boardbox}->parent) {
468 $self->{boardbox}->add ($self->{board} = new Gtk2::GoBoard size => $self->{size});
469 $self->{left}->add ($self->{boardbox});
470 $self->{board}->signal_connect (button_release => sub {
471 if ($_[1] == 1) {
472 $self->{board_click}->($_[2], $_[3]) if $self->{board_click};
473 }
474 });
475 }
476 if (my $ch = delete $self->{challenge}) {
477 $_->{inlay}->destroy for values %$ch;
478 }
479 $self->update_cursor;
480 }
481
482 $self->{left}->show_all;
483
484 $self->{rules_inlay}->refresh;
485
486}
487
488sub event_update_rules {
489 my ($self, $rules) = @_;
490
491 $self->{rules} = $rules;
492
493 if ($self->{user}) {
494 $self->{userpanel}[$_]->configure ($self->{app}, $self->{user}[$_], $rules)
495 for COLOUR_BLACK, COLOUR_WHITE;
496 }
497
498 sound::play 3, "gamestart";
499 $self->{rules_inlay}->refresh;
500}
501
502### BOARD DISPLAY ###########################################################
503
504sub update_timers {
505 my ($self, $timers) = @_;
506
507 my $running = $self->{showmove} == @{$self->{path}} && !$self->{teacher};
508
509 for my $colour (COLOUR_BLACK, COLOUR_WHITE) {
510 my $t = $timers->[$colour];
511 $self->{userpanel}[$colour]->set_timer (
512 $running && $colour == $self->{whosemove} && $t->[0],
513 $t->[1] || $self->{rules}{time}
514 + ($self->{rules}{timesys} == TIMESYS_BYO_YOMI
515 && $self->{rules}{interval} * $self->{rules}{count}),
516 $t->[2] || $self->{rules}{count});
517 }
518}
519
520sub inject_set_gametime {
521 my ($self, $msg) = @_;
522
523 $self->{timers} = [
524 [$msg->{NOW}, $msg->{black_time}, $msg->{black_moves}],
525 [$msg->{NOW}, $msg->{white_time}, $msg->{white_moves}],
526 ];
527
528 $self->update_timers ($self->{timers})
529 if $self->{showmove} == @{$self->{path}};
351} 530}
352 531
353sub update_cursor { 532sub update_cursor {
354 my ($self) = @_; 533 my ($self) = @_;
355 534
417 $self->{board}->set (cursor => undef); 596 $self->{board}->set (cursor => undef);
418 #TODO# # implement coordinate-grabbing 597 #TODO# # implement coordinate-grabbing
419 } 598 }
420} 599}
421 600
422sub update_timers {
423 my ($self, $timers) = @_;
424
425 my $running = $self->{showmove} == @{$self->{path}} && !$self->{teacher};
426
427 for my $colour (COLOUR_BLACK, COLOUR_WHITE) {
428 my $t = $timers->[$colour];
429 $self->{userpanel}[$colour]->set_timer (
430 $running && $colour == $self->{whosemove} && $t->[0],
431 $t->[1] || $self->{rules}{time}
432 + ($self->{rules}{timesys} == TIMESYS_BYO_YOMI
433 && $self->{rules}{interval} * $self->{rules}{count}),
434 $t->[2] || $self->{rules}{count});
435 }
436}
437
438sub update_board { 601sub update_board {
439 my ($self) = @_; 602 my ($self) = @_;
440 return unless $self->{path}; 603 return unless $self->{path};
441 604
442 $self->{board_label}->set_text ("Move " . ($self->{showmove} - 1)); 605 $self->{board_label}->set_text ("Move " . ($self->{showmove} - 1));
554 } 717 }
555 718
556 $self->{chat}->append_text ($text); 719 $self->{chat}->append_text ($text);
557} 720}
558 721
559sub event_join {
560 my ($self) = @_;
561
562 $self->SUPER::event_join (@_);
563 $self->init_tree;
564 $self->event_update_game;
565}
566
567sub event_part {
568 my ($self) = @_;
569
570 $self->SUPER::event_part;
571 $self->destroy;
572}
573
574sub event_move { 722sub event_move {
575 my ($self, $pass) = @_; 723 my ($self, $pass) = @_;
576 724
577 sound::play 1, $pass ? "pass" : "move"; 725 sound::play 1, $pass ? "pass" : "move";
578} 726}
579 727
580sub event_update_game { 728### GAMEPLAY EVENTS #########################################################
581 my ($self) = @_;
582
583 $self->SUPER::event_update_game;
584
585 return unless $self->{joined};
586
587 $self->{colour} = $self->player_colour ($self->{conn}{name});
588
589 my $title = defined $self->{channel}
590 ? $self->owner->as_string . " " . $self->opponent_string
591 : "Game Window";
592 $self->set_title ("KGS Game $title");
593 $self->{title}->set_text ($title);
594
595 $self->{user}[COLOUR_BLACK] = $self->{black};
596 $self->{user}[COLOUR_WHITE] = $self->{white};
597
598 # show board
599 if ($self->is_inprogress) {
600 if (!$self->{boardbox}->parent) {
601 $self->{boardbox}->add ($self->{board} = new Gtk2::GoBoard size => $self->{size});
602 $self->{left}->add ($self->{boardbox});
603 $self->{board}->signal_connect (button_release => sub {
604 if ($_[1] == 1) {
605 $self->{board_click}->($_[2], $_[3]) if $self->{board_click};
606 }
607 });
608 }
609 if (my $ch = delete $self->{challenge}) {
610 $_->{inlay}->destroy for values %$ch;
611 }
612 $self->update_cursor;
613 }
614
615 $self->{left}->show_all;
616
617 $self->{rules_inlay}->refresh;
618
619}
620
621sub draw_setup {
622 my ($self, $inlay) = @_;
623
624 return unless $self->{joined};
625
626 my $rules = $self->{rules};
627
628 my $text = "";
629
630 $text .= "\nTeacher: <user>" . (util::toxml $self->{teacher}) . "</user>"
631 if $self->{teacher};
632
633 $text .= "\nOwner: <user>" . (util::toxml $self->{owner}->as_string) . "</user>"
634 if $self->{owner}->is_valid;
635
636 if ($self->is_inprogress) {
637 $text .= "\nPlayers: <user>" . (util::toxml $self->{white}->as_string) . "</user>"
638 . " vs. <user>" . (util::toxml $self->{black}->as_string) . "</user>";
639 }
640 $text .= "\nType: " . util::toxml $gametype{$self->type};
641
642 $text .= "\nRuleset: " . $ruleset{$rules->{ruleset}};
643
644 $text .= "\nTime: ";
645
646 if ($rules->{timesys} == TIMESYS_NONE) {
647 $text .= "UNLIMITED";
648 } elsif ($rules->{timesys} == TIMESYS_ABSOLUTE) {
649 $text .= util::format_time $rules->{time};
650 $text .= " ABS";
651 } elsif ($rules->{timesys} == TIMESYS_BYO_YOMI) {
652 $text .= util::format_time $rules->{time};
653 $text .= sprintf " + %s (%d) BY", util::format_time $rules->{interval}, $rules->{count};
654 } elsif ($rules->{timesys} == TIMESYS_CANADIAN) {
655 $text .= util::format_time $rules->{time};
656 $text .= sprintf " + %s/%d CAN", util::format_time $rules->{interval}, $rules->{count};
657 }
658
659 $text .= "\nFlags:";
660 $text .= " private" if $self->is_private;
661 $text .= " started" if $self->is_inprogress;
662 $text .= " adjourned" if $self->is_adjourned;
663 $text .= " scored" if $self->is_scored;
664 $text .= " saved" if $self->is_saved;
665
666 if ($self->is_inprogress) {
667 $text .= "\nHandicap: " . $self->{handicap};
668 $text .= "\nKomi: " . $self->{komi};
669 $text .= "\nSize: " . $self->size_string;
670 }
671
672 if ($self->is_scored) {
673 $text .= "\nResult: " . $self->score_string;
674 }
675
676 $inlay->append_text ("<infoblock>$text</infoblock>");
677
678}
679
680sub event_update_rules {
681 my ($self, $rules) = @_;
682
683 $self->{rules} = $rules;
684
685 if ($self->{user}) {
686 $self->{userpanel}[$_]->configure ($self->{app}, $self->{user}[$_], $rules)
687 for COLOUR_BLACK, COLOUR_WHITE;
688 }
689
690 sound::play 3, "gamestart";
691 $self->{rules_inlay}->refresh;
692}
693 729
694sub event_resign_game { 730sub event_resign_game {
695 my ($self, $player) = @_; 731 my ($self, $player) = @_;
696 732
697 sound::play 3, "resign"; 733 sound::play 3, "resign";
736 $self->{chat}->append_text ("<infoblock>\n<header>Game Over</header>" 772 $self->{chat}->append_text ("<infoblock>\n<header>Game Over</header>"
737 . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string) 773 . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string)
738 . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string) 774 . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string)
739 . "</infoblock>" 775 . "</infoblock>"
740 ); 776 );
741}
742
743sub inject_set_gametime {
744 my ($self, $msg) = @_;
745
746 $self->{timers} = [
747 [$msg->{NOW}, $msg->{black_time}, $msg->{black_moves}],
748 [$msg->{NOW}, $msg->{white_time}, $msg->{white_moves}],
749 ];
750
751 $self->update_timers ($self->{timers})
752 if $self->{showmove} == @{$self->{path}};
753} 777}
754 778
755sub inject_req_undo { 779sub inject_req_undo {
756 my ($self, $msg) = @_; 780 my ($self, $msg) = @_;
757 781
785 } 809 }
786 810
787 $self->{chat}->append_text ("\n<header>Game successfully created on server.</header>"); 811 $self->{chat}->append_text ("\n<header>Game successfully created on server.</header>");
788 delete $self->{cid}; 812 delete $self->{cid};
789} 813}
814
815### CHALLENGE HANDLING ######################################################
790 816
791sub draw_challenge { 817sub draw_challenge {
792 my ($self, $id) = @_; 818 my ($self, $id) = @_;
793 819
794 my $info = $self->{challenge}{$id}; 820 my $info = $self->{challenge}{$id};
950 }); 976 });
951 } 977 }
952 } 978 }
953} 979}
954 980
955sub draw_users { 981sub new_game_challenge {
956 my ($self, $inlay) = @_; 982 my ($self) = @_;
957 983
958 for (sort keys %{$self->{users}}) { 984 my $d = $self->{app}{defaults};
959 $inlay->append_text (" <user>" . $self->{users}{$_}->as_string . "</user>"); 985
986 $self->{challenge}{""} = {
987 gametype => $d->{gametype},
988 flags => 0,
989 notes => $d->{stones},
990 rules => {
991 ruleset => $d->{ruleset},
992 size => $d->{size},
993 timesys => $d->{timesys},
994 time => $d->{time},
995 interval => $d->{timesys} == TIMESYS_BYO_YOMI ? $d->{byo_time} : $d->{can_time},
996 count => $d->{timesys} == TIMESYS_BYO_YOMI ? $d->{byo_periods} : $d->{can_stones},
997 },
998
999 inlay => $self->{chat}->new_inlay,
960 } 1000 };
1001 $self->draw_challenge ("");
961} 1002}
962 1003
963sub event_challenge { 1004sub event_challenge {
964 my ($self, $info) = @_; 1005 my ($self, $info) = @_;
965 1006

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines