Wire hacking is now fancy.
1. new UI 2. wires are correctly randomized. 3. wires layouts are shared across machines in the same round.
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.GameObjects.Components.UserInterface;
|
||||
using Robust.Shared.Localization;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Serialization;
|
||||
using static Content.Shared.GameObjects.Components.SharedWiresComponent;
|
||||
|
||||
namespace Content.Shared.GameObjects.Components
|
||||
{
|
||||
@@ -31,44 +34,257 @@ namespace Content.Shared.GameObjects.Components
|
||||
Pulse,
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum StatusLightState
|
||||
{
|
||||
Off,
|
||||
On,
|
||||
BlinkingFast,
|
||||
BlinkingSlow
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[PublicAPI]
|
||||
[Serializable, NetSerializable]
|
||||
public enum WireLetter : byte
|
||||
{
|
||||
α,
|
||||
β,
|
||||
γ,
|
||||
δ,
|
||||
ε,
|
||||
ζ,
|
||||
η,
|
||||
θ,
|
||||
ι,
|
||||
κ,
|
||||
λ,
|
||||
μ,
|
||||
ν,
|
||||
ξ,
|
||||
ο,
|
||||
π,
|
||||
ρ,
|
||||
σ,
|
||||
τ,
|
||||
υ,
|
||||
φ,
|
||||
χ,
|
||||
ψ,
|
||||
ω
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
[Serializable, NetSerializable]
|
||||
public enum WireColor : byte
|
||||
{
|
||||
Red,
|
||||
Blue,
|
||||
Green,
|
||||
Orange,
|
||||
Brown,
|
||||
Gold,
|
||||
Gray,
|
||||
Cyan,
|
||||
Navy,
|
||||
Purple,
|
||||
Pink,
|
||||
Fuchsia
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public struct StatusLightData
|
||||
{
|
||||
public StatusLightData(Color color, StatusLightState state, string text)
|
||||
{
|
||||
Color = color;
|
||||
State = state;
|
||||
Text = text;
|
||||
}
|
||||
|
||||
public Color Color { get; }
|
||||
public StatusLightState State { get; }
|
||||
public string Text { get; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"Color: {Color}, State: {State}, Text: {Text}";
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public class WiresBoundUserInterfaceState : BoundUserInterfaceState
|
||||
{
|
||||
public readonly List<ClientWire> WiresList;
|
||||
public readonly List<string> Statuses;
|
||||
public string BoardName { get; }
|
||||
public string SerialNumber { get; }
|
||||
public ClientWire[] WiresList { get; }
|
||||
public StatusEntry[] Statuses { get; }
|
||||
public int WireSeed { get; }
|
||||
|
||||
public WiresBoundUserInterfaceState(List<ClientWire> wiresList, List<string> statuses)
|
||||
public WiresBoundUserInterfaceState(ClientWire[] wiresList, StatusEntry[] statuses, string boardName, string serialNumber, int wireSeed)
|
||||
{
|
||||
BoardName = boardName;
|
||||
SerialNumber = serialNumber;
|
||||
WireSeed = wireSeed;
|
||||
WiresList = wiresList;
|
||||
Statuses = statuses;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public struct StatusEntry
|
||||
{
|
||||
public readonly object Key;
|
||||
public readonly object Value;
|
||||
|
||||
public StatusEntry(object key, object value)
|
||||
{
|
||||
Key = key;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Key}, {Value}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public class ClientWire
|
||||
{
|
||||
public Guid Guid;
|
||||
public Color Color;
|
||||
public int Id;
|
||||
public bool IsCut;
|
||||
public WireColor Color;
|
||||
public WireLetter Letter;
|
||||
|
||||
public ClientWire(Guid guid, Color color, bool isCut)
|
||||
public ClientWire(int id, bool isCut, WireColor color, WireLetter letter)
|
||||
{
|
||||
Guid = guid;
|
||||
Color = color;
|
||||
Id = id;
|
||||
IsCut = isCut;
|
||||
Letter = letter;
|
||||
Color = color;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public class WiresActionMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly Guid Guid;
|
||||
public readonly int Id;
|
||||
public readonly WiresAction Action;
|
||||
public WiresActionMessage(Guid guid, WiresAction action)
|
||||
|
||||
public WiresActionMessage(int id, WiresAction action)
|
||||
{
|
||||
Guid = guid;
|
||||
Id = id;
|
||||
Action = action;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class HackingWiresExt
|
||||
{
|
||||
public static string Name(this WireColor color)
|
||||
{
|
||||
return Loc.GetString(color switch
|
||||
{
|
||||
WireColor.Red => "Red",
|
||||
WireColor.Blue => "Blue",
|
||||
WireColor.Green => "Green",
|
||||
WireColor.Orange => "Orange",
|
||||
WireColor.Brown => "Brown",
|
||||
WireColor.Gold => "Gold",
|
||||
WireColor.Gray => "Gray",
|
||||
WireColor.Cyan => "Cyan",
|
||||
WireColor.Navy => "Navy",
|
||||
WireColor.Purple => "Purple",
|
||||
WireColor.Pink => "Pink",
|
||||
WireColor.Fuchsia => "Fuchsia",
|
||||
_ => throw new InvalidOperationException()
|
||||
});
|
||||
}
|
||||
|
||||
public static Color ColorValue(this WireColor color)
|
||||
{
|
||||
return color switch
|
||||
{
|
||||
WireColor.Red => Color.Red,
|
||||
WireColor.Blue => Color.Blue,
|
||||
WireColor.Green => Color.Green,
|
||||
WireColor.Orange => Color.Orange,
|
||||
WireColor.Brown => Color.Brown,
|
||||
WireColor.Gold => Color.Gold,
|
||||
WireColor.Gray => Color.Gray,
|
||||
WireColor.Cyan => Color.Cyan,
|
||||
WireColor.Navy => Color.Navy,
|
||||
WireColor.Purple => Color.Purple,
|
||||
WireColor.Pink => Color.Pink,
|
||||
WireColor.Fuchsia => Color.Fuchsia,
|
||||
_ => throw new InvalidOperationException()
|
||||
};
|
||||
}
|
||||
|
||||
public static string Name(this WireLetter letter)
|
||||
{
|
||||
return Loc.GetString(letter switch
|
||||
{
|
||||
WireLetter.α => "Alpha",
|
||||
WireLetter.β => "Beta",
|
||||
WireLetter.γ => "Gamma",
|
||||
WireLetter.δ => "Delta",
|
||||
WireLetter.ε => "Epsilon",
|
||||
WireLetter.ζ => "Zeta",
|
||||
WireLetter.η => "Eta",
|
||||
WireLetter.θ => "Theta",
|
||||
WireLetter.ι => "Iota",
|
||||
WireLetter.κ => "Kappa",
|
||||
WireLetter.λ => "Lambda",
|
||||
WireLetter.μ => "Mu",
|
||||
WireLetter.ν => "Nu",
|
||||
WireLetter.ξ => "Xi",
|
||||
WireLetter.ο => "Omicron",
|
||||
WireLetter.π => "Pi",
|
||||
WireLetter.ρ => "Rho",
|
||||
WireLetter.σ => "Sigma",
|
||||
WireLetter.τ => "Tau",
|
||||
WireLetter.υ => "Upsilon",
|
||||
WireLetter.φ => "Phi",
|
||||
WireLetter.χ => "Chi",
|
||||
WireLetter.ψ => "Psi",
|
||||
WireLetter.ω => "Omega",
|
||||
_ => throw new InvalidOperationException()
|
||||
});
|
||||
}
|
||||
|
||||
public static char Letter(this WireLetter letter)
|
||||
{
|
||||
return letter switch
|
||||
{
|
||||
WireLetter.α => 'α',
|
||||
WireLetter.β => 'β',
|
||||
WireLetter.γ => 'γ',
|
||||
WireLetter.δ => 'δ',
|
||||
WireLetter.ε => 'ε',
|
||||
WireLetter.ζ => 'ζ',
|
||||
WireLetter.η => 'η',
|
||||
WireLetter.θ => 'θ',
|
||||
WireLetter.ι => 'ι',
|
||||
WireLetter.κ => 'κ',
|
||||
WireLetter.λ => 'λ',
|
||||
WireLetter.μ => 'μ',
|
||||
WireLetter.ν => 'ν',
|
||||
WireLetter.ξ => 'ξ',
|
||||
WireLetter.ο => 'ο',
|
||||
WireLetter.π => 'π',
|
||||
WireLetter.ρ => 'ρ',
|
||||
WireLetter.σ => 'σ',
|
||||
WireLetter.τ => 'τ',
|
||||
WireLetter.υ => 'υ',
|
||||
WireLetter.φ => 'φ',
|
||||
WireLetter.χ => 'χ',
|
||||
WireLetter.ψ => 'ψ',
|
||||
WireLetter.ω => 'ω',
|
||||
_ => throw new InvalidOperationException()
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user