Merge branch 'master' into new-netcode

Conflicts:
	Subsurface/Source/Items/Components/Machines/Deconstructor.cs
	Subsurface/Source/Items/Components/Machines/Fabricator.cs
This commit is contained in:
Regalis
2017-03-23 18:58:18 +02:00
9 changed files with 156 additions and 89 deletions

View File

@@ -133,53 +133,74 @@ namespace Barotrauma
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<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;
Vector2 normal = edge.GetNormal(cell);
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;
}
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);
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;
int index = Rand.Int(edges.Count,false);
int index = Rand.Int(edges.Count, false);
closestEdge = edges[index];
edgeNormal = normals[index];
float length = Vector2.Distance(closestEdge.point1, closestEdge.point2);
Vector2 dir = (closestEdge.point1 - closestEdge.point2) / length;
Vector2 pos = closestEdge.point2 + dir * Rand.Range(prefab.Sprite.size.X / 2.0f, length - prefab.Sprite.size.X / 2.0f, false);
return pos;
}

View File

@@ -10,6 +10,8 @@ namespace Barotrauma
protected Alignment textAlignment;
private float textScale;
protected Vector2 textPos;
protected Vector2 origin;
@@ -88,6 +90,19 @@ namespace Barotrauma
get { return textPos; }
}
public float TextScale
{
get { return textScale; }
set
{
if (value != textScale)
{
textScale = value;
SetTextPos();
}
}
}
public Vector2 Origin
{
get { return origin; }
@@ -162,6 +177,8 @@ namespace Barotrauma
SetTextPos();
TextScale = 1.0f;
if (rect.Height == 0 && !string.IsNullOrEmpty(Text))
{
this.rect.Height = (int)Font.MeasureString(wrappedText).Y;
@@ -267,7 +284,7 @@ namespace Barotrauma
Wrap ? wrappedText : text,
new Vector2(rect.X, rect.Y) + textPos + offset,
textColor * (textColor.A / 255.0f),
0.0f, origin, 1.0f,
0.0f, origin, TextScale,
SpriteEffects.None, textDepth);
}

View File

@@ -36,6 +36,16 @@ namespace Barotrauma.Items.Components
}
}
[Editable, HasDefaultValue(1.0f, true)]
public float TextScale
{
get { return textBlock == null ? 1.0f : textBlock.TextScale; }
set
{
if (textBlock != null) textBlock.TextScale = MathHelper.Clamp(value, 0.1f, 10.0f);
}
}
private GUITextBlock TextBlock
{
get
@@ -49,6 +59,7 @@ namespace Barotrauma.Items.Components
textBlock.Font = GUI.SmallFont;
textBlock.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f);
textBlock.TextDepth = item.Sprite.Depth - 0.0001f;
textBlock.TextScale = TextScale;
}
return textBlock;
}

View File

@@ -30,12 +30,9 @@ namespace Barotrauma.Items.Components
public override void Update(float deltaTime, Camera cam)
{
if (container == null || !container.Inventory.Items.Any(i=>i!=null))
if (container == null || container.Inventory.Items.All(i => i == null))
{
progressBar.BarSize = 0.0f;
//activateButton.Enabled = true;
if (container != null) container.Inventory.Locked = false;
IsActive = false;
SetActive(false);
return;
}
@@ -51,10 +48,10 @@ namespace Barotrauma.Items.Components
if (progressTimer>targetItem.Prefab.DeconstructTime)
{
var containers = item.GetComponents<ItemContainer>();
if (containers.Count<2)
if (containers.Count < 2)
{
DebugConsole.ThrowError("Error in Deconstructor.Update: Deconstructors must have two ItemContainer components!");
return;
}
@@ -62,21 +59,32 @@ namespace Barotrauma.Items.Components
{
if (deconstructProduct.RequireFullCondition && targetItem.Condition < 100.0f) continue;
var itemPrefab = ItemPrefab.list.FirstOrDefault(ip => ip.Name.ToLowerInvariant() == deconstructProduct.ItemPrefabName.ToLowerInvariant()) as ItemPrefab;
if (itemPrefab==null)
var itemPrefab = MapEntityPrefab.list.FirstOrDefault(ip => ip.Name.ToLowerInvariant() == deconstructProduct.ItemPrefabName.ToLowerInvariant()) as ItemPrefab;
if (itemPrefab == null)
{
DebugConsole.ThrowError("Tried to deconstruct item \""+targetItem.Name+"\" but couldn't find item prefab \""+deconstructProduct+"\"!");
DebugConsole.ThrowError("Tried to deconstruct item \"" + targetItem.Name + "\" but couldn't find item prefab \"" + deconstructProduct + "\"!");
continue;
}
Item.Spawner.AddToSpawnQueue(itemPrefab, containers[1].Inventory);
//container full, drop the items outside the deconstructor
if (containers[1].Inventory.Items.All(i => i != null))
{
Entity.Spawner.AddToSpawnQueue(itemPrefab, item.Position, item.Submarine);
}
else
{
Entity.Spawner.AddToSpawnQueue(itemPrefab, containers[1].Inventory);
}
}
container.Inventory.RemoveItem(targetItem);
Item.Spawner.AddToRemoveQueue(targetItem);
Entity.Spawner.AddToRemoveQueue(targetItem);
activateButton.Text = "Deconstruct";
progressBar.BarSize = 0.0f;
progressTimer = 0.0f;
if (container.Inventory.Items.Any(i => i != null))
{
progressTimer = 0.0f;
progressBar.BarSize = 0.0f;
}
}
}
@@ -122,6 +130,8 @@ namespace Barotrauma.Items.Components
return;
}
if (container.Inventory.Items.All(i => i == null)) active = false;
IsActive = active;
if (!IsActive)
@@ -133,7 +143,6 @@ namespace Barotrauma.Items.Components
}
else
{
if (container.Inventory.Items.All(i => i == null)) return;
activateButton.Text = "Cancel";
}

