private void TryToMove(Position targetPosition) { if (targetPosition != null) { status = Status.Moving; direction = CalculateDirection(targetPosition - position); engine.ScheduleUpdate(GetMoveCooldown(position, targetPosition), this); var blockingUnit = engine.GetUnitAt(targetPosition); if (blockingUnit != null) { engine.SwapUnits(this, blockingUnit); } else { engine.MoveUnit(this, targetPosition); } } else { status = Status.Idle; // Retry after moveRetryCooldown ticks engine.ScheduleUpdate(moveRetryCooldown, this); } }