Dungeons: Support nodebox stairs wider than 1 node
authorparamat <mat.gregory@virginmedia.com>
Sat, 21 Jan 2017 06:30:33 +0000 (06:30 +0000)
committerparamat <mat.gregory@virginmedia.com>
Mon, 23 Jan 2017 07:39:50 +0000 (07:39 +0000)
Previously, code did not support stair nodeboxes in corridors wider
than 1 node.
Make stair nodeboxes full width even in corridors with different
widths in X and Z directions.

src/dungeongen.cpp

index 78573da04c4adb36a1130e4b88b009741da9502e..5dc87f8b01e3e2b65714ea29db0e795405441145 100644 (file)
@@ -437,14 +437,22 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
                                        // rotate face 180 deg if
                                        // making stairs backwards
                                        int facedir = dir_to_facedir(dir * make_stairs);
-
-                                       u32 vi = vm->m_area.index(p.X - dir.X, p.Y - 1, p.Z - dir.Z);
-                                       if (vm->m_data[vi].getContent() == dp.c_wall)
-                                               vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
-
-                                       vi = vm->m_area.index(p.X, p.Y, p.Z);
-                                       if (vm->m_data[vi].getContent() == dp.c_wall)
-                                               vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
+                                       v3s16 ps = p;
+                                       u16 stair_width = (dir.Z != 0) ? dp.holesize.X : dp.holesize.Z;
+                                       // Stair width direction vector
+                                       v3s16 swv = (dir.Z != 0) ? v3s16(1, 0, 0) : v3s16(0, 0, 1);
+
+                                       for (u16 st = 0; st < stair_width; st++) {
+                                               u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z);
+                                               if (vm->m_data[vi].getContent() == dp.c_wall)
+                                                       vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
+
+                                               vi = vm->m_area.index(ps.X, ps.Y, ps.Z);
+                                               if (vm->m_data[vi].getContent() == dp.c_wall)
+                                                       vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
+
+                                               ps += swv;
+                                       }
                                }
                        } else {
                                makeFill(p + v3s16(-1, -1, -1),