/******************************************************************************* * Copyright (c) 2013 Philip Collin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Philip Collin - initial API and implementation ******************************************************************************/ package com.lyeeedar.Roguelike3D.Game.Level; import java.util.HashMap; import com.badlogic.gdx.graphics.Color; import com.lyeeedar.Roguelike3D.Game.Level.AbstractObject.ObjectType; import com.lyeeedar.Roguelike3D.Game.Level.AbstractTile.TileType; import com.lyeeedar.Roguelike3D.Game.Level.XML.BiomeReader; import com.lyeeedar.Utils.Bag; public class MapGenerator { public enum GeneratorType { SERK, STATIC } private Tile[][] levelArray; Bag<Character> solids; Bag<Character> opaques; HashMap<Character, Color> colours; Bag<DungeonRoom> rooms; Bag<AbstractObject> objects; int ceiling; public MapGenerator(int width, int height, Bag<Character> solids, Bag<Character> opaques, HashMap<Character, Color> colours, GeneratorType gtype, BiomeReader biome, int up, int down) { this.ceiling = biome.getRoof(); this.solids = solids; this.opaques = opaques; this.colours = colours; objects = new Bag<AbstractObject>(); AbstractTile[][] tiles = new AbstractTile[width][height]; levelArray = new Tile[width][height]; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { tiles[x][y] = new AbstractTile(x, y, TileType.WALL); levelArray[x][y] = new Tile('#', 0, ceiling, ceiling); } } AbstractGenerator generator = getGenerator(gtype, tiles, biome, up, down); rooms = generator.generate(biome); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (tiles[x][y].tileType == TileType.WALL) { } else if (tiles[x][y].tileType == TileType.DOOR) { levelArray[x][y] = new Tile('.', 0, ceiling, 0); objects.add(new AbstractObject('+', ObjectType.DOOR_UNLOCKED, true, biome.getShortDescription('+'), biome.getLongDescription('+'), (float)x, 0.0f, (float)y)); } else { levelArray[x][y] = new Tile('.', 0, ceiling, 0); } } } clearWalls(); } public Bag<AbstractObject> getObjects() { return objects; } private AbstractGenerator getGenerator(GeneratorType gtype, AbstractTile[][] tiles, BiomeReader biome, int up, int down) { if (gtype == GeneratorType.SERK) { return new SerkGenerator(tiles, biome, up, down); } else if (gtype == GeneratorType.STATIC) { return new StaticGenerator(tiles, biome); } return null; } public Tile[][] getLevel() { return levelArray; } public Bag<DungeonRoom> getRooms() { return rooms; } public void updateTile(Tile t, int height, char c) { t.height = height; t.character = c; } public void clearWalls() { for (int x = 0; x < levelArray.length; x++) { for (int y = 0; y < levelArray[0].length; y++) { if (x == 0 || x == levelArray.length-1 || y == 0 || y == levelArray[0].length-1) { Tile t = levelArray[x][y]; updateTile(levelArray[x][y], ceiling, '#'); } if (chWl(x-1, y) && chWl(x, y-1) && chWl(x-1, y-1) && chWl(x-1, y+1) && chWl(x+1, y-1) && chWl(x+1, y+1) && chWl(x+1, y) && chWl(x, y+1)) { levelArray[x][y].character = ' '; } } } } private boolean chWl(int x, int y) { if (x < 0 || x > levelArray.length-1 || y < 0 || y > levelArray[0].length-1) return true; if (levelArray[x][y].character == '#' || levelArray[x][y].character == ' ') return true; else return false; } }