ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/kgsueme/lib/KGS/Game/Tree.pm
Revision: 1.31
Committed: Sun May 30 06:40:21 2004 UTC (22 years, 4 months ago) by pcg
Branch: MAIN
Changes since 1.30: +8 -9 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.27 $self->{lastmove_colour} = $arg[0];
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.30 if (!defined $arg[0]) {
108     delete $node->{comment};
109     } else {
110     $self->event_update_comments ($node, $arg[0], !exists $node->{comment});
111     $node->{comment} .= $arg[0];
112     }
113 pcg 1.3
114 pcg 1.31 } elsif ($type eq "set_timer") {
115     $up_tree = 1;#d#
116     $node->{timer}[$arg[0]] = [$arg[1], $arg[2]];
117    
118     } elsif ($type eq "score") {
119     $up_tree = 1;
120     $node->{score}[$arg[0]] = $arg[1];
121    
122 pcg 1.3 } elsif ($type eq "player") {
123     $node->{player}[$arg[0]] = $arg[1];
124 pcg 1.1
125 pcg 1.9 } elsif ($type eq "rank") {
126     $node->{rank}[$arg[0]] = $arg[1];
127    
128 pcg 1.3 } elsif ($type eq "more") {
129 pcg 1.20 die;
130 pcg 1.3
131     } elsif ($type eq "done") {
132 pcg 1.20 die;
133 pcg 1.3 $self->{loaded} = 1;
134     # nop
135 pcg 1.2
136 pcg 1.1 } else {
137 pcg 1.9 $node->{$type} = $arg[0]; # rules, date etc..
138 pcg 1.14
139     $self->event_update_rules ($arg[0]) if $type eq "rules";
140 pcg 1.1 }
141     }
142 pcg 1.12
143 pcg 1.17 $self->{curnode} = $node;
144    
145 pcg 1.12 $self->event_move ($up_move) if defined $up_move;
146 pcg 1.20
147     return $up_tree;
148 pcg 1.1 }
149    
150     sub get_path {
151     my ($self) = @_;
152    
153     my @nodes;
154    
155     my $node = $self->{curnode};
156    
157     for(;;) {
158     push @nodes, $node;
159     last unless $node->{parent};
160     $node = $self->{tree}[$node->{parent}];
161     }
162    
163     [reverse @nodes];
164     }
165    
166 pcg 1.28 sub gen_move_tree {
167     my ($self, $colour, $x, $y) = @_;
168    
169     [#d#
170 pcg 1.29 #NYI#
171 pcg 1.28 [add_node => 0],
172     ];
173     }
174    
175 pcg 1.11 sub event_move { }
176     sub event_update_tree { }
177     sub event_update_comments { }
178 pcg 1.14 sub event_update_rules { }
179 pcg 1.5
180 pcg 1.1 1;
181