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

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


$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";
}

undef @nospell;
init_flags();
undef @Exits;
open (FILE, "$filein")||die("Can't open input file\n");
$pointer = 0;
$a = 0;
$last = 0;
print "$filein\n";

while ($last == 0)
{
    while (fread_letter() ne '#') {fread_to_eol();}
    $atype = fread_word();
       if ($atype eq "AREADATA"){fread_area();}
    elsif ($atype eq "MOBILES")	{fread_mobiles();}
    elsif ($atype eq "OBJECTS")	{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;
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;

for ($i = 0; $i < 111; $i++)
{
    $mlev{$i} = 0;
}
foreach $vnum (sort bynum(keys(%m_name)))
{
    if (!defined($m_shopkeep{$vnum}))
    {
	$tmp = int($m_level{$vnum});
	$mlev{$tmp}++;
    }
}
open(OUT, ">rot.levels");
for ($i = 1; $i < 111; $i+=2)
{
    $j = $i+1;
    print OUT "$i\t$mlev{$i}\t\t$j\t$mlev{$j}\n";
}
close OUT;
$noexit = @Exits;
if ($noexit > 0)
{
    print "\nThe following external exits were found:\n";
    foreach $tmp (sort(@Exits))
    {
	print "\t$tmp\n";
    }
} else
{
    print "\nNo external exits were found.\n";
}
$noslot = @nospell;
if ($noslot > 0)
{
    print "\nThe following objects had invalid spell slot numbers:\n";
    foreach $tmp (sort(@nospell))
    {
	print "\t$tmp\n";
    }
}
exit;



sub fread_area
{
    print "Reading AREADATA\n";
    while (($tmp = fread_word()) ne "End")
    {
	if ($tmp eq "Name")
	{
	    $levels = fread_levels();
	    $author = sprintf("%-7s", fread_word());
	    $title = fread_string();
	} elsif ($tmp eq "VNUMs")
	{
	    $minvnum = fread_number();
	    $maxvnum = fread_number();
	} else {
	    fread_to_eol();
	}
    }
    @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\trace\n";     
	}    
	$m_rac{$vnum} = fread_string();
        if (defined($debug))  
        {  
            print "\t\tact1\n";  
        }
	$m_act1 = fread_flag();
        if (defined($debug))  
        {  
            print "\t\tact2\n";  
        }
	$m_act2 = fread_flag();
        if (defined($debug))  
        {  
            print "\t\tact3\n";  
        }
	$m_act3 = fread_flag();
	$m_act{$vnum} = "";
	foreach $temp (split('',$m_act1))
	{
	    if (defined($mobact1{$temp}))
	    {
		$m_act{$vnum} .= $mobact1{$temp};
	    }
	}
	foreach $temp (split('',$m_act2))
	{
	    if (defined($mobact2{$temp}))
	    {
		$m_act{$vnum} .= $mobact2{$temp};
	    }
	}
	if ($m_act{$vnum} eq "")
	{
	    $m_act{$vnum} = "0";
	}
        if (defined($debug))  
        {  
            print "\t\taff1\n";  
        }
	$m_aff1 = fread_flag();
        if (defined($debug))  
        {  
            print "\t\taff2\n";  
        }
	$m_aff2 = fread_flag();
        if (defined($debug))  
        {  
            print "\t\taff3\n";  
        }
	$m_aff3 = fread_flag();
        $m_aff{$vnum} = "";
        $m_shd{$vnum} = "";
	foreach $temp (split('',$m_aff1))
	{
	    if (defined($mobaff1{$temp}))
	    {
                ($pos,$val)=split(',', $mobaff1{$temp});
                if ($pos eq "A")
                {
                    $m_aff{$vnum} .= $val;
                } elsif ($pos eq "S")
                {
                    $m_shd{$vnum} .= $val;
                }
	    }
	}
	foreach $temp (split('',$m_aff2))
	{
	    if (defined($mobaff2{$temp}))
	    {
                ($pos,$val)=split(',', $mobaff2{$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\tgroup\n";  
        }
	fread_word();
	$m_group{$vnum} = 0;
        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\tmagic resist\n";  
        }
	fread_number();
        if (defined($debug))  
        {  
            print "\t\thit roll\n";  
        }
	$m_hr{$vnum} = fread_number();
        if (defined($debug))  
        {  
            print "\t\thit dice\n";  
        }
	$m_hdice{$vnum} = fread_word();
        if (defined($debug))  
        {  
            print "\t\tmana dice\n";  
        }
	$m_mdice{$vnum} = fread_word();
        if (defined($debug))  
        {  
            print "\t\tdamage dice\n";  
        }
	$m_ddice{$vnum} = fread_word();
        if (defined($debug))  
        {  
            print "\t\tdamage type\n";  
        }
	$m_dtype{$vnum} = $damtypes[fread_number()];
        if (defined($debug))
        {
            print "\t\tAC 1\n";
        }
	$m_ac1{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\tAC 2\n";
        }
	$m_ac2{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\tAC 3\n";
        }
	$m_ac3{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\tAC 4\n";
        }
	$m_ac4{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\toffensive\n";
        }
	$m_off{$vnum} = fread_flag();
	fread_flag();
	fread_flag();
        if (defined($debug))
        {
            print "\t\timmune\n";
        }
	$m_imm{$vnum} = fread_flag();
	fread_flag();
	fread_flag();
        if (defined($debug))
        {
            print "\t\tresist\n";
        }
	$m_res{$vnum} = fread_flag();
	fread_flag();
	fread_flag();
        if (defined($debug))
        {
            print "\t\tvulnerable\n";
        }
	$m_vul{$vnum} = fread_flag();
	fread_flag();
	fread_flag();
        if (defined($debug))
        {
            print "\t\tstart position\n";
        }
	$m_pos1{$vnum} = $positions[fread_number()];
        if (defined($debug))
        {
            print "\t\tdefault position\n";
        }
	$m_pos2{$vnum} = $positions[fread_number()];
        if (defined($debug))  
        {  
            print "\t\tsex\n";  
        }
	$m_sex{$vnum} = $sexes[fread_number()];
        if (defined($debug))
        {
            print "\t\ttreasure\n";
        }
	$m_gold{$vnum} = fread_number();
        if (defined($debug))
        {
            print "\t\tform\n";
        }
	$m_form{$vnum} = fread_flag();
        if (defined($debug))
        {
            print "\t\tparts\n";
        }
	$m_parts{$vnum} = fread_flag();
        if (defined($debug))
        {
            print "\t\tsize\n";
        }
	$m_size{$vnum} = $sizes{fread_letter()};
        if (defined($debug))
        {
            print "\t\tmaterial\n";
        }
	$m_material{$vnum} = fread_string();
	$m_material{$vnum} = "0";
	$lastline = 0;
	while ($lastline == 0)
	{
	    if (defined($debug))
	    {
		print "\t\tExtras:\n";
	    }
	    $tmp = fread_letter();
	    if ($tmp eq '#')
	    {
		$pointer--;
		$lastline = 1;
		next;
	    }
	    if ($tmp eq 'F')
	    {
		if (defined($debug))
		{
		    print "\t\t\tremove flags\n";
		}
		$pos = fread_word();
		$val = fread_flag();
		if ($pos eq "act")
		{
		    $m_flag_act{$vnum} = $val;
		} elsif ($pos eq "aff")
		{
		    $m_flag_aff{$vnum} = $val;
		} elsif ($pos eq "shd")
		{
		    $m_flag_shd{$vnum} = $val;
		} elsif ($pos eq "off")
		{
		    $m_flag_off{$vnum} = $val;
		} elsif ($pos eq "imm")
		{
		    $m_flag_imm{$vnum} = $val;
		} elsif ($pos eq "res")
		{
		    $m_flag_res{$vnum} = $val;
		} elsif ($pos eq "vul")
		{
		    $m_flag_vul{$vnum} = $val;
		} elsif ($pos eq "for")
		{
		    $m_flag_for{$vnum} = $val;
		} elsif ($pos eq "par")
		{
		    $m_flag_par{$vnum} = $val;
		}   
	    }
	}
    }
    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} $m_group{$vnum}\n";
	print OUT "$level $m_hr{$vnum} $mobhp{$level} ";
	print OUT "$mobhp{$level} $mobdm{$level} $m_dtype{$vnum}\n";
	$mobac = $ac{$level};
	$mobexotic = $mobac + 4;
	print OUT "$mobac $mobac $mobac $mobexotic\n";
	print OUT "$m_off{$vnum} $m_imm{$vnum} $m_res{$vnum} $m_vul{$vnum}\n";
	print OUT "$m_pos1{$vnum} $m_pos1{$vnum} $m_sex{$vnum} $m_gold{$vnum}\n";
	print OUT "$m_form{$vnum} $m_parts{$vnum} $m_size{$vnum} $m_material{$vnum}\n";
	if (defined($m_flag_act{$vnum}))
	{
	    print OUT "F act $m_flag_act{$vnum}\n";
	}
	if (defined($m_flag_aff{$vnum}))
	{
	    print OUT "F aff $m_flag_aff{$vnum}\n";
	}
	if (defined($m_flag_shd{$vnum}))
	{
	    print OUT "F shd $m_flag_shd{$vnum}\n";
	}
	if (defined($m_flag_off{$vnum}))
	{
	    print OUT "F off $m_flag_off{$vnum}\n";
	}
	if (defined($m_flag_imm{$vnum}))
	{
	    print OUT "F imm $m_flag_imm{$vnum}\n";
	}
	if (defined($m_flag_res{$vnum}))
	{
	    print OUT "F res $m_flag_res{$vnum}\n";
	}
	if (defined($m_flag_vul{$vnum}))
	{
	    print OUT "F vul $m_flag_vul{$vnum}\n";
	}
	if (defined($m_flag_for{$vnum}))
	{
	    print OUT "F for $m_flag_for{$vnum}\n";
	}
	if (defined($m_flag_par{$vnum}))
	{
	    print OUT "F par $m_flag_par{$vnum}\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\tmaterial\n";
	}
	$o_material{$vnum} = fread_string();
	if (defined($debug))
	{
	    print "\t\ttype\n";
	}
	$o_type{$vnum} = $objects[fread_number()];
	if (defined($debug))
	{
	    print "\t\textra\n";
	}
	$o_extra = fread_flag();
	$o_extra{$vnum} = "";
	foreach $temp (split('',$o_extra))
	{
	    if (defined($oflags{$temp}))
	    {
		$o_extra{$vnum} .= $oflags{$temp};
	    }
	}
	if ($o_extra{$vnum} eq "")
	{
	    $o_extra{$vnum} = "0";
	}
	if (defined($debug))
	{
	    print "\t\twear\n";
	}
	$o_wear = fread_flag();
	$o_wear{$vnum} = "";
	foreach $temp (split('',$o_wear))
	{
	    if (defined($owear{$temp}))
	    {
		$o_wear{$vnum} .= $owear{$temp};
	    }
	}
	if ($o_wear{$vnum} eq "")
	{
	    $o_wear{$vnum} = "0";
	}
	if (defined($debug))
	{
	    print "\t\tV0-V4\n";
	}
	if ($o_type{$vnum} eq "light")
	{
	    fread_word();
	    fread_word();
	    $o_v2{$vnum} = fread_number();
	    fread_word();
	    fread_word();
	    $o_v0{$vnum} = 0;
	    $o_v1{$vnum} = 0;
	    $o_v3{$vnum} = 0;
	    $o_v4{$vnum} = 0;
	} elsif (($o_type{$vnum} eq "wand")
	      || ($o_type{$vnum} eq "staff"))
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    $o_v2{$vnum} = fread_number();
	    $tmp = fread_number();
	    if (defined($objspell{$tmp}))
	    {
		$o_v3{$vnum} = "'${objspell{$tmp}}'";
	    } else {
		$o_v3{$vnum} = "''";
		if ($tmp != 0)
		{
		    push(@nospell,"${vnum} -> ${tmp}");
		}
	    }
	    fread_word();
	    $o_v4{$vnum} = 0;
	} elsif (($o_type{$vnum} eq "pill")
	      || ($o_type{$vnum} eq "scroll")
	      || ($o_type{$vnum} eq "potion"))
	{
	    $o_v0{$vnum} = fread_number();
	    $tmp = fread_number();
	    if (defined($objspell{$tmp}))
	    {
		$o_v1{$vnum} = "'${objspell{$tmp}}'";
	    } else {
		$o_v1{$vnum} = "''";
		if ($tmp != 0)
		{
		    push(@nospell,"${vnum} -> ${tmp}");
		}
	    }
	    $tmp = fread_number();
	    if (defined($objspell{$tmp}))
	    {
		$o_v2{$vnum} = "'${objspell{$tmp}}'";
	    } else {
		$o_v2{$vnum} = "''";
		if ($tmp != 0)
		{
		    push(@nospell,"${vnum} -> ${tmp}");
		}
	    }
	    $tmp = fread_number();
	    if (defined($objspell{$tmp}))
	    {
		$o_v3{$vnum} = "'${objspell{$tmp}}'";
	    } else {
		$o_v3{$vnum} = "''";
		if ($tmp != 0)
		{
		    push(@nospell,"${vnum} -> ${tmp}");
		}
	    }
	    fread_word();
	    $o_v4{$vnum} = "''";
	} elsif ($o_type{$vnum} eq "weapon")
	{
	    $o_v0{$vnum} = $weaptypes[fread_number()];
	    fread_word();
	    fread_word();
	    $o_v3{$vnum} = $damtypes[fread_number()];
	    $o_v4 = fread_flag();
	    $o_v4{$vnum} = "";
	    foreach $temp (split('',$o_v4))
	    {
		if (defined($weapflag{$temp}))
		{
		    $o_v4{$vnum} .= $weapflag{$temp};
		}
	    }
	    if ($o_v4{$vnum} eq "")
	    {
		$o_v4{$vnum} = "0";
	    }
	    $o_v1{$vnum} = 0;
	    $o_v2{$vnum} = 0;
	} elsif (($o_type{$vnum} eq "armor")
	      || ($o_type{$vnum} eq "treasure")
	      || ($o_type{$vnum} eq "key")
	      || ($o_type{$vnum} eq "boat")
	      || ($o_type{$vnum} eq "map")
	      || ($o_type{$vnum} eq "warp_stone")
	      || ($o_type{$vnum} eq "trash"))
	{
	    fread_word();
	    fread_word();
	    fread_word();
	    fread_word();
	    fread_word();
	    $o_v0{$vnum} = 0;
	    $o_v1{$vnum} = 0;
	    $o_v2{$vnum} = 0;
	    $o_v3{$vnum} = 0;
	    $o_v4{$vnum} = 0;
	} elsif (($o_type{$vnum} eq "food")
	      || ($o_type{$vnum} eq "money"))
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    $o_v2{$vnum} = fread_number();
	    $o_v3{$vnum} = fread_number();
	    fread_word();
	    $o_v4{$vnum} = 0;
	} elsif ($o_type{$vnum} eq "drink")
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    $o_v2{$vnum} = "'${liquids[fread_number()]}'";
	    $o_v3{$vnum} = fread_number();
	    fread_word();
	    $o_v4{$vnum} = 0;
	} elsif ($o_type{$vnum} eq "fountain")
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    fread_word();
	    fread_word();
	    fread_word();
	    $o_v2{$vnum} = "'water'";
	    $o_v3{$vnum} = 0;
	    $o_v4{$vnum} = 0;
	} elsif ($o_type{$vnum} eq "portal")
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_flag();
	    $o_v2{$vnum} = fread_flag();
	    $o_v3{$vnum} = fread_number();
	    fread_word();
	    $o_v4{$vnum} = 0;
	} elsif ($o_type{$vnum} eq "container")
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_flag();
	    $o_v2{$vnum} = fread_number();
	    $o_v3{$vnum} = fread_number();
	    $o_v4{$vnum} = fread_number();
	    if ($o_v4{$vnum} < 1)
	    {
		$o_v4{$vnum} = 1;
	    }
	} elsif ($o_type{$vnum} eq "furniture")
	{
	    $o_v0{$vnum} = fread_number();
	    $o_v1{$vnum} = fread_number();
	    $o_v2{$vnum} = fread_flag();
	    $o_v3{$vnum} = fread_number();
	    $o_v4{$vnum} = fread_number();
	    if ($o_v3{$vnum} < 1)
	    {
		$o_v3{$vnum} = 100;
	    }
	    if ($o_v4{$vnum} < 1)
	    {
		$o_v4{$vnum} = 100;
	    }
	}

	if (defined($debug))
	{
	    print "\t\tlevel\n";
	}
	$o_level{$vnum} = fread_number();
	$level = int($o_level{$vnum});
	$level += $levch;
	if ($level > 110)
	{ 
	    $level = 110;
	}
	if ($level < 0)
	{
	    $level = 0;
	}
	$o_level{$vnum} = $level;
	if (defined($debug))
	{
	    print "\t\tsize\n";
	}
	fread_word();
	if (defined($debug))
	{
	    print "\t\tweight\n";
	}
	$o_weight{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tmagic resist\n";
	}
	fread_number();
	if (defined($debug))
	{
	    print "\t\tcost\n";
	}
	$o_cost{$vnum} = fread_number();
	if (defined($debug))
	{
	    print "\t\tcondition\n";
	}
	$o_cond{$vnum} = fread_letter();
	$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")
                {
		    if ($pos != 0)
		    {
			$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 $o_material{$vnum}, "~\n";
	print OUT "$o_type{$vnum} $o_extra{$vnum} $o_wear{$vnum}\n";
	if (($o_type{$vnum} eq "wand")
	  || ($o_type{$vnum} eq "staff")
	  || ($o_type{$vnum} eq "scroll")
	  || ($o_type{$vnum} eq "potion")
	  || ($o_type{$vnum} eq "pill"))
	{
	    $o_v0{$vnum} += $levch;
	    if ($o_v0{$vnum} > 110)
	    {
		$o_v0{$vnum} = 110;
	    }
            if ($o_v0{$vnum} < 0) 
            { 
                $o_v0{$vnum} = 0; 
            }
	} elsif ($o_type{$vnum} eq "weapon")
	{
	    ($dice,$sides)=split(' ', $weapdice{$level});
	    $o_v1{$vnum} = $dice;
	    $o_v2{$vnum} = $sides;
	} elsif ($o_type{$vnum} eq "armor")
	{
	    $o_v0{$vnum} = $objac{$level};
	    $o_v1{$vnum} = $objac{$level};
	    $o_v2{$vnum} = $objac{$level};
	    $o_v3{$vnum} = $objac{$level} - 4;
	    if ($o_v3{$vnum} < 0)
	    {
		$o_v3{$vnum} = 0;
	    }
	}
	print OUT "$o_v0{$vnum} $o_v1{$vnum} ";
	print OUT "$o_v2{$vnum} $o_v3{$vnum} $o_v4{$vnum}\n";
	print OUT "$o_level{$vnum} $o_weight{$vnum} $o_cost{$vnum} $o_cond{$vnum}\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 'C')
	    {
		if (defined($debug))
		{
		    print "\t\t\tclan\n";
		}
		$r_clan{$vnum} = fread_string();
		next;
	    }
	    if ($tmp eq 'M')
	    {
		if (defined($debug))
		{
		    print "\t\t\tmana\n";
		}
		$r_mana{$vnum} = fread_number();
		next;
	    }
	    if ($tmp eq 'H')
	    {
		if (defined($debug))
		{
		    print "\t\t\theal\n";
		}
		$r_heal{$vnum} = fread_number();
		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();
		if (($r_doorto{$tmp} < $minvnum)
		||  ($r_doorto{$tmp} > $maxvnum))
		{
		    $temp = "${vnum} -> ${dir} -> $r_doorto{$tmp}";
		    push(@Exits, $temp);
		}
	    }
	}
    }
    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 < 12; $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";
	    }
	}
	if (defined($r_clan{$vnum}))
	{
	    print OUT "C $r_clan{$vnum}~\n";
	}
	if (defined($r_mana{$vnum}))
	{
	    if (defined($r_heal{$vnum}))
	    {
		print OUT "M $r_clan{$vnum} H $r_heal{$vnum}\n";
	    } else
	    {
		print OUT "M $r_clan{$vnum} H 100\n";
	    }
	} elsif (defined($r_heal{$vnum}))
	{
	    print OUT "M 100 H $r_heal{$vnum}\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;
    $inc = 0;
    while (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 ($rm_glob{$rm} == 0)
	    {
		$rm_glob{$rm} = -1;
	    }
	    if (defined($debug))
	    {
		print "\t\tmob to_room\n";
	    }
	    $rm_room{$rm} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tmob local limit\n";
	    }
            $tmp = "${rm_vnum{$rm}}:${rm_room{$rm}}";
            $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();
	    $ro_p2{$ro} = -1;
	    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();
	    $rp_p1{$rp} = 1;
	    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} = -1;
	    if (defined($debug))
	    {
		print "\t\tput to_object\n";
	    }
	    $rp_to{$rp} = fread_number();
	    if (defined($debug))
	    {
		print "\t\tput copies\n";
	    }
            $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 ($rg_p1{$rg} == 0)
	    {
		$rg_p1{$rg} = 1;
	    }
	    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();
	    if ($rg_limit{$rg} == 0)
	    {
		$rg_limit{$rg} = -1;
	    }
	    $rg_inc{$rg} = $inc;
	} elsif ($type eq 'E')
	{
	    $re++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $re_p1{$re} = fread_number();
	    if ($re_p1{$re} == 0)
	    {
		$re_p1{$re} = 1;
	    }
	    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 ($re_limit{$re} == 0)
	    {
		$re_limit{$re} = -1;
	    }
	    if (defined($debug))
	    {
		print "\t\tequip wear\n";
	    }
	    $re_wear{$re} = fread_number();
	    $re_under{$re} = $rm;
	    $re_inc{$re} = $inc;
	} 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();
	} elsif ($type eq 'R')
	{
	    $rr++;
	    if (defined($debug))
	    {
		print "\t\tplaceholder\n";
	    }
	    $rr_p1{$rr} = 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 $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;
    $rr = 0;
    while ($lastline == 0)
    {
	$rr++;
	if (!defined($rr_room{$rr}))
	{
	    if ($rr > 1)
	    {
		print OUT "\n";
	    }
	    $lastline++;
	    next;
	}
	print OUT "R $rr_p1{$rr} $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 $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}";
	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 $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)
    {
	$vnum = fread_number();
	if (defined($debug))
	{
	    print "\t$vnum\n";
	}
	if ($vnum == 0)
	{
	    next;
	}
	$m_shopkeep{$vnum} = "yes";
	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();
	} 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 init_flags
{
    @sexes = ('none', 'male', 'female');
    @positions = ('dead', 'mort', 'incap', 'stun',
                  'sleep', 'rest', 'sit', 'fight', 'stand');
    %sizes =	('T',	'tiny',
		 'S',	'small',
		 'M',	'medium',
		 'L',	'large',
		 'H',	'huge',
		 'G',	'giant');
    %mobact1 =	('A',	'A',
		 'B',	'B',
		 'C',	'C',
		 'D',	'D',
		 'E',	'E',
		 'F',	'F',
		 'G',	'G',
		 'H',	'H',
		 'I',	'I',
		 'J',	'J',
		 'K',	'K',
		 'L',	'L',
		 'M',	'M',
		 'N',	'N',
		 'O',	'O',
		 'P',	'P',
		 'Q',	'Q',
		 'R',	'R',
		 'S',	'S',
		 'T',	'T',
		 'U',	'U',
		 'V',	'V',
		 'W',	'W',
		 'X',	'X',
		 'Y',	'Y',
		 'Z',	'Z',
		 'a',	'a',
		 'b',	'b');
    %mobact2 =	('C',   'Y',
		 'D',	'W');
    %mobaff1 =  ('A',   'A,A',
                 'B',   'S,B',
                 'C',   'A,C',
                 'D',   'A,D',
                 'E',   'A,E',
                 'F',   'A,F',
                 'G',   'A,G',
                 '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',
                 'V',   'A,V',
                 'W',   'A,W',
		 'X',	'A,X',
		 'Y',	'A,Y',
		 'Z',	'A,Z',
		 'a',	'A,a',
		 'b',	'A,b',
		 'c',	'A,c');
    %mobaff2 =	('A',	'A,G',
		 'I',	'S,O');
    @damtypes = (       'none',		'slice',        'stab',
                        'slash',        'whip',         'claw',
                        'blast',        'pound',        'crush',
                        'grep',         'bite',         'pierce',
                        'suction',      'beating',      'digestion',
                        'charge',       'slap',         'punch',
                        'wrath',        'magic',        'divine',
                        'cleave',       'scratch',      'peck',
                        'peckb',        'chop',         'sting',
                        'smash',        'shbite',       'flbite',
                        'frbite',       'acbite',       'chomp',
                        'drain',        'thrust',       'slime',
                        'shock',        'thwack',       'flame',
                        'chill' );
    @objects =  ('trash',       'light',
                 'scroll',      'wand',
                 'staff',       'weapon',
                 'trash',       'trash',
                 'treasure',    'armor',
                 'potion',      'clothing',
                 'furniture',   'trash',
                 'trash',       'container',
                 'trash',       'drink',
                 'key',         'food',
                 'money',       'trash',
                 'boat',        'npc_corpse',
                 'trash',	'fountain',
                 'pill',        'trash',
                 'map',         'portal',
                 'warp_stone',  'trash',
                 'trash',	'trash',
                 'trash');
    %oflags =	('A',	'A',
		 'B',	'B',
		 'C',	'C',
		 'D',	'D',
		 'E',	'E',
		 'F',	'F',
		 'G',	'G',
		 'H',	'H',
		 'I',	'I',
		 'J',	'J',
		 'K',	'K',
		 'L',	'L',
		 'M',	'M',
		 'N',	'N',
		 'O',	'O',
		 'P',	'P',
		 'Q',	'Q');
    %owear =	('A',	'A',
		 'B',	'B',
		 'C',	'C',
		 'D',	'D',
		 'E',	'E',
		 'F',	'F',
		 'G',	'G',
		 'H',	'H',
		 'I',	'I',
		 'J',	'J',
		 'K',	'K',
		 'L',	'L',
		 'M',	'M',
		 'N',	'N',
		 'O',	'O',
		 'Q',	'P');
    @liquids =  ('water',       'beer',
                 'red wine',    'ale',
                 'dark ale',    'whiskey',
                 'lemonade',    'firebreather',
                 'local specialty', 'slime mold juice',
                 'milk',        'tea',
                 'coffee',      'blood',
                 'salt water',  'coke',
                 'root beer',   'elvish wine',
                 'white wine',  'champagne',
                 'mead',        'rose wine',
                 'benedictine wine',    'vodka',
                 'cranberry juice',     'orange juice',
                 'absinthe',    'brandy',
                 'aquavit',     'schnapps',
                 'icewine',     'amontillado',
                 'sherry',      'framboise',
                 'rum',         'cordial',
                 'dr pepper');
    @weaptypes =('exotic',      'sword',
                 'dagger',      'spear',
                 'mace',        'axe',
                 'flail',       'whip',
                 'polearm');
    %weapflag =	('A',	'A',
		 'B',	'B',
		 'C',	'C',
		 'D',	'D',
		 'E',	'E',
		 'F',	'F',
		 'G',	'H',
		 'I',	'G');
    @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',
		 'A,25',	'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',		'A,0',
                 'A,0',
                 'FS,B',	'FA,E',
                 'FA,D',	'FA,F',
                 'FA,G',	'FA,C',
                 'FA,T',	'FA,J',
                 'FS,O',	'FS,N',
                 'FA,U',	'FA,K',
                 'FA,P',	'FA,Q',
                 'FA,M',	'FS,C',
                 'FA,V',	'A,0',
                 'A,0',		'A,0',
                 'FS,H',	'FS,E');
    %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,	'invisibility',
		 30,	'lightning bolt',
		 31,	'locate object',
		 32,	'magic missile',
		 33,	'poison',
		 34,	'protection evil',
		 35,	'remove curse',
		 36,	'sanctuary',
		 38,	'sleep',
		 39,	'giant strength',
		 40,	'summon',
		 41,	'ventriloquate',
		 42,	'word of recall',
		 43,	'cure poison',
		 44,	'detect hidden',
		 53,	'shocking grasp',
		 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',
		 234,	'empower',
		 235,	'resurrect',
		 239,	'animate',
		 251,	'restore mana',
		 280,	'conjure',
		 286,	'voodoo',
		 345,	'protection voodoo',
		 401,	'general purpose',
		 402,	'high explosive',
		 410,	'iceshield',
		 411,	'fireshield',
		 412,	'shockshield',
		 500,	'chain lightning',
		 501,	'cure disease',
		 502,	'haste',
		 503,	'plague',
		 504,	'frenzy',
		 505,	'demonfire',
		 506,	'holy word',
		 507,	'cancellation',
		 508,	'mass healing',
		 509,	'calm',
		 510,	'enchant armor',
		 511,	'create rose',
		 512,	'dispel good',
		 513,	'detect good',
		 514,	'protection good',
		 515,	'slow',
		 516,	'heat metal',
		 517,	'recharge',
		 518,	'ray of truth',
		 519,	'portal',
		 520,	'nexus',
		 521,	'farsight',
		 522,	'floating disc',
		 523,	'fireproof',
		 524,	'transport',
		 530,	'quest pill');
}

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