def handleRecoverItemObjective(self): objective = self.quest.currentObjective # Let's make sure we have a current objective that is # an instance of the RecoverItemObjective class and this poster isn't destroyed. if not objective or not hasattr(self, 'titleLabel') or not isinstance( objective, RecoverItemObjective): return # Let's make the left icon use the item icon we chose. self.handleSimpleIcon(objective.itemIcon, 0.12, self.auxIcon) # Handle the objective information. infoText = '%d %s' % (objective.neededAmount, QuestGlobals.makePlural(objective.itemName)) if objective.neededAmount == 1: infoText = objective.itemName # Update the positions and information regarding the left side. self.auxFrame.setPos(QuestGlobals.RECOVER_LEFT_PICTURE_POS) self.auxFrame['image_color'] = QuestGlobals.GREEN self.objectiveInfo.setPos(QuestGlobals.RECOVER_INFO_POS) self.objectiveInfo['text'] = infoText self.fromToMiddleText['text'] = QuestGlobals.FROM self.handleCogObjective(self.goalIcon, frameColor=QuestGlobals.GREEN) # Let's set the progress bar text pgBarText = '%d of %d %s' % (objective.amount, objective.neededAmount, QuestGlobals.makePastTense( QuestGlobals.RECOVER)) self.progressBar['text'] = pgBarText
def handleDeliverItemObjective(self): objective = self.quest.currentObjective # Let's make sure we have a current objective that is # an instance of the DeliverItemObjective class and this poster isn't destroyed. if not objective or not hasattr(self, 'titleLabel') or not isinstance( objective, DeliverItemObjective): return # Correct the scaling if we need to and set the icon. scale = 0.12 if objective.itemIcon.getName() == 'package' else 0.85 self.handleSimpleIcon(objective.itemIcon, scale, self.auxIcon) self.auxFrame.setPos(QuestGlobals.RECOVER_LEFT_PICTURE_POS) self.auxFrame['image_color'] = QuestGlobals.RED infoText = '%d %s' % (objective.neededAmount, QuestGlobals.makePlural(objective.itemName)) if objective.neededAmount == 1: infoText = objective.itemName self.objectiveInfo.setPos(QuestGlobals.RECOVER_INFO_POS) self.objectiveInfo['text'] = infoText self.fromToMiddleText['text'] = QuestGlobals.TO # Let's set the progress bar text pgBarText = '%d of %d %s' % (objective.amount, objective.neededAmount, QuestGlobals.makePastTense( QuestGlobals.DELIVER)) self.progressBar['text'] = pgBarText self.handleNPCObjective(self.goalIcon, auxText=QuestGlobals.DELIVER, frameColor=QuestGlobals.RED)
def getTaskInfo(self, speech=False, forcePlural=False): Objective.getTaskInfo(self, speech=speech) forcePlural = True if self.neededAmount > 1 or forcePlural else False infoText = '' if not speech else (QuestGlobals.DEFEAT + ' ') infoText += (str(self.neededAmount) ) if forcePlural else 'a ' if not self.name else '' if self.level: infoText += (str('%s Level %s' % (infoText, str(self.level)))) elif self.levelRange: infoText += str('%s Level %s+' % (infoText, str(self.levelRange[0]))) if self.variant: variantTxt = Variant.VariantToName.get(self.variant) if forcePlural: variantTxt = QuestGlobals.makePlural(variantTxt) infoText = str('%s %s' % (infoText, variantTxt)) if self.dept: deptName = self.dept.getName( ) if not forcePlural else QuestGlobals.makePlural( self.dept.getName()) infoText = str('%s %s' % (infoText, deptName)) elif not self.name: text = CIGlobals.Suit if not forcePlural else CIGlobals.Suits infoText = str('%s %s' % (infoText, text)) elif self.name: nameText = self.name if not forcePlural else QuestGlobals.makePlural( self.name) infoText = str('%s %s' % (infoText, nameText)) return infoText
def setupQuestPosters(): questManager = avatar.questManager numQuests = len(questManager.quests.values()) yPos = 0.47 displayData = { 1: [[Point3(0.0, 0.0, yPos)], 0.88], 2: [[Point3(-0.42, 0.0, yPos), Point3(0.45, 0.0, yPos)], 0.88], 3: [[ Point3(-0.57, 0.0, yPos), Point3(0.0, 0.0, yPos), Point3(0.57, 0.0, yPos) ], 0.70], 4: [[ Point3(-0.32, 0.0, 0.62), Point3(-0.32, 0.0, 0.30), Point3(0.32, 0.0, 0.62), Point3(0.32, 0.0, 0.30) ], 0.52] } # A full frame is a frame showing two quests at once. howManyFullFrames = math.ceil(numQuests / 2.0) howManyRemainderFrames = (numQuests - howManyFullFrames) for i, quest in enumerate(questManager.quests.values()): poster = QuestGlobals.generatePoster(quest, parent=self.questFrame) poster.setScale(displayData.get(numQuests)[1]) poster.setPos(displayData.get(numQuests)[0][i]) poster.show() self.questPosters.append(poster)
def __init__(self, poster, reward, **kw): optiondefs = (('relief', None, None), ('image', QuestGlobals.getJBIcon(), None), ('image_scale', QuestGlobals.JB_JAR_SCALE, None), ('state', DGG.NORMAL, None)) self.defineoptions(kw, optiondefs) # Finally, initialize the DirectFrame. DirectFrame.__init__(self, parent=poster, relief=None) self.initialiseoptions(QuestRewardFrame) self.reward = reward gagShopGeom = loader.loadModel( 'phase_4/models/gui/gag_shop_purchase_gui.bam') self.info = DirectFrame(parent=self, relief=None, geom=gagShopGeom.find('**/Char_Pnl'), geom_scale=(0.15, 0, 0.1275), text='0', text_font=CIGlobals.getToonFont(), text_scale=0.04, text_fg=(0, 0, 0, 1), text_align=TextNode.ACenter, text_pos=(0, -0.01), pos=(0, 0, -0.06)) self.info.setBin('gui-popup', 40) gagShopGeom.removeNode() self.hide()
def handleMinigameObjective(self, iconElement=auxIcon, auxText=QuestGlobals.PLAY, frameColor=QuestGlobals.RED): objective = self.viewObjective infoText = objective.getTaskInfo() if not iconElement: iconElement = self.auxIcon # Let's make sure we have a current objective that is # an instance of the MinigameObjective class and this poster isn't destroyed. if not objective or not hasattr(self, 'titleLabel') or not isinstance( objective, MinigameObjective): return # Let's set the icon to the minigame icon. self.handleSimpleIcon(QuestGlobals.getTrolleyIcon(), QuestGlobals.SIMPLE_IMAGE_SCALE, iconElement) # Let's set the progress bar text pgBarText = '%d of %d %s' % (objective.progress, objective.goal, CIGlobals.makePastTense(auxText)) self.progressBar['text'] = pgBarText self.objectiveInfo['text'] = infoText self.auxText['text'] = auxText self.auxFrame['image_color'] = Vec4(*frameColor)
def getTaskInfo(self, speech=False): visitInfo = VisitNPCObjective.getTaskInfo(self, speech=False) infoText = '' if not speech else (QuestGlobals.DELIVER + ' ') infoText += str( 'a %s' % self.itemName) if self.neededAmount == 1 else str( '%d %s' % (self.neededAmount, QuestGlobals.makePlural(self.itemName))) infoText = str('%s to %s' % (infoText, visitInfo)) return infoText
def resetGUIVariables(self): # Variables that handle creation of the posters. self.auxText = '' self.auxTextPos = QuestGlobals.DEFAULT_AUX_POS self.infoText = '' self.infoPos = QuestGlobals.DEFAULT_INFO_POS self.info02Text = '' self.info02Pos = QuestGlobals.DEFAULT_INFO2_POS self.lPicturePos = QuestGlobals.DEFAULT_LEFT_PICTURE_POS self.lIconGeom = QuestGlobals.getPackageIcon() self.lIconScale = self.lIconGeom.getScale() self.rPicturePos = QuestGlobals.DEFAULT_RIGHT_PICTURE_POS self.rIconGeom = QuestGlobals.getPackageIcon() self.rIconScale = self.rIconGeom.getScale() self.pictureFrameColor = Vec4(*QuestGlobals.GREEN) self.progressBarText = '' self.locationText = 'N/A' self.locationY = 0 self.middleText = ''
def setup(self): objective = self.quest.currentObjective objective.updateInfo() self.objectiveInfo.show() self.auxFrame.show() self.locationInfo['text'] = QuestGlobals.getLocationText( objective.location) self.locationInfo['text_pos'] = (0, 0 if not QuestGlobals.isShopLocation( objective.location) else 0.025) self.locationInfo.show() # Let's setup the quest progress bar progress = objective.amount if hasattr(objective, 'amount') else None if progress and objective.neededAmount > 0: self.progressBar['range'] = objective.getNeededAmount() self.progressBar['value'] = progress & pow(2, 16) - 1 if objective.__class__ in [ DeliverItemObjective, CogObjective, RecoverItemObjective ]: self.progressBar.show() self.auxText.show() # Let's handle the objectives. if objective.__class__ == CogObjective: self.handleCogObjective() elif objective.__class__ == VisitNPCObjective: self.handleNPCObjective() self.titleLabel.initialiseoptions(DirectLabel) self.auxIcon.initialiseoptions(DirectFrame) self.auxText.initialiseoptions(DirectLabel) self.objectiveInfo.initialiseoptions(DirectLabel) self.locationInfo.initialiseoptions(DirectLabel) self.rewardFrame.initialiseoptions(DirectFrame) self.sideInfo.initialiseoptions(DirectLabel)
def getTaskInfo(self, speech=False): cogObjInfo = CogObjective.getTaskInfo(self, speech=False, forcePlural=True) infoText = '' if not speech else (QuestGlobals.RECOVER + ' ') infoText += str( 'a %s' % self.itemName) if self.neededAmount == 1 else str( '%d %s' % (self.neededAmount, QuestGlobals.makePlural(self.itemName))) infoText = str('%s from %s' % (infoText, cogObjInfo)) return cogObjInfo
def setup(self): if self.reward.rewardType == 1: # This is a jellybeans reward. self.setPos(QuestGlobals.LEFT_JB_JAR_POS) self.info['text'] = str(self.reward.rewardValue) elif self.reward.rewardType == 2: # This is a teleport access reward. self['image'] = QuestGlobals.getTPAccessIcon() self['image_scale'] = QuestGlobals.TP_ACCESS_SCALE self.setPos(QuestGlobals.LEFT_TP_ACCESS_POS) self.info['text'] = ZoneUtil.ZoneId2HoodAbbr[ self.reward.rewardValue] self.info.setPos(-0.0025, 0, -0.04) elif self.reward.rewardType == 3: # This is a laff boost reward. r, g, b, _ = base.localAvatar.getHeadColor() hp = base.localAvatar.getMaxHealth() + self.reward.rewardValue laffMeter = LaffOMeter() laffMeter.generate(r, g, b, base.localAvatar.getAnimal(), maxHP=hp, initialHP=hp) self['image'] = laffMeter self['image_scale'] = QuestGlobals.LAFF_METER_SCALE self.setPos(QuestGlobals.LEFT_LAFF_METER_POS) self.info['text'] = '+%d' % self.reward.rewardValue self.info.setPos(0, 0, -0.05) laffMeter.destroy() elif self.reward.rewardType == 5: # This is a gag slot reward. icon = QuestGlobals.getGagSlotIcon(self.reward.rewardValue) self['image'] = icon self['image_scale'] = QuestGlobals.GAG_SLOT_ICON_SCALE self.setTransparency(TransparencyAttrib.MAlpha) self.setPos(QuestGlobals.LEFT_GAG_SLOT_POS) self.info.hide() self.show()
def handleNPCObjective(self, iconElement=auxIcon, auxText=QuestGlobals.VISIT, frameColor=QuestGlobals.BROWN): objective = self.viewObjective npcId = 0 if self.accessibleObjectives.isComplete() and not hasattr( objective, 'npcId'): npcId = objective.assigner elif hasattr(objective, 'npcId'): npcId = objective.npcId if npcId == 0: infoText = 'A %s' % NPCGlobals.lHQOfficerF else: infoText = NPCGlobals.NPCToonNames[npcId] if not iconElement: iconElement = self.auxIcon # Let's generate the head. if not npcId == 0: dna = ToonDNA() dna.setDNAStrand(NPCGlobals.NPCToonDict.get(npcId)[2]) head = ToonGlobals.generateGuiHead(dna) self.handleComplexIcon(head, iconElement, scale=QuestGlobals.IMAGE_SCALE_SMALL - 0.01) else: self.handleSimpleIcon(QuestGlobals.getHQIcon(), QuestGlobals.SIMPLE_IMAGE_SCALE, iconElement) self.auxText['text'] = auxText if not iconElement is self.auxIcon: if hasattr(self, 'goalInfo'): # We're working with the second frame, on the right. # Let's update the information pertaining to this side. self.goalInfo['text'] = infoText self.goalInfo.setPos(QuestGlobals.RECOVER_INFO2_POS) self.auxText.setPos(QuestGlobals.RECOVER_AUX_POS) self.goalFrame['image_color'] = frameColor else: raise AttributeError( 'Attempted to setup DoubleFrame information for poster using default style.' ) else: self.objectiveInfo['text'] = infoText self.auxFrame['image_color'] = frameColor
def updateInfo(self): VisitNPCObjective.updateInfo(self, False, QuestGlobals.DELIVER, QuestGlobals.RED) scale = 0.12 if self.itemIcon.getName() == 'package' else 0.85 self.quest.setLeftIconGeom(self.itemIcon) self.quest.setLeftIconScale(scale) self.quest.setLeftPicturePos(QuestGlobals.RECOVER_LEFT_PICTURE_POS) if self.itemAmount > 1: self.quest.setInfoText( '%d %s' % (self.itemAmount, QuestGlobals.makePlural(self.itemName))) else: self.quest.setInfoText(self.itemName) self.quest.setInfoPos(QuestGlobals.RECOVER_INFO_POS) self.quest.setMiddleText(QuestGlobals.TO)
def __init__(self, npcId, itemName, itemAmount, assignDialog, location=None, itemIcon=QuestGlobals.getPackageIcon()): VisitNPCObjective.__init__(self, npcId, assignDialog, location) self.itemName = itemName self.itemAmount = itemAmount self.itemIcon = itemIcon if self.itemName in GagGlobals.gagIds.values(): self.itemIcon = loader.loadModel( 'phase_3.5/models/gui/inventory_icons.bam').find( '**/%s' % GagGlobals.InventoryIconByName[self.itemName])
def enter(self): BookPage.enter(self) positions = [(-0.45, 0.75, 0.3), (0.45, 0.75, 0.3), (-0.45, 0.75, -0.3), (0.45, 0.75, -0.3)] quests = base.localAvatar.questManager.quests.values() for i in range(4): quest = None if i < len(quests): quest = quests[i] poster = QuestGlobals.generatePoster(quest, parent=self.book) poster.setPos(positions[i]) poster.setScale(0.95) poster.show() self.posters.append(poster)
def handleCogBuildingObjective(self, iconElement=auxIcon, auxText=QuestGlobals.DEFEAT, frameColor=QuestGlobals.BLUE): objective = self.viewObjective infoText = objective.getTaskInfo() if not iconElement: iconElement = self.auxIcon # Let's make sure we have a current objective that is # an instance of the CogBuildingObjective class and this poster isn't destroyed. if not objective or not hasattr(self, 'titleLabel') or not isinstance( objective, CogBuildingObjective): return # If we aren't looking for any specific department of building. if objective.dept == QuestGlobals.Any: # Let's just use the good ol' generic building icon. self.handleSimpleIcon(QuestGlobals.getCogBuildingIcon(), QuestGlobals.SIMPLE_IMAGE_SCALE, iconElement) else: # Ah geez, we're looking for a specific department. # Bossbot tie names are messed up, so we need this if statement. dept = objective.dept.getTie( ) if not objective.dept == Dept.BOSS else 'corp' bldgMdl = loader.loadModel( 'phase_4/models/modules/suit_landmark_%s.bam' % dept) # Next, we need to load the building elevator. elevator = loader.loadModel('phase_4/models/modules/elevator.bam') elevator.reparentTo(bldgMdl.find('**/*_door_origin')) self.handleComplexIcon(bldgMdl, iconElement) # Let's set the progress bar text pgBarText = '%d of %d %s' % (objective.progress, objective.goal, CIGlobals.makePastTense(auxText)) self.progressBar['text'] = pgBarText self.objectiveInfo['text'] = infoText self.auxText['text'] = auxText self.auxFrame['image_color'] = Vec4(*frameColor)
def __init__(self, amount, itemName, assignDialog, location=None, itemIcon=QuestGlobals.getPackageIcon(), level=None, levelRange=None, name=None, variant=None, dept=None): CogObjective.__init__(self, location, assignDialog, amount, level=level, levelRange=levelRange, name=name, variant=variant, dept=dept) self.itemName = itemName self.itemIcon = itemIcon
def handleCogObjective(self, iconElement=auxIcon, auxText=QuestGlobals.DEFEAT, frameColor=QuestGlobals.BLUE): objective = self.viewObjective infoText = objective.getTaskInfo() if objective.__class__ == RecoverItemObjective: infoText = CIGlobals.makePlural(objective.cog) if not iconElement: iconElement = self.auxIcon # Let's make sure we have a current objective that is # an instance of the CogObjective class and this poster isn't destroyed. if not objective or not hasattr(self, 'titleLabel') or not isinstance( objective, CogObjective): return if objective.dept: icons = loader.loadModel('phase_3/models/gui/cog_icons.bam') deptIcon = None if objective.dept == Dept.BOSS: deptIcon = icons.find('**/CorpIcon') else: deptIcon = icons.find('**/%sIcon' % objective.dept.getTie().title()) # Correct the medallion color. deptIcon.setColor(SuitGlobals.medallionColors[objective.dept]) # Setup the icon and remove the icons node. self.handleSimpleIcon(deptIcon, 0.13, iconElement) icons.removeNode() elif objective.cog == QuestGlobals.Any: # We aren't fighting a Cog in particular. cogIcon = QuestGlobals.getCogIcon() self.handleSimpleIcon(cogIcon, 0.13, iconElement) # We're fighting a Cog in particular. if not objective.cog == QuestGlobals.Any: cogHeadInstance = SuitBank.getSuitByName(objective.cog).getHead() cogHead = cogHeadInstance.generate() cogHead.setName('%sHead' % CIGlobals.Suit) cogHead.setPythonTag('Settings', cogHeadInstance.head) cogHead.setScale(2) cogHead.setLightOff() self.handleComplexIcon(cogHead, iconElement) # HACK FIX: Corrects the buggy Flunky glasses. glasses = cogHead.find('**/glasses') if glasses and not glasses.isEmpty(): glasses.setScale(1) glasses.reparentTo(cogHead) if not iconElement is self.auxIcon: if hasattr(self, 'goalInfo'): # We're working with the second frame, on the right. # Let's update the information pertaining to this side. self.goalInfo['text'] = infoText self.goalInfo.setPos(QuestGlobals.RECOVER_INFO2_POS) self.auxText.setPos(QuestGlobals.RECOVER_AUX_POS) else: raise AttributeError( 'Attempted to setup DoubleFrame information for poster using default style.' ) else: self.objectiveInfo['text'] = infoText # Let's set the progress bar text pgBarText = '%d of %d %s' % (objective.progress, objective.goal, CIGlobals.makePastTense(auxText)) self.progressBar['text'] = pgBarText self.auxText['text'] = auxText # Let's set the color of the poster. frame = self.auxFrame if iconElement is self.auxIcon else self.goalFrame frame['image_color'] = Vec4(*frameColor)
def setup(self): if self.quest: objective = self.viewObjective complete = self.accessibleObjectives.isComplete() # Let's reset our positioning of elements. self.auxFrame.setPos(QuestGlobals.DEFAULT_LEFT_PICTURE_POS) self.auxText.setPos(QuestGlobals.DEFAULT_AUX_POS) self.objectiveInfo.setPos(QuestGlobals.DEFAULT_INFO_POS) # Let's reset our icon. self.auxIcon.setScale(1, 1, 1) self.auxIcon.setPos(0, 0, 0) self.auxIcon.setHpr(0, 0, 0) self.objectiveInfo.show() self.auxFrame.show() # Let's setup the quest progress bar progress = objective.progress if hasattr(objective, 'progress') else None if objective.goal > 1: self.progressBar['range'] = objective.goal self.progressBar['value'] = progress & pow(2, 16) - 1 if objective.HasProgress and objective.goal > 1 and not complete: self.progressBar.show() self.auxText.show() # Let's handle the objectives. if not complete: if objective.__class__ == CogObjective: self.handleCogObjective() elif objective.__class__ == CogBuildingObjective: self.handleCogBuildingObjective() elif objective.__class__ == MinigameObjective: self.handleMinigameObjective() elif objective.__class__ == VisitNPCObjective: self.handleNPCObjective() else: bgColor = QuestGlobals.RED if objective.type in DefeatObjectives: bgColor = QuestGlobals.BLUE self.handleNPCObjective(auxText=QuestGlobals.RETURN + ' to', frameColor=bgColor) self.lReward.setup() newLineInObjInfo = '\n' in self.objectiveInfo['text'] isShopLoc = QuestGlobals.isShopLocation( objective.area) if not complete else True if complete: locationText = QuestGlobals.getLocationText(None, objective) else: locationText = QuestGlobals.getLocationText(objective.area) self.locationInfo['text'] = locationText self.locationInfo['text_pos'] = (0.0, (0.025 if isShopLoc else ( -0.025 if newLineInObjInfo else 0.0))) self.locationInfo.show() else: # We want to be able to show empty quest posters. self.titleLabel.hide() self.auxFrame.hide() self.auxIcon.hide() self.titleLabel.initialiseoptions(DirectLabel) self.auxIcon.initialiseoptions(DirectFrame) self.auxText.initialiseoptions(DirectLabel) self.objectiveInfo.initialiseoptions(DirectLabel) self.locationInfo.initialiseoptions(DirectLabel) self.rewardFrame.initialiseoptions(DirectFrame) self.sideInfo.initialiseoptions(DirectLabel) self.lReward.initialiseoptions(DirectFrame) # Handle arrow stuff if necessary. if hasattr(self, 'prevObjArrow'): index = self.accessibleObjectives.seeker self.prevObjArrow['state'] = DGG.NORMAL self.nextObjArrow['state'] = DGG.NORMAL self.prevObjArrow.setPos(QuestGlobals.DEFAULT_LEFT_ARROW_POS) self.nextObjArrow.setPos(QuestGlobals.DEFAULT_RIGHT_ARROW_POS) if index == 0: self.prevObjArrow['state'] = DGG.DISABLED elif index == len(self.accessibleObjectives) - 1: self.nextObjArrow['state'] = DGG.DISABLED self.prevObjArrow.initialiseoptions(DirectButton) self.nextObjArrow.initialiseoptions(DirectButton)
def makePickableQuests(self, questList): self.doCameraNPCInteraction(True) quests = [] for questId in questList: quest = Quest(questId, base.localAvatar.questManager) quest.setupCurrentObjectiveFromData(-1, 0, None) quests.append(quest) positions = [(0, 0, 0.65), (0, 0, 0.1), (0, 0, -0.45)] self.questFrame = DirectFrame(relief=None, pos=(-0.8, 0, 0), geom=DGG.getDefaultDialogGeom(), geom_color=Vec4(0.8, 0.6, 0.4, 1), geom_scale=(1.85, 1, 0.9), geom_hpr=(0, 0, -90)) self.cancelBtn = DirectButton(text="Cancel", geom=CIGlobals.getDefaultBtnGeom(), geom_scale=(0.6, 0.75, 0.75), relief=None, parent=self.questFrame, pos=(0.2, 0, -0.8), text_scale=0.045, text_pos=(0, -0.015), scale=1.1, command=self.__cancelQuestPicker, extraArgs=[False]) self.timer = Timer() self.timer.load() self.timer.setScale(0.3) self.timer.reparentTo(self.questFrame) self.timer.setPos(-0.1, 0, -0.8) self.timer.setInitialTime(20) self.timer.setZeroCommand(self.__cancelQuestPicker) self.timer.startTiming() self.questPosters = [] self.questBtns = [] for i in xrange(len(quests)): poster = None quest = quests[i] poster = QuestGlobals.generatePoster(quest, parent=aspect2d) poster.setScale(0.85) poster.setPos(0, 0, 0) poster.progressBar.hide() self.questPosters.append(poster) # Let's setup the choose button. btn = DirectButton(geom=CIGlobals.getDefaultBtnGeom(), parent=poster, pos=(0.35, 0, 0.215), text='Choose', text_scale=0.08, text_pos=(0, -0.025), relief=None, command=self.d_pickedQuest, extraArgs=[quests[i]]) btn.setScale(0.4) btn.setBin('gui-popup', 60) btn.initialiseoptions(DirectButton) poster.reparentTo(self.questFrame.stateNodePath[0], 20) poster.setPos(positions[i]) poster.show() self.questBtns.append(btn)
def update(self): objective = self.quest.getCurrentObjective() objective.updateInfo() # Let's setup the quest info. self.questInfo.setPos(self.quest.getInfoPos()) self.questInfo['text'] = self.quest.getInfoText() self.questInfo02.setPos(self.quest.getInfo02Pos()) self.questInfo02['text'] = self.quest.getInfo02Text() # Let's move the picture frames to the positions we want them in. self.lPictureFrame.setPos(self.quest.getLeftPicturePos()) self.rPictureFrame.setPos(self.quest.getRightPicturePos()) editLeftAtr = isinstance(objective, VisitNPCObjective) or isinstance(objective, CogObjective) if editLeftAtr and objective.getDidEditLeft() or not editLeftAtr: geom = self.quest.getLeftIconGeom() scale = self.quest.getLeftIconScale() icon = self.lQuestIcon self.handleIcon(objective, geom, scale, icon) self.handleIcon(objective, self.quest.getRightIconGeom(), self.quest.getRightIconScale(), self.rQuestIcon) else: geom = self.quest.getRightIconGeom() scale = self.quest.getRightIconScale() icon = self.rQuestIcon self.handleIcon(objective, geom, scale, icon) self.handleIcon(objective, self.quest.getLeftIconGeom(), self.quest.getLeftIconScale(), self.lQuestIcon) if self.questInfo02['text'] == '': self.rPictureFrame.hide() self.questInfo02.hide() else: self.rPictureFrame.show() self.questInfo02.show() self.middleText['text'] = self.quest.getMiddleText() if not self.middleText['text'] == '': self.middleText.show() self.questInfo.show() self.lPictureFrame.show() # Let's set the location text. self.locationInfo['text'] = self.quest.getLocationText() self.locationInfo['text_pos'] = (0, self.quest.getLocationY()) self.locationInfo.show() # Let's set the progress bar up. self.questProgress['text'] = self.quest.getProgressText() if len(self.questProgress['text']) > 0 and not objective.finished(): self.questProgress.show() self.questProgress['range'] = objective.getNeededAmount() self.questProgress['value'] = objective.getProgress() & pow(2, 16) - 1 else: self.questProgress.hide() # Let's setup the aux text. self.auxText.setPos(self.quest.getAuxPos()) self.auxText['text'] = self.quest.getAuxText() self.auxText.show() maxHP = base.localAvatar.getMaxHealth() # Let's setup the rewards. for i in xrange(0, len(self.quest.getRewards())): reward = self.quest.getRewards()[i] frame = self.lRewardFrame if (i == 0) else self.rRewardFrame info = self.lRewardAmt if (i == 0) else self.rRewardAmt rType = reward.getType() if(rType == RewardType.JELLYBEANS): frame['pos'] = QuestGlobals.LEFT_JB_JAR_POS if (i == 0) else QuestGlobals.RIGHT_JB_JAR_POS frame['geom'] = QuestGlobals.getJBIcon() frame['geom_scale'] = QuestGlobals.JB_JAR_SCALE info['text'] = str(reward.getModifier()) elif(rType == RewardType.TELEPORT_ACCESS or rType == RewardType.GAG_FRAME): frame['pos'] = QuestGlobals.LEFT_TP_ACCESS_POS if(i == 0) else QuestGlobals.RIGHT_TP_ACCESS_POS frame['geom'] = QuestGlobals.getTPAccessIcon() if(rType == RewardType.TELEPORT_ACCESS) else QuestGlobals.getFilmIcon() frame['geom_scale'] = QuestGlobals.TP_ACCESS_SCALE info['text'] = 'N/A' if(rType == RewardType.TELEPORT_ACCESS) else '#%s' % (str(reward.getModifier())) elif(rType == RewardType.LAFF_POINTS): frame.initialiseoptions(DirectFrame) r, g, b, _ = base.localAvatar.getHeadColor() pos = QuestGlobals.LEFT_LAFF_METER_POS if(i == 0) else QuestGlobals.RIGHT_LAFF_METER_POS # Create the laff meter with the new health. hp = maxHP + reward.getModifier() laffMeter = LaffOMeter() laffMeter.generate(r, g, b, base.localAvatar.getAnimal(), maxHP = hp, initialHP = hp) # Let's position the laff meter. frame['geom'] = laffMeter frame['geom_scale'] = QuestGlobals.LAFF_METER_SCALE frame.setPos(pos) info['text'] = '+%s' % (str(reward.getModifier())) laffMeter.destroy() laffMeter = None # Hide or show the other reward depending on if there's 2 rewards. if(len(self.quest.getRewards()) == 1): self.rRewardFrame.hide() self.rRewardAmt.hide() else: self.rRewardFrame.show() self.rRewardAmt.show() if objective.finished(): self.setColor(Vec4(*QuestGlobals.LIGHT_GREEN)) self.sideInfo['text'] = 'Completed!' self.sideInfo.show() self.questInfo.initialiseoptions(DirectLabel) self.questInfo02.initialiseoptions(DirectLabel) self.locationInfo.initialiseoptions(DirectLabel) self.lPictureFrame.initialiseoptions(DirectFrame) self.rPictureFrame.initialiseoptions(DirectFrame) self.lQuestIcon.initialiseoptions(DirectFrame) self.rQuestIcon.initialiseoptions(DirectFrame) self.auxText.initialiseoptions(DirectLabel) self.middleText.initialiseoptions(DirectLabel) self.sideInfo.initialiseoptions(DirectLabel) self.lPictureFrame['image_color'] = self.quest.getPictureFrameColor() self.rPictureFrame['image_color'] = self.quest.getPictureFrameColor()
def __init__(self, quest, parent = aspect2d, **kw): self.quest = quest # Let's begin building the quest poster. bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui.bam') questCard = bookModel.find('**/questCard') optiondefs = (('relief', None, None), ('image', questCard, None), ('image_scale', (0.8, 1.0, 0.58), None), ('state', DGG.NORMAL, None)) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, relief = None) self.initialiseoptions(QuestPoster) self.questFrame = DirectFrame(parent = self, relief = None) # Quest title text self.headline = DirectLabel(parent = self.questFrame, relief = None, text = self.quest.getName(), text_font = CIGlobals.getMinnieFont(), text_fg = QuestGlobals.TEXT_COLOR, text_scale = 0.05, text_align = TextNode.ACenter, text_wordwrap = 25.0, textMayChange = 1, pos = (0, 0, 0.23)) # Quest information self.questInfo = DirectLabel(parent = self.questFrame, relief = None, text = '', text_font = CIGlobals.getToonFont(), text_fg = QuestGlobals.TEXT_COLOR, text_scale = 0.04, text_align = TextNode.ACenter, text_wordwrap = TEXT_WORDWRAP, textMayChange = 1, pos = (QuestGlobals.DEFAULT_INFO_POS)) self.questInfo.hide() self.questInfo02 = DirectLabel(parent = self.questFrame, relief = None, text = '', text_font = CIGlobals.getToonFont(), text_fg = QuestGlobals.TEXT_COLOR, text_scale = 0.04, text_align = TextNode.ACenter, text_wordwrap = TEXT_WORDWRAP, textMayChange = 1, pos = (QuestGlobals.DEFAULT_INFO2_POS)) self.questInfo02.hide() self.locationInfo = DirectLabel(parent = self.questFrame, relief = None, text = 'N/A', text_font = CIGlobals.getToonFont(), text_fg = QuestGlobals.TEXT_COLOR, text_scale = TEXT_SCALE, text_align = TextNode.ACenter, text_wordwrap = TEXT_WORDWRAP, textMayChange = 1, pos = (0, 0, -0.115)) self.locationInfo.hide() # C'mon Brian this one is obvious self.rewardText = DirectLabel(parent = self.questFrame, relief = None, text = '', text_fg = QuestGlobals.REWARD_RED, text_scale = 0.0425, text_align = TextNode.ALeft, text_wordwrap = 17.0, textMayChange = 1, pos = (-0.36, 0, -0.26)) self.rewardText.hide() self.lPictureFrame = DirectFrame(parent = self.questFrame, relief = None, image = bookModel.find('**/questPictureFrame'), image_scale = QuestGlobals.IMAGE_SCALE_SMALL, text = '', text_pos = (0, -0.11), text_fg = QuestGlobals.TEXT_COLOR, text_scale = TEXT_SCALE, text_align = TextNode.ACenter, text_wordwrap = 11.0, pos = (QuestGlobals.DEFAULT_LEFT_PICTURE_POS), textMayChange = 1) self.lPictureFrame.hide() self.rPictureFrame = DirectFrame(parent = self.questFrame, relief = None, image = bookModel.find('**/questPictureFrame'), image_scale = QuestGlobals.IMAGE_SCALE_SMALL, text = '', text_pos = (0, -0.11), text_fg = QuestGlobals.TEXT_COLOR, text_scale = TEXT_SCALE, text_align = TextNode.ACenter, text_wordwrap = 11.0, textMayChange = 1, pos = (QuestGlobals.DEFAULT_RIGHT_PICTURE_POS)) self.rPictureFrame['image_color'] = Vec4(*QuestGlobals.GREEN) self.rPictureFrame.hide() self.lQuestIcon = DirectFrame(parent = self.lPictureFrame, relief = None, text = ' ', text_font = CIGlobals.getSuitFont(), text_pos = (0, -0.03), text_fg = QuestGlobals.TEXT_COLOR, text_scale = 0.13, text_align = TextNode.ACenter, text_wordwrap = 13.0, textMayChange = 1) self.lQuestIcon.setColorOff(-1) self.rQuestIcon = DirectFrame(parent = self.rPictureFrame, relief = None, text = ' ', text_font = CIGlobals.getSuitFont(), text_pos = (0, -0.03), text_fg = QuestGlobals.TEXT_COLOR, text_scale = 0.13, text_align = TextNode.ACenter, text_wordwrap = 13.0, textMayChange = 1) self.rQuestIcon.setColorOff(-1) head = SuitBank.PennyPincher.getHead().generate() head.setDepthTest(True) head.setDepthWrite(True) head.setScale(0.25) for part in head.getChildren(): part.setDepthTest(True) part.setDepthWrite(True) self.fitGeometry(head, fFlip = 1) self.rQuestIcon['geom'] = head self.rQuestIcon['geom_scale'] = QuestGlobals.IMAGE_SCALE_SMALL self.rQuestIcon['geom_pos'] = Point3(0, 10, -0.05) self.rQuestIcon['geom_hpr'] = Point3(180, 0, 0) self.rQuestIcon.initialiseoptions(DirectFrame) self.auxText = DirectLabel(parent = self.questFrame, relief = None, text = 'Recover', text_font = CIGlobals.getToonFont(), text_scale = QuestGlobals.QPauxText, text_fg = QuestGlobals.TEXT_COLOR, text_align = TextNode.ACenter, pos = (QuestGlobals.DEFAULT_AUX_POS), textMayChange=1) self.auxText.hide() self.middleText = DirectLabel(parent = self.questFrame, relief = None, text = 'from:', text_font = CIGlobals.getToonFont(), text_scale = QuestGlobals.QPauxText, text_fg = QuestGlobals.TEXT_COLOR, text_align = TextNode.ACenter, pos = (QuestGlobals.DEFAULT_MIDDLE_POS), textMayChange=1) self.middleText.hide() self.questProgress = DirectWaitBar(parent = self.questFrame, relief = DGG.SUNKEN, frameSize=(-0.95, 0.95, -0.1, 0.12), borderWidth = (0.025, 0.025), scale = 0.2, frameColor = (0.945, 0.875, 0.706, 1.0), barColor=(0.5, 0.7, 0.5, 1), text='0/0', text_font = CIGlobals.getToonFont(), text_scale = 0.19, text_fg = (0.05, 0.14, 0.4, 1), text_align = TextNode.ACenter, text_pos = (0, -0.05), #-0.02 pos = (0, 0, -0.2425)) self.questProgress.hide() rewardFrameGeom = loader.loadModel('phase_4/models/gui/gag_shop_purchase_gui.bam') self.rewardFrame = DirectFrame(parent = self.questFrame, relief = None, geom = rewardFrameGeom.find('**/Goofys_Sign'), geom_scale = (0.615, 0, 0.4), pos = (-0.01, 0, -0.25) ) jellybeanJar = QuestGlobals.getFilmIcon() self.lRewardFrame = DirectFrame(parent = self.rewardFrame, relief = None, geom = jellybeanJar, geom_scale = QuestGlobals.TP_ACCESS_SCALE, sortOrder = 1, pos = (QuestGlobals.LEFT_TP_ACCESS_POS)) self.lRewardFrame.setBin('gui-popup', 30) self.lRewardAmt = DirectFrame(parent = self.questFrame, relief = None, geom = rewardFrameGeom.find('**/Char_Pnl'), geom_scale = (0.15, 0, 0.1275), text = '#1', text_font = CIGlobals.getToonFont(), text_scale = 0.04, text_fg = (0, 0, 0, 1), text_align = TextNode.ACenter, text_pos = (0, -0.01), sortOrder = 2, pos = (-0.285, 0, -0.255)) self.lRewardAmt.setBin('gui-popup', 40) self.rRewardFrame = DirectFrame(parent = self.rewardFrame, relief = None, geom = QuestGlobals.getJBIcon(), geom_scale = QuestGlobals.JB_JAR_SCALE, pos = QuestGlobals.RIGHT_JB_JAR_POS) self.rRewardAmt = DirectFrame(parent = self.questFrame, relief = None, geom = rewardFrameGeom.find('**/Char_Pnl'), geom_scale = (0.15, 0, 0.1275), text = '25', text_font = CIGlobals.getToonFont(), text_scale = 0.04, text_fg = (0, 0, 0, 1), text_align = TextNode.ACenter, text_pos = (0, -0.01), pos = (0.2725, 0, -0.255)) self.rRewardAmt.setBin('gui-popup', 40) rewardFrameGeom.removeNode() # This is the rotated text on the side. self.sideInfo = DirectLabel(parent = self.questFrame, relief = None, text = QuestGlobals.JUST_FOR_FUN, text_fg = (0.0, 0.439, 1.0, 1.0), text_shadow = (0, 0, 0, 1), pos = (-0.2825, 0, 0.2), scale = 0.03) self.sideInfo.setR(-30) self.sideInfo.hide() bookModel.removeNode() self.laffMeter = None self.hide() return
def generateQuestFromData(data): questId = Quests.values().index(data) questName = data.get(name) if name in data.keys() else None requirements = data.get( requirements) if requirements in data.keys() else [] tier = data.get(tier) if tier in data.keys() else -1 dataRewards = data.get(rewards) if rewards in data.keys() else {} dataObjectives = data.get( objectives) if objectives in data.keys() else None isFinalInTier = data.get( finalInTier) if finalInTier in data.keys() else False objectives = [] # We must have a name and objective for EVERY quest. if questName is None or dataObjectives is None: raise ValueError( 'Quest ID %s is not setup correctly! Make sure it has a name & OrderedDict of objectives!' % questId) return None # Let's generate the quest rewards. rewards = [] for rewardType, modifier in dataRewards.items(): rewards.append(QuestReward(rewardType, modifier)) # Here comes the hard part, loading the objectives... for objType, objArgs in dataObjectives.items(): requiredObjArgs = ['location', 'assigner'] location = objArgs.get( 'location') if 'location' in objArgs.keys() else None assigner = objArgs.get( 'assigner') if 'assigner' in objArgs.keys() else [] objective = None # This variable is for item tasks. itemName = '' itemIcon = None if objType.__class__ == DeliverItemObjective or objType.__class__ == RecoverItemObjective: itemName = objArgs.get( 'itemName') if 'itemName' in objArgs.keys() else '' itemIcon = objArgs.get('itemIcon') if 'itemIcon' in objArgs.keys( ) else QuestGlobals.getPackageIcon() requiredObjArgs.append('itemName') # We don't require a location for the VisitNPCObjective, # however, we need an NPC id if isinstance(objType, VisitNPCObjective): npcId = objArgs.get('npcId') if 'npcId' in objArgs.keys() else None requiredObjArgs.append('npcId') if objType.__class__ == VisitNPCObjective: objective = VisitNPCObjective(npcId, assigner, location) elif objType.__class__ == DeliverItemObjective: amount = objArgs.get( 'amount') if 'amount' in objArgs.keys() else 0 objective = DeliverItemObjective(npcId, itemName, amount, assigner, location, itemIcon) # We need an amount for the CogObjective if isinstance(objType, CogObjective): amount = objArgs.get('amount') if 'amount' in objArgs.keys() else 0 level = objArgs.get('level') if 'level' in objArgs.keys() else None levelRange = objArgs.get( 'levelRange') if 'levelRange' in objArgs.keys() else None name = objArgs.get('name') if 'name' in objArgs.keys() else None variant = objArgs.get( 'variant') if 'variant' in objArgs.keys() else None dept = objArgs.get('dept') if 'dept' in objArgs.keys() else None requiredObjArgs.append('amount') if objType.__class__ == CogObjective: objective = CogObjective(location, assigner, amount, level, levelRange, name, variant, dept) elif objType.__class__ == RecoverItemObjective: objective = RecoverItemObjective(amount, itemName, assigner, location, itemIcon, level, levelRange, name, variant, dept) # Objective variables other than the required ones can be specified here. for parameter, argument in objArgs.items(): if not parameter in requiredObjArgs: if objective.hasattr(objective, parameter): objective.setattr(objective, parameter, argument) else: raise ValueError( 'Objective type %s does not have a declared variable named "%s"' % (objective.__class__.__name__, parameter)) break if not objective is None: objectives.append(objective) else: raise ValueError( 'Objective type %s has not been registered inside of QuestBank #generateQuestFromData()' % objType.__class__.__name__) if len(objectives) == len(objType.keys()): return Quest(name, requirements, tier, questId, rewards, objectives, isFinalInTier=isFinalInTier) return None
def updateInfo(self, leftFrame = True, auxText = QuestGlobals.DEFEAT, frameColor = QuestGlobals.BLUE): Objective.updateInfo(self) self.didEditLeft = leftFrame if self.neededAmount > 1: infoText = str(self.neededAmount) elif not self.name: infoText = 'A' else: infoText = '' if self.level: infoText = str('%s Level %s' % (infoText, str(self.level))) elif self.levelRange: infoText = str('%s Level %s+' % (infoText, str(self.levelRange[0]))) if self.variant: variantText = CIGlobals.Skelesuit if self.neededAmount > 1: variantText = QuestGlobals.makePlural(variantText) infoText = str('%s %s' % (infoText, self.variant if self.neededAmount == 1 else QuestGlobals.makePlural(variantText))) if self.dept: deptName = self.dept.getName() if self.neededAmount == 1 else QuestGlobals.makePlural(self.dept.getName()) infoText = str('%s %s' % (infoText, deptName)) icons = loader.loadModel('phase_3/models/gui/cog_icons.bam') if self.dept == Dept.BOSS: icon = icons.find('**/CorpIcon') else: icon = icons.find('**/%sIcon' % self.dept.getTie().title()) icon.setColor(SuitGlobals.medallionColors[self.dept]) if leftFrame: self.quest.setLeftIconGeom(icon) self.quest.setLeftIconScale(0.13) else: self.quest.setRightIconGeom(icon) self.quest.setRightIconScale(0.13) icons.removeNode() elif not self.name: # Let's load up the general Cogs picture. icon = QuestGlobals.getCogIcon() if leftFrame: self.quest.setLeftIconGeom(icon) self.quest.setLeftIconScale(icon.getScale()) else: self.quest.setRightIconGeom(icon) self.quest.setRightIconScale(icon.getScale()) text = CIGlobals.Suit if self.neededAmount == 1 else CIGlobals.Suits infoText = str('%s %s' % (infoText, text)) if self.name: nameText = self.name if self.neededAmount > 1: nameText = QuestGlobals.makePlural(self.name) infoText = str('%s %s' % (infoText, nameText)) # Let's load up the head. head = SuitBank.getSuitByName(self.name).getHead().generate() head.setName('%sHead' % CIGlobals.Suit) head.setScale(2) head.setH(180) if leftFrame: self.quest.setLeftIconGeom(head) else: self.quest.setRightIconGeom(head) if leftFrame: self.quest.setInfoText(infoText) self.quest.setAuxText(auxText) else: self.quest.setInfo02Text(infoText) self.quest.setInfo02Pos(QuestGlobals.RECOVER_INFO2_POS) self.quest.setRightPicturePos(QuestGlobals.DEFAULT_RIGHT_PICTURE_POS) self.quest.setProgressText('%s of %s %s' % (self.amount, self.neededAmount, QuestGlobals.makePastTense(auxText).lower())) self.quest.setPictureFrameColor(frameColor)