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