// Path: src/main/java/org/terasology/cities/BlockType.java
// public interface BlockType {
//     // empty marker
// }
// 
// Path: src/main/java/org/terasology/cities/DefaultBlockType.java
// public enum DefaultBlockType implements BlockType {
// 
//     /**
//      * Air
//      */
//     AIR,
// 
//     /**
//      * Windows
//      */
//     WINDOW_GLASS,
// 
//     /**
//      * A single-block door element
//      */
//     SIMPLE_DOOR,
// 
//     /**
//      * A two-folded wing door
//      */
//     WING_DOOR,
// 
//     /**
//      * Fill material under the surface of a road
//      */
//     ROAD_FILL,
// 
//     /**
//      * Surface of a road (asphalt)
//      */
//     ROAD_SURFACE,
// 
//     /**
//      * Empty space in a lot
//      */
//     LOT_EMPTY,
// 
//     /**
//      * A simple building's floor
//      */
//     BUILDING_FLOOR,
// 
//     /**
//      * A simple building's foundation
//      */
//     BUILDING_FOUNDATION,
// 
//     /**
//      * A simple building wall
//      */
//     BUILDING_WALL,
// 
//     /**
//      * Flat roof
//      */
//     ROOF_FLAT,
// 
//     /**
//      * Hip roof
//      */
//     ROOF_HIP,
// 
//     /**
//      * Dome roof
//      */
//     ROOF_DOME,
// 
//     /**
//      * The roof gable for saddle roofs
//      */
//     ROOF_GABLE,
// 
//     /**
//      * Saddle roof
//      */
//     ROOF_SADDLE,
// 
//     /**
//      * Tower stone
//      */
//     TOWER_WALL,
// 
//     /**
//      * Fence
//      */
//     FENCE,
// 
//     /**
//      * Fence gate
//      */
//     FENCE_GATE,
// 
//     /**
//      * Tower staircase
//      */
//     TOWER_STAIRS,
// 
//     /**
//      * A barrel
//      */
//     BARREL,
// 
//     /**
//      * A torch
//      */
//     TORCH,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_TOP,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_MIDDLE,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_BASE,
// 
//     /**
//      * A ladder element
//      */
//     LADDER
// }


import com.google.common.base.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.cities.BlockType;
import org.terasology.cities.DefaultBlockType;
import org.terasology.engine.math.Side;
import org.terasology.engine.world.block.BlockArea;
import org.terasology.engine.world.block.BlockAreac;
import org.terasology.engine.world.block.BlockRegion;
import org.terasology.math.TeraMath;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.Set;
        int lz = z - wz;

        // TODO: remove
        final boolean debugging = true;
        final boolean warnOnly = true;
        if (debugging) {
            boolean xOk = lx >= 0 && lx < image.getWidth();
            boolean yOk = y >= getMinHeight() && y < getMaxHeight();
            boolean zOk = lz >= 0 && lz < image.getHeight();

            if (warnOnly) {
                if (!xOk) {
                    logger.warn("X value of {} not in range [{}..{}]", x, wx, wx + image.getWidth() - 1);
                    return;
                }

                if (!yOk) {
                    logger.warn("Y value of {} not in range [{}..{}]", y, getMinHeight(), getMaxHeight() - 1);
                    return;
                }

                if (!zOk) {
                    logger.warn("Z value of {} not in range [{}..{}]", z, wz, wz + image.getHeight() - 1);
                    return;
                }
            }
        }

        // if air is drawn at or below terrain level, then reduce height accordingly
        // The color remains unchanged which is wrong, but this information is not available in 2D
// Path: src/main/java/org/terasology/cities/BlockType.java
// public interface BlockType {
//     // empty marker
// }
// 
// Path: src/main/java/org/terasology/cities/DefaultBlockType.java
// public enum DefaultBlockType implements BlockType {
// 
//     /**
//      * Air
//      */
//     AIR,
// 
//     /**
//      * Windows
//      */
//     WINDOW_GLASS,
// 
//     /**
//      * A single-block door element
//      */
//     SIMPLE_DOOR,
// 
//     /**
//      * A two-folded wing door
//      */
//     WING_DOOR,
// 
//     /**
//      * Fill material under the surface of a road
//      */
//     ROAD_FILL,
// 
//     /**
//      * Surface of a road (asphalt)
//      */
//     ROAD_SURFACE,
// 
//     /**
//      * Empty space in a lot
//      */
//     LOT_EMPTY,
// 
//     /**
//      * A simple building's floor
//      */
//     BUILDING_FLOOR,
// 
//     /**
//      * A simple building's foundation
//      */
//     BUILDING_FOUNDATION,
// 
//     /**
//      * A simple building wall
//      */
//     BUILDING_WALL,
// 
//     /**
//      * Flat roof
//      */
//     ROOF_FLAT,
// 
//     /**
//      * Hip roof
//      */
//     ROOF_HIP,
// 
//     /**
//      * Dome roof
//      */
//     ROOF_DOME,
// 
//     /**
//      * The roof gable for saddle roofs
//      */
//     ROOF_GABLE,
// 
//     /**
//      * Saddle roof
//      */
//     ROOF_SADDLE,
// 
//     /**
//      * Tower stone
//      */
//     TOWER_WALL,
// 
//     /**
//      * Fence
//      */
//     FENCE,
// 
//     /**
//      * Fence gate
//      */
//     FENCE_GATE,
// 
//     /**
//      * Tower staircase
//      */
//     TOWER_STAIRS,
// 
//     /**
//      * A barrel
//      */
//     BARREL,
// 
//     /**
//      * A torch
//      */
//     TORCH,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_TOP,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_MIDDLE,
// 
//     /**
//      * Pillar material
//      */
//     PILLAR_BASE,
// 
//     /**
//      * A ladder element
//      */
//     LADDER
// }


// Path: src/main/java/org/terasology/cities/raster/ImageRasterTarget.java
import com.google.common.base.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.cities.BlockType;
import org.terasology.cities.DefaultBlockType;
import org.terasology.engine.math.Side;
import org.terasology.engine.world.block.BlockArea;
import org.terasology.engine.world.block.BlockAreac;
import org.terasology.engine.world.block.BlockRegion;
import org.terasology.math.TeraMath;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.Set;

        int lz = z - wz;

        // TODO: remove
        final boolean debugging = true;
        final boolean warnOnly = true;
        if (debugging) {
            boolean xOk = lx >= 0 && lx < image.getWidth();
            boolean yOk = y >= getMinHeight() && y < getMaxHeight();
            boolean zOk = lz >= 0 && lz < image.getHeight();

            if (warnOnly) {
                if (!xOk) {
                    logger.warn("X value of {} not in range [{}..{}]", x, wx, wx + image.getWidth() - 1);
                    return;
                }

                if (!yOk) {
                    logger.warn("Y value of {} not in range [{}..{}]", y, getMinHeight(), getMaxHeight() - 1);
                    return;
                }

                if (!zOk) {
                    logger.warn("Z value of {} not in range [{}..{}]", z, wz, wz + image.getHeight() - 1);
                    return;
                }
            }
        }

        // if air is drawn at or below terrain level, then reduce height accordingly
        // The color remains unchanged which is wrong, but this information is not available in 2D
        if (type == DefaultBlockType.AIR) {