def recoverItems(self, av, suitsKilled, taskZoneId):
        # Get the avatars current quests.
        avQuests = av.getQuests()
        questList = []
        recoveredItems = []
        unrecoveredItems = []
        taskZoneId = ZoneUtil.getBranchZone(taskZoneId)

        # Iterate through the avatars current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])
            if questClass.getCompletionStatus(av, questDesc) == Quests.INCOMPLETE:
                if isinstance(questClass, Quests.CogQuest):
                    for suit in suitsKilled:
                        if questClass.doesCogCount(av.doId, suit, taskZoneId, suit['activeToons']):
                            questDesc[QuestProgressIndex] += 1
                elif isinstance(questClass, Quests.RecoverItemQuest):
                    if questClass.getHolder() != Quests.AnyFish:
                        for suit in suitsKilled:
                            if questClass.doesCogCount(av.doId, suit, taskZoneId, suit['activeToons']):
                                baseChance = questClass.getPercentChance()
                                amountRemaining = questClass.getNumItems() - questDesc[QuestProgressIndex]
                                chance = Quests.calcRecoverChance(amountRemaining, baseChance)
                                if chance >= baseChance:
                                    questDesc[QuestProgressIndex] += 1
                                    recoveredItems.append(questClass.getItem())
                                else:
                                    unrecoveredItems.append(questClass.getItem())
            questList.append(questDesc)

        av.b_setQuests(questList)
        return (recoveredItems, unrecoveredItems)
 def trolleyLeft(self):
     numPlayers = self.countFullSeats()
     if numPlayers > 0:
         newbieIds = []
         for avId in self.seats:
             if avId:
                 toon = self.air.doId2do.get(avId)
                 if toon:
                     if Quests.avatarHasTrolleyQuest(toon):
                         if not Quests.avatarHasCompletedTrolleyQuest(toon):
                             newbieIds.append(avId)
         playerArray = []
         for i in self.seats:
             if i not in [None, 0]:
                 playerArray.append(i)
         mgDict = MinigameCreatorAI.createMinigame(
             self.air, playerArray, self.zoneId, newbieIds=newbieIds)
         minigameZone = mgDict['minigameZone']
         minigameId = mgDict['minigameId']
         for seatIndex in xrange(len(self.seats)):
             avId = self.seats[seatIndex]
             if avId:
                 self.sendUpdateToAvatarId(avId, 'setMinigameZone', [minigameZone, minigameId])
                 self.clearFullNow(seatIndex)
     else:
         self.notify.warning('The trolley left, but was empty.')
     self.enter()
    def toonCaughtFishingItem(self, av):
        # Get the avatars current quests.
        avQuests = av.getQuests()
        fishingItem = -1
        questList = []

        # Iterate through their current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])
            if fishingItem != -1:
                questList.append(questDesc)
                continue
            if isinstance(questClass, Quests.RecoverItemQuest):
                if not hasattr(questClass, 'getItem'):
                    questList.append(questDesc)
                    continue
                if questClass.getHolder() == Quests.AnyFish:
                    if not questClass.getCompletionStatus(av, questDesc) == Quests.COMPLETE:
                        baseChance = questClass.getPercentChance()
                        amountRemaining = questClass.getNumItems() - questDesc[QuestProgressIndex]
                        chance = Quests.calcRecoverChance(amountRemaining, baseChance)
                        if chance >= baseChance:
                            questDesc[QuestProgressIndex] += 1
                            fishingItem = questClass.getItem()
            questList.append(questDesc)

        av.b_setQuests(questList)
        return fishingItem
