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];
if (defined($ARGV[2]) && ($levch = int($ARGV[2])))
{
} else
{
    $levch = 0;
    if (defined($ARGV[2]) && ($ARGV[2] eq "debug"))
    {
	$debug = "yes";
    }
}
if (defined($ARGV[3]) && ($ARGV[3] eq "debug"))
{
    $debug = "yes";
}

open (FILE, "$filein")||die("Can't open input file\n");
$pointer = 0;
$a = 0;
$last = 0;

while ($last == 0)
{
    while (fread_letter() ne '#') {fread_to_eol();}
    $atype = fread_word();
       if ($atype eq "AREA")	{fread_area();}
    elsif ($atype eq "MOBILES")	{$mobset="new";fread_mobiles();}
    elsif ($atype eq "MOBOLD")	{$mobset="old";fread_mobiles();}
    elsif ($atype eq "OBJECTS")	{$objset="new";fread_objects();}
    elsif ($atype eq "OBJOLD")	{$objset="old";fread_objects();}
    elsif ($atype eq "ROOMS")	{fread_rooms();}
    elsif ($atype eq "RESETS")	{fread_resets();}
    elsif ($atype eq "SHOPS")	{fread_shops();}
    elsif ($atype eq "SPECIALS"){fread_specials();}
    elsif ($atype eq "\$")	{$last = 1;}
}
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;
}
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 AREA\n";
    $levels = fread_levels();
    $author = sprintf("%-7s", fread_word());
    $title = fread_string();
    @Filepath = split(/\//, $fileout);
    $outfilename = $Filepath[$#Filepath];
    return;
}

sub write_area
{
    print "Writing AREA\n";
    print OUT "#AREA\nROT v1.5 format~\n${outfilename}~\n";
    print OUT $title, "~\n";
    print OUT "$levels $author $title~\n";
    print OUT "$minvnum $maxvnum\n";
    return;
}

sub fread_mobiles
{
    print "Reading MOBILES\n";
    $vnum = 1;
    while ($vnum != 0)
    {
	while (fread_letter() ne '#')
	    {fread_to_eol();}
	$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";  
        }
	$m_act{$vnum} = fread_flag();
        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 += $levch;
        if ($level > 110)
        { 
            $level = 110;
        }
        if ($level < 0)
        {
            $level = 0;
        }
	$m_level{$vnum} = $level;
        if (defined($debug))  
        {  
            print "\t\thit roll\n";  
        }
	$m_hr{$vnum} = fread_number();
        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_pos{$vnum} = fread_number();
	if ($mobset eq "old")
	{
	    if (defined($debug))
	    {
		print "\t\trace - old\n";
	    }
	    $m_rac{$vnum} = fread_number();
	} else
	{
            if (defined($debug))      
            {     
                print "\t\trace - new\n";     
            }    
	    $m_rac{$vnum} = fread_string();
	}
	if (!defined($race{$m_rac{$vnum}}))
	{
	    $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 "stand stand $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)
    {
	while (fread_letter() ne '#')
	    {fread_to_eol();}
	$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 ($objset eq "old")
	{
	    if (defined($debug))
	    {
		print "\t\tV0-V3 - old\n";
	    }
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    $o_v2{$vnum} = fread_number();
	    $o_v3{$vnum} = fread_number();
	} else {
	    if (defined($debug))
	    {
		print "\t\tV0-V3 - new\n";
	    }
	    $o_v0{$vnum} = fread_string();
	    $o_v1{$vnum} = fread_string();
	    $o_v2{$vnum} = fread_string();
	    $o_v3{$vnum} = fread_string();
	}
	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;
	$o_aff{$vnum} = "";
	$o_shd{$vnum} = "";
	while ($lastline == 0)
	{
	    if (defined($debug))
	    {
		print "\t\tExtras:\n";
	    }
	    $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();
		$tmp = $objapp{$pos};
		($to,$pos)=split(',',$tmp);
		if ($to eq "A")
		{
		    $applypoint++;
		    $tmp = "${vnum}:${applypoint}";
		    $o_apply{$tmp} = "$pos $val";
		} elsif ($to eq "FA")
		{
		    $o_aff{$vnum} .= $pos;
		} elsif ($to eq "FS")
		{
		    $o_shd{$vnum} .= $pos;
		}
	    }
	}
    }
    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")
	 || ($o_type{$vnum} eq "furniture"))
	{
	    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_type{$vnum} eq "pc_corpse")
	      || ($o_type{$vnum} eq "npc_corpse"))
	{
	    $o_level{$vnum} = 1;
	    print OUT "0 0 0 0 0\n";
	} elsif (($o_type{$vnum} eq "scroll")
	      || ($o_type{$vnum} eq "potion")
	      || ($o_type{$vnum} eq "pill"))
	{
	    $level = 1;
	    $o_level{$vnum} = 1;
	    $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 ($objset eq "old")
	    {
		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";
		}
	    } else {
		$found = 0;
		foreach $tmp (sort(keys(%objspell)))
		{
		    if ($o_v1{$vnum} eq $objspell{$tmp})
		    {
			$found = 1;
		    }
		}
		if ($found == 1)
		{
		    print OUT "'$o_v1{$vnum}' ";
		} else {
		    print OUT "'' ";
		}
		$found = 0;
		foreach $tmp (sort(keys(%objspell)))
		{
		    if ($o_v2{$vnum} eq $objspell{$tmp})
		    {
			$found = 1;
		    }
		}
		if ($found == 1)
		{
		    print OUT "'$o_v2{$vnum}' ";
		} else {
		    print OUT "'' ";
		}
		$found = 0;
		foreach $tmp (sort(keys(%objspell)))
		{
		    if ($o_v3{$vnum} eq $objspell{$tmp})
		    {
			$found = 1;
		    }
		}
		if ($found == 1)
		{
		    print OUT "'$o_v3{$vnum}' ''\n";
		} else {
		    print OUT "'' ''\n";
		}
	    }
	} elsif (($o_type{$vnum} eq "wand")
	      || ($o_type{$vnum} eq "staff"))
	{
	    $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 ($objset eq "old")
	    {
		if (defined($objspell{$o_v3{$vnum}}))
		{
		    print OUT "'$objspell{$o_v3{$vnum}}' 0\n";
		} else {
		    print OUT "'' 0\n";
		}
	    } else {
		$found = 0;
		foreach $tmp (sort(keys(%objspell)))
		{
		    if ($o_v3{$vnum} eq $objspell{$tmp})
		    {
			$found = 1;
		    }
		}
		if ($found == 1)
		{
		    print OUT "'$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} == 0)
		||  ($o_v3{$vnum} == 7)
		||  ($o_v3{$vnum} == 8))
		{
		    $o_v0{$vnum} = "mace";
		} elsif (($o_v3{$vnum} == 1)
		     ||  ($o_v3{$vnum} == 3))
		{
		    $o_v0{$vnum} = "sword";
		} elsif (($o_v3{$vnum} == 2)
		     ||  ($o_v3{$vnum} == 11))
		{
		    $o_v0{$vnum} = "dagger";
		} elsif ($o_v3{$vnum} == 4)
		{
		    $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_type{$vnum} eq "fountain"))
	{
	    $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++;
	    }
	}
	if ($o_aff{$vnum} ne "")
	{
	    print OUT "F\nA 0 0 $o_aff{$vnum}\n";
	}
	if ($o_shd{$vnum} ne "")
	{
	    print OUT "F\nS 0 0 $o_shd{$vnum}\n";
	}
	$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)
    {
	while (fread_letter() ne '#')
	    {fread_to_eol();}
	$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";
	}
	$r_flags{$vnum} = fread_flag();
	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";
	    }
	    $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";
		}
		$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
{
    print "Reading RESETS\n";
    $rm = 0;
    $ro = 0;
    $rp = 0;
    $rg = 0;
    $re = 0;
    $rd = 0;
    $rr = 0;
    while (fread_letter() ne 'S')
    {
	$pointer--;
	$type = fread_letter();
	if (defined($debug))
	{
	    print "\t$type\n";
	}
	if ($type eq 'M')
	{
	    $rm++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob vnum\n";
	    }
	    $rm_vnum{$rm} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob 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";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tobject vnum\n";
	    }
	    $ro_vnum{$ro} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tobject to_room\n";
	    }
	    $ro_room{$ro} = fread_number();
	} elsif ($type eq 'P')
	{
	    $rp++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tput vnum\n";
	    }
	    $rp_vnum{$rp} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tput to_object\n";
	    }
	    $rp_to{$rp} = fread_number();
	    $rp_under{$rp} = $ro;
	} elsif ($type eq 'G')
	{
	    $rg++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tgive vnum\n";
	    }
	    $rg_vnum{$rg} = fread_number();
	    $rg_under{$rg} = $rm;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    $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";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tequip vnum\n";
	    }
	    $re_vnum{$re} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\tequip wear\n";
	    }
	    $re_wear{$re} = fread_number();
	    $re_under{$re} = $rm;
	    $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";
	    }
	    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();
	} elsif ($type eq 'R')
	{
	    $rr++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    fread_number();
	    if (defined($debug))
	    {
		print "\t\trandom room\n";
	    }
	    $rr_room{$rr} = fread_number();
	    if (defined($debug))
	    {
		print "\t\trandom max_direction\n";
	    }
	    $rr_door{$rr} = 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 0 $rd_room{$rd} $rd_door{$rd} $rd_stat{$rd}";
	$tmp = $rd_room{$rd};
	print OUT "\t\t* $r_name{$tmp}\n";
    }

    $lastline = 0;
    $rr = 0;
    while ($lastline == 0)
    {
	$rr++;
	if (!defined($rr_room{$rr}))
	{
	    if ($rr > 1)
	    {
		print OUT "\n";
	    }
	    $lastline++;
	    next;
	}
	print OUT "R 0 $rr_room{$rr} $rr_door{$rr}";
	$tmp = $rr_room{$rr};
	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 0 $ro_vnum{$ro} 0 $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)
	    {
		print OUT "P 0 $rp_vnum{$rp} 0 $ro_vnum{$ro} 1";
		$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 0 $rm_vnum{$rm} $rm_glob{$rm} $rm_room{$rm}";
	$temp = $rm_vnum{$rm};
	$tmp = "${temp}:$rm_room{$rm}";
	print OUT " $rm_local{$tmp}";
	print OUT "\t\t* $m_short{$temp}\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 1 $rg_vnum{$rg} -1";
		$tmp = $rg_vnum{$rg};
		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 1 $re_vnum{$re} -1 $re_wear{$re}";
		$tmp = $re_vnum{$re};
		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)
    {
	$vnum = fread_number();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
	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\tbuy percent\n";
	}
	$buyp{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tsell percent\n";
	}
	$sellp{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\topen\n";
	}
	$open{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tclose\n";
	}
	$close{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tcomment\n";
	}
	fread_to_eol();
    }
    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    * ",
		$vnum, $sell1{$vnum}, $sell2{$vnum}, $sell3{$vnum},
		$sell4{$vnum}, $sell5{$vnum}, $buyp{$vnum},
		$sellp{$vnum}, $open{$vnum}, $close{$vnum});
	if (defined($m_short{$vnum}))
	{
	    $tmp .= $m_short{$vnum};
	}
	print OUT $tmp, "\n";
    }
    print OUT "0\n";
    return;
}

