#!/usr/bin/perl
use strict;
my $ftext;
my $ifn = $ARGV[0];
my $ofn = $ifn;
$ofn =~ s/qsg$/decqsg/;
#my $OFH;
##open $OFH, ">&STDOUT" or die "Can't dup STDOUT: $!";
#open $OFH, ">$ofn" or die "Can't open $ofn for output: $!";
{
my $FH;
open $FH, $ifn or die "Unable to open $ifn: $!";
local $/ = undef;
$ftext = <$FH>;
}
my @chars = split //, $ftext;
my %ht = ();
my $fn;
{
my $tmp_line = '';
my @out_lines = ();
sub push_char { $tmp_line .= chr $_[0]; }
sub push_line { push @out_lines, $tmp_line; $tmp_line = ''; }
sub get_lines { return @out_lines; }
}
sub getnum {
if ($_[0] =~ /^[0-9]*$/) { return $_[0]; }
die "Bad number format '$_[0]'";
}
for ($fn = 0; $chars[$fn] ne chr 0; $fn ++) {
push_char (ord $chars[$fn]);
}
push_line();
for (++ $fn; $chars[$fn] ne chr 0; $fn ++) {
push_char (ord $chars[$fn]);
}
#print $OFH "\n";
push_line();
for (++ $fn; $fn < @chars; $fn ++) {
my $n = 255 - ord $chars[$fn];
if ($n == 0) {
#print $OFH "\n";
push_line();
} elsif ($n == 1) {
push_char($n); push_line();
} else {
#print $OFH chr $n;
push_char($n);
}
#print $OFH chr(255 - ord $chars[$fn]);
}
my @result = get_lines();
#for (my $n = 0; $n < @result; $n ++) {
# print $n, ": ", $result[$n], "\n";
#}
my $line_num = 0;
my $table_size;
sub show_result {
for (my $i = 0; $i < @result; $i ++) {
print "$i: $result[$i]\n";
}
}
if ($ARGV[1] eq '-raw') {
show_result(); die;
}
print "Save version: ", $result[$line_num ++], "\n";
print "Game File: ", $result[$line_num ++], "\n";
print "Current room: ", $result[$line_num ++], "\n";
print "\nTable A (properties?): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
print " properties $n: name '", $result[$line_num++], "', data '", $result[$line_num ++], "'\n";
}
my $s0 = '';
my $s1 = chr(1);
print "\nTable B (Objects): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
#print " Object $n: name '", $result[$line_num ++], "', 1: '", $result[$line_num ++], "', 2: '", $result[$line_num ++], "', 3: '", $result[$line_num ++], "'\n";
my ($p1, $p2, $t) = ($result[$line_num + 1], $result[$line_num + 2], '');
if ($p1 eq $s0 && $p2 eq $s0) { $t = 'HI'; }
if ($p1 eq $s0 && $p2 eq $s1) { $t = 'H '; }
if ($p1 eq $s1 && $p2 eq $s0) { $t = 'I '; }
if ($p1 eq $s1 && $p2 eq $s1) { $t = ' '; }
if ($t eq '') {
print " objt $n: name '", $result[$line_num ++], "', 1: '", $result[$line_num ++], "', 2: '", $result[$line_num ++], "', 3: '", $result[$line_num ++], "'\n";
} else {
print " $t $n: name '", $result[$line_num], "', \tparent '", $result[$line_num + 3], "'\n";
$line_num += 4;
}
}
print "\nTable C (changed exits): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
print " exit $n: '", $result[$line_num ++], "' -> '", $result[$line_num ++], "'\n";
}
print "\nTable D (Timers): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
my $state = '';
if ($result[$line_num+1] eq $s0) { $state = 'ON'; }
elsif ($result[$line_num+1] eq $s1) { $state = 'OFF'; }
else { $state = "state $result[$line_num+1]"; }
print " Timer $n: $result[$line_num] ($state), interval $result[$line_num+2]s, remaining time $result[$line_num+3]\n";
#print " ???? $n: '", $result[$line_num ++], "' '", $result[$line_num++],
# "', '", $result[$line_num ++], "', '", $result[$line_num ++], "'\n";
$line_num += 4;
}
print "\nTable E (string variables): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
print " variable $n: name: '", $result[$line_num ++], "', ";
my $ts1 = getnum($result[$line_num ++]);
#if ($ts1 > 0) {
# print "subsize ($ts1): [";
# for (my $m = 0; $m < $ts1; $m ++) {
# print "'", $result[$line_num ++], "', ";
# }
# print "] ";
#}
#print "value: '", $result[$line_num ++], "'\n";
if ($ts1 > 0) {
my $i;
for ($i = 0; $i < $ts1; $i ++) {
print "$i -> '", $result[$line_num ++], "', ";
}
print "$i -> ";
}
print "'", $result[$line_num ++], "'\n";
}
print "\nTable F (numeric variables): size $result[$line_num]\n";
$table_size = getnum($result[$line_num ++]);
for (my $n = 0; $n < $table_size; $n ++) {
print " statvar $n: name: '", $result[$line_num ++], "', ";
my $ts1 = getnum ($result[$line_num ++]);
if ($ts1 > 0) {
print "subsize ($ts1): [";
for (my $m = 0; $m < $ts1; $m ++) {
print "'", $result[$line_num ++], "', ";
}
print "] ";
}
print "value: '", $result[$line_num ++], "'\n";
}
if ($line_num < @result) {
print "\nExcess:\n";
while ($line_num < @result) {
print "$line_num: '", $result[$line_num ++], "'\n";
}
}