Exemple #4
0
    def initQuestFrame(self, toon, avQuests):
        self.endTrackFrame.hide()
        self.gagExpFrame.hide()
        self.newGagFrame.hide()
        self.promotionFrame.hide()
        self.questFrame.show()
        self.itemFrame.hide()
        self.cogPartFrame.hide()
        self.missedItemFrame.hide()
        for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
            questLabel = self.questLabelList[i]
            questLabel['text_fg'] = (0, 0, 0, 1)
            questLabel.hide()

        for i in xrange(len(avQuests)):
            questDesc = avQuests[i]
            questId, npcId, toNpcId, rewardId, toonProgress = questDesc
            quest = Quests.getQuest(questId)
            if quest:
                questString = quest.getString()
                progressString = quest.getProgressString(toon, questDesc)
                rewardString = quest.getRewardString(progressString)
                rewardString = Quests.fillInQuestNames(rewardString, toNpcId=toNpcId)
                completed = quest.getCompletionStatus(toon, questDesc) == Quests.COMPLETE
                questLabel = self.questLabelList[i]
                questLabel.show()
                if base.localAvatar.tutorialAck:
                    questLabel['text'] = rewardString
                    if completed:
                        questLabel['text_fg'] = (0, 0.3, 0, 1)
                else:
                    questLabel['text'] = questString + ' :'
 def avatarChoseQuest(self, avId, npc, questId, rewardId, building):
     toon = self.air.doId2do.get(avId)
     if not toon:
         return
     fromNpc = Quests.getQuestFromNpcId(questId)
     toNpc = Quests.getQuestToNpcId(questId)
     toon.addQuest([questId, fromNpc, toNpc, rewardId, 0], 0,
                     recordHistory = 0)
     npc.assignQuest(avId, questId, rewardId, toNpc)
     taskMgr.remove(npc.uniqueName('clearMovie'))
 def requestInteract(self, avId, npc):
     toon = self.air.doId2do.get(avId)
     if not toon:
         return
     toonQuestPocketSize = toon.getQuestCarryLimit()
     self.avatarProgressTier(toon)
     toonQuests = toon.getQuests()
     for i in xrange(0, len(toonQuests), 5):
         questDesc = toonQuests[i:i + 5]
         questId, fromNpcId, toNpcId, rewardId, toonProgress = questDesc
         questClass = Quests.getQuest(questId)
         if questClass:
             completeStatus = questClass.getCompletionStatus(toon, questDesc, npc)
         else:
             continue
         if completeStatus == Quests.COMPLETE:
             print 'QuestManager: %s (AvId: %s) Completed QuestId: %s'%(toon.getName(), toon.doId, questId)
             toon.toonUp(toon.maxHp)
             if isinstance(questClass, Quests.TrackChoiceQuest):
                 npc.presentTrackChoice(avId, questId, questClass.getChoices())
                 break
             elif Quests.getNextQuest(questId, npc, toon)[0] != Quests.NA:
                 self.nextQuest(toon, npc, questId)
             else:
                 npc.completeQuest(avId, questId, rewardId)
                 self.completeQuest(toon, questId)
             if isinstance(npc, DistributedNPCSpecialQuestGiverAI):
                 if npc.tutorial and (npc.npcId == 20002):
                     messenger.send('intHqDoor0-{0}'.format(npc.zoneId), [FADoorCodes.WRONG_DOOR_HQ])
                     messenger.send('intHqDoor1-{0}'.format(npc.zoneId), [FADoorCodes.UNLOCKED])
                     streetZone = self.air.tutorialManager.currentAllocatedZones[avId][0]
                     messenger.send('extHqDoor0-{0}'.format(streetZone), [FADoorCodes.GO_TO_PLAYGROUND])
                     messenger.send('extHqDoor1-{0}'.format(streetZone), [FADoorCodes.GO_TO_PLAYGROUND])
                     messenger.send('extShopDoor-{0}'.format(streetZone), [FADoorCodes.GO_TO_PLAYGROUND])
             break
     else:
         if (len(toonQuests) == toonQuestPocketSize*5):
             npc.rejectAvatar(avId)
             return
         elif isinstance(npc, DistributedNPCSpecialQuestGiverAI):
             choices = self.avatarQuestChoice(toon, npc)
             quest = choices[0]
             self.avatarChoseQuest(avId, npc, quest[0], quest[1], 0)
             if npc.tutorial:
                 if npc.npcId == 20000:
                     messenger.send('intShopDoor-{0}'.format(npc.zoneId), [FADoorCodes.UNLOCKED])
             return
         else:
             choices = self.avatarQuestChoice(toon, npc)
             if choices != []:
                 npc.presentQuestChoice(avId, choices)
                 return
             else:
                 npc.rejectAvatar(avId)
                 return
 def requestSkipTutorial(self):
     avId = self.air.getAvatarIdFromSender()
     av = self.air.doId2do.get(avId)
     if av:
         av.b_setTutorialAck(1)
         av.b_setQuestHistory([110, 100])
         av.addQuest((110, Quests.getQuestFromNpcId(110), Quests.getQuestToNpcId(110), Quests.getQuestReward(110, av), 0), 0)
         self.air.questManager.toonRodeTrolleyFirstTime(av) #gg hacky
         self.d_skipTutorialResponse(avId, 1)
     else:
         self.d_skipTutorialResponse(avId, 0)
 def giveReward(self, toon, questId, rewardId):
     #Actual reward giving.
     rewardClass = Quests.getReward(rewardId)
     rewardClass.sendRewardAI(toon)
     #Add it to reward history.
     realRewardId = Quests.transformReward(rewardId, toon)
     tier, rewardList = toon.getRewardHistory()
     rewardList.append(rewardId)
     if realRewardId != rewardId:
         rewardList.append(realRewardId)
     toon.b_setRewardHistory(tier, rewardList)
    def recoverItems(self, av, suitsKilled, taskZoneId):
        # Get the avatars current quests.
        avQuests = av.getQuests()
        questList = []
        recoveredItems = []
        unrecoveredItems = []
        taskZoneId = ZoneUtil.getBranchZone(taskZoneId)

        # Iterate through the avatars current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])

            # Check if the Quest isnt already complete
            if questClass.getCompletionStatus(av, questDesc) == Quests.INCOMPLETE:

                # Check if we are dealing with a RecoverItemQuest
                if isinstance(questClass, Quests.RecoverItemQuest):

                    # Iterate through all the Cogs that were killed in the battle
                    for suit in suitsKilled:

                        # Because the RecoveItemQuest class doesn't have a
                        # function to see if a Cog counts. We need to manually
                        # check if the Cog is valid for the Quest
                        if (questClass.getHolder() == Quests.Any) or \
                            (questClass.getHolderType() == 'type' and \
                            questClass.getHolder() == suit['type']) or \
                            (questClass.getHolderType() == 'track' and \
                            questClass.getHolder() == suit['track']) or \
                            (questClass.getHolderType() == 'level' and \
                            questClass.getHolder() <= suit['level']):

                            # It looks like the Cog was valid. Lets see if they
                            # found what they were looking for.
                            baseChance = questClass.getPercentChance()
                            amountRemaining = questClass.getNumItems() - questDesc[QuestProgressIndex]
                            chance = Quests.calcRecoverChance(amountRemaining, baseChance)

                            # They found it! Give them their reward!
                            if chance >= baseChance:
                                questDesc[QuestProgressIndex] += 1
                                recoveredItems.append(questClass.getItem())

                            # Better luck next time :(
                            else:
                                unrecoveredItems.append(questClass.getItem())

            questList.append(questDesc)

        av.b_setQuests(questList)

        return (recoveredItems, unrecoveredItems)
    def __applyReward(self, av, questId, rewardId):
        Quests.getReward(rewardId).sendRewardAI(av)

        transId = Quests.transformReward(rewardId, av)
        
        tier, rewardList = av.getRewardHistory()
        
        rewardList.append(rewardId)
        if transId != rewardId:
            rewardList.append(transId)
            
        av.b_setRewardHistory(tier, rewardList)
 def requestInteract(self, avId, npc):
     av = self.air.doId2do.get(avId)
     if not av:
         self.notify.warning("Got requestInteract with unknown avId: %s" % avId)
         return
                     
     # check if the avatar wants to turn in a quest
     quests = av.getQuests()
     for i in xrange(0, len(quests), 5):
         quest = quests[i:i + 5]
         klass = Quests.getQuest(quest[0])
         
         if not klass:
             self.notify.debug('Quest %s has no class.' % quest[0])
             continue
             
         if klass.getCompletionStatus(av, quest, npc) == Quests.COMPLETE:
             # complete quest, the avatar is turning it in
             self.notify.debug("Toon %s completed quest %s" % (av.doId, quest[0]))
             
             # fill the laff
             av.toonUp(av.maxHp)
             
             if isinstance(klass, Quests.TrackChoiceQuest):
                 npc.presentTrackChoice(avId, quest[0], klass.getChoices())
                 return 1
                 
             nextQuest = Quests.getNextQuest(quest[0], npc, av)
             if nextQuest[0] != Quests.NA:
                 self.__goToNextQuest(av, npc, quest[0], nextQuest)
                 
             else:
                 npc.completeQuest(avId, quest[0], quest[-2])
                 self.__questCompleted(av, quest[0])
                 
             return 1
             
     if self.__considerProgressTier(av):
         npc.rejectAvatarTierNotDone(avId)
         return 0
             
     # give choices if the av doesn't have enough quests already
     if len(quests) / 5 < av.getQuestCarryLimit():
         choices = Quests.chooseBestQuests(av.getRewardTier(), npc, av)
         if choices:
             npc.presentQuestChoice(avId, choices)
             return 1
     
     return 0
    def giveReward(self, av, questId, rewardId):
        # Give the reward.
        rewardClass = Quests.getReward(rewardId)
        if rewardClass is None:
            self.notify.warning('rewardClass was None for rewardId: %s.' % rewardId)
        else:
            rewardClass.sendRewardAI(av)

        # Add the rewardId to the avatars rewardHistory.
        rewardTier, rewardHistory = av.getRewardHistory()
        transformedRewardId = Quests.transformReward(rewardId, av)
        if transformedRewardId != rewardId:
            rewardHistory.append(rewardId)

        av.b_setRewardHistory(rewardTier, rewardHistory)
    def toonKilledCogs(self, av, suitsKilled, zoneId):
        # Get the avatar's current quests.
        messenger.send("topToonsManager-event", [av.doId, TopToonsGlobals.CAT_COGS, len(suitsKilled)])
        avQuests = av.getQuests()
        questList = []

        # Iterate through the avatar's current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])

            # Check if they are doing a cog quest
            if isinstance(questClass, Quests.CogQuest):
                # Check if the cog counts...
                for suit in suitsKilled:
                    if questClass.doesCogCount(av.doId, suit, zoneId):
                        # Looks like the cog counts!
                        if questClass.getCompletionStatus(av, questDesc) != Quests.COMPLETE:
                            questDesc[QuestProgressIndex] += 1

            # Add the quest to the questList
            questList.append(questDesc)

        # Update the avatar's quests
        av.b_setQuests(questList)
 def toonKilledCogs(self, av, suits, zoneId, activeToons):
     if self.air.topToonsMgr:
         self.air.topToonsMgr.toonKilledCogs(av, suits)
         
     quests = av.getQuests()
     newQuests = []
     
     for i in xrange(0, len(quests), 5):
         quest = quests[i:i + 5]
         klass = Quests.getQuest(quest[0])
         
         if not klass:
             continue
                         
         if isinstance(klass, Quests.CogQuest):
             for suit in suits:
                 if klass.getCompletionStatus(av, quest) == Quests.COMPLETE:
                     break
                     
                 if klass.doesCogCount(av.doId, suit, zoneId, suit['activeToons']):
                     quest[4] += 1
         
         newQuests.append(quest)
         
     av.b_setQuests(newQuests)
 def enter(self):
     doneStatus = {}
     questHistory = base.localAvatar.getQuestHistory()
     imgScale = 0.5
     if questHistory != [] and questHistory != [1000] and questHistory != [101, 110]:
         doneStatus['mode'] = 'complete'
         messenger.send(self.doneEvent, [doneStatus])
     elif len(base.localAvatar.quests) > 1 or len(base.localAvatar.quests) == 0:
         doneStatus['mode'] = 'complete'
         messenger.send(self.doneEvent, [doneStatus])
     elif base.localAvatar.quests[0][0] != Quests.TROLLEY_QUEST_ID:
         doneStatus['mode'] = 'complete'
         messenger.send(self.doneEvent, [doneStatus])
     else:
         base.localAvatar.b_setAnimState('neutral', 1)
         doneStatus['mode'] = 'incomplete'
         self.doneStatus = doneStatus
         imageModel = loader.loadModel('phase_4/models/gui/tfa_images')
         if Quests.avatarHasTrolleyQuest(base.localAvatar):
             if base.localAvatar.quests[0][4] != 0:
                 imgNodePath = imageModel.find('**/hq-dialog-image')
                 imgPos = (0, 0, -0.02)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage2
             else:
                 imgNodePath = imageModel.find('**/trolley-dialog-image')
                 imgPos = (0, 0, 0.04)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage
         self.dialog = TTDialog.TTDialog(text=msg, command=self.handleOk, style=TTDialog.Acknowledge)
         imgLabel = DirectLabel.DirectLabel(parent=self.dialog, relief=None, pos=imgPos, scale=TTLocalizer.NPCFimgLabel, image=imgNodePath, image_scale=imgScale)
     return
    def updateQuestInfo(self):
        for marker in self.buildingMarkers:
            marker.destroy()

        self.buildingMarkers = []
        dnaData = base.cr.playGame.dnaData
        for questIndex in self.av.questPage.quests.keys():
            questDesc = self.av.questPage.quests.get(questIndex)
            if questDesc is None:
                continue
            mapIndex = questIndex + 1
            questId, fromNpcId, toNpcId, rewardId, toonProgress = questDesc
            quest = Quests.getQuest(questId)
            fComplete = quest.getCompletionStatus(self.av, questDesc) == Quests.COMPLETE
            if not fComplete:
                if quest.getType() == Quests.RecoverItemQuest:
                    if quest.getHolder() == Quests.AnyFish:
                        self.putBuildingMarker(self.fishingSpotInfo, mapIndex=mapIndex)
                    continue
                elif quest.getType() != Quests.DeliverGagQuest and quest.getType() != Quests.DeliverItemQuest and quest.getType() != Quests.VisitQuest and quest.getType() != Quests.TrackChoiceQuest:
                    continue
            if toNpcId == Quests.ToonHQ:
                self.putBuildingMarker(self.hqPosInfo, mapIndex=mapIndex)
            else:
                npcZone = NPCToons.getNPCZone(toNpcId)
                hoodId = ZoneUtil.getCanonicalHoodId(npcZone)
                branchId = ZoneUtil.getCanonicalBranchZone(npcZone)
                if self.hoodId == hoodId and self.zoneId == branchId:
                    for blockId, block in dnaData.getBlocks():
                        zone = block.zone
                        branchZone = zone - zone % 100
                        finalZone = branchZone + 500 + blockId
                        if npcZone == finalZone:
                            building = block.node
                            self.putBuildingMarker(Point3(building.getPos()), building.getHpr(), mapIndex=mapIndex)
    def isNewbie(self, avId):
        # Does avId have the "ride the Trolley" quest?
        toon = self.air.doId2do.get(avId)
        if not toon:
            return False

        return Quests.avatarHasTrolleyQuest(toon)
 def recoverItems(self, toon, suitsKilled, taskZoneId):
     flattenedQuests = toon.getQuests()
     questList = [] #unflattened
     recoveredItems = []
     unrecoveredItems = []
     taskZoneId = ZoneUtil.getBranchZone(taskZoneId)
     for i in xrange(0, len(flattenedQuests), 5):
         questDesc = flattenedQuests[i : i + 5]
         questClass = Quests.getQuest(questDesc[0])
         if questClass.getCompletionStatus(toon, questDesc) == Quests.INCOMPLETE:
             if isinstance(questClass, Quests.CogQuest):
                 for suit in suitsKilled:
                     if questClass.doesCogCount(toon.doId, suit, taskZoneId, suit['activeToons']):
                         questDesc[4] += 1
             elif isinstance(questClass, Quests.RecoverItemQuest):
                 if questClass.getHolder() != Quests.AnyFish:
                     for suit in suitsKilled:
                         if questClass.doesCogCount(toon.doId, suit, taskZoneId, suit['activeToons']):
                             minchance = questClass.getPercentChance()
                             import random
                             chance = random.randint(minchance - 40, 100)
                             if chance <= minchance:
                                 questDesc[4] += 1
                                 recoveredItems.append(questClass.getItem())
                             else:
                                 unrecoveredItems.append(questClass.getItem())
         questList.append(questDesc)
     toon.b_setQuests(questList)
     return (recoveredItems, unrecoveredItems)
    def __tasksChanged(self):
        self.clearMenu()
        try:
            lt = base.localAvatar
        except:
            return

        phrases = []

        def addTerminal(terminal, self=self, phrases=phrases):
            displayText = terminal.getDisplayText()
            if displayText not in phrases:
                self.append(terminal)
                phrases.append(displayText)

        for task in lt.quests:
            taskId, fromNpcId, toNpcId, rewardId, toonProgress = task
            q = Quests.getQuest(taskId)
            if q is None:
                continue
            msgs = q.getSCStrings(toNpcId, toonProgress)
            if type(msgs) != type([]):
                msgs = [msgs]
            for i in xrange(len(msgs)):
                addTerminal(TTSCToontaskTerminal(msgs[i], taskId, toNpcId, toonProgress, i))

        needToontask = 1
        if hasattr(lt, "questCarryLimit"):
            needToontask = len(lt.quests) != lt.questCarryLimit
        if needToontask:
            addTerminal(SCStaticTextTerminal(1299))
        return
    def toonKilledCogs(self, av, suitsKilled, zoneId, activeToonList):
         # Get the avatar's current quests.
        avQuests = av.getQuests()
        questList = []

        # Make a list of the activeToonDoIds
        activeToonDoIds = [toon.doId for toon in activeToonList if not None]

        # Iterate through the avatar's current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex], av.doId)

            # Check if they are doing a cog quest
            if isinstance(questClass, Quests.CogQuest):

                # Check if the cog counts...
                for suit in suitsKilled:
                    if questClass.doesCogCount(av.doId, suit, zoneId, activeToonDoIds):

                        # Looks like the cog counts!
                        if questClass.getCompletionStatus(av, questDesc) != Quests.COMPLETE:
                            questDesc[QuestProgressIndex] += 1

            # Add the quest to the questList
            questList.append(questDesc)

        # Update the avatar's quests
        av.b_setQuests(questList)
 def __showQuestItem(self, itemId):
     self.__makeGui()
     itemName = Quests.getItemName(itemId)
     self.itemLabel['text'] = itemName
     self.itemGui.reparentTo(aspect2d)
     self.itemPackage.show()
     self.itemJellybean.hide()
     self.itemBoot.hide()
