using System.Collections.Generic; using Content.Client.Atmos.Overlays; using Content.Shared.Atmos; using Content.Shared.Atmos.EntitySystems; using Content.Shared.GameTicking; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; namespace Content.Client.Atmos.EntitySystems { [UsedImplicitly] internal sealed class AtmosDebugOverlaySystem : SharedAtmosDebugOverlaySystem { private readonly Dictionary _tileData = new(); // Configuration set by debug commands and used by AtmosDebugOverlay { /// Value source for display public AtmosDebugOverlayMode CfgMode; /// This is subtracted from value (applied before CfgScale) public float CfgBase = 0; /// The value is divided by this (applied after CfgBase) public float CfgScale = Atmospherics.MolesCellStandard * 2; /// Gas ID used by GasMoles mode public int CfgSpecificGas = 0; /// Uses black-to-white interpolation (as opposed to red-green-blue) for colourblind users public bool CfgCBM = false; // } public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(Reset); SubscribeNetworkEvent(HandleAtmosDebugOverlayMessage); SubscribeNetworkEvent(HandleAtmosDebugOverlayDisableMessage); SubscribeLocalEvent(OnGridRemoved); var overlayManager = IoCManager.Resolve(); if(!overlayManager.HasOverlay()) overlayManager.AddOverlay(new AtmosDebugOverlay(this)); } private void OnGridRemoved(GridRemovalEvent ev) { if (_tileData.ContainsKey(ev.EntityUid)) { _tileData.Remove(ev.EntityUid); } } private void HandleAtmosDebugOverlayMessage(AtmosDebugOverlayMessage message) { _tileData[GetEntity(message.GridId)] = message; } private void HandleAtmosDebugOverlayDisableMessage(AtmosDebugOverlayDisableMessage ev) { _tileData.Clear(); } public override void Shutdown() { base.Shutdown(); var overlayManager = IoCManager.Resolve(); if (overlayManager.HasOverlay()) overlayManager.RemoveOverlay(); } public void Reset(RoundRestartCleanupEvent ev) { _tileData.Clear(); } public bool HasData(EntityUid gridId) { return _tileData.ContainsKey(gridId); } public AtmosDebugOverlayData? GetData(EntityUid gridIndex, Vector2i indices) { if (!_tileData.TryGetValue(gridIndex, out var srcMsg)) return null; var relative = indices - srcMsg.BaseIdx; if (relative.X < 0 || relative.Y < 0 || relative.X >= LocalViewRange || relative.Y >= LocalViewRange) return null; return srcMsg.OverlayData[relative.X + relative.Y * LocalViewRange]; } } internal enum AtmosDebugOverlayMode : byte { TotalMoles, GasMoles, Temperature } }