From 41569675f31a3d677df52d7c6006e03240e9f0d2 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Thu, 9 Jun 2016 18:34:43 +0300 Subject: [PATCH] Started refactoring the submarine class in order to make it possible to add multiple submarines (or other movable structures) --- .vs/Subsurface_Solution/v14/.suo | Bin 783360 -> 837120 bytes Subsurface/Source/Camera.cs | 7 +- .../Source/Characters/AI/HumanAIController.cs | 6 +- .../Characters/AI/IndoorsSteeringManager.cs | 6 +- .../AI/Objectives/AIObjectiveGoTo.cs | 2 +- .../AI/Objectives/AIObjectiveIdle.cs | 2 +- .../Source/Characters/Animation/Ragdoll.cs | 2 +- Subsurface/Source/Characters/Character.cs | 12 ++-- Subsurface/Source/DebugConsole.cs | 15 ++-- Subsurface/Source/Events/ArtifactEvent.cs | 2 +- .../Source/Events/Missions/CargoMission.cs | 2 +- .../Source/Events/Missions/MonsterMission.cs | 2 +- .../Source/Events/Missions/SalvageMission.cs | 2 +- Subsurface/Source/Events/MonsterEvent.cs | 2 +- Subsurface/Source/GUI/GUI.cs | 4 +- .../GameSession/GameModes/SinglePlayerMode.cs | 14 ++-- .../GameSession/GameModes/TraitorMode.cs | 2 +- .../GameModes/Tutorials/BasicTutorial.cs | 12 ++-- .../GameModes/Tutorials/TutorialType.cs | 2 +- Subsurface/Source/GameSession/GameSession.cs | 2 +- .../Source/GameSession/InfoTextManager.cs | 2 +- Subsurface/Source/GameSession/ShiftSummary.cs | 2 +- .../Items/Components/Holdable/Holdable.cs | 2 +- .../Items/Components/Machines/Engine.cs | 2 +- .../Items/Components/Machines/MiniMap.cs | 8 ++- .../Source/Items/Components/Machines/Radar.cs | 33 +++++---- .../Items/Components/Machines/Steering.cs | 12 ++-- .../Source/Items/Components/Signal/Wire.cs | 10 +-- Subsurface/Source/Items/Item.cs | 2 +- Subsurface/Source/Items/ItemPrefab.cs | 14 ++-- Subsurface/Source/Map/Gap.cs | 14 ++-- Subsurface/Source/Map/Hull.cs | 4 +- Subsurface/Source/Map/Submarine.cs | 65 ++++++++++++------ 33 files changed, 151 insertions(+), 117 deletions(-) diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 195ff13d26d5c6440664ad902ca3ae7e4082f9ff..188fc21d54af280052ad9995ae6d2807c2c2c798 100644 GIT binary patch delta 29178 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 delta 22784 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 200.0f && character.AnimController.CurrentHull!=null) return; diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index de4362d40..a78ac465a 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -594,7 +594,7 @@ namespace Barotrauma CurrentHull = newHull; - character.Submarine = CurrentHull == null ? null : Submarine.Loaded; + character.Submarine = currentHull == null ? null : currentHull.Submarine; UpdateCollisionCategories(); } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 54d676f9b..bdbb31842 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -855,7 +855,10 @@ namespace Barotrauma } cursorPosition = cam.ScreenToWorld(PlayerInput.MousePosition); - if (AnimController.CurrentHull != null) cursorPosition -= Submarine.Loaded.Position; + if (AnimController.CurrentHull != null && AnimController.CurrentHull.Submarine != null) + { + cursorPosition -= AnimController.CurrentHull.Submarine.Position; + } Vector2 mouseSimPos = ConvertUnits.ToSimUnits(cursorPosition); @@ -1006,12 +1009,9 @@ namespace Barotrauma if (needsAir) { bool protectedFromPressure = PressureProtection > 0.0f; - - if (Submarine.Loaded != null && Level.Loaded != null) - { - protectedFromPressure = protectedFromPressure && WorldPosition.Y > SubmarineBody.DamageDepth; - } + protectedFromPressure = protectedFromPressure && WorldPosition.Y > SubmarineBody.DamageDepth; + if (!protectedFromPressure && (AnimController.CurrentHull == null || AnimController.CurrentHull.LethalPressure >= 80.0f)) { diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index d6d5ffd54..cec862549 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -213,8 +213,6 @@ namespace Barotrauma break; case "near": case "close": - if (Submarine.Loaded == null) break; - float closestDist = 0.0f; foreach (WayPoint wp in WayPoint.WayPointList) { @@ -223,7 +221,7 @@ namespace Barotrauma //don't spawn inside hulls if (Hull.FindHull(wp.WorldPosition, null) != null) continue; - float dist = Vector2.Distance(wp.WorldPosition, Submarine.Loaded.WorldPosition); + float dist = Vector2.Distance(wp.WorldPosition, GameMain.GameScreen.Cam.WorldViewCenter); if (spawnPoint == null || dist < closestDist) { @@ -319,7 +317,9 @@ namespace Barotrauma Character.Controlled = Character.CharacterList.Find(c => !c.IsNetworkPlayer && c.Name.ToLowerInvariant() == commands[1]); break; case "godmode": - Submarine.Loaded.GodMode = !Submarine.Loaded.GodMode; + if (Submarine.MainSub == null) return; + + Submarine.MainSub.GodMode = !Submarine.MainSub.GodMode; break; case "dumpids": int count = commands.Length < 2 ? 10 : int.Parse(commands[1]); @@ -438,8 +438,11 @@ namespace Barotrauma return; } - if (Submarine.SaveCurrent(System.IO.Path.Combine(Submarine.SavePath, fileName +".sub"))) NewMessage("map saved", Color.Green); - Submarine.Loaded.CheckForErrors(); + if (Submarine.SaveCurrent(System.IO.Path.Combine(Submarine.SavePath, fileName + ".sub"))) + { + NewMessage("Sub saved", Color.Green); + //Submarine.Loaded.First().CheckForErrors(); + } break; case "loadmap": diff --git a/Subsurface/Source/Events/ArtifactEvent.cs b/Subsurface/Source/Events/ArtifactEvent.cs index eec8653d0..2ce06c449 100644 --- a/Subsurface/Source/Events/ArtifactEvent.cs +++ b/Subsurface/Source/Events/ArtifactEvent.cs @@ -55,7 +55,7 @@ namespace Barotrauma state = 2; break; case 2: - if (!Submarine.Loaded.AtEndPosition && !Submarine.Loaded.AtStartPosition) return; + if (!Submarine.MainSub.AtEndPosition && !Submarine.MainSub.AtStartPosition) return; Finished(); state = 3; diff --git a/Subsurface/Source/Events/Missions/CargoMission.cs b/Subsurface/Source/Events/Missions/CargoMission.cs index 27bb8dbe8..17002449c 100644 --- a/Subsurface/Source/Events/Missions/CargoMission.cs +++ b/Subsurface/Source/Events/Missions/CargoMission.cs @@ -96,7 +96,7 @@ namespace Barotrauma public override void End() { - if (Submarine.Loaded != null && Submarine.Loaded.AtEndPosition) + if (Submarine.MainSub != null && Submarine.MainSub.AtEndPosition) { int deliveredItemCount = items.Count(i => i.CurrentHull != null && i.Condition > 0.0f); diff --git a/Subsurface/Source/Events/Missions/MonsterMission.cs b/Subsurface/Source/Events/Missions/MonsterMission.cs index afab51956..503febcaa 100644 --- a/Subsurface/Source/Events/Missions/MonsterMission.cs +++ b/Subsurface/Source/Events/Missions/MonsterMission.cs @@ -44,7 +44,7 @@ namespace Barotrauma radarPosition = monster.Position; } else if (GameMain.Client == null) - { Vector2 diff = monster.WorldPosition-Submarine.Loaded.WorldPosition; + { Vector2 diff = monster.WorldPosition - Submarine.MainSub.WorldPosition; monster.Enabled = FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) < NetConfig.CharacterIgnoreDistance; } diff --git a/Subsurface/Source/Events/Missions/SalvageMission.cs b/Subsurface/Source/Events/Missions/SalvageMission.cs index b418cd62e..e0309ea79 100644 --- a/Subsurface/Source/Events/Missions/SalvageMission.cs +++ b/Subsurface/Source/Events/Missions/SalvageMission.cs @@ -69,7 +69,7 @@ namespace Barotrauma state = 1; break; case 1: - if (!Submarine.Loaded.AtEndPosition && !Submarine.Loaded.AtStartPosition) return; + if (!Submarine.MainSub.AtEndPosition && !Submarine.MainSub.AtStartPosition) return; ShowMessage(state); state = 2; break; diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index 1bd0e6eaa..7162c7937 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -83,7 +83,7 @@ namespace Barotrauma { if (monster.IsDead) continue; - if (!isStarted && Vector2.Distance(monster.WorldPosition, Submarine.Loaded.WorldPosition) < 5000.0f) isStarted = true; + if (!isStarted && Vector2.Distance(monster.WorldPosition, Submarine.MainSub.WorldPosition) < 5000.0f) isStarted = true; monstersDead = false; break; diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 75ea8bcb7..a8f4c269d 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -414,10 +414,10 @@ namespace Barotrauma "Camera pos: " + GameMain.GameScreen.Cam.Position, new Vector2(10, 70), Color.White); - if (Submarine.Loaded!=null) + if (Submarine.MainSub != null) { spriteBatch.DrawString(Font, - "Sub pos: " + Submarine.Loaded.Position, + "Sub pos: " + Submarine.MainSub.Position, new Vector2(10, 90), Color.White); } } diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index 9e933d519..db0c3801d 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -143,14 +143,14 @@ namespace Barotrauma CrewManager.Draw(spriteBatch); - if (Submarine.Loaded == null) return; + if (Submarine.MainSub == null) return; - if (Submarine.Loaded.AtEndPosition) + if (Submarine.MainSub.AtEndPosition) { endShiftButton.Text = "Enter " + Map.SelectedLocation.Name; endShiftButton.Draw(spriteBatch); } - else if (Submarine.Loaded.AtStartPosition) + else if (Submarine.MainSub.AtStartPosition) { endShiftButton.Text = "Enter " + Map.CurrentLocation.Name; endShiftButton.Draw(spriteBatch); @@ -199,7 +199,7 @@ namespace Barotrauma if (success) { - if (Submarine.Loaded.AtEndPosition) + if (Submarine.MainSub.AtEndPosition) { Map.MoveToNextLocation(); } @@ -240,7 +240,7 @@ namespace Barotrauma { isRunning = false; - var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, 5.0f); + var cinematic = new TransitionCinematic(Submarine.MainSub, GameMain.GameScreen.Cam, 5.0f); SoundPlayer.OverrideMusicType = CrewManager.characters.Any(c => !c.IsDead) ? "endshift" : "crewdead"; @@ -253,12 +253,12 @@ namespace Barotrauma { while (cinematic.Running) { - if (Submarine.Loaded == null) yield return CoroutineStatus.Success; + if (Submarine.MainSub == null) yield return CoroutineStatus.Success; yield return CoroutineStatus.Running; } - if (Submarine.Loaded == null) yield return CoroutineStatus.Success; + if (Submarine.MainSub == null) yield return CoroutineStatus.Success; End(""); diff --git a/Subsurface/Source/GameSession/GameModes/TraitorMode.cs b/Subsurface/Source/GameSession/GameModes/TraitorMode.cs index 7051902a5..7c5d99018 100644 --- a/Subsurface/Source/GameSession/GameModes/TraitorMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TraitorMode.cs @@ -95,7 +95,7 @@ namespace Barotrauma endMessage = traitorCharacter.Name + " was a traitor! "; endMessage += (traitorCharacter.Info.Gender == Gender.Male) ? "His" : "Her"; endMessage += " task was to assassinate " + targetCharacter.Name + ". "; - endMessage += (Submarine.Loaded.AtEndPosition) ? + endMessage += (Submarine.MainSub.AtEndPosition) ? "The task was unsuccessful - the has submarine reached its destination." : "The task was unsuccessful."; } diff --git a/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs b/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs index 228b79063..a600e0cfc 100644 --- a/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs +++ b/Subsurface/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs @@ -22,7 +22,7 @@ namespace Barotrauma.Tutorials //spawn some fish next to the player GameMain.GameScreen.BackgroundCreatureManager.SpawnSprites(2, - Submarine.Loaded.Position + Character.Controlled.Position); + Submarine.MainSub.Position + Character.Controlled.Position); yield return new WaitForSeconds(4.0f); @@ -276,7 +276,7 @@ namespace Barotrauma.Tutorials infoBox = CreateInfoFrame("Steer the submarine downwards, heading further into the cavern."); - while (Submarine.Loaded.WorldPosition.Y > 24600.0f) + while (Submarine.MainSub.WorldPosition.Y > 24600.0f) { yield return CoroutineStatus.Running; } @@ -300,7 +300,7 @@ namespace Barotrauma.Tutorials bool broken = false; do { - Submarine.Loaded.Velocity = Vector2.Zero; + Submarine.MainSub.Velocity = Vector2.Zero; moloch.AIController.SelectTarget(steering.Item.CurrentHull.AiTarget); Vector2 steeringDir = windows[0].WorldPosition - moloch.WorldPosition; @@ -349,7 +349,7 @@ namespace Barotrauma.Tutorials } } - Submarine.Loaded.GodMode = true; + Submarine.MainSub.GodMode = true; var capacitor1 = Item.ItemList.Find(i => i.HasTag("capacitor1")).GetComponent(); var capacitor2 = Item.ItemList.Find(i => i.HasTag("capacitor1")).GetComponent(); @@ -462,7 +462,7 @@ namespace Barotrauma.Tutorials yield return CoroutineStatus.Running; } - Submarine.Loaded.GodMode = false; + Submarine.MainSub.GodMode = false; infoBox = CreateInfoFrame("The creature has died. Now you should fix the damages in the control room: " + "Grab a welding tool from the closet in the railgun room."); @@ -588,7 +588,7 @@ namespace Barotrauma.Tutorials GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; GameMain.LightManager.LosEnabled = false; - var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, 5.0f); + var cinematic = new TransitionCinematic(Submarine.MainSub, GameMain.GameScreen.Cam, 5.0f); while (cinematic.Running) { diff --git a/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs b/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs index 36af62a21..502ec7ec2 100644 --- a/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs +++ b/Subsurface/Source/GameSession/GameModes/Tutorials/TutorialType.cs @@ -36,7 +36,7 @@ namespace Barotrauma.Tutorials public virtual void Initialize() { - GameMain.GameSession = new GameSession(Submarine.Loaded, "", GameModePreset.list.Find(gm => gm.Name.ToLowerInvariant() == "tutorial")); + GameMain.GameSession = new GameSession(Submarine.MainSub, "", GameModePreset.list.Find(gm => gm.Name.ToLowerInvariant() == "tutorial")); (GameMain.GameSession.gameMode as TutorialMode).tutorialType = this; GameMain.GameSession.StartShift("tuto1"); diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index b16e0d567..901e59b26 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -121,7 +121,7 @@ namespace Barotrauma return; } - if (reloadSub || Submarine.Loaded != submarine) submarine.Load(); + if (reloadSub || Submarine.MainSub != submarine) submarine.Load(); if (level != null) { diff --git a/Subsurface/Source/GameSession/InfoTextManager.cs b/Subsurface/Source/GameSession/InfoTextManager.cs index 3e28cfc0a..78bca7b25 100644 --- a/Subsurface/Source/GameSession/InfoTextManager.cs +++ b/Subsurface/Source/GameSession/InfoTextManager.cs @@ -51,7 +51,7 @@ namespace Barotrauma string text = infoList[Rand.Int(infoList.Count)]; - if (Submarine.Loaded!=null) text = text.Replace("[sub]", Submarine.Loaded.Name); + if (Submarine.MainSub != null) text = text.Replace("[sub]", Submarine.MainSub.Name); if (GameMain.GameSession != null && GameMain.GameSession.Map != null) { if (GameMain.GameSession.Map.CurrentLocation!=null) diff --git a/Subsurface/Source/GameSession/ShiftSummary.cs b/Subsurface/Source/GameSession/ShiftSummary.cs index 45c13bb6a..6c4c03c52 100644 --- a/Subsurface/Source/GameSession/ShiftSummary.cs +++ b/Subsurface/Source/GameSession/ShiftSummary.cs @@ -32,7 +32,7 @@ namespace Barotrauma bool singleplayer = GameMain.NetworkMember == null; bool gameOver = gameSession.CrewManager.characters.All(c => c.IsDead); - bool progress = Submarine.Loaded.AtEndPosition; + bool progress = Submarine.MainSub.AtEndPosition; GUIFrame frame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.8f); diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index fffafd02e..4684d0a9e 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -101,7 +101,7 @@ namespace Barotrauma.Items.Components Msg = ""; } - if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen && Submarine.Loaded != null)) Use(1.0f); + if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen)) Use(1.0f); //holdAngle = ToolBox.GetAttributeFloat(element, "holdangle", 0.0f); diff --git a/Subsurface/Source/Items/Components/Machines/Engine.cs b/Subsurface/Source/Items/Components/Machines/Engine.cs index a97d3030c..bf3be00fe 100644 --- a/Subsurface/Source/Items/Components/Machines/Engine.cs +++ b/Subsurface/Source/Items/Components/Machines/Engine.cs @@ -86,7 +86,7 @@ namespace Barotrauma.Items.Components { Vector2 currForce = new Vector2((force / 100.0f) * maxForce * (voltage / minVoltage), 0.0f); - Submarine.Loaded.ApplyForce(currForce); + item.Submarine.ApplyForce(currForce); if (item.CurrentHull != null) { diff --git a/Subsurface/Source/Items/Components/Machines/MiniMap.cs b/Subsurface/Source/Items/Components/Machines/MiniMap.cs index a03ecc9d2..9e3f3e9f9 100644 --- a/Subsurface/Source/Items/Components/Machines/MiniMap.cs +++ b/Subsurface/Source/Items/Components/Machines/MiniMap.cs @@ -36,6 +36,8 @@ namespace Barotrauma.Items.Components public override void DrawHUD(SpriteBatch spriteBatch, Character character) { + if (item.Submarine == null) return; + int width = GuiFrame.Rect.Width, height = GuiFrame.Rect.Height; int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; @@ -48,12 +50,12 @@ namespace Barotrauma.Items.Components Rectangle miniMap = new Rectangle(x + 20, y + 40, width - 40, height - 60); - float size = Math.Min((float)miniMap.Width / (float)Submarine.Borders.Width, (float)miniMap.Height / (float)Submarine.Borders.Height); + float size = Math.Min((float)miniMap.Width / (float)item.Submarine.Borders.Width, (float)miniMap.Height / (float)item.Submarine.Borders.Height); foreach (Hull hull in Hull.hullList) { Rectangle hullRect = new Rectangle( - miniMap.X + (int)((hull.Rect.X - Submarine.HiddenSubPosition.X - Submarine.Borders.X) * size), - miniMap.Y - (int)((hull.Rect.Y - Submarine.HiddenSubPosition.Y - Submarine.Borders.Y) * size), + miniMap.X + (int)((hull.Rect.X - Submarine.HiddenSubPosition.X - item.Submarine.Borders.X) * size), + miniMap.Y - (int)((hull.Rect.Y - Submarine.HiddenSubPosition.Y - item.Submarine.Borders.Y) * size), (int)(hull.Rect.Width * size), (int)(hull.Rect.Height * size)); diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index be281b135..b35a82a98 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -124,38 +124,41 @@ namespace Barotrauma.Items.Components float radius = rect.Width / 2.0f; float displayScale = radius / range; - - if (DetectSubmarineWalls) + + foreach (Submarine submarine in Submarine.Loaded) { - for (int i = 0; i < Submarine.Loaded.HullVertices.Count; i++) - { - Vector2 start = ConvertUnits.ToDisplayUnits(Submarine.Loaded.HullVertices[i]); - Vector2 end = ConvertUnits.ToDisplayUnits(Submarine.Loaded.HullVertices[(i + 1) % Submarine.Loaded.HullVertices.Count]); + if (item.Submarine == submarine && !DetectSubmarineWalls) continue; - if (item.CurrentHull!=null) + for (int i = 0; i < submarine.HullVertices.Count; i++) + { + Vector2 start = ConvertUnits.ToDisplayUnits(submarine.HullVertices[i]); + Vector2 end = ConvertUnits.ToDisplayUnits(submarine.HullVertices[(i + 1) % submarine.HullVertices.Count]); + + if (item.Submarine == submarine) { start += Rand.Vector(500.0f); end += Rand.Vector(500.0f); } CreateBlipsForLine( - start + Submarine.Loaded.WorldPosition, - end + Submarine.Loaded.WorldPosition, + start + submarine.WorldPosition, + end + submarine.WorldPosition, radius, displayScale, 200.0f, 2.0f); } - } - else + + + if (item.Submarine != null && !DetectSubmarineWalls) { float simScale = displayScale * Physics.DisplayToSimRation; - Vector2 offset = ConvertUnits.ToSimUnits(Submarine.Loaded.WorldPosition - item.WorldPosition); + Vector2 offset = ConvertUnits.ToSimUnits(item.Submarine.WorldPosition - item.WorldPosition); - for (int i = 0; i < Submarine.Loaded.HullVertices.Count; i++) + for (int i = 0; i < item.Submarine.HullVertices.Count; i++) { - Vector2 start = (Submarine.Loaded.HullVertices[i] + offset) * simScale; + Vector2 start = (item.Submarine.HullVertices[i] + offset) * simScale; start.Y = -start.Y; - Vector2 end = (Submarine.Loaded.HullVertices[(i + 1) % Submarine.Loaded.HullVertices.Count] + offset) * simScale; + Vector2 end = (item.Submarine.HullVertices[(i + 1) % item.Submarine.HullVertices.Count] + offset) * simScale; end.Y = -end.Y; GUI.DrawLine(spriteBatch, center + start, center + end, Color.Green); diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index c625eeb59..78befa10e 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -163,10 +163,10 @@ namespace Barotrauma.Items.Components Rectangle velRect = new Rectangle(x + 20, y + 20, width - 40, height - 40); //GUI.DrawRectangle(spriteBatch, velRect, Color.White, false); - if (Submarine.Loaded != null && Level.Loaded != null) + if (item.Submarine != null && Level.Loaded != null) { - Vector2 realWorldVelocity = ConvertUnits.ToDisplayUnits(Submarine.Loaded.Velocity * Physics.DisplayToRealWorldRatio) * 3.6f; - float realWorldDepth = Math.Abs(Submarine.Loaded.Position.Y - Level.Loaded.Size.Y) * Physics.DisplayToRealWorldRatio; + Vector2 realWorldVelocity = ConvertUnits.ToDisplayUnits(item.Submarine.Velocity * Physics.DisplayToRealWorldRatio) * 3.6f; + float realWorldDepth = Math.Abs(item.Submarine.Position.Y - Level.Loaded.Size.Y) * Physics.DisplayToRealWorldRatio; GUI.DrawString(spriteBatch, new Vector2(x + 20, y + height - 65), "Velocity: " + (int)realWorldVelocity.X + " km/h", Color.LightGreen, null, 0, GUI.SmallFont); GUI.DrawString(spriteBatch, new Vector2(x + 20, y + height - 50), @@ -220,7 +220,7 @@ namespace Barotrauma.Items.Components if (autopilotRayCastTimer <= 0.0f && steeringPath.NextNode != null) { - Vector2 diff = Vector2.Normalize(ConvertUnits.ToSimUnits(steeringPath.NextNode.Position - Submarine.Loaded.WorldPosition)); + Vector2 diff = Vector2.Normalize(ConvertUnits.ToSimUnits(steeringPath.NextNode.Position - item.Submarine.WorldPosition)); bool nextVisible = true; for (int x = -1; x < 2; x += 2) @@ -228,9 +228,9 @@ namespace Barotrauma.Items.Components for (int y = -1; y < 2; y += 2) { Vector2 cornerPos = - new Vector2(Submarine.Borders.Width * x, Submarine.Borders.Height * y) / 2.0f; + new Vector2(item.Submarine.Borders.Width * x, item.Submarine.Borders.Height * y) / 2.0f; - cornerPos = ConvertUnits.ToSimUnits(cornerPos * 1.2f + Submarine.Loaded.WorldPosition); + cornerPos = ConvertUnits.ToSimUnits(cornerPos * 1.2f + item.Submarine.WorldPosition); float dist = Vector2.Distance(cornerPos, steeringPath.NextNode.SimPosition); diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 9cb18be5f..fcd82f401 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -366,7 +366,7 @@ namespace Barotrauma.Items.Components for (int i = 0; i < Nodes.Count; i++) { Vector2 worldPos = Nodes[i]; - if (Submarine.Loaded != null) worldPos += Submarine.Loaded.Position + Submarine.HiddenSubPosition; + if (item.Submarine != null) worldPos += item.Submarine.Position + Submarine.HiddenSubPosition; worldPos.Y = -worldPos.Y; GUI.DrawRectangle(spriteBatch, worldPos + new Vector2(-3, -3), new Vector2(6, 6), item.Color, true, 0.0f); @@ -407,7 +407,7 @@ namespace Barotrauma.Items.Components MapEntity.DisableSelect = true; //Nodes[(int)selectedNodeIndex] = GameMain.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition)-Submarine.HiddenSubPosition+Submarine.Loaded.Position; - Vector2 nodeWorldPos = GameMain.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition) - Submarine.HiddenSubPosition - Submarine.Loaded.Position;// Nodes[(int)selectedNodeIndex]; + Vector2 nodeWorldPos = GameMain.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition) - Submarine.HiddenSubPosition - item.Submarine.Position;// Nodes[(int)selectedNodeIndex]; nodeWorldPos.X = MathUtils.Round(nodeWorldPos.X, Submarine.GridSize.X / 2.0f); nodeWorldPos.Y = MathUtils.Round(nodeWorldPos.Y, Submarine.GridSize.Y / 2.0f); @@ -428,10 +428,10 @@ namespace Barotrauma.Items.Components private void DrawSection(SpriteBatch spriteBatch, Vector2 start, Vector2 end, Color color, float width = 0.3f) { - if (Submarine.Loaded!=null) + if (item.Submarine != null) { - start += Submarine.Loaded.DrawPosition + Submarine.HiddenSubPosition; - end += Submarine.Loaded.DrawPosition + Submarine.HiddenSubPosition; + start += item.Submarine.DrawPosition + Submarine.HiddenSubPosition; + end += item.Submarine.DrawPosition + Submarine.HiddenSubPosition; } start.Y = -start.Y; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 4e9fb0134..511a0f707 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -525,7 +525,7 @@ namespace Barotrauma CurrentHull = Hull.FindHull(WorldPosition, CurrentHull); if (body != null) { - Submarine = CurrentHull == null ? null : Submarine.Loaded; + Submarine = CurrentHull == null ? null : CurrentHull.Submarine; body.Submarine = Submarine; } diff --git a/Subsurface/Source/Items/ItemPrefab.cs b/Subsurface/Source/Items/ItemPrefab.cs index e75d2e392..e23f345f3 100644 --- a/Subsurface/Source/Items/ItemPrefab.cs +++ b/Subsurface/Source/Items/ItemPrefab.cs @@ -109,7 +109,7 @@ namespace Barotrauma public override void UpdatePlacing(SpriteBatch spriteBatch, Camera cam) { - Vector2 position = Submarine.MouseToWorldGrid(cam); + Vector2 position = Submarine.MouseToWorldGrid(cam, Submarine.MainSub); if (PlayerInput.RightButtonClicked()) { @@ -121,10 +121,10 @@ namespace Barotrauma { if (PlayerInput.LeftButtonClicked()) { - var item = new Item(new Rectangle((int)position.X, (int)position.Y, (int)sprite.size.X, (int)sprite.size.Y), this, Submarine.Loaded); + var item = new Item(new Rectangle((int)position.X, (int)position.Y, (int)sprite.size.X, (int)sprite.size.Y), this, Submarine.MainSub); //constructor.Invoke(lobject); - item.Submarine = Submarine.Loaded; - item.SetTransform(ConvertUnits.ToSimUnits(Submarine.Loaded==null ? item.Position : item.Position - Submarine.Loaded.Position), 0.0f); + item.Submarine = Submarine.MainSub; + item.SetTransform(ConvertUnits.ToSimUnits(Submarine.MainSub==null ? item.Position : item.Position - Submarine.MainSub.Position), 0.0f); item.FindHull(); placePosition = Vector2.Zero; @@ -152,11 +152,11 @@ namespace Barotrauma if (PlayerInput.LeftButtonReleased()) { - var item = new Item(new Rectangle((int)placePosition.X, (int)placePosition.Y, (int)placeSize.X, (int)placeSize.Y), this, Submarine.Loaded); + var item = new Item(new Rectangle((int)placePosition.X, (int)placePosition.Y, (int)placeSize.X, (int)placeSize.Y), this, Submarine.MainSub); placePosition = Vector2.Zero; - item.Submarine = Submarine.Loaded; - item.SetTransform(ConvertUnits.ToSimUnits(Submarine.Loaded == null ? item.Position : item.Position - Submarine.Loaded.Position), 0.0f); + item.Submarine = Submarine.MainSub; + item.SetTransform(ConvertUnits.ToSimUnits(Submarine.MainSub == null ? item.Position : item.Position - Submarine.MainSub.Position), 0.0f); item.FindHull(); //selected = null; diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index 930cb574c..31452a2ca 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -83,7 +83,7 @@ namespace Barotrauma } public Gap(MapEntityPrefab prefab, Rectangle rectangle) - : this (rectangle, Submarine.Loaded) + : this (rectangle, Submarine.MainSub) { } public Gap(Rectangle newRect, Submarine submarine) @@ -253,7 +253,7 @@ namespace Barotrauma var particle = GameMain.ParticleManager.CreateParticle( "watersplash", - (Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position) - Vector2.UnitY * Rand.Range(0.0f, 10.0f), + (Submarine == null ? pos : pos + Submarine.Position) - Vector2.UnitY * Rand.Range(0.0f, 10.0f), velocity); if (particle != null) @@ -269,7 +269,7 @@ namespace Barotrauma GameMain.ParticleManager.CreateParticle( "bubbles", - Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position, + Submarine == null ? pos : pos + Submarine.Position, flowForce / 10.0f); } } @@ -288,14 +288,14 @@ namespace Barotrauma var splash = GameMain.ParticleManager.CreateParticle( "watersplash", - Submarine.Loaded == null ? pos : pos + Submarine.Loaded.Position, + Submarine == null ? pos : pos + Submarine.Position, -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, + Submarine == null ? pos : pos + Submarine.Position, flowForce / 2.0f, 0, FlowTargetHull); } } @@ -552,7 +552,7 @@ namespace Barotrauma } else { - hull1.LethalPressure += (Submarine.Loaded != null && Submarine.Loaded.AtDamageDepth) ? 100.0f * deltaTime : 10.0f * deltaTime; + hull1.LethalPressure += (Submarine != null && Submarine.AtDamageDepth) ? 100.0f * deltaTime : 10.0f * deltaTime; } } else @@ -567,7 +567,7 @@ namespace Barotrauma } if (hull1.Volume >= hull1.FullVolume - Hull.MaxCompress) { - hull1.LethalPressure += (Submarine.Loaded != null && Submarine.Loaded.AtDamageDepth) ? 100.0f * deltaTime : 10.0f * deltaTime; + hull1.LethalPressure += (Submarine != null && Submarine.AtDamageDepth) ? 100.0f * deltaTime : 10.0f * deltaTime; } } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 6a92645a7..4f3f4f7ea 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -178,7 +178,7 @@ namespace Barotrauma } public Hull(MapEntityPrefab prefab, Rectangle rectangle) - : this (prefab, rectangle, Submarine.Loaded) + : this (prefab, rectangle, Submarine.MainSub) { } @@ -821,7 +821,7 @@ namespace Barotrauma } else { - var newFire = new FireSource(pos + Submarine.Loaded.Position, this, true); + var newFire = new FireSource(pos + Submarine.Position, this, true); newFire.Size = new Vector2( newFire.Hull == null ? size : size * newFire.Hull.rect.Width, newFire.Size.Y); diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 59446d81d..7c5da46d5 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -30,7 +30,8 @@ namespace Barotrauma public static readonly Vector2 GridSize = new Vector2(16.0f, 16.0f); - private static Submarine loaded; + public static Submarine MainSub; + private static List loaded; private SubmarineBody subBody; @@ -96,16 +97,16 @@ namespace Barotrauma } } - public static Submarine Loaded - { - get { return loaded; } - } + //public static List Loaded + //{ + // get { return loaded; } + //} - public static Rectangle Borders + public Rectangle Borders { get { - return (loaded==null) ? Rectangle.Empty : Loaded.subBody.Borders; + return subBody.Borders; } } @@ -255,17 +256,17 @@ namespace Barotrauma //math/physics stuff ---------------------------------------------------- - public static Vector2 MouseToWorldGrid(Camera cam) + public static Vector2 MouseToWorldGrid(Camera cam, Submarine sub) { Vector2 position = PlayerInput.MousePosition; position = cam.ScreenToWorld(position); Vector2 worldGridPos = VectorToWorldGrid(position); - if (loaded != null) + if (sub != null) { - worldGridPos.X += loaded.Position.X % GridSize.X; - worldGridPos.Y += loaded.Position.Y % GridSize.Y; + worldGridPos.X += sub.Position.X % GridSize.X; + worldGridPos.Y += sub.Position.Y % GridSize.Y; } return worldGridPos; @@ -435,6 +436,23 @@ namespace Barotrauma //Level.Loaded.Move(-amount); } + public static Submarine GetClosest(Vector2 worldPosition) + { + Submarine closest = null; + float closestDist = 0.0f; + foreach (Submarine sub in Submarine.loaded) + { + float dist = Vector2.Distance(worldPosition, sub.WorldPosition); + if (closest == null || dist < closestDist) + { + closest = sub; + closestDist = dist; + } + } + + return closest; + } + public override bool FillNetworkData(Networking.NetworkEventType type, NetBuffer message, object data) { if (subBody == null) return false; @@ -519,15 +537,17 @@ namespace Barotrauma public static bool SaveCurrent(string filePath) { - if (loaded==null) + if (!loaded.Any()) { - loaded = new Submarine(filePath); + loaded.Add(new Submarine(filePath)); // return; } - loaded.filePath = filePath; + System.Diagnostics.Debug.Assert(loaded.Count==1); - return loaded.SaveAs(filePath); + loaded.First().filePath = filePath; + + return loaded.First().SaveAs(filePath); } public void CheckForErrors() @@ -766,8 +786,8 @@ namespace Barotrauma subBody = new SubmarineBody(this); subBody.SetPosition(HiddenSubPosition); - - loaded = this; + + loaded.Add(this); Hull.GenerateEntityGrid(); @@ -809,16 +829,19 @@ namespace Barotrauma public static void Unload() { - if (loaded == null) return; Sound.OnGameEnd(); if (GameMain.LightManager != null) GameMain.LightManager.ClearLights(); - - loaded.Remove(); + + + foreach (Submarine sub in loaded) + { + sub.Remove(); + sub.Clear(); + } loaded.Clear(); - loaded = null; } private void Clear()