- resetting the "blood overlay" when switching the controlled character

- fixed 1-section long walls being impossible to fix after their body has been destroyed
- better looking blur (small lights aren't "skewed")
This commit is contained in:
Regalis
2016-05-26 18:03:08 +03:00
parent 6a3572e1d2
commit 2398d8aa8a
4 changed files with 54 additions and 82 deletions

View File

@@ -29,7 +29,12 @@ namespace Barotrauma
public static Character Controlled
{
get { return controlled; }
set { controlled = value; }
set
{
if (controlled == value) return;
controlled = value;
CharacterHUD.Reset();
}
}
private bool enabled;
@@ -1246,11 +1251,11 @@ namespace Barotrauma
return attackResult;
}
public void StartStun(float stunTimer)
public void StartStun(float stunTimer, bool allowStunDecrease = false)
{
if (stunTimer <= 0.0f || !MathUtils.IsValid(stunTimer)) return;
if ((stunTimer <= 0.0f && !allowStunDecrease) || !MathUtils.IsValid(stunTimer)) return;
AnimController.ResetPullJoints();
if (Math.Sign(stunTimer) != Math.Sign(AnimController.StunTimer)) AnimController.ResetPullJoints();
AnimController.StunTimer = Math.Max(AnimController.StunTimer, stunTimer);
selectedConstruction = null;
@@ -1681,7 +1686,7 @@ namespace Barotrauma
}
float newStunTimer = message.ReadRangedSingle(0.0f, 60.0f, 8);
StartStun(newStunTimer);
StartStun(newStunTimer, true);
Oxygen = message.ReadRangedSingle(-100.0f,100.0f, 8);
Bleeding = message.ReadRangedSingle(0.0f, 5.0f, 8);

View File

