def update(self, questIdList, quest, newQuest):
        if quest and isinstance(quest, Quest.Quest):
            if newQuest:
                localAvatar.questStatus.assignQuest(quest)
                container = localAvatar.questStatus.getContainer(quest.questId)
                if not container:
                    container = localAvatar.getQuestById(quest.questId)
                container.viewedInGUI = False
        for button in self.buttons:
            button.destroy()

        self.buttons = []
        self.trees = {}
        for questId in questIdList:
            path = QuestLadderDB.getFamePath(questId)
            if path:
                pathName = path[0].getName()
                tree = self.trees.get(pathName)
                self.trees[pathName] = self.__makeTree(path, tree)
            else:
                path = QuestLadderDB.getFortunePath(questId)
                if path:
                    pathName = path[0].getName()
                    tree = self.trees.get(pathName)
                    self.trees[pathName] = self.__makeTree(path, tree)
                else:
                    path = [QuestDB.QuestDict.get(questId)]
                    self.trees[questId] = self.__makeTree(path, tree=None)

        treeList = self.orderTrees()
        for tree in treeList:
            self.__makeButtons(self.getCanvas(), tree)

        self.repack()
        return
Esempio n. 2
0
 def update(self, questIdList, quest, newQuest):
     if quest and isinstance(quest, Quest.Quest):
         if newQuest:
             localAvatar.questStatus.assignQuest(quest)
             container = localAvatar.questStatus.getContainer(quest.questId)
             if not container:
                 container = localAvatar.getQuestById(quest.questId)
             
             container.viewedInGUI = False
         
     
     for button in self.buttons:
         button.destroy()
     
     self.buttons = []
     self.trees = { }
     for questId in questIdList:
         path = QuestLadderDB.getFamePath(questId)
         if path:
             pathName = path[0].getName()
             tree = self.trees.get(pathName)
             self.trees[pathName] = self._QuestTitleList__makeTree(path, tree)
             continue
         path = QuestLadderDB.getFortunePath(questId)
         if path:
             pathName = path[0].getName()
             tree = self.trees.get(pathName)
             self.trees[pathName] = self._QuestTitleList__makeTree(path, tree)
             continue
         path = [
             QuestDB.QuestDict.get(questId)]
         self.trees[questId] = self._QuestTitleList__makeTree(path, tree = None)
     
     treeList = self.orderTrees()
     for tree in treeList:
         self._QuestTitleList__makeButtons(self.getCanvas(), tree)
     
     self.repack()
 def hasQuestOffersForLocalAvatar(self):
     av = localAvatar
     inventory = av.getInventory()
     selfId = self.getQuestGiverId()
     if inventory:
         numInProgress = 0
         for quest in inventory.getQuestList():
             questType = self.QuestIconDontCare
             if quest.tasks is None:
                 self.notify.warning('quest %s: does not contain a dna; potential for crash.' % quest.getQuestId())
                 return False
             
             for (task, taskState) in zip(quest.tasks, quest.taskStates):
                 if isinstance(task, QuestTaskDNA.VisitTaskDNA):
                     if task.npcId == selfId:
                         questStatus = self.QuestIconComplete
                         return (questType, questStatus)
                     
                 task.npcId == selfId
             
             if quest.canBeReturnedTo(selfId):
                 isComplete = False
                 if quest.isComplete():
                     container = localAvatar.questStatus.getContainer(quest.getQuestId())
                     if container and container.parent and container.parent.isChoice():
                         isComplete = True
                         for q in container.parent.getContainers():
                             if q.quest and not q.quest.isComplete():
                                 isComplete = False
                                 continue
                         
                     else:
                         isComplete = True
                 
                 if isComplete:
                     questStatus = self.QuestIconComplete
                     return (questType, questStatus)
                 else:
                     numInProgress += 1
         
     else:
         self.notify.warning('avatar does not have inventory yet')
         return False
     offerDict = { }
     fromQuests = []
     prereqExcludes = base.config.GetString('exclude-prereq-quests', '')
     for (questId, questDNA) in QuestDB.QuestDict.items():
         if prereqExcludes and questId in prereqExcludes:
             continue
         
         passed = True
         for prereq in questDNA.prereqs:
             if not prereq.giverCanGive(selfId):
                 passed = False
                 break
             
             if not prereq.avIsReady(localAvatar):
                 passed = False
                 break
             
             if questDNA.minLevel > localAvatar.level:
                 passed = False
                 break
             
             if not base.cr.questDependency.checkDependency(questId, localAvatar.getQuestLadderHistory(), 1):
                 passed = False
                 break
             
             boolWeapLvlCheck = (questDNA.weapLvlType != None) & (questDNA.minWeapLevel > 0)
             if boolWeapLvlCheck & (questDNA.minWeapLevel > getLevelFromTotalReputation(questDNA.weapLvlType, inventory.getReputation(questDNA.weapLvlType))[0]):
                 passed = False
                 break
             
             if questDNA.getAcquireOnce():
                 history = localAvatar.getQuestLadderHistory()
                 questLadderId = base.cr.questDynMap.findQuestLadderInt(questId)
                 containsLadderId = history.count(questLadderId)
                 if containsLadderId:
                     passed = False
                     break
                 
             
             if questDNA.getHoliday() is not None:
                 holidayId = questDNA.getHoliday()
                 if base.cr.newsManager and not base.cr.newsManager.getHoliday(holidayId):
                     passed = False
                     break
                 
             not base.cr.newsManager.getHoliday(holidayId)
         
         if questDNA.prereqs and passed:
             fromQuests.append(questDNA)
             continue
     
     if len(fromQuests):
         inventory = av.getInventory()
         if inventory:
             questsLeft = []
             questList = inventory.getQuestList()
             for questDNA in fromQuests:
                 questId = questDNA.questId
                 if not av.questStatus.hasLadderQuestId(questId):
                     continue
                     if _[1] not in [ x.questId for x in questList ]:
                         questsLeft.append(questDNA)
                         continue
                 []
             
             fromQuests = questsLeft
         
     
     if fromQuests:
         questType = self.QuestIconWork
         for quest in fromQuests:
             if QuestLadderDB.getFamePath(quest.questId):
                 questType = self.QuestIconStory
                 break
                 continue
         
         questStatus = self.QuestIconNew
         return (questType, questStatus)
     
     if numInProgress:
         questStatus = self.QuestIconProgress
         return (questType, questStatus)
     
     return False
    def presentQuestOffer(self, offers, ladder = False):
        if self.questMenuGUI:
            DistributedQuestGiver.notify.warning('setQuestOffer: old questMenu GUI still around')
            self.cleanUpQuestMenu()
        
        self.cleanUpQuestDetails()
        
        def handleSelection(offer, self = self, offers = offers):
            self.cleanUpQuestMenu()
            if offer == QuestConstants.CANCEL_QUEST:
                index = QuestConstants.CANCEL_QUEST
            else:
                index = offers.index(offer)
            self.sendOfferResponse(index, ladder)

        
        def handleOption(option, offer):
            base.test = self
            self.ignore('lastSubtitlePage')
            self.adjustNPCCamera('back')
            if option == PLocalizer.Accept:
                handleSelection(offer)
            elif self.questMenuGUI:
                self.questMenuGUI.show()
            
            self.cleanUpQuestDetails(hide = True)

        
        def displayQuestDetails(offer):
            self.questDetailGUI = QuestDetailGUI(offer, None)
            self.questDetailGUI.showPanel()
            base.questdet = self.questDetailGUI

        
        def displayBranchDetails(offer):
            self.selectedOffer = offer
            self.cleanUpQuestDetails()
            self.questDetailGUI = QuestDetailGUI(offer, None)
            self.questDetailGUI.showPanel()
            base.questdet = self.questDetailGUI

        
        def displayBranchOptions(offer, callback, descCallback):
            self.branchMenuGUI = BranchMenuGUI.BranchMenuGUI(offer, callback, descCallback)

        
        def handleBranchOption(option):
            if option == PLocalizer.Accept:
                if self.selectedOffer:
                    self.sendOfferResponse(0, ladder, self.selectedOffer)
                
            
            self.adjustNPCCamera('back')
            self.cleanUpQuestDetails(hide = True)
            self.cleanUpBranchMenu()
            if self.questMenuGUI:
                self.questMenuGUI.show()
            

        
        def describeQuest(offer):
            self.adjustNPCCamera('forward')
            questDNA = offer.getQuestDNA()
            if questDNA:
                if isinstance(offer, QuestOffer.QuestTimerResetOffer):
                    self.requestQuestReset(offer.getQuestId())
                    return None
                elif isinstance(offer, QuestOffer.QuestBranchResetOffer):
                    self.requestBranchReset(offer.getQuestId())
                    return None
                
                questStr = questDNA.getStringBefore()
                if questDNA.isBranch():
                    self.acceptOnce('lastSubtitlePage', displayBranchOptions, [
                        offer,
                        None,
                        displayBranchDetails])
                    localAvatar.guiMgr.subtitler.setPageChat(questStr, options = [
                        PLocalizer.Decline,
                        PLocalizer.Accept], callback = handleBranchOption)
                else:
                    self.acceptOnce('lastSubtitlePage', displayQuestDetails, [
                        offer])
                    localAvatar.guiMgr.subtitler.setPageChat(questStr, options = [
                        PLocalizer.Decline,
                        PLocalizer.Accept], callback = handleOption, extraArgs = [
                        offer])
            

        
        def questFull(arg):
            self.cleanUpQuestMenu()
            self.sendOfferResponse(QuestConstants.CANCEL_QUEST, ladder)

        inv = base.localAvatar.getInventory()
        numWorkQuests = 0
        if inv:
            questList = inv.getQuestList()
            for questId in questList:
                if not QuestLadderDB.getFamePath(questId):
                    numWorkQuests += 1
                    continue
            
        
        hasStoryQuest = False
        for offer in offers:
            if QuestLadderDB.getFamePath(offer.getQuestId()):
                hasStoryQuest = True
                continue
        
        if not hasStoryQuest and numWorkQuests > QuestConstants.MAXIMUM_MERC_WORK:
            self.questMenuGUI = PDialog.PDialog(text = PLocalizer.QuestFull, style = OTPDialog.Acknowledge, command = questFull)
        else:
            self.questMenuGUI = QuestMenuGUI.QuestMenuGUI(offers, handleSelection, describeQuest)
        localAvatar.currentStoryQuests = []
        self.clearOffer()
    def hasQuestOffersForLocalAvatar(self):
        av = localAvatar
        inventory = av.getInventory()
        selfId = self.getQuestGiverId()
        if inventory:
            numInProgress = 0
            for quest in inventory.getQuestList():
                questType = self.QuestIconDontCare
                if quest.tasks is None:
                    self.notify.warning('quest %s: does not contain a dna; potential for crash.' % quest.getQuestId())
                    return False

                for (task, taskState) in zip(quest.tasks, quest.taskStates):
                    if isinstance(task, QuestTaskDNA.VisitTaskDNA):
                        if task.npcId == selfId:
                            questStatus = self.QuestIconComplete
                            return (questType, questStatus)

                    task.npcId == selfId

                if quest.canBeReturnedTo(selfId):
                    isComplete = False
                    if quest.isComplete():
                        container = localAvatar.questStatus.getContainer(quest.getQuestId())
                        if container and container.parent and container.parent.isChoice():
                            isComplete = True
                            for q in container.parent.getContainers():
                                if q.quest and not q.quest.isComplete():
                                    isComplete = False
                                    continue

                        else:
                            isComplete = True

                    if isComplete:
                        questStatus = self.QuestIconComplete
                        return (questType, questStatus)
                    else:
                        numInProgress += 1

        else:
            self.notify.warning('avatar does not have inventory yet')
            return False
        offerDict = { }
        fromQuests = []
        prereqExcludes = base.config.GetString('exclude-prereq-quests', '')
        for (questId, questDNA) in QuestDB.QuestDict.items():
            if prereqExcludes and questId in prereqExcludes:
                continue

            passed = True
            for prereq in questDNA.prereqs:
                if not prereq.giverCanGive(selfId):
                    passed = False
                    break

                if not prereq.avIsReady(localAvatar):
                    passed = False
                    break

                if questDNA.minLevel > localAvatar.level:
                    passed = False
                    break

                if not base.cr.questDependency.checkDependency(questId, localAvatar.getQuestLadderHistory(), 1):
                    passed = False
                    break

                boolWeapLvlCheck = (questDNA.weapLvlType != None) & (questDNA.minWeapLevel > 0)
                if boolWeapLvlCheck & (questDNA.minWeapLevel > getLevelFromTotalReputation(questDNA.weapLvlType, inventory.getReputation(questDNA.weapLvlType))[0]):
                    passed = False
                    break

                if questDNA.getAcquireOnce():
                    history = localAvatar.getQuestLadderHistory()
                    questLadderId = base.cr.questDynMap.findQuestLadderInt(questId)
                    containsLadderId = history.count(questLadderId)
                    if containsLadderId:
                        passed = False
                        break


                if questDNA.getHoliday() is not None:
                    holidayId = questDNA.getHoliday()
                    if base.cr.newsManager and not base.cr.newsManager.getHoliday(holidayId):
                        passed = False
                        break

                not base.cr.newsManager.getHoliday(holidayId)

            if questDNA.prereqs and passed:
                fromQuests.append(questDNA)
                continue

        if len(fromQuests):
            inventory = av.getInventory()
            if inventory:
                questsLeft = []
                questList = inventory.getQuestList()
                for questDNA in fromQuests:
                    questId = questDNA.questId
                    if not av.questStatus.hasLadderQuestId(questId):
                        continue
                        if _[1] not in [ x.questId for x in questList ]:
                            questsLeft.append(questDNA)
                            continue
                    []

                fromQuests = questsLeft


        if fromQuests:
            questType = self.QuestIconWork
            for quest in fromQuests:
                if QuestLadderDB.getFamePath(quest.questId):
                    questType = self.QuestIconStory
                    break
                    continue

            questStatus = self.QuestIconNew
            return (questType, questStatus)

        if numInProgress:
            questStatus = self.QuestIconProgress
            return (questType, questStatus)

        return False
    def presentQuestOffer(self, offers, ladder = False):
        if self.questMenuGUI:
            DistributedQuestGiver.notify.warning('setQuestOffer: old questMenu GUI still around')
            self.cleanUpQuestMenu()

        self.cleanUpQuestDetails()

        def handleSelection(offer, self = self, offers = offers):
            self.cleanUpQuestMenu()
            if offer == QuestConstants.CANCEL_QUEST:
                index = QuestConstants.CANCEL_QUEST
            else:
                index = offers.index(offer)
            self.sendOfferResponse(index, ladder)


        def handleOption(option, offer):
            base.test = self
            self.ignore('lastSubtitlePage')
            self.adjustNPCCamera('back')
            if option == PLocalizer.Accept:
                handleSelection(offer)
            elif self.questMenuGUI:
                self.questMenuGUI.show()

            self.cleanUpQuestDetails(hide = True)


        def displayQuestDetails(offer):
            self.questDetailGUI = QuestDetailGUI(offer, None)
            self.questDetailGUI.showPanel()
            base.questdet = self.questDetailGUI


        def displayBranchDetails(offer):
            self.selectedOffer = offer
            self.cleanUpQuestDetails()
            self.questDetailGUI = QuestDetailGUI(offer, None)
            self.questDetailGUI.showPanel()
            base.questdet = self.questDetailGUI


        def displayBranchOptions(offer, callback, descCallback):
            self.branchMenuGUI = BranchMenuGUI.BranchMenuGUI(offer, callback, descCallback)


        def handleBranchOption(option):
            if option == PLocalizer.Accept:
                if self.selectedOffer:
                    self.sendOfferResponse(0, ladder, self.selectedOffer)


            self.adjustNPCCamera('back')
            self.cleanUpQuestDetails(hide = True)
            self.cleanUpBranchMenu()
            if self.questMenuGUI:
                self.questMenuGUI.show()



        def describeQuest(offer):
            self.adjustNPCCamera('forward')
            questDNA = offer.getQuestDNA()
            if questDNA:
                if isinstance(offer, QuestOffer.QuestTimerResetOffer):
                    self.requestQuestReset(offer.getQuestId())
                    return None
                elif isinstance(offer, QuestOffer.QuestBranchResetOffer):
                    self.requestBranchReset(offer.getQuestId())
                    return None

                questStr = questDNA.getStringBefore()
                if questDNA.isBranch():
                    self.acceptOnce('lastSubtitlePage', displayBranchOptions, [
                        offer,
                        None,
                        displayBranchDetails])
                    localAvatar.guiMgr.subtitler.setPageChat(questStr, options = [
                        PLocalizer.Decline,
                        PLocalizer.Accept], callback = handleBranchOption)
                else:
                    self.acceptOnce('lastSubtitlePage', displayQuestDetails, [
                        offer])
                    localAvatar.guiMgr.subtitler.setPageChat(questStr, options = [
                        PLocalizer.Decline,
                        PLocalizer.Accept], callback = handleOption, extraArgs = [
                        offer])



        def questFull(arg):
            self.cleanUpQuestMenu()
            self.sendOfferResponse(QuestConstants.CANCEL_QUEST, ladder)

        inv = base.localAvatar.getInventory()
        numWorkQuests = 0
        if inv:
            questList = inv.getQuestList()
            for questId in questList:
                if not QuestLadderDB.getFamePath(questId):
                    numWorkQuests += 1
                    continue


        hasStoryQuest = False
        for offer in offers:
            if QuestLadderDB.getFamePath(offer.getQuestId()):
                hasStoryQuest = True
                continue

        if not hasStoryQuest and numWorkQuests > QuestConstants.MAXIMUM_MERC_WORK:
            self.questMenuGUI = PDialog.PDialog(text = PLocalizer.QuestFull, style = OTPDialog.Acknowledge, command = questFull)
        else:
            self.questMenuGUI = QuestMenuGUI.QuestMenuGUI(offers, handleSelection, describeQuest)
        localAvatar.currentStoryQuests = []
        self.clearOffer()