diff --git a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj b/Barotrauma/BarotraumaClient/BarotraumaClient.csproj
index 9fa825506..f133ac605 100644
--- a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj
+++ b/Barotrauma/BarotraumaClient/BarotraumaClient.csproj
@@ -158,7 +158,7 @@
-
+
diff --git a/Barotrauma/BarotraumaClient/Source/Camera.cs b/Barotrauma/BarotraumaClient/Source/Camera.cs
index 483e73790..487bb3b87 100644
--- a/Barotrauma/BarotraumaClient/Source/Camera.cs
+++ b/Barotrauma/BarotraumaClient/Source/Camera.cs
@@ -128,7 +128,7 @@ namespace Barotrauma
}
- public void UpdateTransform(bool interpolate = true, bool clampPos = false)
+ public void UpdateTransform(bool interpolate = true)
{
Vector2 interpolatedPosition = interpolate ? Timing.Interpolate(prevPosition, position) : position;
@@ -136,20 +136,7 @@ namespace Barotrauma
worldView.X = (int)(interpolatedPosition.X - worldView.Width / 2.0);
worldView.Y = (int)(interpolatedPosition.Y + worldView.Height / 2.0);
-
- if (Level.Loaded != null && clampPos)
- {
- float maxY = Level.Loaded.Size.Y + 100;
-
- position.Y -= Math.Max(worldView.Y - maxY, 0.0f);
- interpolatedPosition.Y -= Math.Max(worldView.Y - maxY, 0.0f);
-
- position.Y = Math.Max(position.Y, (int)Level.MaxCameraDepth);
- interpolatedPosition.Y = Math.Max(interpolatedPosition.Y, (int)Level.MaxCameraDepth);
- worldView.Y = MathHelper.Clamp(worldView.Y, (int)Level.MaxCameraDepth, (int)maxY);
- }
-
-
+
transform = Matrix.CreateTranslation(
new Vector3(-interpolatedPosition.X, interpolatedPosition.Y, 0)) *
Matrix.CreateScale(new Vector3(interpolatedZoom, interpolatedZoom, 1)) *
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelRenderer.cs b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelRenderer.cs
index 6fa8abd97..4cd7d27b8 100644
--- a/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelRenderer.cs
+++ b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelRenderer.cs
@@ -40,7 +40,7 @@ namespace Barotrauma
wallEdgeEffect = new BasicEffect(GameMain.Instance.GraphicsDevice)
{
DiffuseColor = new Vector3(0.8f, 0.8f, 0.8f),
- VertexColorEnabled = false,
+ VertexColorEnabled = true,
TextureEnabled = true,
Texture = shaftTexture
};
@@ -51,7 +51,7 @@ namespace Barotrauma
{
wallCenterEffect = new BasicEffect(GameMain.Instance.GraphicsDevice)
{
- VertexColorEnabled = false,
+ VertexColorEnabled = true,
TextureEnabled = true,
Texture = backgroundTop.Texture
};
@@ -84,15 +84,37 @@ namespace Barotrauma
backgroundSpriteManager.Update(deltaTime);
}
- public void SetWallVertices(VertexPositionTexture[] vertices)
+ public static VertexPositionColorTexture[] GetColoredVertices(VertexPositionTexture[] vertices, Color color)
{
- wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionTexture.VertexDeclaration, vertices.Length,BufferUsage.WriteOnly);
+ VertexPositionColorTexture[] verts = new VertexPositionColorTexture[vertices.Length];
+ for (int i = 0; i < vertices.Length; i++)
+ {
+ verts[i] = new VertexPositionColorTexture(vertices[i].Position, color, vertices[i].TextureCoordinate);
+ }
+ return verts;
+ }
+
+ public void SetWallVertices(VertexPositionTexture[] vertices, Color color)
+ {
+ wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ wallVertices.SetData(GetColoredVertices(vertices, color));
+ }
+
+ public void SetBodyVertices(VertexPositionTexture[] vertices, Color color)
+ {
+ bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ bodyVertices.SetData(GetColoredVertices(vertices, color));
+ }
+
+ public void SetWallVertices(VertexPositionColorTexture[] vertices)
+ {
+ wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length,BufferUsage.WriteOnly);
wallVertices.SetData(vertices);
}
- public void SetBodyVertices(VertexPositionTexture[] vertices)
+ public void SetBodyVertices(VertexPositionColorTexture[] vertices)
{
- bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
bodyVertices.SetData(vertices);
}
@@ -188,48 +210,94 @@ namespace Barotrauma
GUI.DrawRectangle(spriteBatch, new Vector2(point.X, -point.Y), new Vector2(10.0f, 10.0f), Color.White, true);
}
}
-
}
-
Vector2 pos = new Vector2(0.0f, -level.Size.Y);
- if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y - 1024) return;
+ if (GameMain.GameScreen.Cam.WorldView.Y >= -pos.Y - 1024)
+ {
+ pos.X = GameMain.GameScreen.Cam.WorldView.X -1024;
+ int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width / 1024 + 4.0f) * 1024);
- pos.X = GameMain.GameScreen.Cam.WorldView.X -1024;
+ GUI.DrawRectangle(spriteBatch,new Rectangle(
+ (int)(MathUtils.Round(pos.X, 1024)),
+ -GameMain.GameScreen.Cam.WorldView.Y,
+ width,
+ (int)(GameMain.GameScreen.Cam.WorldView.Y + pos.Y) - 30),
+ Color.Black, true);
- int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width / 1024 + 4.0f) * 1024);
+ spriteBatch.Draw(shaftTexture,
+ new Rectangle((int)(MathUtils.Round(pos.X, 1024)), (int)pos.Y-1000, width, 1024),
+ new Rectangle(0, 0, width, -1024),
+ level.BackgroundColor, 0.0f,
+ Vector2.Zero,
+ SpriteEffects.None, 0.0f);
+ }
- GUI.DrawRectangle(spriteBatch,new Rectangle((int)(MathUtils.Round(pos.X, 1024)), (int)-GameMain.GameScreen.Cam.WorldView.Y, width, (int)(GameMain.GameScreen.Cam.WorldView.Y + pos.Y) - 30),Color.Black, true);
- spriteBatch.Draw(shaftTexture,
- new Rectangle((int)(MathUtils.Round(pos.X, 1024)), (int)pos.Y-1000, width, 1024),
- new Rectangle(0, 0, width, -1024),
- level.BackgroundColor, 0.0f,
- Vector2.Zero,
- SpriteEffects.None, 0.0f);
+ if (GameMain.GameScreen.Cam.WorldView.Y - GameMain.GameScreen.Cam.WorldView.Height < level.SeaFloorTopPos + 1024)
+ {
+ pos = new Vector2(GameMain.GameScreen.Cam.WorldView.X - 1024, -level.BottomPos);
+ int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width / 1024 + 4.0f) * 1024);
+
+ GUI.DrawRectangle(spriteBatch, new Rectangle(
+ (int)(MathUtils.Round(pos.X, 1024)),
+ (int)-(level.BottomPos - 30),
+ width,
+ (int)(level.BottomPos - (GameMain.GameScreen.Cam.WorldView.Y - GameMain.GameScreen.Cam.WorldView.Height))),
+ Color.Black, true);
+
+ spriteBatch.Draw(shaftTexture,
+ new Rectangle((int)(MathUtils.Round(pos.X, 1024)), (int)-level.BottomPos, width, 1024),
+ new Rectangle(0, 0, width, -1024),
+ level.BackgroundColor, 0.0f,
+ Vector2.Zero,
+ SpriteEffects.FlipVertically, 0.0f);
+ }
}
public void RenderWalls(GraphicsDevice graphicsDevice, Camera cam)
{
if (wallVertices == null) return;
-
+
wallEdgeEffect.World = cam.ShaderTransform
* Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 100) * 0.5f;
wallCenterEffect.World = wallEdgeEffect.World;
//render the solid center of the wall cells
graphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
- graphicsDevice.SetVertexBuffer(bodyVertices);
wallCenterEffect.CurrentTechnique.Passes[0].Apply();
-
- graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(bodyVertices.VertexCount / 3.0f));
-
+ if (GameMain.GameScreen.Cam.WorldView.Y - GameMain.GameScreen.Cam.WorldView.Height < level.SeaFloorTopPos + 1024)
+ {
+ foreach (LevelWall wall in level.WrappingWalls)
+ {
+ graphicsDevice.SetVertexBuffer(wall.BodyVertices);
+ graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(wall.BodyVertices.VertexCount / 3.0f));
+ }
+ }
+ else
+ {
+ graphicsDevice.SetVertexBuffer(bodyVertices);
+ graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(bodyVertices.VertexCount / 3.0f));
+ }
+
//render the edges of the wall cells
- graphicsDevice.SetVertexBuffer(wallVertices);
wallEdgeEffect.CurrentTechnique.Passes[0].Apply();
- graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(wallVertices.VertexCount / 3.0f));
+
+ if (GameMain.GameScreen.Cam.WorldView.Y - GameMain.GameScreen.Cam.WorldView.Height < level.SeaFloorTopPos + 1024)
+ {
+ foreach (LevelWall wall in level.WrappingWalls)
+ {
+ graphicsDevice.SetVertexBuffer(wall.WallVertices);
+ graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(wall.WallVertices.VertexCount / 3.0f));
+ }
+ }
+ else
+ {
+ graphicsDevice.SetVertexBuffer(wallVertices);
+ graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(wallVertices.VertexCount / 3.0f));
+ }
}
public void Dispose()
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelWall.cs b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelWall.cs
new file mode 100644
index 000000000..d27374c35
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelWall.cs
@@ -0,0 +1,47 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+
+namespace Barotrauma
+{
+ partial class LevelWall : IDisposable
+ {
+ private VertexBuffer wallVertices, bodyVertices;
+
+ public VertexBuffer WallVertices
+ {
+ get { return wallVertices; }
+ }
+
+ public VertexBuffer BodyVertices
+ {
+ get { return bodyVertices; }
+ }
+
+ public void SetWallVertices(VertexPositionTexture[] vertices, Color color)
+ {
+ wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ wallVertices.SetData(LevelRenderer.GetColoredVertices(vertices, color));
+ }
+
+ public void SetBodyVertices(VertexPositionTexture[] vertices, Color color)
+ {
+ bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ bodyVertices.SetData(LevelRenderer.GetColoredVertices(vertices, color));
+ }
+
+ public void SetWallVertices(VertexPositionColorTexture[] vertices)
+ {
+ if (wallVertices != null && !wallVertices.IsDisposed) wallVertices.Dispose();
+ wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ wallVertices.SetData(vertices);
+ }
+
+ public void SetBodyVertices(VertexPositionColorTexture[] vertices)
+ {
+ if (bodyVertices != null && !bodyVertices.IsDisposed) bodyVertices.Dispose();
+ bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
+ bodyVertices.SetData(vertices);
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Levels/WrappingWall.cs b/Barotrauma/BarotraumaClient/Source/Map/Levels/WrappingWall.cs
deleted file mode 100644
index 9070c66cb..000000000
--- a/Barotrauma/BarotraumaClient/Source/Map/Levels/WrappingWall.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Microsoft.Xna.Framework.Graphics;
-using System;
-
-namespace Barotrauma
-{
- partial class WrappingWall : IDisposable
- {
- private VertexBuffer wallVertices, bodyVertices;
-
- public VertexBuffer WallVertices
- {
- get { return wallVertices; }
- }
-
- public VertexBuffer BodyVertices
- {
- get { return bodyVertices; }
- }
-
- public void SetWallVertices(VertexPositionTexture[] vertices)
- {
- wallVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
- wallVertices.SetData(vertices);
- }
-
- public void SetBodyVertices(VertexPositionColor[] vertices)
- {
- bodyVertices = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
- bodyVertices.SetData(vertices);
- }
- }
-}
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs
index 8d3d610db..41e4055dc 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs
@@ -68,7 +68,7 @@ namespace Barotrauma
public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch)
{
- cam.UpdateTransform(true, !GameMain.DebugDraw);
+ cam.UpdateTransform(true);
Submarine.CullEntities(cam);
DrawMap(graphics, spriteBatch);
diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
index 845907934..e44727471 100644
--- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
+++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
@@ -1442,7 +1442,7 @@
-
+
diff --git a/Barotrauma/BarotraumaShared/Content/Map/LevelGenerationParameters.xml b/Barotrauma/BarotraumaShared/Content/Map/LevelGenerationParameters.xml
index add72c487..911976c9c 100644
--- a/Barotrauma/BarotraumaShared/Content/Map/LevelGenerationParameters.xml
+++ b/Barotrauma/BarotraumaShared/Content/Map/LevelGenerationParameters.xml
@@ -12,6 +12,11 @@
RuinCount="1"
BottomHoleProbability="0.4"
BackgroundSpriteAmount="1000"
+ MountainCountMin="0"
+ MountainCountMax="3"
+ SeaFloorDepth="-300000.0"
+ MountainHeightMin="10000"
+ MountainHeightMax="20000"
/>
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs
index 56f8382fe..3b994e415 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs
@@ -3,7 +3,6 @@ using FarseerPhysics;
using FarseerPhysics.Dynamics;
using FarseerPhysics.Factories;
using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -16,7 +15,6 @@ namespace Barotrauma
{
//all entities are disabled after they reach this depth
public const float MaxEntityDepth = -300000.0f;
- public const float MaxCameraDepth = -290000.0f;
public const float ShaftHeight = 1000.0f;
@@ -53,7 +51,7 @@ namespace Barotrauma
public const int GridCellSize = 2000;
private List[,] cellGrid;
- //private WrappingWall[,] wrappingWalls;
+ private LevelWall[] extraWalls;
//private float shaftHeight;
@@ -76,6 +74,7 @@ namespace Barotrauma
private LevelGenerationParams generationParams;
+
public Vector2 StartPosition
{
get { return startPosition; }
@@ -91,15 +90,27 @@ namespace Barotrauma
get { return endPosition; }
}
+ public float BottomPos
+ {
+ get;
+ private set;
+ }
+
+ public float SeaFloorTopPos
+ {
+ get;
+ private set;
+ }
+
public List Ruins
{
get { return ruins; }
}
- //public WrappingWall[,] WrappingWalls
- //{
- // get { return wrappingWalls; }
- //}
+ public LevelWall[] WrappingWalls
+ {
+ get { return extraWalls; }
+ }
public string Seed
{
@@ -112,12 +123,19 @@ namespace Barotrauma
private set;
}
- public Body ShaftBody
+ public Body TopBarrier
{
get;
private set;
}
+ public Body BottomBarrier
+ {
+ get;
+ private set;
+ }
+
+
public LevelGenerationParams GenerationParams
{
get { return generationParams; }
@@ -446,24 +464,23 @@ namespace Barotrauma
bodies = CaveGenerator.GeneratePolygons(cellsWithBody, out triangles);
#if CLIENT
- List bodyVertices = CaveGenerator.GenerateRenderVerticeList(triangles);
-
- renderer.SetBodyVertices(bodyVertices.ToArray());
- renderer.SetWallVertices(CaveGenerator.GenerateWallShapes(cells));
+ renderer.SetBodyVertices(CaveGenerator.GenerateRenderVerticeList(triangles).ToArray(), Color.White);
+ renderer.SetWallVertices(CaveGenerator.GenerateWallShapes(cells), Color.White);
renderer.PlaceSprites(generationParams.BackgroundSpriteAmount);
#endif
- ShaftBody = BodyFactory.CreateEdge(GameMain.World,
+ TopBarrier = BodyFactory.CreateEdge(GameMain.World,
ConvertUnits.ToSimUnits(new Vector2(borders.X, 0)),
ConvertUnits.ToSimUnits(new Vector2(borders.Right, 0)));
- ShaftBody.SetTransform(ConvertUnits.ToSimUnits(new Vector2(0.0f, borders.Height)), 0.0f);
-
- ShaftBody.BodyType = BodyType.Static;
- ShaftBody.CollisionCategories = Physics.CollisionLevel;
+ TopBarrier.SetTransform(ConvertUnits.ToSimUnits(new Vector2(0.0f, borders.Height)), 0.0f);
+ TopBarrier.BodyType = BodyType.Static;
+ TopBarrier.CollisionCategories = Physics.CollisionLevel;
- bodies.Add(ShaftBody);
+ bodies.Add(TopBarrier);
+
+ GenerateSeaFloor();
foreach (VoronoiCell cell in cells)
{
@@ -534,21 +551,9 @@ namespace Barotrauma
var newWaypoint = new WayPoint(new Rectangle((int)pathCells[0].Center.X, borders.Height, 10, 10), null);
newWaypoint.MoveWithLevel = true;
wayPoints.Add(newWaypoint);
-
- //WayPoint prevWaypoint = newWaypoint;
-
+
for (int i = 0; i < pathCells.Count; i++)
{
- ////clean "loops" from the path
- //for (int n = 0; n < i; n++)
- //{
- // if (pathCells[n] != pathCells[i]) continue;
-
- // pathCells.RemoveRange(n + 1, i - n);
- // break;
- //}
- //if (i >= pathCells.Count) break;
-
pathCells[i].CellType = CellType.Path;
newWaypoint = new WayPoint(new Rectangle((int)pathCells[i].Center.X, (int)pathCells[i].Center.Y, 10, 10), null);
@@ -567,8 +572,6 @@ namespace Barotrauma
break;
}
-
- //prevWaypoint = newWaypoint;
}
newWaypoint = new WayPoint(new Rectangle((int)pathCells[pathCells.Count - 1].Center.X, borders.Height, 10, 10), null);
@@ -666,9 +669,57 @@ namespace Barotrauma
return newCells;
}
+ private void GenerateSeaFloor()
+ {
+ BottomPos = generationParams.SeaFloorDepth;
+ SeaFloorTopPos = BottomPos;
+
+ List bottomPositions = new List();
+ bottomPositions.Add(new Vector2(0, BottomPos));
+
+ int mountainCount = Rand.Range(generationParams.MountainCountMin, generationParams.MountainCountMax, Rand.RandSync.Server);
+ for (int i = 0; i < mountainCount; i++)
+ {
+ bottomPositions.Add(
+ new Vector2(Size.X / (mountainCount + 1) * (i + 1),
+ BottomPos + Rand.Range(generationParams.MountainHeightMin, generationParams.MountainHeightMax, Rand.RandSync.Server)));
+ }
+ bottomPositions.Add(new Vector2(Size.X, BottomPos));
+
+
+ float minVertexInterval = 5000.0f;
+ float currInverval = Size.X / 2.0f;
+ while (currInverval > minVertexInterval)
+ {
+ for (int i = 0; i < bottomPositions.Count - 1; i++)
+ {
+ bottomPositions.Insert(i+1,
+ (bottomPositions[i] + bottomPositions[i + 1]) / 2.0f +
+ Vector2.UnitY * Rand.Range(0.0f, generationParams.SeaFloorVariance, Rand.RandSync.Server));
+
+ i++;
+ }
+
+ currInverval /= 2.0f;
+ }
+
+ SeaFloorTopPos = bottomPositions.Max(p => p.Y);
+
+ extraWalls = new LevelWall[] { new LevelWall(bottomPositions, new Vector2(0.0f, -2000.0f), backgroundColor) };
+
+ BottomBarrier = BodyFactory.CreateEdge(GameMain.World,
+ ConvertUnits.ToSimUnits(new Vector2(borders.X, 0)),
+ ConvertUnits.ToSimUnits(new Vector2(borders.Right, 0)));
+
+ BottomBarrier.SetTransform(ConvertUnits.ToSimUnits(new Vector2(0.0f, BottomPos)), 0.0f);
+ BottomBarrier.BodyType = BodyType.Static;
+ BottomBarrier.CollisionCategories = Physics.CollisionLevel;
+
+ bodies.Add(BottomBarrier);
+ }
+
private void GenerateRuin(List mainPath)
{
-
Vector2 ruinSize = new Vector2(Rand.Range(5000.0f, 8000.0f, Rand.RandSync.Server), Rand.Range(5000.0f, 8000.0f, Rand.RandSync.Server));
float ruinRadius = Math.Max(ruinSize.X, ruinSize.Y) * 0.5f;
@@ -893,20 +944,16 @@ namespace Barotrauma
ruins = null;
}
- /*
- if (wrappingWalls!=null)
+
+ if (extraWalls != null)
{
- for (int side = 0; side < 2; side++)
+ foreach (LevelWall w in extraWalls)
{
- for (int i = 0; i < 2; i++)
- {
- if (wrappingWalls[side, i] != null) wrappingWalls[side, i].Dispose();
- }
+ w.Dispose();
}
- wrappingWalls = null;
- }*/
-
+ extraWalls = null;
+ }
cells = null;
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelGenerationParams.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelGenerationParams.cs
index 4aa881f80..05b66376a 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelGenerationParams.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelGenerationParams.cs
@@ -36,6 +36,15 @@ namespace Barotrauma
//if 1.0f, the bottom will be completely open
private float bottomHoleProbability;
+ //the y-position of the ocean floor (= the position from which the bottom formations extend upwards)
+ private float seaFloorBaseDepth;
+ //how much random variance there can be in the height of the formations
+ private float seaFloorVariance;
+
+ private int mountainCountMin, mountainCountMax;
+
+ private float mountainHeightMin, mountainHeightMax;
+
private int ruinCount;
public Color BackgroundColor
@@ -74,9 +83,10 @@ namespace Barotrauma
public Vector2 VoronoiSiteInterval
{
get { return voronoiSiteInterval; }
- set {
- voronoiSiteInterval.X = MathHelper.Clamp(value.X, 100.0f, width/2);
- voronoiSiteInterval.Y = MathHelper.Clamp(value.Y, 100.0f, height/2);
+ set
+ {
+ voronoiSiteInterval.X = MathHelper.Clamp(value.X, 100.0f, width / 2);
+ voronoiSiteInterval.Y = MathHelper.Clamp(value.Y, 100.0f, height / 2);
}
}
@@ -118,6 +128,60 @@ namespace Barotrauma
}
}
+ [HasDefaultValue(-300000.0f, false)]
+ public float SeaFloorDepth
+ {
+ get { return seaFloorBaseDepth; }
+ set { seaFloorBaseDepth = MathHelper.Clamp(value, Level.MaxEntityDepth, 0.0f); }
+ }
+
+ [HasDefaultValue(1000.0f, false)]
+ public float SeaFloorVariance
+ {
+ get { return seaFloorVariance; }
+ set { seaFloorVariance = value; }
+ }
+
+ [HasDefaultValue(0, false)]
+ public int MountainCountMin
+ {
+ get { return mountainCountMin; }
+ set
+ {
+ mountainCountMin = Math.Max(value, 0);
+ }
+ }
+
+ [HasDefaultValue(0, false)]
+ public int MountainCountMax
+ {
+ get { return mountainCountMax; }
+ set
+ {
+ mountainCountMax = Math.Max(value, 0);
+ }
+ }
+
+ [HasDefaultValue(1000.0f, false)]
+ public float MountainHeightMin
+ {
+ get { return mountainHeightMin; }
+ set
+ {
+ mountainHeightMin = Math.Max(value, 0);
+ }
+ }
+
+ [HasDefaultValue(5000.0f, false)]
+ public float MountainHeightMax
+ {
+ get { return mountainHeightMax; }
+ set
+ {
+ mountainHeightMax = Math.Max(value, 0);
+ }
+ }
+
[HasDefaultValue(1, false)]
public int RuinCount
{
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelWall.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelWall.cs
new file mode 100644
index 000000000..059301862
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelWall.cs
@@ -0,0 +1,90 @@
+using FarseerPhysics.Dynamics;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+using Voronoi2;
+
+namespace Barotrauma
+{
+ partial class LevelWall : IDisposable
+ {
+ private List cells;
+
+ public List Cells
+ {
+ get { return cells; }
+ }
+
+ private List bodies;
+
+ public LevelWall(List edgePositions, Vector2 extendAmount, Color color)
+ {
+ cells = new List();
+
+ for (int i = 0; i < edgePositions.Count - 1; i++)
+ {
+ Vector2[] vertices = new Vector2[4];
+ vertices[0] = edgePositions[i];
+ vertices[1] = edgePositions[i + 1];
+ vertices[2] = vertices[0] + extendAmount;
+ vertices[3] = vertices[1] + extendAmount;
+
+ VoronoiCell wallCell = new VoronoiCell(vertices);
+ wallCell.edges[0].cell1 = wallCell;
+ wallCell.edges[1].cell1 = wallCell;
+ wallCell.edges[2].cell1 = wallCell;
+ wallCell.edges[3].cell1 = wallCell;
+
+ wallCell.edges[0].isSolid = true;
+
+ if (i > 1)
+ {
+ wallCell.edges[3].cell2 = cells[i - 1];
+ cells[i - 1].edges[1].cell2 = wallCell;
+ }
+
+ cells.Add(wallCell);
+ }
+
+ List triangles;
+ bodies = CaveGenerator.GeneratePolygons(cells, out triangles, false);
+
+#if CLIENT
+ List bodyVertices = CaveGenerator.GenerateRenderVerticeList(triangles);
+
+ SetBodyVertices(bodyVertices.ToArray(), color);
+ SetWallVertices(CaveGenerator.GenerateWallShapes(cells), color);
+#endif
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+#if CLIENT
+ if (wallVertices != null)
+ {
+ wallVertices.Dispose();
+ wallVertices = null;
+ }
+ if (bodyVertices != null)
+ {
+ BodyVertices.Dispose();
+ bodyVertices = null;
+ }
+#endif
+
+ if (bodies != null)
+ {
+ bodies.Clear();
+ bodies = null;
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/WrappingWall.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/WrappingWall.cs
deleted file mode 100644
index 84736c71b..000000000
--- a/Barotrauma/BarotraumaShared/Source/Map/Levels/WrappingWall.cs
+++ /dev/null
@@ -1,174 +0,0 @@
-using FarseerPhysics;
-using Microsoft.Xna.Framework;
-using System;
-using System.Collections.Generic;
-using Voronoi2;
-
-namespace Barotrauma
-{
- partial class WrappingWall : IDisposable
- {
- public const float WallWidth = 20000.0f;
-
- private Vector2 midPos;
- private int slot;
-
- private Vector2 offset;
-
- private List cells;
-
- public Vector2 Offset
- {
- get { return offset; }
- }
-
- public List Cells
- {
- get { return cells; }
- }
-
- public Vector2 MidPos
- {
- get { return midPos; }
- }
-
- public WrappingWall(List pathCells, List mapCells, Rectangle ignoredArea, int dir = -1)
- {
- cells = new List();
-
- VoronoiCell edgeCell = null;
- foreach (VoronoiCell cell in mapCells)
- {
- if (ignoredArea.Contains(cell.Center)) continue;
- if (Math.Sign(cell.Center.X - ignoredArea.Center.X) != Math.Sign(dir)) continue;
- if (edgeCell == null || cell.Center.Y < edgeCell.Center.Y)
- {
- edgeCell = cell;
- }
- }
-
- Vector2 wallSectionSize = new Vector2(2000.0f, 2000.0f);
- Vector2 startPos = (dir < 0) ?
- edgeCell.Center + Vector2.UnitX * WallWidth * dir :
- edgeCell.Center + WallWidth * Vector2.UnitX * (dir - 1);
-
- midPos = startPos + Vector2.UnitX * WallWidth/2;
-
- List bottomVertices = new List();
-
- for (float x = 0; x <= WallWidth; x += wallSectionSize.X)
- {
- Vector2 center = new Vector2(startPos.X + x, edgeCell.Center.Y);
- float distFromCenter = Math.Abs(x - WallWidth / 2);
- float distFromEdge = WallWidth / 2 - distFromCenter;
- float normalizedDist = distFromEdge / (WallWidth / 2);
-
- float variance = 1000.0f * normalizedDist;
- bottomVertices.Add(center + new Vector2(Rand.Range(-variance, variance, Rand.RandSync.Server), Rand.Range(-variance, variance, Rand.RandSync.Server) *2.0f));
- }
-
- for (int i = 1; i < bottomVertices.Count; i++)
- {
- Vector2[] vertices = new Vector2[4];
- vertices[0] = bottomVertices[i];
- vertices[1] = bottomVertices[i - 1];
- vertices[2] = vertices[1] + Vector2.UnitY * wallSectionSize.Y;
- vertices[3] = vertices[0] + Vector2.UnitY * wallSectionSize.Y;
-
- VoronoiCell wallCell = new VoronoiCell(vertices);
- wallCell.edges[0].cell1 = wallCell;
- wallCell.edges[1].cell1 = wallCell;
- wallCell.edges[2].cell1 = wallCell;
- wallCell.edges[3].cell1 = wallCell;
-
- wallCell.edges[0].isSolid = true;
- wallCell.edges[2].isSolid = true;
-
-
- if (i > 1)
- {
- wallCell.edges[1].cell2 = cells[i - 2];
- cells[i - 2].edges[3].cell2 = wallCell;
- }
-
- cells.Add(wallCell);
- }
- }
-
- public static void UpdateWallShift(Vector2 pos, WrappingWall[,] walls)
- {
- if (pos.X < walls[0, 1].midPos.X && walls[0,0].midPos.X > pos.X)
- {
- walls[0, 0].Shift(-2);
-
- var temp = walls[0, 0];
- walls[0, 0] = walls[0, 1];
- walls[0, 1] = temp;
- }
- else if (pos.X > walls[0, 0].midPos.X && walls[0,1].midPos.X < pos.X && walls[0,1].slot<0)
- {
- walls[0, 1].Shift(2);
-
- var temp = walls[0, 0];
- walls[0, 0] = walls[0, 1];
- walls[0, 1] = temp;
- }
- else if (pos.X > walls[1, 1].midPos.X && walls[1,0].midPos.X < pos.X)
- {
- walls[1, 0].Shift(2);
-
- var temp = walls[1, 0];
- walls[1, 0] = walls[1, 1];
- walls[1, 1] = temp;
- }
- else if (pos.X < walls[1, 0].midPos.X && walls[1, 1].midPos.X > pos.X && walls[1, 1].slot > 0)
- {
- walls[1, 1].Shift(-2);
-
- var temp = walls[0, 0];
- walls[1, 0] = walls[1, 1];
- walls[1, 1] = temp;
- }
- }
-
- public void Shift(int amount)
- {
- slot += amount;
-
- Vector2 moveAmount = Vector2.UnitX * WallWidth * amount;
- Vector2 simMoveAmount = ConvertUnits.ToSimUnits(moveAmount);
-
- foreach (VoronoiCell cell in cells)
- {
- cell.body.SetTransform(cell.body.Position + simMoveAmount, 0.0f);
- cell.Translation += moveAmount;
- }
-
- midPos += moveAmount;
- offset += moveAmount;
- }
-
- public void Dispose()
- {
- Dispose(true);
-
- GC.SuppressFinalize(this);
- }
-
- protected virtual void Dispose(bool disposing)
- {
-#if CLIENT
- if (wallVertices != null)
- {
- wallVertices.Dispose();
- wallVertices = null;
- }
- if (bodyVertices != null)
- {
- bodyVertices.Dispose();
- bodyVertices = null;
- }
-#endif
- }
- }
-}
diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
index faa349cff..9d873cc9a 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs
@@ -242,6 +242,12 @@ namespace Barotrauma
Body.LinearVelocity.X,
Math.Min(Body.LinearVelocity.Y, ConvertUnits.ToSimUnits(Level.Loaded.Size.Y - worldBorders.Y)));
}
+ else if (worldBorders.Y - worldBorders.Height < Level.Loaded.BottomPos)
+ {
+ Body.LinearVelocity = new Vector2(
+ Body.LinearVelocity.X,
+ Math.Max(Body.LinearVelocity.Y, ConvertUnits.ToSimUnits(Level.Loaded.BottomPos - (worldBorders.Y - worldBorders.Height))));
+ }
}
//-------------------------
diff --git a/Barotrauma/BarotraumaShared/Source/Map/TransitionCinematic.cs b/Barotrauma/BarotraumaShared/Source/Map/TransitionCinematic.cs
index 6edeff425..60a9a8449 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/TransitionCinematic.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/TransitionCinematic.cs
@@ -58,7 +58,7 @@ namespace Barotrauma
//Vector2 diff = targetPos - sub.Position;
float targetSpeed = 10.0f;
- Level.Loaded.ShaftBody.Enabled = false;
+ Level.Loaded.TopBarrier.Enabled = false;
cam.TargetPos = Vector2.Zero;
float timer = 0.0f;
@@ -80,7 +80,7 @@ namespace Barotrauma
cam.Zoom = Math.Max(0.2f, cam.Zoom - CoroutineManager.UnscaledDeltaTime * 0.1f);
Vector2 cameraPos = subs.First().Position + Submarine.MainSub.HiddenSubPosition;
- cameraPos.Y = Math.Min(cameraPos.Y, ConvertUnits.ToDisplayUnits(Level.Loaded.ShaftBody.Position.Y) - cam.WorldView.Height / 2.0f);
+ cameraPos.Y = Math.Min(cameraPos.Y, ConvertUnits.ToDisplayUnits(Level.Loaded.TopBarrier.Position.Y) - cam.WorldView.Height / 2.0f);
cam.Translate((cameraPos - cam.Position) * CoroutineManager.UnscaledDeltaTime * 10.0f);
#if CLIENT
GUI.ScreenOverlayColor = Color.Lerp(Color.TransparentBlack, Color.Black, timer/duration);
diff --git a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs
index deba6b86c..d8fa87f55 100644
--- a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs
+++ b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs
@@ -233,7 +233,7 @@ namespace Barotrauma.Networking
{
updateReturnTimer = 0.0f;
- respawnShuttle.PhysicsBody.FarseerBody.IgnoreCollisionWith(Level.Loaded.ShaftBody);
+ respawnShuttle.PhysicsBody.FarseerBody.IgnoreCollisionWith(Level.Loaded.TopBarrier);
shuttleSteering.SetDestinationLevelStart();
@@ -304,7 +304,7 @@ namespace Barotrauma.Networking
private IEnumerable