sub fread_specials
{
    print "Reading SPECIALS\n";
    while (fread_letter() ne 'S')
    {
	$pointer--;
	$type = fread_letter();
	if ($type eq 'M')
	{
	    $vnum = fread_number();
	    if (defined($debug))
	    {
		print "\t$vnum\n";
	    }
	    if (defined($debug))
	    {
		print "\t\tspecial\n";
	    }
	    $spec{$vnum} = fread_word();
	    if (defined($debug))
	    {
		print "\t\tcomment\n";
	    }
	    fread_to_eol();
	    $tmp = $spec{$vnum};
	    if (!defined($special{$tmp}))
	    {
		$spec{$vnum} = "";
	    }
	} else {
	    if (defined($debug))
	    {
		print "\t\t\tEOL\n";
	    }
	    fread_to_eol();
	}
    }
    return;
}

sub write_specials
{
    print "Writing SPECIALS\n";
    print OUT "\n#SPECIALS\n";
    foreach $vnum (sort(keys(%spec)))
    {
	if ($spec{$vnum} ne "")
	{
	    $tmp = sprintf("M%6d %-30s * ",$vnum, $spec{$vnum});
	    if (defined($m_short{$vnum}))
	    {
		$tmp .= $m_short{$vnum};
	    }
	    print OUT $tmp, "\n";
	}
    }
    print OUT "S\n";
    return;
}

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

