maps/Info/mapslitter.pl

265 lines
6.4 KiB
Perl

#!/usr/bin/perl
# This script will write (to stdout) all the needed exits to connect maps
# in a tiled fashion. The variables at the start will need to be set
# for things to work.
# Set these as appropriate to the maps it should connect to. If one is left
# blank, then exits for that direction will not be created.
$MAPNAME=$ARGV[0];
$XM=$ARGV[1];
$YM=$ARGV[2];
$WIDTH=$ARGV[3];
$HEIGHT=$ARGV[4];
#$SPLITMAP=$ARGV[5];
if ($MAPNAME eq "") {
die "Usage: connect.pl <basename> <x maps> <y maps> <width> <height>";
}
if ($WIDTH==0) {
$WIDTH=42;
}
if ($HEIGHT==0) {
$HEIGHT=34;
}
# DELTA What the overlap is - it should always be 5 for smooth transitions
$DELTA=5;
$xc=1;
$yc=1;
print STDOUT "Creating connection maps.\n";
while ($xc<=$XM) {
$yc=1;
while ($yc<=$YM) {
$NORTH="";
$NORTHWEST="";
$WEST="";
$SOUTHWEST="";
$SOUTH="";
$SOUTHEAST="";
$EAST="";
$NORTHEAST="";
if ($yc>1){
$NORTH=$MAPNAME."_".$xc."_".($yc-1);
}
if ($yc>1 || $xc>1) {
$NORTHWEST=$MAPNAME."_".($xc-1)."_".($yc-1);
}
if ($xc>1) {
$WEST=$MAPNAME."_".($xc-1)."_".$yc;
}
if ($xc>1 || $yc<$YM) {
$SOUTHWEST=$MAPNAME."_".($xc-1)."_".($yc+1);
}
if ($yc<$YM) {
$SOUTH=$MAPNAME."_".$xc."_".($yc+1);
}
if ($yc<$YM || $xc<$XM) {
$SOUTHEAST=$MAPNAME."_".($xc+1)."_".($yc+1);
}
if ($xc<$XM) {
$EAST=$MAPNAME."_".($xc+1)."_".$yc;
}
if ($xc<$XM || $yc>1) {
$NORTHEAST=$MAPNAME."_".($xc+1)."_".($yc-1);
}
$THISMAP=$MAPNAME."_".$xc."_".$yc;
open (MAP, ">$THISMAP") or die "unable to open mapfile.";
print MAP "arch map\n";
print MAP "name $MAPNAME\n";
print MAP "msg\n";
print MAP "Creator: splitmap.pl\n";
print MAP "Email: azzie\@tellutec.se\n";
print MAP "Date: Wed Oct 27 10:59:23 1993\n";
print MAP "endmsg\n";
print MAP "hp ".($DELTA+1)."\n";
print MAP "sp $DELTA\n";
print MAP "x $WIDTH\n";
print MAP "y $HEIGHT\n";
print MAP "end\n";
print $MAPNAME."_".$xc."_".$yc."\n";
# print "XC=".$xc."\n";
# print "YC=".$yc."\n";
#$NORTHWEST="";
#$WEST="";
#$SOUTHWEST="";
#$SOUTH="world_a3";
#$SOUTHEAST="world_b3";
#$EAST="world_b2";
#$NORTHEAST="world_b1";
# End of configurable options.
# Quick reminder - hp is the destination x, sp is the destination y
# Lets do the corners first
if ($NORTHWEST ne "") {
print MAP "arch exit\n";
print MAP "slaying $NORTHWEST\n";
print MAP "x ".($DELTA-1)."\n";
print MAP "y ".($DELTA-1)."\n";
print MAP "hp ".($WIDTH-$DELTA-1)."\n";
print MAP "sp ".($HEIGHT-$DELTA-1)."\n";
print MAP "end\n";
}
if ($SOUTHWEST ne "") {
print MAP "arch exit\n";
print MAP "slaying $SOUTHWEST\n";
print MAP "x ".($DELTA-1)."\n";
print MAP "y ".($HEIGHT-$DELTA)."\n";
print MAP "hp ".($WIDTH-$DELTA-1)."\n";
print MAP "sp ".($DELTA)."\n";
print MAP "end\n";
}
if ($SOUTHEAST ne "") {
print MAP "arch exit\n";
print MAP "slaying $SOUTHEAST\n";
print MAP "x ".($WIDTH-$DELTA)."\n";
print MAP "y ".($HEIGHT-$DELTA)."\n";
print MAP "hp ".($DELTA)."\n";
print MAP "sp ".($DELTA)."\n";
print MAP "end\n";
}
if ($NORTHEAST ne "") {
print MAP "arch exit\n";
print MAP "slaying $NORTHEAST\n";
print MAP "x ".($WIDTH-$DELTA)."\n";
print MAP "y ".($DELTA-1)."\n";
print MAP "hp ".($DELTA)."\n";
print MAP "sp ".($HEIGHT-$DELTA-1)."\n";
print MAP "end\n";
}
# Now lets do the edges.
if ($NORTH ne "") {
$x=$DELTA;
while ($x < ($WIDTH-$DELTA)) {
print MAP "arch exit\n";
print MAP "slaying $NORTH\n";
print MAP "x ".$x."\n";
print MAP "y ".($DELTA-1)."\n";
print MAP "hp ".$x."\n";
print MAP "sp ".($HEIGHT-$DELTA-1)."\n";
print MAP "end\n";
$x=$x+1;
}
}
if ($SOUTH ne "") {
$x=$DELTA;
while ($x < ($WIDTH-$DELTA)) {
print MAP "arch exit\n";
print MAP "slaying $SOUTH\n";
print MAP "x ".$x."\n";
print MAP "y ".($HEIGHT-$DELTA)."\n";
print MAP "hp ".$x."\n";
print MAP "sp ".($DELTA)."\n";
print MAP "end\n";
$x=$x+1;
}
}
if ($WEST ne "") {
$y=$DELTA;
while ($y < ($HEIGHT-$DELTA)) {
print MAP "arch exit\n";
print MAP "slaying $WEST\n";
print MAP "x ".($DELTA-1)."\n";
print MAP "y ".$y."\n";
print MAP "hp ".($WIDTH-$DELTA-1)."\n";
print MAP "sp ".$y."\n";
print MAP "end\n";
$y=$y+1;
}
}
if ($EAST ne "") {
$y=$DELTA;
while ($y < ($HEIGHT-$DELTA)) {
print MAP "arch exit\n";
print MAP "slaying $EAST\n";
print MAP "x ".($WIDTH-$DELTA)."\n";
print MAP "y ".$y."\n";
print MAP "hp ".($DELTA)."\n";
print MAP "sp ".$y."\n";
print MAP "end\n";
$y=$y+1;
}
}
close MAP;
$yc=$yc+1;
}
$xc=$xc+1;
}
# Second pass. Connected maps opened and primary map superimposed.
print STDOUT "Done with connecting, now superimposing split map.\n";
$xc=1;
$yc=1;
while ($xc<=$XM) {
$yc=1;
while ($yc<=$YM) {
$NEWMAP=$MAPNAME."_".$xc."_".$yc.".new";
$THISMAP=$MAPNAME."_".$xc."_".$yc;
open (MAP, ">>$THISMAP") or die "unable to open new mapfile.";
# open (CONMAP, "$THISMAP") or die "unable to open connected mapfile.";
open (IMPMAP, "$MAPNAME") or die "unable to open superimposed mapfile.";
$currentline=<IMPMAP>;
print STDOUT "Now superimposing on map ".$THISMAP."\n";
# Discard header
$headscan=1;
while ($headscan) {
if ($currentline=~/end\n/) {
$headscan=0;
}
$currentline=<IMPMAP>;
}
# Read rest of file
while ($currentline) {
# print STDOUT $currentline;
# Scan for and buffer archs within bounds.
while ($currentline ne "end\n" && $currentline) {
if ($currentline=~/x /) {
($florp, $px) = split //,$currentline,2;
$currentline="x ".($px-(($xc-1)*$WIDTH)+(($xc-1)*$DELTA*2))."\n";
}
if ($currentline=~/y /) {
($florp, $py)=split //,$currentline,2;
$currentline="y ".($py-(($yc-1)*$HEIGHT)+(($yc-1)*$DELTA*2))."\n";
}
if ($currentline ne "x 0\n" && $currentline ne "y 0\n"){
$buf=$buf.$currentline;
}
$currentline=<IMPMAP>;
}
$buf=$buf.$currentline;
# print STDOUT $px.$py;
if ($px >= (($xc-1)*$WIDTH)-(($xc-1)*$DELTA*2) && $px < ($xc*$WIDTH)-(($xc-1)*$DELTA*2) && $py >= (($yc-1)*$HEIGHT)-(($yc-1)*$DELTA*2) && $py < ($yc*$HEIGHT)-(($yc-1)*$DELTA*2)) {
# print STDOUT "In map: ".$THISMAP."\n";
print MAP $buf;
# print STDOUT ".";
}
# else {
# print STDOUT "-";
# }
$px=0;
$py=0;
$buf="";
$currentline=<IMPMAP>;
}
close MAP;
close CONMAP;
close IMPMAP;
$yc=$yc+1;
# print STDOUT "\n";
}
$xc=$xc+1;
}