Client LuaCsForBarotrauma
BarotraumaShared/SharedSource/CircuitBox/CircuitBoxConnection.cs
1 #nullable enable
2 
3 using System.Collections.Generic;
5 using Microsoft.Xna.Framework;
6 
7 namespace Barotrauma
8 {
9 
10  internal class CircuitBoxInputConnection : CircuitBoxConnection
11  {
16  public override bool IsOutput => true;
17  public readonly List<CircuitBoxConnection> ExternallyConnectedTo = new();
18 
19  public CircuitBoxInputConnection(Vector2 position, Connection connection, CircuitBox box) : base(position, connection, box) { }
20 
21  public override void ReceiveSignal(Signal signal)
22  {
23  foreach (CircuitBoxConnection connector in ExternallyConnectedTo)
24  {
25  if (connector is CircuitBoxOutputConnection output)
26  {
27  output.ReceiveSignal(signal);
28  continue;
29  }
30  Connection.SendSignalIntoConnection(signal, connector.Connection);
31  }
32  }
33  }
34 
35  internal class CircuitBoxOutputConnection : CircuitBoxConnection
36  {
41  public override bool IsOutput => false;
42 
43  public CircuitBoxOutputConnection(Vector2 position, Connection connection, CircuitBox circuitBox) : base(position, connection, circuitBox) { }
44 
45  public override void ReceiveSignal(Signal signal) => CircuitBox.Item.SendSignal(signal, Connection);
46  }
47 
48  internal class CircuitBoxNodeConnection : CircuitBoxConnection
49  {
50  public override bool IsOutput => Connection.IsOutput;
51 
52  public CircuitBoxComponent Component;
53 
54  public bool HasAvailableSlots => Connection.WireSlotsAvailable();
55 
56  public CircuitBoxNodeConnection(Vector2 position, CircuitBoxComponent component, Connection connection, CircuitBox circuitBox) : base(position, connection, circuitBox)
57  {
58  Component = component;
59  }
60 
61  public override void ReceiveSignal(Signal signal) => Connection.SendSignalIntoConnection(signal, Connection);
62  }
63 
64  internal abstract partial class CircuitBoxConnection
65  {
66  public readonly Connection Connection;
67 
68  public abstract bool IsOutput { get; }
69 
70  public RectangleF Rect;
71 
72  private Vector2 position;
73 
74  public readonly List<CircuitBoxConnection> ExternallyConnectedFrom = new();
75 
76  public static readonly float Size = CircuitBoxSizes.ConnectorSize;
77 
78  public Vector2 Position
79  {
80  get => position;
81  set
82  {
83  Rect.X = value.X - Rect.Width / 2f;
84  Rect.Y = value.Y - Rect.Height / 2f;
85  position = value;
86  }
87  }
88 
89  public float Length { get; private set; }
90 
91  public Vector2 AnchorPoint
92  => new Vector2(IsOutput ? Rect.Right + CircuitBoxSizes.AnchorOffset : Rect.Left - CircuitBoxSizes.AnchorOffset, Rect.Center.Y);
93 
94  public readonly CircuitBox CircuitBox;
95 
96  protected CircuitBoxConnection(Vector2 position, Connection connection, CircuitBox circuitBox)
97  {
98  Connection = connection;
99  Rect.Width = Rect.Height = Size;
100  Position = position;
101  CircuitBox = circuitBox;
102  InitProjSpecific(circuitBox);
103  }
104 
105  private partial void InitProjSpecific(CircuitBox circuitBox);
106 
107  public abstract void ReceiveSignal(Signal signal);
108 
109  public bool Contains(Vector2 pos)
110  {
111  float x = Rect.X,
112  y = -(Rect.Y + Rect.Height),
113  width = Rect.Width,
114  height = Rect.Height;
115 
116  RectangleF rect = new(x, y, width, height);
117 
118  return rect.Contains(pos);
119  }
120  }
121 }