Rot/deity/
Rot/player/
Rot/src/utils/pfiles/
Rot/src/utils/www/
#!/usr/local/bin/perl

require "fread.pl";
require "defaults.pl";

init_flags();

$filein = $ARGV[0];
$fileout = $ARGV[1];
$levtim = 1;
if (defined($ARGV[2]) && ($levch = int($ARGV[2])))
{
} else
{
    $levch = 0;
    if (defined($ARGV[2]) && ($ARGV[2] eq "debug"))
    {
	$debug = "yes";
    }
    if (defined($ARGV[2]) && ($ARGV[2] eq "x2"))
    {
	$levtim = 2;
    }
}
if (defined($ARGV[3]) && ($ARGV[3] eq "debug"))
{
    $debug = "yes";
}
if (defined($ARGV[3]) && ($ARGV[3] eq "x2"))
{
    $levtim = 2;
}
if (defined($ARGV[4]) && ($ARGV[4] eq "debug"))
{
    $debug = "yes";
}

if (open (FILE, "${filein}.mob"))
{
    $pointer = 0;
    $a = 0;
    $last = 0;
    $eof = fread_length();
    fread_mobiles();
    close FILE;
}
if (open (FILE, "${filein}.obj"))
{
    $pointer = 0;
    $a = 0;
    $last = 0;
    $eof = fread_length();
    fread_objects();
    close FILE;
}
if (open (FILE, "${filein}.wld"))
{
    $pointer = 0;
    $a = 0;
    $last = 0;
    $eof = fread_length();
    fread_rooms();
    close FILE;
}
if (open (FILE, "${filein}.zon"))
{
    $pointer = 0;
    $a = 0;
    $last = 0;
    $eof = fread_length();
    fread_area();
    $eof = fread_length();
    fread_resets();
    close FILE;
} else {
    print "No ${filein}.zon found.\n";
    exit;
}
if (open (FILE, "${filein}.shp"))
{
    $pointer = 0;
    $a = 0;
    $last = 0;
    $eof = fread_length();
    fread_shops();
    close FILE;
}
$minvnum = 100;
$cont = 1;
while ($cont != 0)
{
    $b = 0;
    foreach $tmp (sort(keys(%m_name)))
    {
	if ($tmp < $minvnum)
	{
	    $b = 1;
	}
    }
    foreach $tmp (sort(keys(%o_name)))
    {
	if ($tmp < $minvnum)
	{
	    $b = 1;
	}
    }
    foreach $tmp (sort(keys(%r_name)))
    {
	if ($tmp < $minvnum)
	{
	    $b = 1;
	}
    }
    if ($b == 1)
    {
	$minvnum -= 100;
	$cont = 0;
	next;
    }
    $minvnum += 100;
}
$maxvnum = 32700;
$cont = 1;
while ($cont != 0)
{
    $b = 0;
    foreach $tmp (sort(keys(%m_name)))
    {
	if ($tmp > $maxvnum)
	{
	    $b = 1;
	}
    }
    foreach $tmp (sort(keys(%o_name)))
    {
	if ($tmp > $maxvnum)
	{
	    $b = 1;
	}
    }
    foreach $tmp (sort(keys(%r_name)))
    {
	if ($tmp > $maxvnum)
	{
	    $b = 1;
	}
    }
    if ($b == 1)
    {
	$maxvnum += 100;
	$maxvnum--;
	$cont = 0;
	next;
    }
    $maxvnum -= 100;
}
$minlevel = 110;
$maxlevel = 0;
foreach $tmp (sort(keys(%m_name)))
{
    if ($m_level{$tmp} < $minlevel)
    {
	$minlevel = $m_level{$tmp};
    }
    if ($m_level{$tmp} > $maxlevel)
    {
	$maxlevel = $m_level{$tmp};
    }
}

open (OUT, ">$fileout")||die("Can't open output file\n");
write_area();
write_mobiles();
write_objects();
write_rooms();
write_resets();
write_shops();
write_specials();
print OUT "\n#\$\n\n";
close OUT;

exit;



