from panda3d.core import NodePath, TextNode from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedObject import DistributedObject from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer from toontown.toonbase.ToonBaseGlobal import base import pickle class DistributedLeaderBoard(DistributedObject): notify = directNotify.newCategory('DisributedLeaderBoard') def __init__(self, cr): self.notify.debug('__init__: initialization of local leaderboard') DistributedObject.__init__(self, cr) self.corner = 0 self.length = 0 self.width = 0 self.updateCount = 0 self.board = None self.surface = None def generateInit(self): DistributedObject.generateInit(self) self.board = NodePath(self.uniqueName('LeaderBoard')) def generate(self): DistributedObject.generate(self) self.buildListParts() def announceGenerate(self): DistributedObject.announceGenerate(self) self.board.reparentTo(base.render) self.accept('decorator-holiday-%d-ending' % ToontownGlobals.CRASHED_LEADERBOARD, self.showLists) self.accept('decorator-holiday-%d-starting' % ToontownGlobals.CRASHED_LEADERBOARD, self.hideLists) newsManager = base.cr.newsManager if newsManager: if ToontownGlobals.CRASHED_LEADERBOARD in newsManager.holidayIdList: self.hideLists() def showLists(self): self.board.show() def hideLists(self): self.board.hide() def setPosHpr(self, x, y, z, h, p, r): self.surface.setPosHpr(x, y, z, h, p, r) def setDisplay(self, pData): self.notify.debug('setDisplay: changing leaderboard text on local side') trackName, recordTitle, scores = pickle.loads(pData) self.display(trackName, recordTitle, scores) def buildListParts(self): self.surface = self.board.attachNewNode('surface') z = 7.7 dz = 0.4 x = -3.7 row, trackName = self.buildTrackRow() self.trackNameNode = trackName row.reparentTo(self.surface) row.setPos(0, 1.6, z) z = 7.3 row, self.titleTextNode = self.buildTitleRow() row.reparentTo(self.surface) row.setPos(0, 1.6, z) zListTop = 6.9 z = zListTop self.nameTextNodes = [] self.timeTextNodes = [] for _ in range(10): row, nameText, timeText, placeText = self.buildLeaderRow() self.nameTextNodes.append(nameText) placeText.setText(str(len(self.nameTextNodes)) + '.') self.timeTextNodes.append(timeText) row.reparentTo(self.surface) if len(self.nameTextNodes) == 6: z = zListTop x = 0.35 row.setX(x) row.setZ(z) row.setY(1.6) z -= dz self.surface.flattenLight() def display(self, pTrackTitle = 'Track Title', pPeriodTitle = 'Period Title', pLeaderList = []): self.titleTextNode.setText(pPeriodTitle) self.trackNameNode.setText(pTrackTitle) self.updateCount += 1 for i in range(10): if i > len(pLeaderList): self.nameTextNodes[i].setText('-') self.timeTextNodes[i].setText('-') else: name = pLeaderList[i][1] time = pLeaderList[i][0] secs, hundredths = divmod(time, 1) min, sec = divmod(secs, 60) self.nameTextNodes[i].setText(name[:22]) self.timeTextNodes[i].setText('%02d:%02d:%02d' % (min, sec, hundredths * 100)) def buildTitleRow(self): row = base.hidden.attachNewNode('TitleRow') nameText = TextNode('titleRow') nameText.setFont(ToontownGlobals.getSignFont()) nameText.setAlign(TextNode.ACenter) nameText.setTextColor(0.3, 0.75, 0.6, 1) nameText.setText('Score Title') namePath = row.attachNewNode(nameText) namePath.setScale(TTLocalizer.DLBbuildTitleRow) namePath.setDepthWrite(0) return (row, nameText) def buildTrackRow(self): row = base.hidden.attachNewNode('trackRow') nameText = TextNode('trackRow') nameText.setFont(ToontownGlobals.getSignFont()) nameText.setAlign(TextNode.ACenter) nameText.setTextColor(0.5, 0.75, 0.7, 1) nameText.setText('Track Title') namePath = row.attachNewNode(nameText) namePath.setScale(0.55) namePath.setDepthWrite(0) return (row, nameText) def buildLeaderRow(self): row = base.hidden.attachNewNode('leaderRow') nameText = TextNode('nameText') nameText.setFont(ToontownGlobals.getToonFont()) nameText.setAlign(TextNode.ALeft) nameText.setTextColor(0.125, 0, 0.5, 1) nameText.setText('-') namePath = row.attachNewNode(nameText) namePath.setPos(1.1, 0, 0) namePath.setScale(0.23) namePath.setDepthWrite(0) timeText = TextNode('timeText') timeText.setFont(ToontownGlobals.getToonFont()) timeText.setAlign(TextNode.ARight) timeText.setTextColor(0, 0, 0, 1) timeText.setText('-') timePath = row.attachNewNode(timeText) timePath.setPos(1.0, 0, 0) timePath.setScale(0.23) timePath.setDepthWrite(0) placeText = TextNode('placeText') placeText.setFont(ToontownGlobals.getSignFont()) placeText.setAlign(TextNode.ARight) placeText.setTextColor(1, 1, 0.1, 1) placeText.setText('-') placePath = row.attachNewNode(placeText) placePath.setPos(-0.1, 0, -0.05) placePath.setScale(0.3) placePath.setDepthWrite(0) return (row, nameText, timeText, placeText) def delete(self): self.notify.debug('delete: deleting local leaderboard') self.ignoreAll() self.board.removeNode() DistributedObject.delete(self)