@@ -20,6 +20,11 @@ namespace Barotrauma
private static float damageOverlayTimer;
public static void Reset()
{
damageOverlayTimer = 0.0f;
}
public static void TakeDamage(float amount)
{
healthBar.Flash();

View File

@@ -46,7 +46,7 @@ namespace Barotrauma
public static int wallSectionSize = 100;
public static List<Structure> WallList = new List<Structure>();
List<ConvexHull> _convexHulls;
List<ConvexHull> convexHulls;
StructurePrefab prefab;
@@ -126,9 +126,9 @@ namespace Barotrauma
}
}
if (_convexHulls!=null)
if (convexHulls!=null)
{
_convexHulls.ForEach(x => x.Move(amount));
convexHulls.ForEach(x => x.Move(amount));
}
//if (gaps != null)
//{
@@ -233,26 +233,6 @@ namespace Barotrauma
newBody.UserData = this;
bodies.Add(newBody);
//newBody = BodyFactory.CreateRectangle(Game1.World,
// ConvertUnits.ToSimUnits(Submarine.GridSize.X*2),
// ConvertUnits.ToSimUnits(10.0f),
// 1.5f);
//newBody.BodyType = BodyType.Static;
////newBody.IsSensor = true;
//newBody.Position = ConvertUnits.ToSimUnits(
// new Vector2(Position.X + (rect.Width/2 + Submarine.GridSize.X) * ((StairDirection == Direction.Right) ? -1.0f : 1.0f), rect.Y + 5.0f));
////newBody.Rotation = (StairDirection == Direction.Right) ? MathHelper.PiOver4 : -MathHelper.PiOver4;
////newBody.Friction = 0.8f;
//newBody.CollisionCategories = Physics.CollisionStairs;
//newBody.UserData = this;
//bodies.Add(newBody);
}
}
@@ -268,18 +248,15 @@ namespace Barotrauma
private void GenerateConvexHull()
{
// If not null and not empty , remove the hulls from the system
if(_convexHulls != null && _convexHulls.Any())
_convexHulls.ForEach(x => x.Remove());
if(convexHulls != null && convexHulls.Any())
convexHulls.ForEach(x => x.Remove());
// list all of hulls for this structure
_convexHulls = new List<ConvexHull>();
convexHulls = new List<ConvexHull>();
// merged sections
// TODO: merge damaged sections
var mergedSections = new List<WallSection>();
foreach (var section in sections)
{
// if there is a gap and we have sections to merge, do it.
if (section.gap != null)
{
@@ -298,25 +275,26 @@ namespace Barotrauma
}
}
private void GenerateMergedHull(List<WallSection> mergedSections)
private Rectangle GenerateMergedRect(List<WallSection> mergedSections)
{
if (!mergedSections.Any()) return;
Rectangle mergedRect;
if (isHorizontal)
mergedRect = new Rectangle(mergedSections.Min(x => x.rect.Left), mergedSections.Max(x => x.rect.Top),
return new Rectangle(mergedSections.Min(x => x.rect.Left), mergedSections.Max(x => x.rect.Top),
mergedSections.Sum(x => x.rect.Width), mergedSections.First().rect.Height);
else
{
mergedRect = new Rectangle(mergedSections.Min(x => x.rect.Left), mergedSections.Max(x => x.rect.Top),
return new Rectangle(mergedSections.Min(x => x.rect.Left), mergedSections.Max(x => x.rect.Top),
mergedSections.First().rect.Width, mergedSections.Sum(x => x.rect.Height));
}
}
private void GenerateMergedHull(List<WallSection> mergedSections)
{
if (!mergedSections.Any()) return;
Rectangle mergedRect = GenerateMergedRect(mergedSections);
var h = new ConvexHull(CalculateExtremes(mergedRect), Color.Black, this);
mergedSections.ForEach(x => x.hull = h);
_convexHulls.Add(h);
convexHulls.Add(h);
mergedSections.Clear();
}
@@ -364,7 +342,7 @@ namespace Barotrauma
GameMain.World.RemoveBody(b);
}
if (_convexHulls != null) _convexHulls.ForEach(x => x.Remove());
if (convexHulls != null) convexHulls.ForEach(x => x.Remove());
}
@@ -561,7 +539,6 @@ namespace Barotrauma
private void SetDamage(int sectionIndex, float damage)
{
if (Submarine.Loaded != null && Submarine.Loaded.GodMode) return;
if (!prefab.HasBody) return;
@@ -630,51 +607,36 @@ namespace Barotrauma
}
bodies.Clear();
int x = sections[0].rect.X;
int y = sections[0].rect.Y;
int width = sections[0].rect.Width;
int height = sections[0].rect.Height;
bool hasHoles = false;
for (int i = 1; i < sections.Length; i++)
var mergedSections = new List<WallSection>();
for (int i = 0; i < sections.Length; i++ )
{
bool hasHole = SectionBodyDisabled(i);
if (hasHole) hasHoles = true;
//if found a section with a hole or all sections have been gone through, create a body
if (hasHole || i == sections.Length - 1)
// if there is a gap and we have sections to merge, do it.
if (SectionBodyDisabled(i))
{
if (width > 0 && height > 0)
{
CreateRectBody(new Rectangle(x, y, width, height));
}
if (isHorizontal)
{
x = sections[i].rect.X + sections[i].rect.Width;
width = 0;
}
else
{
y = sections[i].rect.Y - sections[i].rect.Height;
height = 0;
}
hasHoles = true;
if (!mergedSections.Any()) continue;
var mergedRect = GenerateMergedRect(mergedSections);
mergedSections.Clear();
CreateRectBody(mergedRect);
}
else
{
//if no hole, add this section to the merged body
if (isHorizontal)
{
width += sections[i].rect.Width;
}
else
{
height += sections[i].rect.Height;
}
mergedSections.Add(sections[i]);
}
}
if (hasHoles) CreateRectBody(rect).IsSensor = true;
// take care of any leftover pieces
if (mergedSections.Count > 0)
{
var mergedRect = GenerateMergedRect(mergedSections);
CreateRectBody(mergedRect);
}
//if the section has holes (or is just one big hole with no bodies),
//we need a sensor for repairtools to be able to target the structure
if (hasHoles || !bodies.Any()) CreateRectBody(rect).IsSensor = true;
}
private Body CreateRectBody(Rectangle rect)

View File

@@ -87,7 +87,7 @@ namespace Barotrauma
/// </summary>
float ComputeGaussian(float n)
{
float theta = 4.0f;
float theta = 2.0f;
return (float)((1.0 / Math.Sqrt(2 * Math.PI * theta)) *
Math.Exp(-(n * n) / (2 * theta * theta)));