sub fread_area
{
    print "Reading ZONE\n";
    $levels = fread_word();
    $author = sprintf("%-7s", " ");
    $title = fread_string();
    @Filepath = split(/\//, $fileout);
    $outfilename = $Filepath[$#Filepath];
    fread_number();
    fread_number();
    fread_number();
    return;
}

sub write_area
{
    print "Writing AREA\n";
    print OUT "#AREA\nROT v1.5 format~\n${outfilename}~\n";
    print OUT $title, "~\n";
    $levels = sprintf("{%.2d %.2d}", $minlevel, $maxlevel);
    print OUT "$levels $author $title~\n";
    print OUT "$minvnum $maxvnum\n";
    return;
}

sub fread_mobiles
{
    print "Reading MOBILES\n";
    $vnum = 1;
    while ($vnum != 0)
    {
	if (fread_to_next() eq "EOF")
	{
	    $vnum = 0;
	    next;
	}
	if (fread_letter() ne '#')
	{
	    fread_to_eol();
	    $vnum = 1;
	    next;
	}
	$vnum = fread_number();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
        if (defined($debug)) 
        { 
            print "\t\tname\n"; 
        } 
	$m_name{$vnum} = fread_string();
        if (defined($debug))  
        {  
            print "\t\tshort\n";  
        }
	$m_short{$vnum} = fread_string();
        if (defined($debug))  
        {  
            print "\t\tlong\n";  
        }
	$m_long{$vnum} = fread_string();
        if (defined($debug))  
        {  
            print "\t\textended\n";  
        }
	$m_extended{$vnum} = fread_string();
        if (defined($debug))  
        {  
            print "\t\tact\n";  
        }
	$tmp = fread_flag();
	$m_act{$vnum} = "";
	foreach $temp (split('',$tmp))
	{
	    if (defined($mobact{$temp}))
	    {
		$m_act{$vnum} .= $mobact{$temp};
	    }
	}
	if ($m_act{$vnum} eq "")
	{
	    $m_act{$vnum} = "0";
	}
        if (defined($debug))  
        {  
            print "\t\taffects\n";  
        }
	$tmp = fread_flag();
	$m_aff{$vnum} = "";
	$m_shd{$vnum} = "";
	foreach $temp (split('',$tmp))
	{
	    if (defined($mobaff{$temp}))
	    {
		($pos,$val)=split(',', $mobaff{$temp});
		if ($pos eq "A")
		{
		    $m_aff{$vnum} .= $val;
		} elsif ($pos eq "S")
		{
		    $m_shd{$vnum} .= $val;
		}
	    }
	}
	if ($m_aff{$vnum} eq "")
	{
	    $m_aff{$vnum} = "0";
	}
	if ($m_shd{$vnum} eq "")
	{
	    $m_shd{$vnum} = "0";
	}
        if (defined($debug))  
        {  
            print "\t\talignment\n";  
        }
	$m_align{$vnum} = fread_number();
        if (defined($debug))  
        {  
            print "\t\t\tEOL\n";  
        }
	fread_to_eol();
        if (defined($debug))  
        {  
            print "\t\tlevel\n";  
        }
	$m_level{$vnum} = fread_number();
        $level = int($m_level{$vnum});
	$level *= $levtim;
        $level += $levch;
        if ($level > 110)
        { 
            $level = 110;
        }
        if ($level < 0)
        {
            $level = 0;
        }
	$m_level{$vnum} = $level;
        if (defined($debug))  
        {  
            print "\t\tThac0\n";  
        }
	fread_number();
	$m_hr{$vnum} = 0;
        if (defined($debug))  
        {  
            print "\t\tAC\n";  
        }
	$m_ac{$vnum} = -(fread_number());
        if (defined($debug))  
        {  
            print "\t\thit dice\n";  
        }
	$m_hdice{$vnum} = fread_word();
        if (defined($debug))  
        {  
            print "\t\tdamage dice\n";  
        }
	$m_ddice{$vnum} = fread_word();
        if (defined($debug))  
        {  
            print "\t\tgold\n";  
        }
	$m_gold{$vnum} = fread_number();
        if (defined($debug))  
        {  
            print "\t\texp\n";  
        }
	$m_exp{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\tposition\n";
        }
	$m_posloa{$vnum} = $positions[fread_number()];
	$m_posdef{$vnum} = $positions[fread_number()];
	$m_rac{$vnum} = "human";
        if (defined($debug))  
        {  
            print "\t\tsex\n";  
        }
	$m_sex{$vnum} = $sexes[fread_number()];
    }
    return;
}

sub write_mobiles
{
    print "Writing MOBILES\n";
    print OUT "\n#MOBILES\n";
    foreach $vnum (sort bynum(keys(%m_name)))
    {
	$level = $m_level{$vnum};
	print OUT "#${vnum}\n";
	print OUT $m_name{$vnum}, "~\n";
	print OUT $m_short{$vnum}, "~\n";
	print OUT $m_long{$vnum}, "~\n";
	print OUT $m_extended{$vnum}, "~\n";
	print OUT $m_rac{$vnum}, "~\n";
	print OUT "$m_act{$vnum} $m_aff{$vnum} ";
	print OUT "$m_shd{$vnum} $m_align{$vnum} 0\n";
	print OUT "$level 0 $mobhp{$level} ";
	print OUT "$mobhp{$level} $mobdm{$level} none\n";
	$mobac = $ac{$level};
	$mobexotic = $mobac + 4;
	print OUT "$mobac $mobac $mobac $mobexotic\n";
	print OUT "0 0 0 0\n";
	print OUT "$m_posloa{$vnum} $m_posdef{$vnum} $m_sex{$vnum} $m_gold{$vnum}\n";
	print OUT "0 0 medium 0\n";
    }
    print OUT "#0\n";
    return;
}

sub fread_objects
{
    print "Reading OBJECTS\n";
    $vnum = 1;
    while ($vnum != 0)
    {
	if (fread_to_next() eq "EOF")
	{
	    $vnum = 0;
	    next;
	}
	if (fread_letter() ne '#')
	{
	    fread_to_eol();
	    $vnum = 1;
	    next;
	}
	$vnum = fread_number();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
	if (defined($debug))
	{
	    print "\t\tname\n";
	}
	$o_name{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\tshort\n";
	}
	$o_short{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\tlong\n";
	}
	$o_long{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\taction\n";
	}
	fread_string();
	if (defined($debug))
	{
	    print "\t\ttype\n";
	}
	$o_type{$vnum} = $objects[fread_number()];
	if (defined($debug))
	{
	    print "\t\textra\n";
	}
	$o_extra{$vnum} = fread_flag();
	if (defined($debug))
	{
	    print "\t\twear\n";
	}
	$o_wear{$vnum} = fread_flag();
	if (defined($debug))
	{
	    print "\t\tV0-V3\n";
	}
	$o_v0{$vnum} = fread_number();
	$o_v1{$vnum} = fread_number();
	$o_v2{$vnum} = fread_number();
	$o_v3{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tweight\n";
	}
	$o_weight{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tcost\n";
	}
	$o_cost{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tcost-per-day\n";
	}
	$o_cpd{$vnum} = fread_number();
	$o_level{$vnum} = "1";
	$lastline = 0;
	$extrapoint = 0;
	$applypoint = 0;
	while ($lastline == 0)
	{
	    if (defined($debug))
	    {
		print "\t\tExtras:\n";
	    }
	    if ($pointer+1 >= $eof)
	    {
		$lastline = 1;
		next;
	    }
	    $tmp = fread_letter();
	    if ($tmp eq '#')
	    {
		$pointer--;
		$lastline = 1;
		next;
	    }
	    if ($tmp eq 'E')
	    {
		$extrapoint++;
		$tmp = "${vnum}:${extrapoint}";
		if (defined($debug))
		{
		    print "\t\t\textended key\n";
		}
		$o_extkey{$tmp} = fread_string();
		if (defined($debug))
		{
		    print "\t\t\textended desc\n";
		}
		$o_extend{$tmp} = fread_string();
		next;
	    }
	    if ($tmp eq 'A')
	    {
		if (defined($debug))
		{
		    print "\t\t\tapply pos\n";
		}
		$pos = fread_number();
		if (defined($debug))
		{
		    print "\t\t\tapply value\n";
		}
		$val = fread_number();
		$applypoint++;
		$tmp = "${vnum}:${applypoint}";
		$o_apply{$tmp} = "$pos $val";
	    }
	}
    }
    return;
}

sub write_objects
{
    print "Writing OBJECTS\n";
    print OUT "\n#OBJECTS\n";
    foreach $vnum (sort bynum(keys(%o_name)))
    {
	$level = $o_level{$vnum};
	print OUT "#${vnum}\n";
	print OUT $o_name{$vnum}, "~\n";
	print OUT $o_short{$vnum}, "~\n";
	print OUT $o_long{$vnum}, "~\n";
	print OUT "none~\n";
	print OUT "$o_type{$vnum} $o_extra{$vnum} $o_wear{$vnum}\n";
	if (($o_type{$vnum} eq "light")
	 || ($o_type{$vnum} eq "money"))
	{
	    print OUT "$o_v0{$vnum} $o_v1{$vnum} ";
	    print OUT "$o_v2{$vnum} $o_v3{$vnum} 0\n";
	} elsif (($o_type{$vnum} eq "key")
	      || ($o_type{$vnum} eq "boat")
	      || ($o_type{$vnum} eq "treasure")
	      || ($o_type{$vnum} eq "trash"))
	{
	    $o_level{$vnum} = 1;
	    print OUT "0 0 0 0 0\n";
	} elsif (($o_type{$vnum} eq "scroll")
	      || ($o_type{$vnum} eq "potion"))
	{
	    $level = 1;
	    $o_level{$vnum} = 1;
	    $o_v0{$vnum} *= $levtim;
	    $o_v0{$vnum} += $levch;
	    if ($o_v0{$vnum} > 110)
	    {
		$o_v0{$vnum} = 110;
	    }
            if ($o_v0{$vnum} < 0) 
            { 
                $o_v0{$vnum} = 0; 
            }
	    print OUT "$o_v0{$vnum} ";
	    if (defined($objspell{$o_v1{$vnum}}))
	    {
		print OUT "'$objspell{$o_v1{$vnum}}' ";
	    } else {
		print OUT "'' ";
	    }
	    if (defined($objspell{$o_v2{$vnum}}))
	    {
		print OUT "'$objspell{$o_v2{$vnum}}' ";
	    } else {
		print OUT "'' ";
	    }
	    if (defined($objspell{$o_v3{$vnum}}))
	    {
		print OUT "'$objspell{$o_v3{$vnum}}' ''\n";
	    } else {
		print OUT "'' ''\n";
	    }
	} elsif (($o_type{$vnum} eq "wand")
	      || ($o_type{$vnum} eq "staff"))
	{
	    $o_v0{$vnum} *= $levtim;
	    $o_v0{$vnum} += $levch;
	    if ($o_v0{$vnum} > 110)
	    {
		$o_v0{$vnum} = 110;
	    }
	    if ($o_v0{$vnum} < 0)
	    {
		$o_v0{$vnum} = 0;
	    }
	    print OUT "$o_v0{$vnum} $o_v1{$vnum} $o_v2{$vnum} ";
	    if (defined($objspell{$o_v3{$vnum}}))
	    {
		print OUT "'$objspell{$o_v3{$vnum}}' 0\n";
	    } else {
		print OUT "'' 0\n";
	    }
	} elsif ($o_type{$vnum} eq "weapon")
	{
	    $tmp = "";
	    foreach $temp (sort(@weapons))
	    {
		if (($o_name{$vnum} =~ /$temp/)
		||  ($o_short{$vnum} =~ /$temp/)
		||  ($o_long{$vnum} =~ /$temp/))
		{
		    $tmp = $temp;
		}
	    }
	    if ($tmp ne "")
	    {
		$o_v0{$vnum} = $tmp;
	    } else
	    {
		if ($o_v3{$vnum} == 7)
		{
		    $o_v0{$vnum} = "mace";
		} elsif ($o_v3{$vnum} == 2)
		{
		    $o_v0{$vnum} = "sword";
		} elsif ($o_v3{$vnum} == 11)
		{
		    $o_v0{$vnum} = "dagger";
		} elsif ($o_v3{$vnum} == 2)
		{
		    $o_v0{$vnum} = "whip";
		} elsif ($o_v3{$vnum} == 6)
		{
		    $o_v0{$vnum} = "flail";
		} else
		{
		    $o_v0{$vnum} = "exotic";
		}
	    }
	    if ($o_v2{$vnum} < 1)
	    {
		$o_v2{$vnum} = 1;
	    }
	    if ($o_v1{$vnum} < 1)
	    {
		$o_v1{$vnum} = 1;
	    }
	    print OUT "$o_v0{$vnum} $weapdice{$level} ";
	    print OUT $dtypes[$o_v3{$vnum}], " 0\n";
	} elsif ($o_type{$vnum} eq "armor")
	{
	    print OUT "$objac{$level} ";
	    print OUT "$objac{$level} ";
	    print OUT "$objac{$level} ";
 	    $tmp = $objac{$level} - 4;
	    if ($tmp < 0)
	    {
		$tmp = 0;
	    }
	    print OUT "$tmp 0\n";
	} elsif ($o_type{$vnum} eq "container")
	{
	    $o_level{$vnum} = 1;
	    print OUT "$o_v0{$vnum} ";
	    $flg = "";
	    $num = $o_v1{$vnum};
	    foreach $tmp (reverse(sort(keys(%flag))))
	    {
		if ($flag{$tmp} <= $num)
		{
		    $flg .= $tmp;
		    $num -= $flag{$tmp};
		}
	    }
	    if ($flg eq "")
	    {
		$flg = "0";
	    }
	    $o_v1{$vnum} = join('', sort(split('', $flg)));
	    print OUT "$o_v1{$vnum} $o_v2{$vnum} $o_v0{$vnum} 100\n";
	} elsif ($o_type{$vnum} eq "drink")
	{
	    $o_level{$vnum} = 1;
	    print OUT "$o_v0{$vnum} $o_v1{$vnum} ";
	    $tmp = $liquids[$o_v2{$vnum}];
	    if ($o_v2{$vnum} > 15)
	    {
		$tmp = "water";
	    }
	    print OUT "'$tmp' $o_v3{$vnum} 0\n";
	} elsif ($o_type{$vnum} eq "food")
	{
	    $o_level{$vnum} = 1;
	    print OUT "$o_v0{$vnum} $o_v0{$vnum} ";
	    print OUT "$o_v2{$vnum} $o_v3{$vnum} 0\n";
	} else
	{
	    print OUT "$o_v0{$vnum} $o_v1{$vnum} ";
	    print OUT "$o_v2{$vnum} $o_v3{$vnum} 0\n";
	}
	print OUT "$o_level{$vnum} $o_weight{$vnum} $o_cost{$vnum} P\n";
	$lastline = 0;
	$count = 0;
	while ($lastline == 0)
	{
	    $count++;
	    $tmp = "${vnum}:${count}";
	    if (defined($o_apply{$tmp}))
	    {
		print OUT "A\n$o_apply{$tmp}\n";
	    } else
	    {
		$lastline++;
	    }
	}
	$lastline = 0;
	$count = 0;
	while ($lastline == 0)
	{
	    $count++;
	    $tmp = "${vnum}:${count}";
	    if (defined($o_extkey{$tmp}))
	    {
		print OUT "E\n$o_extkey{$tmp}";
		print OUT "~\n";
		print OUT "$o_extend{$tmp}";
		print OUT "~\n";
	    } else
	    {
		$lastline++;
	    }
	}
    }
    print OUT "#0\n";
    return;
}

sub fread_rooms
{
    print "Reading ROOMS\n";
    $vnum = 1;
    while ($vnum != 0)
    {
	if (fread_to_next() eq "EOF")
	{
	    $vnum = 0;
	    next;
	}
	if (fread_letter() ne '#')
	{
	    $vnum = 1;
	    next;
	}
	$vnum = fread_number();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
	if (defined($debug))
	{
	    print "\t\tname\n";
	}
	$r_name{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\tdescription\n";
	}
	$r_desc{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\tarea num\n";
	}
	fread_number();
	if (defined($debug))
	{
	    print "\t\troom flags\n";
	}
	$tmp = fread_flag();
	$r_flags{$vnum} = "";
	foreach $temp (split('',$tmp))
	{
	    if (defined($roomf{$temp}))
	    {
		$r_flags{$vnum} .= $roomf{$temp};
	    }
	}
	if ($r_flags{$vnum} eq "")
	{
	    $r_flags{$vnum} = "0";
	}
	if (defined($debug))
	{
	    print "\t\tsector type\n";
	}
	$r_sector{$vnum} = fread_number();
	$lastline = 0;
	$extrapoint = 0;
	while ($lastline == 0)
	{
	    if (defined($debug))
	    {
		print "\t\tExtras:\n";
	    }
	    if ($pointer >= $eof)
	    {
		$lastline = 1;
		next;
	    }
	    $tmp = fread_letter();
	    if ($tmp eq '#')
	    {
		$pointer--;
		$lastline = 1;
		next;
	    }
	    if ($tmp eq 'S')
	    {
		$lastline = 1;
		next;
	    }
	    if ($tmp eq 'E')
	    {
		$extrapoint++;
		$tmp = "${vnum}:${extrapoint}";
		if (defined($debug))
		{
		    print "\t\t\textended key\n";
		}
		$r_extkey{$tmp} = fread_string();
		if (defined($debug))
		{
		    print "\t\t\textended description\n";
		}
		$r_extend{$tmp} = fread_string();
		next;
	    }
	    if ($tmp eq 'D')
	    {
		if (defined($debug))
		{
		    print "\t\t\tdoor #\n";
		}
		$dir = fread_number();
		$tmp = "${vnum}:${dir}";
		if (defined($debug))
		{
		    print "\t\t\tdoor look\n";
		}
		$r_doorlook{$tmp} = fread_string();
		if (defined($debug))
		{
		    print "\t\t\tdoor keyword\n";
		}
		$r_doorkeyw{$tmp} = fread_string();
		if (defined($debug))
		{
		    print "\t\t\tdoor type\n";
		}
		$r_doorlock{$tmp} = fread_number();
		if (defined($debug))
		{
		    print "\t\t\tdoor key\n";
		}
		$r_doorkey{$tmp} = fread_number();
		if (defined($debug))
		{
		    print "\t\t\tdoor to_room\n";
		}
		$r_doorto{$tmp} = fread_number();
	    }
	}
    }
    return;
}

sub write_rooms
{
    print "Writing ROOMS\n";
    print OUT "\n#ROOMS\n";
    foreach $vnum (sort bynum(keys(%r_name)))
    {
	print OUT "#${vnum}\n";
	print OUT $r_name{$vnum}, "~\n";
	print OUT $r_desc{$vnum}, "~\n";
	print OUT "0 $r_flags{$vnum} $r_sector{$vnum}\n";

	for ($count = 0; $count < 6; $count++)
	{
	    $tmp = "${vnum}:${count}";
	    if (defined($r_doorto{$tmp}))
	    {
		print OUT "D${count}\n";
		print OUT "$r_doorlook{$tmp}";
		print OUT "~\n";
		print OUT "$r_doorkeyw{$tmp}";
		print OUT "~\n";
		print OUT "$r_doorlock{$tmp} $r_doorkey{$tmp} ";
		print OUT "$r_doorto{$tmp}\n";
	    }
	}
	$lastline = 0;
	$count = 0;
	while ($lastline == 0)
	{
	    $count++;
	    $tmp = "${vnum}:${count}";
	    if (defined($r_extkey{$tmp}))
	    {
		print OUT "E\n$r_extkey{$tmp}";
		print OUT "~\n";
		print OUT "$r_extend{$tmp}";
		print OUT "~\n";
	    } else
	    {
		$lastline++;
	    }
	}
	print OUT "S\n";
    }
    print OUT "#0\n";
    return;
}

sub fread_resets
{
    $rm = 0;
    $ro = 0;
    $rp = 0;
    $rg = 0;
    $re = 0;
    $rd = 0;
    $rr = 0;
    $inc = 0;
    while ( ($pointer < $eof) && (fread_letter() ne 'S') )
    {
	$inc++;
	$pointer--;
	$type = fread_letter();
	if (defined($debug))
	{
	    print "\t$type\n";
	}
	if ($type eq 'M')
	{
	    $rm++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rm_p1{$rm} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob vnum\n";
	    }
	    $rm_vnum{$rm} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob global limit\n";
	    }
	    $rm_glob{$rm} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob to_room\n";
	    }
	    $rm_room{$rm} = fread_number();
	    $temp = $rm_vnum{$rm};
	    $tmp = "${temp}:$rm_room{$rm}";
	    if (!defined($rm_local{$tmp}))
	    {
		$rm_local{$tmp} = 1;
	    } else
	    {
		$rm_local{$tmp}++;
	    }
	} elsif ($type eq 'O')
	{
	    $ro++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $ro_p1{$ro} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tobject vnum\n";
	    }
	    $ro_vnum{$ro} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $ro_p2{$ro} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tobject to_room\n";
	    }
	    $ro_room{$ro} = fread_number();
	    $ro_inc{$ro} = $inc;
	} elsif ($type eq 'P')
	{
	    $rp++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rp_p1{$rp} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tput vnum\n";
	    }
	    $rp_vnum{$rp} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rp_p2{$rp} = fread_number();
	    $rp_p2{$rp} = 0;
	    if (defined($debug))
	    {
		print "\t\tput to_object\n";
	    }
	    $rp_to{$rp} = fread_number();
	    $rp_copy{$rp} = 1;
	    $jo = $ro;
	    $jg = $rg;
	    $je = $re;
	    $ko = 0;
	    $kg = 0;
	    $ke = 0;
	    $found = 0;
	    while ($found == 0)
	    {
		if ($jo == 0)
		{
		    $found = 1;
		} elsif ($rp_to{$rp} == $ro_vnum{$jo})
		{
		    $found = 1;
		    $ko = $ro_inc{$jo};
		} else
		{
		    $jo--;
		}
	    }
	    $found = 0;
	    while ($found == 0)
	    {
		if ($jg == 0)
		{
		    $found = 1;
		} elsif ($rp_to{$rp} == $rg_vnum{$jg})
		{
		    $found = 1;
		    $kg = $rg_inc{$jg};
		} else
		{
		    $jg--;
		}
	    }
	    $found = 0;
	    while ($found == 0)
	    {
		if ($je == 0)
		{
		    $found = 1;
		} elsif ($rp_to{$rp} == $re_vnum{$je})
		{
		    $found = 1;
		    $ke = $re_inc{$je};
		} else
		{
		    $je--;
		}
	    }
	    $ru = 0;
	    if ($ko > $kg)
	    {
		$ru = $ko;
		$rp_type{$rp} = "object";
	    } else
	    {
		$ru = $kg;
		$rp_type{$rp} = "give";
	    }
	    if ($ke > $ru)
	    {
		$ru = $ke;
		$rp_type{$rp} = "equip";
	    }
	    if ($rp_type{$rp} eq "object")
	    {
		$rp_under{$rp} = $jo;
	    } elsif ($rp_type{$rp} eq "give")
	    {
		$rp_under{$rp} = $jg;
	    } else
	    {
		$rp_under{$rp} = $je;
	    }
	} elsif ($type eq 'G')
	{
	    $rg++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rg_p1{$rg} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tgive vnum\n";
	    }
	    $rg_vnum{$rg} = fread_number();
	    $rg_under{$rg} = $rm;
	    if (defined($debug))
	    {
		print "\t\tgive limit\n";
	    }
	    $rg_limit{$rg} = fread_number();
	    $rg_inc{$rg} = $inc;
	    $tmp = $rm_vnum{$rm};
	    $temp = $rg_vnum{$rg};
	    if ((defined($o_level{$temp}))
	    &&  (defined($m_level{$tmp})))
	    {
		$o_level{$temp} = $m_level{$tmp};
	    }
	} elsif ($type eq 'E')
	{
	    $re++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $re_p1{$re} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tequip vnum\n";
	    }
	    $re_vnum{$re} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tequip limit\n";
	    }
	    $re_limit{$re} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tequip wear\n";
	    }
	    $re_wear{$re} = fread_number();
	    $re_under{$re} = $rm;
	    $re_inc{$re} = $inc;
	    $tmp = $rm_vnum{$rm};
	    $temp = $re_vnum{$re};
	    if ((defined($o_level{$temp}))
	    &&  (defined($m_level{$tmp})))
	    {
		$o_level{$temp} = $m_level{$tmp};
	    }
	} elsif ($type eq 'D')
	{
	    $rd++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rd_p1{$rd} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tdoor room\n";
	    }
	    $rd_room{$rd} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tdoor direction\n";
	    }
	    $rd_door{$rd} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tdoor state\n";
	    }
	    $rd_stat{$rd} = fread_number();
	}
	if (defined($debug))
	{
	    print "\t\tcomment\n";
	}
	fread_to_eol();
    }

    return;
}

