111 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Perl
		
	
	
| #! /usr/bin/perl
 | |
| 
 | |
| # this script takes a map (in new format, eg those that support
 | |
| # tiling and only save the head for multipart objects) and
 | |
| # expands it by some factor.  Note that editing of the destination
 | |
| # file will certainly be necessary, but this may be useful instead
 | |
| # of having to re-do a scaled map by hand.
 | |
| 
 | |
| $default_X_size = 16;
 | |
| $default_Y_size = 16;
 | |
| 
 | |
| $expand = 2;
 | |
| $help = 0;
 | |
| $input_map = $ARGV[$#ARGV];
 | |
| 
 | |
| # argv loop
 | |
| foreach $i (0 .. $#ARGV) {
 | |
|   if($ARGV[$i] =~ "-h") { $help = 1; }
 | |
|   if($ARGV[$i] =~ "-e") { $expand = $ARGV[++$i]; }
 | |
| }
 | |
| 
 | |
| # various help/runtime messages
 | |
| if(!$expand||!$input_map) {
 | |
|   print "USAGE: $0 -e factor <input map> > <output map> \n" ;
 | |
|   exit 0;
 | |
| }
 | |
| if($help) {
 | |
|   print "\n$0 options:\n" ;
 | |
|   print "-e\t Factor by which to expand map x,y dimensions.\n";
 | |
|   print "-h\t This help message. \n";
 | |
|   exit 0;
 | |
| }
 | |
| 
 | |
| #Read in input map
 | |
| open(FILE, $input_map)  || die "FATAL: file $input_map not found!\n";
 | |
| # process the map object special.  This is easier than trying
 | |
| # to handle the special values it has
 | |
| 
 | |
| while (<FILE>) {
 | |
| 
 | |
|     if (/^width (\d+)$/) {
 | |
| 	printf "width %d\n", $1 * $expand;
 | |
|     } elsif (/^height (\d+)$/) {
 | |
| 	printf "height %d\n", $1 * $expand;
 | |
|     } elsif (/^enter_x (\d+)$/) {
 | |
| 	printf "enter_x %d\n", $1 * $expand;
 | |
|     } elsif (/^enter_y (\d+)$/) {
 | |
| 	printf "enter_y %d\n", $1 * $expand;
 | |
|     }
 | |
|     else { print $_; }
 | |
|     last if (/^end$/);
 | |
| }
 | |
| @mapdata=<FILE>;
 | |
| close(FILE);
 | |
| 
 | |
| 
 | |
| # convert map data into objects
 | |
| while ($i<=$#mapdata) {
 | |
|   local(@datum) = split (' ',$mapdata[$i]);
 | |
|   if($datum[0] eq "arch") { $name[$objnum] = $datum[1]; }
 | |
|   elsif($datum[0] eq "end") { $objnum++; }
 | |
|   elsif($datum[0] eq "x") { $x[$objnum] = $datum[1]; }
 | |
|   elsif($datum[0] eq "y") { $y[$objnum] = $datum[1]; }
 | |
|   else {
 | |
|     push(@otherline,$mapdata[$i]); $olines_in_obj[$objnum]++;
 | |
|   }
 | |
|   $i++;
 | |
| }
 | |
| 
 | |
| 
 | |
| #Expand the map objects 1 to $objnum
 | |
| for ($j=0; $j<$objnum; $j++) {
 | |
|   &expand_obj("$j $expand $bufline");
 | |
|   $bufline += $olines_in_obj[$j];
 | |
| }
 | |
| 
 | |
| # SUBROUTINES
 | |
| 
 | |
| sub expand_obj {
 | |
|   local($data) = @_;
 | |
|   local(@temp) = split(' ',$data);
 | |
|   local($obj) = $temp[0];
 | |
|   local($factor) = $temp[1];
 | |
|   local($end_buf) = $temp[2] + $olines_in_obj[$obj];
 | |
|   local($start_x) = $x[$obj] * $factor;
 | |
|   local($start_y) = $y[$obj] * $factor;
 | |
|   local($end_x) = $start_x + $factor;
 | |
|   local($end_y) = $start_y + $factor;
 | |
| 
 | |
|   while($start_x<$end_x) {
 | |
|     while($start_y<$end_y) {
 | |
|         local($start_buf) = $temp[2];
 | |
|         if($name[$obj]) { printf("arch %s\n",$name[$obj]); }
 | |
|         else { return; }
 | |
| 
 | |
| 	printf("x %d\n",$start_x);
 | |
| 	printf("y %d\n",$start_y);
 | |
| 
 | |
|         while ($start_buf<$end_buf) {
 | |
|           print "$otherline[$start_buf]";
 | |
|           $start_buf++;
 | |
|         }
 | |
|         print"end\n";
 | |
|         $start_y++;
 | |
|     }
 | |
|     $start_x++;
 | |
|     $start_y = $y[$obj] * $factor;
 | |
|   }
 | |
| }
 | |
| 
 |