Files
minecraft-pe-0.6.1/src/world/level/biome/Biome.cpp
2026-03-02 22:04:18 +03:00

230 lines
6.9 KiB
C++
Executable File

#include "BiomeInclude.h"
#include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/TallgrassFeature.h"
#include "../../entity/EntityTypes.h"
#include "../../entity/MobCategory.h"
#include "../../level/tile/TallGrass.h"
Biome* Biome::rainForest = NULL;
Biome* Biome::swampland = NULL;
Biome* Biome::seasonalForest = NULL;
Biome* Biome::forest = NULL;
Biome* Biome::savanna = NULL;
Biome* Biome::shrubland = NULL;
Biome* Biome::taiga = NULL;
Biome* Biome::desert = NULL;
Biome* Biome::plains = NULL;
Biome* Biome::iceDesert = NULL;
Biome* Biome::tundra = NULL;
/*static*/
Biome::MobList Biome::_emptyMobList;
int Biome::defaultTotalEnemyWeight = 0;
int Biome::defaultTotalFriendlyWeight = 0;
/*static*/
Biome* Biome::map[64*64];
Biome::Biome()
: topMaterial(((Tile*)Tile::grass)->id),
material(((Tile*)Tile::dirt)->id),
leafColor(0x4EE031)
{
_friendlies.insert(_friendlies.end(), MobSpawnerData(MobTypes::Sheep, 12, 2, 3));
_friendlies.insert(_friendlies.end(), MobSpawnerData(MobTypes::Pig, 10, 1, 3));
_friendlies.insert(_friendlies.end(), MobSpawnerData(MobTypes::Chicken, 10, 2, 4));
_friendlies.insert(_friendlies.end(), MobSpawnerData(MobTypes::Cow, 8, 2, 3));
_enemies.insert(_enemies.end(), MobSpawnerData(MobTypes::Spider, 8, 2, 3));
_enemies.insert(_enemies.end(), MobSpawnerData(MobTypes::Zombie, 12, 2, 4));
_enemies.insert(_enemies.end(), MobSpawnerData(MobTypes::Skeleton, 6, 1, 3));
_enemies.insert(_enemies.end(), MobSpawnerData(MobTypes::Creeper, 4, 1, 1));
//_enemies.insert(_enemies.end(), MobSpawnerData(Slime.class, 10, 4, 4));
//_enemies.insert(_enemies.end(), MobSpawnerData(EnderMan.class, 1, 1, 4));
// wolves are added to forests and taigas
// _friendlies.insert(_friendlies.end(), new MobSpawnerData(Wolf.class, 2));
//_waterFriendlies.insert(_waterFriendlies.end(), (new MobSpawnerData(Squid.class, 10, 4, 4));
//
// Sum up the weights
//
defaultTotalEnemyWeight = 0;
for (MobList::const_iterator cit = _enemies.begin(); cit != _enemies.end(); ++cit)
defaultTotalEnemyWeight += cit->randomWeight;
defaultTotalFriendlyWeight = 0;
for (MobList::const_iterator cit = _friendlies.begin(); cit != _friendlies.end(); ++cit)
defaultTotalFriendlyWeight += cit->randomWeight;
}
Biome* Biome::setName( const std::string& name )
{
this->name = name;
return this;
}
Biome* Biome::setLeafColor( int leafColor )
{
this->leafColor = leafColor;
return this;
}
Biome* Biome::setColor( int color )
{
this->color = color;
return this;
}
Biome* Biome::setSnowCovered()
{
return this;
}
Biome* Biome::clearMobs( bool friendlies /*= true*/, bool waterFriendlies /*= true*/, bool enemies /*= true*/ )
{
if (friendlies) _friendlies.clear();
if (waterFriendlies) _waterFriendlies.clear();
if (enemies) _enemies.clear();
return this;
}
/*static*/
void Biome::recalc()
{
for (int a = 0; a < 64; a++) {
for (int b = 0; b < 64; b++) {
map[a + b * 64] = _getBiome(a / 63.0f, b / 63.0f);
}
}
Biome::desert->topMaterial = Biome::desert->material = (char) Tile::sand->id;
Biome::iceDesert->topMaterial = Biome::iceDesert->material = (char) Tile::sand->id;
}
/*static*/
void Biome::initBiomes() {
rainForest = (new RainforestBiome())->setColor(0x08FA36)->setName("Rainforest")->setLeafColor(0x1FF458);
swampland = (new SwampBiome())->setColor(0x07F9B2)->setName("Swampland")->setLeafColor(0x8BAF48);
seasonalForest = (new Biome())->setColor(0x9BE023)->setName("Seasonal Forest");
forest = (new ForestBiome())->setColor(0x056621)->setName("Forest")->setLeafColor(0x4EBA31);
savanna = (new FlatBiome())->setColor(0xD9E023)->setName("Savanna");
shrubland = (new Biome())->setColor(0xA1AD20)->setName("Shrubland");
taiga = (new TaigaBiome())->setColor(0x2EB153)->setName("Taiga")->setSnowCovered()->setLeafColor(0x7BB731);
desert = (new FlatBiome())->setColor(0xFA9418)->clearMobs(true, true, false)->setName("Desert");
plains = (new FlatBiome())->setColor(0xFFD910)->setName("Plains");
iceDesert = (new FlatBiome())->setColor(0xFFED93)->clearMobs(true, false, false)->setName("Ice Desert")->setSnowCovered()->setLeafColor(0xC4D339);
tundra = (new Biome())->setColor(0x57EBF9)->setName("Tundra")->setSnowCovered()->setLeafColor(0xC4D339);
recalc();
}
/*static*/
void Biome::teardownBiomes() {
delete rainForest; rainForest= NULL;
delete swampland; swampland = NULL;
delete seasonalForest; seasonalForest = NULL;
delete forest; forest = NULL;
delete savanna; savanna = NULL;
delete shrubland; shrubland = NULL;
delete taiga; taiga = NULL;
delete desert; desert = NULL;
delete plains; plains = NULL;
delete iceDesert; iceDesert = NULL;
delete tundra; tundra = NULL;
}
Feature* Biome::getTreeFeature( Random* random )
{
if (random->nextInt(10) == 0) {
//return /*new*/ BasicTree();
}
return new TreeFeature(false);
}
Feature* Biome::getGrassFeature( Random* random ) {
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
}
Biome* Biome::getBiome( float temperature, float downfall )
{
int a = (int) (temperature * 63);
int b = (int) (downfall * 63);
//printf("Getting biome: %s\n", map[a + b * 64]->name.c_str());
return map[a + b * 64];
}
Biome* Biome::_getBiome( float temperature, float downfall )
{
downfall *= (temperature);
if (temperature < 0.10f) {
return Biome::tundra;
} else if (downfall < 0.20f) {
if (temperature < 0.50f) {
return Biome::tundra;
} else if (temperature < 0.95f) {
return Biome::savanna;
} else {
return Biome::desert;
}
} else if (downfall > 0.5f && temperature < 0.7f) {
return Biome::swampland;
} else if (temperature < 0.50f) {
return Biome::taiga;
} else if (temperature < 0.97f) {
if (downfall < 0.35f) {
return Biome::shrubland;
} else {
return Biome::forest;
}
} else {
if (downfall < 0.45f) {
return Biome::plains;
} else if (downfall < 0.90f) {
return Biome::seasonalForest;
} else {
return Biome::rainForest;
}
}
}
float Biome::adjustScale( float scale )
{
return scale;
}
float Biome::adjustDepth( float depth )
{
return depth;
}
int Biome::getSkyColor( float temp )
{
// temp /= 3.f;
// if (temp < -1) temp = -1;
// if (temp > 1) temp = 1;
return 0x80808080;
//return Color.getHSBColor(224 / 360.0f - temp * 0.05f, 0.50f + temp * 0.1f, 1.0f).getRGB();
}
Biome::MobList& Biome::getMobs(const MobCategory& category)
{
if (&category == &MobCategory::monster)
return _enemies;
if (&category == &MobCategory::creature)
return _friendlies;
if (&category == &MobCategory::waterCreature)
return _waterFriendlies;
LOGE("Unknown MobCategory!");
return _emptyMobList;
}
float Biome::getCreatureProbability() {
return 0.08f;
}