示例#1
1
 public Move()
 {
     _face = 0;
     _dir = 0;
 }
示例#2
0
        public static BaseBike FromApianJson(string jsonData, BeamCoreState gData, List <string> peerIdList, long timeStamp)
        {
            object[] data = JsonConvert.DeserializeObject <object[]>(jsonData);

            Vector2 lastGridPos  = new Vector2((long)data[5] * .001f, (long)data[6] * .001f);
            long    lastGridTime = (long)data[7];
            Heading head         = (Heading)(long)data[8];

            float   speed       = (float)(double)data[9];
            int     score       = (int)(long)data[10];
            TurnDir pendingTurn = (TurnDir)(long)data[11];

            float secsSinceGrid = (timeStamp - lastGridTime) * .001f;

            gData.Logger.Info($"BaseBike FromApianJson() - Id: {(string)data[0]} curTime: {timeStamp} timeAtPos: {lastGridTime} lastGridPos: {lastGridPos.ToString()}");

            BaseBike bb = new BaseBike(
                gData,
                (string)data[0],                   // bikeId
                peerIdList[(int)(long)data[1]],    // peerId
                (string)data[2],                   // _name
                Team.teamData[(int)(long)data[3]], // Team
                (string)data[4],                   // ctrl,
                lastGridTime,                      // timeAtPosition
                lastGridPos,                       // current pos
                head);                             //  head)

            bb.speed           = speed;
            bb.score           = score;
            bb.basePendingTurn = pendingTurn;

            return(bb);
        }
示例#3
0
        public virtual bool RequestTurn(TurnDir dir, bool allowDeferred = false)
        {
            // If we are too close to the upcoming point to be able to turn then assign it to the next point,
            // otherwise send out a request.
            // Current limit is 1 bike length
            bool posted = false;

            if (bb.CloseToGridPoint(bb.DynamicState(appCore.CurrentRunningGameTime).position)) // too close to a grid point to turn
            {
                if (allowDeferred)
                {
                    Logger.Verbose($"{this.GetType().Name} Bike {bb.name} requesting deferred turn.");
                    stashedTurn = dir;
                }
            }
            else
            {
                // cancel anything stashed (can this happen?)
                stashedTurn = TurnDir.kUnset;

                if ((dir == bb.basePendingTurn) || (dir == TurnDir.kStraight && bb.basePendingTurn == TurnDir.kUnset))
                {
                    Logger.Verbose($"RequestTurn() ignoring do-nothing {dir}");
                }
                else
                {
                    appCore.PostBikeTurn(bb, dir); // this needs to move
                    posted = true;
                }
            }
            return(posted);
        }
示例#4
0
 private void _updatePosition(Vector2 pos, Heading head, long apianTime)
 {
     optTime        = apianTime;
     optPendingTurn = TurnDir.kUnset;
     optHeading     = head;
     optPosition    = pos;
     logger.Verbose($"_updatePosition() Bike: {bikeId}, Pos: {pos.ToString()} Head: {baseHeading.ToString()}");
 }
示例#5
0
 public BikeDynState(Vector2 _position, Heading _heading, float _speed, int _score, TurnDir _pendingTurn)
 {
     position    = _position;
     heading     = _heading;
     speed       = _speed;
     score       = _score;
     pendingTurn = _pendingTurn;
 }
示例#6
0
        // Commands from outside

        // public void Loop(float secs, long frameTimeMs)
        // {
        //     //logger.Debug($"Loop(). Bike: {bikeId} Speed: {speed})");
        //     _updatePosition(secs, frameTimeMs);
        // }

        // public Vector2 Position(long curMs)
        // {
        //     if (optTime == 0)
        //     {
        //         // use base
        //         float deltaSecs = (curMs - baseTime) * .001f;
        //         return basePosition +  GameConstants.UnitOffset2ForHeading(baseHeading) * (deltaSecs * speed);
        //     }
        //     float deltaSecs2 = (curMs - optTime) * .001f;
        //     return optPosition +  GameConstants.UnitOffset2ForHeading(optHeading) * (deltaSecs2 * speed);
        // }

        public BikeDynState DynamicState(long curTimeMs)
        {
            long    gridTime       = optTime == 0 ? baseTime : optTime;
            Vector2 gridPos        = optTime == 0 ? basePosition : optPosition;
            Heading curHead        = optTime == 0 ? baseHeading : optHeading;
            float   deltaSecs      = (curTimeMs - gridTime) * .001f;
            Vector2 bikePos        = gridPos + GameConstants.UnitOffset2ForHeading(curHead) * (deltaSecs * speed);
            TurnDir curPendingTurn = optTime == 0 ? basePendingTurn : optPendingTurn;

            return(new BikeDynState(bikePos, curHead, speed, score, curPendingTurn));
        }
