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(); }
// &&&&&&&&&&&&& remove // private void _updatePosition(float secs, long frameApianTime) // { // if (secs == 0 || speed == 0) // return; // Vector2 upcomingPoint = UpcomingGridPoint(); // float timeToPoint = Vector2.Distance(position, upcomingPoint) / speed; // Vector2 newPos = position; // Heading newHead = heading; // if (secs >= timeToPoint) // { // logger.Debug($"_updatePosition() Bike: {bikeId} MsToPoint: {(long)(timeToPoint*1000)}"); // secs -= timeToPoint; // newPos = upcomingPoint; // newHead = GameConstants.NewHeadForTurn(heading, pendingTurn); // pendingTurn = TurnDir.kUnset; // DoAtGridPoint(upcomingPoint, heading, newHead, frameApianTime);// + (long)(timeToPoint*1000)); // Using the offset makes odd things happen on the server // heading = newHead; // } // newPos += GameConstants.UnitOffset2ForHeading(heading) * secs * speed; // position = newPos; // } // private float _rollbackTime(float secs) // { // // Propagate the bike backwards in time by "secs" or almost the length of time that // // takes it backwards to the previous point - whichever is shorter // // This is to try to minimize message delays. // // If, for instance, a bike command is received that we know happened .08 secs ago, // // then the code handling the command can roll the bike back, apply the ecommand, and then // // call bike.update(rolledBackTime) to have effectively back-applied the command. // // it's not really safe to go backwards across a gridpoint, so that's as far as we'll go back. // // It returns the amount of time rolled back as a positive float. // if (speed == 0 || secs <= 0) // return 0; // Vector2 upcomingPoint = UpcomingGridPoint(); // float timeToNextPoint = Vector2.Distance(position, upcomingPoint) / speed; // float timeSinceLastPoint = Mathf.Max(0,((Ground.gridSize * .8f) / speed) - timeToNextPoint); // Note QUITE all the way back // secs = Mathf.Min(secs, timeSinceLastPoint); // position -= GameConstants.UnitOffset2ForHeading(heading) * secs * speed; // return secs; // } // private float _rollbackTime(float secs) // { // // Propagate the bike backwards in time by "secs" to apply a command that should have happened in the past // // (See above for a version that tries to avoid crossing gridpoints - this one does not anymore - the cure // // was worse than the disease) // position -= GameConstants.UnitOffset2ForHeading(heading) * secs * speed; // return secs; // } protected virtual void DoAtGridPoint(Vector2 pos, Heading entryHead, Heading exitHead, long apianTime) { BeamPlace p = gameData.GetPlace(pos); logger.Verbose($"DoAtGridPoint({pos.ToString()}) Bike: {bikeId} Time: {apianTime}"); if (p == null) { int xIdx, zIdx; (xIdx, zIdx) = Ground.NearestGridIndices(pos); // is it on the map? if (gameData.Ground.IndicesAreOnMap(xIdx, zIdx)) { // Yes. Since it's empty send a claim report // Doesn't matter if the bike is local or not - THIS peer thinks there's a claim gameData.ReportPlaceClaimed(this, xIdx, zIdx, entryHead, exitHead); } else { // Nope. Blow it up. // TODO: should going off the map be a consensus event? // Current thinking: yeah. But not now. // A thought: Could just skip the on-map check and call it a place claim and report it // GameNet can grant/not grant it depending on the consensus rules, and if inst // gets the claim it can just blow it up then. // This is stupid and temporary (rather than just getting rid of the test) // TODO: FIX THIS!!! &&&&&&& gameData.ReportPlaceClaimed(this, xIdx, zIdx, entryHead, exitHead); //gameInst.apian.SendPlaceClaimObs(apianTime, this, xIdx, zIdx, entryHead, exitHead); } } else { // Hit a marker. Report it. gameData.ReportPlaceHit(this, p.xIdx, p.zIdx, entryHead, exitHead); } }