package greymerk.roguelike.dungeon.towers;
import java.util.Random;
import greymerk.roguelike.theme.ITheme;
import greymerk.roguelike.worldgen.Cardinal;
import greymerk.roguelike.worldgen.Coord;
import greymerk.roguelike.worldgen.IBlockFactory;
import greymerk.roguelike.worldgen.IStair;
import greymerk.roguelike.worldgen.IWorldEditor;
import greymerk.roguelike.worldgen.MetaBlock;
import greymerk.roguelike.worldgen.blocks.BlockType;
import greymerk.roguelike.worldgen.blocks.ColorBlock;
import greymerk.roguelike.worldgen.shapes.RectSolid;
public class EniTower implements ITower {
public EniTower(){}
@Override
public void generate(IWorldEditor editor, Random rand, ITheme theme, Coord dungeon) {
MetaBlock air = BlockType.get(BlockType.AIR);
IBlockFactory blocks = theme.getPrimary().getWall();
IStair stair = theme.getPrimary().getStair();
Coord floor = Tower.getBaseCoord(editor, dungeon);
int x = dungeon.getX();
int z = dungeon.getZ();
RectSolid.fill(editor, rand, new Coord(x - 4, floor.getY(), z - 4), new Coord(x + 4, floor.getY() + 3, z + 4), air);
RectSolid.fill(editor, rand, new Coord(x - 3, floor.getY() + 4, z - 3), new Coord(x + 3, floor.getY() + 12, z + 3), air);
RectSolid.fill(editor, rand, new Coord(x - 2, floor.getY() + 13, z - 2), new Coord(x + 2, floor.getY() + 21, z + 2), air);
RectSolid.fill(editor, rand, new Coord(x - 3, floor.getY() + 22, z - 3), new Coord(x + 3, floor.getY() + 28, z + 3), air);
Coord start;
Coord end;
Coord cursor;
for(Cardinal dir : Cardinal.directions){
for(Cardinal orth : Cardinal.orthogonal(dir)){
start = new Coord(floor);
end = new Coord(start);
end.add(dir, 4);
end.add(orth, 2);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(dir, 5);
end = new Coord(start);
start.add(orth);
end.add(Cardinal.reverse(orth));
end.add(Cardinal.UP, 2);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(dir, 4);
start.add(orth, 2);
end = new Coord(start);
end.add(orth);
end.add(Cardinal.UP, 3);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(dir, 3);
start.add(orth, 3);
end = new Coord(start);
end.add(Cardinal.UP, 3);
RectSolid.fill(editor, rand, start, end, blocks);
cursor = new Coord(floor);
cursor.add(dir, 5);
cursor.add(Cardinal.UP, 3);
blocks.set(editor, rand, cursor);
cursor.add(orth);
stair.setOrientation(orth, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
cursor.add(orth);
stair.setOrientation(dir, false).set(editor, cursor);
cursor.add(orth);
stair.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
cursor.add(Cardinal.reverse(orth));
stair.setOrientation(Cardinal.reverse(orth), true).set(editor, cursor);
cursor.add(dir);
cursor.add(Cardinal.reverse(orth));
stair.setOrientation(Cardinal.reverse(orth), true).set(editor, cursor);
// second section
start = new Coord(floor);
start.add(Cardinal.UP, 4);
start.add(dir, 4);
end = new Coord(start);
start.add(orth);
end.add(Cardinal.reverse(orth));
end.add(Cardinal.UP, 8);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(Cardinal.UP, 4);
start.add(dir, 3);
start.add(orth, 2);
end = new Coord(start);
end.add(orth);
end.add(Cardinal.UP, 8);
RectSolid.fill(editor, rand, start, end, blocks);
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 13);
cursor.add(dir, 4);
stair.setOrientation(dir, false).set(editor, cursor);
cursor.add(orth);
stair.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
cursor.add(orth);
stair.setOrientation(dir, false).set(editor, cursor);
// section 3
start = new Coord(floor);
start.add(Cardinal.UP, 13);
start.add(dir, 3);
end = new Coord(start);
start.add(orth);
end.add(Cardinal.reverse(orth));
end.add(Cardinal.UP, 8);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(Cardinal.UP, 13);
start.add(dir, 2);
start.add(orth, 2);
end = new Coord(start);
end.add(Cardinal.UP, 8);
RectSolid.fill(editor, rand, start, end, blocks);
// section 4
start = new Coord(floor);
start.add(Cardinal.UP, 22);
start.add(dir, 4);
end = new Coord(start);
start.add(orth, 2);
end.add(Cardinal.reverse(orth), 2);
end.add(Cardinal.UP, 6);
RectSolid.fill(editor, rand, start, end, blocks, true, false);
start = new Coord(floor);
start.add(Cardinal.UP, 22);
start.add(dir, 3);
start.add(orth, 2);
end = new Coord(start);
end.add(Cardinal.UP, 6);
RectSolid.fill(editor, rand, start, end, blocks);
start = new Coord(floor);
start.add(Cardinal.UP, 22);
end = new Coord(start);
end.add(dir, 3);
end.add(orth, 2);
RectSolid.fill(editor, rand, start, end, blocks);
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 20);
cursor.add(dir, 3);
cursor.add(orth, 2);
stair.setOrientation(dir, true).set(editor, cursor);
cursor.add(Cardinal.UP);
blocks.set(editor, rand, cursor);
cursor.add(dir);
stair.setOrientation(dir, true).set(editor, cursor);
// section 4 roof
IStair roof = theme.getSecondary().getStair();
start = new Coord(floor);
start.add(Cardinal.UP, 29);
start.add(dir, 3);
end = new Coord(start);
end.add(dir, 2);
RectSolid.fill(editor, rand, start, end, theme.getSecondary().getWall());
start.add(orth);
end.add(orth);
RectSolid.fill(editor, rand, start, end, roof.setOrientation(orth, false));
start.add(orth);
end.add(orth);
start.add(Cardinal.DOWN);
end.add(Cardinal.DOWN);
RectSolid.fill(editor, rand, start, end, roof.setOrientation(orth, false));
start.add(orth);
end.add(orth);
start.add(Cardinal.DOWN);
end.add(Cardinal.DOWN);
RectSolid.fill(editor, rand, start, end, roof.setOrientation(orth, false));
cursor = new Coord(end);
cursor.add(Cardinal.reverse(orth));
roof.setOrientation(Cardinal.reverse(orth), true).set(editor, cursor);
cursor.add(Cardinal.reverse(orth));
cursor.add(Cardinal.UP);
roof.setOrientation(Cardinal.reverse(orth), true).set(editor, cursor);
cursor.add(Cardinal.reverse(dir), 3);
cursor.add(orth);
theme.getSecondary().getWall().set(editor, rand, cursor);
// tower top
start = new Coord(floor);
start.add(Cardinal.UP, 29);
end = new Coord(start);
start.add(dir, 2);
start.add(orth);
end.add(dir, 2);
end.add(Cardinal.reverse(orth));
end.add(Cardinal.UP, 3);
RectSolid.fill(editor, rand, start, end, blocks);
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 33);
cursor.add(dir, 3);
roof.setOrientation(dir, false).set(editor, cursor);
cursor.add(orth);
roof.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
cursor.add(orth);
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.reverse(orth));
cursor.add(Cardinal.UP);
roof.setOrientation(orth, false).set(editor, cursor);
cursor.add(Cardinal.reverse(orth));
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.UP);
roof.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.DOWN);
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(orth);
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.UP);
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.UP);
cursor.add(Cardinal.reverse(orth));
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.UP);
roof.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.reverse(dir));
theme.getSecondary().getWall().set(editor, rand, cursor);
cursor.add(Cardinal.UP);
theme.getSecondary().getWall().set(editor, rand, cursor);
}
}
// mid floors
start = new Coord(floor);
start.add(Cardinal.UP, 4);
end = new Coord(start);
start.add(Cardinal.NORTH, 3);
start.add(Cardinal.EAST, 3);
end.add(Cardinal.SOUTH, 3);
end.add(Cardinal.WEST, 3);
RectSolid.fill(editor, rand, start, end, blocks);
start.add(Cardinal.UP, 3);
end.add(Cardinal.UP, 3);
RectSolid.fill(editor, rand, start, end, blocks);
start.add(Cardinal.UP, 3);
end.add(Cardinal.UP, 3);
RectSolid.fill(editor, rand, start, end, blocks);
for(Cardinal dir : Cardinal.directions){
// lower windows
cursor = new Coord(floor);
cursor.add(dir, 4);
cursor.add(Cardinal.UP, 4);
MetaBlock window = ColorBlock.get(ColorBlock.PANE, rand);
for(int i = 0; i < 3; i++){
stair.setOrientation(dir, false).set(editor, cursor);
cursor.add(Cardinal.UP);
window.set(editor, cursor);
cursor.add(Cardinal.UP);
window.set(editor, cursor);
cursor.add(Cardinal.UP);
}
// floor before slit windows
cursor.add(Cardinal.reverse(dir), 2);
start = new Coord(cursor);
start.add(Cardinal.left(dir));
end = new Coord(cursor);
end.add(Cardinal.right(dir));
RectSolid.fill(editor, rand, start, end, blocks);
// slit windows
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 14);
cursor.add(dir, 3);
cursor.add(Cardinal.left(dir));
stair.setOrientation(Cardinal.right(dir), false).set(editor, cursor);
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.right(dir), true).set(editor, cursor);
cursor.add(Cardinal.UP);
cursor.add(Cardinal.right(dir));
stair.setOrientation(Cardinal.left(dir), false).set(editor, cursor);
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.left(dir), true).set(editor, cursor);
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.right(dir), false).set(editor, cursor);
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.right(dir), true).set(editor, cursor);
cursor.add(Cardinal.right(dir));
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.left(dir), false).set(editor, cursor);
cursor.add(Cardinal.UP);
stair.setOrientation(Cardinal.left(dir), true).set(editor, cursor);
// top windows
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 23);
cursor.add(dir, 4);
window.set(editor, cursor);
cursor.add(Cardinal.UP);
window.set(editor, cursor);
cursor.add(Cardinal.UP);
window.set(editor, cursor);
cursor.add(Cardinal.DOWN);
cursor.add(Cardinal.left(dir));
window.set(editor, cursor);
cursor.add(Cardinal.right(dir), 2);
window.set(editor, cursor);
// top ceiling
cursor = new Coord(floor);
cursor.add(Cardinal.UP, 26);
cursor.add(dir, 3);
start = new Coord(cursor);
start.add(Cardinal.left(dir));
end = new Coord(cursor);
end.add(Cardinal.right(dir));
RectSolid.fill(editor, rand, start, end, blocks);
start.add(Cardinal.reverse(dir));
end.add(Cardinal.reverse(dir));
start.add(Cardinal.UP);
end.add(Cardinal.UP);
RectSolid.fill(editor, rand, start, end, blocks);
start.add(Cardinal.UP);
end.add(Cardinal.UP);
RectSolid.fill(editor, rand, start, end, blocks);
cursor.add(Cardinal.reverse(dir));
cursor.add(Cardinal.left(dir), 2);
blocks.set(editor, rand, cursor);
}
start = new Coord(x - 4, 60, z - 4);
end = new Coord(x + 4, floor.getY(), z + 4);
RectSolid.fill(editor, rand, start, end, blocks);
for(int i = (floor.getY() + 22); i >= 50; --i){
editor.spiralStairStep(rand, new Coord(x, i, z), stair, theme.getPrimary().getPillar());
}
for(Cardinal dir : Cardinal.directions){
cursor = new Coord(floor);
cursor.add(Cardinal.UP);
cursor.add(dir, 6);
if(editor.isAirBlock(cursor)){
cursor = new Coord(floor);
cursor.add(Cardinal.UP);
cursor.add(dir, 5);
theme.getPrimary().getDoor().generate(editor, cursor, dir, false);
cursor.add(dir);
start = new Coord(cursor);
end = new Coord(start);
end.add(Cardinal.UP);
end.add(dir, 3);
RectSolid.fill(editor, rand, start, end, air);
break;
}
}
}
}