diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs index aab0cdf65..bb18197ea 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -135,6 +135,8 @@ namespace Barotrauma msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex); msg.Write(map.SelectedMissionIndex == -1 ? byte.MaxValue : (byte)map.SelectedMissionIndex); + msg.Write(PurchasedHullRepairs); + msg.Write(PurchasedItemRepairs); msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) @@ -159,6 +161,8 @@ namespace Barotrauma UInt16 endWatchmanID = msg.ReadUInt16(); int money = msg.ReadInt32(); + bool purchasedHullRepairs = msg.ReadBoolean(); + bool purchasedItemRepairs = msg.ReadBoolean(); UInt16 purchasedItemCount = msg.ReadUInt16(); List purchasedItems = new List(); @@ -217,6 +221,8 @@ namespace Barotrauma campaign.endWatchmanID = endWatchmanID; campaign.Money = money; + campaign.PurchasedHullRepairs = purchasedHullRepairs; + campaign.PurchasedItemRepairs = purchasedItemRepairs; campaign.CargoManager.SetPurchasedItems(purchasedItems); if (myCharacterInfo != null) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs index 3c322d12d..655c6fb9d 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs @@ -9,12 +9,9 @@ namespace Barotrauma { class CampaignUI { - public enum Tab { Map, Crew, Store } + public enum Tab { Map, Crew, Store, Repair } private Tab selectedTab; private GUIFrame[] tabs; - - private GUIButton startButton; - private GUIFrame topPanel; private GUIListBox characterList; @@ -26,6 +23,8 @@ namespace Barotrauma private GUIComponent selectedLocationInfo; private GUIListBox selectedMissionInfo; + private GUIButton repairHullsButton, repairItemsButton; + private GUIFrame characterPreviewFrame; private List tabButtons = new List(); @@ -39,10 +38,7 @@ namespace Barotrauma public GUIComponent MapContainer { get; private set; } - public GUIButton StartButton - { - get { return startButton; } - } + public GUIButton StartButton { get; private set; } public CampaignMode Campaign { get; } @@ -112,7 +108,7 @@ namespace Barotrauma tabs[(int)Tab.Crew] = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.7f), container.RectTransform, Anchor.TopLeft) { RelativeOffset = new Vector2(0.0f, topPanel.RectTransform.RelativeSize.Y) - }, color: Color.Black * 0.7f); + }, color: Color.Black * 0.9f); new GUIFrame(new RectTransform(new Vector2(1.25f, 1.25f), tabs[(int)Tab.Crew].RectTransform, Anchor.Center), style: "OuterGlow", color: Color.Black * 0.7f) { CanBeFocused = false @@ -157,7 +153,7 @@ namespace Barotrauma tabs[(int)Tab.Store] = new GUIFrame(new RectTransform(new Vector2(0.5f, 0.7f), container.RectTransform, Anchor.TopLeft) { RelativeOffset = new Vector2(0.1f, topPanel.RectTransform.RelativeSize.Y) - }, color: Color.Black * 0.7f); + }, color: Color.Black * 0.9f); new GUIFrame(new RectTransform(new Vector2(1.25f, 1.25f), tabs[(int)Tab.Store].RectTransform, Anchor.Center), style: "OuterGlow", color: Color.Black * 0.7f) { CanBeFocused = false @@ -218,6 +214,97 @@ namespace Barotrauma } SelectItemCategory(MapEntityCategory.Equipment); + // repair tab ------------------------------------------------------------------------- + + tabs[(int)Tab.Repair] = new GUIFrame(new RectTransform(new Vector2(0.35f, 0.5f), container.RectTransform, Anchor.TopLeft) + { + RelativeOffset = new Vector2(0.02f, topPanel.RectTransform.RelativeSize.Y) + }, color: Color.Black * 0.9f); + new GUIFrame(new RectTransform(new Vector2(1.25f, 1.25f), tabs[(int)Tab.Repair].RectTransform, Anchor.Center), style: "OuterGlow", color: Color.Black * 0.7f) + { + CanBeFocused = false + }; + + var repairContent = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), tabs[(int)Tab.Repair].RectTransform, Anchor.Center)) + { + RelativeSpacing = 0.05f, + Stretch = true + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.2f), crewContent.RectTransform), "", font: GUI.LargeFont) + { + TextGetter = GetMoney + }; + + var repairHullsHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), repairContent.RectTransform), childAnchor: Anchor.TopRight) + { + RelativeSpacing = 0.05f, + Stretch = true + }; + new GUIImage(new RectTransform(new Vector2(0.3f, 1.0f), repairHullsHolder.RectTransform, Anchor.CenterLeft), "RepairHullButton") + { + IgnoreLayoutGroups = true, + CanBeFocused = false + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), repairHullsHolder.RectTransform), TextManager.Get("RepairAllWalls"), textAlignment: Alignment.Right, font: GUI.LargeFont) + { + ForceUpperCase = true + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), repairHullsHolder.RectTransform), "500", textAlignment: Alignment.Right, font: GUI.LargeFont); + repairHullsButton = new GUIButton(new RectTransform(new Vector2(0.4f, 0.3f), repairHullsHolder.RectTransform), TextManager.Get("Repair"), style: "GUIButtonLarge") + { + OnClicked = (btn, userdata) => + { + if (campaign.Money >= CampaignMode.HullRepairCost) + { + campaign.Money -= CampaignMode.HullRepairCost; + campaign.PurchasedHullRepairs = true; + GameMain.Client?.SendCampaignState(); + btn.GetChild().Selected = true; + } + btn.Enabled = false; + return true; + } + }; + new GUITickBox(new RectTransform(new Vector2(0.65f), repairHullsButton.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(10, 0) }, "") + { + CanBeFocused = false + }; + + var repairItemsHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), repairContent.RectTransform), childAnchor: Anchor.TopRight) + { + RelativeSpacing = 0.05f, + Stretch = true + }; + new GUIImage(new RectTransform(new Vector2(0.3f, 1.0f), repairItemsHolder.RectTransform, Anchor.CenterLeft), "RepairItemsButton") + { + IgnoreLayoutGroups = true, + CanBeFocused = false + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), repairItemsHolder.RectTransform), TextManager.Get("RepairAllItems"), textAlignment: Alignment.Right, font: GUI.LargeFont) + { + ForceUpperCase = true + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), repairItemsHolder.RectTransform), "500", textAlignment: Alignment.Right, font: GUI.LargeFont); + repairItemsButton = new GUIButton(new RectTransform(new Vector2(0.4f, 0.3f), repairItemsHolder.RectTransform), TextManager.Get("Repair"), style: "GUIButtonLarge") + { + OnClicked = (btn, userdata) => + { + if (campaign.Money >= CampaignMode.ItemRepairCost) + { + campaign.Money -= CampaignMode.ItemRepairCost; + campaign.PurchasedItemRepairs = true; + GameMain.Client?.SendCampaignState(); + btn.GetChild().Selected = true; + } + btn.Enabled = false; + return true; + } + }; + new GUITickBox(new RectTransform(new Vector2(0.65f), repairItemsButton.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(10, 0) }, "") + { + CanBeFocused = false + }; + // mission info ------------------------------------------------------------------------- missionPanel = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.5f), container.RectTransform, Anchor.TopRight) @@ -330,8 +417,7 @@ namespace Barotrauma bool purchaseableItemsFound = false; foreach (MapEntityPrefab mapEntityPrefab in MapEntityPrefab.List) { - var itemPrefab = mapEntityPrefab as ItemPrefab; - if (itemPrefab == null) { continue; } + if (!(mapEntityPrefab is ItemPrefab itemPrefab)) { continue; } PriceInfo priceInfo = itemPrefab.GetPrice(Campaign.Map.CurrentLocation); if (priceInfo != null) { purchaseableItemsFound = true; break; } @@ -349,8 +435,7 @@ namespace Barotrauma { //refresh store view SelectItemCategory(MapEntityCategory.Equipment); - } - + } } private void DrawMap(SpriteBatch spriteBatch, GUICustomComponent mapContainer) @@ -452,7 +537,7 @@ namespace Barotrauma RefreshMissionTab(selectedMission); - startButton = new GUIButton(new RectTransform(new Vector2(0.3f, 0.7f), missionContent.RectTransform, Anchor.CenterRight), + StartButton = new GUIButton(new RectTransform(new Vector2(0.3f, 0.7f), missionContent.RectTransform, Anchor.CenterRight), TextManager.Get("StartCampaignButton"), style: "GUIButtonLarge") { IgnoreLayoutGroups = true, @@ -461,7 +546,7 @@ namespace Barotrauma }; if (GameMain.Client != null) { - startButton.Visible = !GameMain.Client.GameStarted && + StartButton.Visible = !GameMain.Client.GameStarted && (GameMain.Client.HasPermission(Networking.ClientPermissions.ManageRound) || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign)); } @@ -508,10 +593,10 @@ namespace Barotrauma CanBeFocused = false }; - if (startButton != null) + if (StartButton != null) { - startButton.Enabled = true; - startButton.Visible = GameMain.Client == null || + StartButton.Enabled = true; + StartButton.Visible = GameMain.Client == null || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageRound) || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign); } @@ -597,8 +682,7 @@ namespace Barotrauma private bool BuyItem(GUIComponent component, object obj) { - PurchasedItem pi = obj as PurchasedItem; - if (pi == null || pi.ItemPrefab == null) return false; + if (!(obj is PurchasedItem pi) || pi.ItemPrefab == null) return false; if (GameMain.Client != null && !GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign)) { @@ -616,8 +700,7 @@ namespace Barotrauma private bool SellItem(GUIComponent component, object obj) { - PurchasedItem pi = obj as PurchasedItem; - if (pi == null || pi.ItemPrefab == null) return false; + if (!(obj is PurchasedItem pi) || pi.ItemPrefab == null) return false; if (GameMain.Client != null && !GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign)) { @@ -659,6 +742,20 @@ namespace Barotrauma { button.Selected = (Tab)button.UserData == tab; } + + switch (selectedTab) + { + case Tab.Repair: + repairHullsButton.Enabled = + !Campaign.PurchasedHullRepairs && Campaign.Money >= CampaignMode.HullRepairCost && + (GameMain.Client == null || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign)); + repairHullsButton.GetChild().Selected = Campaign.PurchasedHullRepairs; + repairItemsButton.Enabled = + !Campaign.PurchasedItemRepairs && Campaign.Money >= CampaignMode.ItemRepairCost && + (GameMain.Client == null || GameMain.Client.HasPermission(Networking.ClientPermissions.ManageCampaign)); + repairItemsButton.GetChild().Selected = Campaign.PurchasedItemRepairs; + break; + } } private bool SelectItemCategory(MapEntityCategory category) @@ -668,8 +765,7 @@ namespace Barotrauma int width = storeItemList.Rect.Width; foreach (MapEntityPrefab mapEntityPrefab in MapEntityPrefab.List) { - var itemPrefab = mapEntityPrefab as ItemPrefab; - if (itemPrefab == null || !itemPrefab.Category.HasFlag(category)) continue; + if (!(mapEntityPrefab is ItemPrefab itemPrefab) || !itemPrefab.Category.HasFlag(category)) continue; PriceInfo priceInfo = itemPrefab.GetPrice(Campaign.Map.CurrentLocation); if (priceInfo == null) continue; @@ -707,9 +803,8 @@ namespace Barotrauma } if (prevInfoFrame != null) { tabs[(int)selectedTab].RemoveChild(prevInfoFrame); } - - CharacterInfo characterInfo = selection as CharacterInfo; - if (characterInfo == null) { return false; } + + if (!(selection is CharacterInfo characterInfo)) { return false; } if (Character.Controlled != null && characterInfo == Character.Controlled.Info) { return false; } if (characterPreviewFrame == null || characterPreviewFrame.UserData != characterInfo) @@ -761,11 +856,9 @@ namespace Barotrauma private bool HireCharacter(GUIButton button, object selection) { - CharacterInfo characterInfo = selection as CharacterInfo; - if (characterInfo == null) { return false; } + if (!(selection is CharacterInfo characterInfo)) { return false; } - SinglePlayerCampaign spCampaign = Campaign as SinglePlayerCampaign; - if (spCampaign == null) + if (!(Campaign is SinglePlayerCampaign spCampaign)) { DebugConsole.ThrowError("Characters can only be hired in the single player campaign.\n" + Environment.StackTrace); return false; @@ -784,11 +877,9 @@ namespace Barotrauma private bool FireCharacter(GUIButton button, object selection) { - CharacterInfo characterInfo = selection as CharacterInfo; - if (characterInfo == null) return false; + if (!(selection is CharacterInfo characterInfo)) return false; - SinglePlayerCampaign spCampaign = Campaign as SinglePlayerCampaign; - if (spCampaign == null) + if (!(Campaign is SinglePlayerCampaign spCampaign)) { DebugConsole.ThrowError("Characters can only be fired in the single player campaign.\n" + Environment.StackTrace); return false; diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs index 323dce8cc..08721c14d 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs @@ -737,11 +737,15 @@ namespace Barotrauma spectateButton.Visible = GameMain.Client.GameStarted; ReadyToStartBox.Visible = !GameMain.Client.GameStarted; ReadyToStartBox.Selected = false; - if (campaignUI?.StartButton != null) + if (campaignUI != null) { - campaignUI.StartButton.Visible = !GameMain.Client.GameStarted && - (GameMain.Client.HasPermission(ClientPermissions.ManageRound) || - GameMain.Client.HasPermission(ClientPermissions.ManageCampaign)); + SelectTab(Tab.Map); + if (campaignUI.StartButton != null) + { + campaignUI.StartButton.Visible = !GameMain.Client.GameStarted && + (GameMain.Client.HasPermission(ClientPermissions.ManageRound) || + GameMain.Client.HasPermission(ClientPermissions.ManageCampaign)); + } } GameMain.Client.SetReadyToStart(ReadyToStartBox); } diff --git a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs index 0e1667db4..7cacaa130 100644 --- a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -168,6 +168,8 @@ namespace Barotrauma msg.Write(isRunning && endWatchman != null ? endWatchman.ID : (UInt16)0); msg.Write(Money); + msg.Write(PurchasedHullRepairs); + msg.Write(PurchasedItemRepairs); msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) @@ -192,6 +194,8 @@ namespace Barotrauma { UInt16 selectedLocIndex = msg.ReadUInt16(); byte selectedMissionIndex = msg.ReadByte(); + bool purchasedHullRepairs = msg.ReadBoolean(); + bool purchasedItemRepairs = msg.ReadBoolean(); UInt16 purchasedItemCount = msg.ReadUInt16(); List purchasedItems = new List(); @@ -208,6 +212,17 @@ namespace Barotrauma return; } + if (purchasedHullRepairs && !this.PurchasedHullRepairs && Money >= HullRepairCost) + { + this.PurchasedHullRepairs = true; + Money -= HullRepairCost; + } + if (purchasedItemRepairs && !this.PurchasedItemRepairs && Money >= ItemRepairCost) + { + this.PurchasedItemRepairs = true; + Money -= ItemRepairCost; + } + Map.SelectLocation(selectedLocIndex == UInt16.MaxValue ? -1 : selectedLocIndex); if (Map.SelectedConnection != null) { diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs index 220e756cd..f081d1c0e 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs @@ -13,6 +13,7 @@ namespace Barotrauma public bool CheatsEnabled; const int InitialMoney = 4700; + public const int HullRepairCost = 500, ItemRepairCost = 500; protected bool watchmenSpawned; protected Character startWatchman, endWatchman; @@ -20,6 +21,8 @@ namespace Barotrauma //key = dialog flag, double = Timing.TotalTime when the line was last said private Dictionary dialogLastSpoken = new Dictionary(); + public bool PurchasedHullRepairs, PurchasedItemRepairs; + protected Map map; public Map Map { @@ -70,6 +73,37 @@ namespace Barotrauma watchmenSpawned = false; startWatchman = null; endWatchman = null; + + if (PurchasedHullRepairs) + { + foreach (Structure wall in Structure.WallList) + { + if (wall.Submarine == null || wall.Submarine.IsOutpost) { continue; } + if (wall.Submarine == Submarine.MainSub || Submarine.MainSub.DockedTo.Contains(wall.Submarine)) + { + for (int i = 0; i < wall.SectionCount; i++) + { + wall.AddDamage(i, -100000.0f); + } + } + } + PurchasedHullRepairs = false; + } + if (PurchasedItemRepairs) + { + foreach (Item item in Item.ItemList) + { + if (item.Submarine == null || item.Submarine.IsOutpost) { continue; } + if (item.Submarine == Submarine.MainSub || Submarine.MainSub.DockedTo.Contains(item.Submarine)) + { + if (item.GetComponent() != null) + { + item.Condition = item.Health; + } + } + } + PurchasedItemRepairs = false; + } } public override void Update(float deltaTime)