示例#7
0
文件: Robot.cs 项目: jaklia/onlab
        public void Turn(TurnDir turnDir)
        {
            switch (turnDir)
            {
            case TurnDir.LEFT:
                Dir = (Dir == MoveDir.UP) ? Dir + 3 : Dir - 1;
                break;

            case TurnDir.RIGHT:
                Dir = (Dir == MoveDir.LEFT) ? Dir - 3 : Dir + 1;
                break;
            }
            //System.Threading.Thread.Sleep(500);
        }
示例#8
0
        public abstract void SetupImpl(); // do any implmentation-specific setup

        public virtual void Loop(long curTime, int frameMs)
        {
            bbDynState = bb.DynamicState(curTime);
            if (stashedTurn != TurnDir.kUnset)
            {
                if (!bb.CloseToGridPoint(bbDynState.position))
                {
                    // Turn is requested, and we are not close to a point
                    Logger.Verbose($"{this.GetType().Name} Bike {bb.name} Executing turn.");
                    appCore.PostBikeTurn(bb, stashedTurn);
                    stashedTurn = TurnDir.kUnset;
                }
            }
        }
示例#9
0
        public void ApplyTurn(TurnDir dir, Heading entryHeading, Vector2 nextPt, long cmdTime, BeamMessage.BikeState reportedState)
        {
            // TODO: &&&& reported state really should not be there.

            Vector2 testPt = UpcomingGridPoint(basePosition); // use the last logged position

            if (!testPt.Equals(nextPt))
            {
                logger.Warn($"ApplyTurn(): {(nextPt.ToString())} is the wrong upcoming point for bike: {bikeId}");
                logger.Warn($"We think it should be {(testPt.ToString())}");
                logger.Warn($"Reported State:\n{JsonConvert.SerializeObject(reportedState)}");
                logger.Warn($"Actual State:\n{JsonConvert.SerializeObject(new BeamMessage.BikeState(this)) }");
            }
            basePendingTurn = dir;
        }
示例#10
0
        public void PostBikeTurn(IBike bike, TurnDir dir)
        {
            // This only comes from local AI and player - and "too close" is probably already caught by the bike controller
            BikeDynState bs     = bike.DynamicState(CurrentRunningGameTime); // TODO: Really?
            Vector2      nextPt = (bike as BaseBike).UpcomingGridPoint(bs.position);

            float dx = Vector2.Distance(bs.position, nextPt);

            if (dx < BaseBike.length * .5f)
            {
                logger.Warn($"PostBikeTurn(): Bike too close to turn: {dx} < {BaseBike.length * .5f}");
            }
            else
            {
                apian.SendBikeTurnReq(FrameApianTime, bike, dir, nextPt);
            }
        }
示例#11
0
    public void Turn(TurnDir dir)
    {
        switch (dir)
        {
        case TurnDir.None:
            break;

        case TurnDir.CcwLeft:
            _rigidbody2D.MoveRotation(_rigidbody2D.rotation + _turnFactor * Time.deltaTime);
            break;

        case TurnDir.CwRight:
            _rigidbody2D.MoveRotation(_rigidbody2D.rotation - _turnFactor * Time.deltaTime);
            break;

        default:
            throw new ArgumentOutOfRangeException("dir", dir, null);
        }
    }
示例#12
0
            public List <MoveNode> next; // length 3

            public MoveNode(BeamCoreState gData, Vector2 p, Heading head, TurnDir d, int depth, List <Vector2> otherClaimedPos)
            {
                pos   = p;
                dir   = d; // for later lookup
                place = gData.GetPlace(p);
                score = ScoreForPoint(gData.Ground, pos, place);
                if (score == 0 && otherClaimedPos.Any(op => op.Equals(pos))) // TODO: make prettier
                {
                    score = 1;                                               // TODO: use named scoring constants
                }
                next = depth < 1 ? null : BikeUtils.PossiblePointsForPointAndHeading(pos, head)
                       .Select((pt, childTurnDir) => new MoveNode(gData,
                                                                  pos + GameConstants.UnitOffset2ForHeading(GameConstants.NewHeadForTurn(head, (TurnDir)childTurnDir)) * Ground.gridSize,
                                                                  head,
                                                                  (TurnDir)childTurnDir,
                                                                  depth - 1,
                                                                  otherClaimedPos))
                       .ToList();
            }
