#!/usr/bin/perl open LEVEL, "<00.lfl"; read LEVEL, $level, 1024*1024; $level =~ s/(.)/chr(ord($1)^0xff)/egs; close LEVEL; # skip objects $n = unpack "v", substr($level, 2,2); $level = substr($level, 4+$n); #skip unknowns $n = unpack "c", substr($level, 0, 1); $level = substr $level,1+3*$n; print "$n:", length($level),"\n"; #skip costumes $n = unpack "c", substr($level, 0, 1); $level = substr $level,1+3*$n; #skip scripts $n = (unpack "c", substr($level, 0, 1)) &0xff; $level = substr $level,1+3*$n; #read music $n = (unpack "c", substr($level, 0, 1)) &0xff; $level = substr $level,1; for ($i = 0; $i < $n; $i++) { $roomoffs[$i] = [ord(substr($level, $i,1))&0xff, unpack "v", substr($level, $n+2*$i, 2) ]; print "Music $i: ",join ':',@{$roomoffs[$i]},"\n"; } if (!@ARGV) { @list = ( 1..($n-1)); } else { @list = @ARGV; } for $i (@list) { my ($lvl,$off) = @{$roomoffs[$i]}; next if $lvl == 255; open LEVEL, sprintf("<%02d.lfl", $lvl); read LEVEL, $level, 1024*1024; $level =~ s/(.)/chr(ord($1)^0xff)/egs; close LEVEL; $level = substr $level, $off; $len = unpack("v", $level) &0xffff; printf "\n%3d, %2d, %04x--%04x (%04x)\n",$i, $lvl,$off, $off+$len, $len; printf " SPK : %04x,%04x,%04x,%04x\n", unpack("vvvv", substr $level,6,8); printf " PCjr: %04x,%04x,%04x,%04x\n", unpack("vvvv", substr $level,14,8); }