#nullable enable using Barotrauma.Items.Components; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Barotrauma { internal abstract partial class CircuitBoxConnection { public string Name => Label.Value.Value; public CircuitBoxLabel Label { get; private set; } private Sprite? knobSprite, screwSprite, connectorSprite; private static int padding => GUI.IntScale(8); private Option tooltip = Option.None; private partial void InitProjSpecific(CircuitBox circuitBox) { Label = new CircuitBoxLabel(Connection.Name, GUIStyle.SubHeadingFont); knobSprite = circuitBox.ConnectionSprite; screwSprite = circuitBox.ConnectionScrewSprite; connectorSprite = circuitBox.WireConnectorSprite; Length = Rect.Width + padding + Label.Size.X; } public void Draw(SpriteBatch spriteBatch, Vector2 drawPos, Vector2 parentPos, Color color) { if (CircuitBox.UI is not { } circuitBoxUi) { return; } var drawRect = CircuitBoxNode.OverrideRectLocation(Rect, drawPos, parentPos); Vector2 cursorPos = circuitBoxUi.GetCursorPosition(); cursorPos.Y = -cursorPos.Y; bool isMouseOver = drawRect.Contains(cursorPos); float xPos; if (IsOutput) { xPos = drawRect.Left - padding - Label.Size.X; } else { xPos = drawRect.Right + padding; } Vector2 stringPos = new Vector2(xPos, drawRect.Center.Y - Label.Size.Y / 2f); GUI.DrawString(spriteBatch, stringPos, Label.Value, GUIStyle.TextColorNormal, font: Label.Font); if (knobSprite is null) { CircuitBoxUI.DrawRectangleWithBorder(spriteBatch, drawRect, GUIStyle.Blue * 0.3f, GUIStyle.Blue); } else { float scale = drawRect.Height / knobSprite.size.Y; knobSprite?.Draw(spriteBatch, drawRect.Center, color, 0f, scale); } bool isScrewed = this switch { CircuitBoxOutputConnection output => output.ExternallyConnectedFrom.Count > 0, CircuitBoxInputConnection input => input.ExternallyConnectedTo.Count > 0, _ => Connection.Wires.Count > 0 || Connection.CircuitBoxConnections.Count > 0 || ExternallyConnectedFrom.Count > 0 }; if (isMouseOver) { var glowSprite = GUIStyle.UIGlowCircular.Value.Sprite; float glowScale = 40f / glowSprite.size.X; if (isScrewed) { glowScale *= 1.2f; } glowSprite.Draw(spriteBatch, position, GUIStyle.Yellow, glowSprite.size / 2, scale: glowScale); } tooltip = Option.None; if (ConnectionPanel.ShouldDebugDrawWiring) { Connection.DrawConnectionDebugInfo(spriteBatch, Connection, drawRect.Center, isScrewed ? 1.1f : 0.9f, out var tooltipText); if (isMouseOver && !tooltipText.IsNullOrEmpty()) { tooltip = Option.Some(tooltipText); } } if (!isScrewed) { return; } if (screwSprite is not null) { float screwScale = drawRect.Height / screwSprite.size.Y; screwSprite.Draw(spriteBatch, drawRect.Center, color, 0f, screwScale); } if (connectorSprite is not null) { float screwScale = drawRect.Height / connectorSprite.size.Y * 2f; Vector2 pos = drawRect.Center; connectorSprite.Draw(spriteBatch, pos: pos, color: Color.White, origin: connectorSprite.Origin, rotate: MathHelper.Pi / (IsOutput ? -2f : 2f), scale: screwScale, spriteEffect: SpriteEffects.None); } } public void DrawHUD(SpriteBatch spriteBatch, Camera camera) { if (!tooltip.TryUnwrap(out var text)) { return; } var drawPos = camera.WorldToScreen(new Vector2(Rect.Right, -Rect.Bottom)); GUIComponent.DrawToolTip(spriteBatch, text, drawPos); } } }