#!/usr/local/bin/perl -w
# ----------------------
# Eschaton Repair Script
# ----------------------
# With this Perl script you can repair the standard Eschaton distribution 1.1.
# Don't install the patch glfix.zip.
# All following problems are severe for Unix users only.
# Get ers from http://demospecs.half-empty.de/misc/ers.
# The "Eschaton Repair Script" copes with the following problems:
# Problem: the ZIP file contains files in the Sound and sound subdirectory.
# Solution: copy all files from Sound to sound and remove Sound.
# Problem: the ZIP file contains empty files and senseless .PK files.
# Solution: remove them.
# Problem: the ZIP file contains sound file names with upper case first char.
# Solution: rename them to lower case.
# Problem: the DEM files in the PAK file use \ instead of / as path separator.
# Solution: unpack the DEM files and apply a binary patch.
# Problem: the DEM file finesc5.dem has no leading CD track.
# Solution: copy "-1\n" at the start of the file.
# Open problem:
# Problem: there is a reference to sound/misc/crowd.wav but no file.
# Solution: unknown.
die "You _HAVE_ _TO_ change some paths in this script!
Don't run it and blame me if it doesn't work for you.
";
# 8/6/1998, Uwe Girlich (uwe@half-empty.de)
use strict;
use File::Find;
use Cwd;
# This is the Eschaton directory. It should be a subdirectory of the
# Quake directory.
# CHANGE this.
my $EschatonDir = "/home/uwe/games/q1/eschaton";
# This is the Eschaton distribution file. Get it from Jagged's Quake Movie
# Review http://www.vortexq.com/bestmovies/eschaton.zip and place it somewhere
# on your disk.
# CHANGE this.
my $EschatonZip = "/usr/self/archiv/stuff/dem/eschaton.zip";
# This is the unzip(1) command.
my $UnzipCommand = "/usr/bin/unzip";
# This is a simple PAK file manipulation tool for Unix. Get it from
# ftp://ftp.cdrom.com/pub/quake/utils/bsp_pak_tools/nwreckdum-0.0.6.tgz
# and place the binary somewhere on your disk.
# CHANGE this.
my $nwreckdum = "/usr/self/bin/nwreckdum";
# The script can be used for 2 different goals:
# 1. allnew = 0
# This unpacks the PAK file and repairs the DEM files. They will be
# placed in a new PAK file pak1.pak. This is good to make a patch for
# some existing Eschaton installation.
# 2. allnew = 1
# This unpacks the PAK file and repairs the DEM files. Now all files
# from pak0.pak will come again in such a PAK file. This is good to
# create a new full Eschaton distribution.
# CHANGE this.
my $allnew = 1;
# There is no need to change anything below this line.
# This is the directory, where the PAK files will be unpacked.
my $UnpackDir = "$EschatonDir/unpack";
# This is the name of the original PAK file.
my $OrigPakFile = "$EschatonDir/pak0.pak";
# This is the name of the new PAK file.
my $NewPakFile;
# This is the name for the new PAK directory.
my $NewpackDir;
if ($allnew) {
# This is the name of the new PAK file. allnew=1 replaces the old one.
$NewPakFile = $OrigPakFile;
# This is the name for the new PAK directory. allnew=1 packs all files
# from the old one.
$NewpackDir = $UnpackDir;
}
else {
# This is the name of the new PAK file. allnew=0 writes a new one.
$NewPakFile = "$EschatonDir/pak1.pak";
# This is the name for the new PAK directory. allnew=0 packs only the DEM
# files there.
$NewpackDir = "$EschatonDir/new";
}
# This is the nwreckdum command line to unpack the original PAK file.
my $UnpackCommand = "$nwreckdum --pak=$OrigPakFile --dir=$UnpackDir";
# This is the nwreckdum command line to pack the new PAK file.
my $NewpackCommand = "$nwreckdum --create --pak=$NewPakFile --dir=$NewpackDir";
# Memorize the current directory.
my $olddir = cwd;
# Remove all traces from former Eschaton stuff.
system "rm -rf $EschatonDir" if -d $EschatonDir;
# Create the empty Eschaton directory.
mkdir $EschatonDir, 0755;
# Change into it.
chdir $EschatonDir;
# Unzip the Eschaton distribution file there.
system "$UnzipCommand $EschatonZip";
# Copy all the files from the Sound directory over to sound.
system "cp -p -r Sound/* sound";
# Remove the Sound directory
system "rm -r -f Sound";
# Repair some file names and remove senseless dummy files.
find(\&wanted, 'sound');
# Unpack the PAK file.
system "$UnpackCommand";
# Create a new directory for the repaired DEM files.
mkdir $NewpackDir, 0755 if !-d $NewpackDir;
# Go over all unpacked DEM files.
my $file;
foreach $file (glob "$UnpackDir/*.dem") {
# Read the DEM file in.
open F,$file or die "can't read $file: $!\n";
my $text=join "", <F>;
close F;
# If something was lost, stop.
if (length($text) != -s $file) {
die sprintf "file length=%d, should be %d\n", length($text), -s $file;
}
# Change foo\bar\file.wav to foo/bar/file.wav.
$text =~ s,([\w -]+)\\([\w -]+)\\([\w \-+]+\.wav),$1/$2/$3,g;
# Change foo\file.wav to foo/file.wav.
$text =~ s,([\w -]+)\\([\w \-+]+\.wav),$1/$2,g;
# Calculate the new file name in the new directory.
$file =~ s ,.*/,,g;
$file = "$NewpackDir/$file";
# Open a new DEM file for writing.
open F,">$file" or die "can't write $file: $!\n";
# Write the CD track at the beginning of finesc5.dem.
print F "-1\n" if $file =~ /finesc5.dem/;
# Write the changed file contents.
print F $text;
# Close it.
close F;
}
# Pack the new PAK file.
system $NewpackCommand;
# Remove the unpack directory.
system "rm -r -f $UnpackDir" if -d $UnpackDir;
# Remove the new directory for repaired DEM files.
system "rm -r -f $NewpackDir" if -d $NewpackDir;
# Change back to the old directory.
chdir $olddir;
# End.
0;
# This is the routine, which will be called from the find subroutine
# to repair some minor file problems.
sub wanted {
# Remove the file, if it is empty or a .pk file.
unlink $_ if -z || /.pk$/;
# Rename all the files to lower case.
rename $_, lc $_ if $_ ne lc $_;
}