* #272 add bordered panel for effects bar * #272 avoid mouse overlapping tooltip when near edges, change tooltip colors to match mockups * #272 WIP defining status effect states as YML and sending them as encoded integers * #272 refactor to use new alert system * #272 refactor to use new alert system * #272 fix various bugs with new alert system and update alerts to have color * #272 WIP * #272 rename status effects to alerts * #272 WIP reworking alert internals to avoid code dup and eliminate enum * #272 refactor alerts to use categories and fix various bugs * #272 more alert bugfixes * #272 alert ordering * #272 callback-based approach for alert clicks * #272 add debug commands for alerts * #272 utilize new GridContainer capabilities for sizing of alerts tab * #272 scale alerts height based on window size * #272 fix tooltip flicker * #272 transparent alert panel * #272 adjust styles to match injazz mockups more, add cooldown info in tooltip * #272 adjust styles to match injazz mockups more, add cooldown info in tooltip * #272 alert prototype tests * #272 alert manager tests * #272 alert order tests * #272 simple unit test for alerts component * #272 integration test for alerts * #272 rework alerts to use enums instead of id / category * #272 various cleanups for PR * #272 use byte for more compact alert messages * #272 rename StatusEffects folder to Alerts, add missing NetSerializable
125 lines
4.0 KiB
C#
125 lines
4.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Content.Shared.Prototypes.Kitchen;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Log;
|
|
using Robust.Shared.Prototypes;
|
|
|
|
namespace Content.Shared.Alert
|
|
{
|
|
/// <summary>
|
|
/// Provides access to all configured alerts. Ability to encode/decode a given state
|
|
/// to an int.
|
|
/// </summary>
|
|
public class AlertManager
|
|
{
|
|
[Dependency]
|
|
private readonly IPrototypeManager _prototypeManager = default!;
|
|
|
|
private AlertPrototype[] _orderedAlerts;
|
|
private Dictionary<AlertType, byte> _typeToIndex;
|
|
|
|
public void Initialize()
|
|
{
|
|
// order by type value so we can map between the id and an integer index and use
|
|
// the index for compact alert change messages
|
|
_orderedAlerts =
|
|
_prototypeManager.EnumeratePrototypes<AlertPrototype>()
|
|
.OrderBy(prototype => prototype.AlertType).ToArray();
|
|
_typeToIndex = new Dictionary<AlertType, byte>();
|
|
|
|
for (var i = 0; i < _orderedAlerts.Length; i++)
|
|
{
|
|
if (i > byte.MaxValue)
|
|
{
|
|
Logger.ErrorS("alert", "too many alerts for byte encoding ({0})! encoding will need" +
|
|
" to be changed to use a ushort rather than byte", _typeToIndex.Count);
|
|
break;
|
|
}
|
|
if (!_typeToIndex.TryAdd(_orderedAlerts[i].AlertType, (byte) i))
|
|
{
|
|
Logger.ErrorS("alert",
|
|
"Found alert with duplicate id {0}", _orderedAlerts[i].AlertType);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get the alert of the indicated type
|
|
/// </summary>
|
|
/// <returns>true if found</returns>
|
|
public bool TryGet(AlertType alertType, out AlertPrototype alert)
|
|
{
|
|
if (_typeToIndex.TryGetValue(alertType, out var idx))
|
|
{
|
|
alert = _orderedAlerts[idx];
|
|
return true;
|
|
}
|
|
|
|
alert = null;
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get the alert of the indicated type along with its encoding
|
|
/// </summary>
|
|
/// <returns>true if found</returns>
|
|
public bool TryGetWithEncoded(AlertType alertType, out AlertPrototype alert, out byte encoded)
|
|
{
|
|
if (_typeToIndex.TryGetValue(alertType, out var idx))
|
|
{
|
|
alert = _orderedAlerts[idx];
|
|
encoded = (byte) idx;
|
|
return true;
|
|
}
|
|
|
|
alert = null;
|
|
encoded = 0;
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get the compact encoded representation of this alert
|
|
/// </summary>
|
|
/// <returns>true if successful</returns>
|
|
public bool TryEncode(AlertPrototype alert, out byte encoded)
|
|
{
|
|
return TryEncode(alert.AlertType, out encoded);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get the compact encoded representation of the alert with
|
|
/// the indicated id
|
|
/// </summary>
|
|
/// <returns>true if successful</returns>
|
|
public bool TryEncode(AlertType alertType, out byte encoded)
|
|
{
|
|
if (_typeToIndex.TryGetValue(alertType, out var idx))
|
|
{
|
|
encoded = idx;
|
|
return true;
|
|
}
|
|
|
|
encoded = 0;
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to get the alert from the encoded representation
|
|
/// </summary>
|
|
/// <returns>true if successful</returns>
|
|
public bool TryDecode(byte encodedAlert, out AlertPrototype alert)
|
|
{
|
|
if (encodedAlert >= _orderedAlerts.Length)
|
|
{
|
|
alert = null;
|
|
return false;
|
|
}
|
|
|
|
alert = _orderedAlerts[encodedAlert];
|
|
return true;
|
|
}
|
|
}
|
|
}
|