private void DrawFissionRateMeter(SpriteBatch spriteBatch, GUICustomComponent container) { if (item.Removed) { return; } Rectangle prevScissorRect = spriteBatch.GraphicsDevice.ScissorRectangle; spriteBatch.End(); spriteBatch.GraphicsDevice.ScissorRectangle = container.Rect; spriteBatch.Begin(SpriteSortMode.Deferred, rasterizerState: GameMain.ScissorTestEnable); //make the pointer jitter a bit if it's at the upper limit of the fission rate float jitter = 0.0f; if (FissionRate > allowedFissionRate.Y - 5.0f) { float jitterAmount = Math.Min(targetFissionRate - allowedFissionRate.Y, 10.0f); float t = graphTimer / updateGraphInterval; jitter = (PerlinNoise.GetPerlin(t * 0.5f, t * 0.1f) - 0.5f) * jitterAmount; } DrawMeter(spriteBatch, container.Rect, fissionRateMeter, FissionRate + jitter, new Vector2(0.0f, 100.0f), optimalFissionRate, allowedFissionRate); spriteBatch.End(); spriteBatch.GraphicsDevice.ScissorRectangle = prevScissorRect; spriteBatch.Begin(SpriteSortMode.Deferred); }
private void DrawOutputOverLay(SpriteBatch spriteBatch, GUICustomComponent overlayComponent) { overlayComponent.RectTransform.SetAsLastChild(); FabricationRecipe targetItem = fabricatedItem ?? selectedItem; if (targetItem != null) { var itemIcon = targetItem.TargetItem.InventoryIcon ?? targetItem.TargetItem.sprite; Rectangle slotRect = outputContainer.Inventory.slots[0].Rect; if (fabricatedItem != null) { GUI.DrawRectangle(spriteBatch, new Rectangle( slotRect.X, slotRect.Y + (int)(slotRect.Height * (1.0f - progressState)), slotRect.Width, (int)(slotRect.Height * progressState)), Color.Green * 0.5f, isFilled: true); } itemIcon.Draw( spriteBatch, slotRect.Center.ToVector2(), color: targetItem.TargetItem.InventoryIconColor * 0.4f, scale: Math.Min(slotRect.Width / itemIcon.size.X, slotRect.Height / itemIcon.size.Y) * 0.9f); } if (tooltip != null) { GUIComponent.DrawToolTip(spriteBatch, tooltip.Second, tooltip.First); tooltip = null; } }
partial void InitProjSpecific(XElement element) { var paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.9f), GuiFrame.RectTransform, Anchor.Center), childAnchor: Anchor.TopCenter) { Stretch = true, RelativeSpacing = 0.02f }; inputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.2f, 0.7f), paddedFrame.RectTransform), style: null); inputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, inputInventoryHolder.RectTransform), DrawOverLay, null) { CanBeFocused = false }; activateButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.1f), paddedFrame.RectTransform), TextManager.Get("DeconstructorDeconstruct")) { OnClicked = ToggleActive }; inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("DeconstructorNoPower"), textColor: Color.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") { HoverColor = Color.Black, IgnoreLayoutGroups = true, Visible = false, CanBeFocused = false }; outputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.3f), paddedFrame.RectTransform), style: null); }
private void DrawHUDFront(SpriteBatch spriteBatch, GUICustomComponent container) { foreach (GUIComponent child in submarineContainer.Children.First().Children) { if (child.UserData is Hull hull) { if (hull.Submarine == null || !hull.Submarine.IsOutpost) { continue; } string text = TextManager.GetWithVariable("MiniMapOutpostDockingInfo", "[outpost]", hull.Submarine.Name); Vector2 textSize = GUI.Font.MeasureString(text); Vector2 textPos = child.Center; if (textPos.X + textSize.X / 2 > submarineContainer.Rect.Right) { textPos.X -= ((textPos.X + textSize.X / 2) - submarineContainer.Rect.Right) + 10 * GUI.xScale; } if (textPos.X - textSize.X / 2 < submarineContainer.Rect.X) { textPos.X += (submarineContainer.Rect.X - (textPos.X - textSize.X / 2)) + 10 * GUI.xScale; } GUI.DrawString(spriteBatch, textPos - textSize / 2, text, Color.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f); break; } } }
private void CreateGUI() { var content = new GUIFrame(new RectTransform(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, style: null) { CanBeFocused = false }; string labelText = GetUILabel(); GUITextBlock label = null; if (!string.IsNullOrEmpty(labelText)) { label = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), content.RectTransform, Anchor.TopCenter), labelText, font: GUI.SubHeadingFont, textAlignment: Alignment.Center, wrap: true); } float minInventoryAreaSize = 0.5f; guiCustomComponent = new GUICustomComponent( new RectTransform(new Vector2(1.0f, label == null ? 1.0f : Math.Max(1.0f - label.RectTransform.RelativeSize.Y, minInventoryAreaSize)), content.RectTransform, Anchor.BottomCenter), onDraw: (SpriteBatch spriteBatch, GUICustomComponent component) => { Inventory.Draw(spriteBatch); }, onUpdate: null) { CanBeFocused = false }; Inventory.RectTransform = guiCustomComponent.RectTransform; }
/// <summary> /// Makes the sonar view CustomComponent render the steering HUD, preventing it from being drawn behing the sonar /// </summary> public void AttachToSonarHUD(GUICustomComponent sonarView) { steerArea.Visible = false; sonarView.OnDraw += (spriteBatch, guiCustomComponent) => { DrawHUD(spriteBatch, guiCustomComponent.Rect); steerArea.DrawChildren(spriteBatch, recursive: true); }; }
private void DrawTurbineOutputMeter(SpriteBatch spriteBatch, GUICustomComponent container) { if (item.Removed) { return; } DrawMeter(spriteBatch, container.Rect, turbineOutputMeter, TurbineOutput, new Vector2(0.0f, 100.0f), optimalTurbineOutput, allowedTurbineOutput); }
private void DrawHUDFront(SpriteBatch spriteBatch, GUICustomComponent container) { if (Voltage < MinVoltage) { Vector2 textSize = GUI.Font.MeasureString(noPowerTip); Vector2 textPos = GuiFrame.Rect.Center.ToVector2(); GUI.DrawString(spriteBatch, textPos - textSize / 2, noPowerTip, GUI.Style.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f, font: GUI.SubHeadingFont); return; }
private void DrawGraph(SpriteBatch spriteBatch, GUICustomComponent container) { if (item.Removed) { return; } Rectangle graphArea = new Rectangle(container.Rect.X + 30, container.Rect.Y, container.Rect.Width - 30, container.Rect.Height); float maxLoad = loadGraph.Max(); float xOffset = graphTimer / updateGraphInterval; DrawGraph(outputGraph, spriteBatch, graphArea, Math.Max(10000.0f, maxLoad), xOffset, Color.LightGreen); DrawGraph(loadGraph, spriteBatch, graphArea, Math.Max(10000.0f, maxLoad), xOffset, Color.LightBlue); tempMeterFrame.Draw(spriteBatch, new Vector2(graphArea.X - 30, graphArea.Y), Color.White, Vector2.Zero, 0.0f, new Vector2(1.0f, graphArea.Height / tempMeterFrame.size.Y)); float tempFill = temperature / 100.0f; int barPadding = 5; Vector2 meterBarPos = new Vector2(graphArea.X - 30 + tempMeterFrame.size.X / 2, graphArea.Bottom - tempMeterBar.size.Y); while (meterBarPos.Y > graphArea.Bottom - graphArea.Height * tempFill) { float tempRatio = 1.0f - ((meterBarPos.Y - graphArea.Y) / graphArea.Height); Color color = tempRatio < 0.5f ? Color.Lerp(Color.Green, Color.Orange, tempRatio * 2.0f) : Color.Lerp(Color.Orange, Color.Red, (tempRatio - 0.5f) * 2.0f); tempMeterBar.Draw(spriteBatch, meterBarPos, color); meterBarPos.Y -= (tempMeterBar.size.Y + barPadding); } if (temperature > optimalTemperature.Y) { GUI.DrawRectangle(spriteBatch, new Vector2(graphArea.X - 30, graphArea.Y), new Vector2(tempMeterFrame.SourceRect.Width, (graphArea.Bottom - graphArea.Height * optimalTemperature.Y / 100.0f) - graphArea.Y), Color.Red * (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.7f, isFilled: true); } if (temperature < optimalTemperature.X) { GUI.DrawRectangle(spriteBatch, new Vector2(graphArea.X - 30, graphArea.Bottom - graphArea.Height * optimalTemperature.X / 100.0f), new Vector2(tempMeterFrame.SourceRect.Width, graphArea.Bottom - (graphArea.Bottom - graphArea.Height * optimalTemperature.X / 100.0f)), Color.Red * (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.7f, isFilled: true); } tempRangeIndicator.Draw(spriteBatch, new Vector2(meterBarPos.X, graphArea.Bottom - graphArea.Height * optimalTemperature.X / 100.0f)); tempRangeIndicator.Draw(spriteBatch, new Vector2(meterBarPos.X, graphArea.Bottom - graphArea.Height * optimalTemperature.Y / 100.0f)); }
private void DrawOverLay(SpriteBatch spriteBatch, GUICustomComponent overlayComponent) { overlayComponent.RectTransform.SetAsLastChild(); var lastSlot = inputContainer.Inventory.slots.Last(); GUI.DrawRectangle(spriteBatch, new Rectangle( lastSlot.Rect.X, lastSlot.Rect.Y + (int)(lastSlot.Rect.Height * (1.0f - progressState)), lastSlot.Rect.Width, (int)(lastSlot.Rect.Height * progressState)), Color.Green * 0.5f, isFilled: true); }
private void DrawGraph(SpriteBatch spriteBatch, GUICustomComponent container) { if (item.Removed) { return; } float maxLoad = loadGraph.Max(); float xOffset = graphTimer / updateGraphInterval; Rectangle graphRect = new Rectangle(container.Rect.X, container.Rect.Y, container.Rect.Width, container.Rect.Height - (int)(5 * GUI.yScale)); DrawGraph(outputGraph, spriteBatch, graphRect, Math.Max(10000.0f, maxLoad), xOffset, outputColor); DrawGraph(loadGraph, spriteBatch, graphRect, Math.Max(10000.0f, maxLoad), xOffset, loadColor); }
partial void InitProjSpecific(XElement element) { foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "topsprite": inventoryTopSprite = new Sprite(subElement); break; case "backsprite": inventoryBackSprite = new Sprite(subElement); break; case "bottomsprite": inventoryBottomSprite = new Sprite(subElement); break; case "containedstateindicator": ContainedStateIndicator = new Sprite(subElement); break; } } if (GuiFrame == null) { //if a GUIFrame is not defined in the xml, //we create a full-screen frame and let the inventory position itself on it GuiFrame = new GUIFrame(new RectTransform(Vector2.One, GUI.Canvas), style: null) { CanBeFocused = false }; guiCustomComponent = new GUICustomComponent(new RectTransform(Vector2.One, GuiFrame.RectTransform), onDraw: (SpriteBatch spriteBatch, GUICustomComponent component) => { Inventory.Draw(spriteBatch); }, onUpdate: null) { CanBeFocused = false }; } else { //if a GUIFrame has been defined, draw the inventory inside it guiCustomComponent = new GUICustomComponent(new RectTransform(new Vector2(0.9f), GuiFrame.RectTransform, Anchor.Center), onDraw: (SpriteBatch spriteBatch, GUICustomComponent component) => { Inventory.Draw(spriteBatch); }, onUpdate: null) { CanBeFocused = false }; Inventory.RectTransform = guiCustomComponent.RectTransform; } }
private void DrawConnections(SpriteBatch spriteBatch, GUICustomComponent container) { if (user != Character.Controlled || user == null) { return; } HighlightedWire = null; Connection.DrawConnections(spriteBatch, this, user); foreach (UISprite sprite in GUI.Style.GetComponentStyle("ConnectionPanelFront").Sprites[GUIComponent.ComponentState.None]) { sprite.Draw(spriteBatch, GuiFrame.Rect, Color.White, SpriteEffects.None); } }
private void DrawFissionRateMeter(SpriteBatch spriteBatch, GUICustomComponent container) { Rectangle prevScissorRect = spriteBatch.GraphicsDevice.ScissorRectangle; spriteBatch.End(); spriteBatch.GraphicsDevice.ScissorRectangle = container.Rect; spriteBatch.Begin(SpriteSortMode.Deferred, rasterizerState: GameMain.ScissorTestEnable); DrawMeter(spriteBatch, container.Rect, fissionRateMeter, FissionRate, new Vector2(0.0f, 100.0f), optimalFissionRate, allowedFissionRate); spriteBatch.End(); spriteBatch.GraphicsDevice.ScissorRectangle = prevScissorRect; spriteBatch.Begin(SpriteSortMode.Deferred); }
protected override void CreateGUI() { var content = new GUIFrame(new RectTransform(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, style: null) { CanBeFocused = false }; string labelText = GetUILabel(); GUITextBlock label = null; if (!string.IsNullOrEmpty(labelText)) { label = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), content.RectTransform, Anchor.TopCenter), labelText, font: GUI.SubHeadingFont, textAlignment: Alignment.Center, wrap: true); } float minInventoryAreaSize = 0.5f; guiCustomComponent = new GUICustomComponent( new RectTransform(new Vector2(1.0f, label == null ? 1.0f : Math.Max(1.0f - label.RectTransform.RelativeSize.Y, minInventoryAreaSize)), content.RectTransform, Anchor.BottomCenter), onDraw: (SpriteBatch spriteBatch, GUICustomComponent component) => { Inventory.Draw(spriteBatch); }, onUpdate: null) { CanBeFocused = false }; // Expand the frame vertically if it's too small to fit the text if (label != null && label.RectTransform.RelativeSize.Y > 0.5f) { int newHeight = (int)(GuiFrame.Rect.Height + (2 * (label.RectTransform.RelativeSize.Y - 0.5f) * content.Rect.Height)); if (newHeight > GuiFrame.RectTransform.MaxSize.Y) { Point newMaxSize = GuiFrame.RectTransform.MaxSize; newMaxSize.Y = newHeight; GuiFrame.RectTransform.MaxSize = newMaxSize; } GuiFrame.RectTransform.Resize(new Point(GuiFrame.Rect.Width, newHeight)); content.RectTransform.Resize(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin); label.CalculateHeightFromText(); guiCustomComponent.RectTransform.Resize(new Vector2(1.0f, Math.Max(1.0f - label.RectTransform.RelativeSize.Y, minInventoryAreaSize))); } Inventory.RectTransform = guiCustomComponent.RectTransform; }
private void DrawTurbineOutputMeter(SpriteBatch spriteBatch, GUICustomComponent container) { if (item.Removed) { return; } Vector2 clampedOptimalTurbineOutput = optimalTurbineOutput; Vector2 clampedAllowedTurbineOutput = allowedTurbineOutput; if (clampedOptimalTurbineOutput.X > 100.0f) { clampedOptimalTurbineOutput = new Vector2(92.0f, 110.0f); clampedAllowedTurbineOutput = new Vector2(85.0f, 110.0f); } DrawMeter(spriteBatch, container.Rect, turbineOutputMeter, TurbineOutput, new Vector2(0.0f, 100.0f), clampedOptimalTurbineOutput, clampedAllowedTurbineOutput); }
private void DrawHUDFront(SpriteBatch spriteBatch, GUICustomComponent container) { if (Voltage < MinVoltage) { Vector2 textSize = GUI.Font.MeasureString(noPowerTip); Vector2 textPos = GuiFrame.Rect.Center.ToVector2(); GUI.DrawString(spriteBatch, textPos - textSize / 2, noPowerTip, GUI.Style.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f, font: GUI.SubHeadingFont); return; } if (!submarineContainer.Children.Any()) { return; } foreach (GUIComponent child in submarineContainer.Children.FirstOrDefault()?.Children) { if (child.UserData is Hull hull) { if (hull.Submarine == null || !hull.Submarine.Info.IsOutpost) { continue; } string text = TextManager.GetWithVariable("MiniMapOutpostDockingInfo", "[outpost]", hull.Submarine.Info.Name); Vector2 textSize = GUI.Font.MeasureString(text); Vector2 textPos = child.Center; if (textPos.X + textSize.X / 2 > submarineContainer.Rect.Right) { textPos.X -= ((textPos.X + textSize.X / 2) - submarineContainer.Rect.Right) + 10 * GUI.xScale; } if (textPos.X - textSize.X / 2 < submarineContainer.Rect.X) { textPos.X += (submarineContainer.Rect.X - (textPos.X - textSize.X / 2)) + 10 * GUI.xScale; } GUI.DrawString(spriteBatch, textPos - textSize / 2, text, GUI.Style.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f); break; } } }
private void DrawTempMeter(SpriteBatch spriteBatch, GUICustomComponent container) { Vector2 meterPos = new Vector2(container.Rect.X, container.Rect.Y); Vector2 meterScale = new Vector2(container.Rect.Width / (float)tempMeterFrame.SourceRect.Width, container.Rect.Height / (float)tempMeterFrame.SourceRect.Height); tempMeterFrame.Draw(spriteBatch, meterPos, Color.White, tempMeterFrame.Origin, 0.0f, scale: meterScale); float tempFill = temperature / 100.0f; float meterBarScale = container.Rect.Width / (float)tempMeterBar.SourceRect.Width; Vector2 meterBarPos = new Vector2(container.Center.X, container.Rect.Bottom - tempMeterBar.size.Y * meterBarScale - (int)(5 * GUI.yScale)); while (meterBarPos.Y > container.Rect.Bottom + (int)(5 * GUI.yScale) - container.Rect.Height * tempFill) { float tempRatio = 1.0f - ((meterBarPos.Y - container.Rect.Y) / container.Rect.Height); Color color = ToolBox.GradientLerp(tempRatio, coldColor, optimalRangeColor, warmColor, hotColor); tempMeterBar.Draw(spriteBatch, meterBarPos, color: color, scale: meterBarScale); int spacing = 2; meterBarPos.Y -= tempMeterBar.size.Y * meterBarScale + spacing; } if (temperature > optimalTemperature.Y) { GUI.DrawRectangle(spriteBatch, meterPos, new Vector2(container.Rect.Width, (container.Rect.Bottom - container.Rect.Height * optimalTemperature.Y / 100.0f) - container.Rect.Y), warningColor * (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.7f, isFilled: true); } if (temperature < optimalTemperature.X) { GUI.DrawRectangle(spriteBatch, new Vector2(meterPos.X, container.Rect.Bottom - container.Rect.Height * optimalTemperature.X / 100.0f), new Vector2(container.Rect.Width, container.Rect.Bottom - (container.Rect.Bottom - container.Rect.Height * optimalTemperature.X / 100.0f)), warningColor * (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.7f, isFilled: true); } float tempRangeIndicatorScale = container.Rect.Width / (float)tempRangeIndicator.SourceRect.Width; tempRangeIndicator.Draw(spriteBatch, new Vector2(container.Center.X, container.Rect.Bottom - container.Rect.Height * optimalTemperature.X / 100.0f), Color.White, tempRangeIndicator.Origin, 0, scale: tempRangeIndicatorScale); tempRangeIndicator.Draw(spriteBatch, new Vector2(container.Center.X, container.Rect.Bottom - container.Rect.Height * optimalTemperature.Y / 100.0f), Color.White, tempRangeIndicator.Origin, 0, scale: tempRangeIndicatorScale); }
private void DrawInputOverLay(SpriteBatch spriteBatch, GUICustomComponent overlayComponent) { overlayComponent.RectTransform.SetAsLastChild(); FabricationRecipe targetItem = fabricatedItem ?? selectedItem; if (targetItem != null) { int slotIndex = 0; var missingItems = new List <FabricationRecipe.RequiredItem>(); foreach (FabricationRecipe.RequiredItem requiredItem in targetItem.RequiredItems) { for (int i = 0; i < requiredItem.Amount; i++) { missingItems.Add(requiredItem); } } foreach (Item item in inputContainer.Inventory.Items) { if (item == null) { continue; } missingItems.Remove(missingItems.FirstOrDefault(mi => mi.ItemPrefab == item.prefab)); } var availableIngredients = GetAvailableIngredients(); foreach (FabricationRecipe.RequiredItem requiredItem in missingItems) { while (slotIndex < inputContainer.Capacity && inputContainer.Inventory.Items[slotIndex] != null) { slotIndex++; } //highlight suitable ingredients in linked inventories foreach (Item item in availableIngredients) { if (item.ParentInventory != inputContainer.Inventory && IsItemValidIngredient(item, requiredItem)) { int availableSlotIndex = Array.IndexOf(item.ParentInventory.Items, item); //slots are null if the inventory has never been displayed //(linked item, but the UI is not set to be displayed at the same time) if (item.ParentInventory.slots != null) { if (item.ParentInventory.slots[availableSlotIndex].HighlightTimer <= 0.0f) { item.ParentInventory.slots[availableSlotIndex].ShowBorderHighlight(GUI.Style.Green, 0.5f, 0.5f, 0.2f); if (slotIndex < inputContainer.Capacity) { inputContainer.Inventory.slots[slotIndex].ShowBorderHighlight(GUI.Style.Green, 0.5f, 0.5f, 0.2f); } } } } } if (slotIndex >= inputContainer.Capacity) { break; } var itemIcon = requiredItem.ItemPrefab.InventoryIcon ?? requiredItem.ItemPrefab.sprite; Rectangle slotRect = inputContainer.Inventory.slots[slotIndex].Rect; itemIcon.Draw( spriteBatch, slotRect.Center.ToVector2(), color: requiredItem.ItemPrefab.InventoryIconColor * 0.3f, scale: Math.Min(slotRect.Width / itemIcon.size.X, slotRect.Height / itemIcon.size.Y)); if (requiredItem.UseCondition && requiredItem.MinCondition < 1.0f) { GUI.DrawRectangle(spriteBatch, new Rectangle(slotRect.X, slotRect.Bottom - 8, slotRect.Width, 8), Color.Black * 0.8f, true); GUI.DrawRectangle(spriteBatch, new Rectangle(slotRect.X, slotRect.Bottom - 8, (int)(slotRect.Width * requiredItem.MinCondition), 8), GUI.Style.Green * 0.8f, true); } if (slotRect.Contains(PlayerInput.MousePosition)) { string toolTipText = requiredItem.ItemPrefab.Name; if (requiredItem.UseCondition && requiredItem.MinCondition < 1.0f) { toolTipText += " " + (int)Math.Round(requiredItem.MinCondition * 100) + "%"; } if (!string.IsNullOrEmpty(requiredItem.ItemPrefab.Description)) { toolTipText += '\n' + requiredItem.ItemPrefab.Description; } tooltip = new Pair <Rectangle, string>(slotRect, toolTipText); } slotIndex++; } } }
partial void InitProjSpecific() { var paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.9f), GuiFrame.RectTransform, Anchor.Center), childAnchor: Anchor.TopCenter) { Stretch = true, RelativeSpacing = 0.02f }; itemList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.5f), paddedFrame.RectTransform)) { OnSelected = (GUIComponent component, object userdata) => { selectedItem = userdata as FabricableItem; if (selectedItem != null) { SelectItem(Character.Controlled, selectedItem); } return(true); } }; inputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.7f, 0.15f), paddedFrame.RectTransform), style: null); inputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, inputInventoryHolder.RectTransform), DrawInputOverLay, null) { CanBeFocused = false }; var outputArea = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.3f), paddedFrame.RectTransform), isHorizontal: true); selectedItemFrame = new GUIFrame(new RectTransform(new Vector2(0.75f, 1.0f), outputArea.RectTransform), style: "InnerFrame"); outputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), outputArea.RectTransform), style: null); outputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, outputArea.RectTransform), DrawOutputOverLay, null) { CanBeFocused = false }; foreach (FabricableItem fi in fabricableItems) { GUIFrame frame = new GUIFrame(new RectTransform(new Point(itemList.Rect.Width, 50), itemList.Content.RectTransform), style: null) { UserData = fi, HoverColor = Color.Gold * 0.2f, SelectedColor = Color.Gold * 0.5f, ToolTip = fi.TargetItem.Description }; GUITextBlock textBlock = new GUITextBlock(new RectTransform(Vector2.Zero, frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(50, 0) }, fi.DisplayName) { ToolTip = fi.TargetItem.Description }; var itemIcon = fi.TargetItem.InventoryIcon ?? fi.TargetItem.sprite; if (itemIcon != null) { GUIImage img = new GUIImage(new RectTransform(new Point(40, 40), frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(3, 0) }, itemIcon, scaleToFit: true) { Color = fi.TargetItem.InventoryIconColor, ToolTip = fi.TargetItem.Description }; } } activateButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.07f), paddedFrame.RectTransform), TextManager.Get("FabricatorCreate")) { OnClicked = StartButtonClicked, UserData = selectedItem, Enabled = false }; inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("FabricatorNoPower"), textColor: Color.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") { HoverColor = Color.Black, IgnoreLayoutGroups = true, Visible = false, CanBeFocused = false }; }
partial void InitProjSpecific(XElement element) { sonarBlips = new List <SonarBlip>(); int viewSize = (int)Math.Min(GuiFrame.Rect.Width - 150, GuiFrame.Rect.Height * 0.9f); sonarView = new GUICustomComponent(new RectTransform(new Point(viewSize), GuiFrame.RectTransform, Anchor.CenterLeft), (spriteBatch, guiCustomComponent) => { DrawSonar(spriteBatch, guiCustomComponent.Rect); }, null); var controlContainer = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.35f), GuiFrame.RectTransform, Anchor.TopLeft) { MinSize = new Point(150, 0), AbsoluteOffset = new Point((int)(viewSize * 0.9f), 0) }, "SonarFrame"); controlContainer.RectTransform.SetAsFirstChild(); var paddedControlContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.9f), controlContainer.RectTransform, Anchor.Center)) { RelativeSpacing = 0.03f, Stretch = true }; passiveTickBox = new GUITickBox(new RectTransform(new Vector2(0.3f, 0.2f), paddedControlContainer.RectTransform), TextManager.Get("SonarPassive"), style: "GUIRadioButton") { ToolTip = TextManager.Get("SonarTipPassive"), Selected = true }; activeTickBox = new GUITickBox(new RectTransform(new Vector2(0.3f, 0.2f), paddedControlContainer.RectTransform), TextManager.Get("SonarActive"), style: "GUIRadioButton") { ToolTip = TextManager.Get("SonarTipActive"), OnSelected = (GUITickBox box) => { if (GameMain.Server != null) { unsentChanges = true; } else if (GameMain.Client != null) { unsentChanges = true; correctionTimer = CorrectionDelay; } IsActive = box.Selected; return(true); } }; var zoomContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.2f), paddedControlContainer.RectTransform), isHorizontal: true); new GUITextBlock(new RectTransform(new Vector2(0.35f, 1.0f), zoomContainer.RectTransform), TextManager.Get("SonarZoom"), font: GUI.SmallFont) { Padding = Vector4.Zero }; zoomSlider = new GUIScrollBar(new RectTransform(new Vector2(0.65f, 1.0f), zoomContainer.RectTransform), barSize: 0.1f, isHorizontal: true) { OnMoved = (scrollbar, scroll) => { zoom = MathHelper.Lerp(MinZoom, MaxZoom, scroll); if (GameMain.Server != null) { unsentChanges = true; } else if (GameMain.Client != null) { unsentChanges = true; correctionTimer = CorrectionDelay; } return(true); } }; var activeControls = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.6f), paddedControlContainer.RectTransform) { RelativeOffset = new Vector2(0.1f, 0.0f) }, "InnerFrame"); activeControlsContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.8f), activeControls.RectTransform, Anchor.Center)) { RelativeSpacing = 0.03f, Stretch = true }; directionalTickBox = new GUITickBox(new RectTransform(new Vector2(0.3f, 0.3f), activeControlsContainer.RectTransform), TextManager.Get("SonarDirectionalPing")) { OnSelected = (tickBox) => { useDirectionalPing = tickBox.Selected; if (GameMain.Server != null) { unsentChanges = true; } else if (GameMain.Client != null) { unsentChanges = true; correctionTimer = CorrectionDelay; } return(true); } }; directionalSlider = new GUIScrollBar(new RectTransform(new Vector2(1.0f, 0.3f), activeControlsContainer.RectTransform), barSize: 0.1f, isHorizontal: true) { OnMoved = (scrollbar, scroll) => { float pingAngle = MathHelper.Lerp(0.0f, MathHelper.TwoPi, scroll); pingDirection = new Vector2((float)Math.Cos(pingAngle), (float)Math.Sin(pingAngle)); if (GameMain.Server != null) { unsentChanges = true; } else if (GameMain.Client != null) { unsentChanges = true; correctionTimer = CorrectionDelay; } return(true); } }; signalWarningText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), paddedControlContainer.RectTransform), "", Color.Orange, textAlignment: Alignment.Center); GUITickBox.CreateRadioButtonGroup(new List <GUITickBox>() { activeTickBox, passiveTickBox }); GuiFrame.CanBeFocused = false; }
partial void InitProjSpecific() { var paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.95f), GuiFrame.RectTransform, Anchor.Center), childAnchor: Anchor.TopCenter) { Stretch = true, RelativeSpacing = 0.02f }; itemList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.5f), paddedFrame.RectTransform)) { OnSelected = (GUIComponent component, object userdata) => { selectedItem = userdata as FabricationRecipe; if (selectedItem != null) { SelectItem(Character.Controlled, selectedItem); } return(true); } }; var filterArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.06f), paddedFrame.RectTransform), isHorizontal: true) { Stretch = true, UserData = "filterarea" }; new GUITextBlock(new RectTransform(new Vector2(0.25f, 1.0f), filterArea.RectTransform), TextManager.Get("serverlog.filter"), font: GUI.Font); itemFilterBox = new GUITextBox(new RectTransform(new Vector2(0.8f, 1.0f), filterArea.RectTransform), font: GUI.Font); itemFilterBox.OnTextChanged += (textBox, text) => { FilterEntities(text); return(true); }; var clearButton = new GUIButton(new RectTransform(new Vector2(0.1f, 1.0f), filterArea.RectTransform), "x") { OnClicked = (btn, userdata) => { ClearFilter(); itemFilterBox.Flash(Color.White); return(true); } }; inputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.7f, 0.15f), paddedFrame.RectTransform), style: null); inputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, inputInventoryHolder.RectTransform), DrawInputOverLay, null) { CanBeFocused = false }; var outputArea = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.25f), paddedFrame.RectTransform), isHorizontal: true); selectedItemFrame = new GUIFrame(new RectTransform(new Vector2(0.75f, 1.0f), outputArea.RectTransform), style: "InnerFrame"); outputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), outputArea.RectTransform), style: null); outputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, outputArea.RectTransform), DrawOutputOverLay, null) { CanBeFocused = false }; CreateRecipes(); activateButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.07f), paddedFrame.RectTransform), TextManager.Get("FabricatorCreate"), style: "GUIButtonLarge") { OnClicked = StartButtonClicked, UserData = selectedItem, Enabled = false }; inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("FabricatorNoPower"), textColor: Color.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") { HoverColor = Color.Black, IgnoreLayoutGroups = true, Visible = false, CanBeFocused = false }; }
partial void InitProjSpecific(XElement element) { foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "fissionratemeter": fissionRateMeter = new Sprite(subElement); break; case "turbineoutputmeter": turbineOutputMeter = new Sprite(subElement); break; case "meterpointer": meterPointer = new Sprite(subElement); break; case "sectorsprite": sectorSprite = new Sprite(subElement); break; case "tempmeterframe": tempMeterFrame = new Sprite(subElement); break; case "tempmeterbar": tempMeterBar = new Sprite(subElement); break; case "temprangeindicator": tempRangeIndicator = new Sprite(subElement); break; case "graphline": graphLine = new Sprite(subElement); break; } } var paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.85f), GuiFrame.RectTransform, Anchor.Center), isHorizontal: true) { RelativeSpacing = 0.012f, Stretch = true }; GUIFrame columnLeft = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), paddedFrame.RectTransform), style: null); GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.45f, 1.0f), paddedFrame.RectTransform), style: null); GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.3f, 1.0f), paddedFrame.RectTransform), style: null); leftHUDColumn = columnLeft; midHUDColumn = columnMid; rightHUDColumn = columnRight; //---------------------------------------------------------- //left column //---------------------------------------------------------- int buttonsPerRow = 2; int spacing = 5; int buttonWidth = columnLeft.Rect.Width / buttonsPerRow - (spacing * (buttonsPerRow - 1)); int buttonHeight = (int)(columnLeft.Rect.Height * 0.5f) / 4; for (int i = 0; i < warningTexts.Length; i++) { var warningBtn = new GUIButton(new RectTransform(new Point(buttonWidth, buttonHeight), columnLeft.RectTransform) { AbsoluteOffset = new Point((i % buttonsPerRow) * (buttonWidth + spacing), (int)Math.Floor(i / (float)buttonsPerRow) * (buttonHeight + spacing)) }, TextManager.Get(warningTexts[i]), style: "IndicatorButton") { CanBeFocused = false }; var btnText = warningBtn.GetChild <GUITextBlock>(); btnText.Font = GUI.Font; btnText.Wrap = false; btnText.SetTextPos(); warningButtons.Add(warningTexts[i], warningBtn); } GUITextBlock.AutoScaleAndNormalize(warningButtons.Values.Select(b => b.TextBlock)); inventoryContainer = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.45f), columnLeft.RectTransform, Anchor.BottomLeft), style: null); //---------------------------------------------------------- //mid column //---------------------------------------------------------- criticalHeatWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, (int)(30 * GUI.Scale)), columnMid.RectTransform), TextManager.Get("ReactorWarningCriticalTemp"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; lowTemperatureWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, (int)(30 * GUI.Scale)), columnMid.RectTransform) { RelativeOffset = new Vector2(0.27f, 0.0f) }, TextManager.Get("ReactorWarningCriticalLowTemp"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; criticalOutputWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, (int)(30 * GUI.Scale)), columnMid.RectTransform) { RelativeOffset = new Vector2(0.66f, 0.0f) }, TextManager.Get("ReactorWarningCriticalOutput"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; GUITextBlock.AutoScaleAndNormalize(criticalHeatWarning.TextBlock, lowTemperatureWarning.TextBlock, criticalOutputWarning.TextBlock); float gaugeOffset = criticalHeatWarning.Rect.Height / (float)columnMid.Rect.Height + 0.05f * GUI.Scale; new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset) }, TextManager.Get("ReactorFissionRate")); new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) }, DrawFissionRateMeter, null) { ToolTip = TextManager.Get("ReactorTipFissionRate") }; new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset) }, TextManager.Get("ReactorTurbineOutput")); new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) }, DrawTurbineOutputMeter, null) { ToolTip = TextManager.Get("ReactorTipTurbineOutput") }; GUILayoutGroup sliderControls = new GUILayoutGroup(new RectTransform(new Point(columnMid.Rect.Width, (int)(114 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomCenter)) { Stretch = true, AbsoluteSpacing = (int)(5 * GUI.Scale) }; sliderControlsContainer = sliderControls; new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), sliderControls.RectTransform, Anchor.TopLeft), TextManager.Get("ReactorFissionRate")); fissionRateScrollBar = new GUIScrollBar(new RectTransform(new Point(sliderControls.Rect.Width, (int)(30 * GUI.Scale)), sliderControls.RectTransform, Anchor.TopCenter), style: "GUISlider", barSize: 0.1f) { OnMoved = (GUIScrollBar bar, float scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; targetFissionRate = scrollAmount * 100.0f; return(false); } }; new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), sliderControls.RectTransform, Anchor.BottomLeft), TextManager.Get("ReactorTurbineOutput")); turbineOutputScrollBar = new GUIScrollBar(new RectTransform(new Point(sliderControls.Rect.Width, (int)(30 * GUI.Scale)), sliderControls.RectTransform, Anchor.BottomCenter), style: "GUISlider", barSize: 0.1f, isHorizontal: true) { OnMoved = (GUIScrollBar bar, float scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; targetTurbineOutput = scrollAmount * 100.0f; return(false); } }; //---------------------------------------------------------- //right column //---------------------------------------------------------- new GUITextBlock(new RectTransform(new Vector2(0.7f, 0.1f), columnRight.RectTransform), TextManager.Get("ReactorAutoTemp")) { ToolTip = TextManager.Get("ReactorTipAutoTemp"), AutoScale = true }; autoTempSlider = new GUIScrollBar(new RectTransform(new Vector2(0.6f, 0.15f), columnRight.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.1f) }, barSize: 0.55f, style: "OnOffSlider", isHorizontal: true) { ToolTip = TextManager.Get("ReactorTipAutoTemp"), IsBooleanSwitch = true, BarScroll = 1.0f, OnMoved = (scrollBar, scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; return(true); } }; var sliderSprite = autoTempSlider.Frame.Style.Sprites[GUIComponent.ComponentState.None].First(); autoTempSlider.RectTransform.MaxSize = new Point((int)(sliderSprite.Sprite.SourceRect.Size.X * GUI.Scale), (int)(sliderSprite.Sprite.SourceRect.Size.Y * GUI.Scale)); onOffSwitch = new GUIScrollBar(new RectTransform(new Vector2(0.4f, 0.3f), columnRight.RectTransform, Anchor.TopRight), barSize: 0.2f, style: "OnOffLever", isHorizontal: false) { IsBooleanSwitch = true, MinValue = 0.25f, MaxValue = 0.75f, OnMoved = (scrollBar, scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; return(true); } }; var switchSprite = onOffSwitch.Frame.Style.Sprites[GUIComponent.ComponentState.None].First(); onOffSwitch.RectTransform.MaxSize = new Point((int)(switchSprite.Sprite.SourceRect.Size.X * GUI.Scale), (int)(switchSprite.Sprite.SourceRect.Size.Y * GUI.Scale)); var lever = onOffSwitch.GetChild <GUIButton>(); lever.RectTransform.NonScaledSize = new Point(lever.Rect.Width + (int)(30 * GUI.Scale), lever.Rect.Height); var graphArea = new GUICustomComponent(new RectTransform(new Vector2(1.0f, 0.5f), columnRight.RectTransform, Anchor.BottomCenter) { AbsoluteOffset = new Point(0, 30) }, DrawGraph, null); Point textSize = new Point((int)(100 * GUI.Scale), (int)(30 * GUI.Scale)); var loadText = new GUITextBlock(new RectTransform(textSize, graphArea.RectTransform, Anchor.TopLeft, Pivot.BottomLeft), "Load", textColor: Color.LightBlue, textAlignment: Alignment.CenterLeft) { ToolTip = TextManager.Get("ReactorTipLoad") }; string loadStr = TextManager.Get("ReactorLoad"); loadText.TextGetter += () => { return(loadStr.Replace("[kw]", ((int)load).ToString())); }; var outputText = new GUITextBlock(new RectTransform(textSize, graphArea.RectTransform, Anchor.BottomLeft, Pivot.TopLeft), "Output", textColor: Color.LightGreen, textAlignment: Alignment.CenterLeft) { ToolTip = TextManager.Get("ReactorTipPower") }; string outputStr = TextManager.Get("ReactorOutput"); outputText.TextGetter += () => { return(outputStr.Replace("[kw]", ((int)-currPowerConsumption).ToString())); }; }
private void DrawHUDBack(SpriteBatch spriteBatch, GUICustomComponent container) { hullInfoFrame.Visible = false; if (item.Submarine == null || !hasPower) { foreach (Hull hull in Hull.hullList) { var hullFrame = submarineContainer.Children.First().FindChild(hull); if (hullFrame == null) { continue; } hullFrame.Color = Color.DarkCyan * 0.3f; hullFrame.Children.First().Color = Color.DarkCyan * 0.3f; } } float scale = 1.0f; HashSet <Submarine> subs = new HashSet <Submarine>(); foreach (Hull hull in Hull.hullList) { if (hull.Submarine == null) { continue; } var hullFrame = submarineContainer.Children.First().FindChild(hull); if (hullFrame == null) { continue; } hullDatas.TryGetValue(hull, out HullData hullData); if (hullData == null) { hullData = new HullData(); hullDatas.Add(hull, hullData); } if (hullData.Distort) { hullFrame.Children.First().Color = Color.Lerp(Color.Black, Color.DarkGray * 0.5f, Rand.Range(0.0f, 1.0f)); hullFrame.Color = Color.DarkGray * 0.5f; continue; } subs.Add(hull.Submarine); scale = Math.Min( hullFrame.Parent.Rect.Width / (float)hull.Submarine.Borders.Width, hullFrame.Parent.Rect.Height / (float)hull.Submarine.Borders.Height); Color borderColor = Color.DarkCyan; float?gapOpenSum = 0.0f; if (ShowHullIntegrity) { gapOpenSum = hull.ConnectedGaps.Where(g => !g.IsRoomToRoom).Sum(g => g.Open); borderColor = Color.Lerp(Color.DarkCyan, Color.Red, Math.Min((float)gapOpenSum, 1.0f)); } float?oxygenAmount = null; if (!RequireOxygenDetectors || hullData?.Oxygen != null) { oxygenAmount = RequireOxygenDetectors ? hullData.Oxygen : hull.OxygenPercentage; GUI.DrawRectangle(spriteBatch, hullFrame.Rect, Color.Lerp(Color.Red * 0.5f, Color.Green * 0.3f, (float)oxygenAmount / 100.0f), true); } float?waterAmount = null; if (!RequireWaterDetectors || hullData.Water != null) { waterAmount = RequireWaterDetectors ? hullData.Water : Math.Min(hull.WaterVolume / hull.Volume, 1.0f); if (hullFrame.Rect.Height * waterAmount > 3.0f) { Rectangle waterRect = new Rectangle( hullFrame.Rect.X, (int)(hullFrame.Rect.Y + hullFrame.Rect.Height * (1.0f - waterAmount)), hullFrame.Rect.Width, (int)(hullFrame.Rect.Height * waterAmount)); waterRect.Inflate(-3, -3); GUI.DrawRectangle(spriteBatch, waterRect, new Color(85, 136, 147), true); GUI.DrawLine(spriteBatch, new Vector2(waterRect.X, waterRect.Y), new Vector2(waterRect.Right, waterRect.Y), Color.LightBlue); } } if (GUI.MouseOn == hullFrame || hullFrame.IsParentOf(GUI.MouseOn)) { hullInfoFrame.RectTransform.ScreenSpaceOffset = hullFrame.Rect.Center; hullInfoFrame.Visible = true; hullNameText.Text = hull.RoomName; hullBreachText.Text = gapOpenSum > 0.1f ? TextManager.Get("MiniMapHullBreach") : ""; hullBreachText.TextColor = Color.Red; hullAirQualityText.Text = oxygenAmount == null?TextManager.Get("MiniMapAirQualityUnavailable") : TextManager.Get("MiniMapAirQuality") + ": " + (int)oxygenAmount + " %"; hullAirQualityText.TextColor = oxygenAmount == null ? Color.Red : Color.Lerp(Color.Red, Color.LightGreen, (float)oxygenAmount / 100.0f); hullWaterText.Text = waterAmount == null?TextManager.Get("MiniMapWaterLevelUnavailable") : TextManager.Get("MiniMapWaterLevel") + ": " + (int)(waterAmount * 100.0f) + " %"; hullWaterText.TextColor = waterAmount == null ? Color.Red : Color.Lerp(Color.LightGreen, Color.Red, (float)waterAmount); borderColor = Color.Lerp(borderColor, Color.White, 0.5f); hullFrame.Children.First().Color = Color.White; } else { hullFrame.Children.First().Color = Color.DarkCyan * 0.8f; } hullFrame.Color = borderColor; } foreach (Submarine sub in subs) { if (sub.HullVertices == null) { continue; } Rectangle worldBorders = sub.GetDockedBorders(); worldBorders.Location += sub.WorldPosition.ToPoint(); scale = Math.Min( submarineContainer.Rect.Width / (float)worldBorders.Width, submarineContainer.Rect.Height / (float)worldBorders.Height) * 0.9f; float displayScale = ConvertUnits.ToDisplayUnits(scale); Vector2 offset = ConvertUnits.ToSimUnits(sub.WorldPosition - new Vector2(worldBorders.Center.X, worldBorders.Y - worldBorders.Height / 2)); Vector2 center = container.Rect.Center.ToVector2(); for (int i = 0; i < sub.HullVertices.Count; i++) { Vector2 start = (sub.HullVertices[i] + offset) * displayScale; start.Y = -start.Y; Vector2 end = (sub.HullVertices[(i + 1) % sub.HullVertices.Count] + offset) * displayScale; end.Y = -end.Y; GUI.DrawLine(spriteBatch, center + start, center + end, Color.DarkCyan * Rand.Range(0.3f, 0.35f), width: 10); } } }
partial void InitProjSpecific(XElement element) { slotIcons = new Sprite[capacity]; foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "topsprite": inventoryTopSprite = new Sprite(subElement); break; case "backsprite": inventoryBackSprite = new Sprite(subElement); break; case "bottomsprite": inventoryBottomSprite = new Sprite(subElement); break; case "containedstateindicator": ContainedStateIndicator = new Sprite(subElement); break; case "containedstateindicatorempty": ContainedStateIndicatorEmpty = new Sprite(subElement); break; case "sloticon": int index = subElement.GetAttributeInt("slotindex", -1); Sprite icon = new Sprite(subElement); for (int i = 0; i < capacity; i++) { if (i == index || index == -1) { slotIcons[i] = icon; } } break; } } if (string.IsNullOrEmpty(ContainedStateIndicatorStyle)) { //if neither a style or a custom sprite is defined, use default style if (ContainedStateIndicator == null) { IndicatorStyle = GUI.Style.GetComponentStyle("ContainedStateIndicator.Default"); } } else { IndicatorStyle = GUI.Style.GetComponentStyle("ContainedStateIndicator." + ContainedStateIndicatorStyle); if (ContainedStateIndicator != null || ContainedStateIndicatorEmpty != null) { DebugConsole.AddWarning($"Item \"{item.Name}\" defines both a contained state indicator style and a custom indicator sprite. Will use the custom sprite..."); } } if (GuiFrame == null) { //if a GUIFrame is not defined in the xml, //we create a full-screen frame and let the inventory position itself on it GuiFrame = new GUIFrame(new RectTransform(Vector2.One, GUI.Canvas), style: null) { CanBeFocused = false }; guiCustomComponent = new GUICustomComponent(new RectTransform(Vector2.One, GuiFrame.RectTransform), onDraw: (SpriteBatch spriteBatch, GUICustomComponent component) => { Inventory.Draw(spriteBatch); }, onUpdate: null) { CanBeFocused = false }; GuiFrame.RectTransform.ParentChanged += OnGUIParentChanged; } else { //if a GUIFrame has been defined, draw the inventory inside it CreateGUI(); } containedSpriteDepths = element.GetAttributeFloatArray("containedspritedepths", new float[0]); }
private void CreateGUI() { var paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.90f, 0.80f), GuiFrame.RectTransform, Anchor.Center), childAnchor: Anchor.TopCenter) { Stretch = true, RelativeSpacing = 0.08f }; var topFrame = new GUIFrame(new RectTransform(new Vector2(1f, 0.5f), paddedFrame.RectTransform), style: null); // === INPUT LABEL === // var inputLabelArea = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.15f), topFrame.RectTransform, Anchor.TopCenter), childAnchor: Anchor.CenterLeft, isHorizontal: true) { Stretch = true, RelativeSpacing = 0.05f }; var inputLabel = new GUITextBlock(new RectTransform(Vector2.One, inputLabelArea.RectTransform), TextManager.Get("uilabel.input"), font: GUI.SubHeadingFont) { Padding = Vector4.Zero }; inputLabel.RectTransform.Resize(new Point((int)inputLabel.Font.MeasureString(inputLabel.Text).X, inputLabel.RectTransform.Rect.Height)); new GUIFrame(new RectTransform(Vector2.One, inputLabelArea.RectTransform), style: "HorizontalLine"); var inputArea = new GUILayoutGroup(new RectTransform(new Vector2(1f, 1f), topFrame.RectTransform, Anchor.CenterLeft), childAnchor: Anchor.BottomLeft, isHorizontal: true) { Stretch = true, RelativeSpacing = 0.05f }; // === INPUT SLOTS === // inputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(0.7f, 1f), inputArea.RectTransform), style: null); inputInventoryOverlay = new GUICustomComponent(new RectTransform(Vector2.One, inputInventoryHolder.RectTransform), DrawOverLay, null) { CanBeFocused = false }; // === ACTIVATE BUTTON === // var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 0.7f), inputArea.RectTransform), childAnchor: Anchor.CenterLeft); activateButton = new GUIButton(new RectTransform(new Vector2(0.95f, 0.8f), buttonContainer.RectTransform), TextManager.Get("DeconstructorDeconstruct"), style: "DeviceButton") { TextBlock = { AutoScaleHorizontal = true }, OnClicked = ToggleActive }; inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("DeconstructorNoPower"), textColor: GUI.Style.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") { HoverColor = Color.Black, IgnoreLayoutGroups = true, Visible = false, CanBeFocused = false }; // === OUTPUT AREA === // var bottomFrame = new GUIFrame(new RectTransform(new Vector2(1f, 0.5f), paddedFrame.RectTransform), style: null); // === OUTPUT LABEL === // var outputLabelArea = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.15f), bottomFrame.RectTransform, Anchor.TopCenter), childAnchor: Anchor.CenterLeft, isHorizontal: true) { Stretch = true, RelativeSpacing = 0.05f }; var outputLabel = new GUITextBlock(new RectTransform(new Vector2(0f, 1.0f), outputLabelArea.RectTransform), TextManager.Get("uilabel.output"), font: GUI.SubHeadingFont) { Padding = Vector4.Zero }; outputLabel.RectTransform.Resize(new Point((int)outputLabel.Font.MeasureString(outputLabel.Text).X, outputLabel.RectTransform.Rect.Height)); new GUIFrame(new RectTransform(Vector2.One, outputLabelArea.RectTransform), style: "HorizontalLine"); // === OUTPUT SLOTS === // outputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(1f, 1f), bottomFrame.RectTransform, Anchor.CenterLeft), style: null); }
partial void InitProjSpecific(XElement element) { // TODO: need to recreate the gui when the resolution changes fissionRateMeter = new Sprite(element.GetChildElement("fissionratemeter")?.GetChildElement("sprite")); turbineOutputMeter = new Sprite(element.GetChildElement("turbineoutputmeter")?.GetChildElement("sprite")); meterPointer = new Sprite(element.GetChildElement("meterpointer")?.GetChildElement("sprite")); sectorSprite = new Sprite(element.GetChildElement("sectorsprite")?.GetChildElement("sprite")); tempMeterFrame = new Sprite(element.GetChildElement("tempmeterframe")?.GetChildElement("sprite")); tempMeterBar = new Sprite(element.GetChildElement("tempmeterbar")?.GetChildElement("sprite")); tempRangeIndicator = new Sprite(element.GetChildElement("temprangeindicator")?.GetChildElement("sprite")); graphLine = new Sprite(element.GetChildElement("graphline")?.GetChildElement("sprite")); var paddedFrame = new GUILayoutGroup(new RectTransform( GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, isHorizontal: true) { RelativeSpacing = 0.012f, Stretch = true }; GUILayoutGroup columnLeft = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 1.0f), paddedFrame.RectTransform)) { RelativeSpacing = 0.012f, Stretch = true }; GUILayoutGroup columnRight = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 1.0f), paddedFrame.RectTransform)) { CanBeFocused = true, RelativeSpacing = 0.012f, Stretch = true }; //---------------------------------------------------------- //left column //---------------------------------------------------------- GUIFrame inventoryWindow = new GUIFrame(new RectTransform(new Vector2(0.1f, 0.75f), GuiFrame.RectTransform, Anchor.TopLeft, Pivot.TopRight) { MinSize = new Point(85, 220), RelativeOffset = new Vector2(-0.02f, 0) }, style: "ItemUI"); GUILayoutGroup inventoryContent = new GUILayoutGroup(new RectTransform(inventoryWindow.Rect.Size - GUIStyle.ItemFrameMargin, inventoryWindow.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, childAnchor: Anchor.TopCenter) { Stretch = true }; /*new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), inventoryContent.RectTransform), "", * textAlignment: Alignment.Center, font: GUI.SubHeadingFont, wrap: true);*/ inventoryContainer = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.9f), inventoryContent.RectTransform), style: null); //---------------------------------------------------------- //mid column //---------------------------------------------------------- var topLeftArea = new GUILayoutGroup(new RectTransform(new Vector2(1, 0.2f), columnLeft.RectTransform), isHorizontal: true, childAnchor: Anchor.CenterLeft) { Stretch = true }; Point maxIndicatorSize = new Point(int.MaxValue, (int)(40 * GUI.Scale)); criticalHeatWarning = new GUITickBox(new RectTransform(new Vector2(0.33f, 1.0f), topLeftArea.RectTransform) { MaxSize = maxIndicatorSize }, TextManager.Get("ReactorWarningCriticalTemp"), font: GUI.SubHeadingFont, style: "IndicatorLightRed") { CanBeFocused = false }; lowTemperatureWarning = new GUITickBox(new RectTransform(new Vector2(0.33f, 1.0f), topLeftArea.RectTransform) { MaxSize = maxIndicatorSize }, TextManager.Get("ReactorWarningCriticalLowTemp"), font: GUI.SubHeadingFont, style: "IndicatorLightRed") { CanBeFocused = false }; criticalOutputWarning = new GUITickBox(new RectTransform(new Vector2(0.33f, 1.0f), topLeftArea.RectTransform) { MaxSize = maxIndicatorSize }, TextManager.Get("ReactorWarningCriticalOutput"), font: GUI.SubHeadingFont, style: "IndicatorLightRed") { CanBeFocused = false }; List <GUITickBox> indicatorLights = new List <GUITickBox>() { criticalHeatWarning, lowTemperatureWarning, criticalOutputWarning }; indicatorLights.ForEach(l => l.TextBlock.OverrideTextColor(GUI.Style.TextColor)); topLeftArea.Recalculate(); new GUIFrame(new RectTransform(new Vector2(1.0f, 0.01f), columnLeft.RectTransform), style: "HorizontalLine"); float relativeYMargin = 0.02f; Vector2 relativeTextSize = new Vector2(0.9f, 0.2f); Vector2 sliderSize = new Vector2(1.0f, 0.125f); Vector2 meterSize = new Vector2(1, 1 - relativeTextSize.Y - relativeYMargin - sliderSize.Y - 0.1f); var meterArea = new GUIFrame(new RectTransform(new Vector2(1, 0.6f - relativeYMargin * 2), columnLeft.RectTransform), style: null); var leftArea = new GUIFrame(new RectTransform(new Vector2(0.49f, 1), meterArea.RectTransform), style: null); var rightArea = new GUIFrame(new RectTransform(new Vector2(0.49f, 1), meterArea.RectTransform, Anchor.TopCenter, Pivot.TopLeft), style: null); var fissionRateTextBox = new GUITextBlock(new RectTransform(relativeTextSize, leftArea.RectTransform, Anchor.TopCenter), TextManager.Get("ReactorFissionRate"), textColor: GUI.Style.TextColor, textAlignment: Alignment.Center, font: GUI.SubHeadingFont) { AutoScaleHorizontal = true }; var fissionMeter = new GUICustomComponent(new RectTransform(meterSize, leftArea.RectTransform, Anchor.TopCenter) { RelativeOffset = new Vector2(0.0f, relativeTextSize.Y + relativeYMargin) }, DrawFissionRateMeter, null) { ToolTip = TextManager.Get("ReactorTipFissionRate") }; var turbineOutputTextBox = new GUITextBlock(new RectTransform(relativeTextSize, rightArea.RectTransform, Anchor.TopCenter), TextManager.Get("ReactorTurbineOutput"), textColor: GUI.Style.TextColor, textAlignment: Alignment.Center, font: GUI.SubHeadingFont) { AutoScaleHorizontal = true }; GUITextBlock.AutoScaleAndNormalize(turbineOutputTextBox, fissionRateTextBox); var turbineMeter = new GUICustomComponent(new RectTransform(meterSize, rightArea.RectTransform, Anchor.TopCenter) { RelativeOffset = new Vector2(0.0f, relativeTextSize.Y + relativeYMargin) }, DrawTurbineOutputMeter, null) { ToolTip = TextManager.Get("ReactorTipTurbineOutput") }; FissionRateScrollBar = new GUIScrollBar(new RectTransform(sliderSize, leftArea.RectTransform, Anchor.TopCenter) { RelativeOffset = new Vector2(0, fissionMeter.RectTransform.RelativeOffset.Y + meterSize.Y) }, style: "DeviceSlider", barSize: 0.15f) { Enabled = false, Step = 1.0f / 255, OnMoved = (GUIScrollBar bar, float scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; targetFissionRate = scrollAmount * 100.0f; return(false); } }; TurbineOutputScrollBar = new GUIScrollBar(new RectTransform(sliderSize, rightArea.RectTransform, Anchor.TopCenter) { RelativeOffset = new Vector2(0, turbineMeter.RectTransform.RelativeOffset.Y + meterSize.Y) }, style: "DeviceSlider", barSize: 0.15f, isHorizontal: true) { Enabled = false, Step = 1.0f / 255, OnMoved = (GUIScrollBar bar, float scrollAmount) => { LastUser = Character.Controlled; unsentChanges = true; targetTurbineOutput = scrollAmount * 100.0f; return(false); } }; var buttonArea = new GUILayoutGroup(new RectTransform(new Vector2(1, 0.2f), columnLeft.RectTransform)) { Stretch = true, RelativeSpacing = 0.02f }; var upperButtons = new GUILayoutGroup(new RectTransform(new Vector2(1, 0.5f), buttonArea.RectTransform), isHorizontal: true) { Stretch = true, RelativeSpacing = 0.01f }; var lowerButtons = new GUILayoutGroup(new RectTransform(new Vector2(1, 0.5f), buttonArea.RectTransform), isHorizontal: true) { Stretch = true, RelativeSpacing = 0.01f }; int buttonCount = warningTexts.Length; for (int i = 0; i < buttonCount; i++) { string text = warningTexts[i]; var b = new GUIButton(new RectTransform(Vector2.One, (i < 4) ? upperButtons.RectTransform : lowerButtons.RectTransform), TextManager.Get(text), style: "IndicatorButton") { Font = GUI.SubHeadingFont, CanBeFocused = false }; warningButtons.Add(text, b); } upperButtons.Recalculate(); lowerButtons.Recalculate(); //only wrap texts that consist of multiple words and are way too big to fit otherwise warningButtons.Values.ForEach(b => b.TextBlock.Wrap = b.Text.Contains(' ') && b.TextBlock.TextSize.X > b.TextBlock.Rect.Width * 1.5f); GUITextBlock.AutoScaleAndNormalize(warningButtons.Values.Select(b => b.TextBlock)); //---------------------------------------------------------- //right column //---------------------------------------------------------- // Auto temp var topRightArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.25f), columnRight.RectTransform), isHorizontal: true, childAnchor: Anchor.CenterLeft) { Stretch = true, RelativeSpacing = 0.02f }; topRightArea.RectTransform.MinSize = new Point(0, topLeftArea.Rect.Height); topRightArea.RectTransform.MaxSize = new Point(int.MaxValue, topLeftArea.Rect.Height); new GUIFrame(new RectTransform(new Vector2(0.01f, 1.0f), topRightArea.RectTransform), style: "VerticalLine"); AutoTempSwitch = new GUIButton(new RectTransform(new Vector2(0.15f, 0.9f), topRightArea.RectTransform), style: "SwitchVertical") { Enabled = false, Selected = AutoTemp, OnClicked = (button, data) => { AutoTemp = !AutoTemp; LastUser = Character.Controlled; unsentChanges = true; return(true); } }; AutoTempSwitch.RectTransform.MaxSize = new Point((int)(AutoTempSwitch.Rect.Height * 0.4f), int.MaxValue); autoTempLight = new GUITickBox(new RectTransform(new Vector2(0.4f, 1.0f), topRightArea.RectTransform), TextManager.Get("ReactorAutoTemp"), font: GUI.SubHeadingFont, style: "IndicatorLightYellow") { ToolTip = TextManager.Get("ReactorTipAutoTemp"), CanBeFocused = false, Selected = AutoTemp }; autoTempLight.RectTransform.MaxSize = new Point(int.MaxValue, criticalHeatWarning.Rect.Height); autoTempLight.TextBlock.OverrideTextColor(GUI.Style.TextColor); new GUIFrame(new RectTransform(new Vector2(0.01f, 1.0f), topRightArea.RectTransform), style: "VerticalLine"); // Power button var powerArea = new GUIFrame(new RectTransform(new Vector2(0.4f, 1.0f), topRightArea.RectTransform), style: null); var paddedPowerArea = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.9f), powerArea.RectTransform, Anchor.Center, scaleBasis: ScaleBasis.BothHeight), style: "PowerButtonFrame"); powerLight = new GUITickBox(new RectTransform(new Vector2(0.87f, 0.3f), paddedPowerArea.RectTransform, Anchor.TopCenter, Pivot.Center), TextManager.Get("PowerLabel"), font: GUI.SubHeadingFont, style: "IndicatorLightPower") { CanBeFocused = false, Selected = _powerOn }; powerLight.TextBlock.Padding = new Vector4(5.0f, 0.0f, 0.0f, 0.0f); powerLight.TextBlock.AutoScaleHorizontal = true; powerLight.TextBlock.OverrideTextColor(GUI.Style.TextColor); PowerButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.75f), paddedPowerArea.RectTransform, Anchor.BottomCenter) { RelativeOffset = new Vector2(0, 0.1f) }, style: "PowerButton") { OnClicked = (button, data) => { PowerOn = !PowerOn; LastUser = Character.Controlled; unsentChanges = true; return(true); } }; topRightArea.Recalculate(); autoTempLight.TextBlock.Wrap = true; indicatorLights.Add(autoTempLight); GUITextBlock.AutoScaleAndNormalize(indicatorLights.Select(l => l.TextBlock)); // right bottom (graph area) ----------------------- new GUIFrame(new RectTransform(new Vector2(0.95f, 0.01f), columnRight.RectTransform), style: "HorizontalLine"); var bottomRightArea = new GUILayoutGroup(new RectTransform(Vector2.One, columnRight.RectTransform), isHorizontal: true) { Stretch = true, CanBeFocused = true, RelativeSpacing = 0.02f }; new GUIFrame(new RectTransform(new Vector2(0.01f, 1.0f), bottomRightArea.RectTransform), style: "VerticalLine"); new GUICustomComponent(new RectTransform(new Vector2(0.1f, 1), bottomRightArea.RectTransform, Anchor.Center), DrawTempMeter, null); var graphArea = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 1.0f), bottomRightArea.RectTransform)) { Stretch = true, RelativeSpacing = 0.02f }; relativeTextSize = new Vector2(1.0f, 0.15f); var loadText = new GUITextBlock(new RectTransform(relativeTextSize, graphArea.RectTransform), "Load", textColor: loadColor, font: GUI.SubHeadingFont, textAlignment: Alignment.CenterLeft) { ToolTip = TextManager.Get("ReactorTipLoad") }; string loadStr = TextManager.Get("ReactorLoad"); string kW = TextManager.Get("kilowatt"); loadText.TextGetter += () => $"{loadStr.Replace("[kw]", ((int)load).ToString())} {kW}"; var graph = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.9f), graphArea.RectTransform), style: "InnerFrameRed"); new GUICustomComponent(new RectTransform(new Vector2(0.9f, 0.98f), graph.RectTransform, Anchor.Center), DrawGraph, null); var outputText = new GUITextBlock(new RectTransform(relativeTextSize, graphArea.RectTransform), "Output", textColor: outputColor, font: GUI.SubHeadingFont, textAlignment: Alignment.CenterLeft) { ToolTip = TextManager.Get("ReactorTipPower") }; string outputStr = TextManager.Get("ReactorOutput"); outputText.TextGetter += () => $"{outputStr.Replace("[kw]", ((int)-currPowerConsumption).ToString())} {kW}"; }