35 #ifndef PROT_INT_BUFFER_SIZE 36 #define PROT_INT_BUFFER_SIZE 900 62 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values) = 0;
88 return ((rnd & 1) == 0) ? a_Val1 : a_Val2;
92 int chooseRandomOne(
int a_RndX,
int a_RndZ,
int a_Val1,
int a_Val2,
int a_Val3,
int a_Val4)
97 case 0:
return a_Val1;
98 case 1:
return a_Val2;
99 case 2:
return a_Val3;
100 default:
return a_Val4;
123 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 125 for (
size_t z = 0; z < a_SizeZ; z++)
127 int BaseZ = a_MinZ +
static_cast<int>(z);
128 for (
size_t x = 0; x < a_SizeX; x++)
130 a_Values[x + a_SizeX * z] = (super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7) % m_Range;
154 m_Threshold(a_Threshold)
159 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 161 for (
size_t z = 0; z < a_SizeZ; z++)
163 int BaseZ = a_MinZ +
static_cast<int>(z);
164 for (
size_t x = 0; x < a_SizeX; x++)
166 int rnd = (super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7);
167 a_Values[x + a_SizeX * z] = ((rnd % 100) < m_Threshold) ? ((rnd / 101) %
bgLandOceanMax + 1) : 0;
172 if ((a_MinX <= 0) && (a_MinZ <= 0) && (a_MinX + static_cast<int>(a_SizeX) > 0) && (a_MinZ +
static_cast<int>(a_SizeZ) > 0))
174 a_Values[
static_cast<size_t>(-a_MinX) - static_cast<size_t>(a_MinZ) * a_SizeX] =
bgTemperate;
197 m_UnderlyingGen(a_UnderlyingGen)
202 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 205 int lowerMinX = a_MinX >> 1;
206 int lowerMinZ = a_MinZ >> 1;
207 size_t lowerSizeX = a_SizeX / 2 + 2;
208 size_t lowerSizeZ = a_SizeZ / 2 + 2;
215 m_UnderlyingGen->GetInts(lowerMinX, lowerMinZ, lowerSizeX, lowerSizeZ, lowerData);
216 const size_t lowStepX = (lowerSizeX - 1) * 2;
220 for (
size_t z = 0; z < lowerSizeZ - 1; ++z)
222 size_t idx = (z * 2) * lowStepX;
223 int PrevZ0 = lowerData[z * lowerSizeX];
224 int PrevZ1 = lowerData[(z + 1) * lowerSizeX];
226 for (
size_t x = 0; x < lowerSizeX - 1; ++x)
228 int ValX1Z0 = lowerData[x + 1 + z * lowerSizeX];
229 int ValX1Z1 = lowerData[x + 1 + (z + 1) * lowerSizeX];
230 int RndX = (
static_cast<int>(x) + lowerMinX) * 2;
231 int RndZ = (
static_cast<int>(z) + lowerMinZ) * 2;
233 cache[idx + lowStepX] = super::chooseRandomOne(RndX, RndZ + 1, PrevZ0, PrevZ1);
234 cache[idx + 1] = super::chooseRandomOne(RndX, RndZ - 1, PrevZ0, ValX1Z0);
235 cache[idx + 1 + lowStepX] = super::chooseRandomOne(RndX, RndZ, PrevZ0, ValX1Z0, PrevZ1, ValX1Z1);
243 for (
size_t z = 0; z < a_SizeZ; ++z)
245 memcpy(a_Values + z * a_SizeX, cache + (z + (a_MinZ & 1)) * lowStepX + (a_MinX & 1), a_SizeX *
sizeof(
int));
267 m_Underlying(a_Underlying)
272 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 275 size_t lowerSizeX = a_SizeX + 2;
276 size_t lowerSizeZ = a_SizeZ + 2;
279 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);
283 for (
size_t z = 0; z < a_SizeZ; z++)
285 int NoiseZ = a_MinZ +
static_cast<int>(z);
286 for (
size_t x = 0; x < a_SizeX; x++)
288 int val = lowerData[x + 1 + (z + 1) * lowerSizeX];
289 int above = lowerData[x + 1 + z * lowerSizeX];
290 int below = lowerData[x + 1 + (z + 2) * lowerSizeX];
291 int left = lowerData[x + (z + 1) * lowerSizeX];
292 int right = lowerData[x + 2 + (z + 1) * lowerSizeX];
294 if ((left == right) && (above == below))
296 if (((super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 2) == 0)
318 a_Values[x + z * a_SizeX] = val;
339 m_Underlying(a_Underlying)
344 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 347 size_t lowerSizeX = a_SizeX + 1;
348 size_t lowerSizeZ = a_SizeZ + 1;
351 m_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerData);
354 for (
size_t z = 0; z < a_SizeZ; z++)
356 for (
size_t x = 0; x < a_SizeX; x++)
358 size_t idxLower = x + lowerSizeX * z;
359 a_Values[x + a_SizeX * z] = (
360 lowerData[idxLower] + lowerData[idxLower + 1] +
361 lowerData[idxLower + lowerSizeX] + lowerData[idxLower + lowerSizeX + 1]
383 m_Underlying(a_Underlying)
388 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 391 size_t lowerSizeX = a_SizeX + 4;
392 size_t lowerSizeZ = a_SizeZ + 4;
395 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);
398 for (
size_t z = 0; z < a_SizeZ; z++)
400 for (
size_t x = 0; x < a_SizeX; x++)
402 size_t idxLower1 = x + lowerSizeX * z;
403 size_t idxLower2 = idxLower1 + lowerSizeX;
404 size_t idxLower3 = idxLower1 + 2 * lowerSizeX;
405 size_t idxLower4 = idxLower1 + 3 * lowerSizeX;
406 a_Values[x + a_SizeX * z] = (
407 1 * lowerData[idxLower1] + 2 * lowerData[idxLower1 + 1] + 2 * lowerData[idxLower1 + 2] + 1 * lowerData[idxLower1 + 3] +
408 2 * lowerData[idxLower2] + 32 * lowerData[idxLower2 + 1] + 32 * lowerData[idxLower2 + 2] + 2 * lowerData[idxLower2 + 3] +
409 2 * lowerData[idxLower3] + 32 * lowerData[idxLower3 + 1] + 32 * lowerData[idxLower3 + 2] + 2 * lowerData[idxLower3 + 3] +
410 1 * lowerData[idxLower4] + 2 * lowerData[idxLower4 + 1] + 2 * lowerData[idxLower4 + 2] + 1 * lowerData[idxLower4 + 3]
425 template <
int WeightCenter,
int WeightCardinal,
int WeightDiagonal>
433 m_Underlying(a_Underlying)
438 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 441 size_t lowerSizeX = a_SizeX + 3;
442 size_t lowerSizeZ = a_SizeZ + 3;
445 m_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerData);
448 for (
size_t z = 0; z < a_SizeZ; z++)
450 for (
size_t x = 0; x < a_SizeX; x++)
452 size_t idxLower1 = x + lowerSizeX * z;
453 size_t idxLower2 = idxLower1 + lowerSizeX;
454 size_t idxLower3 = idxLower1 + 2 * lowerSizeX;
455 a_Values[x + a_SizeX * z] = (
456 WeightDiagonal * lowerData[idxLower1] + WeightCardinal * lowerData[idxLower1 + 1] + WeightDiagonal * lowerData[idxLower1 + 2] +
457 WeightCardinal * lowerData[idxLower2] + WeightCenter * lowerData[idxLower2 + 1] + WeightCardinal * lowerData[idxLower2 + 2] +
458 WeightDiagonal * lowerData[idxLower3] + WeightCardinal * lowerData[idxLower3 + 1] + WeightDiagonal * lowerData[idxLower3 + 2]
459 ) / (4 * WeightDiagonal + 4 * WeightCardinal + WeightCenter);
481 m_ChancePct(a_ChancePct),
484 m_Underlying(a_Underlying)
489 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 492 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
495 for (
size_t z = 0; z < a_SizeZ; z++)
497 int BaseZ = a_MinZ +
static_cast<int>(z);
498 for (
size_t x = 0; x < a_SizeX; x++)
500 if (((super::m_Noise.IntNoise2DInt(BaseZ, a_MinX + static_cast<int>(x)) / 13) % 101) < m_ChancePct)
502 a_Values[x + a_SizeX * z] = m_Min + (super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), BaseZ) / 7) % m_Range;
528 m_Range(a_HalfRange * 2 + 1),
529 m_HalfRange(a_HalfRange),
530 m_Underlying(a_Underlying)
535 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 538 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
541 for (
size_t z = 0; z < a_SizeZ; z++)
543 int NoiseZ = a_MinZ +
static_cast<int>(z);
544 for (
size_t x = 0; x < a_SizeX; x++)
546 int noiseVal = ((super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % m_Range) - m_HalfRange;
547 a_Values[x + z * a_SizeX] += noiseVal;
571 m_AvgChancePct(a_AvgChancePct),
572 m_Underlying(a_Underlying)
577 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 580 size_t lowerSizeX = a_SizeX + 2;
581 size_t lowerSizeZ = a_SizeZ + 2;
584 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);
587 for (
size_t z = 0; z < a_SizeZ; z++)
589 int NoiseZ = a_MinZ +
static_cast<int>(z);
590 for (
size_t x = 0; x < a_SizeX; x++)
592 size_t idxLower = x + 1 + lowerSizeX * (z + 1);
593 if (((super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 100) > m_AvgChancePct)
596 a_Values[x + z * a_SizeX] = (
597 lowerData[idxLower - 1] + lowerData[idxLower + 1] +
598 lowerData[idxLower - lowerSizeX] + lowerData[idxLower + lowerSizeX]
604 a_Values[x + z * a_SizeX] = lowerData[idxLower];
628 m_AvgChancePct(a_AvgChancePct),
629 m_Underlying(a_Underlying)
634 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 637 size_t lowerSizeX = a_SizeX + 2;
638 size_t lowerSizeZ = a_SizeZ + 2;
641 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerData);
644 for (
size_t z = 0; z < a_SizeZ; z++)
646 int NoiseZ = a_MinZ +
static_cast<int>(z);
647 for (
size_t x = 0; x < a_SizeX; x++)
649 size_t idxLower = x + 1 + lowerSizeX * (z + 1);
650 if (((super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ) / 7) % 100) > m_AvgChancePct)
653 int min = std::min(std::min(lowerData[idxLower - 1], lowerData[idxLower + 1]), std::min(lowerData[idxLower - lowerSizeX], lowerData[idxLower + lowerSizeX]));
654 int max = std::max(std::max(lowerData[idxLower - 1], lowerData[idxLower + 1]), std::max(lowerData[idxLower - lowerSizeX], lowerData[idxLower + lowerSizeX]));
655 a_Values[x + z * a_SizeX] = min + ((super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), NoiseZ + 10) / 7) % (max - min + 1));
660 a_Values[x + z * a_SizeX] = lowerData[idxLower];
683 m_Underlying(a_Underlying)
688 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 691 static const int ToBeach[] =
736 size_t lowerSizeX = a_SizeX + 2;
737 size_t lowerSizeZ = a_SizeZ + 2;
740 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);
743 for (
size_t z = 0; z < a_SizeZ; z++)
745 for (
size_t x = 0; x < a_SizeX; x++)
747 int val = lowerValues[x + 1 + (z + 1) * lowerSizeX];
748 int above = lowerValues[x + 1 + z * lowerSizeX];
749 int below = lowerValues[x + 1 + (z + 2) * lowerSizeX];
750 int left = lowerValues[x + (z + 1) * lowerSizeX];
751 int right = lowerValues[x + 2 + (z + 1) * lowerSizeX];
757 val = ToBeach[(val % 128) %
ARRAYCOUNT(ToBeach)];
760 a_Values[x + z * a_SizeX] = val;
787 m_Underlying(a_Underlying)
792 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 794 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
795 for (
size_t z = 0; z < a_SizeZ; z++)
797 for (
size_t x = 0; x < a_SizeX; x++)
799 if (a_Values[x + z * a_SizeX] ==
bgOcean)
801 int rnd = super::m_Noise.IntNoise2DInt(a_MinX + static_cast<int>(x), a_MinZ + static_cast<int>(z)) / 7;
802 if (rnd % 1000 < m_Chance)
830 m_Underlying(a_Underlying)
835 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
838 size_t lowerSizeX = a_SizeX + 2;
839 size_t lowerSizeZ = a_SizeZ + 2;
842 m_Underlying->GetInts(a_MinX, a_MinZ, lowerSizeX, lowerSizeZ, lowerValues);
845 for (
size_t z = 0; z < a_SizeZ; z++)
847 for (
size_t x = 0; x < a_SizeX; x++)
849 int val = lowerValues[x + 1 + (z + 1) * lowerSizeX];
850 int Above = lowerValues[x + 1 + z * lowerSizeX];
851 int Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];
852 int Left = lowerValues[x + (z + 1) * lowerSizeX];
853 int Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];
860 !isDesertCompatible(Above) ||
861 !isDesertCompatible(Below) ||
862 !isDesertCompatible(Left) ||
863 !isDesertCompatible(Right)
886 a_Values[x + z * a_SizeX] = val;
897 switch (a_BiomeGroup)
928 m_Underlying(a_Underlying)
933 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 936 static const int oceanBiomes[] =
942 static const int rareOceanBiomes[] =
947 static const int desertBiomes[] =
952 static const int rareDesertBiomes[] =
957 static const int temperateBiomes[] =
962 static const int rareTemperateBiomes[] =
967 static const int mountainBiomes[] =
972 static const int rareMountainBiomes[] =
977 static const int iceBiomes[] =
983 static const int rareIceBiomes[] =
990 {
static_cast<int>(
ARRAYCOUNT(oceanBiomes)), oceanBiomes},
991 {
static_cast<int>(
ARRAYCOUNT(desertBiomes)), desertBiomes},
992 {
static_cast<int>(
ARRAYCOUNT(temperateBiomes)), temperateBiomes},
993 {
static_cast<int>(
ARRAYCOUNT(mountainBiomes)), mountainBiomes},
994 {
static_cast<int>(
ARRAYCOUNT(iceBiomes)), iceBiomes},
999 {
static_cast<int>(
ARRAYCOUNT(rareOceanBiomes)), rareOceanBiomes},
1000 {
static_cast<int>(
ARRAYCOUNT(rareDesertBiomes)), rareDesertBiomes},
1001 {
static_cast<int>(
ARRAYCOUNT(rareTemperateBiomes)), rareTemperateBiomes},
1002 {
static_cast<int>(
ARRAYCOUNT(rareMountainBiomes)), rareMountainBiomes},
1003 {
static_cast<int>(
ARRAYCOUNT(rareIceBiomes)), rareIceBiomes},
1007 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1011 for (
size_t z = 0; z < a_SizeZ; z++)
1013 size_t IdxZ = z * a_SizeX;
1014 for (
size_t x = 0; x < a_SizeX; x++)
1016 int val = a_Values[x + IdxZ];
1019 biomesInGroups[
static_cast<size_t>(val) %
ARRAYCOUNT(biomesInGroups)];
1020 int rnd = (super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7);
1021 a_Values[x + IdxZ] = Biomes.
Biomes[rnd % Biomes.
Count];
1058 m_Underlying(a_Underlying)
1063 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1066 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1069 for (
size_t z = 0; z < a_SizeZ; z++)
1071 size_t idxZ = z * a_SizeX;
1072 for (
size_t x = 0; x < a_SizeX; x++)
1074 size_t idx = x + idxZ;
1075 if (a_Values[idx] == m_From)
1077 int rnd = super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;
1078 if (rnd % 1000 < m_Chance)
1080 a_Values[idx] = m_To;
1122 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1126 m_Biomes->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1128 m_Rivers->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, riverData);
1131 for (
size_t z = 0; z < a_SizeZ; z++)
1133 size_t idxZ = z * a_SizeX;
1134 for (
size_t x = 0; x < a_SizeX; x++)
1136 size_t idx = x + idxZ;
1142 if (riverData[idx] !=
biRiver)
1181 m_Underlying(a_Underlying)
1186 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1189 size_t lowerSizeX = a_SizeX + 2;
1190 size_t lowerSizeZ = a_SizeZ + 2;
1193 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);
1196 for (
size_t z = 0; z < a_SizeZ; z++)
1198 for (
size_t x = 0; x < a_SizeX; x++)
1200 int Above = lowerValues[x + 1 + z * lowerSizeX];
1201 int Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];
1202 int Left = lowerValues[x + (z + 1) * lowerSizeX];
1203 int Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];
1204 int val = lowerValues[x + 1 + (z + 1) * lowerSizeX];
1206 if ((val == Above) && (val == Below) && (val == Left) && (val == Right))
1214 a_Values[x + z * a_SizeX] = val;
1238 m_ToValue(a_ToValue),
1239 m_Underlying(a_Underlying)
1244 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1247 size_t lowerSizeX = a_SizeX + 2;
1248 size_t lowerSizeZ = a_SizeZ + 2;
1251 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);
1254 for (
size_t z = 0; z < a_SizeZ; z++)
1256 for (
size_t x = 0; x < a_SizeX; x++)
1258 int val = lowerValues[x + 1 + (z + 1) * lowerSizeX];
1261 a_Values[x + z * a_SizeX] = val;
1266 int Above = lowerValues[x + 1 + z * lowerSizeX];
1267 int Below = lowerValues[x + 1 + (z + 2) * lowerSizeX];
1268 int Left = lowerValues[x + (z + 1) * lowerSizeX];
1269 int Right = lowerValues[x + 2 + (z + 1) * lowerSizeX];
1270 int NumOceanNeighbors = 0;
1273 NumOceanNeighbors += 1;
1277 NumOceanNeighbors += 1;
1281 NumOceanNeighbors += 1;
1285 NumOceanNeighbors += 1;
1290 (NumOceanNeighbors >= 3) &&
1291 ((super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7) % 1000 < m_Chance)
1294 a_Values[x + z * a_SizeX] = m_ToValue;
1298 a_Values[x + z * a_SizeX] = val;
1328 m_ToValue(a_ToValue),
1329 m_Underlying(a_Underlying)
1334 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1337 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1340 for (
size_t z = 0; z < a_SizeZ; z++)
1342 for (
size_t x = 0; x < a_SizeX; x++)
1344 int rnd = super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;
1345 if (rnd % 1000 < m_Chance)
1347 a_Values[x + z * a_SizeX] = m_ToValue;
1377 m_Underlying(a_Underlying)
1382 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1385 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1388 for (
size_t z = 0; z < a_SizeZ; z++)
1390 for (
size_t x = 0; x < a_SizeX; x++)
1392 int rnd = super::m_Noise.IntNoise2DInt(static_cast<int>(x) + a_MinX, static_cast<int>(z) + a_MinZ) / 7;
1393 if (rnd % 1000 < m_Chance)
1395 size_t idx = x + a_SizeX * z;
1396 a_Values[idx] = a_Values[idx] |
bgfRare;
1424 m_Alterations(a_Alterations),
1425 m_BaseBiomes(a_BaseBiomes)
1430 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1433 m_BaseBiomes->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1435 m_Alterations->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, alterations);
1438 size_t len = a_SizeX * a_SizeZ;
1439 for (
size_t idx = 0; idx < len; ++idx)
1441 if (alterations[idx] == 0)
1448 int val = a_Values[idx];
1467 a_Values[idx] = val;
1489 m_Underlying(a_Underlying)
1494 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1497 size_t lowerSizeX = a_SizeX + 2;
1498 size_t lowerSizeZ = a_SizeZ + 2;
1501 m_Underlying->GetInts(a_MinX - 1, a_MinZ - 1, lowerSizeX, lowerSizeZ, lowerValues);
1504 for (
size_t z = 0; z < a_SizeZ; z++)
1506 for (
size_t x = 0; x < a_SizeX; x++)
1508 int biome = lowerValues[x + 1 + (z + 1) * lowerSizeX];
1509 int above = lowerValues[x + 1 + z * lowerSizeX];
1510 int below = lowerValues[x + 1 + (z + 2) * lowerSizeX];
1511 int left = lowerValues[x + (z + 1) * lowerSizeX];
1512 int right = lowerValues[x + 2 + (z + 1) * lowerSizeX];
1538 !isMesaCompatible(above) ||
1539 !isMesaCompatible(below) ||
1540 !isMesaCompatible(left) ||
1541 !isMesaCompatible(right)
1553 !isJungleCompatible(above) ||
1554 !isJungleCompatible(below) ||
1555 !isJungleCompatible(left) ||
1556 !isJungleCompatible(right)
1580 a_Values[x + z * a_SizeX] = biome;
1648 m_Underlying(a_Underlying),
1649 m_Alteration(a_Alteration)
1654 virtual void GetInts(
int a_MinX,
int a_MinZ,
size_t a_SizeX,
size_t a_SizeZ,
int *a_Values)
override 1657 m_Underlying->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, a_Values);
1659 m_Alteration->GetInts(a_MinX, a_MinZ, a_SizeX, a_SizeZ, alterations);
1662 size_t len = a_SizeX * a_SizeZ;
1663 for (
size_t idx = 0; idx < len; ++idx)
1665 if (alterations[idx] == 0)
1671 switch (a_Values[idx])
Changes biomes in the parent data into their alternate versions ("M" variants), in such places that h...
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenAvg4Values(Underlying a_Underlying)
Generates a 2D array of random integers in the specified range [0 .
cProtIntGenWithNoise super
std::shared_ptr< cProtIntGen > Underlying
Type of the generic interface used for storing links to the underlying generators.
int m_From
The original value to be replaced.
cProtIntGenWithNoise super
cProtIntGenRndAvg(int a_Seed, int a_AvgChancePct, Underlying a_Underlying)
int IntNoise2DInt(int a_X, int a_Y) const
static const int m_BufferSize
Maximum size of the generated area.
Averages the values of the underlying 3 * 3 neighbors with custom weight.
cProtIntGenWeightAvg(Underlying a_Underlying)
Changes random pixels of the underlying data to the specified value.
int chooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2)
Chooses one of a_Val1 or a_Val2, based on m_Noise and the coordinates for querying the noise...
bool isJungleCompatible(int a_Biome)
Adds an edge between two specifically incompatible biomes, such as mesa and forest.
std::shared_ptr< cProtIntGen > Underlying
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
bool isMesaCompatible(int a_Biome)
cProtIntGenBiomeEdges(int a_Seed, Underlying a_Underlying)
int m_Chance
Chance, in permille, of replacing the value.
cProtIntGenAvgValues(Underlying a_Underlying)
int chooseRandomOne(int a_RndX, int a_RndZ, int a_Val1, int a_Val2, int a_Val3, int a_Val4)
Chooses one of a_ValN, based on m_Noise and the coordinates for querying the noise.
Randomly replaces pixels of one value to another value, using the given chance.
cProtIntGenSetRandomly(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Changes biomes in the parent data into an alternate versions (usually "hill" variants), in such places that have their alterations set.
cProtIntGenMixRivers(Underlying a_Biomes, Underlying a_Rivers)
int m_Chance
Chance, in permille, of changing each pixel into the rare biome group.
Adds a random value in range [-a_HalfRange, +a_HalfRange] to each of the underlying values...
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values)
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
cProtIntGenAlternateBiomes(int a_Seed, Underlying a_Alterations, Underlying a_BaseBiomes)
cProtIntGenAddRnd(int a_Seed, int a_HalfRange, Underlying a_Underlying)
std::shared_ptr< cProtIntGen > Underlying
const int bgOcean
Constants representing the biome group designators.
Underlying m_Underlying
The underlying generator.
Replaces random underlying values with a random value in between the max and min of the neighbors...
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values)=0
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenRareBiomeGroups(int a_Seed, int a_Chance, Underlying a_Underlying)
cProtIntGenBiomes(int a_Seed, Underlying a_Underlying)
Converts land biomes at the edge of an ocean into the respective beach biome.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
bool IsBiomeNoDownfall(EMCSBiome a_Biome)
Returns true if the biome has no downfall - deserts and savannas.
cProtIntGenReplaceRandomly(int a_Seed, int a_From, int a_To, int a_Chance, Underlying a_Underlying)
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Turns biome group indices into real biomes.
cProtIntGenWithNoise(int a_Seed)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
#define PROT_INT_BUFFER_SIZE
Maximum size of the generated area.
cProtIntGenRndBetween(int a_Seed, int a_AvgChancePct, Underlying a_Underlying)
cProtIntGenRndChoice(int a_Seed, int a_ChancePct, int a_Min, int a_Range, Underlying a_Underlying)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
Adds a "rare" flag to random biome groups, based on the given chance.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Replaces random values of the underlying data with random integers in the specified range [Min ...
Turns some of the oceans into the specified biome.
cProtIntGenWithNoise super
virtual ~cProtIntGen()
Force a virtual destructor in all descendants.
cProtIntGenBeaches(Underlying a_Underlying)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenMBiomes(int a_Seed, Underlying a_Alteration, Underlying a_Underlying)
cProtIntGenWithNoise super
Generates the underlying numbers and then randomly changes some ocean group pixels into random land b...
cProtIntGenAddIslands(int a_Seed, int a_Chance, Underlying a_Underlying)
int m_Chance
Chance of each ocean pixel being converted, in permille.
Zooms the underlying value array to twice the size.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
bool IsBiomeVeryCold(EMCSBiome a_Biome)
Returns true if the biome is very cold (has snow on ground everywhere, turns top water to ice...
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenWithNoise super
cProtIntGenZoom(int a_Seed, Underlying a_UnderlyingGen)
cProtIntGenChoice(int a_Seed, int a_Range)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Replaces random underlying values with the average of the neighbors.
bool IsBiomeOcean(int a_Biome)
Returns true if the biome is an ocean biome.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Averages the values of the underlying 2 * 2 neighbors.
cProtIntGenWithNoise super
bool isDesertCompatible(int a_BiomeGroup)
int m_To
The destination value to which to replace.
A filter that adds an edge biome group between two biome groups that need an edge between them...
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
cProtIntGenLandOcean(int a_Seed, int a_Threshold)
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Mixer that joins together finalized biomes and rivers.
int m_Chance
Chance, in permille, of changing the biome.
cProtIntGenRiver(int a_Seed, Underlying a_Underlying)
Decides between the ocean and landmass biomes.
Interface that all the generator classes provide.
Underlying m_UnderlyingGen
cProtIntGenBiomeGroupEdges(Underlying a_Underlying)
int m_ToValue
The value to change the ocean into.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Provides additional cNoise member and its helper functions.
#define ARRAYCOUNT(X)
Evaluates to the number of elements in an array (compile-time!)
Generates a river based on the underlying data.
virtual void GetInts(int a_MinX, int a_MinZ, size_t a_SizeX, size_t a_SizeZ, int *a_Values) override
Generates the array of specified size into a_Values, based on given min coords.
Smoothes out some artifacts generated by the zooming - mostly single-pixel values.
int m_ToValue
The value to which to set the pixel.
int m_Chance
Chance, in permille, of changing each pixel.
cProtIntGenAddToOcean(int a_Seed, int a_Chance, int a_ToValue, Underlying a_Underlying)
Averages the values of the underlying 4 * 4 neighbors.
cProtIntGenSmooth(int a_Seed, Underlying a_Underlying)
Underlying m_Underlying
The underlying int generator.
cProtIntGenWithNoise super
cProtIntGenWithNoise super