ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/kgsueme/lib/KGS/Game/Tree.pm
Revision: 1.30
Committed: Sun May 30 05:04:10 2004 UTC (22 years, 4 months ago) by pcg
Branch: MAIN
Changes since 1.29: +9 -3 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 pcg 1.28 if ($arg[0] >= 0) {
54     }
55    
56 pcg 1.1 push @{$self->{tree}}, $new;
57     push @{$node->{children}}, $new->{id};
58    
59     $node = $new;
60    
61 pcg 1.20 } elsif ($type eq "set_node") {
62     $node = $self->{tree}[$arg[0] + 1]
63     or die "set_node to undefined tree node $arg[0]+1";
64    
65     } elsif ($type eq "set_current") {
66     $up_tree = 1;
67     $node = $self->{tree}[$arg[0] + 1]
68     or die "set_current to undefined tree node $arg[0]+1";
69    
70     $self->{curnode} = $node;
71    
72     } elsif ($type eq "mark") {
73 pcg 1.12 $up_tree = 1;
74 pcg 1.20
75     my $bit = $arg[1];
76     my $ref = $node->{"$arg[2],$arg[3]"} ||= [];
77 pcg 1.1
78 pcg 1.4 $ref->[0] &= ~$exclude_type{$bit};
79 pcg 1.20 $ref->[0] |= $bit if $arg[0];
80 pcg 1.4 $ref->[1] |= $exclude_type{$bit};
81 pcg 1.1
82 pcg 1.21 $ref->[2] = $arg[4] if $bit == MARK_LABEL;
83 pcg 1.1
84 pcg 1.20 } elsif ($type eq "set_stone" or $type eq "move") {
85 pcg 1.12 $up_tree = 1;
86    
87 pcg 1.13 if ($type eq "move") {
88     $self->{lastmove_time} = $KGS::Protocol::NOW;
89 pcg 1.27 $self->{lastmove_colour} = $arg[0];
90 pcg 1.26 $up_move = $arg[1] == 255 if $self->{loaded};
91 pcg 1.13 }
92    
93 pcg 1.26 if ($arg[1] < 255) {
94     my $ref = $node->{"$arg[1],$arg[2]"} ||= [];
95 pcg 1.4
96 pcg 1.26 my $bit = $arg[0] == COLOUR_BLACK ? MARK_B
97     : $arg[0] == COLOUR_WHITE ? MARK_W
98     : 0;
99 pcg 1.3
100 pcg 1.26 $ref->[0] &= ~$exclude_type{$bit || MARK_B};
101 pcg 1.7 $ref->[0] |= $bit | ($type eq "move" ? MARK_MOVE : 0);
102 pcg 1.26 $ref->[1] |= $exclude_type{$bit || MARK_B};
103 pcg 1.7 } else {
104 pcg 1.10 warn "PLEASE REPORT: pass coordinates but type is $type" if $type ne "move";#d#
105 pcg 1.7
106     $node->{pass} = 1;
107     }
108 pcg 1.6
109 pcg 1.1 } elsif ($type eq "comment") {
110 pcg 1.30 if (!defined $arg[0]) {
111     delete $node->{comment};
112     } else {
113     $self->event_update_comments ($node, $arg[0], !exists $node->{comment});
114     $node->{comment} .= $arg[0];
115     }
116 pcg 1.3
117     } elsif ($type eq "player") {
118     $node->{player}[$arg[0]] = $arg[1];
119 pcg 1.1
120 pcg 1.9 } elsif ($type eq "rank") {
121     $node->{rank}[$arg[0]] = $arg[1];
122    
123 pcg 1.8 } elsif ($type eq "set_timer") {
124 pcg 1.10 $node->{timer}[$arg[0]] = [$arg[1], $arg[2]];
125 pcg 1.3
126 pcg 1.30 } elsif ($type eq "score") {
127     $node->{score}[$arg[0]] = $arg[1];
128    
129 pcg 1.3 } elsif ($type eq "more") {
130 pcg 1.20 die;
131 pcg 1.3
132     } elsif ($type eq "done") {
133 pcg 1.20 die;
134 pcg 1.3 $self->{loaded} = 1;
135     # nop
136 pcg 1.2
137 pcg 1.1 } else {
138 pcg 1.9 $node->{$type} = $arg[0]; # rules, date etc..
139 pcg 1.14
140     $self->event_update_rules ($arg[0]) if $type eq "rules";
141 pcg 1.1 }
142     }
143 pcg 1.12
144 pcg 1.17 $self->{curnode} = $node;
145    
146 pcg 1.12 $self->event_move ($up_move) if defined $up_move;
147 pcg 1.20
148     return $up_tree;
149 pcg 1.1 }
150    
151     sub get_path {
152     my ($self) = @_;
153    
154     my @nodes;
155    
156     my $node = $self->{curnode};
157    
158     for(;;) {
159     push @nodes, $node;
160     last unless $node->{parent};
161     $node = $self->{tree}[$node->{parent}];
162     }
163    
164     [reverse @nodes];
165     }
166    
167 pcg 1.28 sub gen_move_tree {
168     my ($self, $colour, $x, $y) = @_;
169    
170     [#d#
171 pcg 1.29 #NYI#
172 pcg 1.28 [add_node => 0],
173     ];
174     }
175    
176 pcg 1.11 sub event_move { }
177     sub event_update_tree { }
178     sub event_update_comments { }
179 pcg 1.14 sub event_update_rules { }
180 pcg 1.5
181 pcg 1.1 1;
182