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