# Sat's SetBiome
# Modified from SethBling's filter

from pymclevel import MCSchematic
from pymclevel import TAG_Compound
from pymclevel import TAG_Short
from pymclevel import TAG_Byte
from pymclevel import TAG_Byte_Array
from pymclevel import TAG_String
from numpy import zeros

inputs = (
    ("Biome", ("Ocean",
               "Plains",
               "Desert",
               "Extreme Hills",
               "Forest",
               "Taiga",
               "Swampland",
               "River",
               "Hell",
               "Sky",
               "FrozenOcean",
               "FrozenRiver",
               "Ice Plains",
               "Ice Mountains",
               "MushroomIsland",
               "MushroomIslandShore",
               "Beach",
               "DesertHills",
               "ForestHills",
               "TaigaHills",
               "Extreme Hills Edge",
               "Jungle",
               "JungleHills",
               "JungleEdge",
               "Deep Ocean",
               "Stone Beach",
               "Cold Beach",
               "Birch Forest",
               "Birch Forest Hills",
               "Roofed Forest",
               "Cold Taiga",
               "Cold Taiga Hills",
               "Mega Taiga",
               "Mega Taiga Hills",
               "Extreme Hills+",
               "Savanna",
               "Savanna Plateau",
               "Mesa",
               "Mesa Plateau F",
               "Mesa Plateau",
               "Sunflower Plains",
               "Desert M",
               "Extreme Hills M",
               "Flower Forest",
               "Taiga M",
               "Swampland M",
               "Ice Plains Spikes",
               "Jungle M",
               "JungleEdge M",
               "Birch Forest M",
               "Birch Forest Hills M",
               "Roofed Forest M",
               "Cold Taiga M",
               "Mega Spruce Taiga",
               "Mega Spruce Taiga Hills",
               "Extreme Hills+ M",
               "Savanna M",
               "Savanna Plateau M",
               "Mesa (Bryce)",
               "Mesa Plateau F M",
               "Mesa Plateau M")),
)

biomes = {
    "Ocean":0,
    "Plains":1,
    "Desert":2,
    "Extreme Hills":3,
    "Forest":4,
    "Taiga":5,
    "Swampland":6,
    "River":7,
    "Hell":8,
    "Sky":9,
    "FrozenOcean":10,
    "FrozenRiver":11,
    "Ice Plains":12,
    "Ice Mountains":13,
    "MushroomIsland":14,
    "MushroomIslandShore":15,
    "Beach":16,
    "DesertHills":17,
    "ForestHills":18,
    "TaigaHills":19,
    "Extreme Hills Edge":20,
    "Jungle":21,
    "JungleHills":22,
    "JungleEdge":23,
    "Deep Ocean":24,
    "Stone Beach":25,
    "Cold Beach":26,
    "Birch Forest":27,
    "Birch Forest Hills":28,
    "Roofed Forest":29,
    "Cold Taiga":30,
    "Cold Taiga Hills":31,
    "Mega Taiga":32,
    "Mega Taiga Hills":33,
    "Extreme Hills+":34,
    "Savanna":35,
    "Savanna Plateau":36,
    "Mesa":37,
    "Mesa Plateau F":38,
    "Mesa Plateau":39,
    "Sunflower Plains":129,
    "Desert M":130,
    "Extreme Hills M":131,
    "Flower Forest":132,
    "Taiga M":133,
    "Swampland M":134,
    "Ice Plains Spikes":140,
    "Jungle M":149,
    "JungleEdge M":151,
    "Birch Forest M":155,
    "Birch Forest Hills M":156,
    "Roofed Forest M":157,
    "Cold Taiga M":158,
    "Mega Spruce Taiga":160,
    "Mega Spruce Taiga Hills":161,
    "Extreme Hills+ M":162,
    "Savanna M":163,
    "Savanna Plateau M":164,
    "Mesa (Bryce)":165,
    "Mesa Plateau F M":166,
    "Mesa Plateau M":167
    }

def perform(level, box, options):
    biome = biomes[options["Biome"]]

    minx = int(box.minx/16)*16
    minz = int(box.minz/16)*16

    for x in xrange(minx, box.maxx, 16):
        for z in xrange(minz, box.maxz, 16):
            chunk = level.getChunk(x / 16, z / 16)
            chunk.dirty = True
            array = chunk.root_tag["Level"]["Biomes"].value

            chunkx = int(x/16)*16
            chunkz = int(z/16)*16

            for bx in xrange(max(box.minx, chunkx), min(box.maxx, chunkx+16)):
                for bz in xrange(max(box.minz, chunkz), min(box.maxz, chunkz+16)):
                    idx = 16*(bz-chunkz)+(bx-chunkx)
                    array[idx] = biome

            chunk.root_tag["Level"]["Biomes"].value = array
