#!/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";
   }
}