160 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
| #!/usr/bin/perl
 | |
| #
 | |
| # this script goes through and collects the various image sets into crossfire-x.png
 | |
| # files, where x is the numbers from the image_info file.  This
 | |
| # collects all the images at once, whether or not they have
 | |
| # been changed or not.
 | |
| 
 | |
| # This script collects all the images.  If given a -archive option, it
 | |
| # does some additional work - checksumming the images, making a bmaps.client
 | |
| # file, and then tarring that data up.  This data can then be used on the
 | |
| # client as a fast way to 'bootstrap' the clients images.
 | |
| 
 | |
| use FileHandle;
 | |
| 
 | |
| die("No arch directory - will not rebuild $mode image file") if (! -e "arch");
 | |
| 
 | |
| $archive = 0;
 | |
| $src_path = ".";
 | |
| $TMPDIR="/tmp";
 | |
| 
 | |
| # What we will call the collection of images.
 | |
| $ARCHNAME="crossfire-images";
 | |
| $DESTDIR="$TMPDIR/$ARCHNAME";
 | |
| 
 | |
| # Maximum expected file
 | |
| $MAXFILESIZE=100000;
 | |
| 
 | |
| if ($ARGV[0] eq "-src") {
 | |
| 	$src_path = $ARGV[1];
 | |
| 	print "Using $ARGV[1] as source directory\n";
 | |
| 	die("$src_path doesn't exist.") if (! -d $src_path);
 | |
| 	shift;
 | |
| 	shift;
 | |
| }
 | |
| 
 | |
| if ($ARGV[0] eq "-archive") {
 | |
| 	$archive =1;
 | |
| 	print "Will generate appropriate files for image archive\n";
 | |
| 	die("$DESTDIR already exists - remove if you really want to remake the images") if (-d $DESTDIR);
 | |
| 	die("$0: unable to mkdir $DESTDIR: $1\n") if (!mkdir($DESTDIR, 0755));
 | |
| }
 | |
| 
 | |
| open(IMAGEINFO,"$src_path/image_info") || die("Can't open image_info file: $!\n");
 | |
| binmode(IMAGEINFO);
 | |
| while (<IMAGEINFO>) {
 | |
|     # Ignore lines that start with comments or just empty lines
 | |
|     next if /^#/;
 | |
|     next if /^\s*$/;
 | |
|     ($setnum, $ext, @rest) = split /:/;
 | |
|     # We don't actually need that data in this script, but may as well do sanity
 | |
|     # checking.
 | |
|     if ($#rest != 4) {
 | |
| 	print STDERR "image_info: line is corrupt:\n$_";
 | |
|     }
 | |
|     if ($extension[$setnum]) {
 | |
| 	print STDERR "Warning: set $setnum is duplicated in image_info file\n";
 | |
|     }
 | |
|     $extension[$setnum] = $ext;
 | |
| }
 | |
| close(IMAGEINFO);
 | |
| 
 | |
| 
 | |
| for ($count=0; $count<=$#extension; $count++) {
 | |
|     $ESRV[$count] = new FileHandle;
 | |
|     $fh = $ESRV[$count];
 | |
|     open($fh, ">crossfire.$count") ||
 | |
| 	die("Can't open crossfire.$count for write: $!\n");
 | |
| 	binmode( $fh );
 | |
| }
 | |
| 
 | |
| open(BMAPS,"bmaps.paths") || die("Can't open bmaps.paths: $!\n");
 | |
| binmode(BMAPS);
 | |
| $_ = <BMAPS>;
 | |
