XXX: TileSet: imager
[perl/schtarr.git] / scmap
diff --git a/scmap b/scmap
index 596a835081e6a265d2e7f3b992ba045e34f030bb..2787355bd25d81bd784a4aa8e3bc3492320405a9 100755 (executable)
--- a/scmap
+++ b/scmap
@@ -49,7 +49,7 @@ sub world {
        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
@@ -69,6 +69,9 @@ if (defined $mapsep{$SHOWMAP}) {
                : $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 '?') {
@@ -78,26 +81,52 @@ if (defined $mapsep{$SHOWMAP}) {
                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->paste(src => $tile->{sprite}, left => $x*4, top => $y*4);
+
+                       # 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