from panda3d.core import * from direct.gui.DirectGui import * from direct.gui.DirectScrolledList import * from toontown.toonbase import ToontownGlobals from toontown.toontowngui import TTDialog from toontown.friends import FriendHandle import CatalogItem import CatalogInvalidItem import CatalogFurnitureItem from toontown.toonbase import TTLocalizer import CatalogItemPanel import CatalogItemTypes from direct.actor import Actor import random from toontown.toon import DistributedToon from direct.directnotify import DirectNotifyGlobal from otp.nametag.ChatBalloon import ChatBalloon from otp.nametag import NametagGroup, NametagConstants NUM_CATALOG_ROWS = 3 NUM_CATALOG_COLS = 2 CatalogPanelCenters = [[Point3(-0.95, 0, 0.91), Point3(-0.275, 0, 0.91)], [Point3(-0.95, 0, 0.275), Point3(-0.275, 0, 0.275)], [Point3(-0.95, 0, -0.4), Point3(-0.275, 0, -0.4)]] CatalogPanelColors = {CatalogItemTypes.FURNITURE_ITEM: Vec4(0.733, 0.78, 0.933, 1.0), CatalogItemTypes.CHAT_ITEM: Vec4(0.922, 0.922, 0.753, 1.0), CatalogItemTypes.CLOTHING_ITEM: Vec4(0.918, 0.69, 0.69, 1.0), CatalogItemTypes.EMOTE_ITEM: Vec4(0.922, 0.922, 0.753, 1.0), CatalogItemTypes.WALLPAPER_ITEM: Vec4(0.749, 0.984, 0.608, 1.0), CatalogItemTypes.WINDOW_ITEM: Vec4(0.827, 0.91, 0.659, 1.0)} class CatalogScreen(DirectFrame): notify = DirectNotifyGlobal.directNotify.newCategory('CatalogScreen') def __init__(self, parent = aspect2d, **kw): self.gifting = -1 guiItems = loader.loadModel('phase_5.5/models/gui/catalog_gui') background = guiItems.find('**/catalog_background') background.setBin("background", 10) guiButton = loader.loadModel('phase_3/models/gui/quit_button') guiBack = loader.loadModel('phase_5.5/models/gui/package_delivery_panel') optiondefs = (('scale', 0.667, None), ('pos', (0, 1, 0.025), None), ('phone', None, None), ('doneEvent', None, None), ('image', background, None), ('relief', None, None)) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, parent) self.friend = None self.friendAvId = None self.friendName = None self.friendList = [] self.friends = [] self.load(guiItems, guiButton, guiBack) self.initialiseoptions(CatalogScreen) self.enableBackorderCatalogButton() self.setMaxPageIndex(self.numNewPages) self.setPageIndex(-1) self.showPageItems() self.hide() self.clarabelleChatNP = None self.clarabelleChatBalloon = None self.createdGiftGui = None self.viewing = None def show(self): self.accept('CatalogItemPurchaseRequest', self.__handlePurchaseRequest) self.accept('CatalogItemGiftPurchaseRequest', self.__handleGiftPurchaseRequest) self.accept(localAvatar.uniqueName('moneyChange'), self.__moneyChange) self.accept(localAvatar.uniqueName('bankMoneyChange'), self.__bankMoneyChange) self.accept(localAvatar.uniqueName('emblemsChange'), self.__emblemChange) deliveryText = 'setDeliverySchedule-%s' % base.localAvatar.doId self.accept(deliveryText, self.remoteUpdate) base.setBackgroundColor(Vec4(0.529, 0.290, 0.286, 1)) render.hide() DirectFrame.show(self) def clarabelleGreeting(task): self.setClarabelleChat(TTLocalizer.CatalogGreeting, type='greeting') def clarabelleHelpText1(task): self.setClarabelleChat(TTLocalizer.CatalogHelpText1) taskMgr.doMethodLater(1.0, clarabelleGreeting, 'clarabelleGreeting') taskMgr.doMethodLater(12.0, clarabelleHelpText1, 'clarabelleHelpText1') def hide(self): self.ignore('CatalogItemPurchaseRequest') self.ignore('CatalogItemGiftPurchaseRequest') self.ignore(localAvatar.uniqueName('moneyChange')) self.ignore(localAvatar.uniqueName('bankMoneyChange')) self.ignore(localAvatar.uniqueName('emblemsChange')) deliveryText = 'setDeliverySchedule-%s' % base.localAvatar.doId self.ignore(deliveryText) base.setBackgroundColor(ToontownGlobals.DefaultBackgroundColor) render.show() DirectFrame.hide(self) def setNumNewPages(self, numNewPages): self.numNewPages = numNewPages def setNumBackPages(self, numBackPages): self.numBackPages = numBackPages def setNumSpecialPages(self, numSpecialPages): self.numSpecialPages = numSpecialPages def setNumEmblemPages(self, numEmblemPages): self.numEmblemPages = numEmblemPages def setPageIndex(self, index): self.pageIndex = index def setMaxPageIndex(self, numPages): self.maxPageIndex = max(numPages - 1, -1) def enableBackorderCatalogButton(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED def enableNewCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.DISABLED def enableSpecialCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def enableEmblemCatalogButton(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.DISABLED self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeBackorderCatalog(self): self.backCatalogButton['state'] = DGG.DISABLED self.newCatalogButton['state'] = DGG.NORMAL self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL def modeNewCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.DISABLED self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.NORMAL def modeSpecialCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL self.specialCatalogButton['state'] = DGG.DISABLED self.emblemCatalogButton['state'] = DGG.NORMAL def modeEmblemCatalog(self): self.backCatalogButton['state'] = DGG.NORMAL self.newCatalogButton['state'] = DGG.NORMAL self.specialCatalogButton['state'] = DGG.NORMAL self.emblemCatalogButton['state'] = DGG.DISABLED def showNewItems(self, index = None): if config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: CATALOG: New item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.viewing = 'New' self.modeNewCatalog() self.setMaxPageIndex(self.numNewPages) if self.numNewPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) else: self.setPageIndex(0) self.showPageItems() return def showBackorderItems(self, index = None): if config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: CATALOG: Backorder item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.viewing = 'Backorder' self.modeBackorderCatalog() self.setMaxPageIndex(self.numBackPages) if self.numBackPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) else: self.setPageIndex(0) self.showPageItems() return def showSpecialItems(self, index = None): if config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: CATALOG: Special item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.viewing = 'Special' self.modeSpecialCatalog() self.setMaxPageIndex(self.numSpecialPages) if self.numSpecialPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) else: self.setPageIndex(0) self.showPageItems() return def showEmblemItems(self, index = None): if config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: CATALOG: Emblem item') taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.viewing = 'Emblem' self.modeEmblemCatalog() self.setMaxPageIndex(self.numEmblemPages) if self.numEmblemPages == 0: self.setPageIndex(-1) elif index is not None: self.setPageIndex(index) else: self.setPageIndex(0) self.showPageItems() return def showNextPage(self): taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.pageIndex = self.pageIndex + 1 if self.viewing == None: self.modeNewCatalog() self.viewing == 'New' if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numBackPages > 0: self.showBackorderItems() if self.viewing == 'New' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: self.showSpecialItems() elif self.viewing == 'Backorder' and self.pageIndex > self.maxPageIndex and self.numSpecialPages > 0: self.showSpecialItems() elif self.viewing == 'Special' and self.pageIndex > self.maxPageIndex and self.numEmblemPages > 0: self.showEmblemItems() else: self.pageIndex = min(self.pageIndex, self.maxPageIndex) self.showPageItems() return def showBackPage(self): taskMgr.remove('clarabelleHelpText1') messenger.send('wakeup') self.pageIndex = self.pageIndex - 1 if self.viewing == 'Backorder' and self.pageIndex < 0 and self.numNewPages > 0: self.showNewItems(self.numNewPages - 1) elif self.viewing == 'Special' and self.pageIndex < 0 and self.numBackPages > 0: self.showBackorderItems(self.numBackPages - 1) elif self.viewing == 'Emblem' and self.pageIndex < 0 and self.numSpecialPages > 0: self.showSpecialItems(self.numSpecialPages - 1) else: self.pageIndex = max(self.pageIndex, -1) self.showPageItems() def showPageItems(self): self.hidePages() if self.viewing == None: self.viewing = 'New' if self.pageIndex < 0: self.closeCover() else: if self.pageIndex == 0: self.openCover() if self.viewing == 'New': page = self.pageList[self.pageIndex] newOrBackOrSpecial = 0 elif self.viewing == 'Backorder': page = self.backPageList[self.pageIndex] newOrBackOrSpecial = 1 elif self.viewing == 'Special': page = self.specialPageList[self.pageIndex] newOrBackOrSpecial = 2 elif self.viewing == 'Emblem': page = self.emblemPageList[self.pageIndex] newOrBackOrSpecial = 3 page.show() for panel in self.panelDict[page.get_key()]: panel.load() if panel.ival: panel.ival.loop() self.visiblePanels.append(panel) pIndex = 0 randGen = random.Random() randGen.seed(base.localAvatar.catalogScheduleCurrentWeek + (self.pageIndex << 8) + (newOrBackOrSpecial << 16)) for i in xrange(NUM_CATALOG_ROWS): for j in xrange(NUM_CATALOG_COLS): if pIndex < len(self.visiblePanels): type = self.visiblePanels[pIndex]['item'].getTypeCode() self.squares[i][j].setColor(CatalogPanelColors.values()[randGen.randint(0, len(CatalogPanelColors) - 1)]) cs = 0.7 + 0.3 * randGen.random() self.squares[i][j].setColorScale(0.7 + 0.3 * randGen.random(), 0.7 + 0.3 * randGen.random(), 0.7 + 0.3 * randGen.random(), 1) else: self.squares[i][j].setColor(CatalogPanelColors[CatalogItemTypes.CHAT_ITEM]) self.squares[i][j].clearColorScale() pIndex += 1 if self.viewing == 'New': text = TTLocalizer.CatalogNew elif self.viewing == 'Special': text = TTLocalizer.CatalogSpecial elif self.viewing == 'Backorder': text = TTLocalizer.CatalogBackorder elif self.viewing == 'Emblem': text = TTLocalizer.CatalogEmblem self.pageLabel['text'] = text + ' - %d' % (self.pageIndex + 1) if self.pageIndex < self.maxPageIndex: self.nextPageButton.show() elif self.viewing == 'New' and self.numBackPages == 0 and self.numSpecialPages == 0: self.nextPageButton.hide() elif self.viewing == 'Backorder' and self.numSpecialPages == 0: self.nextPageButton.hide() elif self.viewing == 'Special' and self.numEmblemPages == 0: self.nextPageButton.hide() elif self.viewing == 'Special' and self.numEmblemPages > 0: self.nextPageButton.show() elif self.viewing == 'Emblem': self.nextPageButton.hide() self.adjustForSound() self.update() return def adjustForSound(self): numEmoteItems = 0 emotePanels = [] for visIndex in xrange(len(self.visiblePanels)): panel = self.visiblePanels[visIndex] item = panel['item'] catalogType = item.getTypeCode() if catalogType == CatalogItemTypes.EMOTE_ITEM: numEmoteItems += 1 emotePanels.append(panel) else: panel.soundOnButton.hide() panel.soundOffButton.hide() if numEmoteItems == 1: emotePanels[0].handleSoundOnButton() elif numEmoteItems > 1: for panel in emotePanels: panel.handleSoundOffButton() def hidePages(self): for page in self.pageList: page.hide() for page in self.backPageList: page.hide() for page in self.specialPageList: page.hide() for page in self.emblemPageList: page.hide() for panel in self.visiblePanels: if panel.ival: panel.ival.finish() self.visiblePanels = [] def openCover(self): self.cover.hide() self.hideDummyTabs() self.backPageButton.show() self.pageLabel.show() def closeCover(self): self.cover.show() self.showDummyTabs() self.nextPageButton.show() self.backPageButton.hide() self.pageLabel.hide() self.hidePages() def showDummyTabs(self): if self.numNewPages > 0: self.newCatalogButton2.show() if self.numBackPages > 0: self.backCatalogButton2.show() if self.numSpecialPages > 0: self.specialCatalogButton2.show() if self.numEmblemPages > 0: self.emblemCatalogButton2.show() self.newCatalogButton.hide() self.backCatalogButton.hide() self.specialCatalogButton.hide() self.emblemCatalogButton.hide() def hideDummyTabs(self): self.newCatalogButton2.hide() self.backCatalogButton2.hide() self.specialCatalogButton2.hide() self.emblemCatalogButton2.hide() if self.numNewPages > 0: self.newCatalogButton.show() if self.numBackPages > 0: self.backCatalogButton.show() if self.numSpecialPages > 0: self.specialCatalogButton.show() if self.numEmblemPages > 0: self.emblemCatalogButton.show() def packPages(self, panelList, pageList, prefix): i = 0 j = 0 numPages = 0 pageName = prefix + '_page%d' % numPages for item in panelList: if i == 0 and j == 0: numPages += 1 pageName = prefix + '_page%d' % numPages page = self.base.attachNewNode(pageName) pageList.append(page) item.reparentTo(page) item.setPos(CatalogPanelCenters[i][j]) itemList = self.panelDict.get(page.get_key(), []) itemList.append(item) self.panelDict[page.get_key()] = itemList j += 1 if j == NUM_CATALOG_COLS: j = 0 i += 1 if i == NUM_CATALOG_ROWS: i = 0 return numPages def load(self, guiItems, guiButton, guiBack): self.pageIndex = -1 self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 self.numSpecialPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] self.pageList = [] self.backPageList = [] self.specialPanelList = [] self.specialPageList = [] self.emblemPanelList = [] self.emblemPageList = [] self.panelDict = {} self.visiblePanels = [] self.responseDialog = None catalogBase = guiItems.find('**/catalog_base') self.base = DirectLabel(self, relief=None, image=catalogBase) newDown = guiItems.find('**/new1') newUp = guiItems.find('**/new2') backDown = guiItems.find('**/previous2') backUp = guiItems.find('**/previous1') giftToggleUp = guiItems.find('**/giftButtonUp') giftToggleDown = guiItems.find('**/giftButtonDown') giftFriends = guiItems.find('**/gift_names') oldLift = 0.4 lift = 0.4 liftDiff = lift - oldLift lift2 = 0.05 smash = 0.75 priceScale = 0.15 emblemIcon = loader.loadModel('phase_3.5/models/gui/tt_m_gui_gen_emblemIcons') silverModel = emblemIcon.find('**/tt_t_gui_gen_emblemSilver') goldModel = emblemIcon.find('**/tt_t_gui_gen_emblemGold') self.silverLabel = DirectLabel(parent=self, relief=None, pos=(1.05, 0, -0.6), scale=priceScale, image=silverModel, image_pos=(-0.4, 0, 0.4), text=str(localAvatar.emblems[ToontownGlobals.EmblemTypes.Silver]), text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getSignFont(), text_align=TextNode.ALeft) base.silverLabel = self.silverLabel self.goldLabel = DirectLabel(parent=self, relief=None, pos=(1.05, 0, -0.8), scale=priceScale, image=goldModel, image_pos=(-0.4, 0, 0.4), text=str(localAvatar.emblems[ToontownGlobals.EmblemTypes.Gold]), text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getSignFont(), text_align=TextNode.ALeft) base.goldLabel = self.goldLabel if not base.cr.wantEmblems: self.hideEmblems() self.newCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.17), frameSize=(-0.2, 0.25, 0.45, 1.2), image=[newDown, newDown, newDown, newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), pressEffect=0, command=self.showNewItems, text=TTLocalizer.CatalogNew, text_font=ToontownGlobals.getSignFont(), text_pos=(-0.4 - lift, 0.13), text3_pos=(-0.4 - lift, 0.1), text_scale=0.08, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.newCatalogButton.hide() self.newCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.17), frameSize=(-0.2, 0.25, 0.45, 1.2), image=newDown, image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), pressEffect=0, command=self.showNewItems, text=TTLocalizer.CatalogNew, text_font=ToontownGlobals.getSignFont(), text_pos=(-0.4 - lift, 0.13), text_scale=0.08, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.newCatalogButton2.hide() self.backCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.269), frameSize=(-0.2, 0.25, -0.2, 0.4), image=[backDown, backDown, backDown, backUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), pressEffect=0, command=self.showBackorderItems, text=TTLocalizer.CatalogBackorder, text_font=ToontownGlobals.getSignFont(), text_pos=(0.25 - lift, 0.132), text3_pos=(0.25 - lift, 0.112), text_scale=TTLocalizer.CSbackCatalogButton, text_fg=(0.392, 0.549, 0.627, 1.0), text2_fg=(0.392, 0.349, 0.427, 1.0)) self.backCatalogButton.hide() self.backCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.269), frameSize=(-0.2, 0.25, -0.2, 0.4), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, lift), image=backDown, pressEffect=0, command=self.showBackorderItems, text=TTLocalizer.CatalogBackorder, text_font=ToontownGlobals.getSignFont(), text_pos=(0.25 - lift, 0.132), text_scale=TTLocalizer.CSbackCatalogButton, text_fg=(0.392, 0.549, 0.627, 1.0), text2_fg=(0.392, 0.349, 0.427, 1.0)) self.backCatalogButton2.hide() self.specialCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, -0.3), image=[newDown, newDown, newDown, newUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text3_pos=(1.0 - lift, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.specialCatalogButton.hide() self.specialCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 0.469), frameSize=(-0.2, 0.25, -0.85, -0.3), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.4 + lift), image=newDown, pressEffect=0, command=self.showSpecialItems, text=TTLocalizer.CatalogSpecial, text_font=ToontownGlobals.getSignFont(), text_pos=(1.0 - lift, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.specialCatalogButton2.hide() self.emblemCatalogButton = DirectButton(self.base, relief=None, pos=(0, 0, 1.05), frameSize=(-0.2, 0.25, -2.0, -1.45), image=[backDown, backDown, backDown, backUp], image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.9 + lift), pressEffect=0, command=self.showEmblemItems, text=TTLocalizer.CatalogEmblem, text_font=ToontownGlobals.getSignFont(), text_pos=(1.75, 0.132), text3_pos=(1.75, 0.112), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.emblemCatalogButton.hide() self.emblemCatalogButton2 = DirectButton(self.base, relief=None, pos=(0, 0, 1.05), frameSize=(-0.2, 0.25, -2.0, -1.45), image_scale=(1.0, 1.0, smash), image_pos=(0.0, 0.0, -1.9 + lift), image=backDown, pressEffect=0, command=self.showEmblemItems, text=TTLocalizer.CatalogEmblem, text_font=ToontownGlobals.getSignFont(), text_pos=(1.75, 0.132), text_scale=0.065, text_fg=(0.353, 0.627, 0.627, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0)) self.emblemCatalogButton2.hide() self.__makeFriendList() if len(self.friendList) > 0: if config.GetBool('want-gifting', True): self.giftToggle = DirectButton(self.base, relief=None, pressEffect=0, image=(giftToggleUp, giftToggleDown, giftToggleUp), image_scale=(1.0, 1, 0.7), command=self.__giftToggle, text=TTLocalizer.CatalogGiftToggleOff, text_font=ToontownGlobals.getSignFont(), text_pos=TTLocalizer.CSgiftTogglePos, text_scale=TTLocalizer.CSgiftToggle, text_fg=(0.353, 0.627, 0.627, 1.0), text3_fg=(0.15, 0.3, 0.3, 1.0), text2_fg=(0.353, 0.427, 0.427, 1.0), image_color=Vec4(1.0, 1.0, 0.2, 1.0), image1_color=Vec4(0.9, 0.85, 0.2, 1.0), image2_color=Vec4(0.9, 0.85, 0.2, 1.0), image3_color=Vec4(0.5, 0.45, 0.2, 1.0)) self.giftToggle.setPos(0.0, 0, -0.035) self.giftLabel = DirectLabel(self.base, relief=None, image=giftFriends, image_scale=(1.15, 1, 1.14), text=' ', text_font=ToontownGlobals.getSignFont(), text_pos=(1.2, -0.97), text_scale=0.07, text_fg=(0.392, 0.549, 0.627, 1.0), sortOrder=100, textMayChange=1) self.giftLabel.setPos(-0.15, 0, 0.08) self.giftLabel.hide() self.friendLabel = DirectLabel(self.base, relief=None, text=TTLocalizer.CatalogGiftChoose, text_font=ToontownGlobals.getSignFont(), text_pos=(-0.25, 0.132), text_scale=0.068, text_align=TextNode.ALeft, text_fg=(0.992, 0.949, 0.327, 1.0), sortOrder=100, textMayChange=1) self.friendLabel.setPos(0.5, 0, -0.42) self.friendLabel.hide() gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') self.scrollList = DirectScrolledList(parent=self, relief=None, incButton_image=(gui.find('**/FndsLst_ScrollUp'), gui.find('**/FndsLst_ScrollDN'), gui.find('**/FndsLst_ScrollUp_Rllvr'), gui.find('**/FndsLst_ScrollUp')), incButton_relief=None, incButton_pos=(0.0, 0.0, -0.316), incButton_image1_color=Vec4(1.0, 0.9, 0.4, 1.0), incButton_image3_color=Vec4(1.0, 1.0, 0.6, 0.5), incButton_scale=(1.0, 1.0, -1.0), decButton_image=(gui.find('**/FndsLst_ScrollUp'), gui.find('**/FndsLst_ScrollDN'), gui.find('**/FndsLst_ScrollUp_Rllvr'), gui.find('**/FndsLst_ScrollUp')), decButton_relief=None, decButton_pos=(0.0, 0.0, 0.117), decButton_image1_color=Vec4(1.0, 1.0, 0.6, 1.0), decButton_image3_color=Vec4(1.0, 1.0, 0.6, 0.6), itemFrame_pos=(-0.17, 0.0, 0.06), itemFrame_relief=None, numItemsVisible=8, items=[]) self.scrollList.setPos(1.2, 0, -0.58) self.scrollList.setScale(1.5) self.scrollList.hide() clipper = PlaneNode('clipper') clipper.setPlane(Plane(Vec3(-1, 0, 0), Point3(0.17, 0, 0))) clipNP = self.scrollList.attachNewNode(clipper) self.scrollList.setClipPlane(clipNP) self.__makeScrollList() self.createdGiftGui = 1 for i in xrange(4): self.newCatalogButton.component('text%d' % i).setR(90) self.newCatalogButton2.component('text%d' % i).setR(90) self.backCatalogButton.component('text%d' % i).setR(90) self.backCatalogButton2.component('text%d' % i).setR(90) self.specialCatalogButton.component('text%d' % i).setR(90) self.specialCatalogButton2.component('text%d' % i).setR(90) self.emblemCatalogButton.component('text%d' % i).setR(90) self.emblemCatalogButton2.component('text%d' % i).setR(90) self.squares = [[], [], [], []] for i in xrange(NUM_CATALOG_ROWS): for j in xrange(NUM_CATALOG_COLS): square = guiItems.find('**/square%d%db' % (i + 1, j + 1)) label = DirectLabel(self.base, image=square, relief=None, state='normal') self.squares[i].append(label) def priceSort(a, b, type): priceA = a.getPrice(type) priceB = b.getPrice(type) return priceB - priceA itemList = base.localAvatar.monthlyCatalog + base.localAvatar.weeklyCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeWeekly)) itemList.reverse() allClosetItems = CatalogFurnitureItem.getAllClosets() allBankItems = CatalogFurnitureItem.getAllBanks() isMaxClosetOfferred = False isMaxBankOffered = False for item in itemList: if item in allClosetItems and item.furnitureType in CatalogFurnitureItem.MaxClosetIds: isMaxClosetOfferred = True break for item in itemList: if item in allBankItems and item.furnitureType == CatalogFurnitureItem.MaxBankId: isMaxBankOffered = True break for item in itemList: if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): self.notify.warning('skipping catalog invalid item %s' % item) continue if isMaxClosetOfferred and item in allClosetItems and item.furnitureType not in CatalogFurnitureItem.MaxClosetIds: continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue if item.getIsSpecial(): self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly, parentCatalogScreen=self)) else: self.panelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly, parentCatalogScreen=self)) itemList = base.localAvatar.backCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeBackorder)) itemList.reverse() for item in itemList: if isinstance(item, CatalogInvalidItem.CatalogInvalidItem): self.notify.warning('skipping catalog invalid item %s' % item) continue if isMaxClosetOfferred and item in allClosetItems and item.furnitureType not in CatalogFurnitureItem.MaxClosetIds: continue if isMaxBankOffered and item in allBankItems and item.furnitureType != CatalogFurnitureItem.MaxBankId: continue if item.getIsSpecial(): self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) elif item.getEmblemPrices(): self.emblemPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder, parentCatalogScreen=self)) else: self.backPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder, parentCatalogScreen=self)) numPages = self.packPages(self.panelList, self.pageList, 'new') self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') self.setNumSpecialPages(numPages) numPages = self.packPages(self.emblemPanelList, self.emblemPageList, 'emblem') self.setNumEmblemPages(numPages) currentWeek = base.localAvatar.catalogScheduleCurrentWeek - 1 if currentWeek < 57: seriesNumber = currentWeek / ToontownGlobals.CatalogNumWeeksPerSeries + 1 weekNumber = currentWeek % ToontownGlobals.CatalogNumWeeksPerSeries + 1 elif currentWeek < 65: seriesNumber = 6 weekNumber = currentWeek - 56 else: seriesNumber = currentWeek / ToontownGlobals.CatalogNumWeeksPerSeries + 2 weekNumber = currentWeek % ToontownGlobals.CatalogNumWeeksPerSeries + 1 geom = NodePath('cover') cover = guiItems.find('**/cover') maxSeries = ToontownGlobals.CatalogNumWeeks / ToontownGlobals.CatalogNumWeeksPerSeries + 1 coverSeries = (seriesNumber - 1) % maxSeries + 1 coverPicture = cover.find('**/cover_picture%s' % coverSeries) if not coverPicture.isEmpty(): coverPicture.reparentTo(geom) bottomSquare = cover.find('**/cover_bottom') topSquare = guiItems.find('**/square12b2') if seriesNumber == 1: topSquare.setColor(0.651, 0.404, 0.322, 1.0) bottomSquare.setColor(0.655, 0.522, 0.263, 1.0) else: topSquare.setColor(0.651, 0.404, 0.322, 1.0) bottomSquare.setColor(0.655, 0.522, 0.263, 1.0) bottomSquare.reparentTo(geom) topSquare.reparentTo(geom) cover.find('**/clarabelle_text').reparentTo(geom) cover.find('**/blue_circle').reparentTo(geom) cover.find('**/clarabelle').reparentTo(geom) cover.find('**/circle_green').reparentTo(geom) self.cover = DirectLabel(self.base, relief=None, geom=geom) self.catalogNumber = DirectLabel(self.cover, relief=None, scale=0.2, pos=(-0.22, 0, -0.33), text='#%d' % weekNumber, text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getInterfaceFont()) self.catalogSeries = DirectLabel(self.cover, relief=None, scale=(0.22, 1, 0.18), pos=(-0.76, 0, -0.9), text=TTLocalizer.CatalogSeriesLabel % seriesNumber, text_fg=(0.9, 0.9, 0.4, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getInterfaceFont()) self.catalogSeries.setShxz(0.4) self.rings = DirectLabel(self.base, relief=None, geom=guiItems.find('**/rings')) self.clarabelleFrame = DirectLabel(self, relief=None, image=guiItems.find('**/clarabelle_frame')) hangupGui = guiItems.find('**/hangup') hangupRolloverGui = guiItems.find('**/hangup_rollover') self.hangup = DirectButton(self, relief=None, pos=(-0.158, 0, 0.14), scale=(0.7, 0.7, 0.7), image=[hangupGui, hangupRolloverGui, hangupRolloverGui, hangupGui], text=['', TTLocalizer.CatalogHangUp, TTLocalizer.CatalogHangUp], text_fg=Vec4(1), text_scale=0.07, text_pos=(0.0, 0.14), command=self.hangUp) self.hangup.reparentTo(base.a2dBottomRight) self.beanBank = DirectLabel(self, relief=None, image=guiItems.find('**/bean_bank'), text=str(base.localAvatar.getMoney() + base.localAvatar.getBankMoney()), text_align=TextNode.ARight, text_scale=0.11, text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_pos=(0.75, -0.81), text_font=ToontownGlobals.getSignFont()) nextUp = guiItems.find('**/arrow_up') nextRollover = guiItems.find('**/arrow_Rollover') nextDown = guiItems.find('**/arrow_Down') prevUp = guiItems.find('**/arrowUp') prevDown = guiItems.find('**/arrowDown1') prevRollover = guiItems.find('**/arrowRollover') self.nextPageButton = DirectButton(self, relief=None, pos=(-0.1, 0, -0.9), image=[nextUp, nextDown, nextRollover, nextUp], image_color=(0.9, 0.9, 0.9, 1), image2_color=(1, 1, 1, 1), command=self.showNextPage) self.backPageButton = DirectButton(self, relief=None, pos=(-0.1, 0, -0.9), image=[prevUp, prevDown, prevRollover, prevUp], image_color=(0.9, 0.9, 0.9, 1), image2_color=(1, 1, 1, 1), command=self.showBackPage) self.backPageButton.hide() self.pageLabel = DirectLabel(self.base, relief=None, pos=(-1.33, 0, -0.9), scale=0.06, text=TTLocalizer.CatalogPagePrefix, text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getSignFont(), text_align=TextNode.ALeft) self.loadClarabelle() return def loadClarabelle(self): self.cRender = NodePath('cRender') self.cCamera = self.cRender.attachNewNode('cCamera') self.cCamNode = Camera('cCam') self.cLens = PerspectiveLens() self.cLens.setFov(40, 40) self.cLens.setNear(0.1) self.cLens.setFar(100.0) self.cCamNode.setLens(self.cLens) self.cCamNode.setScene(self.cRender) self.cCam = self.cCamera.attachNewNode(self.cCamNode) self.cDr = base.win.makeDisplayRegion(0.56, 0.81, 0.52, 0.85) self.cDr.setSort(1) self.cDr.setClearDepthActive(1) self.cDr.setClearColorActive(1) self.cDr.setClearColor(Vec4(0.3, 0.3, 0.3, 1)) self.cDr.setCamera(self.cCam) self.clarabelle = Actor.Actor('phase_5.5/models/char/Clarabelle-zero', {'listen': 'phase_5.5/models/char/Clarabelle-listens'}) self.clarabelle.loop('listen') self.clarabelle.find('**/eyes').setBin('fixed', 0) self.clarabelle.find('**/pupilL').setBin('fixed', 1) self.clarabelle.find('**/pupilR').setBin('fixed', 1) self.clarabelle.find('**/glassL').setBin('fixed', 2) self.clarabelle.find('**/glassR').setBin('fixed', 2) switchboard = loader.loadModel('phase_5.5/models/estate/switchboard') switchboard.reparentTo(self.clarabelle) switchboard.setPos(1, -1.6, 0) switchboard.setH(30) room = loader.loadModel('phase_3/models/makeatoon/tt_m_ara_mat_room.bam') room.reparentTo(self.clarabelle) room.find('**/genderProps').removeNode() room.find('**/bodyWalls').removeNode() room.find('**/bodyProps').removeNode() room.find('**/colorWalls').removeNode() room.find('**/colorProps').removeNode() room.find('**/clothWalls').removeNode() room.find('**/nameWalls').removeNode() room.find('**/nameProps').removeNode() room.find('**/spotlight').removeNode() room.setPos(5.5, 1.25, 0) room.setH(330) self.clarabelle.reparentTo(self.cRender) self.clarabelle.setPosHprScale(-0.52, 6.13, -3.81, 85, 0.0, 0.0, 1.0, 1.0, 1.0) self.clarabelleFrame.setPosHprScale(-0.01, 0.0, -0.01, 0.0, 0.0, 0.0, 1.02, 1.0, 1.02) def reload(self): for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: panel.destroy() def priceSort(a, b, type): priceA = a.getPrice(type) priceB = b.getPrice(type) return priceB - priceA self.pageIndex = -1 self.maxPageIndex = 0 self.numNewPages = 0 self.numBackPages = 5 self.numSpecialPages = 0 self.viewing = 'New' self.panelList = [] self.backPanelList = [] self.specialList = [] self.pageList = [] self.backPageList = [] self.specialPanelList = [] self.specialPageList = [] self.panelDict = {} self.visiblePanels = [] itemList = base.localAvatar.monthlyCatalog + base.localAvatar.weeklyCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeWeekly)) itemList.reverse() for item in itemList: if item.getIsSpecial(): self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) else: self.panelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeWeekly)) itemList = base.localAvatar.backCatalog itemList.sort(lambda a, b: priceSort(a, b, CatalogItem.CatalogTypeBackorder)) itemList.reverse() for item in itemList: if item.getIsSpecial(): self.specialPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeSpecial, parentCatalogScreen=self)) else: self.backPanelList.append(CatalogItemPanel.CatalogItemPanel(parent=hidden, item=item, type=CatalogItem.CatalogTypeBackorder)) numPages = self.packPages(self.panelList, self.pageList, 'new') self.setNumNewPages(numPages) numPages = self.packPages(self.backPanelList, self.backPageList, 'back') self.setNumBackPages(numPages) numPages = self.packPages(self.specialPanelList, self.specialPageList, 'special') self.setNumSpecialPages(numPages) seriesNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) / ToontownGlobals.CatalogNumWeeksPerSeries + 1 self.catalogSeries['text'] = Localizer.CatalogSeriesLabel % seriesNumber weekNumber = (base.localAvatar.catalogScheduleCurrentWeek - 1) % ToontownGlobals.CatalogNumWeeksPerSeries + 1 self.catalogNumber['text'] = '#%d' % weekNumber self.enableBackorderCatalogButton() self.setMaxPageIndex(self.numNewPages) self.setPageIndex(-1) self.showPageItems() def unload(self): taskMgr.remove('clearClarabelleChat') taskMgr.remove('postGoodbyeHangUp') taskMgr.remove('clarabelleGreeting') taskMgr.remove('clarabelleHelpText1') taskMgr.remove('clarabelleAskAnythingElse') self.hide() self.hangup.hide() self.destroy() del self.base del self.squares for panel in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: panel.destroy() del self.panelList del self.backPanelList del self.cover del self.rings del self.clarabelleFrame del self.hangup del self.beanBank del self.silverLabel del self.goldLabel del self.nextPageButton del self.backPageButton del self.newCatalogButton del self.newCatalogButton2 del self.backCatalogButton del self.backCatalogButton2 del self.specialCatalogButton del self.specialCatalogButton2 del self.pageLabel if self.createdGiftGui: del self.giftToggle del self.giftLabel del self.friendLabel del self.scrollList del self.friend del self.friends self.unloadClarabelle() if self.responseDialog: self.responseDialog.cleanup() self.responseDialog = None def unloadClarabelle(self): base.win.removeDisplayRegion(self.cDr) del self.cRender del self.cCamera del self.cCamNode del self.cLens del self.cCam del self.cDr self.clarabelle.cleanup() del self.clarabelle if self.clarabelleChatBalloon: self.clarabelleChatBalloon.removeNode() del self.clarabelleChatBalloon def hangUp(self): self.setClarabelleChat(random.choice(TTLocalizer.CatalogGoodbyeList), type='goodbye') self.setPageIndex(-1) self.showPageItems() self.nextPageButton.hide() self.backPageButton.hide() self.newCatalogButton.hide() self.newCatalogButton2.hide() self.backCatalogButton.hide() self.backCatalogButton2.hide() self.specialCatalogButton.hide() self.specialCatalogButton2.hide() self.emblemCatalogButton.hide() self.emblemCatalogButton2.hide() self.hangup.hide() taskMgr.remove('clarabelleGreeting') taskMgr.remove('clarabelleHelpText1') taskMgr.remove('clarabelleAskAnythingElse') def postGoodbyeHangUp(task): messenger.send(self['doneEvent']) self.unload() taskMgr.doMethodLater(1.5, postGoodbyeHangUp, 'postGoodbyeHangUp') def remoteUpdate(self): self.update() def update(self, task = None): if (not self.friend) and self.gifting == 1: self.__giftToggle() if hasattr(self, 'beanBank'): self.beanBank['text'] = str(base.localAvatar.getTotalMoney()) for item in self.panelList + self.backPanelList + self.specialPanelList + self.emblemPanelList: if type(item) != type(''): item.updateButtons(self.gifting) def __handlePurchaseRequest(self, item): item.requestPurchase(self['phone'], self.__handlePurchaseResponse) taskMgr.remove('clarabelleAskAnythingElse') def __handleGiftPurchaseRequest(self, item): item.requestGiftPurchase(self['phone'], self.friendAvId, self.__handleGiftPurchaseResponse) taskMgr.remove('clarabelleAskAnythingElse') def __handlePurchaseResponse(self, retCode, item): if retCode == ToontownGlobals.P_UserCancelled: self.update() return if hasattr(item, 'houseId') and retCode == ToontownGlobals.P_ItemAvailable: localAvatar.houseType = item.houseId taskMgr.doMethodLater(0.5, self.update, 'purchaseUpdate') self.setClarabelleChat(item.getRequestPurchaseErrorText(retCode), item.getRequestPurchaseErrorTextTimeout()) def __handleGiftPurchaseResponse(self, retCode, item): if retCode == ToontownGlobals.P_UserCancelled: return if self.isEmpty() or self.isHidden(): return self.setClarabelleChat(item.getRequestGiftPurchaseErrorText(retCode) % self.friendName) self.__loadFriend() def askAnythingElse(task): self.setClarabelleChat(TTLocalizer.CatalogAnythingElse) if retCode >= 0: taskMgr.doMethodLater(8, askAnythingElse, 'clarabelleAskAnythingElse') def __clearDialog(self, event): self.responseDialog.cleanup() self.responseDialog = None return def setClarabelleChat(self, str, timeout = 6, type = None): self.clearClarabelleChat() if not self.clarabelleChatBalloon: self.clarabelleChatBalloon = loader.loadModel('phase_3/models/props/chatbox') self.clarabelleChat = ChatBalloon(self.clarabelleChatBalloon) chatNode = self.clarabelleChat.generate(str, ToontownGlobals.getInterfaceFont())[0] self.clarabelleChatNP = self.attachNewNode(chatNode.node(), 1000) self.clarabelleChatNP.setScale(0.08) self.clarabelleChatNP.setPos(0.7, 0, 0.6) if timeout: taskMgr.doMethodLater(timeout, self.clearClarabelleChat, 'clearClarabelleChat') def clearClarabelleChat(self, task = None): taskMgr.remove('clearClarabelleChat') if self.clarabelleChatNP: self.clarabelleChatNP.removeNode() self.clarabelleChatNP = None del self.clarabelleChat return def __moneyChange(self, money): self.update() def __bankMoneyChange(self, bankMoney): self.update() def __emblemChange(self, newEmblems): self.silverLabel['text'] = str(newEmblems[0]) self.goldLabel['text'] = str(newEmblems[1]) def showEmblems(self): if base.cr.wantEmblems: self.silverLabel.show() self.goldLabel.show() def hideEmblems(self): self.silverLabel.hide() self.goldLabel.hide() def __makeFriendList(self): for av in base.cr.avList: if av.id != base.localAvatar.doId: self.friendList.append((av.id, av.name, NametagGroup.CCNonPlayer)) for id, handle in base.cr.friendsMap.items(): if isinstance(handle, FriendHandle.FriendHandle): self.friendList.append((id, handle.getName(), NametagConstants.getFriendColor(handle))) def __makeScrollList(self): for friend in self.friendList: button = self.makeFriendButton(*friend) self.scrollList.addItem(button, refresh=0) self.friends.append(button) self.scrollList.refresh() def makeFriendButton(self, avId, name, colorCode): color = NametagConstants.NAMETAG_COLORS[colorCode] return DirectButton(relief=None, text=name, text_scale=0.04, text_align=TextNode.ALeft, text_fg=color[0][0], text1_bg=(1, 1, 0, 1), text2_bg=(0.5, 0.9, 1, 1), text3_fg=(0.4, 0.8, 0.4, 1), command=self.__chooseFriend, extraArgs=[avId, name]) def __chooseFriend(self, avId, name): messenger.send('wakeup') if self.friendAvId == avId: return self.friendAvId = avId self.friendName = name self.__loadFriend() def __loadFriend(self): if not self.friendAvId: return for friendButton in self.friends: friendButton['state'] = DGG.DISABLED self.friend = None self.friendLabel['text'] = TTLocalizer.CatalogGiftUpdating self['phone'].requestGiftAvatar(self.friendAvId) def setFriendReady(self, friend): for friendButton in self.friends: friendButton['state'] = DGG.NORMAL self.friend = friend self.friendLabel['text'] = TTLocalizer.CatalogGiftTo % self.friendName self.update() def __giftToggle(self): messenger.send('wakeup') if self.gifting == -1: self.gifting = 1 self.giftLabel.show() self.friendLabel.show() self.scrollList.show() self.hideEmblems() self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOn self.friendLabel['text'] = TTLocalizer.CatalogGiftChoose self.__loadFriend() else: self.friend = None self.friendAvId = 0 self.friendName = None self.gifting = -1 self.giftLabel.hide() self.friendLabel.hide() self.scrollList.hide() self.showEmblems() self.giftToggle['text'] = TTLocalizer.CatalogGiftToggleOff self.update()