Exemplo n.º 1
0
  private void step(IWorldEditor editor, Random rand, ITheme theme, Cardinal dir, Coord origin) {

    if (editor.getBlock(origin).isOpaqueCube()) return;

    Coord start;
    Coord end;

    IStair stair = theme.getPrimaryStair();
    IBlockFactory blocks = theme.getPrimaryWall();

    Cardinal[] orth = Cardinal.orthogonal(dir);

    start = new Coord(origin);
    end = new Coord(origin);
    start.add(orth[0]);
    end.add(orth[1]);
    end = new Coord(end.getX(), 60, end.getZ());
    RectSolid.fill(editor, rand, start, end, blocks, true, true);

    start = new Coord(origin);
    end = new Coord(origin);
    start.add(orth[0]);
    end.add(orth[1]);
    stair.setOrientation(dir, false);
    RectSolid.fill(editor, rand, start, end, stair, true, true);

    origin.add(Cardinal.DOWN);
    origin.add(dir);
    step(editor, rand, theme, dir, origin);
  }
  @Override
  protected void genWall(
      World world,
      Random rand,
      IDungeonLevel level,
      Cardinal dir,
      ITheme theme,
      int x,
      int y,
      int z) {

    MetaBlock air = new MetaBlock(Blocks.air);
    MetaBlock stair = theme.getSecondaryStair();

    Coord cursor;
    Coord start;
    Coord end;

    Cardinal[] orth = Cardinal.getOrthogonal(dir);

    start = new Coord(x, y, z);
    start.add(dir, 2);
    end = new Coord(start);
    start.add(orth[0], 1);
    end.add(orth[1], 1);
    end.add(Cardinal.UP, 2);
    WorldGenPrimitive.fillRectSolid(world, rand, start, end, air, true, true);
    start.add(dir, 1);
    end.add(dir, 1);
    WorldGenPrimitive.fillRectSolid(world, rand, start, end, theme.getSecondaryWall(), true, true);

    for (Cardinal d : orth) {
      cursor = new Coord(x, y, z);
      cursor.add(Cardinal.UP, 2);
      cursor.add(dir, 2);
      cursor.add(d, 1);
      WorldGenPrimitive.blockOrientation(stair, Cardinal.reverse(dir), true);
      WorldGenPrimitive.setBlock(world, rand, cursor, stair, true, true);

      cursor = new Coord(x, y, z);
      cursor.add(dir, 2);
      cursor.add(d, 1);
      WorldGenPrimitive.blockOrientation(stair, Cardinal.reverse(d), false);
      WorldGenPrimitive.setBlock(world, rand, cursor, stair, true, true);
    }

    cursor = new Coord(x, y, z);
    cursor.add(Cardinal.UP, 1);
    cursor.add(dir, 3);
    WorldGenPrimitive.setBlock(world, rand, cursor, air, true, true);
    cursor.add(Cardinal.UP, 1);
    WorldGenPrimitive.blockOrientation(stair, Cardinal.reverse(dir), true);
    WorldGenPrimitive.setBlock(world, rand, cursor, stair, true, true);

    Coord shelf = new Coord(x, y, z);
    shelf.add(dir, 3);
    Coord below = new Coord(shelf);
    shelf.add(Cardinal.UP, 1);

    if (world.isAirBlock(below.getBlockPos())) return;

    boolean trapped = Dungeon.getLevel(y) == 3 && rand.nextInt(3) == 0;
    TreasureChest.generate(world, rand, level.getSettings(), shelf, Dungeon.getLevel(y), trapped);
    if (trapped) {
      WorldGenPrimitive.setBlock(world, shelf.getX(), shelf.getY() - 2, shelf.getZ(), Blocks.tnt);
      if (rand.nextBoolean())
        WorldGenPrimitive.setBlock(world, shelf.getX(), shelf.getY() - 3, shelf.getZ(), Blocks.tnt);
    }
  }
