From e4a048a54ad5070a40d07eb6fc9de245becf3dd8 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sun, 1 Nov 2015 22:10:31 +0200 Subject: [PATCH] Removing the obstruction element without flickering, better looking (& working) radar --- Subsurface/Source/Characters/Character.cs | 22 +++- Subsurface/Source/GUI/GUITickBox.cs | 8 +- .../Source/Items/Components/Machines/Pump.cs | 2 +- .../Source/Items/Components/Machines/Radar.cs | 122 +++++++++++++++--- .../Items/Components/Machines/Steering.cs | 2 +- Subsurface/Source/Map/Levels/Level.cs | 15 ++- Subsurface/Source/Map/Lights/LightManager.cs | 6 +- Subsurface/Source/Networking/BanList.cs | 2 +- Subsurface/Source/Networking/NetworkMember.cs | 21 +-- Subsurface/Source/Screens/LobbyScreen.cs | 19 +-- Subsurface/Source/Screens/NetLobbyScreen.cs | 1 + Subsurface/changelog.txt | 4 + Subsurface_Solution.v12.suo | Bin 785408 -> 808960 bytes 13 files changed, 167 insertions(+), 57 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 05a63261f..aba1f100d 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -152,9 +152,17 @@ namespace Barotrauma set { lowPassMultiplier = MathHelper.Clamp(value, 0.0f, 1.0f); } } + private float obstructVisionAmount; public bool ObstructVision { - get; set; + get + { + return obstructVisionAmount > 0.5f; + } + set + { + obstructVisionAmount = 1.0f; + } } public float SoundRange @@ -831,6 +839,8 @@ namespace Barotrauma { if (!Enabled) return; + obstructVisionAmount = Math.Max(obstructVisionAmount - deltaTime, 0.0f); + AnimController.SimplePhysicsEnabled = (Character.controlled != this && Vector2.Distance(cam.WorldViewCenter, Position) > 5000.0f); if (isDead) return; @@ -839,12 +849,11 @@ namespace Barotrauma { bool protectedFromPressure = PressureProtection > 0.0f; - if (Submarine.Loaded!=null && Level.Loaded !=null) - { - protectedFromPressure = protectedFromPressure && (Position-Level.Loaded.Position).Y > SubmarineBody.DamageDepth; - } + if (Submarine.Loaded!=null && Level.Loaded !=null) + { + protectedFromPressure = protectedFromPressure && (Position-Level.Loaded.Position).Y > SubmarineBody.DamageDepth; + } - if (!protectedFromPressure && (AnimController.CurrentHull == null || AnimController.CurrentHull.LethalPressure >= 100.0f)) { @@ -865,7 +874,6 @@ namespace Barotrauma if (aiTarget != null) aiTarget.SoundRange = 0.0f; lowPassMultiplier = MathHelper.Lerp(lowPassMultiplier, 1.0f, 0.1f); - ObstructVision = false; if (needsAir) { diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index 49c315044..c402d0852 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -87,8 +87,12 @@ namespace Barotrauma DrawChildren(spriteBatch); - GUI.DrawRectangle(spriteBatch, new Rectangle(box.Rect.X + 2, box.Rect.Y + 2, box.Rect.Width - 4, box.Rect.Height - 4), - selected ? Color.Green * 0.8f : Color.Black, true); + GUI.DrawRectangle(spriteBatch, new Rectangle(box.Rect.X + 1, box.Rect.Y + 1, box.Rect.Width - 2, box.Rect.Height - 2), + box.State == ComponentState.Hover ? new Color(50,50,50,255) : Color.Black, true); + + if (!selected) return; + GUI.DrawRectangle(spriteBatch, new Rectangle(box.Rect.X + 5, box.Rect.Y + 5, box.Rect.Width - 10, box.Rect.Height - 10), + Color.Green * 0.8f, true); } } diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index 7535a9068..eb786fe56 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -28,7 +28,7 @@ namespace Barotrauma.Items.Components } } - [HasDefaultValue(100.0f, false)] + [HasDefaultValue(80.0f, false)] public float MaxFlow { get { return maxFlow; } diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index 0b5311f0f..a53794544 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; +using Voronoi2; namespace Barotrauma.Items.Components { @@ -27,6 +28,8 @@ namespace Barotrauma.Items.Components public Radar(Item item, XElement element) : base(item, element) { + radarBlips = new List(); + foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLower()) @@ -47,6 +50,12 @@ namespace Barotrauma.Items.Components { base.Update(deltaTime, cam); + for (int i = radarBlips.Count - 1; i >= 0; i-- ) + { + radarBlips[i].FadeTimer -= deltaTime*0.5f; + if (radarBlips[i].FadeTimer <= 0.0f) radarBlips.RemoveAt(i); + } + if (voltage >= minVoltage) { pingState = (pingState + deltaTime * 0.5f); @@ -77,7 +86,7 @@ namespace Barotrauma.Items.Components if (voltage < minVoltage) return; - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 20, y + 20, 200, 30), "Activate Sonar")) + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 0, y + 0, 150, 30), "Activate Sonar")) { IsActive = !IsActive; item.NewComponentEvent(this, true, false); @@ -89,6 +98,9 @@ namespace Barotrauma.Items.Components //voltage = 0.0f; } + private List radarBlips; + private float prevPingRadius; + private void DrawRadar(SpriteBatch spriteBatch, Rectangle rect) { @@ -98,10 +110,15 @@ namespace Barotrauma.Items.Components if (!IsActive) return; - if (pingCircle!=null) - { + + //if (pingCircle!=null) + //{ + + + float pingRadius = (rect.Width / 2) * pingState; pingCircle.Draw(spriteBatch, center, Color.White * (1.0f-pingState), 0.0f, (rect.Width/pingCircle.size.X)*pingState); - } + + //} float radius = rect.Width / 2.0f; @@ -110,17 +127,41 @@ namespace Barotrauma.Items.Components if (Level.Loaded != null) { - List edges = Level.Loaded.GetCellEdges(-Level.Loaded.Position, 7); + List cells = Level.Loaded.GetCells(-Level.Loaded.Position, 7); Vector2 offset = Vector2.Zero; - for (int i = 0; i < edges.Count; i++) + foreach (VoronoiCell cell in cells) { - if ((edges[i][0] * displayScale).Length() > radius) continue; - if ((edges[i][1] * displayScale).Length() > radius) continue; - GUI.DrawLine(spriteBatch, - center + (edges[i][0] - offset) * displayScale, - center + (edges[i][1] - offset) * displayScale, Color.White); + foreach (GraphEdge edge in cell.edges) + { + //if (!edge.isSolid) continue; + float cellDot = Vector2.Dot(cell.Center + Level.Loaded.Position, (edge.point1 + edge.point2) / 2.0f - cell.Center); + if (cellDot > 0) continue; + + Vector2 point1 = (edge.point1 + Level.Loaded.Position); + Vector2 point2 = (edge.point2 + Level.Loaded.Position); + + for (float x=0; x<(point1-point2).Length(); x+=Rand.Range(600.0f, 800.0f)) + { + Vector2 point = point1 + Vector2.Normalize(point2 - point1) * x; + + float pointDist = point.Length() * displayScale; + + if (pointDist > radius) continue; + if (pointDist > prevPingRadius && pointDist < pingRadius) { + + for (float z = 0; z radius) continue; + foreach (Limb limb in c.AnimController.Limbs) + { + Vector2 pos = limb.Position; + float pointDist = pos.Length() * displayScale; + + if (limb.SimPosition == Vector2.Zero || pointDist > radius) continue; + + + if (pointDist > radius) continue; + if (pointDist > prevPingRadius && pointDist < pingRadius) + { + var blip = new RadarBlip(pos - Level.Loaded.Position, 1.0f); + radarBlips.Add(blip); + } + } - int width = (int)MathHelper.Clamp(c.Mass / 20, 1, 10); + //int width = (int)MathHelper.Clamp(c.Mass / 20, 1, 10); - pos.Y = -pos.Y; - pos += center; + //pos.Y = -pos.Y; + //pos += center; - GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - width / 2, (int)pos.Y - width / 2, width, width), Color.White, true); + //GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - width / 2, (int)pos.Y - width / 2, width, width), Color.White, true); } + foreach (RadarBlip radarBlip in radarBlips) + { + Vector2 pos = (radarBlip.Position + Level.Loaded.Position) * displayScale; + pos.Y = -pos.Y; + + //spriteBatch.Draw(radarBlipSprite, center+pos, + // new Rectangle((int)(radarBlip.SpriteIndex % 4 * 32), (int)(Math.Floor(radarBlip.SpriteIndex / 4.0f) * 32), 32, 32), + // Color.White * radarBlip.FadeTimer, 0.0f, new Vector2(16.0f, 16.0f), 0.5f, SpriteEffects.None, 0.0f); + + pos.X = MathUtils.Round(pos.X, 4); + + pos.Y = MathUtils.Round(pos.Y, 2); + + GUI.DrawRectangle(spriteBatch, center+pos, new Vector2(4, 2), Color.Green * radarBlip.FadeTimer, true); + } + + prevPingRadius = pingRadius; + if (screenOverlay!=null) { screenOverlay.Draw(spriteBatch, center, 0.0f, rect.Width/screenOverlay.size.X); } + //prevPingRadius = pingRadius; + if (GameMain.GameSession == null) return; @@ -239,6 +314,17 @@ namespace Barotrauma.Items.Components return; } } + } + class RadarBlip + { + public float FadeTimer; + public Vector2 Position; + + public RadarBlip(Vector2 pos, float fadeTimer) + { + Position = pos; + FadeTimer = fadeTimer; + } } } diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index 38ae89fa9..9fb7936bc 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -119,7 +119,7 @@ namespace Barotrauma.Items.Components GuiFrame.Draw(spriteBatch); Rectangle velRect = new Rectangle(x + 20, y + 20, width - 40, height - 40); - GUI.DrawRectangle(spriteBatch, velRect, Color.White, false); + //GUI.DrawRectangle(spriteBatch, velRect, Color.White, false); if (GUI.DrawButton(spriteBatch, new Rectangle(x + width - 150, y + height - 30, 150, 30), "Autopilot")) { diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index 95703046f..a923c2ae2 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -890,6 +890,19 @@ namespace Barotrauma } } + for (int side = 0; side < 2; side++) + { + for (int n = 0; n < 2; n++) + { + if (Vector2.Distance(wrappingWalls[side, n].MidPos, pos) > WrappingWall.WallWidth) continue; + + foreach (VoronoiCell cell in wrappingWalls[side, n].Cells) + { + cells.Add(cell); + } + } + } + return cells; } @@ -921,7 +934,7 @@ namespace Barotrauma Vector2 end = cell.edges[i].point2 + Position; end.Y = -end.Y; - + edges.Add(new Vector2[] { start, end }); //GUI.DrawLine(spriteBatch, start, end, (cell.body != null && cell.body.Enabled) ? Color.Green : Color.Red); } diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index de5cab385..88538b3bd 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -79,6 +79,8 @@ namespace Barotrauma.Lights spriteBatch.Begin(SpriteSortMode.Immediate, CustomBlendStates.Multiplicative); spriteBatch.Draw(losTexture, Vector2.Zero); spriteBatch.End(); + + ObstructVision = false; } public void OnMapLoaded() @@ -164,8 +166,8 @@ namespace Barotrauma.Lights Vector2 diff = lookAtPosition - ViewPos; diff.Y = -diff.Y; float rotation = MathUtils.VectorToAngle(diff); - - Vector2 scale = new Vector2(3.0f, 1.0f); + + Vector2 scale = new Vector2(MathHelper.Clamp(diff.Length()/256.0f, 2.0f, 5.0f), 2.0f); spriteBatch.Draw(LightSource.LightTexture, new Vector2(ViewPos.X, -ViewPos.Y), null, Color.White, rotation, new Vector2(LightSource.LightTexture.Width*0.2f, LightSource.LightTexture.Height/2), scale, SpriteEffects.None, 0.0f); diff --git a/Subsurface/Source/Networking/BanList.cs b/Subsurface/Source/Networking/BanList.cs index 30c2fd979..35ef31005 100644 --- a/Subsurface/Source/Networking/BanList.cs +++ b/Subsurface/Source/Networking/BanList.cs @@ -9,7 +9,7 @@ namespace Barotrauma.Networking { class BanList { - const string SavePath = "Data/bannedplayers.xml"; + const string SavePath = "Data/bannedplayers.txt"; private List bannedPlayers; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index ec97c99f8..fd52419a9 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -10,32 +10,23 @@ namespace Barotrauma.Networking { Unknown, - Login, - LoggedIn, - LogOut, + Login, LoggedIn, LogOut, - PlayerJoined, - PlayerLeft, - KickedOut, + PlayerJoined, PlayerLeft, KickedOut, - StartGame, - EndGame, + StartGame, EndGame, CharacterInfo, - Chatmessage, - UpdateNetLobby, + Chatmessage, UpdateNetLobby, NetworkEvent, Traitor, - Vote, - VoteStatus, + Vote, VoteStatus, - ResendRequest, - ReliableMessage, - LatestMessageID + ResendRequest, ReliableMessage, LatestMessageID } enum VoteType diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index 24d588624..518191b77 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -67,24 +67,24 @@ namespace Barotrauma //new GUITextBlock(new Rectangle(0, 0, 200, 25), // save, Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel); - GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 30, 200, 25), - "", Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel); + GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 30, 0, 25), + "", Color.Transparent, Color.White, Alignment.TopCenter, GUI.Style, leftPanel); moneyText.TextGetter = GetMoney; - GUIButton button = new GUIButton(new Rectangle(0, 70, 100, 30), "Map", null, Alignment.Left, GUI.Style, leftPanel); + GUIButton button = new GUIButton(new Rectangle(0, 70, 100, 30), "Map", null, Alignment.TopCenter, GUI.Style, leftPanel); button.UserData = PanelTab.Map; button.OnClicked = SelectRightPanel; SelectRightPanel(button, button.UserData); - button = new GUIButton(new Rectangle(0, 110, 100, 30), "Crew", null, Alignment.Left, GUI.Style, leftPanel); + button = new GUIButton(new Rectangle(0, 110, 100, 30), "Crew", null, Alignment.TopCenter, GUI.Style, leftPanel); button.UserData = PanelTab.Crew; button.OnClicked = SelectRightPanel; - button = new GUIButton(new Rectangle(0, 150, 100, 30), "Hire", null, Alignment.Left, GUI.Style, leftPanel); + button = new GUIButton(new Rectangle(0, 150, 100, 30), "Hire", null, Alignment.TopCenter, GUI.Style, leftPanel); button.UserData = PanelTab.CurrentLocation; button.OnClicked = SelectRightPanel; - button = new GUIButton(new Rectangle(0, 190, 100, 30), "Store", null, Alignment.Left, GUI.Style, leftPanel); + button = new GUIButton(new Rectangle(0, 190, 100, 30), "Store", null, Alignment.TopCenter, GUI.Style, leftPanel); button.UserData = PanelTab.Store; button.OnClicked = SelectRightPanel; @@ -454,9 +454,10 @@ namespace Barotrauma private bool StartShift(GUIButton button, object selection) { - //GameMain.ShowLoading(ShiftLoading()); - GameMain.GameSession.StartShift(selectedLevel, false); - GameMain.GameScreen.Select(); + GameMain.ShowLoading(ShiftLoading()); + + //GameMain.GameSession.StartShift(selectedLevel, false); + //GameMain.GameScreen.Select(); return true; } diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 172e4d3fb..24afdc285 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -699,6 +699,7 @@ namespace Barotrauma if (GameMain.NetworkMember.CharacterInfo == null) return true; GameMain.NetworkMember.CharacterInfo.HeadSpriteId += dir; + if (GameMain.Client != null) GameMain.Client.SendCharacterData(); UpdatePreviewPlayer(GameMain.NetworkMember.CharacterInfo); diff --git a/Subsurface/changelog.txt b/Subsurface/changelog.txt index 15646efaa..59f1566d0 100644 --- a/Subsurface/changelog.txt +++ b/Subsurface/changelog.txt @@ -15,6 +15,10 @@ Submarine: Creatures: - a new enemy that only spawns deep below the level +Items: + - diving suits and mask now obstruct vision when worn + - nicer looking sonar monitor + Misc: - the levels aren't just enclosed tunnels anymore and it's possible to dive much deeper - settings menu diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 23df6311acbc33ef51a675c0d7b70d33758150f0..e8ad72e7460bdf2b7d94a95f57872336674557fb 100644 GIT binary patch delta 15446 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