class LaffMeter(DirectFrame):
    deathColor = Vec4(0.58039216, 0.80392157, 0.34117647, 1.0)

    def __init__(self, avdna, hp, maxHp):
        DirectFrame.__init__(self, relief=None, sortOrder=50)
        self.initialiseoptions(LaffMeter)
        self.container = DirectFrame(parent=self, relief=None)
        self.style = avdna
        self.av = None
        self.hp = hp
        self.maxHp = maxHp
        self.__obscured = 0
        if self.style.type == 't':
            self.isToon = 1
        else:
            self.isToon = 0

        self.load()

    def obscure(self, obscured):
        self.__obscured = obscured
        if self.__obscured:
            self.hide()
            base.localAvatar.expBar.hide(
            )  # Hacky, I know, but I'll figure out a better way to hide the exp bar

    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]
        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
Ejemplo n.º 2
0
class LaffOMeter(DirectFrame):

    deathColor = Vec4(0.58039216, 0.80392157, 0.34117647, 1.0)

    def __init__(self, forRender=False):
        DirectFrame.__init__(self,
                             relief=None,
                             sortOrder=50,
                             parent=base.a2dBottomLeft)
        self.initialiseoptions(LaffOMeter)
        self.container = DirectFrame(parent=self, relief=None)
        self.container.setBin('gui-popup', 60)

        if forRender:
            self.container.setY(0)
            self.setLightOff()
            self.setFogOff()
            self.setMaterialOff()
            self.hide(CIGlobals.ShadowCameraBitmask)
        self.forRender = forRender

    def generate(self, r, g, b, animal, maxHP=50, initialHP=50):
        self.maxHP = maxHP
        self.initialHP = initialHP
        self.color = (r, g, b, 1)

        gui = loader.loadModel("phase_3/models/gui/laff_o_meter.bam")
        if animal == "rabbit":
            animal = "bunny"
        headmodel = gui.find('**/' + animal + 'head')
        self.container['image'] = headmodel
        self.container['image_color'] = self.color
        if animal == 'monkey':
            self.setPos(0.153, 0.0, 0.13)
        else:
            self.setPos(0.133, 0, 0.13)
        self.resetFrameSize()
        self.setScale(0.075)
        self.frown = DirectFrame(parent=self.container,
                                 relief=None,
                                 image=gui.find('**/frown'))
        self.smile = DirectFrame(parent=self.container,
                                 relief=None,
                                 image=gui.find('**/smile'))
        self.eyes = DirectFrame(parent=self.container,
                                relief=None,
                                image=gui.find('**/eyes'))
        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.teethList = [
            self.tooth6, self.tooth5, self.tooth4, self.tooth3, self.tooth2,
            self.tooth1
        ]
        if self.forRender:
            self.container['image_pos'] = (0, 0.01, 0)
            for tooth in self.teethList:
                tooth.setDepthWrite(False)
            self.eyes.setDepthWrite(False)
            self.smile.setDepthWrite(False)
            self.openSmile.setDepthWrite(False)
            self.frown.setDepthWrite(False)
        self.fractions = [0.0, 0.166666, 0.333333, 0.5, 0.666666, 0.833333]

        self.currentHealthLbl = DirectLabel(text=str(self.initialHP),
                                            parent=self.eyes,
                                            pos=(-0.425, 0, 0.05),
                                            scale=0.4,
                                            relief=None)
        self.maxHealthLbl = DirectLabel(text=str(self.maxHP),
                                        parent=self.eyes,
                                        pos=(0.425, 0, 0.05),
                                        scale=0.4,
                                        relief=None)
        if self.forRender:
            self.currentHealthLbl.setY(-0.01)
            self.maxHealthLbl.setY(-0.01)

        self.updateMeter(self.initialHP)
        gui.removeNode()
        return

    def start(self):
        taskMgr.add(self.updateMeterTask, "updateMeterTask")

    def updateMeterTask(self, task):
        if hasattr(base, 'localAvatar'):
            if str(base.localAvatar.getHealth()
                   ) != self.currentHealthLbl['text']:
                self.updateMeter(base.localAvatar.getHealth())
        else:
            return task.done
        return task.cont

    def updateMeter(self, health):
        self.adjustFace(health)

    def adjustFace(self, health):
        self.frown.hide()
        self.smile.hide()
        self.openSmile.hide()
        self.eyes.hide()
        for tooth in self.teethList:
            tooth.hide()
        if health <= 0:
            self.frown.show()
            self.container['image_color'] = self.deathColor
        elif health >= self.maxHP:
            self.smile.show()
            self.eyes.show()
            self.container['image_color'] = self.color
        else:
            self.openSmile.show()
            self.eyes.show()
            self.maxHealthLbl.show()
            self.currentHealthLbl.show()
            self.container['image_color'] = self.color
            self.adjustTeeth(health)
        self.animatedEffect(health - self.initialHP)
        self.adjustText(health)

    def animatedEffect(self, delta):
        if delta == 0:
            return
        name = 'effect'
        if delta > 0:
            ToontownIntervals.start(
                ToontownIntervals.getPulseLargerIval(self.container, name))
        else:
            ToontownIntervals.start(
                ToontownIntervals.getPulseSmallerIval(self.container, name))

    def adjustTeeth(self, health):
        for i in xrange(len(self.teethList)):
            if health > self.maxHP * self.fractions[i]:
                self.teethList[i].show()
            else:
                self.teethList[i].hide()

    def adjustText(self, health):
        if self.maxHealthLbl['text'] != str(
                self.maxHP) or self.currentHealthLbl['text'] != str(health):
            self.currentHealthLbl['text'] = str(health)

    def stop(self):
        taskMgr.remove("updateMeterTask")

    def disable(self):
        if not hasattr(self, 'frown'):
            notify.warning("Won't disable LaffOMeter, no var named frown.")
            return
        self.frown.destroy()
        self.smile.destroy()
        self.eyes.destroy()
        self.openSmile.destroy()
        self.tooth1.destroy()
        self.tooth2.destroy()
        self.tooth3.destroy()
        self.tooth4.destroy()
        self.tooth5.destroy()
        self.tooth6.destroy()
        del self.frown
        del self.smile
        del self.eyes
        del self.openSmile
        del self.tooth1
        del self.tooth2
        del self.tooth3
        del self.tooth4
        del self.tooth5
        del self.tooth6
        self.container["image"] = None
        return

    def delete(self):
        self.container.destroy()
        del self.container
        return
class LaffMeter(DirectFrame):
    deathColor = Vec4(0.58039216, 0.80392157, 0.34117647, 1.0)

    def __init__(self, avdna, hp, maxHp):
        DirectFrame.__init__(self, relief=None, sortOrder=50)
        self.initialiseoptions(LaffMeter)
        self.container = DirectFrame(parent=self, relief=None)
        self.style = avdna
        self.av = None
        self.hp = hp
        self.maxHp = maxHp
        self.__obscured = 0
        if self.style.type == 't':
            self.isToon = 1
        else:
            self.isToon = 0
        self.load()
        return

    def obscure(self, obscured):
        self.__obscured = obscured
        if self.__obscured:
            self.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')
            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.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.openSmile.setY(-0.1)
            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]
        gui.removeNode()
        return

    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 range(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))
        return

    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)
        return

    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
Ejemplo n.º 4
0
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