MoparClassic/GameServer/src/org/moparscape/msc/gs/util/MapGenerator.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;
}
}
}