sub write_resets
{
    print "Writing RESETS\n";
    print OUT "\n#RESETS\n";
    $lastline = 0;
    $rd = 0;
    while ($lastline == 0)
    {
	$rd++;
	if (!defined($rd_room{$rd}))
	{
	    if ($rd > 1)
	    {
		print OUT "\n";
	    }
	    $lastline++;
	    next;
	}
	print OUT "D $rd_p1{$rd} $rd_room{$rd} $rd_door{$rd} $rd_stat{$rd}";
	$tmp = $rd_room{$rd};
	print OUT "\t\t* $r_name{$tmp}\n";
    }

    $lastline = 0;
    $ro = 0;
    while ($lastline == 0)
    {
	$ro++;
	if (!defined($ro_vnum{$ro}))
	{
	    if ($ro > 1)
	    {
		print OUT "\n";
	    }
	    $lastline++;
	    next;
	}
	print OUT "O $ro_p1{$ro} $ro_vnum{$ro} $ro_p2{$ro} $ro_room{$ro}";
	$tmp = $ro_vnum{$ro};
	print OUT "\t\t* $o_short{$tmp}\n";
	$putin = 0;
	$rp = 0;
	while ($putin == 0)
	{
	    $rp++;
	    if (!defined($rp_vnum{$rp}))
	    {
		$putin = 1;
		next;
	    }
	    if (($rp_under{$rp} == $ro) && ($rp_type{$rp} eq "object"))
	    {
		print OUT "P $rp_p1{$rp} $rp_vnum{$rp} $rp_p2{$rp} $rp_to{$rp} $rp_copy{$rp}";
		$tmp = $rp_vnum{$rp};
		print OUT "\t\t*   $o_short{$tmp}\n";
	    }
	}
    }

    $lastline = 0;
    $rm = 0;
    while ($lastline == 0)
    {
	$rm++;
	if (!defined($rm_vnum{$rm}))
	{
	    if ($rm > 1)
	    {
		print OUT "\n";
	    }
	    $lastline++;
	    next;
	}
	print OUT "M $rm_p1{$rm} $rm_vnum{$rm} $rm_glob{$rm} $rm_room{$rm}";
	$temp = $rm_vnum{$rm};
	$tmp = "${temp}:$rm_room{$rm}";
	print OUT " $rm_local{$tmp}";
	$tmp = $rm_vnum{$rm};
	print OUT "\t\t* $m_short{$tmp}\n";
	$give = 0;
	$rg = 0;
	while ($give == 0)
	{
	    $rg++;
	    if (!defined($rg_vnum{$rg}))
	    {
		$give = 1;
		next;
	    }
	    if ($rg_under{$rg} == $rm)
	    {
		print OUT "G $rg_p1{$rg} $rg_vnum{$rg} $rg_limit{$rg}";
		$tmp = $rg_vnum{$rg};
		print OUT "\t\t*   $o_short{$tmp}\n";
		$putin = 0;
		$rp = 0;
		while ($putin == 0)
		{
		    $rp++;
		    if (!defined($rp_vnum{$rp}))
		    {
			$putin = 1;
			next;
		    }
		    if (($rp_under{$rp} == $rg) && ($rp_type{$rp} eq "give"))
		    {
			print OUT "P $rp_p1{$rp} $rp_vnum{$rp} $rp_p2{$rp} $rp_to{$rp} $rp_copy{$rp}";
			$tmp = $rp_vnum{$rp};
			print OUT "\t\t*   $o_short{$tmp}\n";
		    }
		}
	    }
	}
	$equi = 0;
	$re = 0;
	while ($equi == 0)
	{
	    $re++;
	    if (!defined($re_vnum{$re}))
	    {
		$equi = 1;
		next;
	    }
	    if ($re_under{$re} == $rm)
	    {
		print OUT "E $re_p1{$re} $re_vnum{$re} $re_limit{$re} $re_wear{$re}";
		$tmp = $re_vnum{$re};
		print OUT "\t\t*   $o_short{$tmp}\n";
		$putin = 0;
		$rp = 0;
		while ($putin == 0)
		{
		    $rp++;
		    if (!defined($rp_vnum{$rp}))
		    {
			$putin = 1;
			next;
		    }
		    if (($rp_under{$rp} == $re) && ($rp_type{$rp} eq "equip"))
		    {
			print OUT "P $rp_p1{$rp} $rp_vnum{$rp} $rp_p2{$rp} $rp_to{$rp} $rp_copy{$rp}";
			$tmp = $rp_vnum{$rp};
			print OUT "\t\t*   $o_short{$tmp}\n";
		    }
		}
	    }
	}
    }

    print OUT "S\n";
    return;
}

