… | |
… | |
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 | |
139 | sub coord { |
141 | sub coord { |
… | |
… | |
271 | $self->queue_draw; |
273 | $self->queue_draw; |
272 | } |
274 | } |
273 | |
275 | |
274 | sub update_map { |
276 | sub 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 | |
278 | sub expose { |
314 | sub 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 |