from direct.fsm import ClassicFSM, State from direct.gui.DirectGui import * from direct.task.Task import Task from pandac.PandaModules import * import time from DistributedNPCToonBase import * from toontown.chat.ChatGlobals import * from toontown.effects import DustCloud from toontown.nametag.NametagGlobals import * from toontown.toonbase import TTLocalizer, ToontownGlobals from toontown.toon.ToonDNA import allColorsList def getDustCloud(toon): dustCloud = DustCloud.DustCloud(fBillboard=0) dustCloud.setBillboardAxis(2.0) dustCloud.setZ(3) dustCloud.setScale(0.4) dustCloud.createTrack() return Sequence(Wait(0.5), Func(dustCloud.reparentTo, toon), dustCloud.track, Func(dustCloud.destroy)) class DistributedNPCGlove(DistributedNPCToonBase): def __init__(self, cr): DistributedNPCToonBase.__init__(self, cr) self.nextCollision = 0 self.fsm = ClassicFSM.ClassicFSM( 'NPCGlove', [ State.State('off', self.enterOff, self.exitOff, ['pickColor']), State.State('pickColor', self.enterPickColor, self.exitPickColor, ['off']) ], 'off', 'off') self.fsm.enterInitialState() self.title = None self.notice = None self.color = None self.buyButton = None self.cancelButton = None self.leftButton = None self.rightButton = None self.index = 0 self.gui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui') self.shuffleArrowUp = self.gui.find('**/tt_t_gui_mat_shuffleArrowUp') self.shuffleArrowDown = self.gui.find('**/tt_t_gui_mat_shuffleArrowDown') self.shuffleUp = self.gui.find('**/tt_t_gui_mat_shuffleUp') self.shuffleDown = self.gui.find('**/tt_t_gui_mat_shuffleDown') def disable(self): self.ignoreAll() self.destroyGui() self.nextCollision = 0 DistributedNPCToonBase.disable(self) def destroyGui(self): for element in [self.title, self.notice, self.color, self.buyButton, self.cancelButton, self.leftButton, self.rightButton]: if element: element.destroy() element = None self.index = 0 def createGui(self): self.title = DirectLabel(aspect2d, relief=None, text=TTLocalizer.GloveGuiTitle, text_fg=(0, 1, 0, 1), text_scale=0.15, text_font=ToontownGlobals.getSignFont(), pos=(0, 0, -0.30), text_shadow=(1, 1, 1, 1)) self.notice = DirectLabel(aspect2d, relief=None, text=TTLocalizer.GloveGuiNotice % ToontownGlobals.GloveCost, text_fg=(1, 0, 0, 1), text_scale=0.11, text_font=ToontownGlobals.getSignFont(), pos=(0, 0, -0.45), text_shadow=(1, 1, 1, 1)) self.color = DirectLabel(aspect2d, relief=None, text='', text_scale=0.11, text_font=ToontownGlobals.getSignFont(), pos=(0, 0, -0.70), text_shadow=(1, 1, 1, 1)) self.buyButton = DirectButton(aspect2d, relief=None, image=(self.shuffleUp, self.shuffleDown), text=TTLocalizer.GloveGuiBuy, text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.11, text_pos=(0, -0.02), pos=(-0.60, 0, -0.90), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), command=self.handleBuy) self.cancelButton = DirectButton(aspect2d, relief=None, image=(self.shuffleUp, self.shuffleDown), text=TTLocalizer.GloveGuiCancel, text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.11, text_pos=(0, -0.02), pos=(0.60, 0, -0.90), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), command=self.leave) self.leftButton = DirectButton(aspect2d, relief=None, image=(self.shuffleArrowUp, self.shuffleArrowDown), pos=(-0.60, 0, -0.66), command=self.handleSetIndex, extraArgs=[-1]) self.rightButton = DirectButton(aspect2d, relief=None, image=(self.shuffleArrowUp, self.shuffleArrowDown), pos=(0.60, 0, -0.66), scale=-1, command=self.handleSetIndex, extraArgs=[1]) self.updateGuiByIndex() def handleSetIndex(self, offset): newIndex = self.index + offset if newIndex > -1 and newIndex < len(TTLocalizer.NumToColor): self.index = newIndex self.updateGuiByIndex() def updateGuiByIndex(self): self.color['text'] = TTLocalizer.NumToColor[self.index] self.color['text_fg'] = allColorsList[self.index] def handleBuy(self): self.d_requestTransformation(self.index) def initToonState(self): self.setAnimState('neutral', 1.05, None, None) self.setPosHpr(101, -14, 4, -305, 0, 0) def getCollSphereRadius(self): return 1.0 def handleCollisionSphereEnter(self, collEntry): self.currentTime = time.time() if self.nextCollision <= self.currentTime: self.fsm.request('pickColor') self.nextCollision = self.currentTime + 2 def enterOff(self): pass def exitOff(self): pass def enterPickColor(self): base.cr.playGame.getPlace().setState('stopped') taskMgr.doMethodLater(45, self.leave, 'npcSleepTask-%s' % self.doId) self.setChatAbsolute('', CFSpeech) if base.localAvatar.getTotalMoney() < ToontownGlobals.GloveCost: self.setChatAbsolute(self.getMessageById(2), CFSpeech|CFTimeout) self.reset() else: self.popupPickColorGUI() def exitPickColor(self, task=None): taskMgr.remove('npcSleepTask-%s' % self.doId) taskMgr.doMethodLater(0.5, self.reset, 'avatarRecover-%s-%s' % (self.doId, base.localAvatar.doId)) if task is not None: return task.done def popupPickColorGUI(self): self.setChatAbsolute('', CFSpeech) self.setChatAbsolute(TTLocalizer.GlovePickColorMessage, CFSpeech|CFTimeout) base.setCellsActive(base.bottomCells, 0) self.createGui() def getMessageById(self, response): if response == 1: return TTLocalizer.GloveSameColorMessage elif response == 2: return TTLocalizer.GloveNoMoneyMessage else: return TTLocalizer.GloveSuccessMessage def doTransformation(self, avId, response): av = self.cr.doId2do.get(avId) if not av: return if response == 3: getDustCloud(av).start() self.setChatAbsolute('', CFSpeech) self.setChatAbsolute(self.getMessageById(response), CFSpeech|CFTimeout) def d_requestTransformation(self, color): self.sendUpdate('requestTransformation', [color]) self.reset() def leave(self, task=None): self.setChatAbsolute('', CFSpeech) self.setChatAbsolute(TTLocalizer.GloveByeMessage, CFSpeech|CFTimeout) self.reset(task) def reset(self, task=None): self.fsm.request('off') base.cr.playGame.getPlace().setState('walk') base.setCellsActive(base.bottomCells, 1) self.destroyGui() if task is not None: return task.done