135 lines
3.8 KiB
Perl
Executable File
135 lines
3.8 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
# This script goes through and updates the exits for maps.
|
|
# First pass, so a lot of the options need to be set in this
|
|
# script. It will search all directories in and below your current
|
|
# working directory, so run from the directory you want to update.
|
|
|
|
# Written by Mark Wedel (mwedel@sonic.net)
|
|
# This borrows some amount of code from the map_info script written
|
|
# by Tero Haatanen <Tero.Haatanen@lut.fi>
|
|
|
|
# Name of the old map that we update exits on
|
|
# Note that this can be a regexp.
|
|
|
|
# OLD_MAP_STARTX/Y and OLD_MAP_ENDX/Y determine the range for the
|
|
# updates. For example, scorn/city was broken up on two of the
|
|
# map tiles, so this gets used to correspond that properly.
|
|
# you can use very large END values just to make sure the entire
|
|
# map is covered
|
|
|
|
# The list of values here are locations to update to and
|
|
# from. I set it up this way with explicity value settings
|
|
# instead of initializing each as an array - I think this format
|
|
# makes it easier to see how everything relates.
|
|
#
|
|
# OLD_MAP_NAME: This is the path it tries to match in the slaying field.
|
|
# It can be a regexp. When updating within a specific directory of
|
|
# a town, including the relative entries is possible.
|
|
# OLD_MAP_STARTX/Y and OLD_MAP_ENDX/Y is the range of spaces
|
|
# that we process. If the location is not in this range, it is unchanged.
|
|
# Note that you can have multiple entries with the same OLD_MAP_NAME
|
|
# value as long as they have different START and END coordinates.
|
|
# NEW_MAP_NAME is the name that will be put into the slaying field.
|
|
# NEW_MAP_OFFX/Y is the modification to the target location in
|
|
# the exit.
|
|
|
|
|
|
&maplist(".");
|
|
|
|
while ($file = shift (@maps)) {
|
|
&updatemap;
|
|
}
|
|
|
|
|
|
exit;
|
|
|
|
# return table containing all objects in the map
|
|
sub updatemap {
|
|
local ($m, $made_change=0);
|
|
$last = "";
|
|
$parent = "";
|
|
|
|
# Note that $/ is the input record separator. By changing
|
|
# this to \nend\n, it means that when we read from the file,
|
|
# we basically read an entire arch at the same time. Note that
|
|
# given this, $ in regexps matches this value below, and not
|
|
# a newline. \n should generally be used instead of $ in
|
|
# regexps if you really want the end of line.
|
|
# Similary, ^ matches start of record, which means the arch line.
|
|
|
|
$/ = "\nend\n";
|
|
if (! open (IN, $file)) {
|
|
print "Can't open map file $file\n";
|
|
return;
|
|
}
|
|
$_ = <IN>;
|
|
if (! /^arch map\n/) {
|
|
print "Error: file $file isn't mapfile.\n";
|
|
return;
|
|
}
|
|
if (! open(OUT, ">$file.new")) {
|
|
print "Can't open output file $file.new\n";
|
|
return;
|
|
}
|
|
print OUT $_;
|
|
if ($VERBOSE) {
|
|
print "Testing $file, ";
|
|
print /^name (.+)$/ ? $1 : "No mapname";
|
|
print ", size [", /^x (\d+)$/ ? $1 : 16;
|
|
print ",", /^y (\d+)/ ? $1 : 16, "]";
|
|
|
|
if (! /^msg$/) {
|
|
print ", No message\n";
|
|
} elsif (/(\w+@\S+)/) {
|
|
print ", $1\n";
|
|
} else {
|
|
print ", Unknown\n";
|
|
}
|
|
$printmap=0;
|
|
}
|
|
else {
|
|
$name= /^name (.+)$/ ? $1 : "No mapname";
|
|
$x= /^x (\d+)$/ ? $1 : 16;
|
|
$y= /^y (\d+)/ ? $1 : 16;
|
|
$mapname="Map $file, $name, size [$x, $y]\n" ;
|
|
$printmap=1;
|
|
}
|
|
|
|
while (<IN>) {
|
|
$made_change=1 if (s/Lake_Country/lake_country/g);
|
|
print OUT $_;
|
|
} # while <IN> LOOP
|
|
close (IN);
|
|
close(OUT);
|
|
if ($made_change) {
|
|
print "$file has changed\n";
|
|
unlink($file);
|
|
rename("$file.new", $file);
|
|
}
|
|
else {
|
|
unlink("$file.new");
|
|
}
|
|
}
|
|
|
|
# @maps contains all filenames
|
|
sub maplist {
|
|
local ($dir, $file, @dirs) = shift;
|
|
|
|
opendir (DIR , $dir) || die "Can't open directory : $dir\n";
|
|
while ($file = readdir (DIR)) {
|
|
next if ($file eq "." || $file eq ".." || $file eq "CVS");
|
|
|
|
$file = "$dir/$file";
|
|
push (@dirs, $file) if (-d $file);
|
|
push (@maps, $file) if (-f $file);
|
|
}
|
|
closedir (DIR);
|
|
|
|
# recursive handle sub-dirs too
|
|
while ($_ = shift @dirs) {
|
|
&maplist ($_);
|
|
}
|
|
}
|
|
|