示例#13
0
    // Update is called once per frame
    void Update()
    {
        if (r.NextDouble() <= .8)        // 80% of time - move, 20% - do nothing
        {
            if (r.NextDouble() <= .80)   // 80% - move forward, 15% - move bw, 5% dont move
            {
                Mover.Move(MoveDir.Forward);
            }
            else if (r.NextDouble() <= .75)
            {
                Mover.Move(MoveDir.Backward);
            }
        }

        if (r.NextDouble() < .3)     // 30% of time turn somewhere, 70% dont turn
        {
            if (r.NextDouble() < .1) // in rare case (10%) change direction, 90% - keep previous
            {
                dir = dir == TurnDir.CcwLeft ? TurnDir.CwRight : TurnDir.CcwLeft;
            }

            Mover.Turn(dir);
        }
    }
示例#14
0
 public void RequestTurn(TurnDir dir)
 {
     control.RequestTurn(dir, true); // allow deferred
 }
示例#15
0
 public Move(FaceId f, TurnDir d)
 {
     _face = f;
     _dir = d;
 }
示例#16
0
 public static Heading NewHeadForTurn(Heading h, TurnDir t) => newHeadForTurn[(int)h % 4][(int)t % 3];
示例#17
0
        public void B(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                edges[(int)EdgeId.UB].flip();
                edges[(int)EdgeId.BR].flip();
                edges[(int)EdgeId.DB].flip();
                edges[(int)EdgeId.BL].flip();
                a = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = edges[(int)EdgeId.BR];
                edges[(int)EdgeId.BR] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = a;
                corners[(int)CornerId.URB].cw();
                corners[(int)CornerId.DLB].cw();
                corners[(int)CornerId.ULB].ccw();
                corners[(int)CornerId.DRB].ccw();
                b = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = b;
            }
            if (x == TurnDir.CCW)
            {
                edges[(int)EdgeId.UB].flip();
                edges[(int)EdgeId.BR].flip();
                edges[(int)EdgeId.DB].flip();
                edges[(int)EdgeId.BL].flip();
                a = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = edges[(int)EdgeId.BR];
                edges[(int)EdgeId.BR] = a;
                corners[(int)CornerId.URB].cw();
                corners[(int)CornerId.DLB].cw();
                corners[(int)CornerId.ULB].ccw();
                corners[(int)CornerId.DRB].ccw();
                b = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = a;
                a = edges[(int)EdgeId.BR];
                edges[(int)EdgeId.BR] = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = a;
                b = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = b;
                b = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = b;
            }
        }
示例#18
0
        public void D(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                a = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = edges[(int)EdgeId.DR];
                edges[(int)EdgeId.DR] = a;
                b = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = b;
            }
            if (x == TurnDir.CCW)
            {
                a = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = edges[(int)EdgeId.DR];
                edges[(int)EdgeId.DR] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = a;
                b = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = edges[(int)EdgeId.DB];
                edges[(int)EdgeId.DB] = a;
                a = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = edges[(int)EdgeId.DR];
                edges[(int)EdgeId.DR] = a;
                b = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = b;
                b = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = b;
            }
        }
示例#19
0
        public void F(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                edges[(int)EdgeId.UF].flip();
                edges[(int)EdgeId.FR].flip();
                edges[(int)EdgeId.DF].flip();
                edges[(int)EdgeId.FL].flip();
                a = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = edges[(int)EdgeId.FR];
                edges[(int)EdgeId.FR] = a;
                corners[(int)CornerId.DRF].cw();
                corners[(int)CornerId.ULF].cw();
                corners[(int)CornerId.URF].ccw();
                corners[(int)CornerId.DLF].ccw();
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = b;
            }
            if (x == TurnDir.CCW)
            {
                edges[(int)EdgeId.UF].flip();
                edges[(int)EdgeId.FR].flip();
                edges[(int)EdgeId.DF].flip();
                edges[(int)EdgeId.FL].flip();
                a = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = edges[(int)EdgeId.FR];
                edges[(int)EdgeId.FR] = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = a;
                corners[(int)CornerId.DRF].cw();
                corners[(int)CornerId.ULF].cw();
                corners[(int)CornerId.URF].ccw();
                corners[(int)CornerId.DLF].ccw();
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = edges[(int)EdgeId.DF];
                edges[(int)EdgeId.DF] = a;
                a = edges[(int)EdgeId.FR];
                edges[(int)EdgeId.FR] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = a;
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = b;
                b = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = b;
            }
        }
示例#20
0
        public void U(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                a = edges[(int)EdgeId.UR];
                edges[(int)EdgeId.UR] = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = a;
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = b;
            }
            if (x == TurnDir.CCW)
            {
                a = edges[(int)EdgeId.UR];
                edges[(int)EdgeId.UR] = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = a;
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.UR];
                edges[(int)EdgeId.UR] = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = a;
                a = edges[(int)EdgeId.UF];
                edges[(int)EdgeId.UF] = edges[(int)EdgeId.UB];
                edges[(int)EdgeId.UB] = a;
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = b;
                b = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = b;
            }
        }
示例#21
0
        public void R(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                a = edges[(int) EdgeId.UR];
                edges[(int) EdgeId.UR] = edges[(int) EdgeId.FR];
                edges[(int) EdgeId.FR] = edges[(int) EdgeId.DR];
                edges[(int) EdgeId.DR] = edges[(int) EdgeId.BR];
                edges[(int) EdgeId.BR] = a;
                corners[(int) CornerId.URF].cw();
                corners[(int) CornerId.DRB].cw();
                corners[(int) CornerId.URB].ccw();
                corners[(int) CornerId.DRF].ccw();
                b = corners[(int) CornerId.URF];
                corners[(int) CornerId.URF] = corners[(int) CornerId.DRF];
                corners[(int) CornerId.DRF] = corners[(int) CornerId.DRB];
                corners[(int) CornerId.DRB] = corners[(int) CornerId.URB];
                corners[(int) CornerId.URB] = b;
            }
            if (x == TurnDir.CCW)
            {
                a = edges[(int)EdgeId.UR];
                edges[(int)EdgeId.UR] = edges[(int)EdgeId.BR];
                edges[(int)EdgeId.BR] = edges[(int)EdgeId.DR];
                edges[(int)EdgeId.DR] = edges[(int)EdgeId.FR];
                edges[(int)EdgeId.FR] = a;
                corners[(int)CornerId.URF].cw();
                corners[(int)CornerId.DRB].cw();
                corners[(int)CornerId.DRF].ccw();
                corners[(int)CornerId.URB].ccw();
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.UR];
                edges[(int)EdgeId.UR] = edges[(int)EdgeId.DR];
                edges[(int)EdgeId.DR] = a;
                a = edges[(int)EdgeId.FR];
                edges[(int)EdgeId.FR] = edges[(int)EdgeId.BR];
                edges[(int)EdgeId.BR] = a;
                b = corners[(int)CornerId.URF];
                corners[(int)CornerId.URF] = corners[(int)CornerId.DRB];
                corners[(int)CornerId.DRB] = b;
                b = corners[(int)CornerId.DRF];
                corners[(int)CornerId.DRF] = corners[(int)CornerId.URB];
                corners[(int)CornerId.URB] = b;
            }
        }
示例#22
0
        public void L(TurnDir x)
        {
            Edge a;
            Corner b;

            if (x == TurnDir.CW)
            {
                a = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = a;
                corners[(int)CornerId.DLF].cw();
                corners[(int)CornerId.ULB].cw();
                corners[(int)CornerId.ULF].ccw();
                corners[(int)CornerId.DLB].ccw();
                b = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = b;
            }
            if (x == TurnDir.CCW)
            {
                a = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = a;
                corners[(int)CornerId.DLF].cw();
                corners[(int)CornerId.ULB].cw();
                corners[(int)CornerId.ULF].ccw();
                corners[(int)CornerId.DLB].ccw();
                b = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = b;
            }
            if (x == TurnDir.DOUBLE)
            {
                a = edges[(int)EdgeId.UL];
                edges[(int)EdgeId.UL] = edges[(int)EdgeId.DL];
                edges[(int)EdgeId.DL] = a;
                a = edges[(int)EdgeId.BL];
                edges[(int)EdgeId.BL] = edges[(int)EdgeId.FL];
                edges[(int)EdgeId.FL] = a;
                b = corners[(int)CornerId.ULF];
                corners[(int)CornerId.ULF] = corners[(int)CornerId.DLB];
                corners[(int)CornerId.DLB] = b;
                b = corners[(int)CornerId.ULB];
                corners[(int)CornerId.ULB] = corners[(int)CornerId.DLF];
                corners[(int)CornerId.DLF] = b;
            }
        }