diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 912f87970..aa1a33b04 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -450,13 +450,11 @@ namespace Barotrauma if (pauseMenuOpen) { - pauseMenu.Update(0.016f); pauseMenu.Draw(spriteBatch); } if (settingsMenuOpen) { - GameMain.Config.SettingsFrame.Update(0.016f); GameMain.Config.SettingsFrame.Draw(spriteBatch); } @@ -469,6 +467,17 @@ namespace Barotrauma public static void Update(float deltaTime) { + + if (pauseMenuOpen) + { + pauseMenu.Update(0.016f); + } + + if (settingsMenuOpen) + { + GameMain.Config.SettingsFrame.Update(0.016f); + } + if (GUIMessageBox.MessageBoxes.Count > 0) { var messageBox = GUIMessageBox.MessageBoxes.Peek(); diff --git a/Subsurface/Source/GUI/GUIButton.cs b/Subsurface/Source/GUI/GUIButton.cs index 59022491c..a4ea869e2 100644 --- a/Subsurface/Source/GUI/GUIButton.cs +++ b/Subsurface/Source/GUI/GUIButton.cs @@ -161,6 +161,27 @@ namespace Barotrauma public override void Draw(SpriteBatch spriteBatch) { if (!Visible) return; + + //Color currColor = color; + //if (state == ComponentState.Hover) currColor = hoverColor; + //if (state == ComponentState.Selected) currColor = selectedColor; + + //GUI.DrawRectangle(spriteBatch, rect, currColor * alpha, true); + + ////spriteBatch.DrawString(HUD.font, text, new Vector2(rect.X+rect.Width/2, rect.Y+rect.Height/2), Color.Black, 0.0f, new Vector2(0.5f,0.5f), 1.0f, SpriteEffects.None, 0.0f); + + //GUI.DrawRectangle(spriteBatch, rect, Color.Black * alpha, false); + + DrawChildren(spriteBatch); + + //if (!Enabled) GUI.DrawRectangle(spriteBatch, rect, Color.Gray*0.5f, true); + } + + public override void Update(float deltaTime) + { + if (!Visible) return; + + base.Update(deltaTime); if (rect.Contains(PlayerInput.MousePosition) && CanBeSelected && Enabled && (MouseOn == null || MouseOn == this || IsParentOf(MouseOn))) { @@ -183,7 +204,7 @@ namespace Barotrauma else { Selected = !Selected; - // state = state == ComponentState.Selected ? ComponentState.None : ComponentState.Selected; + // state = state == ComponentState.Selected ? ComponentState.None : ComponentState.Selected; } } } @@ -193,20 +214,6 @@ namespace Barotrauma } frame.State = state; - - //Color currColor = color; - //if (state == ComponentState.Hover) currColor = hoverColor; - //if (state == ComponentState.Selected) currColor = selectedColor; - - //GUI.DrawRectangle(spriteBatch, rect, currColor * alpha, true); - - ////spriteBatch.DrawString(HUD.font, text, new Vector2(rect.X+rect.Width/2, rect.Y+rect.Height/2), Color.Black, 0.0f, new Vector2(0.5f,0.5f), 1.0f, SpriteEffects.None, 0.0f); - - //GUI.DrawRectangle(spriteBatch, rect, Color.Black * alpha, false); - - DrawChildren(spriteBatch); - - //if (!Enabled) GUI.DrawRectangle(spriteBatch, rect, Color.Gray*0.5f, true); } } } diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 3262949b8..e4e698b5d 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -71,6 +71,9 @@ namespace Barotrauma private bool hasLoaded; + private GameTime fixedTime; + private double updatesToMake; + //public static Random localRandom; //public static Random random; @@ -141,6 +144,9 @@ namespace Barotrauma IsFixedTimeStep = false; //TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 55); + updatesToMake = 0.0; + fixedTime = new GameTime(); + World = new World(new Vector2(0, -9.82f)); FarseerPhysics.Settings.AllowSleep = true; FarseerPhysics.Settings.ContinuousPhysics = false; @@ -286,40 +292,52 @@ namespace Barotrauma /// Provides a snapshot of timing values. protected override void Update(GameTime gameTime) { - base.Update(gameTime); + double realDeltaTime = gameTime.ElapsedGameTime.TotalSeconds; + double deltaTime = 0.016; + updatesToMake += realDeltaTime; - double deltaTime = gameTime.ElapsedGameTime.TotalSeconds; - PlayerInput.Update(deltaTime); - - bool paused = false; - - if (hasLoaded && !titleScreenOpen) + while (updatesToMake > 0.0) { - SoundPlayer.Update(); + fixedTime.IsRunningSlowly = gameTime.IsRunningSlowly; + TimeSpan addTime = new TimeSpan(0,0,0,0,16); + fixedTime.ElapsedGameTime = addTime; + fixedTime.TotalGameTime.Add(addTime); + base.Update(fixedTime); - if (PlayerInput.KeyHit(Keys.Escape)) GUI.TogglePauseMenu(); + PlayerInput.Update(deltaTime); - DebugConsole.Update(this, (float)deltaTime); + bool paused = false; - paused = (DebugConsole.IsOpen || GUI.PauseMenuOpen || GUI.SettingsMenuOpen) && - (NetworkMember == null || !NetworkMember.GameStarted); - - if (!paused) Screen.Selected.Update(deltaTime); - - if (NetworkMember != null) + if (hasLoaded && !titleScreenOpen) { - NetworkMember.Update((float)deltaTime); - } - else - { - + SoundPlayer.Update(); + + if (PlayerInput.KeyHit(Keys.Escape)) GUI.TogglePauseMenu(); + + DebugConsole.Update(this, (float)deltaTime); + + paused = (DebugConsole.IsOpen || GUI.PauseMenuOpen || GUI.SettingsMenuOpen) && + (NetworkMember == null || !NetworkMember.GameStarted); + + if (!paused || Screen.Selected is MainMenuScreen) Screen.Selected.Update(deltaTime); + + if (NetworkMember != null) + { + NetworkMember.Update((float)deltaTime); + } + else + { + + } + + GUI.Update((float)deltaTime); + } - GUI.Update((float)deltaTime); + CoroutineManager.Update((float)deltaTime, paused ? 0.0f : (float)deltaTime); + updatesToMake -= deltaTime; } - - CoroutineManager.Update((float)deltaTime, paused ? 0.0f : (float)deltaTime); } diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 24d5cab32..11415cdc6 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -469,6 +469,8 @@ namespace Barotrauma.Items.Components //} public virtual void DrawHUD(SpriteBatch spriteBatch, Character character) { } + + public virtual void UpdateHUD(Character character) { } /// true if the operation was completed public virtual bool AIOperate(float deltaTime, Character character, AIObjectiveOperateItem objective) diff --git a/Subsurface/Source/Items/Components/Machines/Deconstructor.cs b/Subsurface/Source/Items/Components/Machines/Deconstructor.cs index 453fa0a2c..72b90ee54 100644 --- a/Subsurface/Source/Items/Components/Machines/Deconstructor.cs +++ b/Subsurface/Source/Items/Components/Machines/Deconstructor.cs @@ -82,10 +82,14 @@ namespace Barotrauma.Items.Components public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - GuiFrame.Update((float)Physics.step); GuiFrame.Draw(spriteBatch); } + public override void UpdateHUD(Character character) + { + GuiFrame.Update((float)Physics.step); + } + private bool ToggleActive(GUIButton button, object obj) { SetActive(!IsActive); diff --git a/Subsurface/Source/Items/Components/Machines/Fabricator.cs b/Subsurface/Source/Items/Components/Machines/Fabricator.cs index fc3c4373b..1bc118493 100644 --- a/Subsurface/Source/Items/Components/Machines/Fabricator.cs +++ b/Subsurface/Source/Items/Components/Machines/Fabricator.cs @@ -338,6 +338,11 @@ namespace Barotrauma.Items.Components } public override void DrawHUD(SpriteBatch spriteBatch, Character character) + { + GuiFrame.Draw(spriteBatch); + } + + public override void UpdateHUD(Character character) { FabricableItem targetItem = itemList.SelectedData as FabricableItem; if (targetItem != null) @@ -346,7 +351,6 @@ namespace Barotrauma.Items.Components } GuiFrame.Update((float)Physics.step); - GuiFrame.Draw(spriteBatch); } private bool CanBeFabricated(FabricableItem fabricableItem, Character user) diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index 6fef9548f..f1de62ceb 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -156,13 +156,17 @@ namespace Barotrauma.Items.Components int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; - GuiFrame.Update(1.0f / 60.0f); GuiFrame.Draw(spriteBatch); spriteBatch.DrawString(GUI.Font, "Pumping speed: " + (int)flowPercentage + " %", new Vector2(x + 40, y + 85), Color.White); } + public override void UpdateHUD(Character character) + { + GuiFrame.Update(1.0f / 60.0f); + } + public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item sender, float power=0.0f) { base.ReceiveSignal(stepsTaken, signal, connection, sender, power); diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index 6643d0324..c15c0a13e 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -102,8 +102,6 @@ namespace Barotrauma.Items.Components public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - - GuiFrame.Update(1.0f / 60.0f); GuiFrame.Draw(spriteBatch); if (voltage < minVoltage && powerConsumption > 0.0f) return; @@ -112,6 +110,11 @@ namespace Barotrauma.Items.Components DrawRadar(spriteBatch, new Rectangle((int)GuiFrame.Center.X - radius, (int)GuiFrame.Center.Y - radius, radius * 2, radius * 2)); } + public override void UpdateHUD(Character character) + { + GuiFrame.Update(1.0f / 60.0f); + } + private void DrawRadar(SpriteBatch spriteBatch, Rectangle rect) { Vector2 center = new Vector2(rect.X + rect.Width*0.5f, rect.Center.Y); diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 97f49431e..f3c5430cf 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -438,7 +438,6 @@ namespace Barotrauma.Items.Components int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; - GuiFrame.Update(1.0f / 60.0f); GuiFrame.Draw(spriteBatch); float xOffset = (graphTimer / (float)updateGraphInterval); @@ -481,6 +480,11 @@ namespace Barotrauma.Items.Components //y = y - 260; } + public override void UpdateHUD(Character character) + { + GuiFrame.Update(1.0f / 60.0f); + } + private bool ToggleAutoTemp(GUITickBox tickBox) { unsentChanges = true; diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index 5c94b7a53..40b9b0c7a 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -161,7 +161,6 @@ namespace Barotrauma.Items.Components int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; - GuiFrame.Update(1.0f / 60.0f); GuiFrame.Draw(spriteBatch); if (voltage < minVoltage && powerConsumption > 0.0f) return; @@ -210,6 +209,11 @@ namespace Barotrauma.Items.Components } } + public override void UpdateHUD(Character character) + { + GuiFrame.Update(1.0f / 60.0f); + } + private void UpdateAutoPilot(float deltaTime) { if (posToMaintain != null) diff --git a/Subsurface/Source/Items/FixRequirement.cs b/Subsurface/Source/Items/FixRequirement.cs index c5574038a..cf9304734 100644 --- a/Subsurface/Source/Items/FixRequirement.cs +++ b/Subsurface/Source/Items/FixRequirement.cs @@ -184,18 +184,23 @@ namespace Barotrauma } public static void DrawHud(SpriteBatch spriteBatch, Item item, Character character) + { + if (frame == null) return; + + frame.Draw(spriteBatch); + } + + public static void UpdateHud(Item item,Character character) { if (frame == null || frame.UserData != item) { CreateGUIFrame(item); - } UpdateGUIFrame(item, character); if (frame == null) return; frame.Update((float)Physics.step); - frame.Draw(spriteBatch); } } } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 06aed9624..93cde516c 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1057,6 +1057,20 @@ namespace Barotrauma } } + public virtual void UpdateHUD(Character character) + { + if (condition <= 0.0f) + { + FixRequirement.UpdateHud(this, character); + return; + } + + foreach (ItemComponent ic in components) + { + ic.UpdateHUD(character); + } + } + public List GetConnectedComponents(bool recursive = false) { List connectedComponents = new List(); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 611616aad..3da0c27a0 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -108,6 +108,14 @@ namespace Barotrauma Character.UpdateAll(cam, (float)deltaTime); + if (Character.Controlled != null && Character.Controlled.SelectedConstruction != null) + { + if (Character.Controlled.SelectedConstruction == Character.Controlled.ClosestItem) + { + Character.Controlled.SelectedConstruction.UpdateHUD(Character.Controlled); + } + } + BackgroundCreatureManager.Update(cam, (float)deltaTime); GameMain.ParticleManager.Update((float)deltaTime); diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index b51b1b2a0..669de6e02 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -12,6 +12,8 @@ namespace Barotrauma { public enum Tab { NewGame = 1, LoadGame = 2, HostServer = 3, Settings = 4 } + private GUIButton[] menuButtons; + GUIFrame buttonsTab; private GUIFrame[] menuTabs; @@ -43,42 +45,52 @@ namespace Barotrauma 290, y, 500, 360); + menuButtons = new GUIButton[8]; + GUIButton button = new GUIButton(new Rectangle(50, y, 200, 30), "Tutorial", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.OnClicked = TutorialButtonClicked; + menuButtons[0] = button; button = new GUIButton(new Rectangle(50, y + 60, 200, 30), "New Game", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.UserData = Tab.NewGame; button.OnClicked = SelectTab; + menuButtons[1] = button; button = new GUIButton(new Rectangle(50, y + 100, 200, 30), "Load Game", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.UserData = Tab.LoadGame; button.OnClicked = SelectTab; + menuButtons[2] = button; button = new GUIButton(new Rectangle(50, y + 160, 200, 30), "Join Server", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; //button.UserData = (int)Tabs.JoinServer; button.OnClicked = JoinServerClicked; + menuButtons[3] = button; button = new GUIButton(new Rectangle(50, y + 200, 200, 30), "Host Server", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.UserData = Tab.HostServer; button.OnClicked = SelectTab; + menuButtons[4] = button; button = new GUIButton(new Rectangle(50, y + 260, 200, 30), "Submarine Editor", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.OnClicked = (GUIButton btn, object userdata) => { GameMain.EditMapScreen.Select(); return true; }; + menuButtons[5] = button; button = new GUIButton(new Rectangle(50, y + 320, 200, 30), "Settings", null, Alignment.TopLeft, Alignment.Left, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.UserData = Tab.Settings; button.OnClicked = SelectTab; + menuButtons[6] = button; button = new GUIButton(new Rectangle(0, 0, 150, 30), "Quit", Alignment.BottomRight, GUI.Style, buttonsTab); button.Color = button.Color * 0.8f; button.OnClicked = QuitClicked; + menuButtons[7] = button; panelRect.Y += 10; @@ -478,6 +490,11 @@ namespace Barotrauma public override void Update(double deltaTime) { + foreach (GUIButton button in menuButtons) + { + button.Update((float)deltaTime); + } + buttonsTab.Update((float)deltaTime); if (selectedTab>0) menuTabs[selectedTab].Update((float)deltaTime);