| while(<BMAPS>) {
 | |
|     chop;
 | |
| 
 | |
|     # we need to insert the extension for the images between the name
 | |
|     # and the number (.171 or whatever) extension, so split on that.
 | |
| 
 | |
|     die("Unknown line: '$_'\n") unless /^\\(\d{5})\s+(\S+)\.(\w\w\w)$/o;
 | |
|     $num = $1;
 | |
|     $file = $2;
 | |
|     $file1 = $3;
 | |
| 
 | |
|     print "$num $file\n" if ($num % 500) == 0 ;
 | |
|     # This probably isn't the most efficient way to do this if a
 | |
|     # large number of images are added, as we try to open each
 | |
|     # instance.
 | |
|     # OTOH, we are doing one directory
 | |
|     # at a time, so we should be hitting the DNLC at a very high
 | |
|     # rate.
 | |
| 
 | |
|     for ($count=0; $count<=$#extension; $count++) {
 | |
| 	$filename = "$file.$extension[$count].$file1.png";
 | |
| 	$fh = $ESRV[$count];
 | |
| 
 | |
| 	$length = -s "$filename";
 | |
| 	if (open(FILE,"$filename")) {
 | |
| 	    binmode( FILE );
 | |
| 	    print $fh "IMAGE $num $length $file.$file1\n";
 | |
| 	    print "Error reading file $filename" if (!read(FILE, $buf, $length));
 | |
| 	    $position = tell $fh;
 | |
| 	    print $fh $buf;
 | |
| 	    close(FILE);
 | |
| 
 | |
| 	    if ($archive) {
 | |
| 		# Now figure out the checksum
 | |
| 		# Same as what is used for the client/server - code basically
 | |
| 		# taken write form that.
 | |
| 		$sum = 0;
 | |
| 		for ($i=0; $i<$length; $i++) {
 | |
| 		    if ($sum & 01) {
 | |
| 			$sum = ($sum >> 1) | 0x80000000;
 | |
| 		    } else {
 | |
| 			$sum >>= 1;
 | |
| 		    }
 | |
| 		    $sum += ord(substr $buf, $i, 1);
 | |
| 		    $sum &= 0xffffffff;
 | |
| 		}
 | |
| 		# Do some name translation to figure out our output file name.
 | |
| 		@comps = split /\//, $file;
 | |
| 		$destfile = $comps[$#comps];
 | |
| 		push @csums, "$destfile.$file1 $sum crossfire.$extension[$count]\@$position:$length\n";
 | |
| 	    } # if archive
 | |
| 	}
 | |
| 	elsif ($count==0) {
 | |
| 	    # set 0 should have all the sets
 | |
| 	    print "Error: Image $filename not found for set 0!\n";
 | |
| 	}
 | |
| 
 | |
|     }
 | |
| }
 | |
| for ($count=0; $count<=$#extension; $count++) {
 | |
|     close($ESRV[$count]);
 | |
| }
 | |
| close(BMAPS);
 | |
| 
 | |
| if ($archive) {
 | |
|     open(OUT,">$DESTDIR/bmaps.client") || die("Can not open $DESTDIR/bmaps.client\n");
 | |
| 	binmode(OUT);
 | |
|     print OUT sort @csums;
 | |
|     close(OUT);
 | |
|     open(OUT,">$DESTDIR/README") || die("Can not open $DESTDIR/README\n");
 | |
|     print OUT "These image files for the client should be located in\n";
 | |
|     print OUT "\$prefix/share/crossfire-client.  \$prefix is the location given in the -prefix\n";
 | |
|     print OUT "option when configure is run to build the client.  The default is /usr/local.\n";
 | |
|     print OUT "In that case these files should be put in /usr/local/share/crossfire-client\n";
 | |
|     print OUT "The client will print a messgae if it is unable to find the image information\n";
 | |
|     print OUT "with the location is looked for them.\n";
 | |
|     close(OUT);
 | |
| 
 | |
|     for ($count=0; $count<=$#extension; $count++) {
 | |
| 	system("cp crossfire.$count $DESTDIR/crossfire.$extension[$count]");
 | |
|     }
 | |
|     system("cd $DESTDIR; tar cf $TMPDIR/$ARCHNAME.tar .");
 | |
|     system("mv $TMPDIR/$ARCHNAME.tar ../");
 | |
|     system("rm -rf $TMPDIR/$ARCHNAME");
 | |
| }
 | |
| 
 |