diff --git a/editor/scripts/WorldMaker b/editor/scripts/WorldMaker index fa692cf14..581bbecd0 100644 --- a/editor/scripts/WorldMaker +++ b/editor/scripts/WorldMaker @@ -10,7 +10,6 @@ import java.io.File; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; - File getSimpleFilename(File mapFile) { String mapFilename = mapFile.getPath(); int i = mapFilename.lastIndexOf(File.separator); @@ -21,7 +20,7 @@ File getSimpleFilename(File mapFile) { } File getPngImageFilename(File mapFile) { - return new File(Location + PictureDirectory + getSimpleFilename(mapFile) + ".png"); + return new File(locationDir, PictureDirectory + getSimpleFilename(mapFile) + ".png"); } boolean updateMap(File mapFile, File pictureFile) { @@ -66,77 +65,77 @@ void checkDaList() { DestWidth = TileWidth.intValue() * NumX.intValue(); DestHeight = TileHeight.intValue() * NumY.intValue(); - if (Location == null || Location.length() < 1) { - Location = globalSettings.getMapsDirectory().getPath(); - print("autodetected location " + Location); + if (Location == null || Location.length() == 0) { + locationDir = globalSettings.getMapsDirectory(); + } else { + locationDir = new File(Location); } print("World map will be " + DestWidth + "x" + DestHeight + " in size"); - if (!Location.endsWith(File.separator)) { - Location = Location + File.separator; - } if (!PictureDirectory.endsWith(File.separator)) { PictureDirectory = PictureDirectory + File.separator; } - new File(Location + PictureDirectory).mkdirs(); + new File(locationDir, PictureDirectory).mkdirs(); + + final long bytesPerPixel = 3L; HashSet mapList = new HashSet(); boolean firstRun = false; - long headerSize = ("P6\n" + DestWidth + " "+DestHeight + "\n255\n").getBytes().length; - if (new File(Location + PictureDirectory + WorldPicture + ".ppm").exists()) { - runCommand("cp " + Location + PictureDirectory + WorldPicture + ".ppm /tmp/tmp.ppm"); + byte[] header = ("P6\n" + DestWidth + " " + DestHeight + "\n255\n").getBytes("ISO-8859-1"); + long headerSize = header.length; + File destinationFilePpm = new File(locationDir, PictureDirectory + WorldPicture + ".ppm"); + File destinationFilePng = new File(locationDir, PictureDirectory + WorldPicture + ".png"); + File tempFile = new File("/tmp/tmp.ppm"); + if (destinationFilePpm.exists()) { + runCommand("cp '" + destinationFilePpm + "' '" + tempFile + "'"); } else { - File f = new File("/tmp/tmp.ppm"); - String header = "P6\n" + DestWidth + " " + DestHeight + "\n255\n"; print("generating empty picture"); - FileOutputStream fos = new FileOutputStream(f, false); - fos.write(header.getBytes()); - byte[] buf = new byte[(int) DestWidth.intValue() * 3]; + FileOutputStream fos = new FileOutputStream(tempFile, false); + fos.write(header); + byte[] buf = new byte[(int) DestWidth.intValue() * bytesPerPixel]; for (int i = 0; i < DestHeight.intValue(); i++) { fos.write(buf); } fos.close(); firstRun = true; } - long toSkip = ("P6\n" + TileWidth + " " + TileHeight+"\n255\n").getBytes().length; - RandomAccessFile raf = new RandomAccessFile(new File("/tmp/tmp.ppm"), "rw"); + long toSkip = ("P6\n" + TileWidth + " " + TileHeight+"\n255\n").getBytes("ISO-8859-1").length; + RandomAccessFile raf = new RandomAccessFile(tempFile, "rw"); FileChannel fc = raf.getChannel(); - byte[] buf = new byte[3 * TileWidth.intValue() * TileHeight.intValue()]; + byte[] buf = new byte[bytesPerPixel * TileWidth.intValue() * TileHeight.intValue()]; + File tempImageFile = new File("/tmp/ppm.tmp"); for (int x = 0; x < NumX.intValue(); x++) { for (int y = 0; y < NumY.intValue(); y++) { currentX = StartX.intValue() + x; currentY = StartY.intValue() + y; - currentMap = new File(Location + MapFilename + "_" + currentX + "_" + currentY); + currentMap = new File(locationDir, MapFilename + "_" + currentX + "_" + currentY); currentPicture = getPngImageFilename(currentMap); didUpdate = updateMap(currentMap, currentPicture); if ((didUpdate || firstRun) && currentPicture.exists()) { - runCommand("pngtopnm " + currentPicture + " | pnmscale -xysize " + TileWidth + " " + TileHeight + " > /tmp/ppm.tmp"); - FileInputStream fis = new FileInputStream("/tmp/ppm.tmp"); + runCommand("pngtopnm '" + currentPicture + "' | pnmscale -xysize " + TileWidth + " " + TileHeight + " > '" + tempImageFile + "'"); + FileInputStream fis = new FileInputStream(tempImageFile); fis.skip(toSkip); fis.read(buf); sx = x * TileWidth.intValue(); sy = y * TileHeight.intValue(); - long index=((long) sy * (long) DestWidth.intValue() + (long) sx) * (long) 3 + headerSize; - for (long row = 0; row < TileHeight.intValue(); row++){ - MappedByteBuffer mbb = fc.map( - java.nio.channels.FileChannel.MapMode.READ_WRITE, - index + row * DestWidth.intValue() * (long) 3, - TileWidth.intValue() * (long) 3 - ); - mbb.put(buf, (int) (row * TileWidth.intValue() * 3), (int) (TileWidth.intValue() * 3)); + long index = ((long) sy * (long) DestWidth.intValue() + (long) sx) * bytesPerPixel + headerSize; + for (long row = 0; row < TileHeight.intValue(); row++) { + MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, index + row * DestWidth.intValue() * bytesPerPixel, TileWidth.intValue() * bytesPerPixel); + mbb.put(buf, (int) (row * TileWidth.intValue() * bytesPerPixel), (int) (TileWidth.intValue() * bytesPerPixel)); } } } } raf.close(); - runCommand("mv /tmp/tmp.ppm " + Location + PictureDirectory + WorldPicture + ".ppm"); + runCommand("mv " + tempFile + " '" + destinationFilePpm + "'"); print("converting to png if possible.\n"); - runCommand("pnmtopng " + Location + PictureDirectory + WorldPicture + ".ppm > /tmp/tmp.png"); - runCommand("mv /tmp/tmp.png " + Location + PictureDirectory + WorldPicture + ".png"); + runCommand("pnmtopng '" + destinationFilePpm + "' > /tmp/tmp.png"); + runCommand("mv /tmp/tmp.png '" + destinationFilePng + "'"); } +File locationDir; checkDaList(); print("Done!");]]> @@ -146,7 +145,7 @@ print("Done!");]]> Location - Specify the map directory to use by this script. Leave empty for auto + Specify the map directory to use by this script. Leave empty for maps directory java.lang.String