#!/usr/local/bin/perl $infile = $ARGV[0]; $outfile = $ARGV[1]; if (($infile eq "") || ($outfile eq "")) { print "Usage: rom2rot <file in> <file out>\n\n"; exit; } open(INFILE, "$infile") || die("Can't open file $infile\n"); $AREA = 0; $MOBILES = 0; $OBJECTS = 0; $ROOMS = 0; $RESETS = 0; $SHOPS = 0; $SPECIALS = 0; while (<INFILE>) { $_ = &strip($_); if ($_ eq "#AREA") { $AREA = 1; } if ($_ eq "#MOBILES") { $MOBILES = 1; } if ($_ eq "#OBJECTS") { $OBJECTS = 1; } if ($_ eq "#ROOMS") { $ROOMS = 1; } if ($_ eq "#RESETS") { $RESETS = 1; } if ($_ eq "#SHOPS") { $SHOPS = 1; } if ($_ eq "#SPECIALS") { $SPECIALS = 1; } } close INFILE; $COUNT = $AREA+$MOBILES+$OBJECTS+$ROOMS+$RESETS+$SHOPS+$SPECIALS; if ($COUNT != 7) { print "Error: the following sections were not found in this file:\n"; if ($AREA != 1) {print "AREA ";} if ($MOBILES != 1) {print "MOBILES ";} if ($OBJECTS != 1) {print "OBJECTS ";} if ($ROOMS != 1) {print "ROOMS ";} if ($RESETS != 1) {print "RESETS ";} if ($SHOPS != 1) {print "SHOPS ";} if ($SPECIALS != 1) {print "SPECIALS";} print "\n"; exit; } open(INFILE, "$infile"); $filetype = (<INFILE>); $filetype = &strip($filetype); if ($filetype ne "#AREA") { print "This is not an area file.\n"; exit; } $filename = (<INFILE>); $filename = &strip($filename); if ($filename =~ /\~/) { chop $filename; } $areaname = (<INFILE>); $areaname = &strip($areaname); if ($areaname =~ /\~/) { chop $areaname; } $arealist = (<INFILE>); $arealist = &strip($arealist); if ($arealist =~ /\~/) { chop $arealist; } $vnums = (<INFILE>); $vnums = &strip($vnums); ($vmin,$vmax)=split(' ', $vnums); $vmin = int($vmin); $vmax = int($vmax); close INFILE; print "Loading Mobiles.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#MOBILES") { $a = 1; } } $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\#/) { $a = 1; ($jnk,$vnum)=split(/\#/, $tmp); $vnum = int($vnum); } } if ($vnum != 0) { $b = 0; while ($b == 0) { $name = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $name .= "$tmp\n"; } $Mobile{$vnum,"name"} = &strip($name); $short = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $short .= "$tmp\n"; } $Mobile{$vnum,"short"} = &strip($short); $long = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $long .= "$tmp\n"; } $Mobile{$vnum,"long"} = &strip($long); $look = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $look .= "$tmp\n"; } $Mobile{$vnum,"look"} = &strip($look); $race = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $race .= "$tmp\n"; } $Mobile{$vnum,"race"} = &strip($race); $tmp = (<INFILE>); $tmp = &strip($tmp); ($act,$aff,$align,$group) = split(' ', $tmp); $shd = ""; $newaff = ""; undef @Aff; $a = 0; @Aff = split('', $aff); foreach $tmp (@Aff) { if ( ($tmp eq "B") || ($tmp eq "H") || ($tmp eq "N") || ($tmp eq "O") ) { $shd .= $tmp; } else { $newaff .= $tmp; } } if ($shd eq "") { $shd = "0"; } if ($newaff eq "") { $newaff = "0"; } $Mobile{$vnum,"act"} = &strip($act); $Mobile{$vnum,"aff"} = &strip($newaff); $Mobile{$vnum,"shd"} = &strip($shd); $Mobile{$vnum,"align"} = int(&strip($align)); $Mobile{$vnum,"group"} = int(&strip($group)); $tmp = (<INFILE>); $tmp = &strip($tmp); ($level,$bonus,$hit,$mana,$damage,$noun) = split(' ', $tmp, 6); $Mobile{$vnum,"level"} = int(&strip($level)); $Mobile{$vnum,"bonus"} = int(&strip($bonus)); $Mobile{$vnum,"hit"} = &strip($hit); $Mobile{$vnum,"mana"} = &strip($mana); $Mobile{$vnum,"damage"} = &strip($damage); $Mobile{$vnum,"noun"} = &strip($noun); $tmp = (<INFILE>); $tmp = &strip($tmp); ($ac1,$ac2,$ac3,$ac4) = split(' ', $tmp); $Mobile{$vnum,"ac1"} = int(&strip($ac1)); $Mobile{$vnum,"ac2"} = int(&strip($ac2)); $Mobile{$vnum,"ac3"} = int(&strip($ac3)); $Mobile{$vnum,"ac4"} = int(&strip($ac4)); $tmp = (<INFILE>); $tmp = &strip($tmp); ($off,$imm,$res,$vul) = split(' ', $tmp); $Mobile{$vnum,"off"} = &strip($off); $Mobile{$vnum,"imm"} = &strip($imm); $Mobile{$vnum,"res"} = &strip($res); $Mobile{$vnum,"vul"} = &strip($vul); $tmp = (<INFILE>); $tmp = &strip($tmp); ($pos1,$pos2,$sex,$val) = split(' ', $tmp); $Mobile{$vnum,"pos1"} = &strip($pos1); $Mobile{$vnum,"pos2"} = &strip($pos2); $Mobile{$vnum,"sex"} = &strip($sex); $Mobile{$vnum,"val"} = int(&strip($val)); $tmp = (<INFILE>); $tmp = &strip($tmp); ($form,$part,$size,$mat) = split(' ', $tmp, 4); $Mobile{$vnum,"form"} = &strip($form); $Mobile{$vnum,"part"} = &strip($part); $Mobile{$vnum,"size"} = &strip($size); $Mobile{$vnum,"mat"} = &strip($mat); $a = 0; $c = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\#/) { $Mobile{$vnum,"count"} = $c; $a = 1; ($jnk,$vnum)=split(/\#/, $tmp); $vnum = int($vnum); if ($vnum == 0) { $b = 1; } } else { $remove = ""; $type = ""; $flags = ""; ($remove,$type,$flags) = split(' ', $tmp); if ($remove eq "F") { if ($type eq "") { $tmp = (<INFILE>); $tmp = &strip($tmp); ($type,$flags)=split(' ', $tmp); } if ($type eq "aff") { $shd = ""; $newaff = ""; undef @Aff; @Aff = split('', $flags); foreach $tmp (@Aff) { if ( ($tmp eq "B") || ($tmp eq "H") || ($tmp eq "N") || ($tmp eq "O") ) { $shd .= $tmp; } else { $newaff .= $tmp; } } if ($newaff ne "") { $Mobile{$vnum,"flag",$c} = "F aff $newaff"; $c++; } if ($shd ne "") { $Mobile{$vnum,"flag",$c} = "F shd $shd"; $c++; } } else { $Mobile{$vnum,"flag",$c} = "F $type $flags"; $c++; } } } } } } close INFILE; print "Loading Objects.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#OBJECTS") { $a = 1; } } $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\#/) { $a = 1; ($jnk,$vnum)=split(/\#/, $tmp); $vnum = int($vnum); } } if ($vnum != 0) { $b = 0; while ($b == 0) { $name = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $name .= "$tmp\n"; } $Object{$vnum,"name"} = &strip($name); $short = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $short .= "$tmp\n"; } $Object{$vnum,"short"} = &strip($short); $long = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $long .= "$tmp\n"; } $Object{$vnum,"long"} = &strip($long); $material = ""; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $a = 1; } $material .= "$tmp\n"; } $Object{$vnum,"material"} = &strip($material); $tmp = (<INFILE>); $tmp = &strip($tmp); ($type,$extras,$wear) = split(' ', $tmp); $Object{$vnum,"type"} = &strip($type); $Object{$vnum,"extras"} = &strip($extras); $Object{$vnum,"wear"} = &strip($wear); $tmp = (<INFILE>); $tmp = &strip($tmp); undef @Vs; $prev = 0; @Values = split(' ', $tmp); foreach $tmp (@Values) { if ($prev == 0) { push(@Vs, $tmp); @Cuts = split('', $tmp); if (($Cuts[0] eq "\'") && ($Cuts[$#Cuts] ne "\'")) { $prev = 1; } } else { $Vs[$#Vs] .= " $tmp"; @Cuts = split('', $tmp); if ($Cuts[$#Cuts] eq "\'") { $prev = 0; } } } $Object{$vnum,"v0"} = &strip($Vs[0]); $Object{$vnum,"v1"} = &strip($Vs[1]); $Object{$vnum,"v2"} = &strip($Vs[2]); $Object{$vnum,"v3"} = &strip($Vs[3]); $Object{$vnum,"v4"} = &strip($Vs[4]); $tmp = (<INFILE>); $tmp = &strip($tmp); ($level,$weight,$cost,$cond) = split(' ', $tmp); $Object{$vnum,"level"} = int(&strip($level)); $Object{$vnum,"weight"} = int(&strip($weight)); $Object{$vnum,"cost"} = int(&strip($cost)); $Object{$vnum,"cond"} = &strip($cond); $a = 0; $c = 0; $d = 0; $e = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\#/) { $Object{$vnum,"flagcount"} = $c; $Object{$vnum,"applcount"} = $d; $Object{$vnum,"extrcount"} = $e; $a = 1; ($jnk,$vnum)=split(/\#/, $tmp); $vnum = int($vnum); if ($vnum == 0) { $b = 1; } } else { $a1 = ""; $a2 = ""; $a3 = ""; $a4 = ""; $a5 = ""; ($a1,$a2,$a3,$a4,$a5) = split(' ', $tmp); if ($a1 eq "F") { if ($a2 eq "") { $tmp = (<INFILE>); $tmp = &strip($tmp); ($a2,$a3,$a4,$a5)=split(' ', $tmp); } if ($a2 eq "A") { $shd = ""; $newaff = ""; undef @Aff; @Aff = split('', $a5); foreach $tmp (@Aff) { if ( ($tmp eq "B") || ($tmp eq "H") || ($tmp eq "N") || ($tmp eq "O") ) { $shd .= $tmp; } else { $newaff .= $tmp; } } if ($newaff ne "") { $Object{$vnum,"flag",$c} = "F A $a3 $a4 $newaff"; $c++; } if ($shd ne "") { if ($newaff ne "") { $Object{$vnum,"flag",$c} = "F S 0 0 $shd"; $c++; } else { $Object{$vnum,"flag",$c} = "F S $a3 $a4 $shd"; $c++; } } } else { $Object{$vnum,"flag",$c} = "F $a2 $a3 $a4 $a5"; $c++; } } elsif ($a1 eq "A") { if ($a2 eq "") { $tmp = (<INFILE>); $tmp = &strip($tmp); ($a2,$a3)=split(' ', $tmp); } $Object{$vnum,"apply",$d} = "A $a2 $a3"; $d++; } elsif ($a1 eq "E") { $short = ""; $n = 0; while ($n == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $n = 1; } $short .= "$tmp\n"; } $Object{$vnum,"extraname",$e} = &strip($short); $long = ""; $n = 0; while ($n == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\~/) { chop $tmp; $n = 1; } $long .= "$tmp\n"; } $Object{$vnum,"extradesc",$e} = &strip($long); $e++; } } } } } close INFILE; print "Loading Rooms.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#ROOMS") { $a = 1; } } undef @Allrooms; $b = 0; while ($b == 0) { $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp =~ /\#/) { $a = 1; ($jnk,$vnum)=split(/\#/, $tmp); $vnum = int($vnum); } else { push(@Allrooms, $tmp); } } if ($vnum != 0) { $tmp = "#$vnum"; push(@Allrooms, $tmp); } else { $b = 1; } } close INFILE; print "Loading Resets.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#RESETS") { $a = 1; } } undef @Allresets; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "S") { $a = 1; } else { push(@Allresets, $tmp); } } close INFILE; print "Loading Shops.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#SHOPS") { $a = 1; } } undef @Allshops; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "0") { $a = 1; } else { push(@Allshops, $tmp); } } close INFILE; print "Loading Specials.\n"; open(INFILE, "$infile"); $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "#SPECIALS") { $a = 1; } } undef @Allspecials; $a = 0; while ($a == 0) { $tmp = (<INFILE>); $tmp = &strip($tmp); if ($tmp eq "S") { $a = 1; } else { push(@Allspecials, $tmp); } } close INFILE; open(OUTFILE, ">$outfile") || die("Can't open file $outfile\n"); print OUTFILE "#AREA\n"; print OUTFILE "ROT v1.3 format~\n"; print OUTFILE $filename, "~\n"; print OUTFILE $areaname, "~\n"; print OUTFILE $arealist, "~\n"; print OUTFILE $vnums, "\n\n"; print "Saving Mobiles.\n"; print OUTFILE "#MOBILES\n"; for ($vnum = $vmin; $vnum <= $vmax; $vnum++) { if (defined($Mobile{$vnum,"name"})) { print OUTFILE "#${vnum}\n"; print OUTFILE $Mobile{$vnum,"name"}, "~\n"; print OUTFILE $Mobile{$vnum,"short"}, "~\n"; print OUTFILE $Mobile{$vnum,"long"}, "\n~\n"; print OUTFILE $Mobile{$vnum,"look"}, "\n~\n"; print OUTFILE $Mobile{$vnum,"race"}, "~\n"; print OUTFILE $Mobile{$vnum,"act"}, " "; print OUTFILE $Mobile{$vnum,"aff"}, " "; print OUTFILE $Mobile{$vnum,"shd"}, " "; print OUTFILE $Mobile{$vnum,"align"}, " "; print OUTFILE $Mobile{$vnum,"group"}, "\n"; print OUTFILE $Mobile{$vnum,"level"}, " "; print OUTFILE $Mobile{$vnum,"bonus"}, " "; print OUTFILE $Mobile{$vnum,"hit"}, " "; print OUTFILE $Mobile{$vnum,"mana"}, " "; print OUTFILE $Mobile{$vnum,"damage"}, " "; print OUTFILE $Mobile{$vnum,"noun"}, "\n"; print OUTFILE $Mobile{$vnum,"ac1"}, " "; print OUTFILE $Mobile{$vnum,"ac2"}, " "; print OUTFILE $Mobile{$vnum,"ac3"}, " "; print OUTFILE $Mobile{$vnum,"ac4"}, "\n"; print OUTFILE $Mobile{$vnum,"off"}, " "; print OUTFILE $Mobile{$vnum,"imm"}, " "; print OUTFILE $Mobile{$vnum,"res"}, " "; print OUTFILE $Mobile{$vnum,"vul"}, "\n"; print OUTFILE $Mobile{$vnum,"pos1"}, " "; print OUTFILE $Mobile{$vnum,"pos2"}, " "; print OUTFILE $Mobile{$vnum,"sex"}, " "; print OUTFILE $Mobile{$vnum,"val"}, "\n"; print OUTFILE $Mobile{$vnum,"form"}, " "; print OUTFILE $Mobile{$vnum,"part"}, " "; print OUTFILE $Mobile{$vnum,"size"}, " "; print OUTFILE $Mobile{$vnum,"mat"}, "\n"; for ($i = 0; $i < $Mobile{$vnum,"count"}; $i++) { print OUTFILE $Mobile{$vnum,"flag",$i}, "\n"; } } } print OUTFILE "#0\n\n"; print "Saving Objects.\n"; print OUTFILE "#OBJECTS\n"; for ($vnum = $vmin; $vnum <= $vmax; $vnum++) { if (defined($Object{$vnum,"name"})) { print OUTFILE "#${vnum}\n"; print OUTFILE $Object{$vnum,"name"}, "~\n"; print OUTFILE $Object{$vnum,"short"}, "~\n"; print OUTFILE $Object{$vnum,"long"}, "~\n"; print OUTFILE $Object{$vnum,"material"}, "~\n"; print OUTFILE $Object{$vnum,"type"}, " "; print OUTFILE $Object{$vnum,"extras"}, " "; print OUTFILE $Object{$vnum,"wear"}, "\n"; print OUTFILE $Object{$vnum,"v0"}, " "; print OUTFILE $Object{$vnum,"v1"}, " "; print OUTFILE $Object{$vnum,"v2"}, " "; print OUTFILE $Object{$vnum,"v3"}, " "; print OUTFILE $Object{$vnum,"v4"}, "\n"; print OUTFILE $Object{$vnum,"level"}, " "; print OUTFILE $Object{$vnum,"weight"}, " "; print OUTFILE $Object{$vnum,"cost"}, " "; print OUTFILE $Object{$vnum,"cond"}, "\n"; for ($i = 0; $i < $Object{$vnum,"extrcount"}; $i++) { print OUTFILE "E\n"; print OUTFILE $Object{$vnum,"extraname",$i}, "~\n"; print OUTFILE $Object{$vnum,"extradesc",$i}, "\n~\n"; } for ($i = 0; $i < $Object{$vnum,"applcount"}; $i++) { print OUTFILE $Object{$vnum,"apply",$i}, "\n"; } for ($i = 0; $i < $Object{$vnum,"flagcount"}; $i++) { print OUTFILE $Object{$vnum,"flag",$i}, "\n"; } } } print OUTFILE "#0\n\n"; print "Saving Rooms.\n"; print OUTFILE "#ROOMS\n"; foreach $line (@Allrooms) { print OUTFILE $line, "\n"; } print OUTFILE "#0\n\n"; print "Saving Resets.\n"; print OUTFILE "#RESETS\n"; foreach $line (@Allresets) { print OUTFILE $line, "\n"; } print OUTFILE "S\n\n"; print "Saving Shops.\n"; print OUTFILE "#SHOPS\n"; foreach $line (@Allshops) { print OUTFILE $line, "\n"; } print OUTFILE "0\n\n"; print "Saving Specials.\n"; print OUTFILE "#SPECIALS\n"; foreach $line (@Allspecials) { print OUTFILE $line, "\n"; } print OUTFILE "S\n\n"; print OUTFILE "#\$\n\n"; close OUTFILE; exit; sub strip { local($string)=@_; local($outstring,@String); chomp $string; $outstring = $string; @String = split('', $string); if ($String[$#String] eq " ") { chop $string; $outstring = &strip($string); } if ($String[$#String] eq "\n") { chomp $string; $outstring = &strip($string); } return $outstring; }