示例#1
0
        public override void Initialize()
        {
            base.Initialize();
            SubscribeNetworkEvent <GasOverlayMessage>(HandleGasOverlayMessage);
            _mapManager.OnGridRemoved += OnGridRemoved;

            for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var overlay = Atmospherics.GetOverlay(i);
                switch (overlay)
                {
                case SpriteSpecifier.Rsi animated:
                    var rsi     = _resourceCache.GetResource <RSIResource>(animated.RsiPath).RSI;
                    var stateId = animated.RsiState;

                    if (!rsi.TryGetState(stateId, out var state))
                    {
                        continue;
                    }

                    _frames[i]       = state.GetFrames(RSI.State.Direction.South);
                    _frameDelays[i]  = state.GetDelays();
                    _frameCounter[i] = 0;
                    break;

                case SpriteSpecifier.Texture texture:
                    _frames[i]      = new[] { texture.Frame0() };
                    _frameDelays[i] = Array.Empty <float>();
                    break;

                case null:
                    _frames[i]      = Array.Empty <Texture>();
                    _frameDelays[i] = Array.Empty <float>();
                    break;
                }
            }

            var fire = _resourceCache.GetResource <RSIResource>(FireRsiPath).RSI;

            for (var i = 0; i < FireStates; i++)
            {
                if (!fire.TryGetState((i + 1).ToString(), out var state))
                {
                    throw new ArgumentOutOfRangeException($"Fire RSI doesn't have state \"{i}\"!");
                }

                _fireFrames[i]       = state.GetFrames(RSI.State.Direction.South);
                _fireFrameDelays[i]  = state.GetDelays();
                _fireFrameCounter[i] = 0;
            }

            var overlayManager = IoCManager.Resolve <IOverlayManager>();

            if (!overlayManager.HasOverlay(nameof(GasTileOverlay)))
            {
                overlayManager.AddOverlay(new GasTileOverlay());
            }
        }
示例#2
0
        private bool TryRefreshTile(GridAtmosphereComponent gam, GasOverlayData oldTile, MapIndices indices, out GasOverlayData overlayData)
        {
            var tile = gam.GetTile(indices);

            if (tile == null)
            {
                overlayData = default;
                return(false);
            }

            var tileData = new List <GasData>();

            for (byte i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var gas     = Atmospherics.GetGas(i);
                var overlay = Atmospherics.GetOverlay(i);
                if (overlay == null || tile?.Air == null)
                {
                    continue;
                }

                var moles = tile.Air.Gases[i];

                if (moles < gas.GasMolesVisible)
                {
                    continue;
                }

                var data = new GasData(i, (byte)(MathHelper.Clamp01(moles / gas.GasMolesVisibleMax) * 255));
                tileData.Add(data);
            }

            overlayData = new GasOverlayData(tile !.Hotspot.State, tile.Hotspot.Temperature, tileData.Count == 0 ? null : tileData.ToArray());

            if (overlayData.Equals(oldTile))
            {
                return(false);
            }

            return(true);
        }