/// Is this tile active in direction "direction"? private bool IsRedActive(Vector2u v, Tile.TDirection direction) { (uint x, uint y) = (v.X, v.Y); switch (Tiles[x, y].Kind) { case Tile.TKind.RedstoneBlock: return(true); case Tile.TKind.RedstoneWire: case Tile.TKind.RedstoneBridge: return(isRedReachable(v, direction)); case Tile.TKind.NotGate: case Tile.TKind.OrGate: case Tile.TKind.AndGate: case Tile.TKind.XorGate: return((Tile.TDirectionAdd(Tiles[x, y].Direction, Tile.TDirection.North) == direction) && Tiles[x, y].Activity); case Tile.TKind.Repeater: return((Tile.TDirectionAdd(Tiles[x, y].Direction, Tile.TDirection.North) == direction) && Tiles[x, y].Variant == 4); case Tile.TKind.Lever: return(Tiles[x, y].Activity); default: return(false); } }
/// Does this tile connect in direction "direction"? public static bool IsRedConnected(Tile tile, Tile.TDirection direction) { switch (tile.Kind) { case Tile.TKind.RedstoneBlock: case Tile.TKind.RedstoneWire: case Tile.TKind.RedstoneBridge: case Tile.TKind.Lever: return(true); case Tile.TKind.NotGate: case Tile.TKind.Repeater: return((Tile.TDirectionAdd(tile.Direction, Tile.TDirection.North) == direction) || (Tile.TDirectionAdd(tile.Direction, Tile.TDirection.South) == direction)); case Tile.TKind.OrGate: case Tile.TKind.AndGate: case Tile.TKind.XorGate: return((Tile.TDirectionAdd(tile.Direction, Tile.TDirection.North) == direction) || (Tile.TDirectionAdd(tile.Direction, Tile.TDirection.East) == direction) || (Tile.TDirectionAdd(tile.Direction, Tile.TDirection.West) == direction)); default: return(false); } }
private bool isRedReachable(Vector2u v, Tile.TDirection direction) { (uint x, uint y) = (v.X, v.Y); if (Prealloc_RedCheckedNodes[x, y]) { return(false); } if (Tiles[x, y].Kind == Tile.TKind.RedstoneWire) { Prealloc_RedCheckedNodes[x, y] = true; } switch (Tiles[x, y].Kind) { case Tile.TKind.RedstoneWire: return(isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.North), Tile.TDirection.South) || isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.West), Tile.TDirection.East) || isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.South), Tile.TDirection.North) || isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.East), Tile.TDirection.West)); case Tile.TKind.RedstoneBridge: switch (direction) { case Tile.TDirection.North: return(isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.South), Tile.TDirection.North)); case Tile.TDirection.South: return(isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.North), Tile.TDirection.South)); case Tile.TDirection.East: return(isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.West), Tile.TDirection.East)); case Tile.TDirection.West: return(isRedReachable(Tile.PickTileInDirection(v, Tile.TDirection.East), Tile.TDirection.West)); default: throw new System.ArgumentException("Direction was NA", "direction"); } default: return(IsRedActive(v, direction)); } }