#!/usr/bin/perl -w
# ---------------------------
# MUlti-Level DEmo Repair kit
# ---------------------------
# With this Perl script you can repair multi-level DM2 text files (created
# with LMPC --to-txt) or split them into single-level recordings. They can
# than be replayed by Quake II as usual.
# Find out more on this topic on
# http://demospecs.half-empty.de/faq/faq.html#REPAIRDM2.
# Get MULDER (without HTML decorations) from
# http://demospecs.half-empty.de/misc/mulder.
# Uwe Girlich (uwe@half-empty.de)
use strict;
use IO::File;
use vars qw($opt_h);
use Getopt::Std;
my $release = "1.0.5";
my $date = "8/6/2006";
my $comment = "stable version";
getopts('h');
if ($opt_h || (@ARGV != 2)) {
print "The MUlti-Level DEmo Repair kit\n";
print "MULDER (c) Uwe Girlich, 1998-2006, Release $release $date ($comment)\n";
print "mulder DM2_text_in DM2_text_out\n";
print "DM2_text_out may contain a printf place-holder like %d.\n";
print "In this case MULDER splits the DM2 text file at the level change\n";
print "and replaces the place-holder with the level number beginning with 1.\n";
exit;
}
my $level = 0;
my ($textin,$baseout) = @ARGV;
my $fhtextin = new IO::File "<$textin" or die "can't read $textin: $!\n";
my $split = 0;
if ((sprintf "$baseout", $level) ne $baseout) {
$split = 1;
}
my $fhtextout = new IO::File;
my $block = "";
while (<$fhtextin>) {
if (/serverdata/) {
if ($split) {
if ($fhtextout->opened) {
print $fhtextout "endblock;\n";
$fhtextout->close;
}
}
$level++;
if ($split || ($level == 1)) {
my $textout = sprintf "$baseout", $level;
$fhtextout->open(">$textout") or die "can't write $textout: $!\n";
print "$textin (DM2 txt) -> $textout (DM2 txt)\n";
}
}
s/betweenblock\s*;//g;
s/reconnect\s*;//g;
s/stufftext\s*\"reconnect\\n\"\s*;/nop;/g;
s/stufftext\s*\"cmd\s*configstrings\s+\d+\s+\d+\\n\";/nop;/g;
s/stufftext\s*\"cmd\s*baselines\s+\d+\s+\d+\\n\";/nop;/g;
s/(stufftext\s*\"precache)\s*\d+(\\n\"\s*;)/$1$2/g;
s/stufftext\s*\"record\s*\w+\\n\"\s*;/nop;/g;
if (/^\s*download/) {
my $dummy = <$fhtextin>;
$dummy = <$fhtextin>;
$dummy = <$fhtextin>;
$_=" nop;\n";
}
s/(isdemo\s+)0(\s*;)/${1}1$2/;
if (/^block {/ || /^endblock;/) {
$block = "";
}
$block .= $_;
if (/^}\n$/) {
print $fhtextout $block if $fhtextout->opened;
}
}
$fhtextin->close;
$fhtextout->close;