ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/lib/KGS/Game/Tree.pm
Revision: 1.26
Committed: Mon May 17 01:24:23 2004 UTC (22 years, 6 months ago) by pcg
Branch: MAIN
Changes since 1.25: +10 -21 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 package KGS::Game::Tree;
2    
3 pcg 1.25 use Gtk2::GoBoard::Constants;
4 pcg 1.22
5 pcg 1.1 use KGS::Constants;
6    
7     # exclusion masks... the bit on the left excludes (removes) the ones on the right
8     my %exclude_type = (
9     &MARK_TRIANGLE => MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL,
10     &MARK_SQUARE => MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL,
11     &MARK_CIRCLE => MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL,
12     &MARK_LABEL => MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL,
13 pcg 1.20 &MARK_SMALL_B => MARK_SMALL_B | MARK_SMALL_W | MARK_MOVE,
14     &MARK_SMALL_W => MARK_SMALL_B | MARK_SMALL_W | MARK_MOVE,
15     &MARK_GRAYED => MARK_MOVE | MARK_GRAYED,
16 pcg 1.26 &MARK_B => MARK_B | MARK_W | MARK_MOVE | MARK_GRAYED, #d# was !MARK_GRAYED here
17     &MARK_W => MARK_B | MARK_W | MARK_MOVE | MARK_GRAYED, #d# was !MARK_GRAYED here
18 pcg 1.1 );
19    
20     sub init_tree {
21     my ($self) = @_;
22 pcg 1.11 $self->{tree} = [ {
23     id => 0,
24 pcg 1.17 move => -1,
25 pcg 1.11 } ];
26 pcg 1.1 }
27    
28     sub update_tree {
29 pcg 1.10 my ($self, $tree) = @_;
30 pcg 1.1
31     my $node = $self->{curnode};
32    
33 pcg 1.12 my $up_tree;
34     my $up_move;
35    
36 pcg 1.23 #Carp::cluck KGS::Listener::Debug::dumpval $tree;#d#
37 pcg 1.20
38 pcg 1.18 #warn "update_tree = ".KGS::Listener::Debug::dumpval $tree;#d#
39    
40 pcg 1.1 for (@$tree) {
41     my ($type, @arg) = @$_;
42 pcg 1.20 if ($type eq "add_node") {
43 pcg 1.12 $up_tree = 1;
44 pcg 1.1 $node = $self->{tree}[$arg[0] + 1]
45 pcg 1.3 or die "FATAL: referencing nonexistent node $arg[0]+1!";
46 pcg 1.1
47 pcg 1.11 my $new = {
48     id => scalar @{$self->{tree}},
49     parent => $node->{id},
50     move => $node->{move} + 1,
51     };
52 pcg 1.1
53     push @{$self->{tree}}, $new;
54     push @{$node->{children}}, $new->{id};
55    
56     $node = $new;
57    
58 pcg 1.20 } elsif ($type eq "set_node") {
59     $node = $self->{tree}[$arg[0] + 1]
60     or die "set_node to undefined tree node $arg[0]+1";
61    
62     } elsif ($type eq "set_current") {
63     $up_tree = 1;
64     $node = $self->{tree}[$arg[0] + 1]
65     or die "set_current to undefined tree node $arg[0]+1";
66    
67     $self->{curnode} = $node;
68    
69     } elsif ($type eq "mark") {
70 pcg 1.12 $up_tree = 1;
71 pcg 1.20
72     my $bit = $arg[1];
73     my $ref = $node->{"$arg[2],$arg[3]"} ||= [];
74 pcg 1.1
75 pcg 1.4 $ref->[0] &= ~$exclude_type{$bit};
76 pcg 1.20 $ref->[0] |= $bit if $arg[0];
77 pcg 1.4 $ref->[1] |= $exclude_type{$bit};
78 pcg 1.1
79 pcg 1.21 $ref->[2] = $arg[4] if $bit == MARK_LABEL;
80 pcg 1.1
81 pcg 1.20 } elsif ($type eq "set_stone" or $type eq "move") {
82 pcg 1.12 $up_tree = 1;
83    
84 pcg 1.13 if ($type eq "move") {
85     $self->{lastmove_time} = $KGS::Protocol::NOW;
86 pcg 1.20 $self->{lastmove_colour} = $arg[1];
87 pcg 1.26 $up_move = $arg[1] == 255 if $self->{loaded};
88 pcg 1.13 }
89    
90 pcg 1.26 if ($arg[1] < 255) {
91     my $ref = $node->{"$arg[1],$arg[2]"} ||= [];
92 pcg 1.4
93 pcg 1.26 my $bit = $arg[0] == COLOUR_BLACK ? MARK_B
94     : $arg[0] == COLOUR_WHITE ? MARK_W
95     : 0;
96 pcg 1.3
97 pcg 1.26 $ref->[0] &= ~$exclude_type{$bit || MARK_B};
98 pcg 1.7 $ref->[0] |= $bit | ($type eq "move" ? MARK_MOVE : 0);
99 pcg 1.26 $ref->[1] |= $exclude_type{$bit || MARK_B};
100 pcg 1.7 } else {
101 pcg 1.10 warn "PLEASE REPORT: pass coordinates but type is $type" if $type ne "move";#d#
102 pcg 1.7
103     $node->{pass} = 1;
104     }
105 pcg 1.6
106 pcg 1.1 } elsif ($type eq "comment") {
107 pcg 1.11 $self->event_update_comments ($node, $arg[0], !exists $node->{comment});
108    
109 pcg 1.3 $node->{comment} .= $arg[0];
110    
111     } elsif ($type eq "player") {
112     $node->{player}[$arg[0]] = $arg[1];
113 pcg 1.1
114 pcg 1.9 } elsif ($type eq "rank") {
115     $node->{rank}[$arg[0]] = $arg[1];
116    
117 pcg 1.8 } elsif ($type eq "set_timer") {
118 pcg 1.10 $node->{timer}[$arg[0]] = [$arg[1], $arg[2]];
119 pcg 1.3
120     } elsif ($type eq "more") {
121 pcg 1.20 die;
122 pcg 1.3
123     } elsif ($type eq "done") {
124 pcg 1.20 die;
125 pcg 1.3 $self->{loaded} = 1;
126     # nop
127 pcg 1.2
128 pcg 1.1 } else {
129 pcg 1.9 $node->{$type} = $arg[0]; # rules, date etc..
130 pcg 1.14
131     $self->event_update_rules ($arg[0]) if $type eq "rules";
132 pcg 1.1 }
133     }
134 pcg 1.12
135 pcg 1.17 $self->{curnode} = $node;
136    
137 pcg 1.12 $self->event_move ($up_move) if defined $up_move;
138 pcg 1.20
139     return $up_tree;
140 pcg 1.1 }
141    
142     sub get_path {
143     my ($self) = @_;
144    
145     my @nodes;
146    
147     my $node = $self->{curnode};
148    
149     for(;;) {
150     push @nodes, $node;
151     last unless $node->{parent};
152     $node = $self->{tree}[$node->{parent}];
153     }
154    
155     [reverse @nodes];
156     }
157    
158 pcg 1.11 sub event_move { }
159     sub event_update_tree { }
160     sub event_update_comments { }
161 pcg 1.14 sub event_update_rules { }
162 pcg 1.5
163 pcg 1.1 1;
164