Exemple #22
0
    def getMissedItemIntervalList(self, toon, missedItemList):
        intervalList = []
        for itemId in missedItemList:
            itemName = Quests.getItemName(itemId)
            intervalList.append(Func(self.missedItemLabel.setProp, 'text', itemName))
            intervalList.append(Wait(1))

        return intervalList
 def avatarQuestChoice(self, toon, npc):
     tasks = Quests.chooseBestQuests(toon.getRewardTier(), npc, toon)
     #Does the avatar already have any of these rewardIds?
     #[QuestId, RewardId, toNPCID]
     toonQuests = toon.getQuests() #Flattened Quests.
     rewardList = [] #Unflattened Quests.
     for i in xrange(0, len(toonQuests), 5):
         questDesc = toonQuests[i:i + 5]
         rewardList.append(questDesc[3])
     for task in tasks:
         if task[1] in rewardList:
             tier = toon.getRewardHistory()[0]
             rewards = Quests.getOptionalRewardsInTier(tier)
             if rewards:
                 rewardId = random.choice(Quests.getOptionalRewardsInTier(tier))
                 task[1] = rewardId
     return tasks
    def getItemIntervalList(self, toon, itemList):
        intervalList = []
        for itemId in itemList:
            itemName = Quests.getItemName(itemId)
            intervalList.append(Func(self.itemLabel.setProp, "text", itemName))
            intervalList.append(Wait(1))

        return intervalList
 def avatarChoseTrack(self, avId, npc, pendingTrackQuest, trackId):
     toon = self.air.doId2do.get(avId)
     if not toon:
         return
     npc.completeQuest(avId, pendingTrackQuest, Quests.getRewardIdFromTrackId(trackId))
     self.completeQuest(toon, pendingTrackQuest)
     toon.removeQuest(pendingTrackQuest)
     toon.b_setTrackProgress(trackId, 0)
 def avatarChoseTrack(self, avId, npc, quest, track):
     av = self.air.doId2do.get(avId)
     if not av:
         return
         
     av.b_setTrackProgress(track, 0)
             
     npc.completeQuest(avId, quest, Quests.getRewardIdFromTrackId(track))
     av.removeQuest(quest)
    def avatarConsiderProgressTier(self, av):
        # Get the avatars current tier.
        currentTier = av.getRewardTier()

        # Check if they have all required rewards.
        if Quests.avatarHasAllRequiredRewards(av, currentTier):
            if currentTier != Quests.ELDER_TIER:
                currentTier += 1
            av.b_setRewardHistory(currentTier, [])
 def hasTailorClothingTicket(self, toon, npc):
     flattenedQuests = toon.getQuests()
     for i in xrange(0, len(flattenedQuests), 5):
         questDesc = flattenedQuests[i : i + 5]
         questClass = Quests.getQuest(questDesc[0])
         if isinstance(questClass, Quests.DeliverItemQuest):
             if questClass.getCompletionStatus(toon, questDesc, npc) == Quests.COMPLETE:
                 return 1
     return 0
 def removeClothingTicket(self, toon, npc):
     flattenedQuests = toon.getQuests()
     questList = []
     for i in xrange(0, len(flattenedQuests), 5):
         questDesc = flattenedQuests[i : i + 5]
         questClass = Quests.getQuest(questDesc[0])
         if isinstance(questClass, Quests.DeliverItemQuest):
             if questClass.getCompletionStatus(toon, questDesc, npc) == Quests.COMPLETE:
                 toon.removeQuest(questDesc[0])
                 break
 def avatarChoseQuest(self, avId, npc, questId, reward, _):
     av = self.air.doId2do.get(avId)
     if not av:
         return
         
     fromNpc = Quests.getQuestFromNpcId(questId)
     toNpc = Quests.getQuestToNpcId(questId)
     
     if reward in (110, 1000):
         toNpc = Quests.ToonTailor
     
     npc.assignQuest(avId, questId, reward, toNpc)
     
     progress = 0
     quest = [questId, fromNpc, toNpc, reward, progress]
     
     av.addQuest(quest, reward, True)
     
     taskMgr.remove(npc.uniqueName('clearMovie'))
