my $self = shift;
# ERA: 0 1 2 3 4 5 6 7
my @worlds = qw(badlands platform install ashworld jungle desert ice twilight);
- return $worlds[$self->era] || "?";
+ return $worlds[$self->era & 7] || "?";
}
# MTXM TILE
: $map->tiles;#_parsed;
if ($SHOWMAP eq "ppm") {
+ use Imager;
+ my $img = Imager->new(xsize => $map->width * 4, ysize => $map->width * 4);
+
use Data::StarCraft::Tileset;
my $era = world($map);
if ($era eq '?') {
my $tileset = Data::StarCraft::Tileset->open("/home/shiar/sc/tileset_$era")
or die "No tileset for world $era";
- printf "P3\n%d %d\n255\n", $map->info->{x}, $map->info->{y};
+ my ($x, $y) = (0, 0);
for (@$tiles) {
- my $tile = $tileset->tileavg($_);
- my $div = 1;#$tile->{walk} > 1 ? 1 : 1.8;
- my @rgb = map {int($_ / $div)} @{ $tile->{col} };
- if (($tile->{walk} & 1) == 0 and $tile->{walk} < 10) {
-# $rgb[2] += 128;
- $rgb[0] *= 3;
- $rgb[1] *= 3;
- $rgb[2] *= 3;
- } elsif ($tile->{build}) {
- $rgb[0] += 48;
-# $rgb[$_] = int($rgb[$_] / 1.5) for 0..2;
+ # 128x128 ~ 6s
+# my $tile = $tileset->tileavg($_);
+# $img->setpixel(x => $x, y => $y, color => $tile->{col});
+
+ # 512x512 ~ 7s
+ my $tile = $tileset->tile($_);
+ $img->setscanline(
+ x => $x*4, y => $y*4 + $_, pixels => pack('(CCCx)*',
+ map { @$_ } @{ $tile->{subcol} }[$_*4 .. $_*4 + 3]
+ ),
+ ) for 0..3;
+
+ # 4096x4096 ~ 75s
+# my $tile = $tileset->sprite($tileset->{map}->[$_]);
+# $img->setscanline(
+# x => $x*32, y => $y*32 + $_, pixels => pack('(CCCx)*',
+# map { @{ $tileset->{palette}->[$_] } } @$tile[$_*32 .. $_*32+31]
+# ),
+# ) for 0..31;
+ }
+ continue {
+ $x++;
+ if ($x >= $map->width) {
+ $y++;
+ $x = 0;
}
- $_ = join ' ', @rgb;
}
+
+ $img->write(fd => fileno(STDOUT), type => 'png')
+ or die 'Cannot output image: ', $img->errstr;
}
+=cut
while (my @line = splice @$tiles, 0, $map->width) {
printf "%s\n", join $MAPCHARSEP, @line;
}
+=cut
}
+=head1 scmap
+
+From replay:
+
+ old/screptomap somereplay.rep | ./scmap -m=ppm > map.ppm
+
+From map:
+
+ ./scmtomap starcraft/maps/ladder/'(4)Lost Temple.scm'
+ ./scmap -m=ppm < file000001.xxx > map.ppm
+
+=cut