class ShopWindow(DirectFrame): def __init__(self, shop, image): DirectFrame.__init__(self) self.shop = shop self.bgImage = image self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.nPage = -1 self.nPages = 0 self.nextPage = 0 self.prevPage = -1 self.pages = [] self.isSetup = False return def setup(self, title = 'CHOOSE WHAT YOU WANT TO BUY'): font = CIGlobals.getMickeyFont() txtFg = (0, 0, 0, 1) txtScale = 0.05 txtPos = (0, -0.1) buttons = loader.loadModel('phase_3.5/models/gui/QT_buttons.bam') self.window = OnscreenImage(image=self.bgImage, scale=(0.9, 1, 0.7), parent=self) self.title = DirectLabel(text=title, relief=None, pos=(0, 0, 0.5), text_wordwrap=10, text_font=font, text_fg=(1, 1, 0, 1), scale=0.1, parent=self) self.infoLbl = DirectLabel(text='Welcome!', relief=None, text_scale=0.075, text_fg=txtFg, text_shadow=(0, 0, 0, 0), pos=(0, 0, 0.215)) self.okBtn = DirectButton(geom=CIGlobals.getOkayBtnGeom(), relief=None, text='OK', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(-0.1, 0, -0.5), parent=self) self.clBtn = DirectButton(geom=CIGlobals.getCancelBtnGeom(), relief=None, text='Cancel', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(0.1, 0, -0.5), parent=self) buttonGeom = (buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back')) self.backBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(-0.3, 0, -0.25), parent=self, command=self.changePage, extraArgs=[0]) self.nextBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(0.3, 0, -0.25), hpr=(0, 0, 180), command=self.changePage, extraArgs=[1], parent=self) self.hideInfo() return def changePage(self, direction): var = self.prevPage if direction == 1: var = self.nextPage self.setPage(var) def __makeGagEntry(self, pos, item, values, page): itemImage = values.get('image') button = DirectButton(geom=itemImage, scale=1.3, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item]) supply = base.localAvatar.getBackpack().getSupply(item().getName()) maxSupply = base.localAvatar.getBackpack().getMaxSupply(item().getName()) buttonLabel = DirectLabel(text='%s/%s\n%s JBS' % (str(supply), str(maxSupply), str(values.get('price'))), relief=None, parent=button, text_scale=0.05, pos=(0, 0, -0.11)) self.addEntryToPage(page, item, values, button, buttonLabel) return def __makeUpgradeEntry(self, pos, item, values, page): itemImage = values.get('image') button = DirectButton(image=itemImage, scale=0.15, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item]) button.setTransparency(TransparencyAttrib.MAlpha) upgradeID = values.get('upgradeID') supply = base.localAvatar.getPUInventory()[0] if supply < 0: supply = 0 maxSupply = values.get('maxUpgrades') if upgradeID == 0 and base.localAvatar.getMyBattle().getTurretManager().myTurret: supply = 1 buttonLabel = DirectLabel(text='%s\n%s/%s\n%s JBS' % (item, str(supply), str(maxSupply), str(values.get('price'))), relief=None, parent=button, text_scale=0.3, pos=(0, 0, -1.2)) self.addEntryToPage(page, item, values, button, buttonLabel) return def __makeHealEntry(self, pos, item, values, page): label = '%s' % item itemImage = values.get('image') if 'showTitle' in values: label = '%s\n%s JBS' % (item, values.get('price')) button = DirectButton(image=itemImage, scale=0.105, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item]) button.setTransparency(TransparencyAttrib.MAlpha) buttonLabel = DirectLabel(text=label, relief=None, parent=button, text_scale=0.55, pos=(0, 0, -1.6)) self.addEntryToPage(page, item, values, button, buttonLabel) return def addEntryToPage(self, page, item, values, button, buttonLabel): page.addItemEntry(item, [button, buttonLabel]) page.addItem({item: values}) def makePages(self, items): newItems = dict(items) loadout = [] for slot in base.localAvatar.getBackpack().gagGUI.getSlots(): loadout.append(slot.getGag().getID()) for item, values in newItems.items(): if values.get('type') == ItemType.GAG: gag = item() if gag.getID() not in loadout or not base.localAvatar.getBackpack().isInBackpack(gag.getName()): del newItems[item] self.nPages = int(len(newItems) / 4) if self.nPages % 4 != 0 and len(newItems) > 4: self.nPages += 1 elif self.nPages == 0: self.nPages = 1 itemPos = [(-0.45, 0, 0), (-0.15, 0, 0), (0.15, 0, 0), (0.45, 0, 0)] pageIndex = 0 itemIndex = 0 index = 1 for _ in range(self.nPages): page = Page(self.shop, self) self.pages.append(page) for item, values in newItems.iteritems(): pos = itemPos[itemIndex] page = self.pages[pageIndex] itemType = values.get('type') if itemType == ItemType.GAG: self.__makeGagEntry(pos, item, values, page) elif itemType == ItemType.UPGRADE: self.__makeUpgradeEntry(pos, item, values, page) elif itemType == ItemType.HEAL: self.__makeHealEntry(pos, item, values, page) if index % 4 == 0: index = 1 pageIndex += 1 itemIndex = 0 else: itemIndex = itemIndex + 1 index += 1 if self.nPages == 1: self.backBtn.hide() self.nextBtn.hide() for page in self.pages: page.hide() page.update() self.isSetup = True def updatePages(self): for page in self.pages: page.update() def setPage(self, page): if self.nPage > -1: self.pages[self.nPage].hide() self.setBackBtn(True) self.setNextBtn(True) if page - 1 < 0: self.setBackBtn(False) elif page + 1 == self.nPages: self.setNextBtn(False) if page < 0 or page > self.nPages: return self.prevPage = page - 1 self.nextPage = page + 1 self.nPage = page self.pages[page].show() def setBackBtn(self, enabled): if self.backBtn: if enabled == False: self.backBtn.setColorScale(GRAYED_OUT_COLOR) self.backBtn['state'] = DGG.DISABLED else: self.backBtn.setColorScale(NORMAL_COLOR) self.backBtn['state'] = DGG.NORMAL def setNextBtn(self, enabled): if self.nextBtn: if enabled == False: self.nextBtn.setColorScale(GRAYED_OUT_COLOR) self.nextBtn['state'] = DGG.DISABLED else: self.nextBtn.setColorScale(NORMAL_COLOR) self.nextBtn['state'] = DGG.NORMAL def setOKCommand(self, command): if self.okBtn: self.okBtn['command'] = command def setCancelCommand(self, command): if self.clBtn: self.clBtn['command'] = command def showInfo(self, text, negative = 0, duration = -1): self.infoLbl.show() if negative: self.infoLbl['text_fg'] = (0.9, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 1) else: self.infoLbl['text_fg'] = (0, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 0) self.infoLbl['text'] = text if duration > -1: Sequence(Wait(duration), Func(self.hideInfo)).start() def hideInfo(self): if self.infoLbl: self.infoLbl.hide() def delete(self): elements = [self.title, self.okBtn, self.clBtn, self.infoLbl, self.backBtn, self.nextBtn] for element in elements: element.destroy() del elements for page in self.pages: page.destroy() self.pages.remove(page) self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.backBtn = None self.nextBtn = None self.bgImage = None if self.window: self.window.destroy() self.window = None self.destroy() return
class ShopWindow(DirectFrame): def __init__(self, shop, image, wantTurretCount): DirectFrame.__init__(self) self.shop = shop self.wantTurretCount = wantTurretCount self.bgImage = image self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.turretLabel = None self.turretImg = None self.nPage = -1 self.nPages = 0 self.nextPage = 0 self.prevPage = -1 self.pages = [] self.isSetup = False self.turretCount = 0 def setup(self, title='CHOOSE WHAT YOU WANT TO BUY'): font = CIGlobals.getMickeyFont() txtFg = (0, 0, 0, 1) txtScale = 0.05 txtPos = (0, -0.1) buttons = loader.loadModel('phase_3.5/models/gui/QT_buttons.bam') self.window = OnscreenImage(image=self.bgImage, scale=(0.9, 1, 0.7), parent=self) self.title = DirectLabel(text=title, relief=None, pos=(0, 0, 0.5), text_wordwrap=10, text_font=font, text_fg=(1, 1, 0, 1), scale=0.1, parent=self) # Let's update the turret count. self.updateTurretCount() self.infoLbl = DirectLabel(text='Welcome!', relief=None, text_scale=0.075, text_fg=txtFg, text_shadow=(0, 0, 0, 0), pos=(0, 0, 0.215)) self.okBtn = DirectButton(geom=CIGlobals.getOkayBtnGeom(), relief=None, text='OK', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(-0.1, 0, -0.5), parent=self) self.clBtn = DirectButton(geom=CIGlobals.getCancelBtnGeom(), relief=None, text='Cancel', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(0.1, 0, -0.5), parent=self) buttonGeom = (buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back')) self.backBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(-0.3, 0, -0.25), parent=self, command=self.changePage, extraArgs=[0]) self.nextBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(0.3, 0, -0.25), hpr=(0, 0, 180), command=self.changePage, extraArgs=[1], parent=self) self.hideInfo() def setTurrets(self, amount): if self.shop.upgradesPurchased: amount += 1 self.turretCount = amount self.updatePages() def updateTurretCount(self): if self.turretLabel: self.turretLabel.destroy() if self.wantTurretCount: maxTurrets = CogBattleGlobals.MAX_TURRETS if not self.turretImg: self.turretImg = OnscreenImage( image="phase_3.5/maps/cannon-icon.png", scale=(0.05, 1, 0.05), pos=(-0.22, 0, 0.275)) self.turretImg.setTransparency(TransparencyAttrib.MAlpha) self.turretLabel = DirectLabel( text='Turrets: %s/%s' % (str(self.turretCount), str(maxTurrets)), relief=None, text_scale=0.07, text_fg=(0, 0, 0, 1), text_shadow=(0, 0, 0, 0), pos=(0, 0, 0.265)) def changePage(self, direction): var = self.prevPage if direction == 1: var = self.nextPage self.setPage(var) def __makeGagEntry(self, pos, item, values, page): itemImage = values.get('image') button = DirectButton(geom=(itemImage), scale=1.3, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item, page]) supply = base.localAvatar.getBackpack().getSupply(item().getName()) maxSupply = base.localAvatar.getBackpack().getMaxSupply( item().getName()) buttonLabel = DirectLabel( text='%s/%s\n%s JBS' % (str(supply), str(maxSupply), str(values.get('price'))), relief=None, parent=button, text_scale=0.05, pos=(0, 0, -0.11)) self.addEntryToPage(page, item, values, button, buttonLabel) def __makeUpgradeEntry(self, pos, item, values, page): itemImage = values.get('image') button = DirectButton(image=(itemImage), scale=0.15, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item, page]) button.setTransparency(TransparencyAttrib.MAlpha) upgradeID = values.get('upgradeID') avID = base.localAvatar.getPUInventory()[1] supply = 0 battle = base.localAvatar.getMyBattle() if battle and battle.getTurretManager(): turret = battle.getTurretManager().getTurret() if turret and turret.getGagID() == upgradeID: supply = 1 if avID == upgradeID: dataSupply = base.localAvatar.getPUInventory()[0] if dataSupply > 0: supply = dataSupply maxSupply = values.get('maxUpgrades') buttonLabel = DirectLabel( text='%s\n%s/%s\n%s JBS' % (item, str(supply), str(maxSupply), str(values.get('price'))), relief=None, parent=button, text_scale=0.3, pos=(0, 0, -1.2)) self.addEntryToPage(page, item, values, button, buttonLabel) def __makeHealEntry(self, pos, item, values, page): label = '%s' % (item) itemImage = values.get('image') if 'showTitle' in values: label = '%s\n%s JBS' % (item, values.get('price')) button = DirectButton(image=(itemImage), scale=0.105, pos=pos, relief=None, parent=page, command=self.shop.purchaseItem, extraArgs=[item, page]) button.setTransparency(TransparencyAttrib.MAlpha) buttonLabel = DirectLabel(text=label, relief=None, parent=button, text_scale=0.55, pos=(0, 0, -1.6)) self.addEntryToPage(page, item, values, button, buttonLabel) def addEntryToPage(self, page, item, values, button, buttonLabel): page.addItemEntry(item, [button, buttonLabel]) page.addItem({item: values}) def makePages(self, items): newItems = dict(items) loadout = base.localAvatar.getBackpack().getLoadoutInIds() # Let's show the loadout gags first in a full shop. if self.shop.wantFullShop: crcGags = OrderedDict(newItems) for item, values in newItems.items(): if values.get('type') == ItemType.GAG: gag = item() hasGag = base.localAvatar.getBackpack().hasGag(gag.getID()) if gag.getID() not in loadout or not hasGag: del crcGags[item] if not hasGag: del newItems[item] else: del newItems[item] # Let's add back the other gags. crcGags.update(newItems) newItems = crcGags print len(newItems) else: for item, values in newItems.items(): if values.get('type') == ItemType.GAG: gag = item() if gag.getID( ) not in loadout or not base.localAvatar.getBackpack( ).hasGag(gag.getID()): del newItems[item] self.nPages = int(math.ceil((float(len(newItems)) / float(4)))) if self.nPages % 4 != 0 and len(newItems) > 4: self.nPages += 1 elif self.nPages == 0: self.nPages = 1 itemPos = [(-0.45, 0, 0), (-0.15, 0, 0), (0.15, 0, 0), (0.45, 0, 0)] pageIndex = 0 itemIndex = 0 index = 0 for _ in range(self.nPages): page = Page(self.shop, self) self.pages.append(page) for item, values in newItems.iteritems(): pos = itemPos[itemIndex] page = self.pages[pageIndex] itemType = values.get('type') if itemType == ItemType.GAG: self.__makeGagEntry(pos, item, values, page) elif itemType == ItemType.UPGRADE: self.__makeUpgradeEntry(pos, item, values, page) elif itemType == ItemType.HEAL: self.__makeHealEntry(pos, item, values, page) if index == 3: pageIndex += 1 itemIndex = 0 index = 0 else: itemIndex += 1 index += 1 if self.nPages == 1: self.backBtn.hide() self.nextBtn.hide() for page in self.pages: if len(page.getItems()) == 0: page.destroy() self.pages.remove(page) else: page.hide() page.update() self.nPages = len(self.pages) self.isSetup = True def updatePage(self, page): battle = base.localAvatar.getMyBattle() if battle and self.wantTurretCount: self.shop.distShop.sendUpdate('requestTurretCount', []) self.updateTurretCount() page.update() def updatePages(self): battle = base.localAvatar.getMyBattle() if battle and self.wantTurretCount: self.shop.distShop.sendUpdate('requestTurretCount', []) self.updateTurretCount() for page in self.pages: page.update() def setPage(self, page): if self.nPage > -1: self.pages[self.nPage].hide() self.setBackBtn(True) self.setNextBtn(True) if (page - 1) < 0: self.setBackBtn(False) elif (page + 1) == self.nPages: self.setNextBtn(False) if page < 0 or page > self.nPages: return self.prevPage = (page - 1) self.nextPage = (page + 1) self.nPage = page self.pages[page].show() def getPage(self, index): return self.pages[index] def setBackBtn(self, enabled): if self.backBtn: if enabled == False: self.backBtn.setColorScale(GRAYED_OUT_COLOR) self.backBtn['state'] = DGG.DISABLED else: self.backBtn.setColorScale(NORMAL_COLOR) self.backBtn['state'] = DGG.NORMAL def setNextBtn(self, enabled): if self.nextBtn: if enabled == False: self.nextBtn.setColorScale(GRAYED_OUT_COLOR) self.nextBtn['state'] = DGG.DISABLED else: self.nextBtn.setColorScale(NORMAL_COLOR) self.nextBtn['state'] = DGG.NORMAL def setOKCommand(self, command): if self.okBtn: self.okBtn['command'] = command def setCancelCommand(self, command): if self.clBtn: self.clBtn['command'] = command def showInfo(self, text, negative=0, duration=-1): self.infoLbl.show() if negative: self.infoLbl['text_fg'] = (0.9, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 1) else: self.infoLbl['text_fg'] = (0, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 0) self.infoLbl['text'] = text if duration > -1: Sequence(Wait(duration), Func(self.hideInfo)).start() def hideInfo(self): if self.infoLbl: self.infoLbl.hide() def delete(self): elements = [ self.title, self.okBtn, self.clBtn, self.infoLbl, self.backBtn, self.nextBtn, self.turretLabel, self.turretImg ] for element in elements: if element: element.destroy() del elements for page in self.pages: page.destroy() self.pages.remove(page) self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.backBtn = None self.nextBtn = None self.bgImage = None self.turretLabel = None self.turretCount = None if self.window: self.window.destroy() self.window = None self.destroy()
class LaffMeter(DirectFrame): deathColor = Vec4(0.58039216, 0.80392157, 0.34117647, 1.0) def __init__(self, avdna, hp, maxHp, isLocalHealth=False): DirectFrame.__init__(self, relief=None, sortOrder=50) self.initialiseoptions(LaffMeter) self.style = avdna self.av = None self.hp = hp self.maxHp = maxHp self.__obscured = 0 self.isLocalHealth = isLocalHealth self.container = DirectFrame(parent=self, relief=None) if self.style.type == 't': self.isToon = 1 else: self.isToon = 0 self.load() def showGags(self): self.showDetailsButton['command'] = self.backToDetails self.gagsBtn.hide() self.toontasksButton.hide() messenger.send('home') self.accept('home-up', self.backToDetails) self.accept('end-up', self.backToDetails) def showTasks(self): self.showDetailsButton['command'] = self.backToDetails self.gagsBtn.hide() self.toontasksButton.hide() messenger.send('end') self.accept('home-up', self.backToDetails) self.accept('end-up', self.backToDetails) def backToDetails(self): self.showDetailsButton['command'] = self.hideDetailsPopup self.gagsBtn.show() self.toontasksButton.show() self.ignore('home-up') self.ignore('end-up') messenger.send('home-up') messenger.send('end-up') def showDetailsPopup(self): self.showDetailsButton.setColorScale(1, 1, 1, 1) gagicnmodel = loader.loadModel('phase_3.5/models/gui/inventory_icons') gagicon = gagicnmodel.find('**/inventory_tart') gagicnmodel.removeNode() self.gagsBtn = DirectButton(parent=aspect2d, relief=None, pos=(-0.4, 0, 0), text_style=3, text_pos=(0, -0.3), text_scale=0.08, text=TTLocalizer.InventoryPageTitle, geom=gagicon, geom_scale=2, scale=1, command=self.showGags) tasksicnmodel = loader.loadModel( 'phase_3.5/models/gui/stickerbook_gui') tasksicon = tasksicnmodel.find('**/questCard') tasksicnmodel.removeNode() self.toontasksButton = DirectButton( parent=aspect2d, relief=None, pos=(0.4, 0, 0), text_style=3, text_pos=(0, -0.3), text_scale=0.08, text=TTLocalizer.QuestPageToonTasks, geom=tasksicon, geom_scale=0.35, scale=1, command=self.showTasks) self.backToDetails() def hideDetailsPopup(self): self.showDetailsButton.setColorScale(1, 1, 1, 0) messenger.send('home-up') messenger.send('end-up') self.gagsBtn.destroy() self.toontasksButton.destroy() self.showDetailsButton['command'] = self.showDetailsPopup def obscure(self, obscured): self.__obscured = obscured if self.__obscured: self.hide() base.localAvatar.expBar.hide() def isObscured(self): return self.__obscured def load(self): gui = loader.loadModel('phase_3/models/gui/laff_o_meter') if self.isToon: hType = self.style.getType() if hType == 'dog': headModel = gui.find('**/doghead') elif hType == 'cat': headModel = gui.find('**/cathead') elif hType == 'mouse': headModel = gui.find('**/mousehead') elif hType == 'horse': headModel = gui.find('**/horsehead') elif hType == 'rabbit': headModel = gui.find('**/bunnyhead') elif hType == 'duck': headModel = gui.find('**/duckhead') elif hType == 'monkey': headModel = gui.find('**/monkeyhead') elif hType == 'bear': headModel = gui.find('**/bearhead') elif hType == 'pig': headModel = gui.find('**/pighead') elif hType == 'deer': headModel = gui.find('**/deerhead') else: raise StandardError('unknown toon species: ', hType) self.color = self.style.getHeadColor() self.container['image'] = headModel self.container['image_color'] = self.color self.resetFrameSize() self.setScale(0.1) self.frown = DirectFrame(parent=self.container, relief=None, image=gui.find('**/frown')) self.frown.setY(-0.1) self.smile = DirectFrame(parent=self.container, relief=None, image=gui.find('**/smile')) self.smile.setY(-0.1) self.eyes = DirectFrame(parent=self.container, relief=None, image=gui.find('**/eyes')) self.eyes.setY(-0.1) self.openSmile = DirectFrame(parent=self.container, relief=None, image=gui.find('**/open_smile')) self.tooth1 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_1')) self.tooth2 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_2')) self.tooth3 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_3')) self.tooth4 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_4')) self.tooth5 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_5')) self.tooth6 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_6')) self.maxLabel = DirectLabel( parent=self.eyes, relief=None, pos=(0.442, 0, 0.051), text='120', text_scale=0.4, text_font=ToontownGlobals.getInterfaceFont()) self.maxLabel.setY(-0.1) self.hpLabel = DirectLabel( parent=self.eyes, relief=None, pos=(-0.398, 0, 0.051), text='120', text_scale=0.4, text_font=ToontownGlobals.getInterfaceFont()) self.hpLabel.setY(-0.1) self.teeth = [ self.tooth6, self.tooth5, self.tooth4, self.tooth3, self.tooth2, self.tooth1 ] for tooth in self.teeth: tooth.setY(-0.1) self.fractions = [0.0, 0.166666, 0.333333, 0.5, 0.666666, 0.833333] if self.isLocalHealth: self.showDetailsButton = DirectButton( relief=None, parent=self.container, image='phase_3/maps/android/tui_move_l.png', scale=1, command=self.showDetailsPopup) self.showDetailsButton.setTransparency(1) self.showDetailsButton.setColorScale(1, 1, 1, 0) gui.removeNode() def destroy(self): if self.av: ToontownIntervals.cleanup( self.av.uniqueName('laffMeterBoing') + '-' + str(self.this)) ToontownIntervals.cleanup( self.av.uniqueName('laffMeterBoing') + '-' + str(self.this) + '-play') self.ignore(self.av.uniqueName('hpChange')) del self.style del self.av del self.hp del self.maxHp if self.isToon: del self.frown del self.smile del self.openSmile del self.tooth1 del self.tooth2 del self.tooth3 del self.tooth4 del self.tooth5 del self.tooth6 del self.teeth del self.fractions del self.maxLabel del self.hpLabel DirectFrame.destroy(self) def adjustTeeth(self): if self.isToon: for i in xrange(len(self.teeth)): if self.hp > self.maxHp * self.fractions[i]: self.teeth[i].show() else: self.teeth[i].hide() def adjustText(self): if self.isToon: if self.maxLabel['text'] != str( self.maxHp) or self.hpLabel['text'] != str(self.hp): self.maxLabel['text'] = str(self.maxHp) self.hpLabel['text'] = str(self.hp) def animatedEffect(self, delta): if delta == 0 or self.av == None: return name = self.av.uniqueName('laffMeterBoing') + '-' + str(self.this) ToontownIntervals.cleanup(name) if delta > 0: ToontownIntervals.start( ToontownIntervals.getPulseLargerIval(self.container, name)) else: ToontownIntervals.start( ToontownIntervals.getPulseSmallerIval(self.container, name)) def adjustFace(self, hp, maxHp, quietly=0): if self.isToon and self.hp != None: self.frown.hide() self.smile.hide() self.openSmile.hide() self.eyes.hide() for tooth in self.teeth: tooth.hide() delta = hp - self.hp self.hp = hp self.maxHp = maxHp if self.hp < 1: self.frown.show() self.container['image_color'] = self.deathColor elif self.hp >= self.maxHp: self.smile.show() self.eyes.show() self.container['image_color'] = self.color else: self.openSmile.show() self.eyes.show() self.maxLabel.show() self.hpLabel.show() self.container['image_color'] = self.color self.adjustTeeth() self.adjustText() if not quietly: self.animatedEffect(delta) def start(self): if self.av: self.hp = self.av.hp self.maxHp = self.av.maxHp if self.isToon: if not self.__obscured: self.show() self.adjustFace(self.hp, self.maxHp, 1) if self.av: self.accept(self.av.uniqueName('hpChange'), self.adjustFace) def stop(self): if self.isToon: self.hide() if self.av: self.ignore(self.av.uniqueName('hpChange')) def setAvatar(self, av): if self.av: self.ignore(self.av.uniqueName('hpChange')) self.av = av
class ShopWindow(OnscreenImage): def __init__(self, shop, image): OnscreenImage.__init__(self, image = image, scale = (0.9, 1, 0.7)) self.shop = shop self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.nPage = -1 self.nPages = 0 self.nextPage = 1 self.prevPage = 0 self.pages = [] self.isSetup = False def setup(self, title = 'CHOOSE WHAT YOU WANT TO BUY'): font = CIGlobals.getMickeyFont() txtFg = (0, 0, 0, 1) txtScale = 0.05 txtPos = (0, -0.1) buttons = loader.loadModel('phase_3.5/models/gui/QT_buttons.bam') self.title = DirectLabel(text = title, relief = None, pos = (0, 0, 0.5), text_wordwrap = 10, text_font = font, text_fg = (1, 1, 0, 1), scale = 0.1, parent = self) self.infoLbl = DirectLabel(text = 'Welcome!', relief = None, text_scale = 0.075, text_fg = txtFg, text_shadow = (0, 0, 0, 1), pos = (0, 0, 0.225)) self.okBtn = DirectButton(geom = CIGlobals.getOkayBtnGeom(), relief = None, text = 'OK', text_fg = txtFg, text_scale = txtScale, text_pos = txtPos, pos = (-0.1, 0, -0.5), parent = self) self.clBtn = DirectButton(geom = CIGlobals.getCancelBtnGeom(), relief = None, text = 'Cancel', text_fg = txtFg, text_scale = txtScale, text_pos = txtPos, pos = (0.1, 0, -0.5), parent = self) buttonGeom = (buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back')) self.backBtn = DirectButton(geom = buttonGeom, relief = None, scale = 0.05, pos = (-0.3, 0, -0.25), parent = self, command = self.setPage, extraArgs = [self.prevPage]) self.nextBtn = DirectButton(geom = buttonGeom, relief = None, scale = 0.05, pos = (0.3, 0, -0.25), hpr = (0, 0, 180), command = self.setPage, extraArgs = [self.nextPage], parent = self) self.hideInfo() def makePages(self, items): if self.isSetup: return self.nPages = int(math.ceil((len(items) / 4))) print "%s pages are needed." % (self.nPages) if len(items) % 4 != 0: self.nPages += 1 itemPos = [(-0.45, 0, 0), (-0.15, 0, 0), (0.15, 0, 0), (0.45, 0, 0)] pageIndex = 0 itemIndex = 0 index = 1 for _ in range(self.nPages): page = Page(self) self.pages.append(page) for item, values in items.iteritems(): pos = itemPos[itemIndex] itemImage = values.get('image') page = self.pages[pageIndex] itemType = values.get('type') supply = 0 maxSupply = 0 if itemType == ItemType.GAG: button = DirectButton( geom = (itemImage), scale = 1.3, pos = pos, relief = None, parent = page, command = self.shop.purchaseItem, extraArgs = [item] ) supply = base.localAvatar.getBackpack().getSupply(item().getName()) maxSupply = base.localAvatar.getBackpack().getMaxSupply(item().getName()) buttonLabel = DirectLabel( text = '%s/%s\n%s JBS' % (str(supply), str(maxSupply), str(values.get('price'))), relief = None, parent = button, text_scale = 0.05, pos = (0, 0, -0.11) ) elif itemType == ItemType.UPGRADE: button = DirectButton( image = (itemImage), scale = 0.15, pos = pos, relief = None, parent = page, command = self.shop.purchaseItem, extraArgs = [item] ) button.setTransparency(TransparencyAttrib.MAlpha) upgradeID = values.get('upgradeID') supply = base.localAvatar.getPUInventory()[upgradeID] maxSupply = values.get('maxUpgrades') if upgradeID == 0 and base.localAvatar.getMyBattle().getTurretManager().myTurret: supply = 1 buttonLabel = DirectLabel( text = '%s/%s\n%s JBS' % (str(supply), str(maxSupply), str(values.get('price'))), relief = None, parent = button, text_scale = 0.5, pos = (0, 0, -1.2) ) elif itemType == ItemType.HEAL: label = '%s' % (item) if 'showTitle' in values: label = '%s\n%s JBS' % (item, values.get('price')) button = DirectButton( image = (itemImage), scale = 0.105, pos = pos, relief = None, parent = page, command = self.shop.purchaseItem, extraArgs = [item] ) button.setTransparency(TransparencyAttrib.MAlpha) buttonLabel = DirectLabel( text = label, relief = None, parent = button, text_scale = 0.75, pos = (0, 0, -1.6) ) page.addItemEntry(item, [button, buttonLabel]) page.addItem({item : values}) if index % 4 == 0: index = 1 pageIndex += 1 itemIndex = 0 else: itemIndex = itemIndex + 1 index += 1 if self.nPages == 1: self.backBtn.hide() self.nextBtn.hide() for page in self.pages: page.hide() page.update() self.isSetup = True def updatePages(self): for page in self.pages: page.update() def setPage(self, page): if page < 0 or page > self.nPages: return if self.nPage != -1: self.pages[self.nPage].hide() if page == 0: self.backBtn.setColorScale(GRAYED_OUT_COLOR) if (page + 1) > self.nPages: self.nextBtn.setColorScale(GRAYED_OUT_COLOR) else: self.nextBtn.setColorScale(NORMAL_COLOR) if (page - 1) > -1: self.backBtn.setColorScale(NORMAL_COLOR) self.nPage = page self.prevPage = (page - 1) self.nextPage = (page + 1) self.pages[page].show() def setBackBtn(self, enabled): if self.backBtn: if not enabled: self.backBtn['frameColor'] = GRAYED_OUT_COLOR self.backBtn['state'] = DGG.DISABLED else: self.backBtn['frameColor'] = NORMAL_COLOR self.backBtn['state'] = DGG.NORMAL def setNextBtn(self, enabled): if self.nextBtn: if not enabled: self.nextBtn['frameColor'] = GRAYED_OUT_COLOR self.nextBtn['state'] = DGG.DISABLED else: self.nextBtn['frameColor'] = NORMAL_COLOR self.nextBtn['state'] = DGG.NORMAL def setOKCommand(self, command): if self.okBtn: self.okBtn['command'] = command def setCancelCommand(self, command): if self.clBtn: self.clBtn['command'] = command def showInfo(self, text, negative = 0, duration = -1): self.infoLbl.show() if negative: self.infoLbl['text_fg'] = (0.9, 0, 0, 1) else: self.infoLbl['text_fg'] = (0, 0, 0, 1) self.infoLbl['text'] = text if duration > -1: Sequence(Wait(duration), Func(self.hideInfo)).start() def hideInfo(self): if self.infoLbl: self.infoLbl.hide() def delete(self): elements = [self.title, self.okBtn, self.clBtn, self.infoLbl, self.backBtn, self.nextBtn] for element in elements: element.destroy() del elements for page in self.pages: page.destroy() self.pages.remove(page) self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.backBtn = None self.nextBtn = None self.destroy()
class ShopWindow(DirectFrame): def __init__(self, shop, image, wantTurretCount): DirectFrame.__init__(self, sortOrder=1) self.shop = shop self.wantTurretCount = wantTurretCount self.bgImage = image self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.turretLabel = None self.turretImg = None self.isSetup = False self.turretCount = 0 # New variables for optimized shop. self.firstItemIndex = -1 self.btnPositions = [(-0.45, 0, 0), (-0.15, 0, 0), (0.15, 0, 0), (0.45, 0, 0)] self.page = Page(self.shop, self) self.itemButtons = [] self.itemButtons.append(ItemButton(self.page, self.btnPositions[0])) self.itemButtons.append(ItemButton(self.page, self.btnPositions[1])) self.itemButtons.append(ItemButton(self.page, self.btnPositions[2])) self.itemButtons.append(ItemButton(self.page, self.btnPositions[3])) self.newItems = None def setup(self, title='CHOOSE WHAT YOU WANT TO BUY'): font = CIGlobals.getMickeyFont() txtFg = (0, 0, 0, 1) txtScale = 0.05 txtPos = (0, -0.1) buttons = loader.loadModel('phase_3.5/models/gui/QT_buttons.bam') self.window = OnscreenImage(image=self.bgImage, scale=(0.9, 1, 0.7), parent=self) self.title = DirectLabel(text=title, relief=None, pos=(0, 0, 0.5), text_wordwrap=10, text_font=font, text_fg=(1, 1, 0, 1), scale=0.1, parent=self) # Let's update the turret count. self.updateTurretCount() self.infoLbl = DirectLabel(text='Welcome!', relief=None, text_scale=0.075, text_fg=txtFg, text_shadow=(0, 0, 0, 0), pos=(0, 0, 0.215)) self.okBtn = DirectButton(geom=CIGlobals.getOkayBtnGeom(), relief=None, text='OK', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(-0.1, 0, -0.5), parent=self) self.clBtn = DirectButton(geom=CIGlobals.getCancelBtnGeom(), relief=None, text='Cancel', text_fg=txtFg, text_scale=txtScale, text_pos=txtPos, pos=(0.1, 0, -0.5), parent=self) buttonGeom = (buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back'), buttons.find('**/QT_back')) self.backBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(-0.3, 0, -0.25), parent=self, command=self.changePage, extraArgs=[0]) self.nextBtn = DirectButton(geom=buttonGeom, relief=None, scale=0.05, pos=(0.3, 0, -0.25), hpr=(0, 0, 180), command=self.changePage, extraArgs=[1], parent=self) self.hideInfo() def setTurrets(self, amount): if self.shop.upgradesPurchased: amount += 1 self.turretCount = amount self.updatePage() def updateTurretCount(self): if self.turretLabel: self.turretLabel.destroy() if self.wantTurretCount: maxTurrets = CogBattleGlobals.MAX_TURRETS if not self.turretImg: self.turretImg = OnscreenImage( image="phase_3.5/maps/cannon-icon.png", scale=(0.05, 1, 0.05), pos=(-0.22, 0, 0.275)) self.turretImg.setTransparency(TransparencyAttrib.MAlpha) self.turretLabel = DirectLabel( text='Turrets: %s/%s' % (str(self.turretCount), str(maxTurrets)), relief=None, text_scale=0.07, text_fg=(0, 0, 0, 1), text_shadow=(0, 0, 0, 0), pos=(0, 0, 0.265)) def changePage(self, direction): var = (self.firstItemIndex - 4) if direction == 1: var = (self.firstItemIndex + 4) self.setBackBtn(True) self.setNextBtn(True) if (var - 4) < 0: self.setBackBtn(False) elif (var + 4) >= len(self.newItems): self.setNextBtn(False) self.firstItemIndex = var self.setupItems(begin=self.firstItemIndex) def initializeShop(self, items): newItems = dict(items) loadout = base.localAvatar.backpack.loadout # Let's show the loadout gags first in a full shop. if self.shop.wantFullShop: crcGags = OrderedDict(newItems) for item, values in newItems.items(): if values and values.get('type') == ItemType.GAG: gagId = base.cr.attackMgr.getAttackIDByName(item) hasGag = base.localAvatar.getBackpack().hasGag(gagId) if gagId not in loadout or not hasGag: del crcGags[item] if not hasGag: del newItems[item] else: del newItems[item] # Let's add back the other gags. crcGags.update(newItems) newItems = crcGags else: for item, values in newItems.items(): if values and values.get('type') == ItemType.GAG: gagId = base.localAvatar.getBackpack().hasGag(gagId) if gagId not in loadout or not base.localAvatar.getBackpack( ).hasGag(gagId): del newItems[item] self.newItems = newItems self.firstItemIndex = 0 self.setupItems() if len(newItems.keys()) <= 4: self.backBtn.hide() self.nextBtn.hide() self.setBackBtn(False) self.isSetup = True def setupItems(self, begin=0): for button in self.itemButtons: button.hide() button.label.hide() for i in xrange(4): item = self.newItems.keys()[begin + i] if (begin + i) < len( self.newItems.keys()) else None values = self.newItems.get(item) if item else None if item: button = self.itemButtons[i] button.setItem(item, values) button.update() def updatePage(self): battle = base.localAvatar.getBattleZone() if battle and self.wantTurretCount: self.shop.distShop.sendUpdate('requestTurretCount', []) self.updateTurretCount() for button in self.itemButtons: button.update() def setBackBtn(self, enabled): if self.backBtn: if enabled == False: self.backBtn.setColorScale(GRAYED_OUT_COLOR) self.backBtn['state'] = DGG.DISABLED else: self.backBtn.setColorScale(NORMAL_COLOR) self.backBtn['state'] = DGG.NORMAL def setNextBtn(self, enabled): if self.nextBtn: if enabled == False: self.nextBtn.setColorScale(GRAYED_OUT_COLOR) self.nextBtn['state'] = DGG.DISABLED else: self.nextBtn.setColorScale(NORMAL_COLOR) self.nextBtn['state'] = DGG.NORMAL def setOKCommand(self, command): if self.okBtn: self.okBtn['command'] = command def setCancelCommand(self, command): if self.clBtn: self.clBtn['command'] = command def showInfo(self, text, negative=0, duration=-1): self.infoLbl.show() if negative: self.infoLbl['text_fg'] = (0.9, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 1) else: self.infoLbl['text_fg'] = (0, 0, 0, 1) self.infoLbl['text_shadow'] = (0, 0, 0, 0) self.infoLbl['text'] = text if duration > -1: Sequence(Wait(duration), Func(self.hideInfo)).start() def hideInfo(self): if self.infoLbl: self.infoLbl.hide() def delete(self): elements = [ self.title, self.okBtn, self.clBtn, self.infoLbl, self.backBtn, self.nextBtn, self.turretLabel, self.turretImg, self.page ] for element in elements: if element: element.destroy() del elements del self.page for button in self.itemButtons: button.destroy() self.itemButtons = None del self.itemButtons self.title = None self.okBtn = None self.clBtn = None self.infoLbl = None self.backBtn = None self.nextBtn = None self.bgImage = None self.turretLabel = None self.turretCount = None if self.window: self.window.destroy() self.window = None self.destroy()