Пример #1
0
        /// 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);
            }
        }
Пример #2
0
        /// 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);
            }
        }
Пример #3
0
        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));
            }
        }