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(); } } }
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; } }