1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
use num_enum::{IntoPrimitive, TryFromPrimitive};

// Values from https://minecraft.gamepedia.com/Java_Edition_data_value#Biomes
#[derive(TryFromPrimitive, IntoPrimitive)]
#[repr(i32)] // i32 as in corresponding NBT.
pub enum Biome {
    Ocean = 0,
    DeepOcean = 24,
    FrozenOcean = 10,
    DeepFrozenOcean = 50,
    ColdOcean = 46,
    DeepColdOcean = 49,
    LukewarmOcean = 45,
    DeepLukewarmOcean = 48,
    WarmOcean = 44,
    DeepWarmOcean = 47,
    River = 7,
    FrozenRiver = 11,
    Beach = 16,
    StoneShore = 25,
    SnowyBeach = 26,
    Forest = 4,
    WoodedHills = 18,
    FlowerForest = 132,
    BirchForest = 27,
    BirchForestHills = 28,
    TallBirchForest = 155,
    TallBirchHills = 156,
    DarkForest = 29,
    DarkForestHills = 157,
    Jungle = 21,
    JungleHills = 22,
    ModifiedJungle = 149,
    JungleEdge = 23,
    ModifiedJungleEdge = 151,
    BambooJungle = 168,
    BambooJungleHills = 169,
    Taiga = 5,
    TaigaHills = 19,
    TaigaMountains = 133,
    SnowyTaiga = 30,
    SnowyTaigaHills = 31,
    SnowyTaigaMountains = 158,
    GiantTreeTaiga = 32,
    GiantTreeTaigaHills = 33,
    GiantSpruceTaiga = 160,
    GiantSpruceTaigaHills = 161,
    MushroomFields = 14,
    MushroomFieldShore = 15,
    Swamp = 6,
    SwampHills = 134,
    Savanna = 35,
    SavannaPlateau = 36,
    ShatteredSavanna = 163,
    ShatteredSavannaPlateau = 164,
    Plains = 1,
    SunflowerPlains = 129,
    Desert = 2,
    DesertHills = 17,
    DesertLakes = 130,
    SnowyTundra = 12,
    SnowyMountains = 13,
    IceSpikes = 140,
    Mountains = 3,
    WoodedMountains = 34,
    GravellyMountains = 131,
    ModifiedGravellyMountains = 162,
    MountainEdge = 20,
    Badlands = 37,
    BadlandsPlateau = 39,
    ModifiedBadlandsPlateau = 167,
    WoodedBadlandsPlateau = 38,
    ModifiedWoodedBadlandsPlateau = 166,
    ErodedBadlands = 165,
    Nether = 8,
    TheEnd = 9,
    SmallEndIslands = 40,
    EndMidlands = 41,
    EndHighlands = 42,
    EndBarrens = 43,
    TheVoid = 127,
}

pub struct Climate {
    pub temperature: f64,
    pub rainfall: f64,
}

