예제 #1
0
        internal override void CalculateNewSprite()
        {
            base.CalculateNewSprite();

            var(n, nl)   = MatchingWall(SnapGrid.GetInDir(Direction.North));
            var(ne, nel) = MatchingWall(SnapGrid.GetInDir(Direction.NorthEast));
            var(e, el)   = MatchingWall(SnapGrid.GetInDir(Direction.East));
            var(se, sel) = MatchingWall(SnapGrid.GetInDir(Direction.SouthEast));
            var(s, sl)   = MatchingWall(SnapGrid.GetInDir(Direction.South));
            var(sw, swl) = MatchingWall(SnapGrid.GetInDir(Direction.SouthWest));
            var(w, wl)   = MatchingWall(SnapGrid.GetInDir(Direction.West));
            var(nw, nwl) = MatchingWall(SnapGrid.GetInDir(Direction.NorthWest));

            // ReSharper disable InconsistentNaming
            var cornerNE = CornerFill.None;
            var cornerSE = CornerFill.None;
            var cornerSW = CornerFill.None;
            var cornerNW = CornerFill.None;

            var lowCornerNE = CornerFill.None;
            var lowCornerSE = CornerFill.None;
            var lowCornerSW = CornerFill.None;
            var lowCornerNW = CornerFill.None;

            // ReSharper restore InconsistentNaming

            if (n)
            {
                cornerNE |= CornerFill.CounterClockwise;
                cornerNW |= CornerFill.Clockwise;

                if (!nl)
                {
                    lowCornerNE |= CornerFill.CounterClockwise;
                    lowCornerNW |= CornerFill.Clockwise;
                }
            }

            if (ne)
            {
                cornerNE |= CornerFill.Diagonal;

                if (!nel && (nl || el || n && e))
                {
                    lowCornerNE |= CornerFill.Diagonal;
                }
            }

            if (e)
            {
                cornerNE |= CornerFill.Clockwise;
                cornerSE |= CornerFill.CounterClockwise;

                if (!el)
                {
                    lowCornerNE |= CornerFill.Clockwise;
                    lowCornerSE |= CornerFill.CounterClockwise;
                }
            }

            if (se)
            {
                cornerSE |= CornerFill.Diagonal;

                if (!sel && (sl || el || s && e))
                {
                    lowCornerSE |= CornerFill.Diagonal;
                }
            }

            if (s)
            {
                cornerSE |= CornerFill.Clockwise;
                cornerSW |= CornerFill.CounterClockwise;

                if (!sl)
                {
                    lowCornerSE |= CornerFill.Clockwise;
                    lowCornerSW |= CornerFill.CounterClockwise;
                }
            }

            if (sw)
            {
                cornerSW |= CornerFill.Diagonal;

                if (!swl && (sl || wl || s && w))
                {
                    lowCornerSW |= CornerFill.Diagonal;
                }
            }

            if (w)
            {
                cornerSW |= CornerFill.Clockwise;
                cornerNW |= CornerFill.CounterClockwise;

                if (!wl)
                {
                    lowCornerSW |= CornerFill.Clockwise;
                    lowCornerNW |= CornerFill.CounterClockwise;
                }
            }

            if (nw)
            {
                cornerNW |= CornerFill.Diagonal;

                if (!nwl && (nl || wl || n && w))
                {
                    lowCornerNW |= CornerFill.Diagonal;
                }
            }

            Sprite.LayerSetState(CornerLayers.NE, $"{StateBase}{(int) cornerNE}");
            Sprite.LayerSetState(CornerLayers.SE, $"{StateBase}{(int) cornerSE}");
            Sprite.LayerSetState(CornerLayers.SW, $"{StateBase}{(int) cornerSW}");
            Sprite.LayerSetState(CornerLayers.NW, $"{StateBase}{(int) cornerNW}");

            Sprite.LayerSetState(OverCornerLayers.NE, $"{StateBase}over_{(int) lowCornerNE}");
            Sprite.LayerSetState(OverCornerLayers.SE, $"{StateBase}over_{(int) lowCornerSE}");
            Sprite.LayerSetState(OverCornerLayers.SW, $"{StateBase}over_{(int) lowCornerSW}");
            Sprite.LayerSetState(OverCornerLayers.NW, $"{StateBase}over_{(int) lowCornerNW}");

            LastCornerNE = cornerNE;
            LastCornerSE = cornerSE;
            LastCornerSW = cornerSW;
            LastCornerNW = cornerNW;

            foreach (var entity in SnapGrid.GetLocal())
            {
                if (entity.TryGetComponent(out WindowComponent window))
                {
                    window.UpdateSprite();
                }
            }
        }
