Skip to content
Permalink
Browse files

Mapgen v6: Fix mudflow iteration and iterate twice (#8795)

In MapgenV6::flowMud(), the previous implementation of coordinate
inversion caused the 2 inverted mudflow iterations (out of the 3
iterations) to not loop over the area, so only 1 non-inverted
iteration occurred.

Fix this bug but only iterate mudflow twice, as mapgen v6 has only
had 1 iteration for many years. There is now a good balance of 1
non-inverted iteration and 1 inverted iteration.
  • Loading branch information...
paramat committed Aug 15, 2019
1 parent 2db0e93 commit d7c10b66d39adb330612da0da6d9c8ed993fe588
Showing with 12 additions and 12 deletions.
  1. +12 −12 src/mapgen/mapgen_v6.cpp
@@ -773,22 +773,22 @@ void MapgenV6::addMud()

void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
{
// 340ms @cs=8
//TimeTaker timer1("flow mud");

// Iterate a few times
for (s16 k = 0; k < 3; k++) {
// Iterate twice
for (s16 k = 0; k < 2; k++) {
for (s16 z = mudflow_minpos; z <= mudflow_maxpos; z++)
for (s16 x = mudflow_minpos; x <= mudflow_maxpos; x++) {
// Invert coordinates every 2nd iteration
if (k % 2 == 0) {
x = mudflow_maxpos - (x - mudflow_minpos);
z = mudflow_maxpos - (z - mudflow_minpos);
// Node column position
v2s16 p2d;
// Invert coordinates on second iteration to process columns in
// opposite order, to avoid a directional bias.
if (k == 1) {
p2d = v2s16(node_min.X, node_min.Z) + v2s16(
mudflow_maxpos - (x - mudflow_minpos),
mudflow_maxpos - (z - mudflow_minpos));
} else {
p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z);
}

// Node position in 2d
v2s16 p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z);

const v3s16 &em = vm->m_area.getExtent();
u32 i = vm->m_area.index(p2d.X, node_max.Y, p2d.Y);
s16 y = node_max.Y;

0 comments on commit d7c10b6

Please sign in to comment.
You can’t perform that action at this time.