Level cells that overlap with ruins are removed during level generation (instead of just disabling collisions with them), background sprites can spawn on ruin walls

This commit is contained in:
Regalis
2017-03-23 18:13:28 +02:00
parent 885a8c610c
commit e9e4e5f9d3
4 changed files with 68 additions and 41 deletions
@@ -133,46 +133,67 @@ namespace Barotrauma
if (!prefab.SpawnOnWalls) return randomPos; if (!prefab.SpawnOnWalls) return randomPos;
var cells = level.GetCells(randomPos);
if (!cells.Any()) return null;
VoronoiCell cell = cells[Rand.Int(cells.Count, false)];
List<GraphEdge> edges = new List<GraphEdge>(); List<GraphEdge> edges = new List<GraphEdge>();
List<Vector2> normals = new List<Vector2>(); List<Vector2> normals = new List<Vector2>();
foreach (GraphEdge edge in cell.edges)
var cells = level.GetCells(randomPos);
if (cells.Any())
{ {
if (!edge.isSolid || edge.OutsideLevel) continue; VoronoiCell cell = cells[Rand.Int(cells.Count, false)];
Vector2 normal = edge.GetNormal(cell); foreach (GraphEdge edge in cell.edges)
{
if (!edge.isSolid || edge.OutsideLevel) continue;
if (prefab.Alignment.HasFlag(Alignment.Bottom) && normal.Y < -0.5f) Vector2 normal = edge.GetNormal(cell);
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Top) && normal.Y > 0.5f)
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Left) && normal.X < -0.5f)
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Right) && normal.X > 0.5f)
{
edges.Add(edge);
}
else
{
continue;
}
normals.Add(normal); if (prefab.Alignment.HasFlag(Alignment.Bottom) && normal.Y < -0.5f)
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Top) && normal.Y > 0.5f)
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Left) && normal.X < -0.5f)
{
edges.Add(edge);
}
else if (prefab.Alignment.HasFlag(Alignment.Right) && normal.X > 0.5f)
{
edges.Add(edge);
}
else
{
continue;
}
normals.Add(normal);
}
}
foreach (RuinGeneration.Ruin ruin in Level.Loaded.Ruins)
{
Rectangle expandedArea = ruin.Area;
expandedArea.Inflate(ruin.Area.Width, ruin.Area.Height);
if (!expandedArea.Contains(randomPos)) continue;
foreach (var ruinShape in ruin.RuinShapes)
{
foreach (var wall in ruinShape.Walls)
{
if (!prefab.Alignment.HasFlag(ruinShape.GetLineAlignment(wall))) continue;
edges.Add(new GraphEdge(wall.A, wall.B));
normals.Add((wall.A + wall.B) / 2.0f - ruinShape.Center);
}
}
} }
if (!edges.Any()) return null; if (!edges.Any()) return null;
int index = Rand.Int(edges.Count,false); int index = Rand.Int(edges.Count, false);
closestEdge = edges[index]; closestEdge = edges[index];
edgeNormal = normals[index]; edgeNormal = normals[index];
+7 -1
View File
@@ -732,7 +732,13 @@ namespace Barotrauma
{ {
if (MathUtils.GetLineRectangleIntersection(e.point1, e.point2, ruinShape.Rect) != null) if (MathUtils.GetLineRectangleIntersection(e.point1, e.point2, ruinShape.Rect) != null)
{ {
cell.CellType = CellType.Empty; cell.CellType = CellType.Removed;
int x = (int)Math.Floor(cell.Center.X / GridCellSize);
int y = (int)Math.Floor(cell.Center.Y / GridCellSize);
cellGrid[x, y].Remove(cell);
cells.Remove(cell);
break; break;
} }
} }
+1 -3
View File
@@ -538,10 +538,8 @@ namespace Voronoi2
private void pushGraphEdge( Site leftSite, Site rightSite, Vector2 point1, Vector2 point2 ) private void pushGraphEdge( Site leftSite, Site rightSite, Vector2 point1, Vector2 point2 )
{ {
GraphEdge newEdge = new GraphEdge (); GraphEdge newEdge = new GraphEdge(point1, point2);
allEdges.Add ( newEdge ); allEdges.Add ( newEdge );
newEdge.point1 = point1;
newEdge.point2 = point2;
newEdge.site1 = leftSite; newEdge.site1 = leftSite;
newEdge.site2 = rightSite; newEdge.site2 = rightSite;
@@ -155,18 +155,14 @@ namespace Voronoi2
for (int i = 1; i < vertices.Length; i++ ) for (int i = 1; i < vertices.Length; i++ )
{ {
GraphEdge ge = new GraphEdge(); GraphEdge ge = new GraphEdge(vertices[i-1], vertices[i]);
ge.point1 = vertices[i-1];
ge.point2 = vertices[i];
System.Diagnostics.Debug.Assert(ge.point1 != ge.point2); System.Diagnostics.Debug.Assert(ge.point1 != ge.point2);
edges.Add(ge); edges.Add(ge);
} }
GraphEdge lastEdge = new GraphEdge(); GraphEdge lastEdge = new GraphEdge(vertices[0], vertices[vertices.Length-1]);
lastEdge.point1 = vertices[0];
lastEdge.point2 = vertices[vertices.Length-1];
edges.Add(lastEdge); edges.Add(lastEdge);
@@ -208,6 +204,12 @@ namespace Voronoi2
get { return (point1 + point2) / 2.0f; } get { return (point1 + point2) / 2.0f; }
} }
public GraphEdge(Vector2 point1, Vector2 point2)
{
this.point1 = point1;
this.point2 = point2;
}
public VoronoiCell AdjacentCell(VoronoiCell cell) public VoronoiCell AdjacentCell(VoronoiCell cell)
{ {
if (cell1==cell) if (cell1==cell)