예제 #2
0
        internal override void CalculateNewSprite()
        {
            base.CalculateNewSprite();

            if (Sprite == null || !Owner.Transform.Anchored || _overlaySprite == null)
            {
                return;
            }

            var grid   = _mapManager.GetGrid(Owner.Transform.GridID);
            var coords = Owner.Transform.Coordinates;

            var(n, nl)   = MatchingWall(grid.GetInDir(coords, Direction.North));
            var(ne, nel) = MatchingWall(grid.GetInDir(coords, Direction.NorthEast));
            var(e, el)   = MatchingWall(grid.GetInDir(coords, Direction.East));
            var(se, sel) = MatchingWall(grid.GetInDir(coords, Direction.SouthEast));
            var(s, sl)   = MatchingWall(grid.GetInDir(coords, Direction.South));
            var(sw, swl) = MatchingWall(grid.GetInDir(coords, Direction.SouthWest));
            var(w, wl)   = MatchingWall(grid.GetInDir(coords, Direction.West));
            var(nw, nwl) = MatchingWall(grid.GetInDir(coords, Direction.NorthWest));

            // ReSharper disable InconsistentNaming
            var cornerNE = CornerFill.None;
            var cornerSE = CornerFill.None;
            var cornerSW = CornerFill.None;
            var cornerNW = CornerFill.None;

            var lowCornerNE = CornerFill.None;
            var lowCornerSE = CornerFill.None;
            var lowCornerSW = CornerFill.None;
            var lowCornerNW = CornerFill.None;

            // ReSharper restore InconsistentNaming

            if (n)
            {
                cornerNE |= CornerFill.CounterClockwise;
                cornerNW |= CornerFill.Clockwise;

                if (!nl && !e && !w)
                {
                    lowCornerNE |= CornerFill.CounterClockwise;
                    lowCornerNW |= CornerFill.Clockwise;
                }
            }

            if (ne)
            {
                cornerNE |= CornerFill.Diagonal;

                if (!nel && (nl || el || n && e))
                {
                    lowCornerNE |= CornerFill.Diagonal;
                }
            }

            if (e)
            {
                cornerNE |= CornerFill.Clockwise;
                cornerSE |= CornerFill.CounterClockwise;

                if (!el)
                {
                    lowCornerNE |= CornerFill.Clockwise;
                    lowCornerSE |= CornerFill.CounterClockwise;
                }
            }

            if (se)
            {
                cornerSE |= CornerFill.Diagonal;

                if (!sel && (sl || el || s && e))
                {
                    lowCornerSE |= CornerFill.Diagonal;
                }
            }

            if (s)
            {
                cornerSE |= CornerFill.Clockwise;
                cornerSW |= CornerFill.CounterClockwise;

                if (!sl)
                {
                    lowCornerSE |= CornerFill.Clockwise;
                    lowCornerSW |= CornerFill.CounterClockwise;
                }
            }

            if (sw)
            {
                cornerSW |= CornerFill.Diagonal;

                if (!swl && (sl || wl || s && w))
                {
                    lowCornerSW |= CornerFill.Diagonal;
                }
            }

            if (w)
            {
                cornerSW |= CornerFill.Clockwise;
                cornerNW |= CornerFill.CounterClockwise;

                if (!wl)
                {
                    lowCornerSW |= CornerFill.Clockwise;
                    lowCornerNW |= CornerFill.CounterClockwise;
                }
            }

            if (nw)
            {
                cornerNW |= CornerFill.Diagonal;

                if (!nwl && (nl || wl || n && w))
                {
                    lowCornerNW |= CornerFill.Diagonal;
                }
            }

            Sprite.LayerSetState(CornerLayers.NE, $"{StateBase}{(int) cornerNE}");
            Sprite.LayerSetState(CornerLayers.SE, $"{StateBase}{(int) cornerSE}");
            Sprite.LayerSetState(CornerLayers.SW, $"{StateBase}{(int) cornerSW}");
            Sprite.LayerSetState(CornerLayers.NW, $"{StateBase}{(int) cornerNW}");

            _overlaySprite.LayerSetState(OverCornerLayers.NE, $"{StateBase}over_{(int) lowCornerNE}");
            _overlaySprite.LayerSetState(OverCornerLayers.SE, $"{StateBase}over_{(int) lowCornerSE}");
            _overlaySprite.LayerSetState(OverCornerLayers.SW, $"{StateBase}over_{(int) lowCornerSW}");
            _overlaySprite.LayerSetState(OverCornerLayers.NW, $"{StateBase}over_{(int) lowCornerNW}");

            LastCornerNE = cornerNE;
            LastCornerSE = cornerSE;
            LastCornerSW = cornerSW;
            LastCornerNW = cornerNW;

            foreach (var entity in grid.GetLocal(coords))
            {
                if (Owner.EntityManager.TryGetComponent(entity, out WindowComponent? window))
                {
                    //window.UpdateSprite();
                }
            }
        }
        void UpdateConnections(bool propagate)
        {
            for (int i = 0; i < Neighbors.Length; i++)
            {
                var found = false;
                var dir   = (Direction)i;
                foreach (var entity in SnapGrid.GetInDir(dir))
                {
                    if (entity.TryGetComponent(out IconSmoothComponent smooth) && smooth.SmoothKey == SmoothKey)
                    {
                        Neighbors[i] = smooth;
                        if (propagate)
                        {
                            smooth.UpdateConnections(false);
                            smooth.UpdateIcon();
                        }
                        // Temptation to use goto: 10.
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    Neighbors[i] = null;
                }
            }

            CornerNE = CornerSE = CornerNW = CornerSW = CornerFill.None;

            // "Use a loop".
            // Well screw that I did the exact same thing while writing lighting corner population code in BYOND.
            // This is 10x easier to understand and write than a complex loop working with the internet mapping of direction flags.
            if (Neighbors[(int)Direction.North] != null)
            {
                CornerNE |= CornerFill.CounterClockwise;
                CornerNW |= CornerFill.Clockwise;
            }
            if (Neighbors[(int)Direction.NorthEast] != null)
            {
                CornerNE |= CornerFill.Diagonal;
            }
            if (Neighbors[(int)Direction.East] != null)
            {
                CornerNE |= CornerFill.Clockwise;
                CornerSE |= CornerFill.CounterClockwise;
            }
            if (Neighbors[(int)Direction.SouthEast] != null)
            {
                CornerSE |= CornerFill.Diagonal;
            }
            if (Neighbors[(int)Direction.South] != null)
            {
                CornerSE |= CornerFill.Clockwise;
                CornerSW |= CornerFill.CounterClockwise;
            }
            if (Neighbors[(int)Direction.SouthWest] != null)
            {
                CornerSW |= CornerFill.Diagonal;
            }
            if (Neighbors[(int)Direction.West] != null)
            {
                CornerSW |= CornerFill.Clockwise;
                CornerNW |= CornerFill.CounterClockwise;
            }
            if (Neighbors[(int)Direction.NorthWest] != null)
            {
                CornerNW |= CornerFill.Diagonal;
            }
        }