public void TestLeaf() { using (TCODBSP bspSized = new TCODBSP(0, 0, 10, 10)) { bspSized.SplitOnce(false, 6); Assert.IsFalse(bspSized.IsLeaf()); Assert.IsTrue(bspSized.GetLeft().IsLeaf()); Assert.IsTrue(bspSized.GetRight().IsLeaf()); } }
public void IsMapCellInsideNodeTest() { using (TCODBSP bspSized = new TCODBSP(0, 0, 10, 10)) { Assert.IsTrue(bspSized.IsMapCellInsideNode(0, 0)); Assert.IsFalse(bspSized.IsMapCellInsideNode(10, 10)); bspSized.SplitOnce(false, 6); Assert.IsTrue(bspSized.GetLeft().IsMapCellInsideNode(1, 1)); Assert.IsFalse(bspSized.GetRight().IsMapCellInsideNode(1, 1)); } }
public void FatherTest() { using (TCODBSP bspSized = new TCODBSP(0, 0, 10, 10)) { bspSized.SplitOnce(false, 6); TCODBSP father1 = bspSized.GetLeft().GetFather(); TCODBSP father2 = bspSized.GetRight().GetFather(); Assert.IsTrue(bspSized == father1 && father1 == father2 && bspSized == father2); } }
public void LeftRightTest() { using (TCODBSP bspSized = new TCODBSP(0, 0, 10, 10)) { bspSized.SplitOnce(false, 6); TCODBSP left = bspSized.GetLeft(); Assert.AreEqual(left.w, 6); Assert.AreEqual(left.level, 1); TCODBSP right = bspSized.GetRight(); Assert.AreEqual(right.w, 4); Assert.AreEqual(right.level, 1); } }
public void TestRemoveKids() { using (TCODBSP bspSized = new TCODBSP(0, 0, 10, 10)) { bspSized.SplitOnce(false, 6); Assert.IsNotNull(bspSized.GetLeft()); Assert.IsNotNull(bspSized.GetRight()); bspSized.RemoveSons(); Assert.IsNull(bspSized.GetLeft()); Assert.IsNull(bspSized.GetRight()); } }
public void TestWalking() { TCODBSP bspSized = new TCODBSP(0, 0, 10, 10); bspSized.SplitOnce(false, 5); bspSized.GetLeft().SplitOnce(true, 5); bspSized.GetRight().SplitOnce(true, 5); passes = 0; bspSized.TraversePreOrder(new TCODBSPTraversalDelegate(this.TCODBSPTraversal)); Assert.AreEqual(7, passes); passes = 0; bspSized.TraverseInOrder(new TCODBSPTraversalDelegate(this.TCODBSPTraversal)); Assert.AreEqual(7, passes); passes = 0; bspSized.TraverseInvertedOrder(new TCODBSPTraversalDelegate(this.TCODBSPTraversal)); Assert.AreEqual(7, passes); passes = 0; bspSized.TraverseLevelOrder(new TCODBSPTraversalDelegate(this.TCODBSPTraversal)); Assert.AreEqual(7, passes); passes = 0; bspSized.TraversePostOrder(new TCODBSPTraversalDelegate(this.TCODBSPTraversal)); Assert.AreEqual(7, passes); }
// the class building the dungeon from the bsp nodes bool traverse_node(TCODBSP node) { TCODRandom rnd = new TCODRandom(); if (node.IsLeaf()) { // calculate the room size int minx = node.x + 1; int maxx = node.x + node.w - 1; int miny = node.y + 1; int maxy = node.y + node.h - 1; int x, y; if (!roomWalls) { if (minx > 1) minx--; if (miny > 1) miny--; } if (maxx == SAMPLE_SCREEN_WIDTH - 1) maxx--; if (maxy == SAMPLE_SCREEN_HEIGHT - 1) maxy--; if (randomRoom) { minx = rnd.GetRandomInt(minx, maxx - minRoomSize + 1); miny = rnd.GetRandomInt(miny, maxy - minRoomSize + 1); maxx = rnd.GetRandomInt(minx + minRoomSize - 1, maxx); maxy = rnd.GetRandomInt(miny + minRoomSize - 1, maxy); } // resize the node to fit the room // printf("node %dx%d %dx%d => room %dx%d %dx%d\n",node->x,node->y,node->w,node->h,minx,miny,maxx-minx+1,maxy-miny+1); node.x = minx; node.y = miny; node.w = maxx - minx + 1; node.h = maxy - miny + 1; // dig the room for (x = minx; x <= maxx; x++) { for (y = miny; y <= maxy; y++) { bsp_map[x,y] = ' '; } } } else { // printf("lvl %d %dx%d %dx%d\n",node->level, node->x,node->y,node->w,node->h); // resize the node to fit its sons TCODBSP left = node.GetLeft(); TCODBSP right = node.GetRight(); node.x = System.Math.Min(left.x, right.x); node.y = System.Math.Min(left.y, right.y); node.w = System.Math.Max(left.x + left.w, right.x + right.w) - node.x; node.h = System.Math.Max(left.y + left.h, right.y + right.h) - node.y; // create a corridor between the two lower nodes if (node.horizontal) { // vertical corridor if (left.x + left.w - 1 < right.x || right.x + right.w - 1 < left.x) { // no overlapping zone. we need a Z shaped corridor int x1 = rnd.GetRandomInt(left.x, left.x + left.w - 1); int x2 = rnd.GetRandomInt(right.x, right.x + right.w - 1); int y = rnd.GetRandomInt(left.y + left.h, right.y); vline_up(bsp_map, x1, y - 1); hline(bsp_map, x1, y, x2); vline_down(bsp_map, x2, y + 1); } else { // straight vertical corridor int minx = System.Math.Max(left.x, right.x); int maxx = System.Math.Min(left.x + left.w - 1, right.x + right.w - 1); int x = rnd.GetRandomInt(minx, maxx); vline_down(bsp_map, x, right.y); vline_up(bsp_map, x, right.y - 1); } } else { // horizontal corridor if (left.y + left.h - 1 < right.y || right.y + right.h - 1 < left.y) { // no overlapping zone. we need a Z shaped corridor int y1 = rnd.GetRandomInt(left.y, left.y + left.h - 1); int y2 = rnd.GetRandomInt(right.y, right.y + right.h - 1); int x = rnd.GetRandomInt(left.x + left.w, right.x); hline_left(bsp_map, x - 1, y1); vline(bsp_map, x, y1, y2); hline_right(bsp_map, x + 1, y2); } else { // straight horizontal corridor int miny = System.Math.Max(left.y, right.y); int maxy = System.Math.Min(left.y + left.h - 1, right.y + right.h - 1); int y = rnd.GetRandomInt(miny, maxy); hline_left(bsp_map, right.x - 1, y); hline_right(bsp_map, right.x, y); } } } return true; }