Exemple #31
0
    def recoverItems(self, av, suits, zoneId):
        zoneId = ZoneUtil.getBranchZone(zoneId)

        quests = av.getQuests()
        newQuests = []

        recovered = []
        unrecovered = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if klass.getCompletionStatus(av, quest) == Quests.INCOMPLETE:
                if isinstance(klass, Quests.RecoverItemQuest):
                    if klass.getHolder() != Quests.AnyFish:
                        item = klass.getItem()

                        for suit in suits:
                            if klass.getCompletionStatus(
                                    av, quest) == Quests.COMPLETE:
                                break

                            if klass.doesCogCount(av.doId, suit, zoneId,
                                                  suit['activeToons']):
                                if random.random(
                                ) <= klass.getPercentChance() / 100.0:
                                    quest[4] += 1
                                    recovered.append(item)

                                else:
                                    unrecovered.append(item)

                            else:
                                self.notify.debug(
                                    "Recover: Suit %s at %s does not count" %
                                    (suit, zoneId))

            newQuests.append(quest)

        av.b_setQuests(newQuests)

        return recovered, unrecovered
Exemple #32
0
    def updateQuestInfo(self):
        for marker in self.buildingMarkers:
            marker.destroy()

        self.buildingMarkers = []
        dnaData = base.cr.playGame.dnaData
        for questIndex in self.av.questPage.quests.keys():
            questDesc = self.av.questPage.quests.get(questIndex)
            if questDesc is None:
                continue
            mapIndex = questIndex + 1
            questId, fromNpcId, toNpcId, rewardId, toonProgress = questDesc
            quest = Quests.getQuest(questId)
            fComplete = quest.getCompletionStatus(self.av,
                                                  questDesc) == Quests.COMPLETE
            if not fComplete:
                if quest.getType() == Quests.RecoverItemQuest:
                    if quest.getHolder() == Quests.AnyFish:
                        self.putBuildingMarker(self.fishingSpotInfo,
                                               mapIndex=mapIndex)
                    continue
                elif quest.getType(
                ) != Quests.DeliverGagQuest and quest.getType(
                ) != Quests.DeliverItemQuest and quest.getType(
                ) != Quests.VisitQuest and quest.getType(
                ) != Quests.TrackChoiceQuest:
                    continue
            if toNpcId == Quests.ToonHQ:
                self.putBuildingMarker(self.hqPosInfo, mapIndex=mapIndex)
            else:
                npcZone = NPCToons.getNPCZone(toNpcId)
                hoodId = ZoneUtil.getCanonicalHoodId(npcZone)
                branchId = ZoneUtil.getCanonicalBranchZone(npcZone)
                if self.hoodId == hoodId and self.zoneId == branchId:
                    for blockId, block in dnaData.getBlocks():
                        zone = block.zone
                        branchZone = zone - zone % 100
                        finalZone = branchZone + 500 + blockId
                        if npcZone == finalZone:
                            building = block.node
                            self.putBuildingMarker(Point3(building.getPos()),
                                                   building.getHpr(),
                                                   mapIndex=mapIndex)
    def toonUsedPhone(self, avId):
        # Get the avatar.
        av = self.air.doId2do.get(avId)
        if not av:
            return

        # Get the avatars current quests.
        avQuests = av.getQuests()
        questList = []

        # Iterate through their current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex], av.doId)
            if isinstance(questClass, Quests.PhoneQuest):
                questDesc[QuestProgressIndex] += 1
            questList.append(questDesc)

        av.b_setQuests(questList)
    def toonKilledBuilding(self, av, type, difficulty, floors, zoneId,
                           activeToons):
        avQuests = av.getQuests()
        questList = []
        zoneId = ZoneUtil.getBranchZone(zoneId)
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i:i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])
            if questClass.getCompletionStatus(av,
                                              questDesc) == Quests.INCOMPLETE:
                if isinstance(questClass, Quests.BuildingQuest):
                    if questClass.isLocationMatch(zoneId):
                        if questClass.doesBuildingTypeCount(type):
                            if questClass.doesBuildingCount(av, activeToons):
                                if floors >= questClass.getNumFloors():
                                    questDesc[QuestProgressIndex] += 1
            questList.append(questDesc)

        av.b_setQuests(questList)
Exemple #35
0
    def enter(self):
        doneStatus = {}
        questHistory = base.localAvatar.getQuestHistory()
        imgScale = 0.5
        if ((questHistory != []) and (questHistory != [1000])
                and (questHistory != [101, 110])):
            doneStatus['mode'] = 'complete'
            messenger.send(self.doneEvent, [doneStatus])
        elif ((len(base.localAvatar.quests) > 1)
              or (len(base.localAvatar.quests) == 0)):
            doneStatus['mode'] = 'complete'
            messenger.send(self.doneEvent, [doneStatus])
        elif (base.localAvatar.quests[0][0] != Quests.TROLLEY_QUEST_ID):
            doneStatus['mode'] = 'complete'
            messenger.send(self.doneEvent, [doneStatus])
        else:
            # Make the Toon stand still while the panel is up
            base.localAvatar.b_setAnimState('neutral', 1)
            doneStatus['mode'] = 'incomplete'
            self.doneStatus = doneStatus
            imageModel = loader.loadModel("phase_4/models/gui/tfa_images")
            if Quests.avatarHasTrolleyQuest(base.localAvatar):
                if (base.localAvatar.quests[0][4] != 0):
                    imgNodePath = imageModel.find("**/hq-dialog-image")
                    imgPos = (0, 0, -0.02)
                    msg = TTLocalizer.NPCForceAcknowledgeMessage2
                else:
                    imgNodePath = imageModel.find("**/trolley-dialog-image")
                    imgPos = (0, 0, 0.04)
                    msg = TTLocalizer.NPCForceAcknowledgeMessage

            self.dialog = TTDialog.TTDialog(text=msg,
                                            command=self.handleOk,
                                            style=TTDialog.Acknowledge)
            imgLabel = DirectLabel.DirectLabel(
                parent=self.dialog,
                relief=None,
                pos=imgPos,
                scale=TTLocalizer.NPCFimgLabel,
                image=imgNodePath,
                image_scale=imgScale,
            )
Exemple #36
0
    def updateQuestInfo(self):
        for marker in self.buildingMarkers:
            marker.destroy()

        self.buildingMarkers = []

        for (i, questDesc) in enumerate(self.av.quests):
            mapIndex = i + 1
            quest = Quests.getQuest(questDesc[0])
            toNpcId = questDesc[2]

            completed = quest.getCompletionStatus(self.av, questDesc) == Quests.COMPLETE
            if not completed:
                if quest.getType() == Quests.RecoverItemQuest:
                    if quest.getHolder() == Quests.AnyFish:
                        self.putBuildingMarker(self.fishingSpotInfo, mapIndex=mapIndex)
                    continue
                elif quest.getType() not in (
                    Quests.DeliverGagQuest, Quests.DeliverItemQuest,
                    Quests.VisitQuest, Quests.TrackChoiceQuest):
                    continue

            if toNpcId == Quests.ToonHQ:
                self.putBuildingMarker(self.hqPosInfo, mapIndex=mapIndex)
                continue

            npcZoneId = NPCToons.getNPCZone(toNpcId)
            hoodId = ZoneUtil.getCanonicalHoodId(npcZoneId)
            branchId = ZoneUtil.getCanonicalBranchZone(npcZoneId)

            if (self.hoodId != hoodId) or (self.zoneId != branchId):
                continue

            for blockIndex in xrange(base.cr.playGame.dnaStore.getNumBlockNumbers()):
                blockNumber = base.cr.playGame.dnaStore.getBlockNumberAt(blockIndex)
                zoneId = base.cr.playGame.dnaStore.getZoneFromBlockNumber(blockNumber)
                interiorZoneId = (zoneId - (zoneId%100)) + 500 + blockNumber
                if npcZoneId == interiorZoneId:
                    self.putBuildingMarker(
                        base.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber(blockNumber).getPos(render),
                        base.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber(blockNumber).getHpr(render),
                        mapIndex=mapIndex)
