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;
  }