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