sub init_flags
{
    @sexes = ('none', 'male', 'female');
    %mobaff =	('A',	'A,A',
		 'B',	'S,B',
		 'C',	'A,C',
		 'D',	'A,D',
		 'E',	'A,E',
		 'F',	'A,F',
		 'H',	'S,H',
		 'I',	'A,I',
		 'J',	'A,J',
		 'K',	'A,K',
		 'M',	'A,M',
		 'N',	'S,N',
		 'P',	'A,P',
		 'Q',	'A,Q',
		 'R',	'A,R',
		 'S',	'A,S',
		 'T',	'A,T',
		 'U',	'A,U');
    @objects =	('trash',	'light',
		 'scroll',	'wand',
		 'staff',	'weapon',
		 'trash',	'trash',
		 'treasure',	'armor',
		 'potion',	'trash',
		 'furniture',	'trash',
		 'trash',	'container',
		 'trash',	'drink',
		 'key',		'food',
		 'money',	'trash',
		 'boat',	'npc_corpse',
		 'pc_corpse',	'fountain',
		 'pill',	'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');
    @objapp =	('A,0',
		 'A,1',		'A,2',
		 'A,3',		'A,4',
		 'A,5',		'A,6',
		 'A,7',		'A,8',
		 'A,9',		'A,10',
		 'A,11',	'A,12',
		 'A,13',	'A,14',
		 'A,15',	'A,16',
		 'A,17',	'A,18',
		 'A,19',	'A,20',
		 'A,21',	'A,22',
		 'A,23',	'A,24',
		 'FS,H',	'FA,T',
		 'FA,A',	'FS,B',
		 'FA,C',	'FA,D',
		 'FA,E',	'FA,F',
		 'FA,I',	'FA,J',
		 'FA,K',	'FA,M',
		 'FS,N',	'FA,P',
		 'FA,Q',	'FA,U',
		 'FA,X',	'FA,c');
    %objspell =	(
		'70',	'acid blast',
		'1',	'armor',
		'3',	'bless',
		'4',	'blindness',
		'5',	'burning hands',
		'6',	'call lightning',
		'63',	'cause critical',
		'62',	'cause light',
		'64',	'cause serious',
		'82',	'change sex',
		'7',	'charm person',
		'8',	'chill touch',
		'10',	'colour spray',
		'57',	'continual light',
		'11',	'control weather',
		'12',	'create food',
		'80',	'create spring',
		'13',	'create water',
		'14',	'cure blindness',
		'15',	'cure critical',
		'16',	'cure light',
		'43',	'cure poison',
		'61',	'cure serious',
		'17',	'curse',
		'18',	'detect evil',
		'44',	'detect hidden',
		'19',	'detect invis',
		'20',	'detect magic',
		'21',	'detect poison',
		'22',	'dispel evil',
		'59',	'dispel magic',
		'23',	'earthquake',
		'24',	'enchant weapon',
		'25',	'energy drain',
		'72',	'faerie fire',
		'73',	'faerie fog',
		'26',	'fireball',
		'65',	'flamestrike',
		'56',	'fly',
		'83',	'gate',
		'39',	'giant strength',
		'27',	'harm',
		'28',	'heal',
		'53',	'identify',
		'77',	'infravision',
		'29',	'invis',
		'58',	'know alignment',
		'30',	'lightning bolt',
		'31',	'locate object',
		'32',	'magic missile',
		'69',	'mass invis',
		'74',	'pass door',
		'33',	'poison',
		'34',	'protection',
		'81',	'refresh',
		'35',	'remove curse',
		'36',	'sanctuary',
		'67',	'shield',
		'37',	'shocking grasp',
		'38',	'sleep',
		'66',	'stone skin',
		'40',	'summon',
		'2',	'teleport',
		'41',	'ventriloquate',
		'68',	'weaken',
		'42',	'word of recall',
		'200',	'acid breath',
		'201',	'fire breath',
		'202',	'frost breath',
		'203',	'gas breath',
		'204',	'lightning breath',
		'609',	'frenzy',
		'83',	'gate');
}