def requestInteract(self, avId, npc):
        av = self.air.doId2do.get(avId)
        if not av:
            return

        for index, quest in enumerate(self.__toonQuestsList2Quests(av.quests)):
            questId, fromNpcId, toNpcId, rewardId, toonProgress = av.quests[
                index]
            isComplete = quest.getCompletionStatus(av, av.quests[index], npc)
            if isComplete != Quests.COMPLETE:
                continue

            if avId in self.air.tutorialManager.avId2fsm.keys():
                self.air.tutorialManager.avId2fsm[avId].demand('Tunnel')

            if isinstance(quest, Quests.DeliverGagQuest):
                track, level = quest.getGagType()
                av.inventory.setItem(
                    track, level,
                    av.inventory.numItem(track, level) - quest.getNumGags())
                av.b_setInventory(av.inventory.makeNetString())

            nextQuest = Quests.getNextQuest(questId, npc, av)
            if nextQuest == (Quests.NA, Quests.NA):
                if isinstance(quest, Quests.TrackChoiceQuest):
                    npc.presentTrackChoice(avId, questId, quest.getChoices())
                    return

                rewardId = Quests.getAvatarRewardId(av, questId)
                npc.completeQuest(avId, questId, rewardId)
                self.completeQuest(av, questId)
                self.giveReward(av, rewardId)
                return
            else:
                self.completeQuest(av, questId)
                nextQuestId = nextQuest[0]
                nextRewardId = Quests.getFinalRewardId(questId, 1)
                nextToNpcId = nextQuest[1]
                self.npcGiveQuest(npc, av, nextQuestId, nextRewardId,
                                  nextToNpcId)
                return

        if len(self.__toonQuestsList2Quests(
                av.quests)) >= av.getQuestCarryLimit():
            npc.rejectAvatar(avId)
            return

        if avId in self.air.tutorialManager.avId2fsm.keys():
            if av.getRewardHistory()[0] == 0:
                self.npcGiveQuest(npc,
                                  av,
                                  101,
                                  Quests.findFinalRewardId(101)[0],
                                  Quests.getQuestToNpcId(101),
                                  storeReward=True)
                self.air.tutorialManager.avId2fsm[avId].demand('Battle')
                return

        tier = av.getRewardHistory()[0]
        if Quests.avatarHasAllRequiredRewards(av, tier):
            if not Quests.avatarWorkingOnRequiredRewards(av):
                if tier != Quests.LOOPING_FINAL_TIER:
                    tier += 1

                av.b_setRewardHistory(tier, [])
            else:
                npc.rejectAvatarTierNotDone(avId)
                return

        bestQuests = Quests.chooseBestQuests(tier, npc, av)
        if not bestQuests:
            npc.rejectAvatar(avId)
            return

        npc.presentQuestChoice(avId, bestQuests)
        return