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.8 by pcg, Sat May 31 15:19:55 2003 UTC vs.
Revision 1.19 by pcg, Sun Jun 1 05:18:15 2003 UTC

5 5
6use base KGS::Listener::Game; 6use base KGS::Listener::Game;
7use base KGS::Game; 7use base KGS::Game;
8 8
9use base gtk::widget; 9use base gtk::widget;
10
11use POSIX qw(ceil);
10 12
11sub new { 13sub new {
12 my $self = shift; 14 my $self = shift;
13 $self = $self->SUPER::new(@_); 15 $self = $self->SUPER::new(@_);
14 16
38 { 40 {
39 # grrr... 41 # grrr...
40 $frame->add(my $vbox = new Gtk2::VBox); 42 $frame->add(my $vbox = new Gtk2::VBox);
41 $vbox->add($self->{title} = new Gtk2::Label $title); 43 $vbox->add($self->{title} = new Gtk2::Label $title);
42 44
43 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.01, 0.1, 0; 45 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0;
44 46
45 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); 47 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj});
46 $scale->set_draw_value (0); 48 $scale->set_draw_value (0);
47 49
48 $self->{moveadj}->signal_connect (value_changed => sub { 50 $self->{moveadj}->signal_connect (value_changed => sub {
49 return unless $self->{path}; 51 return unless $self->{path};
50 52
51 my $move = int (@{$self->{path}} * $_[0]->get_value); 53 my $move = int (@{$self->{path}} * $_[0]->get_value);
52 54
55 $self->{board_label}->set_text ("Move $move");
56
53 $self->{board} = new KGS::Game::Board $self->{size}; 57 $self->{board} = new KGS::Game::Board $self->{size};
54 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]); 58 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]);
55 59
56 $self->redraw ($self->repaint_board); 60 $self->redraw ($self->repaint_board);
57 61
58 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment}); 62 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
59 }); 63 });
60 } 64 }
61 65
62 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0); 66 #d#TYPOE
67 $vbox->pack_start((my $aspect_frame = gtk_aspect_frame_new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0);
68 $aspect_frame->set (border_width => 0);
69 $aspect_frame->set (shadow_type => 'none');
70 $self->{board_label} = $aspect_frame->get_label_widget;
71
72 $aspect_frame->add($self->{canvas} = new Gtk2::DrawingArea);
73 $self->{canvas}->double_buffered (0);
63 74
64 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 75 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
65 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 76 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
66 77
67 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); 78 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0);
69 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; 80 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80;
70 81
71 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); 82 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow);
72 $sw->set_policy("automatic", "always"); 83 $sw->set_policy("automatic", "always");
73 84
74 $sw->add(($self->{userlist} = new gtk::userlist)->widget); 85 $sw->add(($self->{userlist} = new userlist)->widget);
75 86
76 $self->{vpane}->add(my $vbox = new Gtk2::VBox); 87 $self->{vpane}->add(my $vbox = new Gtk2::VBox);
77 88
78 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); 89 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0);
79 $sw->set_policy("never", "always"); 90 $sw->set_policy("never", "always");
81 $sw->add(($self->{text} = new gtk::text)->widget); 92 $sw->add(($self->{text} = new gtk::text)->widget);
82 93
83 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); 94 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0);
84 $self->{entry}->signal_connect(activate => sub { 95 $self->{entry}->signal_connect(activate => sub {
85 my $text = $self->{entry}->get_text; 96 my $text = $self->{entry}->get_text;
86 # add message 97 $self->say($text) if $text =~ /\S/;
87 $self->{entry}->set_text(""); 98 $self->{entry}->set_text("");
88 }); 99 });
89 100
90 $self; 101 $self;
91} 102}
92 103
93sub event_update_users { 104sub event_update_users {
94 my ($self) = @_; 105 my ($self, $add, $update, $remove) = @_;
95 106
96 $self->{userlist}->update($self->{users}); 107 $self->{userlist}->update ($add, $update, $remove);
97} 108}
98 109
99sub join { 110sub join {
100 my ($self) = @_; 111 my ($self) = @_;
101 $self->SUPER::join; 112 $self->SUPER::join;
124 my ($widget, $event, $self) = @_; 135 my ($widget, $event, $self) = @_;
125 136
126 $self->{pixbuf} or return; 137 $self->{pixbuf} or return;
127 138
128 my $area = $event->area; 139 my $area = $event->area;
129 my ($ox, $oy, $s) = @{$self->{offsets}};
130 140
131 $self->redraw ( 141 $self->redraw ($area);
132 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
133 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
134 );
135 142
136 0; 143 0;
137} 144}
138 145
139# something Gtk2 fixed 146# something Gtk2 fixed
176 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { 183 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) {
177 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000; 184 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000;
178 185
179 # zeroeth the shadow 186 # zeroeth the shadow
180 if ($mark & (MARK_B | MARK_W)) { 187 if ($mark & (MARK_B | MARK_W)) {
181 $::black_img[0]->composite ( 188 $::shadow_img->composite (
182 $base, $shadow, $shadow, $size, $size, $shadow-0.5, $shadow-0.5, 189 $base, $shadow, $shadow, $size, $size, $shadow - 0.5, $shadow - 0.5,
183 $size / $stone->get_width, $size / $stone->get_height, 190 $size / $stone->get_width, $size / $stone->get_height,
184 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 128 191 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192
185 ); 192 );
186 } 193 }
187 194
188 # first the big stones (handicap stones different for effect) 195 # first the big stones (handicap stones different for effect)
189 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192], 196 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192],
191 [MARK_GRAY_B, 128], 198 [MARK_GRAY_B, 128],
192 [MARK_GRAY_W, 128]) { 199 [MARK_GRAY_W, 128]) {
193 my ($mask, $alpha) = @$_; 200 my ($mask, $alpha) = @$_;
194 if ($mark & $mask) { 201 if ($mark & $mask) {
195 $stone->composite ( 202 $stone->composite (
196 $base, 0, 0, $size, $size, -0.5, -0.5, 203 $base, 0, 0, $size, $size, 0, 0,
197 $size / $stone->get_width, $size / $stone->get_height, 204 $size / $stone->get_width, $size / $stone->get_height,
198 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha 205 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha
199 ); 206 );
200 } 207 }
201 } 208 }
202 209
203 # then the samll stones 210 # then the small stones
204 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], 211 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]],
205 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { 212 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) {
206 my ($mask, $img) = @$_; 213 my ($mask, $img) = @$_;
207 if ($mark & $mask) { 214 if ($mark & $mask) {
208 $img->composite ( 215 $img->composite (
209 $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2, 216 $base, (ceil ($size / 4)) x2, (ceil ($size / 2)) x2, (ceil ($size / 4)) x2,
210 $size / $img->get_width / 2, $size / $img->get_height / 2, 217 $size / $img->get_width / 2, $size / $img->get_height / 2,
211 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 218 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 224
212 ); 219 );
213 } 220 }
214 } 221 }
215 222
216 # and lastly any markers 223 # and lastly any markers
251 $x -= ($W * $s + $spacing * (@c - 1)) * 0.5; 258 $x -= ($W * $s + $spacing * (@c - 1)) * 0.5;
252 $y -= $height * 0.5; 259 $y -= $height * 0.5;
253 260
254 for (@c) { 261 for (@c) {
255 my $w = $_->get_width * $s; 262 my $w = $_->get_width * $s;
263 # +2 == don't fight the rounding
256 $_->composite ($pixbuf, 264 $_->composite ($pixbuf,
257 $x, $y, $w+1, $height+1, $x, $y, $s, $s, 265 $x, $y, $w+2, $height+2, $x, $y, $s, $s,
258 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); 266 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255);
259 267
260 $x += $w + $spacing; 268 $x += $w + $spacing;
261 } 269 }
262 } 270 }
276 my $expose_area = undef; 284 my $expose_area = undef;
277 285
278 return $expose_area unless $self->{board}; 286 return $expose_area unless $self->{board};
279 287
280 my ($w, $h) = ($canvas->allocation->values)[2,3]; 288 my ($w, $h) = ($canvas->allocation->values)[2,3];
289
290 die "FATAL: board aspect ratio != 1" unless $w == $h;
281 291
282 my $s = $w > $h ? $h : $w; 292 my $s = $w;
283 293
284 return unless $s > 128; 294 return unless $s >= 200;
285 295
286 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s];
287
288 my $size = $self->{size}; 296 my $size = $self->{size};
289 297
298 # we leave enough space for the shadows.. I like smaller stones, and we
299 # do no need to do the nifty recursive screen updates that goban2 does
290 my $border = int ($s / ($size + 3) * 0.5); 300 my $border = int ($s / ($size + 3) * 0.5);
291 my $s2 = $s - $border * 2; 301 my $s2 = $s - $border * 2;
292 my $edge = int ($s2 / ($size + 1) * 0.95) - ($::config->{randomize} ? 3 : 0); 302 my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0);
293 my $ofs = int ($edge / 2); 303 my $ofs = int ($edge / 2);
294 304
295 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size; 305 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size;
296 306
297 my $pixbuf; 307 my $pixbuf;
419sub redraw { 429sub redraw {
420 my ($self, $area) = @_; 430 my ($self, $area) = @_;
421 431
422 if ($area && $self->{pixbuf}) { 432 if ($area && $self->{pixbuf}) {
423 my ($x, $y, $w, $h) = $area->values; 433 my ($x, $y, $w, $h) = $area->values;
424 my ($ox, $oy, $s) = @{$self->{offsets}};
425 434
426 $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf}, 435 $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf},
427 $x, $y, $x + $ox, $y + $oy, $w, $h, 436 $x, $y, $x, $y, $w, $h,
428 "normal", 0, 0); 437 "normal", 0, 0);
429 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, 438 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0,
430 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; 439 $x - 1, $y - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE;
431 } 440 }
432} 441}
433 442
434sub event_update_tree { 443sub event_update_tree {
435 my ($self) = @_; 444 my ($self) = @_;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines