Files
MinecraftConsoles/Minecraft.World/Layer.cpp
daoge b3feddfef3 feat: TU19 (Dec 2014) Features & Content (#155)
* try to resolve merge conflict

* feat: TU19 (Dec 2014) Features & Content (#32)

* December 2014 files

* Working release build

* Fix compilation issues

* Add sound to Windows64Media

* Add DLC content and force Tutorial DLC

* Revert "Add DLC content and force Tutorial DLC"

This reverts commit 97a4399472.

* Disable broken light packing

* Disable breakpoint during DLC texture map load

Allows DLC loading but the DLC textures are still broken

* Fix post build not working

* ...

* fix vs2022 build

* fix cmake build

---------

Co-authored-by: Loki <lokirautio@gmail.com>
2026-03-03 03:04:10 +08:00

200 lines
7.0 KiB
C++

#include "stdafx.h"
#include "net.minecraft.world.level.newbiome.layer.h"
#include "net.minecraft.world.level.h"
#include "BiomeOverrideLayer.h"
#ifdef __PSVITA__
// AP - this is used to perform fast 64bit divides of known values
#include "..\Minecraft.Client\PSVita\PSVitaExtras\libdivide.h"
libdivide::divider<long long> fast_d2(2);
libdivide::divider<long long> fast_d3(3);
libdivide::divider<long long> fast_d4(4);
libdivide::divider<long long> fast_d5(5);
libdivide::divider<long long> fast_d6(6);
libdivide::divider<long long> fast_d7(7);
libdivide::divider<long long> fast_d10(10);
#endif
LayerArray Layer::getDefaultLayers(__int64 seed, LevelType *levelType)
{
// 4J - Some changes moved here from 1.2.3. Temperature & downfall layers are no longer created & returned, and a debug layer is isn't.
// For reference with regard to future merging, things NOT brought forward from the 1.2.3 version are new layer types that we
// don't have yet (shores, swamprivers, region hills etc.)
shared_ptr<Layer>islandLayer = shared_ptr<Layer>(new IslandLayer(1));
islandLayer = shared_ptr<Layer>(new FuzzyZoomLayer(2000, islandLayer));
islandLayer = shared_ptr<Layer>(new AddIslandLayer(1, islandLayer));
islandLayer = shared_ptr<Layer>(new ZoomLayer(2001, islandLayer));
islandLayer = shared_ptr<Layer>(new AddIslandLayer(2, islandLayer));
islandLayer = shared_ptr<Layer>(new AddSnowLayer(2, islandLayer));
islandLayer = shared_ptr<Layer>(new ZoomLayer(2002, islandLayer));
islandLayer = shared_ptr<Layer>(new AddIslandLayer(3, islandLayer));
islandLayer = shared_ptr<Layer>(new ZoomLayer(2003, islandLayer));
islandLayer = shared_ptr<Layer>(new AddIslandLayer(4, islandLayer));
// islandLayer = shared_ptr<Layer>(new AddMushroomIslandLayer(5, islandLayer)); // 4J - old position of mushroom island layer
int zoomLevel = 4;
if (levelType == LevelType::lvl_largeBiomes)
{
zoomLevel = 6;
}
shared_ptr<Layer> riverLayer = islandLayer;
riverLayer = ZoomLayer::zoom(1000, riverLayer, 0);
riverLayer = shared_ptr<Layer>(new RiverInitLayer(100, riverLayer));
riverLayer = ZoomLayer::zoom(1000, riverLayer, zoomLevel + 2);
riverLayer = shared_ptr<Layer>(new RiverLayer(1, riverLayer));
riverLayer = shared_ptr<Layer>(new SmoothLayer(1000, riverLayer));
shared_ptr<Layer> biomeLayer = islandLayer;
biomeLayer = ZoomLayer::zoom(1000, biomeLayer, 0);
biomeLayer = shared_ptr<Layer>(new BiomeInitLayer(200, biomeLayer, levelType));
biomeLayer = ZoomLayer::zoom(1000, biomeLayer, 2);
biomeLayer = shared_ptr<Layer>(new RegionHillsLayer(1000, biomeLayer));
for (int i = 0; i < zoomLevel; i++)
{
biomeLayer = shared_ptr<Layer>(new ZoomLayer(1000 + i, biomeLayer));
if (i == 0) biomeLayer = shared_ptr<Layer>(new AddIslandLayer(3, biomeLayer));
if (i == 0)
{
// 4J - moved mushroom islands to here. This skips 3 zooms that the old location of the add was, making them about 1/8 of the original size. Adding
// them at this scale actually lets us place them near enough other land, if we add them at the same scale as java then they have to be too far out to see for
// the scale of our maps
biomeLayer = shared_ptr<Layer>(new AddMushroomIslandLayer(5, biomeLayer));
}
if (i == 1 )
{
// 4J - now expand mushroom islands up again. This does a simple region grow to add a new mushroom island element when any of the neighbours are also mushroom islands.
// This helps make the islands into nice compact shapes of the type that are actually likely to be able to make an island out of the sea in a small space. Also
// helps the shore layer from doing too much damage in shrinking the islands we are making
biomeLayer = shared_ptr<Layer>(new GrowMushroomIslandLayer(5, biomeLayer));
// Note - this reduces the size of mushroom islands by turning their edges into shores. We are doing this at i == 1 rather than i == 0 as the original does
biomeLayer = shared_ptr<Layer>(new ShoreLayer(1000, biomeLayer));
biomeLayer = shared_ptr<Layer>(new SwampRiversLayer(1000, biomeLayer));
}
}
biomeLayer = shared_ptr<Layer>(new SmoothLayer(1000, biomeLayer));
biomeLayer = shared_ptr<Layer>(new RiverMixerLayer(100, biomeLayer, riverLayer));
#ifndef _CONTENT_PACKAGE
#ifdef _BIOME_OVERRIDE
if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<<eDebugSetting_EnableBiomeOverride))
{
biomeLayer = shared_ptr<BiomeOverrideLayer>(new BiomeOverrideLayer(1));
}
#endif
#endif
shared_ptr<Layer> debugLayer = biomeLayer;
shared_ptr<Layer>zoomedLayer = shared_ptr<Layer>(new VoronoiZoom(10, biomeLayer));
biomeLayer->init(seed);
zoomedLayer->init(seed);
LayerArray result(3);
result[0] = biomeLayer;
result[1] = zoomedLayer;
result[2] = debugLayer;
return result;
}
Layer::Layer(__int64 seedMixup)
{
parent = nullptr;
this->seedMixup = seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
}
void Layer::init(__int64 seed)
{
this->seed = seed;
if (parent != NULL) parent->init(seed);
this->seed *= this->seed * 6364136223846793005l + 1442695040888963407l;
this->seed += seedMixup;
this->seed *= this->seed * 6364136223846793005l + 1442695040888963407l;
this->seed += seedMixup;
this->seed *= this->seed * 6364136223846793005l + 1442695040888963407l;
this->seed += seedMixup;
}
void Layer::initRandom(__int64 x, __int64 y)
{
rval = seed;
rval *= rval * 6364136223846793005l + 1442695040888963407l;
rval += x;
rval *= rval * 6364136223846793005l + 1442695040888963407l;
rval += y;
rval *= rval * 6364136223846793005l + 1442695040888963407l;
rval += x;
rval *= rval * 6364136223846793005l + 1442695040888963407l;
rval += y;
}
int Layer::nextRandom(int max)
{
#ifdef __PSVITA__
// AP - 64bit mods are very slow on Vita. Replaced with a divide/mult for general case and a fast divide library for specific numbers
// todo - this can sometimes yield a different number to the original. There's a strange bug sometimes with Vita where if the line
// "result = (int) ((rval >> 24) % max);" is done twice in a row 'result' will not be the same. Need to speak to Sony about that
// Also need to compare level against a different platform using the same seed
int result;
long long temp = rval;
temp >>= 24;
if( max == 2 )
{
result = temp-(temp/fast_d2)*2;
}
else if( max == 3 )
{
result = temp-(temp/fast_d3)*3;
}
else if( max == 4 )
{
result = temp-(temp/fast_d4)*4;
}
else if( max == 5 )
{
result = temp-(temp/fast_d5)*5;
}
else if( max == 6 )
{
result = temp-(temp/fast_d6)*6;
}
else if( max == 7 )
{
result = temp-(temp/fast_d7)*7;
}
else if( max == 10 )
{
result = temp-(temp/fast_d10)*10;
}
else
{
result = temp-(temp/max)*max;
}
#else
int result = (int) ((rval >> 24) % max);
#endif
if (result < 0) result += max;
rval *= rval * 6364136223846793005l + 1442695040888963407l;
rval += seed;
return result;
}