#!/usr/bin/perl

require "parsescript.pl";
require "parsebmp.pl";

sub read_level($) {
    my ($num) = @_;
    my $level;
    open LVL, sprintf "%02d.lfl", $num;
    read LVL, $level, 1024*1024;
    close LVL;
    $level =~ s/(.)/chr(ord($1)^0xff)/egs;
    return $level;
}

sub next_char($) {
    local *image = $_[0];
    my $i = ord(substr($image,0,1));
    $image = substr($image,1);
    return $i;
}


my $lev0 = read_level(0);
my $i, $j;
$i = pop;
{
    my $lvl = read_level($i);
    $i = sprintf("%02d",$i);
    print "room $i {\n";
    my ($w,$h,$dummy, $bmpoffset, $maskoffset) = unpack("v5", substr($lvl, 4));
    print "   size $w x $h\n";
    print "   bmp:  bmp$i.png\n";
    decode_bmp(substr($lvl, $bmpoffset), $w, $h, "bmp$i.xpm");
    system "convert bmp$i.xpm bmp$i.png; rm bmp$i.xpm";
    print "   mask: mask$i.png\n";
    decode_mask(substr($lvl, $maskoffset), $w, $h, "mask$i.pbm");
    system "convert mask$i.xpm mask$i.png; rm mask$i.xpm";

    my $n = unpack("c", substr($lvl,0x14));
    print "   objects: $n\n";
    for ($j = 1; $j <= $n; $j++) {
	print "   object $j {\n";
	$j = sprintf("%03d",$j);
	my $objoff = unpack("v", substr($lvl, 0x1a + 2*($n + $j)));
	my $objlen = unpack "v", substr($lvl, $objoff, 2);
	my $objbmp = substr($lvl, unpack("v", substr($lvl, 0x1a + 2*$j)));
	my $obj = substr($lvl, $objoff, $objlen);
	
	my $oi = unpack "v", substr $obj, 4, 2;
	my $ox = (ord(substr($obj, 7, 1)) & 0xff);
	my $oy = (ord(substr($obj, 8, 1)) & 0x7f);
	my $ou1 = ord(substr($obj, 8, 1)) & 0x80 ? 1 : 0;
	my $ow = (ord(substr($obj, 9, 1)) & 0xff);
	my $odo = ord(substr($obj, 0xa, 1)) & 0xff;
	my $oax = ord(substr($obj, 0xb, 1)) & 0xff;
	my $oay = ord(substr($obj, 0xc, 1)) & 0x1f;
	my $ou4 = ord(substr($obj, 0xc, 1)) & 0x70;
	my $ou5 = ord(substr($obj, 0xd, 1)) & 0x07;
	my $oh = ((ord(substr($obj, 0xd, 1)) & 0xff)>>3);
	my $onameoff = ord(substr($obj, 0xe, 1));
	my $odata = substr($obj, $onameoff);
	my $oname = read_strz(\$odata);
	my $sstart = length($obj) - length($odata);

	printf "      offset %04x\n", $objoff;
	printf "      objectid %3d\n", $oi;
	printf "      name   '$oname'\n";
	printf "      coords %3d,%3d - %3dx%3d\n", $ox*8, $oy*8, $ow*8, $oh*8;
	printf "      chars  %3d,%3d - %3dx%3d\n", $ox, $oy, $ow, $oh;

	print  "      depobj $odo\n";
	print  "      actorxy $oax $oay\n";
	print  "      unknowns: $ou1 $ou3 $ou4 $ou5\n";
	print  "      bmp: obj$i-$j.xpm\n";
	decode_bmp($objbmp, $ow*8, $oh*8, "obj$i-$j.xpm\n");
	
	my $optr = 0xf;
	printf "      verbs ";
	while (($v = ord(substr($obj, $optr++))) != 0) {
	    print $comma; $comma = ", ";
	    $v = $verbs[$v] if $verbs[$v];
	    $soff = ord(substr($obj, $optr++));
	    printf "$v ->%02x", $soff - $sstart;
	}
	print "\n";
	parse_script($odata);
	print "   }\n";
    }
    print "}\n";
}