Exemple #37
0
    def __tasksChanged(self):
        # clear out everything from our menu
        self.clearMenu()

        # if local toon has not been created, don't panic
        try:
            lt = base.localAvatar
        except:
            return

        # keep a list of the phrases we've added to the menu, to
        # detect duplicates
        phrases = []
        def addTerminal(terminal, self=self, phrases=phrases):
            displayText = terminal.getDisplayText()
            if displayText not in phrases:
                self.append(terminal)
                phrases.append(displayText)

        # rebuild our menu
        for task in lt.quests:
            taskId, fromNpcId, toNpcId, rewardId, toonProgress = task
            q = Quests.getQuest(taskId)
            if q is None:
                continue
            msgs = q.getSCStrings(toNpcId, toonProgress)
            # getSCStrings might return a list of strings, or just a string
            if type(msgs) != type([]):
                msgs = [msgs]
            for i in range(len(msgs)):
                addTerminal(TTSCToontaskTerminal(msgs[i], taskId, toNpcId,
                                               toonProgress, i))

        # if toon has open task slots, or no task slots,
        # append 'i need a toontask'.
        needToontask = 1
        if hasattr(lt, 'questCarryLimit'):
            needToontask = (len(lt.quests) != lt.questCarryLimit)
        if needToontask:
            # add 'I need to get a ToonTask'
            # see Localizer.SpeedChatStaticText
            addTerminal(SCStaticTextTerminal(1299))
Exemple #38
0
    def toonUsedPhone(self, avId):
        av = self.air.doId2do[avId]

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.PhoneQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    quest[4] += 1

            newQuests.append(quest)

        av.b_setQuests(newQuests)
 def toonKilledBuilding(self, toon, type, difficulty, floors, zoneId,
                        activeToons):
     flattenedQuests = toon.getQuests()
     questList = []  #unflattened
     zoneId = ZoneUtil.getBranchZone(zoneId)
     recoveredItems = []
     unrecoveredItems = []
     for i in xrange(0, len(flattenedQuests), 5):
         questDesc = flattenedQuests[i:i + 5]
         questClass = Quests.getQuest(questDesc[0])
         if questClass.getCompletionStatus(toon,
                                           questDesc) == Quests.INCOMPLETE:
             if isinstance(questClass, Quests.BuildingQuest):
                 if questClass.isLocationMatch(zoneId):
                     if questClass.getBuildingTrack() == type or Quests.Any:
                         if questClass.doesBuildingCount(toon, activeToons):
                             if floors >= questClass.getNumFloors():
                                 questDesc[4] += 1
         questList.append(questDesc)
     toon.b_setQuests(questList)
    def toonKilledCogdo(self, av, type, difficulty, zoneId, activeToons):
        self.notify.debug(
            "toonKilledCogdo(%s, '%s', %s, %d, %s)" %
            (str(av), type, str(difficulty), zoneId, str(activeToons)))
        avQuests = av.getQuests()
        questList = []
        zoneId = ZoneUtil.getBranchZone(zoneId)
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i:i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])
            if questClass.getCompletionStatus(av,
                                              questDesc) == Quests.INCOMPLETE:
                if isinstance(questClass, Quests.CogdoQuest):
                    if questClass.isLocationMatch(zoneId):
                        if questClass.doesCogdoTypeCount(type):
                            if questClass.doesCogdoCount(av, activeToons):
                                questDesc[QuestProgressIndex] += 1
            questList.append(questDesc)

        av.b_setQuests(questList)
Exemple #41
0
 def updateQuestInfo(self):
     for marker in self.buildingMarkers:
         marker.destroy()
     
     self.buildingMarkers = []
     dnaStore = base.cr.playGame.dnaStore
     for questIndex in self.av.questPage.quests.keys():
         questDesc = self.av.questPage.quests.get(questIndex)
         if questDesc is None:
             continue
         
         mapIndex = questIndex + 1
         (questId, fromNpcId, toNpcId, rewardId, toonProgress) = questDesc
         quest = Quests.getQuest(questId)
         fComplete = quest.getCompletionStatus(self.av, questDesc) == Quests.COMPLETE
         if not fComplete:
             if quest.getType() == Quests.RecoverItemQuest:
                 if quest.getHolder() == Quests.AnyFish:
                     self.putBuildingMarker(self.fishingSpotInfo, mapIndex = mapIndex)
                     continue
                 continue
             elif quest.getType() != Quests.DeliverGagQuest and quest.getType() != Quests.DeliverItemQuest and quest.getType() != Quests.VisitQuest and quest.getType() != Quests.TrackChoiceQuest:
                 continue
             
         
         if toNpcId == Quests.ToonHQ:
             self.putBuildingMarker(self.hqPosInfo, mapIndex = mapIndex)
             continue
         npcZone = NPCToons.getNPCZone(toNpcId)
         hoodId = ZoneUtil.getCanonicalHoodId(npcZone)
         branchId = ZoneUtil.getCanonicalBranchZone(npcZone)
         if self.hoodId == hoodId and self.zoneId == branchId:
             for blockIndex in range(dnaStore.getNumBlockTitles()):
                 blockNumber = dnaStore.getTitleBlockAt(blockIndex)
                 zone = dnaStore.getZoneFromBlockNumber(blockNumber)
                 branchZone = zone - zone % 100
                 finalZone = branchZone + 500 + blockNumber
                 buildingType = dnaStore.getBlockBuildingType(blockNumber)
                 if npcZone == finalZone:
                     self.putBuildingMarker(dnaStore.getDoorPosHprFromBlockNumber(blockNumber).getPos(), dnaStore.getDoorPosHprFromBlockNumber(blockNumber).getHpr(), mapIndex = mapIndex)
                     continue
Exemple #42
0
    def toonDefeatedMint(self, av, mint, activeToons):
        if self.air.topToonsMgr:
            self.air.topToonsMgr.toonKilledFactory(av, 'mint')

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.MintQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    quest[4] += 1

            newQuests.append(quest)

        av.b_setQuests(newQuests)
Exemple #43
0
    def nextQuest(self, av, npc, questId):
        # Get the next QuestId and toNpcId.
        nextQuestId, toNpcId = Quests.getNextQuest(questId, npc, av)

        # Get the avatars current quests.
        avQuests = av.getQuests()
        questList = []

        # Iterate through their current quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i:i + 5]

            if questDesc[QuestIdIndex] == questId:
                questDesc[QuestIdIndex] = nextQuestId
                questDesc[QuestToNpcIdIndex] = toNpcId
                questDesc[QuestProgressIndex] = 0
            questList.append(questDesc)

        # Show the quest movie and set their quests.
        npc.incompleteQuest(av.doId, nextQuestId, Quests.QUEST, toNpcId)
        av.b_setQuests(questList)
