private bool IsStable(Vector2i pos, Vector2i ignorePos, int horizontal, int vertical, out Vector2i? collapse) { const int maxHorizontal = 10; const int maxVertical = 50; collapse = null; if (pos.X < 0 || pos.Y < 0 || pos.X >= _width || pos.Y >= _height) return false; if (_tiles[pos.X, pos.Y] == Tile.None) return false; if (_tiles[pos.X, pos.Y] == Tile.Floor) return true; if (horizontal >= maxHorizontal) return false; var effectiveMaxVertical = (float)Math.Ceiling(maxVertical * (2 - horizontal / (float)maxHorizontal)); if (vertical >= effectiveMaxVertical) { Console.WriteLine("hi"); collapse = pos; return true; } var newPos = pos; newPos.Y += 1; if (!newPos.EqualTo(ignorePos) && IsStable(newPos, pos, horizontal, vertical + 1)) return true; Vector2i? leftCollapse = null; Vector2i? rightCollapse = null; newPos = pos; newPos.X -= 1; if (!newPos.EqualTo(ignorePos) && IsStable(newPos, pos, horizontal + 1, vertical, out leftCollapse)) return true; newPos = pos; newPos.X += 1; if (!newPos.EqualTo(ignorePos) && IsStable(newPos, pos, horizontal + 1, vertical, out rightCollapse)) return true; if (leftCollapse.HasValue) Collapse(leftCollapse.Value); if (rightCollapse.HasValue) Collapse(rightCollapse.Value); return false; }