From 97b3d8451c651f1ddf6d318025411a03e0d63a49 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 20 Jan 2016 23:31:37 +0200 Subject: [PATCH] - Larger icon for gap/ladder waypoints - Creature-sub collision damage improvements (takes velocity of the limb into account) - In-sub particles move with the sub - Fixed artifacts spawning to non-pickable positions - Fixed ItemInventories not being drawn if the item is in a subslot - CauseOfDeath = Drowning if the character is in water while running out of oxy - Some more deconstructable items --- Subsurface/Barotrauma.csproj | 1 - Subsurface/Content/Items/Clothes/clothes.xml | 5 +++ .../Content/Items/Fabricators/materials.xml | 2 +- Subsurface/Content/Items/Weapons/weapons.xml | 17 +++++++++ .../AI/Objectives/AIObjectiveCombat.cs | 4 +-- .../AI/Objectives/AIObjectiveGoTo.cs | 9 +++-- Subsurface/Source/Characters/Character.cs | 2 +- Subsurface/Source/GameSession/CrewManager.cs | 1 + .../GameSession/GameModes/SinglePlayerMode.cs | 4 +++ Subsurface/Source/GameSession/ShiftSummary.cs | 2 +- Subsurface/Source/Items/CharacterInventory.cs | 2 +- Subsurface/Source/Items/Inventory.cs | 12 +++---- Subsurface/Source/Items/Item.cs | 12 +++++-- Subsurface/Source/Map/Gap.cs | 8 ++--- Subsurface/Source/Map/Submarine.cs | 4 ++- Subsurface/Source/Map/SubmarineBody.cs | 34 +++++++++++------- Subsurface/Source/Map/WayPoint.cs | 4 ++- Subsurface/Source/Particles/Particle.cs | 20 ++++++++--- Subsurface_Solution.v12.suo | Bin 821248 -> 856576 bytes 19 files changed, 104 insertions(+), 39 deletions(-) diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 0df081dfa..9b73026a4 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -114,7 +114,6 @@ - diff --git a/Subsurface/Content/Items/Clothes/clothes.xml b/Subsurface/Content/Items/Clothes/clothes.xml index abb23988d..8e6a536b8 100644 --- a/Subsurface/Content/Items/Clothes/clothes.xml +++ b/Subsurface/Content/Items/Clothes/clothes.xml @@ -81,6 +81,11 @@ tags="smallitem" description="While the helmet won't offer adequate protection against most of the inhabitants of the subsurface ocean, it can be extremely useful if there are traitors on board."> + + + + + diff --git a/Subsurface/Content/Items/Fabricators/materials.xml b/Subsurface/Content/Items/Fabricators/materials.xml index 023f9eb70..68c315c4f 100644 --- a/Subsurface/Content/Items/Fabricators/materials.xml +++ b/Subsurface/Content/Items/Fabricators/materials.xml @@ -52,7 +52,7 @@ category="Material" Tags="smallitem" pickdistance="150" - spritecolor="1.0,1.0,1.0,0.9" + spritecolor="0.9,0.9,1.0,0.9" canbepicked="true" price="50"> diff --git a/Subsurface/Content/Items/Weapons/weapons.xml b/Subsurface/Content/Items/Weapons/weapons.xml index 8383f4073..173fdc52d 100644 --- a/Subsurface/Content/Items/Weapons/weapons.xml +++ b/Subsurface/Content/Items/Weapons/weapons.xml @@ -79,6 +79,11 @@ price="100" description="If verbal orders are insufficient, a high-voltage shock from a Stun Baton may be enough to beat an unruly crew member into submission."> + + + + + @@ -110,6 +115,12 @@ price="50" description="Used as a power source for various handheld devices. Most submarines have several stationary backup batteries with recharge docks for battery cells."> + + + + + + @@ -124,6 +135,12 @@ tags="smallitem,loadable" description="A battery cell contructed of the rare and poorly understood compound Fulgurium."> + + + + + + diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs index 03a2078b0..8616ac8a7 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveCombat.cs @@ -56,8 +56,8 @@ namespace Barotrauma Vector2 enemyDiff = Vector2.Normalize(enemy.Position - character.Position); float weaponAngle = ((weapon.body.Dir == 1.0f) ? weapon.body.Rotation : weapon.body.Rotation - MathHelper.Pi); Vector2 weaponDir = new Vector2((float)Math.Cos(weaponAngle), (float)Math.Sin(weaponAngle)); - - if (Vector2.Dot(enemyDiff, weaponDir)<0.9f) return; + + if (Vector2.Dot(enemyDiff, weaponDir) < 0.9f) return; List ignoredBodies = new List(); foreach (Limb limb in character.AnimController.Limbs) diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index a77535b64..d5794beeb 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -96,12 +96,17 @@ namespace Barotrauma } } - character.AIController.SteeringManager.SteeringSeek(currTargetPos); - if (Vector2.Distance(currTargetPos, character.SimPosition) < 1.0f) { + character.AIController.SteeringManager.Reset(); character.AnimController.TargetDir = currTargetPos.X > character.SimPosition.X ? Direction.Right : Direction.Left; } + else + { + + character.AIController.SteeringManager.SteeringSeek(currTargetPos); + + } } public override bool IsCompleted() diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index fb2b199e7..c99c5fc14 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -217,7 +217,7 @@ namespace Barotrauma { if (!MathUtils.IsValid(value)) return; oxygen = MathHelper.Clamp(value, 0.0f, 100.0f); - if (oxygen == 0.0f) Kill(CauseOfDeath.Suffocation); + if (oxygen == 0.0f) Kill(AnimController.InWater ? CauseOfDeath.Drowning : CauseOfDeath.Suffocation); } } diff --git a/Subsurface/Source/GameSession/CrewManager.cs b/Subsurface/Source/GameSession/CrewManager.cs index d5d39643d..439e7e921 100644 --- a/Subsurface/Source/GameSession/CrewManager.cs +++ b/Subsurface/Source/GameSession/CrewManager.cs @@ -97,6 +97,7 @@ namespace Barotrauma var img = new GUIImage(new Rectangle(0, 0, 30, 30), order.SymbolSprite, Alignment.Center, orderListBox.children[characterIndex]); img.Scale = 30.0f / img.SourceRect.Width; img.Color = order.Color; + img.CanBeFocused = false; img.ToolTip ="Order: "+ order.Name; } diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index d97848e84..1ef01de41 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -263,9 +263,13 @@ namespace Barotrauma { while (cinematic.Running) { + if (Submarine.Loaded == null) yield return CoroutineStatus.Success; + yield return CoroutineStatus.Running; } + if (Submarine.Loaded == null) yield return CoroutineStatus.Success; + End(""); yield return new WaitForSeconds(18.0f); diff --git a/Subsurface/Source/GameSession/ShiftSummary.cs b/Subsurface/Source/GameSession/ShiftSummary.cs index 330044795..d8a773423 100644 --- a/Subsurface/Source/GameSession/ShiftSummary.cs +++ b/Subsurface/Source/GameSession/ShiftSummary.cs @@ -123,7 +123,7 @@ namespace Barotrauma y += 30; new GUITextBlock(new Rectangle(0, y, innerFrame.Rect.Width - 170, 0), - (GameMain.GameSession.Mission.Completed) ? GameMain.GameSession.Mission.SuccessMessage : GameMain.GameSession.Mission.FailureMessage+" asdf asdf rthdrthfgdh dsrt dfgh dftsret dfth dftdthdft sdre sdr ds askjinflaje wwwwwwwwww wwwwwwww wwwwwwwwwwwwwww wwwwwwwwwww", + (GameMain.GameSession.Mission.Completed) ? GameMain.GameSession.Mission.SuccessMessage : GameMain.GameSession.Mission.FailureMessage, GUI.Style, innerFrame, true); //y += 50; diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index aebb6ddc7..28ed5c998 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -270,7 +270,7 @@ namespace Barotrauma highlightedSlot = slotRect; } - UpdateSlot(spriteBatch, slotRect, i, Items[i], i > 4); + UpdateSlot(spriteBatch, slotRect, i, Items[i], false, i>4 ? 0.2f : 0.4f); if (draggingItem!=null && draggingItem == Items[i]) draggingItemSlot = slotRect; } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 34a0c5a3c..94021653e 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -253,7 +253,7 @@ namespace Barotrauma 1.0f, SpriteEffects.None, 0.0f); } - protected void UpdateSlot(SpriteBatch spriteBatch, Rectangle rect, int slotIndex, Item item, bool isSubSlot, bool drawItem=true) + protected void UpdateSlot(SpriteBatch spriteBatch, Rectangle rect, int slotIndex, Item item, bool isSubSlot, float alpha = 0.4f, bool drawItem=true) { bool mouseOn = rect.Contains(PlayerInput.MousePosition) && !Locked; @@ -326,14 +326,14 @@ namespace Barotrauma } - DrawSlot(spriteBatch, rect, (draggingItem == item && !mouseOn) ? null : item, mouseOn, isSubSlot, drawItem); + DrawSlot(spriteBatch, rect, (draggingItem == item && !mouseOn) ? null : item, mouseOn, isSubSlot, alpha, drawItem); } - protected void DrawSlot(SpriteBatch spriteBatch, Rectangle rect, Item item, bool isHighLighted, bool isSubSlot, bool drawItem=true) + protected void DrawSlot(SpriteBatch spriteBatch, Rectangle rect, Item item, bool isHighLighted, bool isSubSlot, float alpha=0.4f, bool drawItem=true) { - GUI.DrawRectangle(spriteBatch, rect, (isHighLighted ? Color.Red : Color.White) * ((isSubSlot) ? 0.1f : 0.3f), true); - + GUI.DrawRectangle(spriteBatch, rect, (isHighLighted ? Color.Red : Color.White) * alpha*0.75f, true); + if (item != null && item.Condition < 100.0f) { GUI.DrawRectangle(spriteBatch, new Rectangle(rect.X, rect.Bottom - 4, rect.Width, 4), Color.Black, true); @@ -342,7 +342,7 @@ namespace Barotrauma Color.Lerp(Color.Red, Color.Green, item.Condition / 100.0f), true); } - GUI.DrawRectangle(spriteBatch, rect, (isHighLighted ? Color.Red : Color.White) * ((isSubSlot) ? 0.2f : 0.4f), false); + GUI.DrawRectangle(spriteBatch, rect, (isHighLighted ? Color.Red : Color.White) * alpha, false); if (item == null || !drawItem) return; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 5f20852f4..0f46d2664 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -806,7 +806,15 @@ namespace Barotrauma object value = objectProperty.GetValue(); if (value != null) { - propertyBox.Text = value.ToString(); + if (value is float) + { + propertyBox.Text = ((float)value).ToString("G", System.Globalization.CultureInfo.InvariantCulture); + } + else + { + + propertyBox.Text = value.ToString(); + } } propertyBox.UserData = objectProperty; @@ -924,7 +932,7 @@ namespace Barotrauma if (!item.prefab.PickThroughWalls) { - Body body = Submarine.CheckVisibility(item.Submarine == null ? position : position - item.Submarine.SimPosition, item.SimPosition); + Body body = Submarine.CheckVisibility(item.Submarine == null ? position : position - item.Submarine.SimPosition, item.SimPosition, true); if (body != null && body.UserData as Item != item) continue; } diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index 9f5c8f0e3..10f0f933b 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -253,7 +253,7 @@ namespace Barotrauma if (particle != null) { - particle.Size = particle.Size * Math.Abs(flowForce.X / 1000.0f); + particle.Size = particle.Size * Math.Min(Math.Abs(flowForce.X / 1000.0f),5.0f); } pos.Y = Rand.Range(lowerSurface, rect.Y - rect.Height); @@ -279,14 +279,14 @@ namespace Barotrauma var splash = GameMain.ParticleManager.CreateParticle( "watersplash", Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position, - -velocity); + -velocity, 0, FlowTargetHull); if (splash != null) splash.Size = splash.Size * MathHelper.Clamp(rect.Width / 50.0f, 0.8f, 4.0f); GameMain.ParticleManager.CreateParticle( "bubbles", - Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position, - flowForce / 2.0f); + Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position, + flowForce / 2.0f, 0, FlowTargetHull); } } diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 6c296645e..f32694aa3 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -349,7 +349,7 @@ namespace Barotrauma /// check visibility between two points (in sim units) /// /// a physics body that was between the points (or null) - public static Body CheckVisibility(Vector2 rayStart, Vector2 rayEnd) + public static Body CheckVisibility(Vector2 rayStart, Vector2 rayEnd, bool ignoreLevel = false) { Body closestBody = null; float closestFraction = 1.0f; @@ -365,6 +365,8 @@ namespace Barotrauma if (fixture == null || (fixture.CollisionCategories != Physics.CollisionWall && fixture.CollisionCategories != Physics.CollisionLevel)) return -1; + if (ignoreLevel && fixture.CollisionCategories == Physics.CollisionLevel) return -1; + Structure structure = fixture.Body.UserData as Structure; if (structure != null) { diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 50f8130bf..335fb4265 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -353,9 +353,13 @@ namespace Barotrauma { Vector2 normal = Vector2.Normalize(body.Position - limb.SimPosition); - normal *= Math.Min(limb.Mass,100)/100.0f; + //normal *= Math.Min(limb.Mass,100)/100.0f; - ApplyImpact(normal, contact); + float impact = Math.Min(Vector2.Dot(Velocity - limb.LinearVelocity, -normal),5.0f); + + ApplyImpact(impact * Math.Min(limb.Mass/200.0f, 1), -normal, contact); + + //ApplyImpact((-limb.LinearVelocity * Math.Min(limb.Mass, 100)) / 50.0f, contact); } return collision; @@ -365,7 +369,18 @@ namespace Barotrauma } var collisionNormal = Vector2.Normalize(ConvertUnits.ToDisplayUnits(body.Position) - cell.Center); - ApplyImpact(collisionNormal, contact); + + + Vector2 tempNormal; + + FarseerPhysics.Common.FixedArray2 worldPoints; + contact.GetWorldManifold(out tempNormal, out worldPoints); + + Vector2 lastContactPoint = worldPoints[0]; + + float wallImpact = Vector2.Dot(Velocity, -collisionNormal); + + ApplyImpact(wallImpact, -collisionNormal, contact); //Vector2 u = Vector2.Dot(Velocity, -normal) * normal; @@ -436,26 +451,21 @@ namespace Barotrauma return false; } - private void ApplyImpact(Vector2 normal,Contact contact) + private void ApplyImpact(float impact, Vector2 direction, Contact contact) { + if (impact < 3.0f) return; + Vector2 tempNormal; FarseerPhysics.Common.FixedArray2 worldPoints; contact.GetWorldManifold(out tempNormal, out worldPoints); - - Vector2 lastContactPoint = worldPoints[0]; - float impact = Vector2.Dot(Velocity, -normal); - - if (impact < 3.0f) return; - - SoundPlayer.PlayDamageSound(DamageSoundType.StructureBlunt, impact * 10.0f, ConvertUnits.ToDisplayUnits(lastContactPoint)); GameMain.GameScreen.Cam.Shake = impact * 2.0f; - Vector2 limbForce = -normal * impact * 0.5f; + Vector2 limbForce = direction * impact * 0.5f; float length = limbForce.Length(); if (length > 10.0f) limbForce = (limbForce / length) * 10.0f; diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index 814cb8cd4..0eedfcac7 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -139,8 +139,10 @@ namespace Barotrauma int iconX = iconIndices[(int)spawnType]*IconSize % iconTexture.Width; int iconY = (int)(Math.Floor(iconIndices[(int)spawnType]*IconSize / (float)iconTexture.Width))*IconSize; + int iconSize = ConnectedGap == null && Ladders == null ? IconSize : (int)(IconSize * 1.5f); + spriteBatch.Draw(iconTexture, - new Rectangle((int)(drawPos.X - IconSize/2), (int)(drawPos.Y - IconSize/2), IconSize, IconSize), + new Rectangle((int)(drawPos.X - iconSize/2), (int)(drawPos.Y - iconSize/2), iconSize, iconSize), new Rectangle(iconX, iconY, IconSize,IconSize), clr); //GUI.DrawRectangle(spriteBatch, new Rectangle(drawRect.X, -drawRect.Y, rect.Width, rect.Height), clr, true); diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 3cdf3ea91..79714501d 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -74,7 +74,16 @@ namespace Barotrauma.Particles spriteIndex = Rand.Int(prefab.Sprites.Count); currentHull = Hull.FindHull(position, hullGuess); - if (currentHull != null && currentHull.Submarine != null) speed += ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); + //if (currentHull != null && currentHull.Submarine != null) + //{ + // Vector2 subVel = ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); + // //subVel.Y = -subVel.Y; + // speed += subVel; + //} + //else + //{ + // int a = 1; + //} //if (currentHull == null) position = Submarine.Loaded == null ? position : position + Submarine.Loaded.Position; this.position = position; @@ -133,9 +142,12 @@ namespace Barotrauma.Particles public bool Update(float deltaTime) { + + Vector2 subVel = currentHull ==null || currentHull.Submarine==null ? Vector2.Zero : ConvertUnits.ToDisplayUnits(currentHull.Submarine.Velocity); + //over 3 times faster than position += velocity * deltatime - position.X += velocity.X * deltaTime; - position.Y += velocity.Y * deltaTime; + position.X += (velocity.X+subVel.X) * deltaTime; + position.Y += (velocity.Y+subVel.Y) * deltaTime; if (prefab.RotateToDirection) { @@ -237,7 +249,7 @@ namespace Barotrauma.Particles { position.Y = prevHullRect.Y - 1.0f; velocity.X = Math.Abs(velocity.Y) * Math.Sign(velocity.X); - velocity.Y = -velocity.Y*0.1f; + velocity.Y = -velocity.Y * 0.1f; } if (position.X < prevHullRect.X) diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 3c2e71c939d1a6fc163b322319c5021e8da67f64..dc20b0e4575888c3559d824d9b07674ad1c45383 100644 GIT binary patch delta 21250 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 delta 19485 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 E0O3Jl=Kufz