private int distanceBetweenPoints(Point a, Point b){ //on the same side if (a.y == b.y || a.x == b.x){ return Math.max(spaceBetween(a.x, b.x), spaceBetween(a.y, b.y)); } //otherwise... //subtract 1 at the end to account for overlap return Math.min(spaceBetween(left, a.x) + spaceBetween(left, b.x), spaceBetween(right, a.x) + spaceBetween(right, b.x)) + Math.min(spaceBetween(top, a.y) + spaceBetween(top, b.y), spaceBetween(bottom, a.y) + spaceBetween(bottom, b.y)) - 1; }
Math.min(from.x, to.x), Math.min(from.y, to.y), spaceBetween(from.x, to.x) + 2, spaceBetween(from.y, to.y) + 2, floor); return; if (from.y == top+1 || from.y == bottom-1){ if (spaceBetween(left, from.x) + spaceBetween(left, to.x) <= spaceBetween(right, from.x) + spaceBetween(right, to.x)){ side = new Point(left+1, top + height()/2); } else { side = new Point(right-1, top + height()/2); if (spaceBetween(top, from.y) + spaceBetween(top, to.y) <= spaceBetween(bottom, from.y) + spaceBetween(bottom, to.y)){ side = new Point(left + width()/2, top+1); } else { side = new Point(left + width()/2, bottom-1); fillBetweenPoints(level, from, side, floor); fillBetweenPoints(level, side, to, floor);
for (Point f : pointsFilled){ for (Point t : pointsToFill){ int dist = distanceBetweenPoints(f, t); if (dist < shortestDistance){ from = f; fillBetweenPoints(level, from, to, floor); pointsFilled.add(to); pointsToFill.remove(to);
@Override public void paint(Level level) { if (Math.min(width(), height()) > 3) { Painter.fill(level, this, 1, Terrain.CHASM); } super.paint(level); for (Room r : neigbours){ if (r instanceof BridgeRoom || r instanceof RingBridgeRoom || r instanceof WalkwayRoom){ Rect i = intersect(r); if (i.width() != 0){ i.left++; i.right--; } else { i.top++; i.bottom--; } Painter.fill(level, i.left, i.top, i.width()+1, i.height()+1, Terrain.CHASM); } } } }
Math.min(from.x, to.x), Math.min(from.y, to.y), spaceBetween(from.x, to.x) + 2, spaceBetween(from.y, to.y) + 2, floor); return; if (from.y == top+1 || from.y == bottom-1){ if (spaceBetween(left, from.x) + spaceBetween(left, to.x) <= spaceBetween(right, from.x) + spaceBetween(right, to.x)){ side = new Point(left+1, top + height()/2); } else { side = new Point(right-1, top + height()/2); if (spaceBetween(top, from.y) + spaceBetween(top, to.y) <= spaceBetween(bottom, from.y) + spaceBetween(bottom, to.y)){ side = new Point(left + width()/2, top+1); } else { side = new Point(left + width()/2, bottom-1); fillBetweenPoints(level, from, side, floor); fillBetweenPoints(level, side, to, floor);
for (Point f : pointsFilled){ for (Point t : pointsToFill){ int dist = distanceBetweenPoints(f, t); if (dist < shortestDistance){ from = f; fillBetweenPoints(level, from, to, floor); pointsFilled.add(to); pointsToFill.remove(to);
@Override public void paint(Level level) { if (Math.min(width(), height()) > 3) { Painter.fill(level, this, 1, Terrain.CHASM); } super.paint(level); for (Room r : neigbours){ if (r instanceof BridgeRoom || r instanceof RingBridgeRoom || r instanceof WalkwayRoom){ Rect i = intersect(r); if (i.width() != 0){ i.left++; i.right--; } else { i.top++; i.bottom--; } Painter.fill(level, i.left, i.top, i.width()+1, i.height()+1, Terrain.CHASM); } } } }
private int distanceBetweenPoints(Point a, Point b){ //on the same side if (a.y == b.y || a.x == b.x){ return Math.max(spaceBetween(a.x, b.x), spaceBetween(a.y, b.y)); } //otherwise... //subtract 1 at the end to account for overlap return Math.min(spaceBetween(left, a.x) + spaceBetween(left, b.x), spaceBetween(right, a.x) + spaceBetween(right, b.x)) + Math.min(spaceBetween(top, a.y) + spaceBetween(top, b.y), spaceBetween(bottom, a.y) + spaceBetween(bottom, b.y)) - 1; }