Skip to content
Snippets Groups Projects
Commit 615cc7d6 authored by Matyáš Latner's avatar Matyáš Latner
Browse files

#45 In the Darkness game generating map in cycle

parent b6c66bf5
No related branches found
No related tags found
No related merge requests found
......@@ -29,6 +29,7 @@ import cz.nic.tablexia.game.games.in_the_darkness.map.mapobject.MapObject;
import cz.nic.tablexia.game.games.in_the_darkness.map.mapobject.MapObjectType;
import cz.nic.tablexia.game.games.in_the_darkness.map.tile.Tile;
import cz.nic.tablexia.game.games.in_the_darkness.map.widget.MapWidget;
import cz.nic.tablexia.util.Log;
import cz.nic.tablexia.util.ScaleUtil;
import cz.nic.tablexia.util.ui.TablexiaButton;
......@@ -224,6 +225,7 @@ public class InTheDarknessGame extends AbstractTablexiaGame<List<MapWidget>> imp
finishMapObjectMapObjectType = MapObjectType.STAIRS;
}
boolean floorHasKey = hasKey && ((floorCount - 1) / 2) == i;
Log.info(getClass(), "Preparing map for floor number: " + (i + 1));
MapWidget mapWidget = new MapWidget(getInTheDarknessDifficulty().getMapProviderNewInstance(getRandom()), lastFinishPosition, finishMapObjectMapObjectType, i, floorCount > 1, MAP_START_POSITION_X, MAP_START_POSITION_Y, MAP_X_SIZE, MAP_Y_SIZE, floorHasKey, getText(BOOKMARK_FLOOR_TEXT_KEY));
mapWidgets.add(mapWidget);
......
......@@ -84,7 +84,17 @@ public class MapGenerator implements IMapProvider {
@Override
public TileMap prepareMap(Tile lastFinishTile, int mapXSize, int mapYSize, MapObjectType finishMapObject, boolean hasKey) {
Log.debug(MapGenerator.class, "Start generating with random seed: " + randomAccess);
TileMap tileMap = null;
int tryCounter = 0;
while (tileMap == null) {
Log.info(getClass(), "Generating map try count: " + (++tryCounter));
tileMap = tryToPrepareMap(lastFinishTile, mapXSize, mapYSize, finishMapObject, hasKey);
}
return tileMap;
}
private TileMap tryToPrepareMap(Tile lastFinishTile, int mapXSize, int mapYSize, MapObjectType finishMapObject, boolean hasKey) {
Log.debug(MapGenerator.class, "Start generating map with random seed: " + randomAccess);
TileMap tileMap = new TileMap(mapXSize, mapYSize);
// add start tile
......@@ -102,7 +112,10 @@ public class MapGenerator implements IMapProvider {
}
// connect all tile groups
connectAllGroups(tileMap, Arrays.asList(new TileMapPosition[] {startPosition}));
if (!connectAllGroups(tileMap, Arrays.asList(new TileMapPosition[] {startPosition}))) {
Log.debug(MapGenerator.class, "Cannot generate map!");
return null;
}
// select best tile for safe
Tile finishTile = createFinishTile(tileMap, finishMapObject);
......@@ -157,7 +170,7 @@ public class MapGenerator implements IMapProvider {
*
* @param tileMap tile map with tile groups
*/
private void connectAllGroups(TileMap tileMap, List<TileMapPosition> bannedPositions) {
private boolean connectAllGroups(TileMap tileMap, List<TileMapPosition> bannedPositions) {
List<List<Tile>> tileGroups = getAllTileGroups(tileMap);
while (tileGroups.size() > 1) {
......@@ -174,16 +187,15 @@ public class MapGenerator implements IMapProvider {
}
if (minimalDistance != null) {
try {
Log.debug(MapGenerator.class, "Try to connect tile groups: " + minimalDistance.getTile1() + " ---> " + minimalDistance.getTile2());
generatePathFromPointToPoint(tileMap, minimalDistance.getTile1().getTileMapPosition(), minimalDistance.getTile2().getTileMapPosition(), false, true, bannedPositions);
} catch (Exception e) {
Log.err(MapGenerator.class, "Cannot connect tile groups: " + minimalDistance.getTile1() + " ---> " + minimalDistance.getTile2(), e);
Log.debug(MapGenerator.class, "Try to connect tile groups: " + minimalDistance.getTile1() + " ---> " + minimalDistance.getTile2());
if (!generatePathFromPointToPoint(tileMap, minimalDistance.getTile1().getTileMapPosition(), minimalDistance.getTile2().getTileMapPosition(), false, true, bannedPositions)) {
Log.debug(MapGenerator.class, "Cannot connect tile groups: " + minimalDistance.getTile1() + " ---> " + minimalDistance.getTile2());
return false;
}
}
tileGroups = getAllTileGroups(tileMap);
}
return true;
}
/**
......@@ -311,7 +323,10 @@ public class MapGenerator implements IMapProvider {
* @param useOnlyFreeTiles for <code>true</code> generates path only on free tiles
* @param generateFinalTile for <code>true</code> generates tile on final position
*/
private void generatePathFromPointToPoint(TileMap tileMap, TileMapPosition startPosition, TileMapPosition finishPosition, boolean useOnlyFreeTiles, boolean generateFinalTile, List<TileMapPosition> bannedPositions) {
private boolean generatePathFromPointToPoint(TileMap tileMap, TileMapPosition startPosition, TileMapPosition finishPosition, boolean useOnlyFreeTiles, boolean generateFinalTile, List<TileMapPosition> bannedPositions) {
int generatorMaxCycleCounter = 0;
int generatorMaxCycleCount = InTheDarknessGame.MAP_X_SIZE * InTheDarknessGame.MAP_Y_SIZE;
int lastXPosition = startPosition.getPositionX();
int lastYPosition = startPosition.getPositionY();
......@@ -326,8 +341,9 @@ public class MapGenerator implements IMapProvider {
}
}
if (freeBorders.size() == 0) {
throw new IllegalStateException("Cannot generate path from: " + startPosition + " to: " + finishPosition);
if (freeBorders.size() == 0 || generatorMaxCycleCounter > generatorMaxCycleCount) {
Log.debug(getClass(), "Cannot generate path from: " + startPosition + " to: " + finishPosition);
return false;
}
TileMapPosition borderTilePosition = getClosestTileMapPosition(freeBorders, finishPosition.getPositionX(), finishPosition.getPositionY());
......@@ -342,7 +358,10 @@ public class MapGenerator implements IMapProvider {
if (generateFinalTile) {
tileMap.addTileAtPosition(lastXPosition, lastYPosition, getRandomTileForMapPosition(tileMap, lastXPosition, lastYPosition, null));
}
generatorMaxCycleCounter++;
}
return true;
}
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment