public Move() { _face = 0; _dir = 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); }
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); }
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()}"); }
public BikeDynState(Vector2 _position, Heading _heading, float _speed, int _score, TurnDir _pendingTurn) { position = _position; heading = _heading; speed = _speed; score = _score; pendingTurn = _pendingTurn; }
// 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)); }
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); }
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; } } }
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; }
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); } }
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); } }
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(); }
// 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); } }
public void RequestTurn(TurnDir dir) { control.RequestTurn(dir, true); // allow deferred }
public Move(FaceId f, TurnDir d) { _face = f; _dir = d; }
public static Heading NewHeadForTurn(Heading h, TurnDir t) => newHeadForTurn[(int)h % 4][(int)t % 3];
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }