- RepairTools work for structures that are outside the submarine

- Ruins are visible in sonar
- Fixed ruin generation algorithm occasionally creating too narrow rooms and placing corridors so that they're blocked by corners of a room
- Fix for wall textures being misaligned for map cells with no physics body
This commit is contained in:
Regalis
2016-05-03 00:14:52 +03:00
parent 2c76a6ad3c
commit 09e8b8b9c6
6 changed files with 128 additions and 87 deletions
+3 -2
View File
@@ -42,11 +42,12 @@ namespace Barotrauma.RuinGeneration
this.rect = rect;
}
public void Split(float minDivRatio, float verticalProbability = 0.5f)
public void Split(float minDivRatio, float verticalProbability = 0.5f, int minWidth = 200)
{
subRooms = new BTRoom[2];
if (Rand.Range(0.0f, 1.0f, false) < verticalProbability)
if (Rand.Range(0.0f, 1.0f, false) < verticalProbability &&
rect.Width * minDivRatio >= minWidth)
{
SplitVertical(minDivRatio);
}
@@ -163,16 +163,16 @@ namespace Barotrauma.RuinGeneration
//if (Math.Min(leaves1[i].Rect.Bottom, leaves2[i].Rect.Bottom) - Math.Max(leaves1[i].Rect.Y, leaves2[j].Rect.Y) < width) continue;
if (leaves1[i].Rect.Y > leaves2[j].Rect.Bottom) continue;
if (leaves1[i].Rect.Bottom < leaves2[j].Rect.Y) continue;
if (leaves1[i].Rect.Y > leaves2[j].Rect.Bottom-width) continue;
if (leaves1[i].Rect.Bottom < leaves2[j].Rect.Y+width) continue;
}
else
{
//if (Math.Min(leaves1[i].Rect.Right, leaves2[i].Rect.Right) - Math.Max(leaves1[i].Rect.X, leaves2[j].Rect.X) < width) continue;
if (leaves1[i].Rect.X > leaves2[j].Rect.Right) continue;
if (leaves1[i].Rect.Right < leaves2[j].Rect.X) continue;
if (leaves1[i].Rect.X > leaves2[j].Rect.Right-width) continue;
if (leaves1[i].Rect.Right < leaves2[j].Rect.X+width) continue;
}
@@ -28,6 +28,11 @@ namespace Barotrauma.RuinGeneration
protected set;
}
public Vector2 Center
{
get { return rect.Center.ToVector2(); }
}
public List<Line> Walls;
public virtual void CreateWalls() { }
@@ -170,6 +175,11 @@ namespace Barotrauma.RuinGeneration
get { return allShapes; }
}
public List<Line> Walls
{
get { return walls; }
}
public Rectangle Area
{
get;
@@ -207,7 +217,7 @@ namespace Barotrauma.RuinGeneration
for (int i = 0; i < iterations; i++)
{
rooms.ForEach(l => l.Split(0.3f, verticalProbability));
rooms.ForEach(l => l.Split(0.3f, verticalProbability, 300));
rooms = baseRoom.GetLeaves();
}
@@ -340,6 +350,11 @@ namespace Barotrauma.RuinGeneration
(int)((wall.B.X - wall.A.X) + radius*2.0f),
(int)((wall.B.Y - wall.A.Y) + radius*2.0f));
if (wall.A.Y == wall.B.Y)
{
rect.Inflate(-32, 0);
}
var structure = new Structure(rect, structurePrefab.Prefab as StructurePrefab, null);
structure.MoveWithLevel = true;
structure.SetCollisionCategory(Physics.CollisionLevel);