From 3cf62787f6c8f6d7a7972bc3f09e5e3ddc92447e Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Thu, 12 Feb 2009 06:07:55 +0100 Subject: [PATCH] XXX: handle multiple MTXM chunks correctly (tileset obfuscation for example in BlitzX_200) --- Data-StarCraft/lib/Data/StarCraft/Map.pm | 21 ++++++++++++++++++--- scmap | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Data-StarCraft/lib/Data/StarCraft/Map.pm b/Data-StarCraft/lib/Data/StarCraft/Map.pm index cb5dc0f..e51674c 100644 --- a/Data-StarCraft/lib/Data/StarCraft/Map.pm +++ b/Data-StarCraft/lib/Data/StarCraft/Map.pm @@ -30,8 +30,16 @@ sub open { or die "Couldn't chunk header\n"; $type =~ s/ +$//; #printf STDERR "%s: %s\n", $type, $size; - defined $self->{$type} and warn "duplicate map chunk $type\n"; - $self->{$type} = $self->_read($file, $size); + if (defined $self->{$type}) { + # redefinitions (partially) override earlier data from start + warn "duplicate map chunk $type\n"; + my $prepend = $self->_read($file, $size); + substr($self->{$type}, 0, length($prepend)) = $prepend; + next; + } + else { + $self->{$type} = $self->_read($file, $size); + } } return $self; } @@ -54,12 +62,19 @@ sub width { return $_[0]->info->{x}; } +sub height { + return $_[0]->info->{y}; +} + sub tiles { my $self = shift; my @map = unpack 'v*', $self->{MTXM}; @map == $#map + 1 or warn(sprintf - "couldn't parse map: only %d tiles\n", scalar @map + "Couldn't parse map: only %d tiles\n", scalar @map ), return; + warn sprintf("Only %d tiles in MTXM, but expecting %dx%d", + scalar @map, $self->width, $self->height + ) if scalar @map != $self->width * $self->height; return \@map; } diff --git a/scmap b/scmap index 2787355..f636b25 100755 --- a/scmap +++ b/scmap @@ -70,7 +70,7 @@ if (defined $mapsep{$SHOWMAP}) { if ($SHOWMAP eq "ppm") { use Imager; - my $img = Imager->new(xsize => $map->width * 4, ysize => $map->width * 4); + my $img = Imager->new(xsize => $map->width * 4, ysize => $map->height * 4); use Data::StarCraft::Tileset; my $era = world($map); -- 2.30.0