143 lines
3.9 KiB
Java
143 lines
3.9 KiB
Java
package org.moparscape.msc.gs.util;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Graphics;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
|
|
import javax.imageio.ImageIO;
|
|
|
|
import org.moparscape.msc.config.Config;
|
|
import org.moparscape.msc.gs.Instance;
|
|
import org.moparscape.msc.gs.model.ActiveTile;
|
|
import org.moparscape.msc.gs.model.TileValue;
|
|
import org.moparscape.msc.gs.model.World;
|
|
|
|
|
|
public class MapGenerator {
|
|
private static final int BLACK = new Color(0, 0, 0).getRGB();
|
|
private static final int BLUE = new Color(0, 0, 255).getRGB();
|
|
private static final int HEIGHT = World.MAX_HEIGHT * 2;
|
|
private static final String[] labels = { "Ground", "Level-1", "Level-2", "Underground" };
|
|
|
|
private static final int PURPLE = new Color(150, 0, 255).getRGB();
|
|
private static final int RED = new Color(255, 0, 0).getRGB();
|
|
private static final int WIDTH = World.MAX_WIDTH * 2;
|
|
private static final World world = Instance.getWorld();
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
if (args.length < 1) {
|
|
Logger.println("Invalid args");
|
|
return;
|
|
}
|
|
String configFile = "conf/server/Conf.xml";
|
|
if (args.length > 1) {
|
|
File f = new File(args[1]);
|
|
if (f.exists()) {
|
|
configFile = f.getName();
|
|
}
|
|
}
|
|
Config.initConfig(configFile);
|
|
MapGenerator mapGen = new MapGenerator();
|
|
mapGen.generate();
|
|
mapGen.save(args[0]);
|
|
}
|
|
|
|
private Graphics gfx;
|
|
|
|
private BufferedImage image;
|
|
|
|
public MapGenerator() {
|
|
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
|
|
gfx = image.getGraphics();
|
|
}
|
|
|
|
private void drawDot(int xCoord, int yCoord, int colour) {
|
|
image.setRGB(WIDTH - xCoord - 1, yCoord, colour);
|
|
}
|
|
|
|
private void fillTile(int xCoord, int yCoord, int colour) {
|
|
for (int xOff = 0; xOff < 2; xOff++) {
|
|
for (int yOff = 0; yOff < 2; yOff++) {
|
|
drawDot(xCoord + xOff, yCoord + yOff, colour);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void generate() {
|
|
gfx.fillRect(0, 0, WIDTH, HEIGHT);
|
|
int label = 0;
|
|
for (int x = 0; x < WIDTH; x += 2) {
|
|
for (int y = 0; y < HEIGHT; y += 2) {
|
|
if (y % 1888 == 0) {
|
|
if (x == 0) {
|
|
gfx.setColor(Color.GREEN);
|
|
gfx.drawLine(0, y, WIDTH, y);
|
|
gfx.drawLine(0, y + 1, WIDTH, y + 1);
|
|
gfx.drawString(labels[label++], x + 10, y + 20);
|
|
}
|
|
continue;
|
|
}
|
|
handleTile(x, y, world.getTileValue(x / 2, y / 2));
|
|
ActiveTile t = world.tiles[x / 2][y / 2];
|
|
if (t != null) {
|
|
if (t.hasNpcs()) {
|
|
fillTile(x, y, RED);
|
|
}
|
|
if (t.hasItems()) {
|
|
fillTile(x, y, PURPLE);
|
|
}
|
|
if (t.hasGameObject()) {
|
|
fillTile(x, y, BLACK);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void handleTile(int xImg, int yImg, byte type) {
|
|
if ((type & 1) != 0) { // Top Wall
|
|
drawDot(xImg, yImg, BLACK);
|
|
drawDot(xImg + 1, yImg, BLACK);
|
|
}
|
|
if ((type & 2) != 0) { // Right wall
|
|
drawDot(xImg, yImg, BLACK);
|
|
drawDot(xImg, yImg + 1, BLACK);
|
|
}
|
|
if ((type & 4) != 0) { // Bottom Wall
|
|
drawDot(xImg, yImg + 1, BLACK);
|
|
drawDot(xImg + 1, yImg + 1, BLACK);
|
|
}
|
|
if ((type & 8) != 0) { // Left Wall
|
|
drawDot(xImg + 1, yImg, BLACK);
|
|
drawDot(xImg + 1, yImg + 1, BLACK);
|
|
}
|
|
if ((type & 16) != 0) { // Diagonal Wall \
|
|
drawDot(xImg + 1, yImg, BLACK);
|
|
drawDot(xImg, yImg + 1, BLACK);
|
|
}
|
|
if ((type & 32) != 0) { // Diagonal Wall /
|
|
drawDot(xImg, yImg, BLACK);
|
|
drawDot(xImg + 1, yImg + 1, BLACK);
|
|
}
|
|
if ((type & 64) != 0) { // Unwalkable/Object
|
|
fillTile(xImg, yImg, BLUE);
|
|
}
|
|
}
|
|
|
|
private void handleTile(int xImg, int yImg, TileValue tile) {
|
|
handleTile(xImg, yImg, tile.mapValue);
|
|
handleTile(xImg, yImg, tile.objectValue);
|
|
}
|
|
|
|
public boolean save(String filename) {
|
|
try {
|
|
File file = new File(filename);
|
|
ImageIO.write(image, "png", file);
|
|
return true;
|
|
} catch (Exception e) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|