sub fread_shops
{
    print "Reading SHOPS\n";
    $vnum = 1;
    while ($vnum != 0)
    {
	if (fread_to_next() eq "EOF")
	{
	    $vnum = 0;
	    next;
	}
	if (fread_letter() ne '#')
	{
	    $vnum = 1;
	    next;
	}
	$vnum = fread_string();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
	if (defined($debug))
	{
	    print "\t\titems x 5\n";
	}
	fread_number();
	fread_number();
	fread_number();
	fread_number();
	fread_number();

	if (defined($debug))
	{
	    print "\t\tsell percent\n";
	}
	$sella1 = fread_number();
	fread_letter();
	$sella2 = fread_number();
	if ($sella2 == 0)
	{
	    $sellp{$vnum} = int(100 * $sella1);
	} else {
	    $sellp{$vnum} = int(100 * ($sella1 + (.1 * $sella2)));
	}
	if (defined($debug))
	{
	    print "\t\tbuy percent\n";
	}
	$buya1 = fread_number();
	fread_letter();
	$buya2 = fread_number();
	if ($buya2 == 0)
	{
	    $buyp{$vnum} = int(100 * $buya1);
	} else {
	    $buyp{$vnum} = int(100 * ($buya1 + (.1 * $buya2)));
	}
	if (defined($debug))
	{
	    print "\t\tsell1\n";
	}
	$sell1{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tsell2\n";
	}
	$sell2{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tsell3\n";
	}
	$sell3{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tsell4\n";
	}
	$sell4{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tsell5\n";
	}
	$sell5{$vnum} = fread_number();

	if (defined($debug))
	{
	    print "\t\tsays x 7\n";
	}
	fread_string();
	fread_string();
	fread_string();
	fread_string();
	fread_string();
	fread_string();
	fread_string();
	if (defined($debug))
	{
	    print "\t\ttempers x 2\n";
	}
	fread_number();
	fread_number();
	if (defined($debug))
	{
	    print "\t\tmob vnum\n";
	}
	$s_vnum{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tplaceholder\n";
	}
	fread_number();
	if (defined($debug))
	{
	    print "\t\troom vnum\n";
	}
	fread_number();
	if (defined($debug))
	{
	    print "\t\topen 1\n";
	}
	$open1 = fread_number();
	if (defined($debug))
	{
	    print "\t\tclose 1\n";
	}
	$close1 = fread_number();
	if (defined($debug))
	{
	    print "\t\topen 2\n";
	}
	$open2 = fread_number();
	if (defined($debug))
	{
	    print "\t\tclose 2\n";
	}
	$close2 = fread_number();
	if ($open1 < $open2)
	{
	    $open{$vnum} = $open1;
	} else {
	    $open{$vnum} = $open2;
	}
	if ($close1 > $close2)
	{
	    $close{$vnum} = $close1;
	} else {
	    $close{$vnum} = $close2;
	}
	if ($close{$vnum} == 24)
	{
	    $close{$vnum} = 23;
	}
    }
    return;
}