Exemplo n.º 3
0
  @Override
  public void generate(IWorldEditor editor, Random rand, ITheme theme, Coord dungeon) {

    IBlockFactory primary = theme.getPrimaryWall();
    IBlockFactory pillar = theme.getSecondaryPillar();

    IStair stair = theme.getSecondaryStair();

    Coord floor = Tower.getBaseCoord(editor, dungeon);

    Coord start = new Coord(floor);
    Coord end = new Coord(start);
    Coord cursor;

    int x = dungeon.getX();
    int z = dungeon.getZ();

    start.add(Cardinal.NORTH, 3);
    start.add(Cardinal.WEST, 3);
    end.add(Cardinal.SOUTH, 3);
    end.add(Cardinal.EAST, 3);
    end.add(Cardinal.UP, 4);

    // WorldGenPrimitive.fillRectSolid(rand, start, end, air, true, true);

    start.add(Cardinal.NORTH);
    start.add(Cardinal.WEST);
    start.add(Cardinal.DOWN);
    end.add(Cardinal.SOUTH);
    end.add(Cardinal.EAST);
    end.add(Cardinal.UP);

    RectHollow.fill(editor, rand, start, end, primary, true, true);

    for (Cardinal dir : Cardinal.directions) {

      Cardinal[] orth = Cardinal.orthogonal(dir);
      start = new Coord(floor);
      start.add(dir, 3);
      start.add(orth[0], 3);
      end = new Coord(start);
      end.add(Cardinal.UP, 6);

      RectSolid.fill(editor, rand, start, end, pillar, true, true);

      for (Cardinal o : orth) {
        start = new Coord(floor);
        start.add(dir, 5);
        start.add(o, 4);
        end = new Coord(start);
        end.add(Cardinal.UP, 4);
        start.add(Cardinal.DOWN, 10);
        RectSolid.fill(editor, rand, start, end, pillar, true, true);

        end.add(Cardinal.UP);
        stair.setOrientation(dir, false).set(editor, end);

        end.add(Cardinal.reverse(dir));
        end.add(Cardinal.reverse(o));
        stair.setOrientation(Cardinal.reverse(o), false).set(editor, end);
        end.add(Cardinal.reverse(o));
        start = new Coord(end);
        start.add(Cardinal.reverse(o), 2);
        RectSolid.fill(editor, rand, start, end, stair.setOrientation(dir, false), true, true);

        end.add(Cardinal.reverse(dir));
        end.add(Cardinal.UP);
        start.add(Cardinal.reverse(dir));
        start.add(Cardinal.UP);
        RectSolid.fill(editor, rand, start, end, stair.setOrientation(dir, false), true, true);
        stair.setOrientation(Cardinal.reverse(o), false).set(editor, end);

        start = new Coord(floor);
        start.add(dir, 3);
        start.add(Cardinal.UP, 4);
        end = new Coord(start);
        end.add(o, 2);
        RectSolid.fill(
            editor,
            rand,
            start,
            end,
            stair.setOrientation(Cardinal.reverse(dir), true),
            true,
            true);
        start.add(Cardinal.reverse(dir));
        start.add(Cardinal.UP);
        end = new Coord(start);
        end.add(o, 2);
        RectSolid.fill(
            editor,
            rand,
            start,
            end,
            stair.setOrientation(Cardinal.reverse(dir), true),
            true,
            true);
        start.add(Cardinal.UP);
        end.add(Cardinal.UP);
        RectSolid.fill(editor, rand, start, end, pillar, true, true);
        cursor = new Coord(end);
        start = new Coord(end);
        start.add(Cardinal.UP, 3);
        RectSolid.fill(editor, rand, start, end, pillar, true, true);
        cursor.add(Cardinal.reverse(o));
        cursor.add(Cardinal.UP);
        stair.setOrientation(Cardinal.reverse(o), false).set(editor, cursor);
        cursor.add(Cardinal.UP, 2);
        stair.setOrientation(Cardinal.reverse(o), true).set(editor, cursor);
        start.add(Cardinal.UP);
        end = new Coord(start);
        end.add(Cardinal.reverse(o), 2);
        RectSolid.fill(editor, rand, start, end, stair.setOrientation(dir, false), true, true);
        cursor = new Coord(end);
        cursor.add(Cardinal.reverse(dir));
        stair.setOrientation(Cardinal.reverse(dir), true).set(editor, cursor);
        cursor.add(o);
        stair.setOrientation(Cardinal.reverse(dir), true).set(editor, cursor);
        cursor.add(Cardinal.UP);
        stair.setOrientation(dir, false).set(editor, cursor);
        cursor.add(Cardinal.reverse(o));
        stair.setOrientation(dir, false).set(editor, cursor);
      }
    }

    Cardinal front = Cardinal.NORTH;

    for (Cardinal dir : Cardinal.directions) {
      cursor = new Coord(floor);
      cursor.add(dir, 6);
      if (editor.isAirBlock(cursor)) {
        front = dir;
        break;
      }
    }

    for (Cardinal dir : Cardinal.directions) {

      if (dir == front) {

        for (Cardinal o : Cardinal.orthogonal(dir)) {
          cursor = new Coord(floor);
          cursor.add(dir, 5);
          cursor.add(o, 2);
          primary.set(editor, rand, cursor);
          cursor.add(o);
          stair.setOrientation(o, false).set(editor, cursor);
          cursor.add(dir);
          stair.setOrientation(o, false).set(editor, cursor);
          cursor.add(Cardinal.reverse(o));
          stair.setOrientation(dir, false).set(editor, cursor);
          cursor.add(Cardinal.reverse(dir));
          cursor.add(Cardinal.UP);
          stair.setOrientation(Cardinal.reverse(o), false).set(editor, cursor);
          cursor.add(Cardinal.UP);
          stair.setOrientation(dir, false).set(editor, cursor);
          cursor.add(o);
          stair.setOrientation(o, false).set(editor, cursor);
          cursor.add(Cardinal.reverse(o));
          cursor.add(Cardinal.UP);
          stair.setOrientation(Cardinal.reverse(o), false).set(editor, cursor);
          cursor.add(Cardinal.reverse(o));
          stair.setOrientation(Cardinal.reverse(o), true).set(editor, cursor);
          cursor.add(Cardinal.reverse(o));
          cursor.add(Cardinal.UP);
          stair.setOrientation(dir, false).set(editor, cursor);
          cursor.add(o);
          stair.setOrientation(dir, false).set(editor, cursor);
          cursor.add(o);
          stair.setOrientation(o, false).set(editor, cursor);
        }

        // carve doorway
        Cardinal[] orth = Cardinal.orthogonal(dir);
        cursor = new Coord(floor);
        cursor.add(dir, 4);
        start = new Coord(cursor);
        end = new Coord(start);
        start.add(orth[0]);
        end.add(Cardinal.UP, 2);
        end.add(orth[1]);
        RectSolid.fill(editor, rand, start, end, BlockType.get(BlockType.AIR), true, true);

        cursor = new Coord(floor);
        cursor.add(dir, 6);
        cursor.add(Cardinal.DOWN);
        step(editor, rand, theme, dir, cursor);

        continue;
      }

      for (Cardinal o : Cardinal.orthogonal(dir)) {
        start = new Coord(floor);
        start.add(Cardinal.UP, 4);
        start.add(dir, 5);
        end = new Coord(start);
        start.add(o, 2);
        RectSolid.fill(editor, rand, start, end, stair.setOrientation(dir, false), true, true);
        start.add(o);
        stair.setOrientation(Cardinal.reverse(o), false).set(editor, start);
        start.add(Cardinal.DOWN);
        stair.setOrientation(Cardinal.reverse(o), true).set(editor, start);
      }
    }

    for (int i = floor.getY() - 1; i >= 50; --i) {
      editor.spiralStairStep(rand, new Coord(x, i, z), stair, theme.getPrimaryPillar());
    }
  }
  public boolean generate(
      WorldEditor editor,
      Random inRandom,
      LevelSettings settings,
      Cardinal[] entrances,
      Coord origin) {

    ITheme theme = settings.getTheme();

    this.editor = editor;
    rand = inRandom;
    originX = origin.getX();
    originY = origin.getY();
    originZ = origin.getZ();

    MetaBlock air = new MetaBlock(Blocks.air);
    IBlockFactory wall = theme.getPrimaryWall();
    IBlockFactory deco = theme.getSecondaryWall();
    MetaBlock rug1 = ColorBlock.get(Blocks.carpet, rand);
    MetaBlock rug2 = ColorBlock.get(Blocks.carpet, rand);
    MetaBlock rug3 = ColorBlock.get(Blocks.carpet, rand);

    // fill air
    editor.fillRectSolid(
        inRandom, originX - 5, originY, originZ - 5, originX + 5, originY + 3, originZ + 5, air);

    // shell
    editor.fillRectHollow(
        rand,
        new Coord(originX - 6, originY - 2, originZ - 6),
        new Coord(originX + 6, originY + 5, originZ + 6),
        wall,
        false,
        true);

    // floor
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY - 1,
        originZ - 5,
        originX + 5,
        originY - 1,
        originZ + 5,
        deco,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 3,
        originY,
        originZ - 3,
        originX + 3,
        originY,
        originZ + 3,
        rug1,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 2,
        originY,
        originZ - 2,
        originX + 2,
        originY,
        originZ + 2,
        rug2,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 1,
        originY,
        originZ - 1,
        originX + 1,
        originY,
        originZ + 1,
        rug3,
        true,
        true);

    // WALLS
    MetaBlock log = Log.getLog(Log.OAK);

    // vertical beams
    editor.fillRectSolid(
        inRandom,
        originX - 2,
        originY,
        originZ - 5,
        originX - 2,
        originY + 2,
        originZ - 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        inRandom,
        originX + 2,
        originY,
        originZ - 5,
        originX + 2,
        originY + 2,
        originZ - 5,
        log,
        true,
        true);

    editor.fillRectSolid(
        inRandom,
        originX - 2,
        originY,
        originZ + 5,
        originX - 2,
        originY + 2,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        inRandom,
        originX + 2,
        originY,
        originZ + 5,
        originX + 2,
        originY + 2,
        originZ + 5,
        log,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ - 2,
        originX - 5,
        originY + 2,
        originZ - 2,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ + 2,
        originX - 5,
        originY + 2,
        originZ + 2,
        log,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ - 2,
        originX + 5,
        originY + 2,
        originZ - 2,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ + 2,
        originX + 5,
        originY + 2,
        originZ + 2,
        log,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ - 5,
        originX - 5,
        originY + 2,
        originZ - 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ + 5,
        originX - 5,
        originY + 2,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ - 5,
        originX + 5,
        originY + 2,
        originZ - 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ + 5,
        originX + 5,
        originY + 2,
        originZ + 5,
        log,
        true,
        true);

    // shelves
    editor.fillRectSolid(
        rand,
        originX - 4,
        originY,
        originZ - 5,
        originX - 3,
        originY,
        originZ - 5,
        deco,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 3,
        originY,
        originZ - 5,
        originX + 4,
        originY,
        originZ - 5,
        deco,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX - 4,
        originY,
        originZ + 5,
        originX - 3,
        originY,
        originZ + 5,
        deco,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 3,
        originY,
        originZ + 5,
        originX + 4,
        originY,
        originZ + 5,
        deco,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ - 4,
        originX - 5,
        originY,
        originZ - 3,
        deco,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY,
        originZ + 3,
        originX - 5,
        originY,
        originZ + 4,
        deco,
        true,
        true);

    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ - 4,
        originX + 5,
        originY,
        originZ - 3,
        deco,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 5,
        originY,
        originZ + 3,
        originX + 5,
        originY,
        originZ + 4,
        deco,
        true,
        true);

    HashSet<Coord> chestSpace = new HashSet<Coord>();
    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX - 4, originY + 1, originZ - 5, originX - 3, originY + 1, originZ - 5));
    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX + 3, originY + 1, originZ - 5, originX + 4, originY + 1, originZ - 5));

    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX - 4, originY + 1, originZ + 5, originX - 3, originY + 1, originZ + 5));
    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX + 3, originY + 1, originZ + 5, originX + 4, originY + 1, originZ + 5));

    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX - 5, originY + 1, originZ - 4, originX - 5, originY + 1, originZ - 3));
    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX - 5, originY + 1, originZ + 3, originX - 5, originY + 1, originZ + 4));

    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX + 5, originY + 1, originZ - 4, originX + 5, originY + 1, originZ - 3));
    chestSpace.addAll(
        WorldEditor.getRectSolid(
            originX + 5, originY + 1, originZ + 3, originX + 5, originY + 1, originZ + 4));

    TreasureChest.generate(
        editor, rand, settings, new ArrayList<Coord>(chestSpace), TreasureChest.MUSIC);

    // horizontal beams
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 3,
        originZ - 5,
        originX - 5,
        originY + 3,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 3,
        originZ - 5,
        originX + 5,
        originY + 3,
        originZ - 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 3,
        originZ + 5,
        originX + 5,
        originY + 3,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 5,
        originY + 3,
        originZ - 5,
        originX + 5,
        originY + 3,
        originZ + 5,
        log,
        true,
        true);

    // ceiling cross beams
    editor.fillRectSolid(
        rand,
        originX - 2,
        originY + 4,
        originZ - 5,
        originX - 2,
        originY + 4,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX + 2,
        originY + 4,
        originZ - 5,
        originX + 2,
        originY + 4,
        originZ + 5,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 4,
        originZ - 2,
        originX + 5,
        originY + 4,
        originZ - 2,
        log,
        true,
        true);
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 4,
        originZ + 2,
        originX + 5,
        originY + 4,
        originZ + 2,
        log,
        true,
        true);

    // ceiling lamp
    editor.setBlock(originX, originY + 4, originZ, Blocks.redstone_block);
    editor.setBlock(originX - 1, originY + 4, originZ, Blocks.redstone_lamp);
    editor.setBlock(originX + 1, originY + 4, originZ, Blocks.redstone_lamp);
    editor.setBlock(originX, originY + 4, originZ - 1, Blocks.redstone_lamp);
    editor.setBlock(originX, originY + 4, originZ + 1, Blocks.redstone_lamp);

    // ceiling fill
    editor.fillRectSolid(
        rand,
        originX - 5,
        originY + 4,
        originZ - 5,
        originX + 5,
        originY + 4,
        originZ + 5,
        deco,
        true,
        false);

    // music box
    editor.setBlock(originX, originY, originZ, Blocks.jukebox);

    return true;
  }