Exemple #44
0
    def toonKilledBoss(self, av, boss):
        if self.air.topToonsMgr:
            self.air.topToonsMgr.toonKilledBoss(av, boss)

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.BossQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    if klass.doesBossCount(boss):
                        quest[4] += 1

            newQuests.append(quest)

        av.b_setQuests(newQuests)
    def toonDefeatedBoss(self, av, zone, dept, activeVictors):
        # Get the avatars current quests.
        avQuests = av.getQuests()
        questList = []
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i : i + 5]
            questClass = Quests.getQuest(questDesc[QuestIdIndex])
            if isinstance(questClass, Quests.VPQuest):
                if questClass.doesVPCount(av, dept, zone, activeVictors):
                    questDesc[QuestProgressIndex] += 1
            elif isinstance(questClass, Quests.CFOQuest):
                if questClass.doesCFOCount(av, dept, zone, activeVictors):
                    questDesc[QuestProgressIndex] += 1
            elif isinstance(questClass, Quests.CJQuest):
                if questClass.doesCJCount(av, dept, zone, activeVictors):
                    questDesc[QuestProgressIndex] += 1
            elif isinstance(questClass, Quests.CEOQuest):
                if questClass.doesCEOCount(av, dept, zone, activeVictors):
                    questDesc[QuestProgressIndex] += 1
            questList.append(questDesc)

        av.b_setQuests(questList)
    def _TTSCToontaskMenu__tasksChanged(self):
        self.clearMenu()
        
        try:
            lt = base.localAvatar
        except:
            return None

        phrases = []
        
        def addTerminal(terminal, self = self, phrases = phrases):
            displayText = terminal.getDisplayText()
            if displayText not in phrases:
                self.append(terminal)
                phrases.append(displayText)
            

        for task in lt.quests:
            (taskId, fromNpcId, toNpcId, rewardId, toonProgress) = task
            q = Quests.getQuest(taskId)
            if q is None:
                continue
            
            msgs = q.getSCStrings(toNpcId, toonProgress)
            if type(msgs) != type([]):
                msgs = [
                    msgs]
            
            for i in xrange(len(msgs)):
                addTerminal(TTSCToontaskTerminal(msgs[i], taskId, toNpcId, toonProgress, i))
            
        
        needToontask = 1
        if hasattr(lt, 'questCarryLimit'):
            needToontask = len(lt.quests) != lt.questCarryLimit
        
        if needToontask:
            addTerminal(SCStaticTextTerminal(1299))
Exemple #47
0
    def toonKilledCogdo(self, av, track, _, numFloors, zoneId, activeToons):
        if self.air.topToonsMgr:
            self.air.topToonsMgr.toonKilledOffice(av, track)

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.CogdoQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    if klass.doesOfficeCount(av.doId, track, zoneId,
                                             activeToons):
                        quest[4] += 1

            newQuests.append(quest)

        av.b_setQuests(newQuests)
Exemple #48
0
    def toonKilledBuilding(self, av, track, _, height, zoneId, activeToons):
        if self.air.topToonsMgr:
            self.air.topToonsMgr.toonKilledBldg(av, track, height)

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.BuildingQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    if klass.doesBuildingCount(av.doId, track, height, zoneId,
                                               activeToons):
                        quest[4] += 1

            newQuests.append(quest)

        av.b_setQuests(newQuests)
 def toonCaughtFishingItem(self, toon):
     print 'QuestManager: %s (AvId: %s) Caught quest Item while fishing.'%(toon.getName(), toon.doId)
     flattenedQuests = toon.getQuests()
     questList = [] #unflattened
     hasPickedQuest = 0
     for i in xrange(0, len(flattenedQuests), 5):
         questDesc = flattenedQuests[i : i + 5]
         questClass = Quests.getQuest(questDesc[0])
         if isinstance(questClass, Quests.RecoverItemQuest):
             if not hasPickedQuest:
                 if isinstance(questClass, Quests.RecoverItemQuest):
                     if questClass.getHolder() == Quests.AnyFish:
                         if not questClass.getCompletionStatus(toon, questDesc) == Quests.COMPLETE:
                             minChance = questClass.getPercentChance()
                             chance = random.randint(minChance - 40, 100)
                             if chance <= minChance:
                                 questDesc[4] += 1
                                 hasPickedQuest = questClass
         questList.append(questDesc)
     toon.b_setQuests(questList)
     if (hasPickedQuest):
         return questClass.getItem()
     else:
         return -1
Exemple #50
0
    def toonCaughtFishingItem(self, av):
        quests = av.getQuests()
        newQuests = []

        itemId = -1
        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])
            if itemId == -1:
                if klass.__class__ == Quests.RecoverItemQuest and hasattr(
                        klass, 'getItem'):
                    if klass.getHolder() == Quests.AnyFish:
                        if klass.getCompletionStatus(av,
                                                     quest) != Quests.COMPLETE:
                            minChance = klass.getPercentChance()
                            chance = random.randint(minChance - 40, 100)
                            if chance <= minChance:
                                quest[4] += 1
                                itemId = klass.getItem()

            newQuests.append(quest)

        av.b_setQuests(newQuests)
        return itemId
Exemple #51
0
    def toonRodeTrolley(self, avId):
        av = self.air.doId2do[avId]

        rode = False

        quests = av.getQuests()
        newQuests = []

        for i in xrange(0, len(quests), 5):
            quest = quests[i:i + 5]
            klass = Quests.getQuest(quest[0])

            if not klass:
                continue

            if isinstance(klass, Quests.TrolleyQuest):
                if klass.getCompletionStatus(av, quest) != Quests.COMPLETE:
                    quest[4] += 1
                    rode = True

            newQuests.append(quest)

        av.b_setQuests(newQuests)
        return rode
Exemple #52
0
 def isNewbie(self, avId):
     toon = self.air.doId2do.get(avId)
     if not toon:
         return False
     return Quests.avatarHasTrolleyQuest(toon)
Exemple #53
0
    def requestInteract(self, avId, npc):
        # Get the avatar.
        av = self.air.doId2do.get(avId)
        if not av:
            return

        avQuestPocketSize = av.getQuestCarryLimit()
        avQuests = av.getQuests()

        needTrackTask = False
        fakeTier = 0

        avTrackProgress = av.getTrackProgress()
        if avTrackProgress[0] == -1:
            avQuestTier = av.getRewardTier()
            if avQuestTier < Quests.DG_TIER and avQuestTier > Quests.DD_TIER:
                fakeTier = Quests.DD_TIER
                needTrackTask = True
            elif avQuestTier < Quests.BR_TIER and avQuestTier > Quests.MM_TIER:
                fakeTier = Quests.MM_TIER
                needTrackTask = True
            elif avQuestTier < Quests.DL_TIER and avQuestTier > Quests.BR_TIER:
                fakeTier = Quests.BR_TIER
                needTrackTask = True

        # Iterate through their quests.
        for i in xrange(0, len(avQuests), 5):
            questDesc = avQuests[i:i + 5]
            questId, fromNpcId, toNpcId, rewardId, toonProgress = questDesc
            questClass = Quests.getQuest(questId)
            if questClass:
                completeStatus = questClass.getCompletionStatus(
                    av, questDesc, npc)
            else:
                continue

            # If the quest is a DeliverGagQuest, add the gags.
            if isinstance(questClass, Quests.DeliverGagQuest):
                # Check if it's the required NPC.
                if npc.npcId == toNpcId:
                    # Add progress.
                    questList = []
                    progress = questClass.removeGags(av)

                    for i in xrange(0, len(avQuests), 5):
                        questDesc = avQuests[i:i + 5]
                        if questDesc[QuestIdIndex] == questId:
                            questDesc[QuestProgressIndex] += progress
                            if questDesc[
                                    QuestProgressIndex] >= questClass.getNumGags(
                                    ):
                                completeStatus = Quests.COMPLETE
                        questList.append(questDesc)
                    av.b_setQuests(questList)

                    if completeStatus != Quests.COMPLETE:
                        continue

            # If they've completed a quest.
            if completeStatus == Quests.COMPLETE:
                # ToonUp the toon to max health.
                av.toonUp(av.maxHp)

                # If it's a TrackChoiceQuest then present their track choices.
                if isinstance(questClass, Quests.TrackChoiceQuest):
                    npc.presentTrackChoice(avId, questId,
                                           questClass.getChoices())
                    break
                # If there is another part to this quest then give them that.
                if Quests.getNextQuest(questId, npc, av)[0] != Quests.NA:
                    self.nextQuest(av, npc, questId)
                    if avId in self.air.tutorialManager.avId2fsm:
                        self.air.tutorialManager.avId2fsm[avId].demand(
                            'Tunnel')
                    break
                else:
                    # The toon has completed this quest. Give them a reward!
                    npc.completeQuest(avId, questId, rewardId)
                    self.completeQuest(av, questId)
                break
        else:
            # They haven't completed any quests so we have to give them choices.
            # If they've got a full pouch then reject them.
            if (len(avQuests) == avQuestPocketSize * 5):
                npc.rejectAvatar(avId)
                return
            elif isinstance(npc, DistributedNPCSpecialQuestGiverAI):
                # Don't display choices. Force a choice.
                self.tutorialQuestChoice(avId, npc)
                return
            else:
                #Present quest choices.
                if needTrackTask:
                    choices = self.npcGiveTrackChoice(av, fakeTier)
                else:
                    choices = self.avatarQuestChoice(av, npc)
                if choices != []:
                    npc.presentQuestChoice(avId, choices)
                else:
                    npc.rejectAvatar(avId)
