ys2-intro/loader/tools/compressedfileconverter.pl
2025-11-13 19:07:39 +03:00

86 lines
2 KiB
Perl
Executable file

#!/usr/bin/env perl
=head1 NAME
compressedfileconverter.pl
=head1 DESCRIPTION
This script converts files compressed by some crunchers
so they can be loaded and decompressed in-place, on the fly.
=head1 SYNOPSIS
compressedfileconverter.pl [dnx|lc] uncompressed_infile compressed_infile outfile
=cut
use strict;
use warnings;
my %margins = (
'' => 0,
'dnx' => 4,
'lc' => 3
);
my $type = '';
if (scalar @ARGV == 4) {
$type = shift @ARGV;
}
if (!($type ~~ %margins) or (scalar @ARGV != 3)) {
die "Usage: $0 [dnx|lc] uncompressed_infile compressed_infile outfile\n";
}
my $uncompressed_infile = shift @ARGV;
my $compressed_infile = shift @ARGV;
my $converted_outfile = shift @ARGV;
open UNCOMPRESSED, $uncompressed_infile
or die "\nCan't open uncompressed file $uncompressed_infile for reading: $!\n";
binmode UNCOMPRESSED;
my $uncompressed_address;
read(UNCOMPRESSED, $uncompressed_address, 2);
my $uncompressed_data;
my $uncompressed_size = read(UNCOMPRESSED, $uncompressed_data, 65536);
$uncompressed_address = unpack("S", $uncompressed_address);
close UNCOMPRESSED;
open COMPRESSED, $compressed_infile
or die "\nCan't open compressed file $compressed_infile for reading: $!\n";
binmode COMPRESSED;
my $compressed_data;
if (!($type eq 'lc')) {
my $compressed_address;
read(COMPRESSED, $compressed_address, 2);
}
my $compressed_size = read(COMPRESSED, $compressed_data, 65536);
close COMPRESSED;
open CONVERTED, ">$converted_outfile"
or die "\nCan't open converted file $converted_outfile for writing: $!\n";
binmode CONVERTED;
my $offset = 0;
my $safety_margin = $margins{$type};
$compressed_size += $offset;
my $converted_address = $uncompressed_address + $uncompressed_size + $safety_margin - $compressed_size;
$converted_address = pack("S", $converted_address);
print CONVERTED $converted_address;
if ($offset) {
$uncompressed_address = pack("S<", $uncompressed_address);
print CONVERTED $uncompressed_address;
}
print CONVERTED $compressed_data;
close CONVERTED;
exit 0;