sub write_shops
{
    print "Writing SHOPS\n";
    print OUT "\n#SHOPS\n";
    foreach $vnum (sort(keys(%sell1)))
    {
	$tmp = sprintf("%-8d%4d%4d%4d%4d%4d%8d%5d%6d%3d    * ",
		$s_vnum{$vnum}, $sell1{$vnum}, $sell2{$vnum}, $sell3{$vnum},
		$sell4{$vnum}, $sell5{$vnum}, $buyp{$vnum},
		$sellp{$vnum}, $open{$vnum}, $close{$vnum});
	$temp = $s_vnum{$vnum};
	if (defined($m_short{$temp}))
	{
	    $tmp .= $m_short{$temp};
	}
	print OUT $tmp, "\n";
    }
    print OUT "0\n";
    return;
}


sub write_specials
{
    print "Writing SPECIALS\n";
    print OUT "\n#SPECIALS\n";
    print OUT "S\n";
    return;
}

sub bynum { $a <=> $b; }

sub init_flags
{
    @sexes = ('none', 'male', 'female');
    @positions = (' ', ' ', ' ', ' ',
		  'sleep', 'rest', 'sit', ' ', 'stand');
    %mobact =	('B',	'B',
		 'C',	'C',
		 'D',	'A',
		 'E',	'S',
		 'F',	'F',
		 'G',	'G',
		 'H',	'H');
    %mobaff =	('A',	'A,A',
		 'B',	'S,B',
		 'C',	'A,C',
		 'D',	'A,D',
		 'E',	'A,E',
		 'F',	'A,F',
		 'H',	'S,H',
		 'K',	'A,K',
		 'M',	'A,M',
		 'N',	'S,N',
		 'T',	'A,P',
		 'U',	'A,Q',
		 'W',	'A,S');
    %roomf =	('A',	'A',
		 'C',	'C',
		 'D',	'D',
		 'E',	'S',
		 'F',	'K',
		 'J',	'J');
    @objects =	('trash',	'light',
		 'scroll',	'wand',
		 'staff',	'weapon',
		 'trash',	'trash',
		 'treasure',	'armor',
		 'potion',	'trash',
		 'trash',	'trash',
		 'trash',	'container',
		 'trash',	'drink',
		 'key',		'food',
		 'money',	'trash',
		 'boat',	'trash',
		 'trash',	'trash',
		 'trash',	'trash');
    @liquids =	('water',	'beer',
		 'red wine',	'ale',
		 'dark ale',	'whiskey',
		 'lemonade',	'firebreather',
		 'local specialty', 'slime mold juice',
		 'milk',	'tea',
		 'coffee',	'blood',
		 'salt water',	'coke');
    @dtypes =	('hit',		'slice',
		 'stab',	'slash',
		 'whip',	'claw',
		 'blast',	'pound',
		 'crush',	'grep',
		 'bite',	'pierce',
		 'suction');
    %objspell =	(
		'1',	'armor',
		'2',	'teleport',
		'3',	'bless',
		'4',	'blindness',
		'5',	'burning hands',
		'6',	'call lightning',
		'7',	'charm person',
		'8',	'chill touch',
		'10',	'colour spray',
		'11',	'control weather',
		'12',	'create food',
		'13',	'create water',
		'14',	'cure blindness',
		'15',	'cure critical',
		'16',	'cure light',
		'17',	'curse',
		'18',	'detect evil',
		'19',	'detect invis',
		'20',	'detect magic',
		'21',	'detect poison',
		'22',	'dispel evil',
		'23',	'earthquake',
		'24',	'enchant weapon',
		'25',	'energy drain',
		'26',	'fireball',
		'27',	'harm',
		'28',	'heal',
		'29',	'invis',
		'30',	'lightning bolt',
		'31',	'locate object',
		'32',	'magic missile',
		'33',	'poison',
		'34',	'protection',
		'35',	'remove curse',
		'36',	'sanctuary',
		'37',	'shocking grasp',
		'38',	'sleep',
		'39',	'giant strength',
		'40',	'summon',
		'41',	'ventriloquate',
		'42',	'word of recall',
		'43',	'cure poison',
		'44',	'detect hidden',
		'53',	'identify',
		'56',	'fly',
		'57',	'continual light',
		'58',	'know alignment',
		'59',	'dispel magic',
		'61',	'cure serious',
		'62',	'cause light',
		'63',	'cause critical',
		'64',	'cause serious',
		'65',	'flamestrike',
		'66',	'stone skin',
		'67',	'shield',
		'68',	'weaken',
		'69',	'mass invis',
		'70',	'acid blast',
		'72',	'faerie fire',
		'73',	'faerie fog',
		'74',	'pass door',
		'77',	'infravision',
		'80',	'create spring',
		'81',	'refresh',
		'82',	'change sex',
		'83',	'gate',
		'200',	'acid breath',
		'201',	'fire breath',
		'202',	'frost breath',
		'203',	'gas breath',
		'204',	'lightning breath',
		'609',	'frenzy');
}