// Values from https://github.com/erich666/Mineways/blob/master/Win/biomes.cpp
pub fn climate(b: Biome) -> Climate {
    let climate = |t, r| Climate {
        temperature: t,
        rainfall: r,
    };

    match b {
        Biome::Ocean => climate(0.5, 0.5),
        Biome::Plains => climate(0.8, 0.4),
        Biome::Desert => climate(2.0, 0.0),
        Biome::Mountains => climate(0.2, 0.3),
        Biome::Forest => climate(0.7, 0.8),
        Biome::Taiga => climate(0.25, 0.8),
        Biome::Swamp => climate(0.8, 0.9),
        Biome::River => climate(0.5, 0.5),
        Biome::Nether => climate(2.0, 0.0),
        Biome::TheEnd => climate(0.5, 0.5),
        Biome::FrozenOcean => climate(0.0, 0.5),
        Biome::FrozenRiver => climate(0.0, 0.5),
        Biome::SnowyTundra => climate(0.0, 0.5),
        Biome::SnowyMountains => climate(0.0, 0.5),
        Biome::MushroomFields => climate(0.9, 1.0),
        Biome::MushroomFieldShore => climate(0.9, 1.0),
        Biome::Beach => climate(0.8, 0.4),
        Biome::DesertHills => climate(2.0, 0.0),
        Biome::WoodedHills => climate(0.7, 0.8),
        Biome::TaigaHills => climate(0.25, 0.8),
        Biome::MountainEdge => climate(0.2, 0.3),
        Biome::Jungle => climate(0.95, 0.9),
        Biome::JungleHills => climate(0.95, 0.9),
        Biome::JungleEdge => climate(0.95, 0.8),
        Biome::DeepOcean => climate(0.5, 0.5),
        Biome::StoneShore => climate(0.2, 0.3),
        Biome::SnowyBeach => climate(0.05, 0.3),
        Biome::BirchForest => climate(0.6, 0.6),
        Biome::BirchForestHills => climate(0.6, 0.6),
        Biome::DarkForest => climate(0.7, 0.8),
        Biome::SnowyTaiga => climate(-0.5, 0.4),
        Biome::SnowyTaigaHills => climate(-0.5, 0.4),
        Biome::GiantTreeTaiga => climate(0.3, 0.8),
        Biome::GiantTreeTaigaHills => climate(0.3, 0.8),
        Biome::WoodedMountains => climate(0.2, 0.3),
        Biome::Savanna => climate(1.2, 0.0),
        Biome::SavannaPlateau => climate(1.0, 0.0),
        Biome::Badlands => climate(2.0, 0.0),
        Biome::WoodedBadlandsPlateau => climate(2.0, 0.0),
        Biome::BadlandsPlateau => climate(2.0, 0.0),
        Biome::SmallEndIslands => climate(0.5, 0.5),
        Biome::EndMidlands => climate(0.5, 0.5),
        Biome::EndHighlands => climate(0.5, 0.5),
        Biome::EndBarrens => climate(0.5, 0.5),
        Biome::WarmOcean => climate(0.8, 0.5),
        Biome::LukewarmOcean => climate(0.8, 0.5),
        Biome::ColdOcean => climate(0.8, 0.5),
        Biome::DeepWarmOcean => climate(0.8, 0.5),
        Biome::DeepLukewarmOcean => climate(0.8, 0.5),
        Biome::DeepColdOcean => climate(0.8, 0.5),
        Biome::DeepFrozenOcean => climate(0.8, 0.5),
        Biome::TheVoid => climate(0.5, 0.5),
        Biome::SunflowerPlains => climate(0.8, 0.4),
        Biome::DesertLakes => climate(2.0, 0.0),
        Biome::GravellyMountains => climate(0.2, 0.3),
        Biome::FlowerForest => climate(0.7, 0.8),
        Biome::TaigaMountains => climate(0.25, 0.8),
        Biome::SwampHills => climate(0.8, 0.9),
        Biome::IceSpikes => climate(0.0, 0.5),
        Biome::ModifiedJungle => climate(0.95, 0.9),
        Biome::ModifiedJungleEdge => climate(0.95, 0.8),
        Biome::TallBirchForest => climate(0.6, 0.6),
        Biome::TallBirchHills => climate(0.6, 0.6),
        Biome::DarkForestHills => climate(0.7, 0.8),
        Biome::SnowyTaigaMountains => climate(-0.5, 0.4),
        Biome::GiantSpruceTaiga => climate(0.25, 0.8),
        Biome::GiantSpruceTaigaHills => climate(0.25, 0.8),
        Biome::ModifiedGravellyMountains => climate(0.2, 0.3),
        Biome::ShatteredSavanna => climate(1.1, 0.0),
        Biome::ShatteredSavannaPlateau => climate(1.0, 0.0),
        Biome::ErodedBadlands => climate(2.0, 0.0),
        Biome::ModifiedWoodedBadlandsPlateau => climate(2.0, 0.0),
        Biome::ModifiedBadlandsPlateau => climate(2.0, 0.0),
        Biome::BambooJungle => climate(0.95, 0.9),
        Biome::BambooJungleHills => climate(0.95, 0.9),
        //  Biome::SoulSandValley => climate(2.0, 0.0),
        //  Biome::CrimsonForest => climate(2.0, 0.0),
        //  Biome::WarpedForest => climate(2.0, 0.0),
        //  Biome::BasaltDeltas => climate(2.0, 0.0),
    }
}