Exemple #54
0
 def avatarQuestChoice(self, av, npc):
     # Get the best quests for an avatar/npc.
     return Quests.chooseBestQuests(av.getRewardTier(), npc, av)
Exemple #55
0
 def npcGiveTrackChoice(self, av, tier):
     trackQuest = Quests.chooseTrackChoiceQuest(tier, av)
     return [(trackQuest, 400, Quests.ToonHQ)]
Exemple #56
0
    def getQuestIntervalList(self,
                             toon,
                             deathList,
                             toonList,
                             origQuestsList,
                             itemList,
                             helpfulToonsList=[]):
        avId = toon.getDoId()
        tickDelay = 0.2
        intervalList = []
        toonShortList = []
        for t in toonList:
            if t is not None:
                toonShortList.append(t)

        cogList = []
        for i in xrange(0, len(deathList), 4):
            cogIndex = deathList[i]
            cogLevel = deathList[i + 1]
            activeToonBits = deathList[i + 2]
            flags = deathList[i + 3]
            activeToonIds = []
            for j in xrange(8):
                if activeToonBits & 1 << j:
                    if toonList[j] is not None:
                        activeToonIds.append(toonList[j].getDoId())

            isSkelecog = flags & ToontownBattleGlobals.DLF_SKELECOG
            isForeman = flags & ToontownBattleGlobals.DLF_FOREMAN
            isVP = flags & ToontownBattleGlobals.DLF_VP
            isCFO = flags & ToontownBattleGlobals.DLF_CFO
            isSupervisor = flags & ToontownBattleGlobals.DLF_SUPERVISOR
            isVirtual = flags & ToontownBattleGlobals.DLF_VIRTUAL
            hasRevives = flags & ToontownBattleGlobals.DLF_REVIVES
            if isVP or isCFO:
                cogType = None
                cogTrack = SuitDNA.suitDepts[cogIndex]
            else:
                cogType = SuitDNA.suitHeadTypes[cogIndex]
                cogTrack = SuitDNA.getSuitDept(cogType)
            cogList.append({
                'type': cogType,
                'level': cogLevel,
                'track': cogTrack,
                'isSkelecog': isSkelecog,
                'isForeman': isForeman,
                'isVP': isVP,
                'isCFO': isCFO,
                'isSupervisor': isSupervisor,
                'isVirtual': isVirtual,
                'hasRevives': hasRevives,
                'activeToons': activeToonIds
            })

        try:
            zoneId = base.cr.playGame.getPlace().getTaskZoneId()
        except:
            zoneId = 0

        avQuests = []
        for i in xrange(0, len(origQuestsList), 5):
            avQuests.append(origQuestsList[i:i + 5])

        for i in xrange(len(avQuests)):
            questDesc = avQuests[i]
            questId, npcId, toNpcId, rewardId, toonProgress = questDesc
            quest = Quests.getQuest(questId)
            if quest and i < len(self.questLabelList):
                questString = quest.getString()
                progressString = quest.getProgressString(toon, questDesc)
                questLabel = self.questLabelList[i]
                earned = 0
                orig = questDesc[4] & pow(2, 16) - 1
                num = 0
                if quest.getType() == Quests.RecoverItemQuest:
                    questItem = quest.getItem()
                    if questItem in itemList:
                        earned = itemList.count(questItem)
                else:
                    for cogDict in cogList:
                        if cogDict['isVP']:
                            num = quest.doesVPCount(avId, cogDict, zoneId,
                                                    toonShortList)
                        elif cogDict['isCFO']:
                            num = quest.doesCFOCount(avId, cogDict, zoneId,
                                                     toonShortList)
                        else:
                            num = quest.doesCogCount(avId, cogDict, zoneId,
                                                     toonShortList)
                        if num:
                            if base.config.GetBool('battle-passing-no-credit',
                                                   True):
                                if avId in helpfulToonsList:
                                    earned += num
                                else:
                                    self.notify.debug(
                                        'avId=%d not getting %d kill cog quest credit'
                                        % (avId, num))
                            else:
                                earned += num

                if base.localAvatar.tutorialAck:
                    if earned > 0:
                        earned = min(earned,
                                     quest.getNumQuestItems() - questDesc[4])
                if earned > 0 or base.localAvatar.tutorialAck == 0 and num == 1:
                    barTime = 0.5
                    numTicks = int(math.ceil(barTime / tickDelay))
                    for i in xrange(numTicks):
                        t = (i + 1) / float(numTicks)
                        newValue = int(orig + t * earned + 0.5)
                        questDesc[4] = newValue
                        progressString = quest.getProgressString(
                            toon, questDesc)
                        str = '%s : %s' % (questString, progressString)
                        if quest.getCompletionStatus(
                                toon, questDesc) == Quests.COMPLETE:
                            intervalList.append(
                                Func(questLabel.setProp, 'text_fg',
                                     (0, 0.3, 0, 1)))
                        intervalList.append(
                            Func(questLabel.setProp, 'text', str))
                        intervalList.append(Wait(tickDelay))

        return intervalList
 def enterTeleportIn(self, requestStatus):
     imgScale = 0.25
     if self.dialog:
         x, y, z, h, p, r = base.cr.hoodMgr.getPlaygroundCenterFromId(
             self.loader.hood.id)
     elif base.localAvatar.hp < 1:
         requestStatus['nextState'] = 'popup'
         x, y, z, h, p, r = base.cr.hoodMgr.getPlaygroundCenterFromId(
             self.loader.hood.id)
         self.accept('deathAck',
                     self.__handleDeathAck,
                     extraArgs=[requestStatus])
         self.deathAckBox = DeathForceAcknowledge.DeathForceAcknowledge(
             doneEvent='deathAck')
     elif base.localAvatar.hp > 0 and (
             Quests.avatarHasTrolleyQuest(base.localAvatar)
             or Quests.avatarHasFirstCogQuest(base.localAvatar)
             or Quests.avatarHasFriendQuest(base.localAvatar)
             or Quests.avatarHasPhoneQuest(base.localAvatar)
             and Quests.avatarHasCompletedPhoneQuest(base.localAvatar)
     ) and self.loader.hood.id == ToontownGlobals.ToontownCentral:
         requestStatus['nextState'] = 'popup'
         imageModel = loader.loadModel('phase_4/models/gui/tfa_images')
         if base.localAvatar.quests[0][0] == Quests.TROLLEY_QUEST_ID:
             if not Quests.avatarHasCompletedTrolleyQuest(base.localAvatar):
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralInitialDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage3
                 imgNodePath = imageModel.find('**/trolley-dialog-image')
                 imgPos = (0, 0, 0.04)
                 imgScale = 0.5
             else:
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralHQDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage4
                 imgNodePath = imageModel.find('**/hq-dialog-image')
                 imgPos = (0, 0, -0.02)
                 imgScale = 0.5
         elif base.localAvatar.quests[0][0] == Quests.FIRST_COG_QUEST_ID:
             if not Quests.avatarHasCompletedFirstCogQuest(
                     base.localAvatar):
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralTunnelDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage5
                 imgNodePath = imageModel.find('**/tunnelSignA')
                 imgPos = (0, 0, 0.04)
                 imgScale = 0.5
             else:
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralHQDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage6
                 imgNodePath = imageModel.find('**/hq-dialog-image')
                 imgPos = (0, 0, 0.05)
                 imgScale = 0.5
         elif base.localAvatar.quests[0][0] == Quests.FRIEND_QUEST_ID:
             if not Quests.avatarHasCompletedFriendQuest(base.localAvatar):
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralInitialDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage7
                 gui = loader.loadModel(
                     'phase_3.5/models/gui/friendslist_gui')
                 imgNodePath = gui.find('**/FriendsBox_Closed')
                 imgPos = (0, 0, 0.04)
                 imgScale = 1.0
                 gui.removeNode()
             else:
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralHQDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage8
                 imgNodePath = imageModel.find('**/hq-dialog-image')
                 imgPos = (0, 0, 0.05)
                 imgScale = 0.5
         elif base.localAvatar.quests[0][0] == Quests.PHONE_QUEST_ID:
             if Quests.avatarHasCompletedPhoneQuest(base.localAvatar):
                 x, y, z, h, p, r = base.cr.hoodMgr.getDropPoint(
                     base.cr.hoodMgr.ToontownCentralHQDropPoints)
                 msg = TTLocalizer.NPCForceAcknowledgeMessage9
                 imgNodePath = imageModel.find('**/hq-dialog-image')
                 imgPos = (0, 0, 0.05)
                 imgScale = 0.5
         self.dialog = TTDialog.TTDialog(text=msg,
                                         command=self.__cleanupDialog,
                                         style=TTDialog.Acknowledge)
         imgLabel = DirectLabel.DirectLabel(parent=self.dialog,
                                            relief=None,
                                            pos=imgPos,
                                            scale=TTLocalizer.PimgLabel,
                                            image=imgNodePath,
                                            image_scale=imgScale)
         imageModel.removeNode()
     else:
         requestStatus['nextState'] = 'walk'
         x, y, z, h, p, r = base.cr.hoodMgr.getPlaygroundCenterFromId(
             self.loader.hood.id)
     base.localAvatar.detachNode()
     base.localAvatar.setPosHpr(render, x, y, z, h, p, r)
     Place.Place.enterTeleportIn(self, requestStatus)
     return
