ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/Map.pm
(Generate patch)

Comparing deliantra/gde/GCE/Map.pm (file contents):
Revision 1.6 by root, Sun Feb 5 18:08:52 2006 UTC vs.
Revision 1.7 by root, Sun Feb 5 20:41:15 2006 UTC

130 $self->{width} = $map->{width} * TILESIZE; 130 $self->{width} = $map->{width} * TILESIZE;
131 $self->{height} = $map->{height} * TILESIZE; 131 $self->{height} = $map->{height} * TILESIZE;
132 132
133 $self->{x} = 133 $self->{x} =
134 $self->{y} = 0; 134 $self->{y} = 0;
135
136 $self->update_map (0, 0, $self->{width}, $self->{height});
135 137
136 $self->invalidate_all; 138 $self->invalidate_all;
137} 139}
138 140
139sub coord { 141sub coord {
271 $self->queue_draw; 273 $self->queue_draw;
272} 274}
273 275
274sub update_map { 276sub update_map {
275 my ($self, $x, $y, $w, $h) = @_; 277 my ($self, $x, $y, $w, $h) = @_;
278
279 delete $self->{overlay};
280
281 my $map = $self->{map}{map};
282 my $ov = $self->{face} ||= [];
283
284 $x = 0; $w = $self->{map}{width};
285 $y = 0; $h = $self->{map}{height};
286
287 my @x = ($x .. $x + $w - 1);
288 my @y = ($y .. $y + $h - 1);
289
290 my $TC = \%Crossfire::Gtk2::TILECACHE;
291
292 # update overlay map with bigfaces and chained faces
293 for my $x (@x) {
294 my $ass = $self->{map}{map}[$x];
295 my $oss = $ov->[$x] ||= [];
296 for my $y (@y) {
297 my $os = $oss->[$y] = [];
298 for my $a (@{ $ass->[$y] || [] }) {
299 my $o = $ARCH->{$a->{_name}}
300 or (warn "arch '$a->{_name}' not found at ($x|$y)\n"), next;
301
302 my $face = $a->{face} || $o->{face};
303 my $tile = $TC->{$face}
304 or (warn "no gfx found for arch '$a->{_name}' at ($x|$y)\n"), next;
305
306 my $idx = $tile->{idx} + $o->{x} * $tile->{w} + $o->{y};
307
308 push @$os, $idx;
309 }
310 }
311 }
276} 312}
277 313
278sub expose { 314sub expose {
279 my ($self, $event) = @_; 315 my ($self, $event) = @_;
280 316
289 325
290 my @x = ((int ($ox + $x) / TILESIZE) .. int +($ox + $x + $w + TILESIZE - 1) / TILESIZE); 326 my @x = ((int ($ox + $x) / TILESIZE) .. int +($ox + $x + $w + TILESIZE - 1) / TILESIZE);
291 my @y = ((int ($oy + $y) / TILESIZE) .. int +($oy + $y + $h + TILESIZE - 1) / TILESIZE); 327 my @y = ((int ($oy + $y) / TILESIZE) .. int +($oy + $y + $h + TILESIZE - 1) / TILESIZE);
292 328
293 my $PB = $Crossfire::Gtk2::TILECACHE; 329 my $PB = $Crossfire::Gtk2::TILECACHE;
294 my $TC = \%Crossfire::Gtk2::TILECACHE;
295 330
296 my $window = $self->{window}; 331 my $window = $self->{window};
297 332
298 my $pb = new Gtk2::Gdk::Pixbuf 'rgb', 0, 8, TILESIZE * (@x + 1), TILESIZE * (@y + 1); 333 my $pb = new Gtk2::Gdk::Pixbuf 'rgb', 0, 8, TILESIZE * (@x + 1), TILESIZE * (@y + 1);
299 $pb->fill (0x00000000); 334 $pb->fill (0x00000000);
300 335
301 for my $x (@x) { 336 for my $x (@x) {
337 my $dx = ($x - $x[0]) * TILESIZE;
302 my $as = $self->{map}{map}[$x]; 338 my $oss = $self->{face}[$x];
339
303 for my $y (@y) { 340 for my $y (@y) {
304 for my $a (@{ $as->[$y] || [] }) {
305 my $o = $ARCH->{$a->{_name}}
306 or (warn "arch '$a->{_name}' not found at ($x|$y)\n"), next;
307
308 my $face = $a->{face} || $o->{face};
309 my $tile = $TC->{$face}
310 or (warn "no gfx found for arch '$a->{_name}' at ($x|$y)\n"), next;
311
312 my $idx = $tile->{idx}; # + $a->{x} * $tile->{w} + $a->{y};
313
314 my $dx = ($x - $x[0]) * TILESIZE;
315 my $dy = ($y - $y[0]) * TILESIZE; 341 my $dy = ($y - $y[0]) * TILESIZE;
316 342
343 for my $idx (@{$oss->[$y]}) {
317 $PB->composite ($pb, 344 $PB->composite ($pb,
318 $dx, $dy, 345 $dx, $dy,
319 TILESIZE, TILESIZE, 346 TILESIZE, TILESIZE,
320 $dx - ($idx % 64) * TILESIZE, $dy - TILESIZE * int $idx / 64, 347 $dx - ($idx % 64) * TILESIZE, $dy - TILESIZE * int $idx / 64,
321 1, 1, 'nearest', 255 348 1, 1, 'nearest', 255

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines