public void ValidateRequestedPosition(Cycle cycle) { var requestedLocation = _utilities.ToMapLocation(cycle.MovementController.RequestedPosition); // We only want to run logic against the cycle if it's potential new MovementController.HeadLocation has changed. if (!cycle.MovementController.HeadLocation.SameAs(requestedLocation)) { var newLocation = validateOutOfBounds(cycle.MovementController.HeadLocation, _utilities.ToMapLocation(cycle.MovementController.RequestedPosition)); newLocation = validateCycleCollisions(cycle.MovementController.HeadLocation, newLocation); // If our new location is now different from our request location, we need to change the confirmation, // otherwise we need to convert the newLocation to a position and confirm it that way. if (requestedLocation.SameAs(newLocation)) { cycle.MovementController.ConfirmPositionRequest(); } else { cycle.MovementController.ConfirmPositionRequest(_utilities.ToPosition(newLocation, cycle.MovementController.Position.y)); } } else { // If our position request has not differed from our current head location then just confirm it cycle.MovementController.ConfirmPositionRequest(); } }
public void ValidateCollision(Cycle cycle) { var cycleLocation = _utilities.ToMapLocation(cycle.MovementController); // Check if we're out of bounds if (_utilities.OutOfBounds(cycleLocation)) { cycle.HandleCollisionWith(null); return; } long occupiedById = _map[cycleLocation]; if (occupiedById != 0 && occupiedById != -cycle.ID) // Check if we're colliding with something other than our head location { Cycle occupiedBy = _map.GetCycle(Math.Abs(occupiedById)); cycle.HandleCollisionWith(occupiedBy); } }