Exemple #58
0
    def processAvatar(self, av, db):
        self.printSometimes(av)

        changed = av.fixAvatar()
        if changed:
            db2 = DatabaseObject.DatabaseObject(self.air, av.doId)
            db2.storeObject(av, list(db.values.keys()))
            print("%d: %s repaired (account %s)." %
                  (av.doId, av.name, av.accountName))
        return

        numTracks = reduce(lambda a, b: a + b, av.trackArray)
        hp = av.maxHp
        healExp, trapExp, lureExp, soundExp, throwExp, squirtExp, dropExp = av.experience.experience
        trackProgressId, trackProgress = av.getTrackProgress()
        trackAccess = av.getTrackAccess()
        maxMoney = av.getMaxMoney()
        fixed = 0

        for questDesc in av.quests:

            questId = questDesc[0]
            rewardId = questDesc[3]
            toNpc = questDesc[2]

            if (not Quests.questExists(questId)):
                print('WARNING: av has quest that is not in quest dict: ',
                      av.doId, questId)
                continue

            if (questId in [160, 161, 162, 161]):
                if rewardId != 100:
                    print(('WARNING: av has quest: %s with reward: %s' %
                           (questId, rewardId)))
                    questDesc[3] = 100
                    fixed = 1
                    continue

            if (rewardId == 1000):
                if (questId in [
                        1100, 1101, 1102, 1103, 2500, 2501, 3500, 3501, 4500,
                        4501, 5500, 5501, 7500, 7501, 9500, 9501
                ]):
                    # not fixing because this clothing quest is valid
                    break
                av.removeAllTracesOfQuest(questId, rewardId)
                fixed = 1
                continue

            if ((toNpc != 1000)
                    and (NPCToons.NPCToonDict[toNpc][5] == NPCToons.NPC_HQ)):
                print(('WARNING: av has quest: %s to visit NPC_HQ: %s' %
                       (questId, toNpc)))
                print('before: ', av.quests)
                questDesc[2] = Quests.ToonHQ
                print('after: ', av.quests)
                fixed = 1
                continue

        # If there were any quest fixes, broadcast them now
        if fixed:
            av.b_setQuests(av.quests)

        # Make sure they are not training any tracks they have already trained
        if (trackProgressId >= 0) and (trackAccess[trackProgressId] == 1):
            print("WARNING: av training track he already has")
            print("Track progress id: ", trackProgressId)
            print("Track access: ", trackAccess)
            print("Tier: ", av.rewardTier)
            if av.rewardTier in [0, 1]:
                print("ERROR: You should not be here")
            elif av.rewardTier in [2, 3]:
                print('sound or heal')
                if av.trackArray[SOUND_TRACK] and not av.trackArray[HEAL_TRACK]:
                    trackProgressId = HEAL_TRACK
                elif av.trackArray[
                        HEAL_TRACK] and not av.trackArray[SOUND_TRACK]:
                    trackProgressId = SOUND_TRACK
                else:
                    trackProgressId = HEAL_TRACK
                av.b_setTrackProgress(trackProgressId, trackProgress)
                print("Fixed trackProgressId: ", trackProgressId)
                fixed = 1

            elif av.rewardTier in [4]:
                print("ERROR: You should not be here")
            elif av.rewardTier in [5, 6]:
                print('drop or lure')
                if av.trackArray[DROP_TRACK] and not av.trackArray[LURE_TRACK]:
                    trackProgressId = LURE_TRACK
                elif av.trackArray[
                        LURE_TRACK] and not av.trackArray[DROP_TRACK]:
                    trackProgressId = DROP_TRACK
                else:
                    trackProgressId = DROP_TRACK
                av.b_setTrackProgress(trackProgressId, trackProgress)
                print("Fixed trackProgressId: ", trackProgressId)
                fixed = 1
            elif av.rewardTier in [7]:
                print("ERROR: You should not be here")
            elif av.rewardTier in [8]:
                print("ERROR: You should not be here")
            elif av.rewardTier in [9, 10]:
                print('trap or heal, trap or sound')
                if av.trackArray[SOUND_TRACK] and not av.trackArray[HEAL_TRACK]:
                    trackProgressId = HEAL_TRACK
                elif av.trackArray[
                        HEAL_TRACK] and not av.trackArray[SOUND_TRACK]:
                    trackProgressId = SOUND_TRACK
                else:
                    trackProgressId = TRAP_TRACK
                av.b_setTrackProgress(trackProgressId, trackProgress)
                print("Fixed trackProgressId: ", trackProgressId)
                fixed = 1
            elif av.rewardTier in [11]:
                print("ERROR: You should not be here")
            elif av.rewardTier in [12, 13]:
                print('all sort of choices')
                if not av.trackArray[HEAL_TRACK]:
                    trackProgressId = HEAL_TRACK
                elif not av.trackArray[SOUND_TRACK]:
                    trackProgressId = SOUND_TRACK
                elif not av.trackArray[DROP_TRACK]:
                    trackProgressId = DROP_TRACK
                elif not av.trackArray[LURE_TRACK]:
                    trackProgressId = LURE_TRACK
                elif not av.trackArray[TRAP_TRACK]:
                    trackProgressId = TRAP_TRACK
                else:
                    print("ERROR")
                av.b_setTrackProgress(trackProgressId, trackProgress)
                print("Fixed trackProgressId: ", trackProgressId)
                fixed = 1
            else:
                print("ERROR: You should not be here")
            print()

        # clean up track access
        if av.fixTrackAccess():
            fixed = 1

        # This was an unfortunate typo in Quests.py
        if maxMoney == 10:
            print('bad maxMoney limit == 10')
            av.b_setMaxMoney(100)
            # Fill er up cause we feel bad
            av.b_setMoney(100)
            fixed = 1

        if av.rewardTier == 5:
            if hp < 25 or hp > 34:
                print('bad hp: ', end=' ')

            # Somehow they got here without choosing a track
            if trackProgressId == -1:
                print('bad track training in tier 5!')
                print(('avId: %s, trackProgressId: %s, trackProgress: %s' %
                       (av.doId, trackProgressId, trackProgress)))
                av.b_setQuestHistory([])
                av.b_setQuests([])
                # Make them choose again
                av.b_setRewardHistory(4, [])
                av.b_setTrackProgress(-1, 0)
                av.fixAvatar()
                av.inventory.zeroInv()
                av.inventory.maxOutInv()
                av.d_setInventory(av.inventory.makeNetString())
                print('new track access: ', av.trackArray)
                fixed = 1

        elif av.rewardTier == 7:
            if hp < 34 or hp > 43:
                print('bad hp: ', end=' ')
            if trackProgressId != -1:
                print('bad track training in tier 7!')
                av.b_setQuestHistory([])
                av.b_setQuests([])
                av.b_setRewardHistory(7, [])
                av.b_setTrackProgress(-1, 0)
                av.fixAvatar()
                av.inventory.zeroInv()
                av.inventory.maxOutInv()
                av.d_setInventory(av.inventory.makeNetString())
                fixed = 1

        else:
            # Nothing to fix here
            pass

        if fixed:
            db = DatabaseObject.DatabaseObject(self.air, av.doId)
            db.storeObject(av)
            print("Avatar repaired.")
            print()

        return
Exemple #59
0
 def canDeleteQuest(self, questDesc):
     if Quests.isQuestJustForFun(questDesc[0], questDesc[3]):
         pass
     return self.onscreen == 0
Exemple #60
0
 def ringIfHasPhoneQuest(self, task):
     if Quests.avatarHasPhoneQuest(
             base.localAvatar) and not Quests.avatarHasCompletedPhoneQuest(
                 base.localAvatar):
         self.ring()
     return Task.done