Spectating, fire, damaged limb sprites, water detector, engineer jumpsuit, new signal comp sprites, resharper cleanup (god knows what else, commit more often)

This commit is contained in:
Regalis
2015-11-10 22:22:26 +02:00
parent cd48d12be6
commit 4d949e3be1
89 changed files with 977 additions and 622 deletions
+81 -67
View File
@@ -10,6 +10,9 @@ namespace Barotrauma.Particles
{
private ParticlePrefab prefab;
public delegate void OnChangeHullHandler(Vector2 position, Hull currentHull);
public OnChangeHullHandler OnChangeHull;
private Vector2 position;
private Vector2 prevPosition;
@@ -26,6 +29,8 @@ namespace Barotrauma.Particles
private Color color;
private float alpha;
private int spriteIndex;
private float totalLifeTime;
private float lifeTime;
@@ -37,12 +42,17 @@ namespace Barotrauma.Particles
private Hull currentHull;
private List<Hull> hullLimits;
private List<Gap> hullGaps;
public ParticlePrefab.DrawTargetType DrawTarget
{
get { return prefab.DrawTarget; }
}
public ParticleBlendState BlendState
{
get { return prefab.BlendState; }
}
public Vector2 Size
{
@@ -56,10 +66,12 @@ namespace Barotrauma.Particles
set { velocityChange = value; }
}
public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation)
public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation, Hull hullGuess = null)
{
this.prefab = prefab;
spriteIndex = Rand.Int(prefab.Sprites.Count);
this.position = position;
prevPosition = position;
@@ -84,11 +96,15 @@ namespace Barotrauma.Particles
velocityChange = prefab.VelocityChange;
OnChangeHull = null;
if (prefab.DeleteOnCollision || prefab.CollidesWithWalls)
{
//currentHull = Hull.FindHull(position);
hullLimits = new List<Hull>();
hullLimits = FindLimits(position);
currentHull = Hull.FindHull(position, hullGuess);
hullGaps = currentHull==null ? new List<Gap>() : currentHull.FindGaps();
//hullLimits = new List<Hull>();
//hullLimits = FindLimits(position);
}
if (prefab.RotateToDirection)
@@ -99,55 +115,17 @@ namespace Barotrauma.Particles
}
}
private List<Hull> FindLimits(Vector2 position)
{
List<Hull> hullList = new List<Hull>();
//private List<Hull> FindLimits(Vector2 position)
//{
// List<Hull> hullList = new List<Hull>();
currentHull = Hull.FindHull(position);
if (currentHull == null) return hullList;
// currentHull = Hull.FindHull(position);
// if (currentHull == null) return hullList;
hullList.Add(currentHull);
return FindAdjacentHulls(hullList, currentHull, Math.Abs(velocity.X)>Math.Abs(velocity.Y));
}
// hullList.Add(currentHull);
private List<Hull> FindAdjacentHulls(List<Hull> adjacentHulls, Hull currentHull, bool isHorizontal)
{
foreach (Gap gap in Gap.GapList)
{
if (gap.isHorizontal != isHorizontal) continue;
if (gap.Open < 0.01f) continue;
if (gap.linkedTo.Count==0)
{
continue;
}
else if (gap.linkedTo.Count==1)
{
if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull))
{
adjacentHulls.Add(gap.linkedTo[0] as Hull);
}
}
else if (gap.linkedTo[0] == currentHull && gap.linkedTo[1] != null)
{
if (!adjacentHulls.Contains(gap.linkedTo[1] as Hull))
{
adjacentHulls.Add(gap.linkedTo[1] as Hull);
FindAdjacentHulls(adjacentHulls, gap.linkedTo[1] as Hull, isHorizontal);
}
}
else if (gap.linkedTo[1] == currentHull && gap.linkedTo[0] != null)
{
if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull))
{
adjacentHulls.Add(gap.linkedTo[0] as Hull);
FindAdjacentHulls(adjacentHulls, gap.linkedTo[0] as Hull, isHorizontal);
}
}
}
return adjacentHulls;
}
// return FindAdjacentHulls(hullList, currentHull, Math.Abs(velocity.X) > Math.Abs(velocity.Y));
//}
public bool Update(float deltaTime)
{
@@ -182,24 +160,57 @@ namespace Barotrauma.Particles
if ((prefab.DeleteOnCollision || prefab.CollidesWithWalls) && currentHull!=null)
{
bool insideHull = false;
foreach (Hull hull in hullLimits)
{
if (!Submarine.RectContains(hull.Rect, position)) continue;
Vector2 edgePos = position + prefab.Sprites[spriteIndex].SourceRect.Width * Vector2.Normalize(velocity) * size.X;
//bool insideHull = false;
//foreach (Hull hull in hullLimits)
//{
// if (!Submarine.RectContains(hull.Rect, edgePos)) continue;
insideHull = true;
break;
}
// insideHull = true;
// break;
//}
if (!insideHull)
if (!Submarine.RectContains(currentHull.Rect, edgePos))
{
if (prefab.DeleteOnCollision) return false;
Hull prevHull = Hull.FindHull(prevPosition, hullLimits, currentHull);
bool gapFound = false;
foreach (Gap gap in hullGaps)
{
if (!gap.isHorizontal)
{
if (gap.Rect.X > position.X || gap.Rect.Right < position.X) continue;
if (Math.Sign(velocity.Y) != Math.Sign(gap.Rect.Y - position.Y)) continue;
}
else
{
if (gap.Rect.Y < position.Y || gap.Rect.Y - gap.Rect.Height > position.Y) continue;
if (Math.Sign(velocity.X) != Math.Sign(gap.Rect.X - position.X)) continue;
}
if (prevHull == null) return false;
//Rectangle enlargedRect = new Rectangle(gap.Rect.X - 10, gap.Rect.Y + 10, gap.Rect.Width + 20, gap.Rect.Height + 20);
//if (!Submarine.RectContains(enlargedRect, position)) continue;
gapFound = true;
}
if (!gapFound)
{
OnWallCollision(currentHull, edgePos);
}
else
{
currentHull = Hull.FindHull(position);
hullGaps = currentHull == null ? new List<Gap>() : currentHull.FindGaps();
if (OnChangeHull != null) OnChangeHull(edgePos, currentHull);
}
//Hull prevHull = Hull.FindHull(prevPosition, hullLimits, currentHull);
//if (prevHull == null) return false;
OnWallCollision(prevHull);
}
//if (position.Y < currentHull.Rect.Y-currentHull.Rect.Height)
@@ -217,10 +228,10 @@ namespace Barotrauma.Particles
return true;
}
private void OnWallCollision(Hull prevHull)
private void OnWallCollision(Hull prevHull, Vector2 position)
{
float restitution = 0.05f;
float restitution = 0.5f;
if (position.Y < prevHull.Rect.Y - prevHull.Rect.Height)
{
position.Y = prevHull.Rect.Y - prevHull.Rect.Height + 1.0f;
@@ -229,7 +240,8 @@ namespace Barotrauma.Particles
else if (position.Y > prevHull.Rect.Y)
{
position.Y = prevHull.Rect.Y - 1.0f;
velocity.Y = -velocity.Y;
velocity.X = Math.Abs(velocity.Y) * Math.Sign(velocity.X);
velocity.Y = -velocity.Y*0.1f;
}
if (position.X < prevHull.Rect.X)
@@ -262,7 +274,9 @@ namespace Barotrauma.Particles
}
prefab.Sprite.Draw(spriteBatch, drawPosition, color*alpha, prefab.Sprite.origin, drawRotation, drawSize, SpriteEffects.None, prefab.Sprite.Depth);
prefab.Sprites[spriteIndex].Draw(spriteBatch, drawPosition, color * alpha,
prefab.Sprites[spriteIndex].origin, drawRotation,
drawSize, SpriteEffects.None, prefab.Sprites[spriteIndex].Depth);
//spriteBatch.Draw(
// prefab.sprite.Texture,
+14 -6
View File
@@ -7,9 +7,16 @@ using Microsoft.Xna.Framework.Graphics;
namespace Barotrauma.Particles
{
enum ParticleBlendState
{
AlphaBlend, Additive
}
class ParticleManager
{
public static int particleCount;
private const int MaxOutOfViewDist = 500;
private const int MaxParticles = 1500;
private Particle[] particles;
@@ -45,23 +52,23 @@ namespace Barotrauma.Particles
return CreateParticle(prefabName, position, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)) * speed, angle);
}
public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f)
public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f, Hull hullGuess = null)
{
ParticlePrefab prefab = FindPrefab(prefabName);
return CreateParticle(prefab, position, speed, rotation);
return CreateParticle(prefab, position, speed, rotation, hullGuess);
}
public Particle CreateParticle(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation=0.0f)
public Particle CreateParticle(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation = 0.0f, Hull hullGuess = null)
{
if (!Submarine.RectContains(cam.WorldView, position)) return null;
if (!Submarine.RectContains(MathUtils.ExpandRect(cam.WorldView, MaxOutOfViewDist), position)) return null;
//if (!cam.WorldView.Contains(position)) return null;
if (particleCount >= MaxParticles) return null;
if (particles[particleCount] == null) particles[particleCount] = new Particle();
particles[particleCount].Init(prefab, position, speed, rotation);
particles[particleCount].Init(prefab, position, speed, rotation, hullGuess);
particleCount++;
@@ -100,12 +107,13 @@ namespace Barotrauma.Particles
}
}
public void Draw(SpriteBatch spriteBatch, bool inWater)
public void Draw(SpriteBatch spriteBatch, bool inWater, ParticleBlendState blendState)
{
ParticlePrefab.DrawTargetType drawTarget = inWater ? ParticlePrefab.DrawTargetType.Water : ParticlePrefab.DrawTargetType.Air;
for (int i = 0; i < particleCount; i++)
{
if (particles[i].BlendState != blendState) continue;
if (!particles[i].DrawTarget.HasFlag(drawTarget)) continue;
particles[i].Draw(spriteBatch);
+11 -2
View File
@@ -1,6 +1,7 @@
using System.Xml.Linq;
using Microsoft.Xna.Framework;
using FarseerPhysics;
using System.Collections.Generic;
namespace Barotrauma.Particles
{
@@ -10,7 +11,7 @@ namespace Barotrauma.Particles
public readonly string Name;
public readonly Sprite Sprite;
public readonly List<Sprite> Sprites;
public readonly float AngularVelocityMin, AngularVelocityMax;
@@ -35,17 +36,21 @@ namespace Barotrauma.Particles
public readonly DrawTargetType DrawTarget;
public readonly ParticleBlendState BlendState;
public readonly bool RotateToDirection;
public ParticlePrefab(XElement element)
{
Name = element.Name.ToString();
Sprites = new List<Sprite>();
foreach (XElement subElement in element.Elements())
{
if (subElement.Name.ToString().ToLower() != "sprite") continue;
Sprite = new Sprite(subElement);
Sprites.Add(new Sprite(subElement));
}
if (element.Attribute("angularvelocity") == null)
@@ -81,6 +86,10 @@ namespace Barotrauma.Particles
SizeChangeMax = SizeChangeMin;
}
var blendState = ToolBox.GetAttributeString(element, "blendstate", "alphablend");
BlendState = (blendState != "additive") ? ParticleBlendState.AlphaBlend : ParticleBlendState.Additive;
GrowTime = ToolBox.GetAttributeFloat(element, "growtime", 0.0f);
if (element.Attribute("startrotation") == null)