… | |
… | |
39 | if ($_[0] > $low) { |
39 | if ($_[0] > $low) { |
40 | util::format_time $_[0] - $low; |
40 | util::format_time $_[0] - $low; |
41 | } else { |
41 | } else { |
42 | sprintf "%s (%d)", |
42 | sprintf "%s (%d)", |
43 | util::format_time int (($_[0] - 1) % $interval + 1), |
43 | util::format_time int (($_[0] - 1) % $interval + 1), |
44 | $_[0] / $interval; |
44 | ($_[0] - 1) / $interval; |
45 | } |
45 | } |
46 | }; |
46 | }; |
47 | |
47 | |
48 | } elsif ($timesys == TIMESYS_CANADIAN) { |
48 | } elsif ($timesys == TIMESYS_CANADIAN) { |
49 | $self->{set} = sub { $self->{time} = $_[0]; $self->{moves} = $_[1] }; |
49 | $self->{set} = sub { $self->{time} = $_[0]; $self->{moves} = $_[1] }; |
… | |
… | |
52 | if (!$self->{moves}) { |
52 | if (!$self->{moves}) { |
53 | util::format_time $_[0] - $low; |
53 | util::format_time $_[0] - $low; |
54 | } else { |
54 | } else { |
55 | my $time = int (($_[0] - 1) % $interval + 1); |
55 | my $time = int (($_[0] - 1) % $interval + 1); |
56 | |
56 | |
57 | sprintf "%s/%d {%d}", |
57 | sprintf "%s/%d [%d]", |
58 | util::format_time $time, |
58 | util::format_time $time, |
59 | $self->{moves}, |
59 | $self->{moves}, |
60 | $time / ($self->{moves} || 1); |
60 | $time / ($self->{moves} || 1); |
61 | |
61 | |
62 | } |
62 | } |
… | |
… | |
230 | |
230 | |
231 | { |
231 | { |
232 | $frame->add(my $vbox = new Gtk2::VBox); |
232 | $frame->add(my $vbox = new Gtk2::VBox); |
233 | $vbox->add($self->{title} = new Gtk2::Label $title); |
233 | $vbox->add($self->{title} = new Gtk2::Label $title); |
234 | |
234 | |
235 | $self->{moveadj} = new Gtk2::Adjustment 0, 0, 0, 1, 1, 0; |
235 | $self->{moveadj} = new Gtk2::Adjustment 1, 1, 1, 1, 1, 0; |
236 | |
236 | |
237 | $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); |
237 | $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); |
238 | $scale->set_draw_value (0); |
238 | $scale->set_draw_value (0); |
239 | $scale->set_digits (0); |
239 | $scale->set_digits (0); |
240 | |
240 | |
… | |
… | |
646 | |
646 | |
647 | sub update_board { |
647 | sub update_board { |
648 | my ($self) = @_; |
648 | my ($self) = @_; |
649 | return unless $self->{path}; |
649 | return unless $self->{path}; |
650 | |
650 | |
|
|
651 | #$self->{update_board_cb} ||= add Glib::Idle sub { |
651 | my $move = int $self->{moveadj}->get_value; |
652 | my $move = int $self->{moveadj}->get_value; |
652 | |
653 | |
|
|
654 | warn "update_board called $move\n";#d# |
|
|
655 | |
653 | my $running = $move == @{$self->{path}}; |
656 | my $running = $move == @{$self->{path}}; |
654 | |
657 | |
655 | $self->{board_label}->set_text ("Move $move"); |
658 | $self->{board_label}->set_text ("Move " . ($move - 1)); |
656 | |
659 | |
657 | $self->{board} = new KGS::Game::Board $self->{size}; |
660 | $self->{board} = new KGS::Game::Board $self->{size}; |
658 | $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]); |
661 | $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]); |
659 | |
662 | |
660 | for my $colour (WHITE, BLACK) { |
663 | for my $colour (WHITE, BLACK) { |
661 | $self->{userpanel}[$colour]->set_state ( |
664 | $self->{userpanel}[$colour]->set_state ( |
662 | $self->{board}{captures}[$colour], |
665 | $self->{board}{captures}[$colour], |
663 | $self->{board}{timer}[$colour], |
666 | $self->{board}{timer}[$colour], |
664 | ($running && $self->{lastmove_colour} == !$colour) |
667 | ($running && $self->{lastmove_colour} == !$colour) |
665 | ? $self->{lastmove_time} : 0 |
668 | ? $self->{lastmove_time} : 0 |
666 | ); |
669 | ); |
667 | } |
670 | } |
668 | |
671 | |
669 | $self->redraw ($self->repaint_board); |
672 | $self->redraw ($self->repaint_board); |
|
|
673 | |
|
|
674 | # delete $self->{update_board_cb}; |
|
|
675 | #} |
670 | } |
676 | } |
671 | |
677 | |
672 | sub event_update_tree { |
678 | sub event_update_tree { |
673 | my ($self) = @_; |
679 | my ($self) = @_; |
674 | |
680 | |
675 | $self->{path} = $self->get_path; |
681 | $self->{path} = $self->get_path; |
676 | |
682 | |
677 | if ($self->{moveadj}) { |
683 | if ($self->{moveadj}) { |
678 | my $upper = $self->{moveadj}->upper; |
684 | my $upper = $self->{moveadj}->upper; |
679 | my $pos = $self->{moveadj}->get_value; |
685 | my $pos = $self->{moveadj}->get_value; |
|
|
686 | my $move = scalar @{$self->{path}}; |
680 | |
687 | |
681 | $self->{moveadj}->upper (scalar @{$self->{path}}); |
688 | $self->{moveadj}->upper ($move); |
682 | |
689 | |
|
|
690 | warn "UPDATE_TREE $pos,$upper";#d# |
683 | $self->{moveadj}->changed; |
691 | $self->{moveadj}->changed; |
684 | if ($pos == $upper) { |
692 | if ($pos == $upper) { |
685 | $self->{moveadj}->set_value (scalar @{$self->{path}}); |
693 | $self->{moveadj}->value ($move); |
686 | } else { |
|
|
687 | $self->{moveadj}->value_changed; |
694 | $self->{moveadj}->value_changed; |
688 | } |
695 | } |
689 | } |
696 | } |
690 | } |
697 | } |
691 | |
698 | |
… | |
… | |
698 | $text .= "\n<header>Move <move>$node->{move}</move>, Node <node>$node->{id}</node></header>" |
705 | $text .= "\n<header>Move <move>$node->{move}</move>, Node <node>$node->{id}</node></header>" |
699 | if $newnode; |
706 | if $newnode; |
700 | |
707 | |
701 | for (split /\n/, $comment) { |
708 | for (split /\n/, $comment) { |
702 | $text .= "\n"; |
709 | $text .= "\n"; |
703 | if ($_ =~ s/^([0-9a-zA-Z]+ \[[0-9dkp\?\-]+\])://) { |
710 | if (s/^([0-9a-zA-Z]+ \[[0-9dkp\?\-]+\])://) { |
704 | $text .= "<user>" . (util::toxml $1) . "</user>:"; |
711 | $text .= "<user>" . (util::toxml $1) . "</user>:"; |
705 | } |
712 | } |
|
|
713 | |
|
|
714 | # coords only for 19x19 so far |
|
|
715 | $_ = util::toxml $_; |
|
|
716 | s{ |
|
|
717 | ( |
|
|
718 | \b |
|
|
719 | (?:[bw])? |
|
|
720 | [, ]{0,2} |
|
|
721 | [a-hj-t] # valid for upto 19x19 |
|
|
722 | \s? |
|
|
723 | [1-9]?[0-9] |
|
|
724 | \b |
|
|
725 | ) |
|
|
726 | }{ |
|
|
727 | "<coord>$1</coord>"; |
|
|
728 | }sgexi; |
|
|
729 | |
706 | $text .= $_; |
730 | $text .= $_; |
707 | } |
731 | } |
708 | |
732 | |
709 | $self->{text}->append_text ($text); |
733 | $self->{text}->append_text ($text); |
710 | } |
734 | } |
… | |
… | |
762 | $text .= "\nHandicap: " . $self->{handicap}; |
786 | $text .= "\nHandicap: " . $self->{handicap}; |
763 | $text .= "\nKomi: " . $self->{komi}; |
787 | $text .= "\nKomi: " . $self->{komi}; |
764 | $text .= "\nSize: " . $self->size_string; |
788 | $text .= "\nSize: " . $self->size_string; |
765 | } |
789 | } |
766 | |
790 | |
|
|
791 | if ($self->is_scored) { |
|
|
792 | $text .= "\nResult: " . $self->score_string; |
|
|
793 | } |
|
|
794 | |
767 | $self->{text}->append_text ("<infoblock>$text</infoblock>"); |
795 | $self->{text}->append_text ("<infoblock>$text</infoblock>"); |
768 | } |
796 | } |
769 | |
797 | |
770 | sub event_update_rules { |
798 | sub event_update_rules { |
771 | my ($self, $rules) = @_; |
799 | my ($self, $rules) = @_; |
… | |
… | |
778 | $text .= "\nRuleset: " . $ruleset{$rules->{ruleset}}; |
806 | $text .= "\nRuleset: " . $ruleset{$rules->{ruleset}}; |
779 | |
807 | |
780 | $text .= "\nTime: "; |
808 | $text .= "\nTime: "; |
781 | |
809 | |
782 | if ($rules->{timesys} == TIMESYS_NONE) { |
810 | if ($rules->{timesys} == TIMESYS_NONE) { |
783 | $text .= "infinite"; |
811 | $text .= "UNLIMITED"; |
784 | } elsif ($rules->{timesys} == TIMESYS_ABSOLUTE) { |
812 | } elsif ($rules->{timesys} == TIMESYS_ABSOLUTE) { |
785 | $text .= util::format_time $rules->{time}; |
813 | $text .= util::format_time $rules->{time}; |
|
|
814 | $text .= " ABS"; |
786 | } elsif ($rules->{timesys} == TIMESYS_BYO_YOMI) { |
815 | } elsif ($rules->{timesys} == TIMESYS_BYO_YOMI) { |
787 | $text .= util::format_time $rules->{time} - $rules->{interval} * $rules->{count}; |
816 | $text .= util::format_time $rules->{time} - $rules->{interval} * $rules->{count}; |
788 | $text .= sprintf " + %s (%d)", util::format_time $rules->{interval}, $rules->{count}; |
817 | $text .= sprintf " + %s (%d) BY", util::format_time $rules->{interval}, $rules->{count}; |
789 | } elsif ($rules->{timesys} == TIMESYS_CANADIAN) { |
818 | } elsif ($rules->{timesys} == TIMESYS_CANADIAN) { |
790 | $text .= util::format_time $rules->{time}; |
819 | $text .= util::format_time $rules->{time}; |
791 | $text .= sprintf " + %s/%d", util::format_time $rules->{interval}, $rules->{count}; |
820 | $text .= sprintf " + %s/%d CAN", util::format_time $rules->{interval}, $rules->{count}; |
792 | } |
821 | } |
793 | |
822 | |
794 | $self->{text}->append_text ("<infoblock>$text</infoblock>"); |
823 | $self->{text}->append_text ("<infoblock>$text</infoblock>"); |
795 | } |
824 | } |
796 | |
825 | |
797 | sub inject_resign_game { |
826 | sub inject_resign_game { |
798 | my ($self, $msg) = @_; |
827 | my ($self, $msg) = @_; |
799 | |
828 | |
800 | $self->{text}->append_text ("\n<infoblock><header>Resign</header><user>" |
829 | $self->{text}->append_text ("\n<infoblock><header>Resign</header>" |
|
|
830 | . "\n<user>" |
801 | . (util::toxml $self->{user}[$msg->{player}]->as_string) |
831 | . (util::toxml $self->{user}[$msg->{player}]->as_string) |
802 | . "</user> resigned.</infoblock>"); |
832 | . "</user> resigned.</infoblock>"); |
803 | } |
833 | } |
804 | |
834 | |
805 | sub inject_final_result { |
835 | sub inject_final_result { |
806 | my ($self, $msg) = @_; |
836 | my ($self, $msg) = @_; |
807 | |
837 | |
808 | $self->{text}->append_text ("\n<header>Game Over</header>" |
838 | $self->{text}->append_text ("<infoblock>\n<header>Game Over</header>" |
809 | . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string) |
839 | . "\nWhite Score " . (util::toxml $msg->{whitescore}->as_string) |
810 | . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string) |
840 | . "\nBlack Score " . (util::toxml $msg->{blackscore}->as_string) |
|
|
841 | . "</infoblock>" |
811 | ); |
842 | ); |
812 | } |
843 | } |
813 | |
844 | |
814 | sub destroy { |
845 | sub destroy { |
815 | my ($self) = @_; |
846 | my ($self) = @_; |