package org.mafagafogigante.dungeon.map; import org.mafagafogigante.dungeon.game.Game; import org.mafagafogigante.dungeon.game.Point; import org.mafagafogigante.dungeon.game.World; import org.mafagafogigante.dungeon.stats.ExplorationStatistics; import org.jetbrains.annotations.NotNull; /** * WorldMap class that represents an ASCII map from the surroundings of the player. */ public class WorldMap { private final WorldMapSymbol[][] matrix; private final IterationLimits limits; /** * Initializes the WorldMap with a proper IterationLimits object and a matrix of null objects. */ private WorldMap(int rows, int columns) { Point center = Game.getGameState().getHero().getLocation().getPoint(); this.limits = new IterationLimits(center, rows, columns); this.matrix = new WorldMapSymbol[rows][columns]; } /** * Makes a WorldMap of the specified size. If limited, only contains already seen locations. */ @NotNull static WorldMap makeWorldMap(int rows, int columns, boolean limited) { World world = Game.getGameState().getWorld(); Point heroPosition = Game.getGameState().getHero().getLocation().getPoint(); if (limited) { ExplorationStatistics explorationStatistics = Game.getGameState().getStatistics().getExplorationStatistics(); return renderWorldMap(new WorldMapSymbolFactory(world, heroPosition, explorationStatistics), rows, columns); } else { return renderWorldMap(new WorldMapSymbolFactory(world, heroPosition), rows, columns); } } private static WorldMap renderWorldMap(WorldMapSymbolFactory symbolFactory, int rows, int columns) { WorldMap map = new WorldMap(rows, columns); for (int curY = map.limits.minY; curY >= map.limits.maxY; curY--) { for (int curX = map.limits.minX; curX <= map.limits.maxX; curX++) { Point currentPosition = new Point(curX, curY, 0); map.matrix[map.limits.minY - curY][curX - map.limits.minX] = symbolFactory.getSymbol(currentPosition); } } return map; } WorldMapSymbol[][] getSymbolMatrix() { return matrix; } }