View File

@@ -360,25 +360,32 @@ namespace Barotrauma.Items.Components
if (timeUntilReady > 0.0f) return;
var containers = item.GetComponents<ItemContainer>();
if (containers.Count<2)
if (containers.Count < 2)
{
DebugConsole.ThrowError("Error while fabricating a new item: fabricators must have two ItemContainer components");
return;
}
foreach (Tuple<ItemPrefab,int> ip in fabricatedItem.RequiredItems)
foreach (Tuple<ItemPrefab, int> ip in fabricatedItem.RequiredItems)
{
for (int i = 0; i<ip.Item2; i++)
for (int i = 0; i < ip.Item2; i++)
{
var requiredItem = containers[0].Inventory.Items.FirstOrDefault(it => it != null && it.Prefab == ip.Item1);
if (requiredItem == null) continue;
Item.Spawner.AddToRemoveQueue(requiredItem);
Entity.Spawner.AddToRemoveQueue(requiredItem);
containers[0].Inventory.RemoveItem(requiredItem);
}
}
Item.Spawner.AddToSpawnQueue(fabricatedItem.TargetItem, containers[1].Inventory);
if (containers[1].Inventory.Items.All(i => i != null))
{
Entity.Spawner.AddToSpawnQueue(fabricatedItem.TargetItem, item.Position, item.Submarine);
}
else
{
Entity.Spawner.AddToSpawnQueue(fabricatedItem.TargetItem, containers[1].Inventory);
}
CancelFabricating();
}

View File

@@ -735,7 +735,13 @@ namespace Barotrauma
{
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;
}
}

View File

@@ -538,10 +538,8 @@ namespace Voronoi2
private void pushGraphEdge( Site leftSite, Site rightSite, Vector2 point1, Vector2 point2 )
{
GraphEdge newEdge = new GraphEdge ();
GraphEdge newEdge = new GraphEdge(point1, point2);
allEdges.Add ( newEdge );
newEdge.point1 = point1;
newEdge.point2 = point2;
newEdge.site1 = leftSite;
newEdge.site2 = rightSite;

View File

@@ -155,18 +155,14 @@ namespace Voronoi2
for (int i = 1; i < vertices.Length; i++ )
{
GraphEdge ge = new GraphEdge();
ge.point1 = vertices[i-1];
ge.point2 = vertices[i];
GraphEdge ge = new GraphEdge(vertices[i-1], vertices[i]);
System.Diagnostics.Debug.Assert(ge.point1 != ge.point2);
edges.Add(ge);
}
GraphEdge lastEdge = new GraphEdge();
lastEdge.point1 = vertices[0];
lastEdge.point2 = vertices[vertices.Length-1];
GraphEdge lastEdge = new GraphEdge(vertices[0], vertices[vertices.Length-1]);
edges.Add(lastEdge);
@@ -208,6 +204,12 @@ namespace Voronoi2
get { return (point1 + point2) / 2.0f; }
}
public GraphEdge(Vector2 point1, Vector2 point2)
{
this.point1 = point1;
this.point2 = point2;
}
public VoronoiCell AdjacentCell(VoronoiCell cell)
{
if (cell1==cell)

View File

@@ -464,44 +464,43 @@ namespace Barotrauma
return d[n, m];
}
public static string WrapText(string text, float lineLength, ScalableFont font) //TODO: could integrate this into the ScalableFont class directly
{
if (font.MeasureString(text).X < lineLength) return text;
text = text.Replace("\n", " \n ");
string[] words = text.Split(' ');//, '\n');
string[] words = text.Split(' ');
StringBuilder wrappedText = new StringBuilder();
float linePos = 0f;
float spaceWidth = font.MeasureString(" ").X;
for (int i = 0; i < words.Length; ++i)
{
if (string.IsNullOrWhiteSpace(words[i]) && words[i]!="\n") continue;
if (string.IsNullOrWhiteSpace(words[i]) && words[i] != "\n") continue;
Vector2 size;
string tempWord = words[i];
string prevWord = words[i];
while ((size = font.MeasureString(tempWord)).X > lineLength)
Vector2 size = font.MeasureString(words[i]);
if (size.X > lineLength)
{
tempWord = tempWord.Remove(tempWord.Length - 1, 1);
}
while (words[i].Length > 0 &&
(size = font.MeasureString((words[i][0]).ToString())).X + linePos < lineLength)
{
wrappedText.Append(words[i][0]);
words[i] = words[i].Remove(0, 1);
words[i] = tempWord;
if (prevWord.Length> tempWord.Length)
{
wrappedText.Append(words[i]);
wrappedText.Append(" \n");
wrappedText.Append(prevWord.Remove(0, tempWord.Length));
linePos = lineLength*2.0f;
linePos += size.X;
}
wrappedText.Append("\n");
linePos = 0.0f;
i--;
continue;
}
if (linePos + size.X < lineLength)
{
wrappedText.Append(words[i]);
wrappedText.Append(words[i]);
if (words[i] == "\n")
{
linePos = 0.0f;
@@ -514,13 +513,10 @@ namespace Barotrauma
}
else
{
//if (i>0)wrappedText.Remove(wrappedText.Length - 1, 1);
wrappedText.Append("\n");
wrappedText.Append(words[i]);
wrappedText.Append("\n");
wrappedText.Append(words[i]);
linePos = size.X + spaceWidth;
linePos = size.X + spaceWidth;
}
if (i < words.Length - 1) wrappedText.Append(" ");