package org.mafagafogigante.dungeon.game;
import java.io.Serializable;
import java.util.HashMap;
/**
* The component of WorldGenerator that generates rivers.
*/
final class RiverGenerator implements Serializable {
private static final int MIN_DIST_RIVER = 6;
private static final int MAX_DIST_RIVER = 11;
private static final int START = 10; // Rivers do not appear in x > 10 || x < 10.
private final ExpandableIntegerSet lines;
private final HashMap<Integer, River> rivers;
public RiverGenerator() {
lines = new ExpandableIntegerSet(MIN_DIST_RIVER, MAX_DIST_RIVER);
rivers = new HashMap<>();
}
/**
* Expand the river set to ensure that all points whose x coordinate is in the range {@code [point.x - chunkSide,
* point.x + chunkSide]} will either correspond to a river or to a location that anticipates a river.
*
* @param point the point from which the expansion starts
* @param chunkSide the current chunk side
*/
void expand(Point point, int chunkSide) {
for (int river : lines.expand(point.getX() - chunkSide)) {
if (river <= -START) {
rivers.put(river, new River());
}
}
for (int river : lines.expand(point.getX() + chunkSide)) {
if (river >= START) {
rivers.put(river, new River());
}
}
}
/**
* Returns if in this point there should be a river.
*/
boolean isRiver(Point point) {
River river = rivers.get(point.getX());
return river != null && !river.isBridge(point.getY());
}
/**
* Returns if in this point there should be a bridge.
*/
boolean isBridge(Point point) {
River river = rivers.get(point.getX());
return river != null && river.isBridge(point.getY());
}
}