class BuffIcon(DirectFrame):
    Background = None
    Card = None

    def __init__(self, parent, effectId, duration, attackerId, **kw):
        optiondefs = (('relief', None, None),)
        self.defineoptions(kw, optiondefs)
        DirectFrame.__init__(self, parent)
        self.initialiseoptions(BuffIcon)
        if not self.Background:
            self.Background = loader.loadModel('models/gui/lookout_gui').find('**/lookout_submit')
            self.Background.setScale(0.33000000000000002)

        if not self.Card:
            self.Card = loader.loadModel('models/textureCards/buff_icons')

        self.myIcon = None
        self.detailFrame = None
        self.dial = None
        self.iconScale = 0.070000000000000007
        self.effectId = effectId
        self.maxDuration = duration
        self.timeLeft = duration
        self.lastTimestamp = None
        self.attackerId = attackerId
        self.setDepthWrite(0)
        self.setFogOff()
        self.setLightOff()
        self.setBin('gui-fixed', 0)


    def makeIcons(self):
        self.Background.copyTo(self)
        self.dial = DialMeter(parent = self, meterColor = Vec4(0.29999999999999999, 0.0, 0.80000000000000004, 1), baseColor = Vec4(0, 0, 0, 1), scale = 0.17000000000000001, sortOrder = 0)
        if self.effectId in buffTable:
            info = buffTable.get(self.effectId)
        else:
            info = buffTable.get(WeaponGlobals.C_UNKNOWN_EFFECT)
        self.myIcon = DirectButton(parent = self, relief = None, geom = self.Card.find('**/' + info[0]), geom_scale = self.iconScale, sortOrder = 1)
        self.myIcon.bind(DGG.ENTER, self.showDetails)
        self.myIcon.bind(DGG.EXIT, self.hideDetails)
        self.updateIconInfo()


    def makeDetails(self):
        if self.detailFrame:
            return None

        normalScale = 0.97307200000000005
        parent = self.getParent()
        if parent:
            for i in range(0, 2):
                parent = parent.getParent()
                if not parent:
                    break
                    continue


        if parent:
            parentScale = parent.getScale()[0]
        else:
            parentScale = normalScale
        durationStr = str(int(self.maxDuration))
        if self.effectId in buffTable:
            text = buffTable[self.effectId][1] + PLocalizer.BuffDuration % durationStr
        else:
            text = buffTable[WeaponGlobals.C_UNKNOWN_EFFECT][1] + PLocalizer.BuffDuration % durationStr
        self.detailBox = DirectLabel(state = DGG.DISABLED, relief = None, text = text, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleExtraLarge * normalScale / parentScale, text_fg = (1, 1, 1, 1), text_wordwrap = 15, text_shadow = (0, 0, 0, 1), textMayChange = 1)
        height = -(self.detailBox.getHeight() + 0.01)
        width = max(0.25, self.detailBox.getWidth() + 0.040000000000000001)
        self.detailFrame = BorderFrame(parent = self.myIcon, state = DGG.DISABLED, frameSize = (-0.040000000000000001, width, height, 0.070000000000000007), pos = (0.050000000000000003, 0, -0.050000000000000003))
        self.detailBox.reparentTo(self.detailFrame)
        self.detailFrame.setBin('gui-popup', 0)
        self.detailFrame.hide()


    def showDetails(self, event):
        self.makeDetails()
        self.detailFrame.show()
        self.updateIconInfo()


    def hideDetails(self, event):
        if self.detailFrame:
            self.detailFrame.hide()



    def updateIconInfo(self):
        if self.lastTimestamp == None:
            timeOffset = 0.0
        else:
            timeOffset = globalClockDelta.localElapsedTime(self.lastTimestamp)
        duration = max(0.0, self.timeLeft - timeOffset)
        self.dial.update(duration, self.maxDuration)
        if self.detailFrame and not self.detailFrame.isHidden():
            if duration > 0:
                durationStr = PLocalizer.BuffDuration % str(int(duration) + 1)
            else:
                durationStr = ''
            if self.effectId in buffTable:
                text = buffTable[self.effectId][1] + durationStr
            else:
                text = buffTable[WeaponGlobals.C_UNKNOWN_EFFECT][1] + durationStr
            self.detailBox['text'] = text



    def destroy(self):
        DirectFrame.destroy(self)
class SkillpageGuiButton(DirectButton):
    SkillIcons = None

    def __init__(self, callback, skillId, skillRank):
        if not SkillpageGuiButton.SkillIcons:
            SkillpageGuiButton.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            SkillpageGuiButton.Image = (SkillpageGuiButton.SkillIcons.find('**/base'), SkillpageGuiButton.SkillIcons.find('**/base_down'), SkillpageGuiButton.SkillIcons.find('**/base_over'))

        asset = RadialMenu.getSkillIconName(skillId, 0)
        geom = SkillpageGuiButton.SkillIcons.find('**/%s' % asset)
        DirectButton.__init__(self, relief = None, pos = (0, 0, 0), image = SkillpageGuiButton.Image, image_scale = 0.12, geom = geom, geom_scale = 0.12, command = callback, textMayChange = 1, sortOrder = 70, extraArgs = [
            skillId])
        self.initialiseoptions(SkillpageGuiButton)
        self.skillId = skillId
        self.skillRank = skillRank
        self.showUpgrade = 0
        self.helpBox = None
        self.quantity = None
        self.bind(DGG.ENTER, self.showDetails)
        self.bind(DGG.EXIT, self.hideDetails)


    def createHelpbox(self, args = None):
        if self.helpBox:
            return None

        baseRank = max(self.skillRank, 1)
        lvlDamageMod = WeaponGlobals.getLevelDamageModifier(localAvatar.getLevel())
        buff = WeaponGlobals.getSkillEffectFlag(self.skillId)
        dur = WeaponGlobals.getAttackDuration(self.skillId)
        effect = dur + dur * (baseRank - 1) / 4
        dodge = WeaponGlobals.getAttackDodge(self.skillId) * baseRank
        accuracy = 0
        damageMod = 0
        reduceDamMod = 0
        rechargeMod = 0
        shipTurningMod = 0
        shipSpeedMod = 0
        rangeMod = 0
        treasureSenseMod = 0
        manaCost = WeaponGlobals.getMojoCost(self.skillId)
        damage = 0
        loDamage = 0
        mpDamage = 0
        chargeMod = 0
        if self.skillId == InventoryType.SailBroadsideLeft or self.skillId == InventoryType.SailBroadsideRight:
            damageMod = WeaponGlobals.getAttackTargetHP(self.skillId) * (baseRank - 1) * 100
        elif self.skillId == InventoryType.CannonShoot:
            rechargeMod = WeaponGlobals.CANNON_SHOOT_RATE_REDUCTION * (baseRank - 1) * 100
        elif WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.TONIC_SKILL_INDEX:
            damage = WeaponGlobals.getAttackSelfHP(self.skillId)
        elif WeaponGlobals.getSkillTrack(self.skillId) != WeaponGlobals.PASSIVE_SKILL_INDEX:
            damage = int(WeaponGlobals.getAttackTargetHP(self.skillId) * (1.0 + WeaponGlobals.LEVELUP_DAMAGE_MULTIPLIER * (baseRank - 1))) * lvlDamageMod
            loDamage = damage / 2
            mpDamage = int(WeaponGlobals.getAttackTargetMojo(self.skillId) * (1.0 + WeaponGlobals.LEVELUP_DAMAGE_MULTIPLIER * (baseRank - 1))) * lvlDamageMod
            mpLoDamage = mpDamage / 2
        else:
            accuracy = WeaponGlobals.getAttackAccuracy(self.skillId) * baseRank
            damageMod = WeaponGlobals.getAttackTargetHP(self.skillId) * baseRank * 100
            reduceDamMod = WeaponGlobals.getAttackSelfHP(self.skillId) * baseRank
            if reduceDamMod < 1:
                reduceDamMod *= 100

            if effect < 1:
                effect *= 100

            rechargeMod = WeaponGlobals.getAttackRechargeTime(self.skillId) * baseRank * 100
            shipTurningMod = WeaponGlobals.getShipTurnRate(self.skillId) * baseRank * 100
            shipSpeedMod = WeaponGlobals.getShipMaxSpeed(self.skillId) * baseRank * 100
            treasureSenseMod = (WeaponGlobals.TREASURE_SENSE_BONUS / 2) * baseRank
            rangeMod = WeaponGlobals.getAttackRange(self.skillId) * baseRank
            manaCost *= baseRank
            chargeMod = WeaponGlobals.getAttackMaxCharge(self.skillId) * baseRank * 100
        if self.skillId == InventoryType.StaffSpiritLore:
            import pdb as pdb
            pdb.set_trace()

        skillInfo = PLocalizer.SkillDescriptions.get(self.skillId)
        skillTitle = PLocalizer.InventoryTypeNames.get(self.skillId)
        skillType = 'slant' + skillInfo[0] + '\n\n'
        description = skillInfo[1]
        if damage < 0:
            description += ' ' + PLocalizer.DealsDamage
        elif damage > 0:
            if loDamage:
                description += ' ' + PLocalizer.HealsDamageRange
            else:
                description += ' ' + PLocalizer.HealsDamage

        if mpDamage < 0:
            description += ' ' + PLocalizer.DealsMpDamage

        effectId = WeaponGlobals.getSkillEffectFlag(self.skillId)
        if effectId:
            description += ' ' + SkillEffectDescriptions.get(effectId)[0]

        if (self.skillId == InventoryType.SailBroadsideLeft or self.skillId == InventoryType.SailBroadsideRight) and damageMod > 0:
            description += ' ' + PLocalizer.BroadsideDesc

        if self.skillId == InventoryType.CannonShoot and rechargeMod:
            description += ' ' + PLocalizer.CannonShootDesc

        if self.skillId == InventoryType.DollAttune:
            description += ' ' + PLocalizer.MultiAttuneDesc

        if WeaponGlobals.getSkillInterrupt(self.skillId):
            description += ' ' + PLocalizer.InterruptDesc

        if WeaponGlobals.getSkillUnattune(self.skillId):
            description += ' ' + PLocalizer.UnattuneDesc

        upgradeInfo = ''
        if self.showUpgrade and self.skillRank < 5:
            if self.skillRank > 0:
                upgradeInfo = skillInfo[2]
                if upgradeInfo == '':
                    if damage < 0:
                        upgradeInfo += PLocalizer.UpgradesDamage
                    elif damage > 0:
                        upgradeInfo += PLocalizer.UpgradesHealing

                    if mpDamage < 0:
                        upgradeInfo += ' ' + PLocalizer.UpgradesMpDamage

                    if effectId:
                        entry = SkillEffectDescriptions.get(effectId)
                        if len(entry) > 1:
                            if not damage:
                                upgradeInfo += PLocalizer.UpgradesDuration
                            else:
                                upgradeInfo += ' ' + PLocalizer.And
                            upgradeInfo += ' ' + entry[1]


                    upgradeInfo += '!'

            elif len(upgradeInfo) >= 4:
                upgradeInfo = skillInfo[3]
            else:
                upgradeInfo = PLocalizer.ClickToLearn

        if self.skillId in SkillComboReq and SkillComboReq[self.skillId] and self.skillRank <= 1:
            description += ' ' + SkillComboReq[self.skillId]

        skillDesc = 'goldsmallCaps' + skillTitle + '\n' + skillType + description + '\ngreen' + upgradeInfo + ''
        stats = []
        if manaCost:
            stats.append(abs(manaCost))

        if damage and loDamage:
            stats.append(abs(loDamage))
            stats.append(abs(damage))
        elif damage:
            stats.append(abs(damage))

        if mpDamage:
            stats.append(abs(mpLoDamage))
            stats.append(abs(mpDamage))

        if buff == WeaponGlobals.C_CURSE:
            stats.append(WeaponGlobals.CURSED_DAM_AMP * 100)

        if buff == WeaponGlobals.C_ATTUNE and baseRank > 1:
            stats.append(baseRank)

        if buff == WeaponGlobals.C_WEAKEN:
            stats.append(WeaponGlobals.WEAKEN_PENALTY * 100)

        if effect > 0:
            stats.append(effect)

        if dodge:
            stats.append(abs(dodge))

        if accuracy:
            stats.append(abs(accuracy))

        if damageMod:
            stats.append(abs(damageMod))

        if reduceDamMod:
            stats.append(abs(reduceDamMod))

        if rechargeMod:
            stats.append(abs(rechargeMod))

        if shipTurningMod:
            stats.append(abs(shipTurningMod))

        if shipSpeedMod:
            stats.append(abs(shipSpeedMod))

        if chargeMod:
            stats.append(abs(chargeMod))

        if rangeMod:
            stats.append(abs(rangeMod))

        if self.skillId == InventoryType.SailTreasureSense:
            stats.append(abs(treasureSenseMod))

        stats = tuple(stats)
        if self.skillRank:
            self.rankText = DirectFrame(parent = self, relief = None, text = ('goldsmallCaps' + PLocalizer.Rank + ' %d' + '') % self.skillRank, text_align = TextNode.ARight, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 15, text_shadow = (0, 0, 0, 1), pos = (0.45000000000000001, 0, 0), textMayChange = 1, sortOrder = 92, state = DGG.DISABLED)

        self.helpText = DirectFrame(parent = self, relief = None, text = skillDesc % stats, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 15, text_shadow = (0, 0, 0, 1), textMayChange = 1, sortOrder = 91, state = DGG.DISABLED)
        height = -(self.helpText.getHeight() + 0.01)
        self.helpBox = BorderFrame(parent = self, frameSize = (-0.040000000000000001, 0.5, height, 0.050000000000000003), pos = (0, 0, -0.12), sortOrder = 90, state = DGG.DISABLED)
        self.helpBox.setBin('gui-popup', 0)
        self.helpText.reparentTo(self.helpBox)
        if self.skillRank:
            self.rankText.reparentTo(self.helpBox)



    def destroy(self):
        if self.quantity:
            self.quantity.destroy()
            self.quantity = None

        self.ignoreAll()
        DirectButton.destroy(self)


    def showDetails(self, event):
        self.createHelpbox()


    def hideDetails(self, event):
        if self.helpBox:
            self.helpBox.destroy()
            self.helpBox = None



    def attachQuantity(self, quantity):
        if self.quantity:
            self.quantity['text'] = 'x%s' % quantity
        else:
            self.quantity = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = 'x%s' % quantity, frameColor = (0, 0, 0, 1), frameSize = (-0.01, 0.02, -0.01, 0.025000000000000001), text_scale = 0.0275, text_align = TextNode.ACenter, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.029999999999999999, 0.0, 0.029999999999999999), text_font = PiratesGlobals.getPirateBoldOutlineFont())
class GuiButton(DirectButton):
    notify = directNotify.newCategory('GuiButton')
    genericButton = None
    redGenericButton = None
    blueGenericButton = None

    def __init__(self, parent = None, hotkeys = (), hotkeyLabel = None, hotkeyLabelX = 0.091999999999999998, hotkeyArgs = True, helpText = '', helpPos = (0, 0, 0), helpDelay = PiratesGuiGlobals.HelpPopupTime, helpColorOff = False, helpLeftAlign = False, helpCenterAlign = False, **kw):
        self.loadGui()
        self.helpBox = None
        self.helpWatcher = None
        self.canRepositon = False
        optiondefs = (('relief', None, None), ('pos', (0, 0, 0), None), ('image', GuiButton.genericButton, None), ('image_scale', (0.23999999999999999, 0.22, 0.22), None), ('image_pos', (0, 0, 0), None), ('pressEffect', 0, None), ('text', '', None), ('text_font', PiratesGlobals.getInterfaceFont(), None), ('text_scale', PiratesGuiGlobals.TextScaleLarge, None), ('text0_fg', PiratesGuiGlobals.TextFG2, None), ('text1_fg', PiratesGuiGlobals.TextFG2, None), ('text2_fg', PiratesGuiGlobals.TextFG2, None), ('text3_fg', PiratesGuiGlobals.TextFG3, None), ('text_shadow', PiratesGuiGlobals.TextShadow, None), ('text_pos', (0, -0.01), None), ('text_wordwrap', 8, None), ('text_align', TextNode.ACenter, None), ('textMayChange', 1, None), ('helpText', helpText, self.helpTextUpdated), ('helpPos', helpPos, self.setHelpPos), ('helpDelay', helpDelay, None), ('helpColorOff', helpColorOff, None), ('helpLeftAlign', helpLeftAlign, None), ('helpCenterAlign', helpCenterAlign, None), ('helpBin', 'gui-popup', None), ('helpBinSort', 0, None), ('helpOpaque', 0, None), ('canReposition', False, None), ('sortOrder', 100, None), ('baseImage', None, None), ('selected', False, None), ('selectedImage', GuiButton.genericButton, None), ('state', DGG.NORMAL, self.setState))
        self.defineoptions(kw, optiondefs)
        DirectButton.__init__(self, parent = NodePath())
        self.initialiseoptions(GuiButton)
        self.hotkeys = ()
        self.setupHotkeys(hotkeys, hotkeyLabel, self['command'], self['extraArgs'], hotkeyLabelX, hotkeyArgs)
        if not parent:
            pass
        self.reparentTo(aspect2d)
        self.helpTaskName = None


    def destroy(self):
        self.hideDetails()
        if self.helpWatcher:
            self.helpWatcher.unbind(DGG.WITHIN)
            self.helpWatcher.unbind(DGG.WITHOUT)
            self.helpWatcher.destroy()
            self.helpWatcher = None

        self.unbind(DGG.ENTER)
        self.unbind(DGG.EXIT)
        self.ignoreAll()
        DirectButton.destroy(self)


    def loadGui(self):
        if GuiButton.genericButton:
            return None

        gui = loader.loadModel('models/gui/toplevel_gui')
        GuiButton.genericButton = (gui.find('**/generic_button'), gui.find('**/generic_button_down'), gui.find('**/generic_button_over'), gui.find('**/generic_button_disabled'))
        GuiButton.redGenericButton = (gui.find('**/pir_t_gui_but_generic'), gui.find('**/pir_t_gui_but_generic_down'), gui.find('**/pir_t_gui_but_generic_over'), gui.find('**/pir_t_gui_but_generic_disabled'))
        GuiButton.blueGenericButton = (gui.find('**/pir_t_gui_but_generic_blue'), gui.find('**/pir_t_gui_but_generic_blue_down'), gui.find('**/pir_t_gui_but_generic_blue_over'), gui.find('**/pir_t_gui_but_generic_blue_disabled'))


    def setupHotkeys(self, hotkeys, hotkeyLabel, command, extraArgs, hotkeyLabelX = 0.091999999999999998, hotkeyArgs = True):
        if self.hotkeys:
            self.ignoreHotkeys()
            self.hotkeyLabel.destroy()

        self.hotkeys = hotkeys
        self.command = command
        self.extraArgs = extraArgs
        self.hotkeyLabel = hotkeyLabel
        self.hotkeyLabelX = hotkeyLabelX
        self.hotkeyArgs = hotkeyArgs
        if self.hotkeys:
            self.hotkeyLabel = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = hotkeyLabel, text_font = PiratesGlobals.getPirateBoldOutlineFont(), text_scale = PiratesGuiGlobals.TextScaleMed, text_pos = (hotkeyLabelX, 0.01), text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, textMayChange = 1)
            self.acceptHotkeys()
        

    
    def ignoreHotkeys(self):
        if self.hotkeys:
            for hotkey in self.hotkeys:
                self.ignore(hotkey)
            
        

    
    def acceptHotkeys(self):
        if self.hotkeys:
            for hotkey in self.hotkeys:
                if self.hotkeyArgs:
                    self.accept(hotkey, self.command, self.extraArgs + [
                        hotkey])
                    continue
                self.accept(hotkey, self.command, self.extraArgs)




    def createHelpWatcher(self):
        if self['helpOpaque']:
            self.bind(DGG.ENTER, self.waitShowDetails)
            self.bind(DGG.EXIT, self.hideDetails)
        else:
            w = self.getWidth()
            h = self.getHeight()
            pos = self._GuiButton__discoverHelpWatcherPos()
            if not self['frameSize']:
                pass
            frameSize = self.getBounds()
            self.helpWatcher = DirectFrame(parent = self, relief = base.config.GetBool('show-helpwatchers', 0), state = DGG.NORMAL, frameColor = (1, 1, 0, 0.5), frameSize = frameSize, sortOrder = self['sortOrder'] - 1)
            self.helpWatcher.wrtReparentTo(self.getParent())
            self.reparentTo(self.getParent())
            self.helpWatcher.bind(DGG.WITHIN, self.waitShowDetails)
            self.helpWatcher.bind(DGG.WITHOUT, self.hideDetails)


    def _GuiButton__discoverHelpWatcherPos(self):
        w = self.getWidth()
        h = self.getHeight()
        if not self['frameSize']:
            pass
        bounds = self.getBounds()
        pos = Vec3(bounds[0] + w / 2, 0, bounds[2] + h / 2)
        return pos


    def resetHelpWatcher(self):
        if self.helpWatcher:
            self.helpWatcher.setPos(self, 0, 0, 0)



    def createHelpBox(self):
        if not self.helpWatcher:
            self.createHelpWatcher()

        helpLabel = DirectLabel(relief = None, state = DGG.DISABLED, text = self['helpText'], text_align = TextNode.ACenter, text_scale = PiratesGuiGlobals.TextScaleMed, text_fg = PiratesGuiGlobals.TextFG1, text_wordwrap = 12, text_shadow = (0, 0, 0, 1), textMayChange = 0, sortOrder = 91)
        height = helpLabel.getHeight()
        width = helpLabel.getWidth() + 0.050000000000000003
        if self['helpLeftAlign']:
            fs = [
                0.0,
                width,
                -height,
                0.044999999999999998]
            pos = [
                width / 2.0,
                0,
                -0.01]
        elif self['helpCenterAlign']:
            pos = [
                0.0,
                0.0,
                -0.01]
            fs = [
                -(width / 2 + 0.01),
                width / 2 + 0.01,
                -(height / 2 + 0.014999999999999999),
                height / 2 + 0.014999999999999999]
        else:
            fs = [
                0.25 - width,
                0.25,
                -height,
                0.044999999999999998]
            pos = [
                0.25 - width / 2.0,
                0,
                -0.01]
        self.helpBox = BorderFrame(parent = self, state = DGG.DISABLED, frameSize = (fs[0], fs[1], fs[2], fs[3]), modelName = 'general_frame_f', pos = self['helpPos'], sortOrder = 90)
        helpLabel.reparentTo(self.helpBox)
        helpLabel.setPos(pos[0], pos[1], pos[2])
        self.helpBox.hide()
        self.helpBox.setClipPlaneOff()
        pos = self.helpBox.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.helpBox.setPos(aspect2d, x, 0, z)
        if self['helpColorOff']:
            self.helpBox.setColorOff()
        else:
            self.helpBox.flattenLight()
        if self['helpBin']:
            self.helpBox.setBin(self['helpBin'], self['helpBinSort'])



    def helpTextUpdated(self):
        if self.helpBox and self.helpBox['text'] != self['helpText']:
            self.helpBox.destroy()
            self.createHelpBox()
        elif self['helpText']:
            self.createHelpBox()



    def setHelpPos(self):
        if self.helpBox:
            self.helpTextUpdated()



    def waitShowDetails(self, event):

        try:
            self['helpDelay']
        except AttributeError:
            return None

        if not self.helpBox:
            self.createHelpBox()

        if self['helpDelay']:
            self.hideDetails()
            self.helpTaskName = 'helpInfoTask-%s' % self.getName()
            taskMgr.doMethodLater(self['helpDelay'], self.helpBox.show, self.helpTaskName, extraArgs = [])
        else:
            self.helpBox.show()


    def hideDetails(self, event = None):
        if self.helpTaskName:
            taskMgr.remove(self.helpTaskName)

        if self.helpBox and not self.helpBox.isEmpty():
            self.helpBox.hide()



    def setImage(self):
        DirectButton.setImage(self)
        if not self['baseImage']:
            self['baseImage'] = self['image']



    def setSelected(self):
        if self['selected']:
            self['image'] = self['selectedImage']
        else:
            self['image'] = self['baseImage']


    def setState(self):
        DirectButton.setState(self)
        if self.helpWatcher:
            self.helpWatcher['state'] = self['state']



    def removeNode(self):
        DirectButton.removeNode(self)
        if self.helpWatcher:
            self.helpWatcher.removeNode()



    def remove(self):
        DirectButton.remove(self)
        if self.helpWatcher:
            self.helpWatcher.remove()



    def detachNode(self):
        DirectButton.detachNode(self)
        if self.helpWatcher:
            self.helpWatcher.detachNode()



    def hide(self):
        DirectButton.hide(self)
        if self.helpWatcher:
            self.helpWatcher.hide()



    def show(self):
        DirectButton.show(self)
        if self.helpWatcher:
            self.helpWatcher.show()



    def stash(self):
        DirectButton.stash(self)
        if self.helpWatcher:
            self.helpWatcher.stash()



    def unstash(self):
        DirectButton.unstash(self)
        self.reparentTo(self.getParent(), sort = self['sortOrder'])
        if self.helpWatcher:
            self.helpWatcher.unstash()
            self.helpWatcher.reparentTo(self.helpWatcher.getParent(), sort = self.helpWatcher['sortOrder'])
Exemplo n.º 4
0
class Dart(PickableModel):

    def __init__(self, name, parent, defaultPos, color = Vec4(1), offset = 0.0, *args, **kwargs):
        self.startScale = 0.074999999999999997
        self.highlightScale = 0.10000000000000001
        PickableModel.__init__(self, name, modelName = 'icon_objective_grey', scale = self.startScale, collisionIndex = 17, modelPath = 'models/gui/compass_main', *args, **kwargs)
        self.defaultPos = defaultPos
        self.edgeMode = False
        self.helpBox = None
        self.helpLabel = None
        self.normalModeNode = self.attachNewNode('normal')
        self.normalModeNode.setColorScale(color)
        self.normalModeNode.setY(-(offset + 0.0074999999999999997))
        self.geom.instanceTo(self.normalModeNode)
        self.colNode = self.normalModeNode.attachNewNode(CollisionNode('cNode'))
        self.colNode.node().addSolid(CollisionSphere(Point3(0, 0, 0), 0.25))
        self.colNode.setScale(1 / 20.0)
        self.colNode.node().setFromCollideMask(BitMask32.allOff())
        self.colNode.node().setIntoCollideMask(BitMask32.bit(17))
        self.setTag('dart', name)
        self.setPos(self.defaultPos)
        self.createHelpBox()
        questId = localAvatar.activeQuestId
        qs = localAvatar.getQuestById(questId)
        if qs:
            title = qs.getStatusText()
            self.setHelpLabel(title)



    def toggleHelpText(self):
        if self.helpBox:
            if not self.helpBox.isHidden():
                self.hideDetails()




    def createHelpBox(self):
        if not self.helpBox:
            self.helpLabel = DirectLabel(parent = aspect2d, relief = None, text = '', text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 12, text_shadow = (0, 0, 0, 1), textMayChange = 1, sortOrder = 91)
            height = -(self.helpLabel.getHeight() + 0.01)
            width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
            self.helpBox = BorderFrame(parent = aspect2d, state = DGG.DISABLED, frameSize = (-0.040000000000000001, width, height, 0.050000000000000003), pos = (0, 0, 0), sortOrder = 90)
            self.helpLabel.reparentTo(self.helpBox)
            self.helpBox.hide()



    def setHelpLabel(self, text):
        self.helpLabel['text'] = text
        self.helpLabel.resetFrameSize()
        height = -(self.helpLabel.getHeight() + 0.01)
        width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
        self.helpBox['frameSize'] = (-0.040000000000000001, width, height, 0.050000000000000003)
        self.helpBox.resetFrameSize()


    def showDetails(self, pos):
        if self.helpLabel['text'] != '':
            self.helpBox.setPos(pos + Point3(self.helpBox['frameSize'][1] * 0.25, 0, 0))
            self.helpBox.setBin('gui-popup', 0)
            self.helpBox.show()
            self.geom.setScale(self.highlightScale)



    def hideDetails(self):
        if self.helpBox:
            self.helpBox.hide()
            self.geom.setScale(self.startScale)



    def mouseOver(self, pos):
        self.showDetails(pos)


    def mouseLeft(self):
        self.hideDetails()


    def getDefaultPos(self):
        return self.defaultPos


    def setEdgeMode(self, edgeMode):
        self.edgeMode = edgeMode
        if self.edgeMode:
            self.edgeModeNode.unstash()
        else:
            self.edgeModeNode.stash()


    def setColorScale(self, *args, **kwargs):
        self.edgeModeNode.setColorScale(*args, **kwargs)
        self.normalModeNode.setColorScale(*args, **kwargs)


    def setScale(self, *args, **kwargs):
        self.normalModeNode.setScale(*args, **kwargs)


    def setPosition(self, worldPos, *args, **kwargs):
        NodePath.setPos(self, *args, **kwargs)
        if self.edgeMode:
            self.edgeModeNode.setPos(*args, **kwargs)
class AmmoPanelButton(DirectButton):
    SkillIcons = None
    
    def __init__(self, callback, skillId, skillRank):
        if not AmmoPanelButton.SkillIcons:
            AmmoPanelButton.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            AmmoPanelButton.Image = (AmmoPanelButton.SkillIcons.find('**/base'), AmmoPanelButton.SkillIcons.find('**/base_down'), AmmoPanelButton.SkillIcons.find('**/base_over'))
        
        self.locked = True
        self.purchaseable = True
        self.cost = CannonDefenseGlobals.getDefenseCannonAmmoCost(skillId)
        self.amount = CannonDefenseGlobals.getDefenseCannonAmmoAmount(skillId)
        if self.amount == -1:
            self.amount = PLocalizer.Unlimited
        
        self.skillId = skillId
        self.skillRank = skillRank
        self.infoBox = None
        self.flashIval = None
        asset = RadialMenu.getSkillIconName(skillId, 0)
        geom = AmmoPanelButton.SkillIcons.find('**/%s' % asset)
        self.geom = geom
        if self.locked:
            asset = None
            geom = None
        
        DirectButton.__init__(self, relief = None, pos = (0, 0, 0), text = '?', text_scale = 0.10000000000000001, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_pos = (0.0050000000000000001, -0.035000000000000003), text_align = TextNode.ACenter, image = AmmoPanelButton.Image, image_scale = 0.12, geom = geom, geom_scale = 0.12, command = callback, textMayChange = 1, sortOrder = 70, extraArgs = [
            skillId])
        self.initialiseoptions(AmmoPanelButton)
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.lockIcon = gui.find('**/pir_t_gui_gen_key_subscriber')
        if not Freebooter.getPaidStatus(base.localAvatar.doId) and skillId > CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
            self.lock = DirectFrame(parent = self, relief = None, image = self.lockIcon, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, -0.025000000000000001), sortOrder = 99)
        
        self.bind(DGG.ENTER, self.showDetails)
        self.bind(DGG.EXIT, self.hideDetails)

    
    def createTextBox(self):
        if self.infoBox:
            return None
        
        globalPos = self.getPos(base.a2dLeftCenter)
        self.infoBox = None
        self.infoBox = BorderFrame(parent = base.a2dLeftCenter, frameSize = (-0.040000000000000001, 0.5, -0.25, 0.050000000000000003), pos = (globalPos.getX() + 0.12, 0, globalPos.getZ()), state = DGG.DISABLED)
        self.label = DirectLabel(parent = self.infoBox, relief = None, text = PLocalizer.CannonDefenseAmmoDesc % (PLocalizer.makeHeadingString(PLocalizer.InventoryTypeNames[self.skillId], 2), self.cost, self.amount, PLocalizer.CannonDefenseAmmoTypeDesc[self.skillId]), text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleLarge, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 12, textMayChange = 1)
        if self.locked:
            memberText = ''
            if self.skillId > CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
                memberText = PLocalizer.VR_AuthAccess
            
            self.label['text'] = PLocalizer.CannonDefenseAmmoUnlockedAt % (CannonDefenseGlobals.getLevelUnlockedAt(self.skillId), memberText)
        
        self.infoBox.setBin('gui-cannonDefense', 4)

    
    def showDetails(self, event):
        self.createTextBox()

    
    def hideDetails(self, event):
        if self.infoBox:
            self.infoBox.destroy()
            self.infoBox = None
        

    
    def isLocked(self):
        return self.locked

    
    def unlock(self):
        if self.locked:
            self['text'] = ''
            self['geom'] = self.geom
            self['geom_scale'] = 0.12
            self.locked = False
        

    
    def canPurchase(self, bankNotes):
        if not self.purchaseable:
            return False
        
        return bankNotes >= self.cost

    
    def enablePurchase(self):
        self.purchaseable = True
        self.setAlphaScale(1.0)

    
    def disablePurchase(self):
        self.purchaseable = False
        self.setAlphaScale(0.40000000000000002)

    
    def flash(self):
        if self.flashIval:
            self.flashIval.pause()
        
        self.flashIval = Sequence(LerpColorInterval(self, 0.25, color = VBase4(0.69999999999999996, 0.10000000000000001, 0.10000000000000001, 1.0), blendType = 'easeOut'), LerpColorInterval(self, 0.25, color = VBase4(1.0, 1.0, 1.0, 1.0), blendType = 'easeOut'))
        self.flashIval.start()
Exemplo n.º 6
0
class SongItemGui(SongListItem):
    width = PiratesGuiGlobals.InventoryItemGuiWidth
    height = PiratesGuiGlobals.InventoryItemGuiHeight
    available = True
    
    def __init__(self, data, trade = 0, buy = 0, sell = 0, use = 0, weapon = 0, isDisabled = 0, **kw):
        if (trade and buy and sell and use or weapon) and not isDisabled:
            buttonRelief = DGG.RAISED
            buttonState = DGG.NORMAL
        else:
            buttonRelief = DGG.RIDGE
            buttonState = DGG.DISABLED
        self.loadGui()
        optiondefs = (('relief', None, None), ('state', buttonState, None), ('frameSize', (0, self.width, 0, self.height), None), ('image', SongItemGui.genericButton, None), ('image_scale', (0.54000000000000004, 1, 0.41999999999999998), None), ('image_pos', (0.26000000000000001, 0, 0.080000000000000002), None), ('pressEffect', 0, None), ('command', self.sendEvents, None))
        self.defineoptions(kw, optiondefs)
        SongListItem.__init__(self, data, trade = trade, buy = buy, sell = sell, use = use, weapon = weapon, isDisabled = isDisabled, width = self.width, height = self.height)
        self.initialiseoptions(SongItemGui)
        self.createGui()
        self.helpBox = None

    
    def loadGui(self):
        if SongItemGui.guiLoaded:
            return None
        
        SongListItem.loadGui(self)
        SongItemGui.genericButton = (SongListItem.topGui.find('**/generic_button'), SongListItem.topGui.find('**/generic_button_down'), SongListItem.topGui.find('**/generic_button_over'), SongListItem.topGui.find('**/generic_button_disabled'))

    
    def createGui(self):
        itemId = self.data[0]
        self.picture = DirectFrame(parent = self, relief = None, state = DGG.DISABLED, pos = (0.01, 0, 0.01))
        self.nameTag = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = self.name, text_scale = PiratesGuiGlobals.TextScaleSmall * PLocalizer.getHeadingScale(2), text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG1, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.050000000000000003, 0, 0.105), text_font = PiratesGlobals.getInterfaceFont())
        itemTypeFormatted = ''
        self.itemTypeName = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = itemTypeFormatted, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_font = PiratesGlobals.getInterfaceFont(), pos = (0.050000000000000003, 0, 0.065000000000000002))
        self.miscText = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = '', text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.050000000000000003, 0, 0.025000000000000001))
        if self.minLvl > 0:
            repId = WeaponGlobals.getRepId(itemId)
            if repId:
                self.checkLevel(repId, self.minLvl)
            
        
        trainingReq = EconomyGlobals.getItemTrainingReq(itemId)
        if trainingReq:
            self.checkTrainingReq(trainingReq)
        
        if EconomyGlobals.getItemCategory(itemId) == ItemType.AMMO:
            skillId = WeaponGlobals.getSkillIdForAmmoSkillId(itemId)
            self.checkSkillReq(skillId)
        
        if self.buy:
            self.checkPlayerInventory(itemId)
        
        self.costText = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, image = SongListItem.coinImage, image_scale = 0.12, image_pos = Vec3(-0.01, 0, 0.01), text = str(self.price), text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ARight, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, text_pos = (-0.029999999999999999, 0, 0), pos = (self.width - 0.035000000000000003, 0, 0.105), text_font = PiratesGlobals.getInterfaceFont())
        if self.quantity and self.quantity > 1:
            self.quantityLabel = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = str(self.quantity), frameColor = (0, 0, 0, 1), frameSize = (-0.01, 0.02, -0.01, 0.025000000000000001), text_scale = 0.0275, text_align = TextNode.ACenter, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.02, 0, 0.025000000000000001), text_font = PiratesGlobals.getPirateBoldOutlineFont())
        
        itemClass = EconomyGlobals.getItemCategory(itemId)
        if itemClass == ItemType.WEAPON or itemClass == ItemType.POUCH:
            asset = EconomyGlobals.getItemIcons(itemId)
            if asset:
                self.picture['geom'] = SongItemGui.weaponIcons.find('**/%s*' % asset)
                self.picture['geom_scale'] = 0.11
                self.picture['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
            
        elif itemClass == ItemType.CONSUMABLE:
            asset = EconomyGlobals.getItemIcons(itemId)
            if asset:
                self.picture['geom'] = SongItemGui.skillIcons.find('**/%s*' % asset)
                self.picture['geom_scale'] = 0.11
                self.picture['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
            
        
        if not InventoryType.begin_WeaponCannonAmmo <= itemId or itemId <= InventoryType.end_WeaponCannonAmmo:
            if (InventoryType.begin_WeaponPistolAmmo <= itemId or itemId <= InventoryType.end_WeaponGrenadeAmmo or InventoryType.begin_WeaponDaggerAmmo <= itemId) and itemId <= InventoryType.end_WeaponDaggerAmmo:
                skillId = WeaponGlobals.getSkillIdForAmmoSkillId(itemId)
                if skillId:
                    asset = WeaponGlobals.getSkillIcon(skillId)
                    if asset:
                        self.picture['geom'] = SongListItem.skillIcons.find('**/%s' % asset)
                        self.picture['geom_scale'] = 0.14999999999999999
                        self.picture['geom_pos'] = (0.069000000000000006, 0, 0.069000000000000006)
                    
                
            elif InventoryType.SmallBottle <= itemId and itemId <= InventoryType.LargeBottle:
                self.picture['geom'] = SongListItem.topGui.find('**/main_gui_ship_bottle')
                self.picture['geom_scale'] = 0.10000000000000001
                self.picture['geom_pos'] = (0.069000000000000006, 0, 0.069000000000000006)
            
        self.flattenStrong()

    
    def checkLevel(self, repId, minLvl):
        inv = localAvatar.getInventory()
        if inv:
            repAmt = inv.getAccumulator(repId)
            if minLvl > ReputationGlobals.getLevelFromTotalReputation(repId, repAmt)[0]:
                self.highlightRed(PLocalizer.LevelRequirement % self.minLvl)
            
        

    
    def checkTrainingReq(self, trainingReq):
        inv = localAvatar.getInventory()
        if inv:
            amt = inv.getStackQuantity(trainingReq)
            if not amt:
                self.highlightRed(PLocalizer.TrainingRequirement)
            
        

    
    def checkSkillReq(self, skillId):
        if skillId:
            if base.localAvatar.getSkillQuantity(skillId) < 2:
                skillName = PLocalizer.getInventoryTypeName(skillId)
                self.highlightRed(PLocalizer.SkillRequirement % skillName)
            
        

    
    def checkPlayerInventory(self, itemId, extraQty = 0):
        if self.available:
            inventory = base.localAvatar.getInventory()
            currStock = inventory.getStackQuantity(itemId)
            currStockLimit = inventory.getStackLimit(itemId)
            if currStock == 0:
                if base.cr.newsManager.getHoliday(21):
                    pass
                if not (itemId in InventoryType.WinterHolidaySongs):
                    self.name = PLocalizer.makeHeadingString(PLocalizer.SongTitleUnknown, 2)
                    self.nameTag['text'] = PLocalizer.makeHeadingString(PLocalizer.SongTitleUnknown, 2)
                    self.itemTypeName['text'] = PLocalizer.makeHeadingString(PLocalizer.SongComingSoon, 1)
                    self.disable()
                
            not (itemId in InventoryType.WinterHolidaySongs)
        

    
    def highlightRed(self, text = ''):
        self['state'] = DGG.DISABLED
        self['image_color'] = Vec4(0.55000000000000004, 0.55000000000000004, 0.5, 1)
        self.available = False
        self.highlightBox(text, Vec4(0.75, 0.5, 0.5, 1), PiratesGuiGlobals.TextFG6)

    
    def highlightGreen(self, text = ''):
        self.highlightBox(text, Vec4(0.5, 0.75, 0.5, 1), PiratesGuiGlobals.TextFG4)

    
    def highlightBox(self, text, image_color, text_fg):
        self.miscText['text_fg'] = text_fg
        if text != '':
            self.miscText['text'] = text
        

    
    def enable(self):
        if self.available:
            self['state'] = DGG.NORMAL
        

    
    def disable(self):
        if self.available:
            self['state'] = DGG.DISABLED
        

    
    def createHelpbox(self, args = None):
        if self.helpBox:
            return None
        
        weaponInfo = PLocalizer.WeaponDescriptions.get(self.data[0])
        weaponDesc = weaponInfo
        self.helpText = DirectFrame(parent = self, relief = None, text = weaponDesc, state = DGG.DISABLED, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 13, textMayChange = 0, sortOrder = 91)
        height = -self.helpText.getHeight()
        self.helpBox = BorderFrame(parent = aspect2d, state = DGG.DISABLED, frameSize = (-0.029999999999999999, 0.42999999999999999, height, 0.050000000000000003), sortOrder = 90, borderScale = 0.20000000000000001)
        self.helpText.reparentTo(self.helpBox)
        self.helpBox.setBin('gui-popup', 0)
        self.helpBox.setPos(self, 0.25, 0, -0.035000000000000003)

    
    def destroy(self):
        taskMgr.remove('helpInfoTask')
        taskMgr.remove(self.taskName('dragTask'))
        if self.helpBox:
            self.helpBox.destroy()
            self.helpBox = None
        
        del self.picture
        if self.weapon:
            taskMgr.remove(DGG.B1PRESS)
            taskMgr.remove(DGG.B2PRESS)
            taskMgr.remove(DGG.B3PRESS)
        
        SongListItem.destroy(self)

    
    def setDraggable(self, d):
        self.draggable = d

    
    def dragStart(self, event):
        self.origionalPos = self.getPos(render2d)
        self.origionalParent = self.getParent()
        self.bringToFront()
        self.setColorScale(1, 1, 1, 0.5)
        if self.draggable:
            self.wrtReparentTo(aspect2d)
            taskMgr.remove(self.taskName('dragTask'))
            vWidget2render2d = self.getPos(render2d)
            vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1])
            editVec = Vec3(vWidget2render2d - vMouse2render2d)
            task = taskMgr.add(self.dragTask, self.taskName('dragTask'))
            task.editVec = editVec
        

    
    def dragTask(self, task):
        if task.time < PiratesGuiGlobals.DragStartDelayTime:
            return Task.cont
        else:
            mwn = base.mouseWatcherNode
            if mwn.hasMouse():
                vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1])
                newPos = vMouse2render2d + task.editVec
                self.setPos(render2d, newPos)
                newPos = self.getPos(aspect2d)
                x = newPos[0]
                z = newPos[2]
                x = x - x % 0.050000000000000003
                z = z - z % 0.050000000000000003
                x = min(1.3 - self.width, max(-1.3, x))
                z = min(1 - self.height, max(-1, z))
                self.setPos(aspect2d, x, 0.0, z)
            
            return Task.cont

    
    def dragStop(self, event):
        self.clearColorScale()
        self.wrtReparentTo(self.origionalParent)
        self.setPos(render2d, self.origionalPos)
        if self.draggable:
            taskMgr.remove(self.taskName('dragTask'))
        

    
    def showDetails(self, event):
        taskMgr.doMethodLater(PiratesGuiGlobals.HelpPopupTime, self.createHelpbox, 'helpInfoTask')
        self.createHelpbox()

    
    def hideDetails(self, event):
        taskMgr.remove('helpInfoTask')
        if self.helpBox:
            self.helpBox.destroy()
            self.helpBox = None
Exemplo n.º 7
0
class TextIsland(Island):

    def __init__(self, name, islandUid, modelName, isTeleportIsland, nodePath = NodePath(), offset = 0.0, scale = 1.0, collisionIndex = 17, stencilId = 0, *args, **kwargs):
        Island.__init__(self, name, islandUid, modelName, isTeleportIsland, scale, collisionIndex, stencilId, *args, **kwargs)
        pencil = self.geom.find('**/pencil*')
        if not pencil.isEmpty():
            pass
        1
        self.name = name
        self.helpBox = None
        self.helpLabel = None
        self.textScaleNode = self.attachNewNode('textScale')

        def formatName(name, lineWidth):
            tokens = name.split()
            out = ''
            count = 0
            for token in tokens:
                if count + len(token) < lineWidth:
                    count += len(token) + 1
                    out = '%s %s' % (out, token)
                    continue
                count = len(token) + 1
                out = '%s\n%s' % (out, token)

            out.strip()
            return 'smallCaps%s' % (out,)

        formattedName = formatName(self.name, 10)
        self.text = Text(name + '-text', nodePath, offset, formattedName, stencilId)
        self.text.reparentTo(self.textScaleNode)
        self.text.setBin('background', 2)
        if self.getNetTag('islandUid') == '1160614528.73sdnaik':
            mesh = self.geom
            (t, T) = self.text.getTightBounds()
            (i, I) = mesh.getTightBounds()
        else:
            mesh = self.geom.find('**/top_mesh')
            (t, T) = self.text.getTightBounds()
            if not mesh.isEmpty():
                (i, I) = mesh.getTightBounds()
            else:
                (i, I) = self.geom.getTightBounds()
            i *= self.geom.getScale()[0]
            I *= self.geom.getScale()[0]
        self.textScaleNode.setPos(0, (i[1] - I[1]) / 2 - T[2], 0.001)
        compassGui = loader.loadModel('models/gui/compass_gui')
        topGui = loader.loadModel('models/gui/toplevel_gui')
        icons = loader.loadModel('models/textureCards/icons')
        self.button = self.text.attachNewNode('button')
        bg = topGui.find('**/treasure_w_b_slot_empty')
        bg.setScale(0.14000000000000001)
        bg.reparentTo(self.button)
        buttonPos = Point3(t[0] - 0.021999999999999999, 0, (t[2] + T[2]) / 2.0)
        self.button.flattenStrong()
        self.button.setPos(buttonPos)
        self.button.setColorScaleOff()
        self.button.hide()
        self.teleportIconDisabled = compassGui.find('**/compass_icon_objective_grey')
        self.teleportIconDisabled.setScale(0.14000000000000001)
        self.teleportIconDisabled.reparentTo(self.button)
        self.teleportIconEnabled = compassGui.find('**/compass_icon_objective_green')
        self.teleportIconEnabled.setScale(0.14000000000000001)
        self.teleportIconEnabled.reparentTo(self.button)
        self.manIcon = icons.find('**/icon_stickman')
        self.manIcon.setScale(0.035000000000000003)
        self.manIcon.reparentTo(self.button)
        (t, T) = self.text.getTightBounds()
        p0 = VBase3(t[0], 0, t[2])
        p1 = VBase3(T[0], 0, t[2])
        p2 = VBase3(T[0], 0, T[2])
        p3 = VBase3(t[0], 0, T[2])
        self.colNode = self.text.attachNewNode(CollisionNode('cNode-' + name))
        self.colNode.node().addSolid(CollisionPolygon(p0, p1, p2, p3))
        self.colNode.node().setFromCollideMask(BitMask32.allOff())
        self.colNode.node().setIntoCollideMask(BitMask32.bit(collisionIndex))
        self.createHelpBox()
        self.updateState()


    def updateZoom(self, zoom):
        self.textScaleNode.setScale(1 - zoom / 1.5)


    def setAsCurrentIsland(self, isCurrent):
        Island.setAsCurrentIsland(self, isCurrent)
        self.updateState()


    def setAsReturnIsland(self, isReturn):
        Island.setAsReturnIsland(self, isReturn)
        self.updateState()


    def setAsPortOfCall(self, isPortOfCall):
        Island.setAsPortOfCall(self, isPortOfCall)
        self.updateState()


    def setHasTeleportToken(self, hasToken):
        Island.setHasTeleportToken(self, hasToken)
        self.updateState()


    def updateState(self, mouseOver = False):
        if not hasattr(self, 'button'):
            return None

        self.button.hide()
        self.teleportIconEnabled.hide()
        self.teleportIconDisabled.hide()
        if self.isCurrentIsland():
            self.manIcon.show()
            self.button.show()

        if self.isTeleportIsland():
            self.button.show()
            self.manIcon.hide()
            self.teleportIconDisabled.show()
            self.teleportIconDisabled.clearColorScale()
            self.button.setColorScale(0.5, 0.5, 0.5, 1)
            self.setHelpLabel(PLocalizer.MapNeedsTeleportToken)

        if self.getCanTeleportTo():
            self.button.show()
            self.button.clearColorScale()
            self.teleportIconDisabled.hide()
            self.teleportIconEnabled.show()
            self.text.setBold(1)
            if not self.isCurrentIsland() and self.isReturnIsland():
                self.setHelpLabel(PLocalizer.MapCanTeleportReturn)
            elif not self.isCurrentIsland() and self.isPortOfCall():
                self.setHelpLabel(PLocalizer.MapCanTeleportPortOfCall)
            else:
                self.setHelpLabel(PLocalizer.MapCanTeleport)
            if mouseOver:
                self.geom.setColorScale(0.5, 1, 0.5, 1)


        if self.isCurrentIsland() and not mouseOver:
            self.button.show()
            self.button.clearColorScale()
            self.button.setScale(1)
            self.text.setBold(1)
            self.teleportIconEnabled.hide()
            self.teleportIconDisabled.hide()
            self.manIcon.show()
            if not self.isTeleportIsland():
                self.setHelpLabel(PLocalizer.MapCurrentIsland)


        if self.isCurrentIsland() and mouseOver:
            self.button.show()
            self.button.clearColorScale()
            self.button.setScale(1)
            self.text.setBold(1)
            self.teleportIconEnabled.show()
            self.teleportIconDisabled.hide()
            self.manIcon.hide()

        if not self.isCurrentIsland() and not mouseOver:
            self.setHelpLabel('')
            self.text.setBold(0)
            self.manIcon.hide()



    def mouseOver(self, pos):
        self.updateState(mouseOver = True)
        self.showDetails(pos)


    def mouseLeft(self):
        self.geom.clearColorScale()
        self.hideDetails()
        self.updateState(mouseOver = False)


    def createHelpBox(self):
        if not self.helpBox:
            self.helpLabel = DirectLabel(parent = aspect2d, relief = None, text = '', text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 12, text_shadow = (0, 0, 0, 1), textMayChange = 1, sortOrder = 91)
            height = -(self.helpLabel.getHeight() + 0.01)
            width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
            self.helpBox = BorderFrame(parent = aspect2d, state = DGG.DISABLED, frameSize = (-0.040000000000000001, width, height, 0.050000000000000003), pos = (0, 0, 0), sortOrder = 90)
            self.helpLabel.reparentTo(self.helpBox)
            self.helpBox.hide()



    def setHelpLabel(self, text):
        self.helpLabel['text'] = text
        self.helpLabel.resetFrameSize()
        height = -(self.helpLabel.getHeight() + 0.01)
        width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
        self.helpBox['frameSize'] = (-0.040000000000000001, width, height, 0.050000000000000003)
        self.helpBox.resetFrameSize()


    def showDetails(self, pos):
        if self.helpLabel['text'] != '':
            self.helpBox.setPos(pos - Point3(self.helpBox['frameSize'][1] * 1.25, 0, 0))
            self.helpBox.setBin('gui-popup', 0)
            self.helpBox.show()



    def hideDetails(self):
        if self.helpBox:
            self.helpBox.hide()
Exemplo n.º 8
0
class InventoryItemGui(InventoryListItem):
    width = PiratesGuiGlobals.InventoryItemGuiWidth
    height = PiratesGuiGlobals.InventoryItemGuiHeight
    available = True
    
    def __init__(self, data, trade = 0, buy = 0, sell = 0, use = 0, weapon = 0, isDisabled = 0, **kw):
        if (trade and buy and sell and use or weapon) and not isDisabled:
            buttonRelief = DGG.RAISED
            buttonState = DGG.NORMAL
        else:
            buttonRelief = DGG.RIDGE
            buttonState = DGG.DISABLED
        self.loadGui()
        optiondefs = (('relief', None, None), ('state', buttonState, None), ('frameSize', (0, self.width, 0, self.height), None), ('image', InventoryItemGui.genericButton, None), ('image_scale', (0.54000000000000004, 1, 0.41999999999999998), None), ('image_pos', (0.26000000000000001, 0, 0.080000000000000002), None), ('pressEffect', 0, None), ('command', self.sendEvents, None))
        self.defineoptions(kw, optiondefs)
        InventoryListItem.__init__(self, data, trade = trade, buy = buy, sell = sell, use = use, weapon = weapon, isDisabled = isDisabled, width = self.width, height = self.height)
        self.initialiseoptions(InventoryItemGui)
        self.createGui()
        self.draggable = abs(self.buy) + abs(self.sell) + abs(self.use) + abs(self.trade) - 1
        if self.draggable > 0:
            self.bind(DGG.B1PRESS, self.dragStart)
            self.bind(DGG.B1RELEASE, self.dragStop)
            self.bind(DGG.B2PRESS, self.dragStart)
            self.bind(DGG.B2RELEASE, self.dragStop)
            self.bind(DGG.B3PRESS, self.dragStart)
            self.bind(DGG.B3RELEASE, self.dragStop)
        
        if self.weapon:
            self.bind(DGG.B1PRESS, self.equipWeapon)
            self.bind(DGG.B2PRESS, self.equipWeapon)
            self.bind(DGG.B3PRESS, self.equipWeapon)
        
        self.helpFrame = None
        self.cm = CardMaker('itemCard')
        self.cm.setFrame(-0.29999999999999999, 0.29999999999999999, -0.089999999999999997, 0.089999999999999997)
        self.buffer = None
        self.lens = PerspectiveLens()
        self.lens.setNear(0.5)
        self.lens.setAspectRatio(0.59999999999999998 / 0.17999999999999999)
        self.realItem = None
        self.itemCard = None
        self.portraitSceneGraph = NodePath('PortraitSceneGraph')
        detailGui = loader.loadModel('models/gui/gui_card_detail')
        self.bg = detailGui.find('**/color')
        self.bg.setScale(4)
        self.bg.setPos(0, 17, -6.2999999999999998)
        self.glow = detailGui.find('**/glow')
        self.glow.setScale(3)
        self.glow.setPos(0, 17, -6.2999999999999998)
        self.glow.setColor(1, 1, 1, 0.80000000000000004)
        self.setBin('gui-fixed', 1)
        self.accept('open_main_window', self.createBuffer)
        self.accept('aspectRatioChanged', self.createBuffer)
        self.accept('close_main_window', self.destroyBuffer)
        self.bind(DGG.ENTER, self.showDetails)
        self.bind(DGG.EXIT, self.hideDetails)

    
    def loadGui(self):
        if InventoryItemGui.guiLoaded:
            return None
        
        InventoryListItem.loadGui(self)
        InventoryItemGui.genericButton = (InventoryListItem.topGui.find('**/generic_button'), InventoryListItem.topGui.find('**/generic_button_down'), InventoryListItem.topGui.find('**/generic_button_over'), InventoryListItem.topGui.find('**/generic_button_disabled'))

    
    def createGui(self):
        itemId = self.data[0]
        self.nameTag = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = self.name, text_scale = PiratesGuiGlobals.TextScaleSmall * PLocalizer.getHeadingScale(2), text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG1, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.16, 0, 0.105), text_font = PiratesGlobals.getInterfaceFont())
        if itemId in range(InventoryType.begin_PistolPouches, InventoryType.end_PistolPouches):
            self.itemTypeFormatted = PLocalizer.makeHeadingString(PLocalizer.InventoryItemClassNames.get(ItemType.PISTOL), 1)
        elif itemId in range(InventoryType.begin_DaggerPouches, InventoryType.end_DaggerPouches):
            self.itemTypeFormatted = PLocalizer.makeHeadingString(PLocalizer.InventoryItemClassNames.get(ItemType.DAGGER), 1)
        elif itemId in range(InventoryType.begin_GrenadePouches, InventoryType.end_GrenadePouches):
            self.itemTypeFormatted = PLocalizer.makeHeadingString(PLocalizer.GrenadeShort, 1)
        elif itemId in range(InventoryType.begin_CannonPouches, InventoryType.end_CannonPouches):
            self.itemTypeFormatted = PLocalizer.makeHeadingString(PLocalizer.ShipCannonShort, 1)
        else:
            self.itemTypeFormatted = PLocalizer.makeHeadingString(self.itemType, 1)
        self.itemTypeName = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = self.itemTypeFormatted, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_font = PiratesGlobals.getInterfaceFont(), pos = (0.16, 0, 0.065000000000000002))
        self.miscText = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = '', text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.16, 0, 0.025000000000000001))
        if self.minLvl > 0:
            repId = WeaponGlobals.getRepId(itemId)
            if repId:
                self.checkLevel(repId, self.minLvl)
            
        
        self.checkFreebooter(itemId, base.localAvatar.getDoId())
        trainingReq = EconomyGlobals.getItemTrainingReq(itemId)
        if trainingReq:
            self.checkTrainingReq(trainingReq)
        
        if EconomyGlobals.getItemCategory(itemId) == ItemType.AMMO:
            skillId = WeaponGlobals.getSkillIdForAmmoSkillId(itemId)
            self.checkSkillReq(skillId)
        
        self.checkInfamyReq(itemId)
        if self.buy:
            self.checkPlayerInventory(itemId)
        
        self.costText = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, image = InventoryListItem.coinImage, image_scale = 0.12, image_pos = Vec3(-0.01, 0, 0.01), text = str(self.price), text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ARight, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, text_pos = (-0.029999999999999999, 0, 0), pos = (self.width - 0.035000000000000003, 0, 0.065000000000000002), text_font = PiratesGlobals.getInterfaceFont())
        if self.quantity and self.quantity > 1:
            self.quantityLabel = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = str(self.quantity), frameColor = (0, 0, 0, 1), frameSize = (-0.01, 0.02, -0.01, 0.025000000000000001), text_scale = 0.0275, text_align = TextNode.ACenter, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.02, 0, 0.025000000000000001), text_font = PiratesGlobals.getPirateBoldOutlineFont())
        
        geomParams = InventoryItemGui.getGeomParams(itemId)
        self.picture = DirectFrame(parent = self, relief = None, state = DGG.DISABLED, geom = geomParams['geom'], geom_pos = geomParams['geom_pos'], geom_scale = geomParams['geom_scale'], pos = (0.01, 0, 0.01))
        self.flattenStrong()

    
    def getGeomParams(itemId):
        geomParams = { }
        itemType = EconomyGlobals.getItemType(itemId)
        if itemType <= ItemType.WAND or itemType == ItemType.POTION:
            if itemType == ItemType.POTION:
                geomParams['geom'] = InventoryItemGui.skillIcons.find('**/%s' % ItemGlobals.getIcon(itemId))
            else:
                itemType = ItemGlobals.getType(itemId)
                if ItemGlobals.getIcon(itemId):
                    geomParams['geom'] = InventoryItemGui.weaponIcons.find('**/%s' % ItemGlobals.getIcon(itemId))
                
            geomParams['geom_scale'] = 0.11
            geomParams['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
        else:
            itemClass = EconomyGlobals.getItemCategory(itemId)
            itemType = EconomyGlobals.getItemType(itemId)
            if itemType == ItemType.FISHING_ROD or itemType == ItemType.FISHING_LURE:
                asset = EconomyGlobals.getItemIcons(itemId)
                if asset:
                    geomParams['geom'] = InventoryItemGui.fishingIcons.find('**/%s*' % asset)
                    geomParams['geom_scale'] = 0.11
                    geomParams['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
                
            elif itemClass == ItemType.WEAPON and itemClass == ItemType.POUCH or itemClass == ItemType.AMMO:
                asset = EconomyGlobals.getItemIcons(itemId)
                if asset:
                    geomParams['geom'] = InventoryItemGui.weaponIcons.find('**/%s*' % asset)
                    geomParams['geom_scale'] = 0.11
                    geomParams['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
                
            elif itemClass == ItemType.CONSUMABLE:
                asset = EconomyGlobals.getItemIcons(itemId)
                if asset:
                    geomParams['geom'] = InventoryItemGui.skillIcons.find('**/%s*' % asset)
                    geomParams['geom_scale'] = 0.11
                    geomParams['geom_pos'] = (0.080000000000000002, 0, 0.068000000000000005)
                
            
        if not InventoryType.begin_WeaponCannonAmmo <= itemId or itemId <= InventoryType.end_WeaponCannonAmmo:
            if (InventoryType.begin_WeaponPistolAmmo <= itemId or itemId <= InventoryType.end_WeaponGrenadeAmmo or InventoryType.begin_WeaponDaggerAmmo <= itemId) and itemId <= InventoryType.end_WeaponDaggerAmmo:
                skillId = WeaponGlobals.getSkillIdForAmmoSkillId(itemId)
                if skillId:
                    asset = WeaponGlobals.getSkillIcon(skillId)
                    if asset:
                        geomParams['geom'] = InventoryListItem.skillIcons.find('**/%s' % asset)
                        geomParams['geom_scale'] = 0.14999999999999999
                        geomParams['geom_pos'] = (0.069000000000000006, 0, 0.069000000000000006)
                    
                
            elif InventoryType.SmallBottle <= itemId and itemId <= InventoryType.LargeBottle:
                geomParams['geom'] = InventoryListItem.topGui.find('**/main_gui_ship_bottle')
                geomParams['geom_scale'] = 0.10000000000000001
                geomParams['geom_pos'] = (0.069000000000000006, 0, 0.069000000000000006)
            
        return geomParams

    getGeomParams = staticmethod(getGeomParams)
    
    def checkFreebooter(self, itemId, avId):
        if ItemGlobals.getRarity(itemId) == ItemGlobals.CRUDE:
            return None
        
        if not InventoryType.begin_WeaponCannonAmmo <= itemId or itemId <= InventoryType.end_WeaponCannonAmmo:
            if (InventoryType.begin_WeaponPistolAmmo <= itemId or itemId <= InventoryType.end_WeaponGrenadeAmmo or InventoryType.begin_WeaponDaggerAmmo <= itemId) and itemId <= InventoryType.end_WeaponDaggerAmmo:
                return None
            
        if itemId in [
            InventoryType.RegularLure]:
            return None
        
        if not Freebooter.getPaidStatus(avId):
            self.highlightRed(PLocalizer.FreebooterDisallow)
        

    
    def checkLevel(self, repId, minLvl):
        inv = localAvatar.getInventory()
        if inv:
            repAmt = inv.getAccumulator(repId)
            if minLvl > ReputationGlobals.getLevelFromTotalReputation(repId, repAmt)[0]:
                self.highlightRed(PLocalizer.LevelRequirement % self.minLvl + ' ' + PLocalizer.InventoryItemClassNames.get(EconomyGlobals.getItemType(self.data[0])))
            
        

    
    def checkTrainingReq(self, trainingReq):
        inv = localAvatar.getInventory()
        if inv:
            amt = inv.getStackQuantity(trainingReq)
            if not amt:
                self.highlightRed(PLocalizer.TrainingRequirement)
            
        

    
    def checkSkillReq(self, skillId):
        if skillId in range(InventoryType.begin_FishingLures, InventoryType.end_FishingLures):
            return None
        
        if skillId:
            if base.localAvatar.getSkillQuantity(skillId) < 2:
                skillName = PLocalizer.getInventoryTypeName(skillId)
                self.highlightRed(PLocalizer.SkillRequirement % skillName)
            
        

    
    def checkInfamyReq(self, itemId):
        landInfamyLevel = ItemGlobals.getLandInfamyRequirement(itemId)
        seaInfamyLevel = ItemGlobals.getSeaInfamyRequirement(itemId)
        if landInfamyLevel and TitleGlobals.getRank(TitleGlobals.LandPVPTitle, localAvatar.getInfamyLand()) < landInfamyLevel:
            self.highlightRed(PLocalizer.LandInfamyRequirement % landInfamyLevel)
        
        if seaInfamyLevel and TitleGlobals.getRank(TitleGlobals.ShipPVPTitle, localAvatar.getInfamySea()) < seaInfamyLevel:
            self.highlightRed(PLocalizer.SeaInfamyRequirement % seaInfamyLevel)
        

    
    def checkPlayerInventory(self, itemId, extraQty = 0):
        if self.available:
            itemCategory = EconomyGlobals.getItemCategory(itemId)
            inventory = base.localAvatar.getInventory()
            currStock = inventory.getStackQuantity(itemId)
            currStockLimit = inventory.getStackLimit(itemId)
            if itemCategory == ItemType.AMMO or itemCategory == ItemType.CONSUMABLE:
                if currStock + extraQty >= currStockLimit and currStockLimit > 0:
                    self.highlightGreen(PLocalizer.InventoryFull % currStockLimit)
                else:
                    self.highlightBox(PLocalizer.InventoryCurrent % (currStock + extraQty, currStockLimit), Vec4(1, 1, 1, 1), PiratesGuiGlobals.TextFG2)
            elif itemCategory == ItemType.WEAPON:
                if currStock >= 1:
                    self.highlightGreen(PLocalizer.InventoryOwned)
                else:
                    inv = base.localAvatar.getInventory()
                    if inv is None:
                        return None
                    
                    itemRep = WeaponGlobals.getRepId(itemId)
                    if itemRep == InventoryType.CutlassRep:
                        options = [
                            InventoryType.CutlassWeaponL1,
                            InventoryType.CutlassWeaponL2,
                            InventoryType.CutlassWeaponL3,
                            InventoryType.CutlassWeaponL4,
                            InventoryType.CutlassWeaponL5,
                            InventoryType.CutlassWeaponL6]
                    elif itemRep == InventoryType.PistolRep:
                        options = [
                            InventoryType.PistolWeaponL1,
                            InventoryType.PistolWeaponL2,
                            InventoryType.PistolWeaponL3,
                            InventoryType.PistolWeaponL4,
                            InventoryType.PistolWeaponL5,
                            InventoryType.PistolWeaponL6]
                    elif itemRep == InventoryType.DaggerRep:
                        options = [
                            InventoryType.DaggerWeaponL1,
                            InventoryType.DaggerWeaponL2,
                            InventoryType.DaggerWeaponL3,
                            InventoryType.DaggerWeaponL4,
                            InventoryType.DaggerWeaponL5,
                            InventoryType.DaggerWeaponL6]
                    elif itemRep == InventoryType.GrenadeRep:
                        options = [
                            InventoryType.GrenadeWeaponL1,
                            InventoryType.GrenadeWeaponL2,
                            InventoryType.GrenadeWeaponL3,
                            InventoryType.GrenadeWeaponL4,
                            InventoryType.GrenadeWeaponL5,
                            InventoryType.GrenadeWeaponL6]
                    elif itemRep == InventoryType.DollRep:
                        options = [
                            InventoryType.DollWeaponL1,
                            InventoryType.DollWeaponL2,
                            InventoryType.DollWeaponL3,
                            InventoryType.DollWeaponL4,
                            InventoryType.DollWeaponL5,
                            InventoryType.DollWeaponL6]
                    elif itemRep == InventoryType.WandRep:
                        options = [
                            InventoryType.WandWeaponL1,
                            InventoryType.WandWeaponL2,
                            InventoryType.WandWeaponL3,
                            InventoryType.WandWeaponL4,
                            InventoryType.WandWeaponL5,
                            InventoryType.WandWeaponL6]
                    else:
                        return None
                    for idx in range(len(options)):
                        optionId = options[idx]
                        if optionId == itemId:
                            currIdx = idx
                            for weaponId in options[currIdx:]:
                                if weaponId == itemId:
                                    continue
                                
                                stackAmt = inv.getStackQuantity(weaponId)
                                if stackAmt >= 1:
                                    self.highlightRed(PLocalizer.InventoryLowLevel)
                                    return None
                                    continue
                            
                    
            elif itemCategory == ItemType.POUCH:
                inv = base.localAvatar.getInventory()
                if currStock >= 1:
                    self.highlightGreen(PLocalizer.InventoryOwned)
                else:
                    pistolPouches = [
                        InventoryType.PistolPouchL1,
                        InventoryType.PistolPouchL2,
                        InventoryType.PistolPouchL3]
                    daggerPouches = [
                        InventoryType.DaggerPouchL1,
                        InventoryType.DaggerPouchL2,
                        InventoryType.DaggerPouchL3]
                    grenadePouches = [
                        InventoryType.GrenadePouchL1,
                        InventoryType.GrenadePouchL2,
                        InventoryType.GrenadePouchL3]
                    cannonPouches = [
                        InventoryType.CannonPouchL1,
                        InventoryType.CannonPouchL2,
                        InventoryType.CannonPouchL3]
                    if itemId in pistolPouches:
                        pouchSet = pistolPouches
                    elif itemId in daggerPouches:
                        pouchSet = daggerPouches
                    elif itemId in grenadePouches:
                        pouchSet = grenadePouches
                    elif itemId in cannonPouches:
                        pouchSet = cannonPouches
                    else:
                        pouchSet = []
                    for pouchIdx in range(len(pouchSet)):
                        if pouchSet[pouchIdx] == itemId and pouchIdx + 1 < len(pouchSet):
                            for higherPouchIdx in range(pouchIdx + 1, len(pouchSet)):
                                stackAmt = inv.getStackQuantity(pouchSet[higherPouchIdx])
                                if stackAmt >= 1:
                                    self.highlightRed(PLocalizer.InventoryLowLevel)
                                    return None
                                    continue
                            
                    
            
        

    
    def highlightRed(self, text = ''):
        self['state'] = DGG.DISABLED
        self['image_color'] = Vec4(0.55000000000000004, 0.55000000000000004, 0.5, 1)
        self.available = False
        self.highlightBox(text, Vec4(0.75, 0.5, 0.5, 1), PiratesGuiGlobals.TextFG6)

    
    def highlightGreen(self, text = ''):
        self.highlightBox(text, Vec4(0.5, 0.75, 0.5, 1), PiratesGuiGlobals.TextFG4)

    
    def highlightBox(self, text, image_color, text_fg):
        self.miscText['text_fg'] = text_fg
        if text != '':
            self.miscText['text'] = text
        

    
    def enable(self):
        if self.available:
            self['state'] = DGG.NORMAL
        

    
    def disable(self):
        if self.available:
            self['state'] = DGG.DISABLED
        

    
    def createHelpbox(self, args = None):
        if self.helpFrame:
            return None
        
        itemType = EconomyGlobals.getItemType(self.data[0])
        if itemType <= ItemType.WAND or itemType == ItemType.POTION:
            itemId = self.data[0]
            self.helpFrame = DirectFrame(parent = aspect2d, relief = None, state = DGG.DISABLED, sortOrder = 1)
            detailGui = loader.loadModel('models/gui/gui_card_detail')
            topGui = loader.loadModel('models/gui/toplevel_gui')
            coinImage = topGui.find('**/treasure_w_coin*')
            self.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            self.BuffIcons = loader.loadModel('models/textureCards/buff_icons')
            border = self.SkillIcons.find('**/base')
            halfWidth = 0.29999999999999999
            halfHeight = 0.20000000000000001
            textScale = PiratesGuiGlobals.TextScaleMed
            titleScale = PiratesGuiGlobals.TextScaleTitleSmall
            titleNameScale = PiratesGuiGlobals.TextScaleExtraLarge
            subtitleScale = PiratesGuiGlobals.TextScaleMed
            iconScalar = 1.5
            borderScaler = 0.25
            splitHeight = 0.01
            vMargin = 0.029999999999999999
            runningVertPosition = 0.29999999999999999
            runningSize = 0.0
            labels = []
            titleColor = PiratesGuiGlobals.TextFG6
            itemColor = 'itemRed'
            rarity = ItemGlobals.getRarity(itemId)
            rarityText = PLocalizer.getItemRarityName(rarity)
            subtypeText = PLocalizer.getItemSubtypeName(ItemGlobals.getSubtype(itemId))
            if rarity == ItemGlobals.CRUDE:
                titleColor = PiratesGuiGlobals.TextFG24
                itemColor = 'itemBrown'
            elif rarity == ItemGlobals.COMMON:
                titleColor = PiratesGuiGlobals.TextFG13
                itemColor = 'itemYellow'
            elif rarity == ItemGlobals.RARE:
                titleColor = PiratesGuiGlobals.TextFG4
                itemColor = 'itemGreen'
            elif rarity == ItemGlobals.FAMED:
                titleColor = PiratesGuiGlobals.TextFG5
                itemColor = 'itemBlue'
            
            titleLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.getItemName(itemId), text_scale = titleNameScale, text_fg = titleColor, text_shadow = PiratesGuiGlobals.TextShadow, text_align = TextNode.ACenter, pos = (0.0, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
            self.bg.setColor(titleColor)
            tHeight = 0.070000000000000007
            titleLabel.setZ(runningVertPosition)
            runningVertPosition -= tHeight
            runningSize += tHeight
            labels.append(titleLabel)
            subtitleLabel = DirectLabel(parent = self, relief = None, text = '\x01slant\x01%s %s\x02' % (rarityText, subtypeText), text_scale = subtitleScale, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_align = TextNode.ACenter, pos = (0.0, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
            subtHeight = 0.050000000000000003
            subtitleLabel.setZ(subtHeight * 0.5 + runningVertPosition)
            runningVertPosition -= subtHeight
            runningSize += subtHeight
            labels.append(subtitleLabel)
            itemType = ItemGlobals.getType(itemId)
            itemSubtype = ItemGlobals.getSubtype(itemId)
            model = ItemGlobals.getModel(itemId)
            if model:
                if itemType == ItemGlobals.GRENADE:
                    self.realItem = loader.loadModel('models/ammunition/' + model)
                elif itemType == ItemGlobals.POTION:
                    self.realItem = loader.loadModel('models/inventory/' + model)
                else:
                    self.realItem = loader.loadModel('models/handheld/' + model)
                if self.realItem:
                    spinBlur = self.realItem.find('**/motion_blur')
                    if spinBlur:
                        spinBlur.hide()
                    
                    if itemSubtype == ItemGlobals.MUSKET:
                        bayonetPart = self.realItem.find('**/bayonet')
                        if bayonetPart:
                            bayonetPart.stash()
                        
                    
                    posHpr = ItemGlobals.getModelPosHpr(model)
                    if posHpr:
                        self.realItem.setPos(posHpr[0], posHpr[1], posHpr[2])
                        self.realItem.setHpr(posHpr[3], posHpr[4], posHpr[5])
                    elif itemType == ItemGlobals.SWORD:
                        self.realItem.setPos(-1.5, 3.0, -0.29999999999999999)
                        self.realItem.setHpr(90, 170, -90)
                    elif itemSubtype in (ItemGlobals.MUSKET, ItemGlobals.BAYONET):
                        self.realItem.setPos(-1.2, 3.0, -0.10000000000000001)
                        self.realItem.setHpr(0, 135, 10)
                    elif itemSubtype == ItemGlobals.BLUNDERBUSS:
                        self.realItem.setPos(-0.29999999999999999, 2.0, 0.0)
                        self.realItem.setHpr(0, 90, 0)
                    elif itemType == ItemGlobals.GUN:
                        self.realItem.setPos(-0.5, 2.0, -0.20000000000000001)
                        self.realItem.setHpr(0, 90, 0)
                    elif itemType == ItemGlobals.DOLL:
                        self.realItem.setPos(0.0, 1.8999999999999999, -0.10000000000000001)
                        self.realItem.setHpr(0, 90, 180)
                    elif itemType == ItemGlobals.DAGGER:
                        self.realItem.setPos(-1.0, 2.0, -0.29999999999999999)
                        self.realItem.setHpr(90, 170, -90)
                    elif itemType == ItemGlobals.GRENADE:
                        self.realItem.setPos(0.0, 3.5, -0.20000000000000001)
                        self.realItem.setHpr(0, 0, 0)
                    elif itemType == ItemGlobals.STAFF:
                        self.realItem.setPos(-0.40000000000000002, 3.0, -0.29999999999999999)
                        self.realItem.setHpr(-90, 15, -90)
                    elif itemSubtype == ItemGlobals.RAM:
                        self.realItem.setPos(-1.5, 1.5, -0.59999999999999998)
                        self.realItem.setHpr(70, 160, -90)
                    elif itemType == ItemGlobals.POTION:
                        self.realItem.setPos(0.0, 2.5, -0.40000000000000002)
                        self.realItem.setHpr(45, 0, 0)
                    else:
                        self.realItem.setPos(0.0, 1.5, -0.059999999999999998)
                        self.realItem.setHpr(0, 90, 0)
                    self.realItem.reparentTo(self.portraitSceneGraph)
                
            
            iHeight = 0.17499999999999999
            self.createBuffer()
            self.itemCard.setZ(runningVertPosition - 0.059999999999999998)
            runningVertPosition -= iHeight
            runningSize += iHeight
            labels.append(self.itemCard)
            goldLabel = DirectLabel(parent = self, relief = None, image = coinImage, image_scale = 0.12, image_pos = Vec3(0.025000000000000001, 0, -0.02), text = str(int(ItemGlobals.getGoldCost(itemId) * ItemGlobals.GOLD_SALE_MULTIPLIER)), text_scale = subtitleScale, text_align = TextNode.ARight, text_fg = PiratesGuiGlobals.TextFG1, text_shadow = PiratesGuiGlobals.TextShadow, pos = (halfWidth - 0.050000000000000003, 0.0, runningVertPosition + 0.080000000000000002), text_pos = (0.0, -textScale))
            labels.append(goldLabel)
            infoText = PLocalizer.ItemAttackStrength % '\x01%s\x01%s\x02' % (itemColor, ItemGlobals.getPower(itemId))
            if itemType == ItemGlobals.GUN:
                infoText += '     %s' % PLocalizer.ItemBarrels % '\x01%s\x01%s\x02' % (itemColor, ItemGlobals.getBarrels(itemId))
                infoText += '     %s' % PLocalizer.ItemRangeStrength % '\x01%s\x01%s\x02' % (itemColor, PLocalizer.getItemRangeName(WeaponGlobals.getRange(itemId)))
            
            if itemType != ItemGlobals.POTION:
                infoLabel = DirectLabel(parent = self, relief = None, text = infoText, text_scale = textScale, text_align = TextNode.ACenter, pos = (0.0, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                iHeight = 0.080000000000000002
                runningVertPosition -= iHeight
                runningSize += iHeight
                labels.append(infoLabel)
            
            specialAttack = None
            if itemType != ItemGlobals.POTION:
                specialAttack = ItemGlobals.getSpecialAttack(itemId)
            
            if specialAttack:
                attackIcon = self.SkillIcons.find('**/%s' % WeaponGlobals.getSkillIcon(specialAttack))
                specialAttackNameLabel = DirectLabel(parent = self, relief = None, image = border, image_scale = 0.10000000000000001, geom = attackIcon, geom_scale = 0.10000000000000001, image_pos = (-0.070000000000000007, 0.0, -0.050000000000000003), geom_pos = (-0.070000000000000007, 0.0, -0.050000000000000003), text = PLocalizer.getInventoryTypeName(specialAttack), text_scale = PiratesGuiGlobals.TextScaleLarge, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, text_fg = titleColor, text_font = PiratesGlobals.getInterfaceOutlineFont(), text_shadow = PiratesGuiGlobals.TextShadow, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                specialAttackRankLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.ItemRank % ItemGlobals.getSpecialAttackRank(itemId), text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ARight, pos = (halfWidth - textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                specialAttackType = WeaponGlobals.getSkillTrack(specialAttack)
                if specialAttackType == WeaponGlobals.BREAK_ATTACK_SKILL_INDEX:
                    specialAttackTypeText = PLocalizer.BreakAttackSkill
                elif specialAttackType == WeaponGlobals.DEFENSE_SKILL_INDEX:
                    specialAttackTypeText = PLocalizer.DefenseSkill
                else:
                    specialAttackTypeText = PLocalizer.WeaponSkill
                specialAttackTypeLabel = DirectLabel(parent = self, relief = None, text = specialAttackTypeText, text_scale = 0.033500000000000002, text_wordwrap = halfWidth * 2.7999999999999998 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition - PiratesGuiGlobals.TextScaleLarge), text_pos = (0.0, -textScale))
                specialAttackInfo = PLocalizer.SkillDescriptions.get(specialAttack)
                specialAttackDescriptionText = specialAttackInfo[1]
                specialAttackDescriptionLabel = DirectLabel(parent = self, relief = None, text = specialAttackDescriptionText, text_scale = textScale, text_wordwrap = halfWidth * 2.7999999999999998 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition - specialAttackNameLabel.getHeight() + specialAttackTypeLabel.getHeight() - 0.059999999999999998), text_pos = (0.0, -textScale))
                saHeight = specialAttackNameLabel.getHeight() + specialAttackTypeLabel.getHeight() + specialAttackDescriptionLabel.getHeight() - 0.040000000000000001
                runningVertPosition -= saHeight
                runningSize += saHeight
                labels.append(specialAttackNameLabel)
                labels.append(specialAttackRankLabel)
                labels.append(specialAttackTypeLabel)
                labels.append(specialAttackDescriptionLabel)
            
            attributes = ItemGlobals.getAttributes(itemId)
            for i in range(0, len(attributes)):
                attributeIcon = self.SkillIcons.find('**/%s' % ItemGlobals.getAttributeIcon(attributes[i][0]))
                if not attributeIcon:
                    attributeIcon = self.BuffIcons.find('**/%s' % ItemGlobals.getAttributeIcon(attributes[i][0]))
                
                attributeNameLabel = DirectLabel(parent = self, relief = None, image = border, image_scale = 0.050000000000000003, geom = attributeIcon, geom_scale = 0.050000000000000003, image_pos = (-0.070000000000000007, 0.0, -0.029999999999999999), geom_pos = (-0.070000000000000007, 0.0, -0.029999999999999999), text = PLocalizer.getItemAttributeName(attributes[i][0]), text_scale = PiratesGuiGlobals.TextScaleLarge, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, text_fg = titleColor, text_font = PiratesGlobals.getInterfaceOutlineFont(), text_shadow = PiratesGuiGlobals.TextShadow, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                attributeRankLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.ItemRank % attributes[i][1], text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ARight, pos = (halfWidth - textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                if attributeNameLabel.getHeight() > 0.074999999999999997:
                    attributeNameSpace = 0.080000000000000002
                else:
                    attributeNameSpace = PiratesGuiGlobals.TextScaleLarge
                attributeDescriptionLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.getItemAttributeDescription(attributes[i][0]), text_scale = textScale, text_wordwrap = halfWidth * 2.7999999999999998 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition - attributeNameSpace), text_pos = (0.0, -textScale))
                aHeight = attributeNameLabel.getHeight() + attributeDescriptionLabel.getHeight()
                runningVertPosition -= aHeight + splitHeight
                runningSize += aHeight + splitHeight
                labels.append(attributeNameLabel)
                labels.append(attributeRankLabel)
                labels.append(attributeDescriptionLabel)
            
            skillBoosts = ItemGlobals.getSkillBoosts(itemId)
            for i in range(0, len(skillBoosts)):
                boostIcon = self.SkillIcons.find('**/%s' % WeaponGlobals.getSkillIcon(skillBoosts[i][0]))
                boostNameLabel = DirectLabel(parent = self, relief = None, image = border, image_scale = 0.050000000000000003, geom = boostIcon, geom_scale = 0.050000000000000003, image_pos = (-0.070000000000000007, 0.0, -0.029999999999999999), geom_pos = (-0.070000000000000007, 0.0, -0.029999999999999999), text = PLocalizer.ItemBoost % PLocalizer.getInventoryTypeName(skillBoosts[i][0]), text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ALeft, pos = (-halfWidth + 0.12 + textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                boostRankLabel = DirectLabel(parent = self, relief = None, text = '+%s' % str(skillBoosts[i][1]), text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (0.90000000000000002 / titleScale), text_align = TextNode.ARight, pos = (halfWidth - textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                bHeight = boostNameLabel.getHeight()
                runningVertPosition -= bHeight + splitHeight
                runningSize += bHeight + splitHeight
                labels.append(boostNameLabel)
                labels.append(boostRankLabel)
            
            description = PLocalizer.getItemFlavorText(itemId)
            if description != '':
                descriptionLabel = DirectLabel(parent = self, relief = None, text = description, text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (0.94999999999999996 / textScale), text_align = TextNode.ALeft, pos = (-halfWidth + textScale * 0.5, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                dHeight = descriptionLabel.getHeight() + 0.02
                runningVertPosition -= dHeight
                runningSize += dHeight
                labels.append(descriptionLabel)
            
            inv = localAvatar.getInventory()
            weaponLevel = 0
            weaponRepId = WeaponGlobals.getRepId(itemId)
            weaponRep = inv.getReputation(weaponRepId)
            weaponReq = ItemGlobals.getWeaponRequirement(itemId)
            weaponText = None
            trainingToken = EconomyGlobals.getItemTrainingReq(itemId)
            trainingAmt = inv.getItemQuantity(trainingToken)
            if weaponReq:
                weaponLevel = ReputationGlobals.getLevelFromTotalReputation(weaponRepId, weaponRep)[0]
                if weaponLevel < weaponReq:
                    weaponColor = PiratesGuiGlobals.TextFG6
                else:
                    weaponColor = (0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                    weaponText = PLocalizer.ItemLevelRequirement % (weaponReq, PLocalizer.getItemTypeName(itemType))
            elif trainingAmt == 0:
                weaponColor = PiratesGuiGlobals.TextFG6
                weaponText = PLocalizer.ItemTrainingRequirement % PLocalizer.getItemTypeName(itemType)
            
            if trainingAmt == 0:
                if itemType == ItemGlobals.GUN:
                    base.localAvatar.sendRequestContext(InventoryType.GunTrainingRequired)
                elif itemType == ItemGlobals.DOLL:
                    base.localAvatar.sendRequestContext(InventoryType.DollTrainingRequired)
                elif itemType == ItemGlobals.DAGGER:
                    base.localAvatar.sendRequestContext(InventoryType.DaggerTrainingRequired)
                elif itemType == ItemGlobals.STAFF:
                    base.localAvatar.sendRequestContext(InventoryType.StaffTrainingRequired)
                
            
            if weaponText:
                weaponReqLabel = DirectLabel(parent = self, relief = None, text = weaponText, text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (1.5 / titleScale), text_fg = weaponColor, text_shadow = PiratesGuiGlobals.TextShadow, text_align = TextNode.ACenter, pos = (0.0, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                wHeight = weaponReqLabel.getHeight()
                runningVertPosition -= wHeight
                runningSize += wHeight
                labels.append(weaponReqLabel)
            
            if not Freebooter.getPaidStatus(localAvatar.getDoId()):
                if rarity != ItemGlobals.CRUDE:
                    unlimitedLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.UnlimitedAccessRequirement, text_scale = textScale, text_wordwrap = halfWidth * 2.0 * (1.5 / titleScale), text_fg = PiratesGuiGlobals.TextFG6, text_shadow = PiratesGuiGlobals.TextShadow, text_align = TextNode.ACenter, pos = (0.0, 0.0, runningVertPosition), text_pos = (0.0, -textScale))
                    uHeight = unlimitedLabel.getHeight()
                    runningVertPosition -= uHeight
                    runningSize += uHeight
                    labels.append(unlimitedLabel)
                
            
            runningVertPosition -= 0.02
            runningSize += 0.02
            panels = self.helpFrame.attachNewNode('panels')
            topPanel = panels.attachNewNode('middlePanel')
            detailGui.find('**/top_panel').copyTo(topPanel)
            topPanel.setScale(0.080000000000000002)
            topPanel.reparentTo(self.helpFrame)
            middlePanel = panels.attachNewNode('middlePanel')
            detailGui.find('**/middle_panel').copyTo(middlePanel)
            middlePanel.setScale(0.080000000000000002)
            middlePanel.reparentTo(self.helpFrame)
            placement = 0
            i = 0
            heightMax = -0.080000000000000002
            currentHeight = runningVertPosition
            while currentHeight < heightMax:
                middlePanel = panels.attachNewNode('middlePanel%s' % 1)
                detailGui.find('**/middle_panel').copyTo(middlePanel)
                middlePanel.setScale(0.080000000000000002)
                middlePanel.reparentTo(self.helpFrame)
                if currentHeight + 0.20000000000000001 >= heightMax:
                    difference = heightMax - currentHeight
                    placement += (0.16800000000000001 / 0.20000000000000001) * difference
                    currentHeight += difference
                else:
                    placement += 0.16800000000000001
                    currentHeight += 0.20000000000000001
                middlePanel.setZ(-placement)
                i += 1
            bottomPanel = panels.attachNewNode('bottomPanel')
            detailGui.find('**/bottom_panel').copyTo(bottomPanel)
            bottomPanel.setScale(0.080000000000000002)
            bottomPanel.setZ(-placement)
            bottomPanel.reparentTo(self.helpFrame)
            colorPanel = panels.attachNewNode('colorPanel')
            detailGui.find('**/color').copyTo(colorPanel)
            colorPanel.setScale(0.080000000000000002)
            colorPanel.setColor(titleColor)
            colorPanel.reparentTo(self.helpFrame)
            lineBreakTopPanel = panels.attachNewNode('lineBreakTopPanel')
            detailGui.find('**/line_break_top').copyTo(lineBreakTopPanel)
            lineBreakTopPanel.setScale(0.080000000000000002, 0.080000000000000002, 0.070000000000000007)
            lineBreakTopPanel.setZ(0.0080000000000000002)
            lineBreakTopPanel.reparentTo(self.helpFrame)
            if itemType != ItemGlobals.POTION:
                lineBreakBottomPanel = panels.attachNewNode('lineBreakBottomPanel')
                detailGui.find('**/line_break_bottom').copyTo(lineBreakBottomPanel)
                lineBreakBottomPanel.setScale(0.080000000000000002, 0.080000000000000002, 0.070000000000000007)
                lineBreakBottomPanel.setZ(-0.014999999999999999)
                lineBreakBottomPanel.reparentTo(self.helpFrame)
            
            panels.flattenStrong()
            self.helpFrame['frameSize'] = (-halfWidth, halfWidth, -(runningSize + vMargin), vMargin)
            totalHeight = self.helpFrame.getHeight() - 0.10000000000000001
            for label in labels:
                label.reparentTo(self.helpFrame)
            
            self.helpFrame.setBin('gui-popup', 0)
            self.helpFrame.setPos(self, 0.55000000000000004, 0, -0.29999999999999999)
            zOffset = -0.5 - self.helpFrame.getPos(aspect2d)[2]
            if zOffset >= 0.0:
                self.helpFrame.setPos(self, 0.55000000000000004, 0, zOffset - 0.29999999999999999)
            
        else:
            weaponInfo = PLocalizer.WeaponDescriptions.get(self.data[0])
            weaponDesc = weaponInfo
            self.helpText = DirectFrame(parent = self, relief = None, text = weaponDesc, state = DGG.DISABLED, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 13, textMayChange = 0, sortOrder = 91)
            height = -self.helpText.getHeight()
            self.helpFrame = BorderFrame(parent = aspect2d, state = DGG.DISABLED, frameSize = (-0.029999999999999999, 0.42999999999999999, height, 0.050000000000000003), sortOrder = 90, borderScale = 0.20000000000000001)
            self.helpText.reparentTo(self.helpFrame)
            self.helpFrame.setBin('gui-popup', 0)
            self.helpFrame.setPos(self, 0.25, 0, -0.035000000000000003)

    
    def destroy(self):
        taskMgr.remove('helpInfoTask')
        taskMgr.remove(self.taskName('dragTask'))
        self.destroyBuffer()
        if self.itemCard:
            self.itemCard.removeNode()
        
        if self.realItem:
            self.realItem.removeNode()
        
        if self.helpFrame:
            self.helpFrame.destroy()
            self.helpFrame = None
        
        del self.picture
        if self.weapon:
            taskMgr.remove(DGG.B1PRESS)
            taskMgr.remove(DGG.B2PRESS)
            taskMgr.remove(DGG.B3PRESS)
        
        InventoryListItem.destroy(self)

    
    def setDraggable(self, d):
        self.draggable = d

    
    def dragStart(self, event):
        self.origionalPos = self.getPos(render2d)
        self.origionalParent = self.getParent()
        self.bringToFront()
        self.setColorScale(1, 1, 1, 0.5)
        if self.draggable:
            self.wrtReparentTo(aspect2d)
            taskMgr.remove(self.taskName('dragTask'))
            vWidget2render2d = self.getPos(render2d)
            vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1])
            editVec = Vec3(vWidget2render2d - vMouse2render2d)
            task = taskMgr.add(self.dragTask, self.taskName('dragTask'))
            task.editVec = editVec
        

    
    def dragTask(self, task):
        if task.time < PiratesGuiGlobals.DragStartDelayTime:
            return Task.cont
        else:
            mwn = base.mouseWatcherNode
            if mwn.hasMouse():
                vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1])
                newPos = vMouse2render2d + task.editVec
                self.setPos(render2d, newPos)
                newPos = self.getPos(aspect2d)
                x = newPos[0]
                z = newPos[2]
                x = x - x % 0.050000000000000003
                z = z - z % 0.050000000000000003
                x = min(1.3 - self.width, max(-1.3, x))
                z = min(1 - self.height, max(-1, z))
                self.setPos(aspect2d, x, 0.0, z)
            
            return Task.cont

    
    def dragStop(self, event):
        self.clearColorScale()
        self.wrtReparentTo(self.origionalParent)
        self.setPos(render2d, self.origionalPos)
        if self.draggable:
            taskMgr.remove(self.taskName('dragTask'))
        

    
    def showDetails(self, event):
        taskMgr.doMethodLater(PiratesGuiGlobals.HelpPopupTime, self.createHelpbox, 'helpInfoTask')
        self.createHelpbox()

    
    def hideDetails(self, event):
        taskMgr.remove('helpInfoTask')
        if self.helpFrame:
            self.helpFrame.destroy()
            self.helpFrame = None
        

    
    def createBuffer(self):
        self.destroyBuffer()
        self.buffer = base.win.makeTextureBuffer('par', 256, 256)
        self.buffer.setOneShot(True)
        self.cam = base.makeCamera(win = self.buffer, scene = self.portraitSceneGraph, clearColor = Vec4(1), lens = self.lens)
        self.cam.node().getDisplayRegion(0).setIncompleteRender(False)
        self.cam.reparentTo(self.portraitSceneGraph)
        self.bg.reparentTo(self.cam)
        self.glow.reparentTo(self.cam)
        if self.itemCard:
            self.itemCard.removeNode()
        
        tex = self.buffer.getTexture()
        self.itemCard = NodePath(self.cm.generate())
        self.itemCard.setTexture(tex, 1)
        if self.helpFrame:
            self.itemCard.reparentTo(self.helpFrame)
        

    
    def destroyBuffer(self):
        if self.buffer:
            base.graphicsEngine.removeWindow(self.buffer)
            self.buffer = None
            self.bg.detachNode()
            self.glow.detachNode()
            self.cam.removeNode()
            self.cam = None
class RepairGameButton(GuiButton):
    
    def __init__(self, parent, **kw):
        optiondefs = (('nodePath', None, None), ('image_scale', (1.0, 1.0, 1.0), None))
        self.defineoptions(kw, optiondefs)
        GuiButton.__init__(self, parent)
        self.initialiseoptions(RepairGameButton)
        self.disabledStateNode = self.stateNodePath[3].getChild(0)
        self.downStateNode = self.stateNodePath[1].getChild(0)
        self.overStateNode = self.stateNodePath[2].getChild(0)
        self.inProgress = False
        self._initGUI()

    
    def _initGUI(self):
        self.setBin('fixed', 33)
        mainGui = loader.loadModel('models/gui/gui_main')
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.checkMark = gui.find('**/generic_check')
        self.checkMark.reparentTo(self)
        self.checkMark.stash()
        self.checkMark.setScale(1.0)
        self.checkMark.setColorScale(0.0, 1.0, 0.0, 1.0)
        self.checkMark.setPos(0.02, 0.0, 0.02)
        self.checkMark.setBin('fixed', 34)
        self.skillRing = DialMeter(self, wantCover = False, dangerRatio = 0.0, meterColor = Vec4(0.90000000000000002, 0.90000000000000002, 0.10000000000000001, 1.0), baseColor = Vec4(0.14999999999999999, 0.070000000000000007, 0.029999999999999999, 1.0), completeColor = Vec4(0.10000000000000001, 0.90000000000000002, 0.10000000000000001, 1.0))
        self.skillRing.reparentTo(self)
        self.skillRing.setScale(0.28499999999999998, 0.29999999999999999, 0.26500000000000001)
        self.skillRing.setBin('fixed', 32)
        self.skillGlow = OnscreenImage(parent = self, image = mainGui.find('**/icon_glow'), scale = (1.0, 1.0, 1.0), color = (1.0, 1.0, 0.59999999999999998, 1.0))
        self.glow = OnscreenImage(parent = self, image = mainGui.find('**/icon_glow'), scale = (1.0, 1.0, 1.0), color = (1.0, 1.0, 0.59999999999999998, 1.0))
        self.skillGlow.reparentTo(self)
        self.skillGlow.setBin('fixed', 31)
        self.skillGlow.stash()
        self.pirateNameBox = None
        self.pirateNameLabel = None

    
    def showGlow(self):
        self.inProgress = False
        if self.pirateNameLabel == None and self.checkMark.isStashed():
            self.skillGlow.unstash()
        

    
    def hideGlow(self):
        self.inProgress = True
        self.skillGlow.stash()

    
    def setProgress(self, percent):
        self.skillGlow.stash()
        ratio = max(0.0, percent / 100.0)
        if ratio >= 1.0:
            if self.checkMark.isStashed():
                self.checkMark.unstash()
            
        elif not self.checkMark.isStashed():
            self.checkMark.stash()
        
        if self.pirateNameLabel == None and not (self.inProgress):
            self.skillGlow.unstash()
        
        self.skillRing.update(ratio, 1.0)
        self.skillRing.wrtReparentTo(self.getParent())
        self.reparentTo(self.getParent())

    
    def updatePirateNameBox(self, pirateName):
        if self.pirateNameLabel != None and self.pirateNameLabel['text'] != pirateName:
            if self.pirateNameBox:
                self.pirateNameBox.destroy()
            
            if self.pirateNameLabel:
                self.pirateNameLabel.destroy()
            
            self.pirateNameBox = None
            self.pirateNameLabel = None
        
        if pirateName != '':
            if self.pirateNameBox:
                pass
            if not (self.pirateNameLabel['text'] == pirateName):
                self.createPirateNameBox(pirateName)
            

    
    def createPirateNameBox(self, pirateName):
        self.pirateNameLabel = DirectLabel(relief = None, state = DGG.DISABLED, text = pirateName, text_align = TextNode.ACenter, text_scale = PiratesGuiGlobals.TextScaleMed, text_fg = PiratesGuiGlobals.TextFG1, text_wordwrap = 12, textMayChange = 0, sortOrder = 91)
        self.pirateNameLabel.setBin('fixed', 33)
        height = self.pirateNameLabel.getHeight()
        width = self.pirateNameLabel.getWidth() + 0.050000000000000003
        pos = [
            0.0,
            0.0,
            height / 2 - 0.035000000000000003]
        fs = [
            -(width / 2 + 0.01),
            width / 2 + 0.01,
            -(height / 2 + 0.014999999999999999),
            height / 2 + 0.014999999999999999]
        self.pirateNameBox = BorderFrame(parent = self, state = DGG.DISABLED, frameSize = (fs[0], fs[1], fs[2], fs[3]), modelName = 'general_frame_f', pos = (0.0, 0.0, 0.0))
        self.pirateNameLabel.reparentTo(self.pirateNameBox)
        self.pirateNameLabel.setPos(pos[0], pos[1], pos[2])
        self.pirateNameBox.setClipPlaneOff()
        pos = self.pirateNameBox.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.pirateNameBox.setPos(aspect2d, x, 0, z - 0.17499999999999999)
        self.pirateNameBox.flattenLight()
        self.pirateNameBox.setBin('fixed', 32)
        self.pirateNameBox.reparentTo(self)
Exemplo n.º 10
0
class Dart(PickableModel):
    def __init__(self,
                 name,
                 parent,
                 defaultPos,
                 color=Vec4(1),
                 offset=0.0,
                 *args,
                 **kwargs):
        self.startScale = 0.074999999999999997
        self.highlightScale = 0.10000000000000001
        PickableModel.__init__(self,
                               name,
                               modelName='icon_objective_grey',
                               scale=self.startScale,
                               collisionIndex=17,
                               modelPath='models/gui/compass_main',
                               *args,
                               **args)
        self.defaultPos = defaultPos
        self.edgeMode = False
        self.helpBox = None
        self.helpLabel = None
        self.normalModeNode = self.attachNewNode('normal')
        self.normalModeNode.setColorScale(color)
        self.normalModeNode.setY(-(offset + 0.0074999999999999997))
        self.geom.instanceTo(self.normalModeNode)
        self.colNode = self.normalModeNode.attachNewNode(
            CollisionNode('cNode'))
        self.colNode.node().addSolid(CollisionSphere(Point3(0, 0, 0), 0.25))
        self.colNode.setScale(1 / 20.0)
        self.colNode.node().setFromCollideMask(BitMask32.allOff())
        self.colNode.node().setIntoCollideMask(BitMask32.bit(17))
        self.setTag('dart', name)
        self.setPos(self.defaultPos)
        self.createHelpBox()
        questId = localAvatar.activeQuestId
        qs = localAvatar.getQuestById(questId)
        if qs:
            title = qs.getStatusText()
            self.setHelpLabel(title)

    def toggleHelpText(self):
        if self.helpBox:
            if not self.helpBox.isHidden():
                self.hideDetails()

    def createHelpBox(self):
        if not self.helpBox:
            self.helpLabel = DirectLabel(
                parent=aspect2d,
                relief=None,
                text='',
                text_align=TextNode.ALeft,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_wordwrap=12,
                text_shadow=(0, 0, 0, 1),
                textMayChange=1,
                sortOrder=91)
            height = -(self.helpLabel.getHeight() + 0.01)
            width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
            self.helpBox = BorderFrame(parent=aspect2d,
                                       state=DGG.DISABLED,
                                       frameSize=(-0.040000000000000001, width,
                                                  height,
                                                  0.050000000000000003),
                                       pos=(0, 0, 0),
                                       sortOrder=90)
            self.helpLabel.reparentTo(self.helpBox)
            self.helpBox.hide()

    def setHelpLabel(self, text):
        self.helpLabel['text'] = text
        self.helpLabel.resetFrameSize()
        height = -(self.helpLabel.getHeight() + 0.01)
        width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
        self.helpBox['frameSize'] = (-0.040000000000000001, width, height,
                                     0.050000000000000003)
        self.helpBox.resetFrameSize()

    def showDetails(self, pos):
        if self.helpLabel['text'] != '':
            self.helpBox.setPos(pos +
                                Point3(self.helpBox['frameSize'][1] *
                                       0.25, 0, 0))
            self.helpBox.setBin('gui-popup', 0)
            self.helpBox.show()
            self.geom.setScale(self.highlightScale)

    def hideDetails(self):
        if self.helpBox:
            self.helpBox.hide()
            self.geom.setScale(self.startScale)

    def mouseOver(self, pos):
        self.showDetails(pos)

    def mouseLeft(self):
        self.hideDetails()

    def getDefaultPos(self):
        return self.defaultPos

    def setEdgeMode(self, edgeMode):
        self.edgeMode = edgeMode
        if self.edgeMode:
            self.edgeModeNode.unstash()
        else:
            self.edgeModeNode.stash()

    def setColorScale(self, *args, **kwargs):
        self.edgeModeNode.setColorScale(*args, **args)
        self.normalModeNode.setColorScale(*args, **args)

    def setScale(self, *args, **kwargs):
        self.normalModeNode.setScale(*args, **args)

    def setPosition(self, worldPos, *args, **kwargs):
        NodePath.setPos(self, *args, **args)
        if self.edgeMode:
            self.edgeModeNode.setPos(*args, **args)
Exemplo n.º 11
0
class GuiButton(DirectButton):
    __module__ = __name__
    notify = directNotify.newCategory('GuiButton')
    genericButton = None
    redGenericButton = None
    blueGenericButton = None

    def __init__(self,
                 parent=None,
                 hotkeys=(),
                 hotkeyLabel=None,
                 hotkeyLabelX=0.092,
                 hotkeyArgs=True,
                 helpText='',
                 helpPos=(0, 0, 0),
                 helpDelay=PiratesGuiGlobals.HelpPopupTime,
                 helpColorOff=False,
                 helpLeftAlign=False,
                 helpCenterAlign=False,
                 **kw):
        self.loadGui()
        self.helpBox = None
        self.helpWatcher = None
        self.canRepositon = False
        optiondefs = (('relief', None, None), ('pos', (0, 0, 0), None),
                      ('image', GuiButton.genericButton,
                       None), ('image_scale', (0.24, 0.22, 0.22),
                               None), ('image_pos', (0, 0, 0), None),
                      ('pressEffect', 0, None), ('text', '', None),
                      ('text_font', PiratesGlobals.getInterfaceFont(), None),
                      ('text_scale', PiratesGuiGlobals.TextScaleLarge,
                       None), ('text0_fg', PiratesGuiGlobals.TextFG2, None),
                      ('text1_fg', PiratesGuiGlobals.TextFG2,
                       None), ('text2_fg', PiratesGuiGlobals.TextFG2, None),
                      ('text3_fg', PiratesGuiGlobals.TextFG3,
                       None), ('text_shadow', PiratesGuiGlobals.TextShadow,
                               None), ('text_pos', (0, -0.01),
                                       None), ('text_wordwrap', 8, None),
                      ('text_align', TextNode.ACenter,
                       None), ('textMayChange', 1,
                               None), ('helpText', helpText,
                                       self.helpTextUpdated),
                      ('helpPos', helpPos, self.setHelpPos), ('helpDelay',
                                                              helpDelay, None),
                      ('helpColorOff', helpColorOff,
                       None), ('helpLeftAlign', helpLeftAlign,
                               None), ('helpCenterAlign', helpCenterAlign,
                                       None), ('helpBin', 'gui-popup',
                                               None), ('helpBinSort', 0, None),
                      ('helpOpaque', 0, None), ('canReposition', False,
                                                None), ('sortOrder', 100,
                                                        None), ('baseImage',
                                                                None, None),
                      ('selected', False,
                       None), ('selectedImage', GuiButton.genericButton,
                               None), ('state', DGG.NORMAL, self.setState))
        self.defineoptions(kw, optiondefs)
        DirectButton.__init__(self, parent=NodePath(), **kw)
        self.initialiseoptions(GuiButton)
        self.hotkeys = ()
        self.setupHotkeys(hotkeys, hotkeyLabel, self['command'],
                          self['extraArgs'], hotkeyLabelX, hotkeyArgs)
        self.reparentTo(parent or aspect2d)
        self.helpTaskName = None
        return

    def destroy(self):
        self.hideDetails()
        self.command = None
        if self.helpWatcher:
            self.helpWatcher.command = None
            self.helpWatcher.unbind(DGG.WITHIN)
            self.helpWatcher.unbind(DGG.WITHOUT)
            self.helpWatcher.destroy()
            self.helpWatcher = None
        self.unbind(DGG.ENTER)
        self.unbind(DGG.EXIT)
        self.ignoreAll()
        DirectButton.destroy(self)
        return

    def loadGui(self):
        if GuiButton.genericButton:
            return
        gui = loader.loadModel('models/gui/toplevel_gui')
        GuiButton.genericButton = (gui.find('**/generic_button'),
                                   gui.find('**/generic_button_down'),
                                   gui.find('**/generic_button_over'),
                                   gui.find('**/generic_button_disabled'))
        GuiButton.redGenericButton = (
            gui.find('**/pir_t_gui_but_generic'),
            gui.find('**/pir_t_gui_but_generic_down'),
            gui.find('**/pir_t_gui_but_generic_over'),
            gui.find('**/pir_t_gui_but_generic_disabled'))
        GuiButton.blueGenericButton = (
            gui.find('**/pir_t_gui_but_generic_blue'),
            gui.find('**/pir_t_gui_but_generic_blue_down'),
            gui.find('**/pir_t_gui_but_generic_blue_over'),
            gui.find('**/pir_t_gui_but_generic_blue_disabled'))

    def setupHotkeys(self,
                     hotkeys,
                     hotkeyLabel,
                     command,
                     extraArgs,
                     hotkeyLabelX=0.092,
                     hotkeyArgs=True):
        if self.hotkeys:
            self.ignoreHotkeys()
            self.hotkeyLabel.destroy()
        self.hotkeys = hotkeys
        self.command = command
        self.extraArgs = extraArgs
        self.hotkeyLabel = hotkeyLabel
        self.hotkeyLabelX = hotkeyLabelX
        self.hotkeyArgs = hotkeyArgs
        if self.hotkeys:
            self.hotkeyLabel = DirectLabel(
                parent=self,
                relief=None,
                state=DGG.DISABLED,
                text=hotkeyLabel,
                text_font=PiratesGlobals.getPirateBoldOutlineFont(),
                text_scale=PiratesGuiGlobals.TextScaleMed,
                text_pos=(hotkeyLabelX, 0.01),
                text_fg=PiratesGuiGlobals.TextFG2,
                text_shadow=PiratesGuiGlobals.TextShadow,
                textMayChange=1)
            self.acceptHotkeys()
        return

    def ignoreHotkeys(self):
        if self.hotkeys:
            for hotkey in self.hotkeys:
                self.ignore(hotkey)

    def acceptHotkeys(self):
        if self.hotkeys:
            for hotkey in self.hotkeys:
                if self.hotkeyArgs:
                    self.accept(hotkey, self.command,
                                self.extraArgs + [hotkey])
                else:
                    self.accept(hotkey, self.command, self.extraArgs)

    def createHelpWatcher(self):
        if self['helpOpaque']:
            self.bind(DGG.ENTER, self.waitShowDetails)
            self.bind(DGG.EXIT, self.hideDetails)
        else:
            w = self.getWidth()
            h = self.getHeight()
            pos = self.__discoverHelpWatcherPos()
            frameSize = self['frameSize'] or self.getBounds()
            self.helpWatcher = DirectFrame(parent=self,
                                           relief=base.config.GetBool(
                                               'show-helpwatchers', 0),
                                           state=DGG.NORMAL,
                                           frameColor=(1, 1, 0, 0.5),
                                           frameSize=frameSize,
                                           sortOrder=self['sortOrder'] - 1)
            self.helpWatcher.wrtReparentTo(self.getParent())
            self.reparentTo(self.getParent())
            self.helpWatcher.bind(DGG.WITHIN, self.waitShowDetails)
            self.helpWatcher.bind(DGG.WITHOUT, self.hideDetails)

    def __discoverHelpWatcherPos(self):
        w = self.getWidth()
        h = self.getHeight()
        bounds = self['frameSize'] or self.getBounds()
        pos = Vec3(bounds[0] + w / 2, 0, bounds[2] + h / 2)
        return pos

    def resetHelpWatcher(self):
        if self.helpWatcher:
            self.helpWatcher.setPos(self, 0, 0, 0)

    def createHelpBox(self):
        if not self.helpWatcher:
            self.createHelpWatcher()
        helpLabel = DirectLabel(relief=None,
                                state=DGG.DISABLED,
                                text=self['helpText'],
                                text_align=TextNode.ACenter,
                                text_scale=PiratesGuiGlobals.TextScaleMed,
                                text_fg=PiratesGuiGlobals.TextFG1,
                                text_wordwrap=12,
                                text_shadow=(0, 0, 0, 1),
                                textMayChange=0,
                                sortOrder=91)
        height = helpLabel.getHeight()
        width = helpLabel.getWidth() + 0.05
        if self['helpLeftAlign']:
            fs = [0.0, width, -height, 0.045]
            pos = [width / 2.0, 0, -0.01]
        else:
            if self['helpCenterAlign']:
                pos = [0.0, 0.0, -0.01]
                fs = [
                    -(width / 2 + 0.01), width / 2 + 0.01,
                    -(height / 2 + 0.015), height / 2 + 0.015
                ]
            else:
                fs = [0.25 - width, 0.25, -height, 0.045]
                pos = [0.25 - width / 2.0, 0, -0.01]
        self.helpBox = BorderFrame(parent=self,
                                   state=DGG.DISABLED,
                                   frameSize=(fs[0], fs[1], fs[2], fs[3]),
                                   modelName='general_frame_f',
                                   pos=self['helpPos'],
                                   sortOrder=90)
        helpLabel.reparentTo(self.helpBox)
        helpLabel.setPos(pos[0], pos[1], pos[2])
        self.helpBox.hide()
        self.helpBox.setClipPlaneOff()
        pos = self.helpBox.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.helpBox.setPos(aspect2d, x, 0, z)
        if self['helpColorOff']:
            self.helpBox.setColorOff()
        else:
            self.helpBox.flattenLight()
        if self['helpBin']:
            self.helpBox.setBin(self['helpBin'], self['helpBinSort'])
        return

    def helpTextUpdated(self):
        if self.helpBox:
            self.helpBox['text'] != self['helpText'] and self.helpBox.destroy()
            self.createHelpBox()
        else:
            if self['helpText']:
                self.createHelpBox()

    def setHelpPos(self):
        if self.helpBox:
            self.helpTextUpdated()

    def waitShowDetails(self, event):
        try:
            self['helpDelay']
        except AttributeError:
            return
        else:
            if not self.helpBox:
                self.createHelpBox()
            if self['helpDelay']:
                self.hideDetails()
                self.helpTaskName = 'helpInfoTask-%s' % self.getName()
                taskMgr.doMethodLater(self['helpDelay'],
                                      self.helpBox.show,
                                      self.helpTaskName,
                                      extraArgs=[])
            self.helpBox.show()

    def hideDetails(self, event=None):
        if self.helpTaskName:
            taskMgr.remove(self.helpTaskName)
        if self.helpBox and not self.helpBox.isEmpty():
            self.helpBox.hide()

    def setImage(self):
        DirectButton.setImage(self)
        if not self['baseImage']:
            self['baseImage'] = self['image']

    def setSelected(self):
        if self['selected']:
            self['image'] = self['selectedImage']
        else:
            self['image'] = self['baseImage']

    def setPos(self, *args, **kw):
        DirectButton.setPos(self, *args, **kw)

    def setX(self, *args, **kw):
        DirectButton.setX(self, *args, **kw)

    def setY(self, *args, **kw):
        DirectButton.setY(self, *args, **kw)

    def setZ(self, *args, **kw):
        DirectButton.setZ(self, *args, **kw)

    def setState(self):
        DirectButton.setState(self)
        if self.helpWatcher:
            self.helpWatcher['state'] = self['state']

    def removeNode(self):
        DirectButton.removeNode(self)
        if self.helpWatcher:
            self.helpWatcher.removeNode()

    def remove(self):
        DirectButton.remove(self)
        if self.helpWatcher:
            self.helpWatcher.remove()

    def detachNode(self):
        DirectButton.detachNode(self)
        if self.helpWatcher:
            self.helpWatcher.detachNode()

    def hide(self):
        DirectButton.hide(self)
        if self.helpWatcher:
            self.helpWatcher.hide()

    def show(self):
        DirectButton.show(self)
        if self.helpWatcher:
            self.helpWatcher.show()

    def stash(self):
        DirectButton.stash(self)
        if self.helpWatcher:
            self.helpWatcher.stash()

    def unstash(self):
        DirectButton.unstash(self)
        self.reparentTo(self.getParent(), sort=self['sortOrder'])
        if self.helpWatcher:
            self.helpWatcher.unstash()
            self.helpWatcher.reparentTo(self.helpWatcher.getParent(),
                                        sort=self.helpWatcher['sortOrder'])
Exemplo n.º 12
0
class TextIsland(Island):
    def __init__(self,
                 name,
                 islandUid,
                 modelName,
                 isTeleportIsland,
                 nodePath=NodePath(),
                 offset=0.0,
                 scale=1.0,
                 collisionIndex=17,
                 stencilId=0,
                 *args,
                 **kwargs):
        Island.__init__(self, name, islandUid, modelName, isTeleportIsland,
                        scale, collisionIndex, stencilId, *args, **args)
        pencil = self.geom.find('**/pencil*')
        if not pencil.isEmpty():
            pass
        1
        self.name = name
        self.helpBox = None
        self.helpLabel = None
        self.textScaleNode = self.attachNewNode('textScale')

        def formatName(name, lineWidth):
            tokens = name.split()
            out = ''
            count = 0
            for token in tokens:
                if count + len(token) < lineWidth:
                    count += len(token) + 1
                    out = '%s %s' % (out, token)
                    continue
                count = len(token) + 1
                out = '%s\n%s' % (out, token)

            out.strip()
            return '\x01smallCaps\x01%s\x02' % (out, )

        formattedName = formatName(self.name, 10)
        self.text = Text(name + '-text', nodePath, offset, formattedName,
                         stencilId)
        self.text.reparentTo(self.textScaleNode)
        self.text.setBin('background', 2)
        if self.getNetTag('islandUid') == '1160614528.73sdnaik':
            mesh = self.geom
            (t, T) = self.text.getTightBounds()
            (i, I) = mesh.getTightBounds()
        else:
            mesh = self.geom.find('**/top_mesh')
            (t, T) = self.text.getTightBounds()
            if not mesh.isEmpty():
                (i, I) = mesh.getTightBounds()
            else:
                (i, I) = self.geom.getTightBounds()
            i *= self.geom.getScale()[0]
            I *= self.geom.getScale()[0]
        self.textScaleNode.setPos(0, (i[1] - I[1]) / 2 - T[2], 0.001)
        compassGui = loader.loadModel('models/gui/compass_gui')
        topGui = loader.loadModel('models/gui/toplevel_gui')
        icons = loader.loadModel('models/textureCards/icons')
        self.button = self.text.attachNewNode('button')
        bg = topGui.find('**/treasure_w_b_slot_empty')
        bg.setScale(0.14000000000000001)
        bg.reparentTo(self.button)
        buttonPos = Point3(t[0] - 0.021999999999999999, 0, (t[2] + T[2]) / 2.0)
        self.button.flattenStrong()
        self.button.setPos(buttonPos)
        self.button.setColorScaleOff()
        self.button.hide()
        self.teleportIconDisabled = compassGui.find(
            '**/compass_icon_objective_grey')
        self.teleportIconDisabled.setScale(0.14000000000000001)
        self.teleportIconDisabled.reparentTo(self.button)
        self.teleportIconEnabled = compassGui.find(
            '**/compass_icon_objective_green')
        self.teleportIconEnabled.setScale(0.14000000000000001)
        self.teleportIconEnabled.reparentTo(self.button)
        self.manIcon = icons.find('**/icon_stickman')
        self.manIcon.setScale(0.035000000000000003)
        self.manIcon.reparentTo(self.button)
        (t, T) = self.text.getTightBounds()
        p0 = VBase3(t[0], 0, t[2])
        p1 = VBase3(T[0], 0, t[2])
        p2 = VBase3(T[0], 0, T[2])
        p3 = VBase3(t[0], 0, T[2])
        self.colNode = self.text.attachNewNode(CollisionNode('cNode-' + name))
        self.colNode.node().addSolid(CollisionPolygon(p0, p1, p2, p3))
        self.colNode.node().setFromCollideMask(BitMask32.allOff())
        self.colNode.node().setIntoCollideMask(BitMask32.bit(collisionIndex))
        self.createHelpBox()
        self.updateState()

    def updateZoom(self, zoom):
        self.textScaleNode.setScale(1 - zoom / 1.5)

    def setAsCurrentIsland(self, isCurrent):
        Island.setAsCurrentIsland(self, isCurrent)
        self.updateState()

    def setAsReturnIsland(self, isReturn):
        Island.setAsReturnIsland(self, isReturn)
        self.updateState()

    def setAsPortOfCall(self, isPortOfCall):
        Island.setAsPortOfCall(self, isPortOfCall)
        self.updateState()

    def setHasTeleportToken(self, hasToken):
        Island.setHasTeleportToken(self, hasToken)
        self.updateState()

    def updateState(self, mouseOver=False):
        if not hasattr(self, 'button'):
            return None

        self.button.hide()
        self.teleportIconEnabled.hide()
        self.teleportIconDisabled.hide()
        if self.isCurrentIsland():
            self.manIcon.show()
            self.button.show()

        if self.isTeleportIsland():
            self.button.show()
            self.manIcon.hide()
            self.teleportIconDisabled.show()
            self.teleportIconDisabled.clearColorScale()
            self.button.setColorScale(0.5, 0.5, 0.5, 1)
            self.setHelpLabel(PLocalizer.MapNeedsTeleportToken)

        if self.getCanTeleportTo():
            self.button.show()
            self.button.clearColorScale()
            self.teleportIconDisabled.hide()
            self.teleportIconEnabled.show()
            self.text.setBold(1)
            if not self.isCurrentIsland() and self.isReturnIsland():
                self.setHelpLabel(PLocalizer.MapCanTeleportReturn)
            elif not self.isCurrentIsland() and self.isPortOfCall():
                self.setHelpLabel(PLocalizer.MapCanTeleportPortOfCall)
            else:
                self.setHelpLabel(PLocalizer.MapCanTeleport)
            if mouseOver:
                self.geom.setColorScale(0.5, 1, 0.5, 1)

        if self.isCurrentIsland() and not mouseOver:
            self.button.show()
            self.button.clearColorScale()
            self.button.setScale(1)
            self.text.setBold(1)
            self.teleportIconEnabled.hide()
            self.teleportIconDisabled.hide()
            self.manIcon.show()
            if not self.isTeleportIsland():
                self.setHelpLabel(PLocalizer.MapCurrentIsland)

        if self.isCurrentIsland() and mouseOver:
            self.button.show()
            self.button.clearColorScale()
            self.button.setScale(1)
            self.text.setBold(1)
            self.teleportIconEnabled.show()
            self.teleportIconDisabled.hide()
            self.manIcon.hide()

        if not self.isCurrentIsland() and not mouseOver:
            self.setHelpLabel('')
            self.text.setBold(0)
            self.manIcon.hide()

    def mouseOver(self, pos):
        self.updateState(mouseOver=True)
        self.showDetails(pos)

    def mouseLeft(self):
        self.geom.clearColorScale()
        self.hideDetails()
        self.updateState(mouseOver=False)

    def createHelpBox(self):
        if not self.helpBox:
            self.helpLabel = DirectLabel(
                parent=aspect2d,
                relief=None,
                text='',
                text_align=TextNode.ALeft,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_wordwrap=12,
                text_shadow=(0, 0, 0, 1),
                textMayChange=1,
                sortOrder=91)
            height = -(self.helpLabel.getHeight() + 0.01)
            width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
            self.helpBox = BorderFrame(parent=aspect2d,
                                       state=DGG.DISABLED,
                                       frameSize=(-0.040000000000000001, width,
                                                  height,
                                                  0.050000000000000003),
                                       pos=(0, 0, 0),
                                       sortOrder=90)
            self.helpLabel.reparentTo(self.helpBox)
            self.helpBox.hide()

    def setHelpLabel(self, text):
        self.helpLabel['text'] = text
        self.helpLabel.resetFrameSize()
        height = -(self.helpLabel.getHeight() + 0.01)
        width = max(0.25, self.helpLabel.getWidth() + 0.040000000000000001)
        self.helpBox['frameSize'] = (-0.040000000000000001, width, height,
                                     0.050000000000000003)
        self.helpBox.resetFrameSize()

    def showDetails(self, pos):
        if self.helpLabel['text'] != '':
            self.helpBox.setPos(pos -
                                Point3(self.helpBox['frameSize'][1] *
                                       1.25, 0, 0))
            self.helpBox.setBin('gui-popup', 0)
            self.helpBox.show()

    def hideDetails(self):
        if self.helpBox:
            self.helpBox.hide()
Exemplo n.º 13
0
class SkillButton(DirectFrame):
    notify = directNotify.newCategory('SkillButton')
    SkillIcons = None
    Image = None
    SkillRechargedSound = None
    SubLock = None
    
    def __init__(self, skillId, callback, quantity = 0, skillRank = 0, showQuantity = False, showHelp = False, showRing = False, hotkey = None, name = '', showIcon = True, showLock = False, rechargeSkillId = False, isWeaponSkill = False, assocAmmo = []):
        DirectFrame.__init__(self, parent = NodePath(), relief = None)
        self.initialiseoptions(SkillButton)
        gui = loader.loadModel('models/gui/toplevel_gui')
        if not SkillButton.SkillIcons:
            print 'not SkillButton.SkillIcons:'
            SkillButton.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            SkillButton.Image = (SkillButton.SkillIcons.find('**/base'), SkillButton.SkillIcons.find('**/base_down'), SkillButton.SkillIcons.find('**/base_over'))
            SkillButton.SkillRechargedSound = loadSfx(SoundGlobals.SFX_SKILL_RECHARGED)
            SkillButton.SubLock = gui.find('**/pir_t_gui_gen_key_subscriber')
            SkillButton.SpecialIcons = []
            for entry in SPECIAL_SKILL_ICONS:
                if not entry:
                    SkillButton.SpecialIcons.append(None)
                    continue
                specialImage = (SkillButton.SkillIcons.find('**/%s' % entry),)
                SkillButton.SpecialIcons.append(specialImage)
            
        
        model = loader.loadModel('models/effects/particleMaps')
        toggleIcon = model.find('**/particleGlow')
        toggleIcon.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd))
        self.toggleFrame = DirectFrame(relief = None, state = DGG.DISABLED, parent = self, image = toggleIcon, image_scale = 0.34999999999999998, image_pos = (0.0, 0.0, -0.01))
        self.toggleFrame.hide()
        self.glowRing = None
        self.glowRing2 = None
        self.assocAmmo = assocAmmo
        self.skillId = skillId
        self.quantity = quantity
        self.showQuantity = showQuantity
        self.skillRank = skillRank
        self.skillRing = None
        self.callback = callback
        self.showUpgrade = False
        self.showHelp = showHelp
        self.showRing = showRing
        self.showIcon = showIcon
        self.showLock = showLock
        self.isWeaponSkill = isWeaponSkill
        self.lock = None
        self.name = name
        self.helpFrame = None
        self.quantityLabel = None
        self.skillButton = None
        self.hotkeyLabel = None
        self.hotkey = hotkey
        self.greyOut = 0
        self.tonicId = 0
        self.skillRingIval = None
        self.impulseIval = None
        self.quickImpulseIval = None
        self.isBreakAttackSkill = WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.BREAK_ATTACK_SKILL_INDEX
        self.isDefenseSkill = WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.DEFENSE_SKILL_INDEX
        self.rechargeFilled = 0
        self.defenseAuraEffect = None
        if self.isWeaponSkill:
            self.weaponBackground = DirectLabel(parent = self, state = DGG.DISABLED, image = SkillButton.SkillIcons.find('**/box_base'), image_scale = (0.22, 0, 0.22), image_pos = (0.0, 0.0, 0.0))
            self.weaponBackground.flattenLight()
            self.weaponBackground.setColor(0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.20000000000000001)
            self.weaponBackground.setTransparency(1)
        
        if showRing:
            if self.isBreakAttackSkill:
                color = Vec4(1, 0, 0, 1)
            elif self.isDefenseSkill:
                color = Vec4(0, 1, 1, 1)
            else:
                color = Vec4(1, 0.80000000000000004, 0.5, 1)
            self.skillRing = SkillRing(color, Vec4(0, 0, 0, 1.0))
            gs = self.skillRing.meterFaceHalf2.node().getGeomState(0)
            self.skillRing.meterFaceHalf2.node().setGeomState(0, gs.removeAttrib(ColorAttrib.getClassType()))
            self.skillRing.reparentTo(self, 0)
            self.skillRing.setPos(0, 0, 0)
        
        self.updateSkillId(skillId)
        if showQuantity:
            self.updateQuantity(quantity)
        
        if hotkey:
            self.createHotkey(hotkey)
        
        if showLock:
            self.createLock()
        
        self.skillButton.bind(DGG.ENTER, self.showDetails)
        self.skillButton.bind(DGG.EXIT, self.hideDetails)
        if self.skillId >= InventoryType.begin_Consumables and self.skillId <= InventoryType.end_Consumables and not WeaponGlobals.getSkillEffectFlag(skillId):
            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, InventoryType.UseItem)
            self.tonicId = InventoryType.UseItem
        else:
            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
        if showRing:
            if not self.isBreakAttackSkill:
                self.createSkillRingIval()
            
            if self.tonicId:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
            else:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
            if self.isBreakAttackSkill and timeSpentRecharging < self.totalRechargeTime:
                self.updateRechargeRing()
            elif not (self.isBreakAttackSkill):
                if (self.totalRechargeTime or timeSpentRecharging) and not (timeSpentRecharging > self.totalRechargeTime):
                    self.skillRingIval.start(startT = timeSpentRecharging)
                
            not (timeSpentRecharging > self.totalRechargeTime)
            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.meterFaceHalf1.setColor(self.skillRing.meterActiveColor, 100)
            self.skillRing.meterFaceHalf2.setColor(self.skillRing.meterActiveColor, 100)
            self.skillRing.meterFaceHalf1.show()
            self.skillRing.meterFaceHalf2.show()
        
        if not self.isBreakAttackSkill:
            self.checkAmount()
        
        if self.isDefenseSkill:
            self.startRecharge()
        
        if self.isWeaponSkill:
            self.weaponLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.WeaponAbility, text_font = PiratesGlobals.getPirateBoldOutlineFont(), text_align = TextNode.ACenter, text_scale = PiratesGuiGlobals.TextScaleLarge, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, textMayChange = 0, pos = (0.0, 0, -0.12), sortOrder = 70, state = DGG.DISABLED)
            self.weaponLabel.flattenLight()
        

    
    def loadGlowRing(self):
        self.glowRing = loader.loadModel('models/effects/battleEffects').find('**/effectVoodooShockwave')
        self.glowRing.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OIncomingAlpha, ColorBlendAttrib.OOne))
        self.glowRing.reparentTo(self)
        self.glowRing.setBin('transparent', 0)
        self.glowRing.setScale(0.20000000000000001)
        self.glowRing.hide()
        self.glowRing2 = loader.loadModel('models/effects/particleMaps').find('**/particleGlow')
        self.glowRing2.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOneMinusIncomingAlpha, ColorBlendAttrib.OOne))
        self.glowRing2.reparentTo(self)
        self.glowRing2.setBin('transparent', 0)
        self.glowRing2.setScale(0.20000000000000001)
        self.glowRing2.setColor(0.80000000000000004, 1, 0.80000000000000004, 0.20000000000000001)
        self.glowRing2.reparentTo(self)
        self.glowRing2.hide()

    
    def checkAmount(self):
        if not (self.quantity) and self.showQuantity:
            if self.showRing and not self.skillRingIval.isPlaying():
                self.setGeomColor(0.5, 0.5, 0.5, 1.0)
                self.setRingColor(Vec4(0.5, 0.5, 0.5, 1.0))
            
        elif self.showRing and not self.skillRingIval.isPlaying():
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.setRingColor(self.skillRing.meterActiveColor)
        

    
    def toggleButton(self, state):
        if state == True:
            self.toggleFrame.show()
        elif state == False:
            self.toggleFrame.hide()
        

    
    def createSkillRingIval(self):
        if self.skillRingIval:
            self.skillRingIval.pause()
            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.setScale(1.0)
            self.skillRing.clearColorScale()
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.checkAmount()
            self.skillRingIval = None
        
        if self.tonicId:
            timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
        else:
            timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
        if self.isDefenseSkill:
            localAvatar.setDefenceEffect(self.skillId)
        
        if self.showRing:
            self.skillRingIval = Sequence(Func(localAvatar.setDefenceEffect, 0), Func(self.setGeomColor, 0.5, 0.5, 0.5, 1.0), Func(self.skillRing.meterFaceHalf1.setColor, self.skillRing.meterActiveColor, 100), Func(self.skillRing.meterFaceHalf2.setColor, self.skillRing.meterColor, 100), Func(self.skillRing.meterFaceHalf1.setR, 0), Func(self.skillRing.meterFaceHalf2.setR, 0), Func(self.skillRing.meterFaceHalf1.show), Func(self.skillRing.meterFaceHalf2.show), LerpFunc(self.skillRing.meterFaceHalf2.setR, self.totalRechargeTime / 2, 0, -180), Func(self.skillRing.meterFaceHalf2.setColor, self.skillRing.meterActiveColor, 100), Func(self.skillRing.meterFaceHalf2.setR, 0), LerpFunc(self.skillRing.meterFaceHalf1.setR, self.totalRechargeTime / 2, 0, -180), Func(self.setGeomColor, 1.0, 1.0, 1.0, 1.0), Func(base.playSfx, SkillButton.SkillRechargedSound, volume = 0.5), Parallel(LerpScaleInterval(self.skillRing, 0.10000000000000001, Vec3(1.2, 1.2, 1.2)), LerpColorScaleInterval(self.skillRing, 0.10000000000000001, Vec4(0.0, 0.75, 0.0, 1.0), Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(localAvatar.setDefenceEffect, self.skillId), LerpScaleInterval(self.skillRing, 0.20000000000000001, Vec3(0.90000000000000002, 0.90000000000000002, 0.90000000000000002)), LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)), Parallel(LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.0, 1.0, 1.0)), LerpColorScaleInterval(self.skillRing, 1, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.skillRing.clearColorScale), Func(self.checkAmount))
        

    
    def updateSkillRingIval(self):
        if self.showRing:
            playing = self.skillRingIval.isPlaying()
            if self.tonicId:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
            else:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
            if timeSpentRecharging:
                skillRechargeProgress = timeSpentRecharging / self.totalRechargeTime
            
            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
            if not self.totalRechargeTime:
                self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, InventoryType.UseItem)
            
            if timeSpentRecharging:
                timeSpentRecharging = skillRechargeProgress * self.totalRechargeTime
                localAvatar.skillDiary.modifyTimeSpentRecharging(self.skillId, timeSpentRecharging)
            
            self.createSkillRingIval()
            if playing and timeSpentRecharging:
                self.skillRingIval.start(startT = timeSpentRecharging)
            
        

    
    def quickGlowImpulse(self):
        if not self.glowRing2:
            self.loadGlowRing()
        
        self.quickImpulseIval = Sequence(Func(self.glowRing2.show), LerpScaleInterval(self.glowRing2, 0.20000000000000001, Vec3(0.33000000000000002, 0.33000000000000002, 0.33000000000000002)), LerpScaleInterval(self.glowRing2, 0.25, Vec3(0.20000000000000001, 0.20000000000000001, 0.20000000000000001)), Func(self.glowRing2.hide))
        self.quickImpulseIval.start()

    
    def startPowerImpulse(self):
        if not self.glowRing:
            self.loadGlowRing()
        
        self.glowRing.show()
        self.impulseIval = Sequence(Parallel(LerpScaleInterval(self.glowRing, 0.10000000000000001, Vec3(0.20300000000000001, 0.20300000000000001, 0.20300000000000001)), LerpColorScaleInterval(self.glowRing, 0.10000000000000001, Vec4(0.80000000000000004, 0.80000000000000004, 0.80000000000000004, 0.80000000000000004), Vec4(1.0, 1.0, 1.0, 0.80000000000000004), blendType = 'easeInOut')), LerpScaleInterval(self.glowRing, 0.14999999999999999, Vec3(0.19, 0.19, 0.19)), LerpScaleInterval(self.glowRing, 0.050000000000000003, Vec3(0.20200000000000001, 0.20200000000000001, 0.20200000000000001)), Parallel(LerpScaleInterval(self.glowRing, 0.029999999999999999, Vec3(0.20000000000000001, 0.20000000000000001, 0.20000000000000001)), LerpColorScaleInterval(self.glowRing, 0.40000000000000002, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.glowRing.clearColorScale))
        self.impulseIval.loop()

    
    def stopPowerImpulse(self):
        if self.glowRing:
            self.glowRing.hide()
        
        if self.impulseIval:
            self.impulseIval.finish()
            self.impulseIval = None
        

    
    def updateRechargeRing(self):
        timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
        self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
        if timeSpentRecharging >= self.totalRechargeTime and not (self.rechargeFilled):
            self.rechargeFilled = 1
            if self.skillRingIval:
                self.skillRingIval.pause()
                self.skillRingIval = None
            
            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.setScale(1.0)
            self.skillRing.clearColorScale()
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.skillRingIval = Sequence(Func(base.playSfx, SkillButton.SkillRechargedSound, volume = 0.5), Parallel(LerpScaleInterval(self.skillRing, 0.10000000000000001, Vec3(1.2, 1.2, 1.2)), LerpColorScaleInterval(self.skillRing, 0.10000000000000001, Vec4(0.0, 0.75, 0.0, 1.0), Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(localAvatar.setDefenceEffect, self.skillId), LerpScaleInterval(self.skillRing, 0.20000000000000001, Vec3(0.90000000000000002, 0.90000000000000002, 0.90000000000000002)), LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)), Parallel(LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.0, 1.0, 1.0)), LerpColorScaleInterval(self.skillRing, 1, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.skillRing.clearColorScale))
            self.skillRingIval.start()
        elif timeSpentRecharging < self.totalRechargeTime:
            self.rechargeFilled = 0
            self.setGeomColor(0.5, 0.5, 0.5, 1.0)
            self.skillRing.update(timeSpentRecharging, self.totalRechargeTime)
        

    
    def updateSkillId(self, skillId):
        self.skillId = skillId
        if self.skillButton:
            if self.quantityLabel:
                self.quantityLabel.detachNode()
            
            self.skillButton.destroy()
        
        if self.showQuantity and not (self.quantity):
            geomColor = Vec4(0.5, 0.5, 0.5, 1.0)
        else:
            geomColor = Vec4(1.0, 1.0, 1.0, 1.0)
        if self.showIcon:
            asset = WeaponGlobals.getSkillIcon(skillId)
            if hasattr(self, '_skillIconName'):
                asset = self._skillIconName
            
            geom = SkillButton.SkillIcons.find('**/%s' % asset)
            if geom.isEmpty():
                geom = SkillButton.SkillIcons.find('**/base')
            
            repId = WeaponGlobals.getSkillReputationCategoryId(self.skillId)
            geom_scale = getGeomScale(repId, skillId)
            image_color = (1, 1, 1, 1)
        else:
            geom = (None,)
            geom_scale = 0.12
            image_color = (0.5, 0.5, 0.5, 0.5)
        specialIconId = 0
        if self.isBreakAttackSkill:
            specialIconId = 1
        elif self.isDefenseSkill:
            specialIconId = 2
        elif skillId == ItemGlobals.getSpecialAttack(localAvatar.currentWeaponId):
            specialIconId = 3
        
        if specialIconId:
            something = SkillButton.SpecialIcons[specialIconId][0]
            if self.skillRing:
                self.skillRing.setupFace(something)
            
            self['image'] = None
        elif self.skillRing:
            self.skillRing.setupFace()
        
        if self.showRing:
            image = None
        else:
            image = SkillButton.Image
        self.skillButton = DirectButton(parent = self, relief = None, pos = (0, 0, 0), text = ('', '', self.name), text_align = TextNode.ACenter, text_shadow = Vec4(0, 0, 0, 1), text_scale = 0.040000000000000001, text_fg = Vec4(1, 1, 1, 1), text_pos = (0.0, 0.089999999999999997), image = image, image_scale = 0.14999999999999999, image_color = image_color, geom = geom, geom_scale = geom_scale, geom_color = geomColor, command = self.callback, sortOrder = 50, extraArgs = [
            skillId])
        self.skillButton.bind(DGG.ENTER, self.showDetails)
        self.skillButton.bind(DGG.EXIT, self.hideDetails)
        if self.quantityLabel and not self.quantityLabel.isEmpty():
            self.quantityLabel.reparentTo(self.skillButton)
        

    
    def createHotkey(self, hotkey):
        self.hotkeyLabel = DirectLabel(parent = self, relief = None, text = hotkey, text_font = PiratesGlobals.getPirateBoldOutlineFont(), text_align = TextNode.ARight, text_scale = PiratesGuiGlobals.TextScaleLarge, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, textMayChange = 0, pos = (0.070000000000000007, 0, -0.059999999999999998), sortOrder = 70, state = DGG.DISABLED)
        self.hotkeyLabel.flattenLight()

    
    def createLock(self):
        if self.lock:
            return None
        
        self.lock = DirectFrame(parent = self, relief = None, image = SkillButton.SubLock, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, -0.025000000000000001), sortOrder = 99)
        if self.showIcon:
            self.lock.setColorScale(0.90000000000000002, 0.90000000000000002, 0.90000000000000002, 1)
            self.skillButton.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1, 1)
        else:
            self.lock.setColorScale(0.59999999999999998, 0.59999999999999998, 0.59999999999999998, 1, 2)
            self.skillButton.clearColorScale()
        if self.showHelp:
            self.lock.hide()
        

    
    def createHelpFrame(self, args = None):
        if self.helpFrame:
            return None
        
        inv = localAvatar.getInventory()
        if not inv:
            return None
        
        baseRank = max(self.skillRank, 1)
        lvlDamageMod = WeaponGlobals.getLevelDamageModifier(localAvatar.getLevel())
        buff = WeaponGlobals.getSkillEffectFlag(self.skillId)
        dur = WeaponGlobals.getAttackDuration(self.skillId)
        effect = dur + dur * (baseRank - 1) / 4.0
        bonus = localAvatar.getSkillRankBonus(self.skillId)
        upgradeAmt = WeaponGlobals.getAttackUpgrade(self.skillId)
        rank = localAvatar.getSkillRank(self.skillId)
        skillBoost = 0
        if self.skillId in ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId):
            linkedSkillId = WeaponGlobals.getLinkedSkillId(self.skillId)
            skillBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, linkedSkillId)
            skillBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), linkedSkillId)
        else:
            skillBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, self.skillId)
            skillBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), self.skillId)
        shipBoost = 0
        if localAvatar.ship:
            shipBoost = localAvatar.ship.getSkillBoost(self.skillId)
        
        manaCost = 0
        if WeaponGlobals.getSkillTrack(self.skillId) != WeaponGlobals.PASSIVE_SKILL_INDEX:
            manaCost = WeaponGlobals.getMojoCost(self.skillId)
            if manaCost < 0:
                amt = localAvatar.getSkillRankBonus(InventoryType.StaffConservation)
                manaCost = min(manaCost - manaCost * amt, 1.0)
            
        
        damage = 0
        loDamage = 0
        mpDamage = 0
        mpLoDamage = 0
        if WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.TONIC_SKILL_INDEX:
            damage = WeaponGlobals.getAttackSelfHP(self.skillId)
        elif WeaponGlobals.getSkillTrack(self.skillId) != WeaponGlobals.PASSIVE_SKILL_INDEX:
            mod = (1.0 + bonus) * lvlDamageMod
            damage = int(WeaponGlobals.getAttackTargetHP(self.skillId) * mod)
            loDamage = damage / 2
            mpDamage = int(WeaponGlobals.getAttackTargetMojo(self.skillId) * mod)
            mpLoDamage = mpDamage / 2
        
        
        try:
            skillInfo = PLocalizer.SkillDescriptions.get(self.skillId)
            skillTitle = PLocalizer.makeHeadingString(PLocalizer.InventoryTypeNames.get(self.skillId), 2)
            skillType = PLocalizer.makeHeadingString(skillInfo[0], 1)
        except:
            self.notify.error('Error getting skill info for skillId %s' % self.skillId)

        description = skillInfo[1]
        if damage < 0:
            description += ' ' + PLocalizer.DealsDamage
        elif damage > 0:
            if loDamage:
                loDamage = 0
                description += ' ' + PLocalizer.HealsDamageRange
            else:
                description += ' ' + PLocalizer.HealsDamage
        
        if mpDamage < 0:
            description += ' ' + PLocalizer.DealsMpDamage
        
        effectId = WeaponGlobals.getSkillEffectFlag(self.skillId)
        if effectId:
            description += ' ' + SkillEffectDescriptions.get(effectId)[0]
        
        if bonus:
            if self.skillId == InventoryType.SailBroadsideLeft or self.skillId == InventoryType.SailBroadsideRight:
                description += ' ' + PLocalizer.BroadsideDesc
            
            if self.skillId == InventoryType.CannonShoot:
                description += ' ' + PLocalizer.CannonShootDesc
            
            if self.skillId == InventoryType.DollAttune:
                description += ' ' + PLocalizer.MultiAttuneDesc
            
        
        if WeaponGlobals.getSkillInterrupt(self.skillId):
            description += ' ' + PLocalizer.InterruptDesc
        
        if WeaponGlobals.getSkillUnattune(self.skillId):
            description += ' ' + PLocalizer.UnattuneDesc
        
        upgradeInfo = ''
        if self.showUpgrade and rank < 5:
            if rank > 0:
                upgradeInfo = skillInfo[2]
                if upgradeInfo == '':
                    if damage < 0:
                        upgradeInfo += PLocalizer.UpgradesDamage
                    elif damage > 0:
                        upgradeInfo += PLocalizer.UpgradesHealing
                    
                    if mpDamage < 0:
                        upgradeInfo += ' ' + PLocalizer.UpgradesMpDamage
                    
                    if effectId:
                        entry = SkillEffectDescriptions.get(effectId)
                        if len(entry) > 1:
                            if not damage:
                                upgradeInfo += PLocalizer.UpgradesDuration
                            else:
                                upgradeInfo += ' ' + PLocalizer.And
                            upgradeInfo += ' ' + entry[1]
                        
                    
                    upgradeInfo += '!'
                
            elif len(upgradeInfo) >= 4:
                upgradeInfo = skillInfo[3]
            else:
                upgradeInfo = PLocalizer.ClickToLearn
        elif not self.showIcon:
            unlockLevel = RepChart.getSkillUnlockLevel(self.skillId)
            if unlockLevel > 0:
                upgradeInfo = PLocalizer.UnlocksAtLevel % unlockLevel
            
        
        if self.skillId in SkillComboReq and SkillComboReq[self.skillId] and inv.getStackQuantity(self.skillId - 1) < 2:
            color = '\x1red\x1'
            if rank == 0:
                color = '\x1red\x1'
                upgradeInfo = ''
            
            description += '\n' + color + SkillComboReq[self.skillId] + '.'
        
        skillDesc = skillTitle + '\n' + skillType + '\n\n' + description + '\n\x1green\x1' + upgradeInfo + '\x2'
        stats = []
        if manaCost:
            stats.append(abs(manaCost))
        
        if damage and loDamage:
            stats.append(abs(loDamage))
            stats.append(abs(damage))
        elif damage:
            stats.append(abs(damage))
        
        if mpDamage:
            stats.append(abs(mpLoDamage))
            stats.append(abs(mpDamage))
        
        if buff == WeaponGlobals.C_CURSE:
            stats.append(WeaponGlobals.CURSED_DAM_AMP * 100)
        
        if buff == WeaponGlobals.C_WEAKEN:
            stats.append(WeaponGlobals.WEAKEN_PENALTY * 100)
        
        if effect > 0:
            stats.append(effect)
        
        if skillInfo[4]:
            if bonus == 0 and upgradeAmt > 0:
                if not self.skillId == InventoryType.SailBroadsideLeft and self.skillId == InventoryType.SailBroadsideRight:
                    pass
                if not (self.skillId == InventoryType.CannonShoot):
                    bonus = upgradeAmt
                
            if upgradeAmt < 1.0 and upgradeAmt > 0:
                bonus *= 100
            
            if self.skillId == InventoryType.SailTreasureSense:
                bonus /= 2.0
            elif self.skillId == InventoryType.CutlassParry:
                bonus += WeaponGlobals.getSubtypeParryBonus(localAvatar.currentWeaponId)
            
            if bonus:
                stats.append(abs(bonus))
            
        
        if self.skillId == InventoryType.DollAttune:
            stats.append(rank)
        
        if self.skillRank:
            rankText = DirectFrame(parent = self, relief = None, text = PLocalizer.makeHeadingString(PLocalizer.Rank + ' %s' % (self.skillRank + skillBoost + shipBoost), 2), text_align = TextNode.ARight, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 15, text_shadow = (0, 0, 0, 1), pos = (0.45000000000000001, 0, 0), textMayChange = 1, sortOrder = 92, state = DGG.DISABLED)
        
        stats = tuple(lambda [outmost-iterable]: for stat in [outmost-iterable]:
stat + 0.01(stats))
        
        try:
            pass
        except TypeError:
            self.notify.error('Error formatting skillDesc(%s): %s' % (self.skillId, stats))

        helpText = DirectFrame(parent = self, relief = None, text = skillDesc % stats, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 17, textMayChange = 1, state = DGG.DISABLED, sortOrder = 91)
        height = -(helpText.getHeight() + 0.01)
        if self.lock:
            height = height - 0.040000000000000001
        
        width = 0.55000000000000004
        self.helpFrame = BorderFrame(parent = self, state = DGG.DISABLED, frameSize = (-0.040000000000000001, width, height, 0.050000000000000003), pos = (0, 0, -0.12), sortOrder = 90)
        self.helpFrame.setBin('gui-popup', 0)
        helpText.reparentTo(self.helpFrame)
        if self.skillRank:
            rankText.reparentTo(self.helpFrame)
        
        if self.lock:
            self.lockedFrame = DirectFrame(parent = self.helpFrame, relief = None, pos = (0.087999999999999995, 0, height + 0.029999999999999999), image = SkillButton.SubLock, image_scale = 0.13, image_pos = (-0.055, 0, 0.012999999999999999), text = PLocalizer.VR_AuthAccess, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG13)
            self.notify.debug('locked!')
        
        pos = self.helpFrame.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.helpFrame.setPos(aspect2d, x, 0, z)

    
    def showDetails(self, event):
        if self.showHelp:
            self.createHelpFrame()
        
        if self.showRing:
            self.skillRing.rollover(True)
        

    
    def hideDetails(self, event):
        if self.helpFrame:
            self.helpFrame.destroy()
            self.helpFrame = None
        
        if self.showRing:
            self.skillRing.rollover(False)
        

    
    def updateQuantity(self, quantity):
        self.quantity = quantity
        if not self.showQuantity:
            return None
        
        if quantity == WeaponGlobals.INF_QUANT:
            text = ''
        elif self.assocAmmo:
            assocQuantity = 0
            inv = localAvatar.getInventory()
            if inv:
                for ammoId in self.assocAmmo:
                    assocQuantity += inv.getItemQuantity(self.getAmmoCat(), ammoId)
                
            
            if quantity != assocQuantity:
                text = '%s' % assocQuantity
            else:
                text = 'x%s' % quantity
        else:
            text = 'x%s' % quantity
        if self.quantityLabel and not self.quantityLabel.isEmpty():
            self.quantityLabel['text'] = text
        else:
            self.quantityLabel = DirectLabel(parent = NodePath(), relief = None, state = DGG.DISABLED, text = text, frameColor = (0, 0, 0, 1), frameSize = (-0.01, 0.02, -0.01, 0.025000000000000001), text_scale = PiratesGuiGlobals.TextScaleLarge, text_align = TextNode.ACenter, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.029999999999999999, 0.0, 0.029999999999999999), text_font = PiratesGlobals.getPirateBoldOutlineFont(), sortOrder = 60)
            self.quantityLabel.flattenLight()
            self.quantityLabel.reparentTo(self)
            if self.skillButton and not self.skillButton.isEmpty():
                self.quantityLabel.reparentTo(self.skillButton)
            

    
    def getAmmoCat(self):
        pass

    
    def startRecharge(self):
        if not self.showRing:
            return None
        
        if self.isBreakAttackSkill:
            self.setGeomColor(0.5, 0.5, 0.5, 1.0)
            self.updateRechargeRing()
            return None
        
        if self.skillRingIval.isPlaying():
            self.createSkillRingIval()
        
        self.skillRingIval.start()

    
    def stopRecharge(self):
        if self.showRing:
            if self.isBreakAttackSkill:
                self.setGeomColor(0.5, 0.5, 0.5, 1.0)
                self.updateRechargeRing()
                return None
            
            if self.skillRingIval.isPlaying():
                self.skillRingIval.pause()
            
        

    
    def setGeomColor(self, r, g, b, a):
        self.skillButton['geom_color'] = Vec4(r, g, b, a)

    
    def setRingColor(self, color):
        self.skillRing.meterFaceHalf1.setColor(color[0], color[1], color[2], color[3], 100)
        self.skillRing.meterFaceHalf2.setColor(color[0], color[1], color[2], color[3], 100)

    
    def setShowUpgrade(self, show):
        if self.showUpgrade != show:
            self.showUpgrade = show
            if self.helpFrame:
                self.helpFrame.destroy()
                self.helpFrame = None
                self.showDetails(None)
            
        

    
    def setShowIcon(self, show):
        if self.showIcon != show:
            self.showIcon = show
            self.updateSkillId(self.skillId)
            if self.helpFrame:
                self.helpFrame.destroy()
                self.helpFrame = None
            
        

    
    def setShowLock(self, show):
        if self.showLock != show:
            self.showLock = show
            if show:
                self.createLock()
            elif self.lock:
                self.lock.destroy()
                self.lock = None
                self.skillButton.clearColorScale()
            
        

    
    def destroy(self):
        self.callback = None
        if self.skillRingIval:
            self.skillRingIval.pause()
            self.skillRingIval = None
        
        if self.quantityLabel:
            self.quantityLabel.destroy()
            self.quantityLabel = None
        
        if self.impulseIval:
            self.impulseIval.pause()
            self.impulseIval = None
        
        if self.quickImpulseIval:
            self.quickImpulseIval.pause()
            self.quickImpulseIval = None
        
        self.ignoreAll()
        DirectFrame.destroy(self)
class AmmoPanelButton(DirectButton):
    SkillIcons = None

    def __init__(self, callback, skillId, skillRank):
        if not AmmoPanelButton.SkillIcons:
            AmmoPanelButton.SkillIcons = loader.loadModel(
                'models/textureCards/skillIcons')
            AmmoPanelButton.Image = (
                AmmoPanelButton.SkillIcons.find('**/base'),
                AmmoPanelButton.SkillIcons.find('**/base_down'),
                AmmoPanelButton.SkillIcons.find('**/base_over'))
        self.locked = True
        self.purchaseable = True
        self.cost = CannonDefenseGlobals.getDefenseCannonAmmoCost(skillId)
        self.amount = CannonDefenseGlobals.getDefenseCannonAmmoAmount(skillId)
        if self.amount == -1:
            self.amount = PLocalizer.Unlimited
        self.skillId = skillId
        self.skillRank = skillRank
        self.infoBox = None
        self.flashIval = None
        asset = RadialMenu.getSkillIconName(skillId, 0)
        geom = AmmoPanelButton.SkillIcons.find('**/%s' % asset)
        self.geom = geom
        if self.locked:
            asset = None
            geom = None
        DirectButton.__init__(self,
                              relief=None,
                              pos=(0, 0, 0),
                              text='?',
                              text_scale=0.1,
                              text_fg=PiratesGuiGlobals.TextFG2,
                              text_shadow=PiratesGuiGlobals.TextShadow,
                              text_pos=(0.005, -0.035),
                              text_align=TextNode.ACenter,
                              image=AmmoPanelButton.Image,
                              image_scale=0.12,
                              geom=geom,
                              geom_scale=0.12,
                              command=callback,
                              textMayChange=1,
                              sortOrder=70,
                              extraArgs=[skillId])
        self.initialiseoptions(AmmoPanelButton)
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.lockIcon = gui.find('**/pir_t_gui_gen_key_subscriber')
        if not Freebooter.getPaidStatus(
                base.localAvatar.doId
        ) and skillId > CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
            self.lock = DirectFrame(parent=self,
                                    relief=None,
                                    image=self.lockIcon,
                                    image_scale=0.14,
                                    image_pos=(0.05, 0, -0.025),
                                    sortOrder=99)
        self.bind(DGG.ENTER, self.showDetails)
        self.bind(DGG.EXIT, self.hideDetails)
        return

    def createTextBox(self):
        if self.infoBox:
            return
        globalPos = self.getPos(base.a2dLeftCenter)
        self.infoBox = None
        self.infoBox = BorderFrame(parent=base.a2dLeftCenter,
                                   frameSize=(-0.04, 0.5, -0.25, 0.05),
                                   pos=(globalPos.getX() + 0.12, 0,
                                        globalPos.getZ()),
                                   state=DGG.DISABLED)
        self.label = DirectLabel(
            parent=self.infoBox,
            relief=None,
            text=PLocalizer.CannonDefenseAmmoDesc %
            (PLocalizer.makeHeadingString(
                PLocalizer.InventoryTypeNames[self.skillId], 2), self.cost,
             self.amount, PLocalizer.CannonDefenseAmmoTypeDesc[self.skillId]),
            text_align=TextNode.ALeft,
            text_scale=PiratesGuiGlobals.TextScaleLarge,
            text_fg=PiratesGuiGlobals.TextFG2,
            text_wordwrap=12,
            textMayChange=1)
        if self.locked:
            memberText = ''
            if self.skillId > CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
                memberText = PLocalizer.VR_AuthAccess
            self.label['text'] = PLocalizer.CannonDefenseAmmoUnlockedAt % (
                CannonDefenseGlobals.getLevelUnlockedAt(
                    self.skillId), memberText)
        self.infoBox.setBin('gui-cannonDefense', 4)
        return

    def showDetails(self, event):
        self.createTextBox()

    def hideDetails(self, event):
        if self.infoBox:
            self.infoBox.destroy()
            self.infoBox = None
        return

    def isLocked(self):
        return self.locked

    def unlock(self):
        if self.locked:
            self['text'] = ''
            self['geom'] = self.geom
            self['geom_scale'] = 0.12
            self.locked = False

    def canPurchase(self, bankNotes):
        if not self.purchaseable:
            return False
        return bankNotes >= self.cost

    def enablePurchase(self):
        self.purchaseable = True
        self.setAlphaScale(1.0)

    def disablePurchase(self):
        self.purchaseable = False
        self.setAlphaScale(0.4)

    def flash(self):
        if self.flashIval:
            self.flashIval.pause()
        self.flashIval = Sequence(
            LerpColorInterval(self,
                              0.25,
                              color=VBase4(0.7, 0.1, 0.1, 1.0),
                              blendType='easeOut'),
            LerpColorInterval(self,
                              0.25,
                              color=VBase4(1.0, 1.0, 1.0, 1.0),
                              blendType='easeOut'))
        self.flashIval.start()
Exemplo n.º 15
0
class RepairGameButton(GuiButton):
    def __init__(self, parent, **kw):
        optiondefs = (('nodePath', None, None), ('image_scale', (1.0, 1.0,
                                                                 1.0), None))
        self.defineoptions(kw, optiondefs)
        GuiButton.__init__(self, parent)
        self.initialiseoptions(RepairGameButton)
        self.disabledStateNode = self.stateNodePath[3].getChild(0)
        self.downStateNode = self.stateNodePath[1].getChild(0)
        self.overStateNode = self.stateNodePath[2].getChild(0)
        self.inProgress = False
        self._initGUI()
        return

    def _initGUI(self):
        self.setBin('fixed', 33)
        mainGui = loader.loadModel('models/gui/gui_main')
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.checkMark = gui.find('**/generic_check')
        self.checkMark.reparentTo(self)
        self.checkMark.stash()
        self.checkMark.setScale(1.0)
        self.checkMark.setColorScale(0.0, 1.0, 0.0, 1.0)
        self.checkMark.setPos(0.02, 0.0, 0.02)
        self.checkMark.setBin('fixed', 34)
        self.skillRing = DialMeter(self,
                                   wantCover=False,
                                   dangerRatio=0.0,
                                   meterColor=Vec4(0.9, 0.9, 0.1, 1.0),
                                   baseColor=Vec4(0.15, 0.07, 0.03, 1.0),
                                   completeColor=Vec4(0.1, 0.9, 0.1, 1.0))
        self.skillRing.reparentTo(self)
        self.skillRing.setScale(0.285, 0.3, 0.265)
        self.skillRing.setBin('fixed', 32)
        self.skillGlow = self.glow = OnscreenImage(
            parent=self,
            image=mainGui.find('**/icon_glow'),
            scale=(1.0, 1.0, 1.0),
            color=(1.0, 1.0, 0.6, 1.0))
        self.skillGlow.reparentTo(self)
        self.skillGlow.setBin('fixed', 31)
        self.skillGlow.stash()
        self.pirateNameBox = None
        self.pirateNameLabel = None
        return

    def showGlow(self):
        self.inProgress = False
        if self.pirateNameLabel == None and self.checkMark.isStashed():
            self.skillGlow.unstash()
        return

    def hideGlow(self):
        self.inProgress = True
        self.skillGlow.stash()

    def setProgress(self, percent):
        self.skillGlow.stash()
        ratio = max(0.0, percent / 100.0)
        if ratio >= 1.0:
            if self.checkMark.isStashed():
                self.checkMark.unstash()
        else:
            if not self.checkMark.isStashed():
                self.checkMark.stash()

        if self.pirateNameLabel == None and not self.inProgress:
            self.skillGlow.unstash()

        self.skillRing.update(ratio, 1.0)
        self.skillRing.wrtReparentTo(self.getParent())
        self.reparentTo(self.getParent())

    def updatePirateNameBox(self, pirateName):
        if self.pirateNameLabel != None and self.pirateNameLabel[
                'text'] != pirateName:
            if self.pirateNameBox:
                self.pirateNameBox.destroy()
            if self.pirateNameLabel:
                self.pirateNameLabel.destroy()
            self.pirateNameBox = None
            self.pirateNameLabel = None
        if pirateName != '' and not (self.pirateNameBox
                                     and self.pirateNameLabel['text']
                                     == pirateName):
            self.createPirateNameBox(pirateName)
        return

    def createPirateNameBox(self, pirateName):
        self.pirateNameLabel = DirectLabel(
            relief=None,
            state=DGG.DISABLED,
            text=pirateName,
            text_align=TextNode.ACenter,
            text_scale=PiratesGuiGlobals.TextScaleMed,
            text_fg=PiratesGuiGlobals.TextFG1,
            text_wordwrap=12,
            textMayChange=0,
            sortOrder=91)
        self.pirateNameLabel.setBin('fixed', 33)
        height = self.pirateNameLabel.getHeight()
        width = self.pirateNameLabel.getWidth() + 0.05
        pos = [0.0, 0.0, height / 2 - 0.035]
        fs = [
            -(width / 2 + 0.01), width / 2 + 0.01, -(height / 2 + 0.015),
            height / 2 + 0.015
        ]
        self.pirateNameBox = BorderFrame(parent=self,
                                         state=DGG.DISABLED,
                                         frameSize=(fs[0], fs[1], fs[2],
                                                    fs[3]),
                                         modelName='general_frame_f',
                                         pos=(0.0, 0.0, 0.0))
        self.pirateNameLabel.reparentTo(self.pirateNameBox)
        self.pirateNameLabel.setPos(pos[0], pos[1], pos[2])
        self.pirateNameBox.setClipPlaneOff()
        pos = self.pirateNameBox.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.pirateNameBox.setPos(aspect2d, x, 0, z - 0.175)
        self.pirateNameBox.flattenLight()
        self.pirateNameBox.setBin('fixed', 32)
        self.pirateNameBox.reparentTo(self)
        return
class SkillButton(DirectFrame):
    notify = directNotify.newCategory('SkillButton')
    SkillIcons = None
    Image = None
    SkillRechargedSound = None
    SubLock = None

    def __init__(self, skillId, callback, quantity = 0, skillRank = 0, showQuantity = False, showHelp = False, showRing = False, hotkey = None, name = '', showIcon = True, showLock = False, rechargeSkillId = False, isWeaponSkill = False, assocAmmo = []):
        DirectFrame.__init__(self, parent = NodePath(), relief = None)
        self.initialiseoptions(SkillButton)
        gui = loader.loadModel('models/gui/toplevel_gui')
        if not SkillButton.SkillIcons:
            print 'not SkillButton.SkillIcons:'
            SkillButton.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            SkillButton.Image = (SkillButton.SkillIcons.find('**/base'), SkillButton.SkillIcons.find('**/base_down'), SkillButton.SkillIcons.find('**/base_over'))
            SkillButton.SkillRechargedSound = loadSfx(SoundGlobals.SFX_SKILL_RECHARGED)
            SkillButton.SubLock = gui.find('**/pir_t_gui_gen_key_subscriber')
            SkillButton.SpecialIcons = []
            for entry in SPECIAL_SKILL_ICONS:
                if not entry:
                    SkillButton.SpecialIcons.append(None)
                    continue
                specialImage = (SkillButton.SkillIcons.find('**/%s' % entry),)
                SkillButton.SpecialIcons.append(specialImage)


        model = loader.loadModel('models/effects/particleMaps')
        toggleIcon = model.find('**/particleGlow')
        toggleIcon.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd))
        self.toggleFrame = DirectFrame(relief = None, state = DGG.DISABLED, parent = self, image = toggleIcon, image_scale = 0.34999999999999998, image_pos = (0.0, 0.0, -0.01))
        self.toggleFrame.hide()
        self.glowRing = None
        self.glowRing2 = None
        self.assocAmmo = assocAmmo
        self.skillId = skillId
        self.quantity = quantity
        self.showQuantity = showQuantity
        self.skillRank = skillRank
        self.skillRing = None
        self.callback = callback
        self.showUpgrade = False
        self.showHelp = showHelp
        self.showRing = showRing
        self.showIcon = showIcon
        self.showLock = showLock
        self.isWeaponSkill = isWeaponSkill
        self.lock = None
        self.name = name
        self.helpFrame = None
        self.quantityLabel = None
        self.skillButton = None
        self.hotkeyLabel = None
        self.hotkey = hotkey
        self.greyOut = 0
        self.tonicId = 0
        self.skillRingIval = None
        self.impulseIval = None
        self.quickImpulseIval = None
        self.isBreakAttackSkill = WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.BREAK_ATTACK_SKILL_INDEX
        self.isDefenseSkill = WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.DEFENSE_SKILL_INDEX
        self.rechargeFilled = 0
        self.defenseAuraEffect = None
        if self.isWeaponSkill:
            self.weaponBackground = DirectLabel(parent = self, state = DGG.DISABLED, image = SkillButton.SkillIcons.find('**/box_base'), image_scale = (0.22, 0, 0.22), image_pos = (0.0, 0.0, 0.0))
            self.weaponBackground.flattenLight()
            self.weaponBackground.setColor(0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.20000000000000001)
            self.weaponBackground.setTransparency(1)

        if showRing:
            if self.isBreakAttackSkill:
                color = Vec4(1, 0, 0, 1)
            elif self.isDefenseSkill:
                color = Vec4(0, 1, 1, 1)
            else:
                color = Vec4(1, 0.80000000000000004, 0.5, 1)
            self.skillRing = SkillRing(color, Vec4(0, 0, 0, 1.0))
            gs = self.skillRing.meterFaceHalf2.node().getGeomState(0)
            self.skillRing.meterFaceHalf2.node().setGeomState(0, gs.removeAttrib(ColorAttrib.getClassType()))
            self.skillRing.reparentTo(self, 0)
            self.skillRing.setPos(0, 0, 0)

        self.updateSkillId(skillId)
        if showQuantity:
            self.updateQuantity(quantity)

        if hotkey:
            self.createHotkey(hotkey)

        if showLock:
            self.createLock()

        self.skillButton.bind(DGG.ENTER, self.showDetails)
        self.skillButton.bind(DGG.EXIT, self.hideDetails)
        if self.skillId >= InventoryType.begin_Consumables and self.skillId <= InventoryType.end_Consumables and not WeaponGlobals.getSkillEffectFlag(skillId):
            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, InventoryType.UseItem)
            self.tonicId = InventoryType.UseItem
        else:
            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
        if showRing:
            if not self.isBreakAttackSkill:
                self.createSkillRingIval()

            if self.tonicId:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
            else:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
            if self.isBreakAttackSkill and timeSpentRecharging < self.totalRechargeTime:
                self.updateRechargeRing()
            elif not (self.isBreakAttackSkill):
                if (self.totalRechargeTime or timeSpentRecharging) and not (timeSpentRecharging > self.totalRechargeTime):
                    self.skillRingIval.start(startT = timeSpentRecharging)

            not (timeSpentRecharging > self.totalRechargeTime)
            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.meterFaceHalf1.setColor(self.skillRing.meterActiveColor, 100)
            self.skillRing.meterFaceHalf2.setColor(self.skillRing.meterActiveColor, 100)
            self.skillRing.meterFaceHalf1.show()
            self.skillRing.meterFaceHalf2.show()

        if not self.isBreakAttackSkill:
            self.checkAmount()

        if self.isDefenseSkill:
            self.startRecharge()

        if self.isWeaponSkill:
            self.weaponLabel = DirectLabel(parent = self, relief = None, text = PLocalizer.WeaponAbility, text_font = PiratesGlobals.getPirateBoldOutlineFont(), text_align = TextNode.ACenter, text_scale = PiratesGuiGlobals.TextScaleLarge, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, textMayChange = 0, pos = (0.0, 0, -0.12), sortOrder = 70, state = DGG.DISABLED)
            self.weaponLabel.flattenLight()



    def loadGlowRing(self):
        self.glowRing = loader.loadModel('models/effects/battleEffects').find('**/effectVoodooShockwave')
        self.glowRing.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OIncomingAlpha, ColorBlendAttrib.OOne))
        self.glowRing.reparentTo(self)
        self.glowRing.setBin('transparent', 0)
        self.glowRing.setScale(0.20000000000000001)
        self.glowRing.hide()
        self.glowRing2 = loader.loadModel('models/effects/particleMaps').find('**/particleGlow')
        self.glowRing2.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOneMinusIncomingAlpha, ColorBlendAttrib.OOne))
        self.glowRing2.reparentTo(self)
        self.glowRing2.setBin('transparent', 0)
        self.glowRing2.setScale(0.20000000000000001)
        self.glowRing2.setColor(0.80000000000000004, 1, 0.80000000000000004, 0.20000000000000001)
        self.glowRing2.reparentTo(self)
        self.glowRing2.hide()


    def checkAmount(self):
        if not (self.quantity) and self.showQuantity:
            if self.showRing and not self.skillRingIval.isPlaying():
                self.setGeomColor(0.5, 0.5, 0.5, 1.0)
                self.setRingColor(Vec4(0.5, 0.5, 0.5, 1.0))

        elif self.showRing and not self.skillRingIval.isPlaying():
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.setRingColor(self.skillRing.meterActiveColor)



    def toggleButton(self, state):
        if state == True:
            self.toggleFrame.show()
        elif state == False:
            self.toggleFrame.hide()



    def createSkillRingIval(self):
        if self.skillRingIval:
            self.skillRingIval.pause()
            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.setScale(1.0)
            self.skillRing.clearColorScale()
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.checkAmount()
            self.skillRingIval = None

        if self.tonicId:
            timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
        else:
            timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
        if self.isDefenseSkill:
            localAvatar.setDefenceEffect(self.skillId)

        if self.showRing:
            self.skillRingIval = Sequence(Func(localAvatar.setDefenceEffect, 0), Func(self.setGeomColor, 0.5, 0.5, 0.5, 1.0), Func(self.skillRing.meterFaceHalf1.setColor, self.skillRing.meterActiveColor, 100), Func(self.skillRing.meterFaceHalf2.setColor, self.skillRing.meterColor, 100), Func(self.skillRing.meterFaceHalf1.setR, 0), Func(self.skillRing.meterFaceHalf2.setR, 0), Func(self.skillRing.meterFaceHalf1.show), Func(self.skillRing.meterFaceHalf2.show), LerpFunc(self.skillRing.meterFaceHalf2.setR, self.totalRechargeTime / 2, 0, -180), Func(self.skillRing.meterFaceHalf2.setColor, self.skillRing.meterActiveColor, 100), Func(self.skillRing.meterFaceHalf2.setR, 0), LerpFunc(self.skillRing.meterFaceHalf1.setR, self.totalRechargeTime / 2, 0, -180), Func(self.setGeomColor, 1.0, 1.0, 1.0, 1.0), Func(base.playSfx, SkillButton.SkillRechargedSound, volume = 0.5), Parallel(LerpScaleInterval(self.skillRing, 0.10000000000000001, Vec3(1.2, 1.2, 1.2)), LerpColorScaleInterval(self.skillRing, 0.10000000000000001, Vec4(0.0, 0.75, 0.0, 1.0), Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(localAvatar.setDefenceEffect, self.skillId), LerpScaleInterval(self.skillRing, 0.20000000000000001, Vec3(0.90000000000000002, 0.90000000000000002, 0.90000000000000002)), LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)), Parallel(LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.0, 1.0, 1.0)), LerpColorScaleInterval(self.skillRing, 1, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.skillRing.clearColorScale), Func(self.checkAmount))



    def updateSkillRingIval(self):
        if self.showRing:
            playing = self.skillRingIval.isPlaying()
            if self.tonicId:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(InventoryType.UseItem)
            else:
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
            if timeSpentRecharging:
                skillRechargeProgress = timeSpentRecharging / self.totalRechargeTime

            self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
            if not self.totalRechargeTime:
                self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, InventoryType.UseItem)

            if timeSpentRecharging:
                timeSpentRecharging = skillRechargeProgress * self.totalRechargeTime
                localAvatar.skillDiary.modifyTimeSpentRecharging(self.skillId, timeSpentRecharging)

            self.createSkillRingIval()
            if playing and timeSpentRecharging:
                self.skillRingIval.start(startT = timeSpentRecharging)




    def quickGlowImpulse(self):
        if not self.glowRing2:
            self.loadGlowRing()

        self.quickImpulseIval = Sequence(Func(self.glowRing2.show), LerpScaleInterval(self.glowRing2, 0.20000000000000001, Vec3(0.33000000000000002, 0.33000000000000002, 0.33000000000000002)), LerpScaleInterval(self.glowRing2, 0.25, Vec3(0.20000000000000001, 0.20000000000000001, 0.20000000000000001)), Func(self.glowRing2.hide))
        self.quickImpulseIval.start()


    def startPowerImpulse(self):
        if not self.glowRing:
            self.loadGlowRing()

        self.glowRing.show()
        self.impulseIval = Sequence(Parallel(LerpScaleInterval(self.glowRing, 0.10000000000000001, Vec3(0.20300000000000001, 0.20300000000000001, 0.20300000000000001)), LerpColorScaleInterval(self.glowRing, 0.10000000000000001, Vec4(0.80000000000000004, 0.80000000000000004, 0.80000000000000004, 0.80000000000000004), Vec4(1.0, 1.0, 1.0, 0.80000000000000004), blendType = 'easeInOut')), LerpScaleInterval(self.glowRing, 0.14999999999999999, Vec3(0.19, 0.19, 0.19)), LerpScaleInterval(self.glowRing, 0.050000000000000003, Vec3(0.20200000000000001, 0.20200000000000001, 0.20200000000000001)), Parallel(LerpScaleInterval(self.glowRing, 0.029999999999999999, Vec3(0.20000000000000001, 0.20000000000000001, 0.20000000000000001)), LerpColorScaleInterval(self.glowRing, 0.40000000000000002, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.glowRing.clearColorScale))
        self.impulseIval.loop()


    def stopPowerImpulse(self):
        if self.glowRing:
            self.glowRing.hide()

        if self.impulseIval:
            self.impulseIval.finish()
            self.impulseIval = None



    def updateRechargeRing(self):
        timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(self.skillId)
        self.totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, self.skillId)
        if timeSpentRecharging >= self.totalRechargeTime and not (self.rechargeFilled):
            self.rechargeFilled = 1
            if self.skillRingIval:
                self.skillRingIval.pause()
                self.skillRingIval = None

            self.skillRing.meterFaceHalf1.setR(0)
            self.skillRing.meterFaceHalf2.setR(180)
            self.skillRing.setScale(1.0)
            self.skillRing.clearColorScale()
            self.setGeomColor(1.0, 1.0, 1.0, 1.0)
            self.skillRingIval = Sequence(Func(base.playSfx, SkillButton.SkillRechargedSound, volume = 0.5), Parallel(LerpScaleInterval(self.skillRing, 0.10000000000000001, Vec3(1.2, 1.2, 1.2)), LerpColorScaleInterval(self.skillRing, 0.10000000000000001, Vec4(0.0, 0.75, 0.0, 1.0), Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(localAvatar.setDefenceEffect, self.skillId), LerpScaleInterval(self.skillRing, 0.20000000000000001, Vec3(0.90000000000000002, 0.90000000000000002, 0.90000000000000002)), LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)), Parallel(LerpScaleInterval(self.skillRing, 0.029999999999999999, Vec3(1.0, 1.0, 1.0)), LerpColorScaleInterval(self.skillRing, 1, Vec4(1.0, 1.0, 1.0, 1.0), blendType = 'easeInOut')), Func(self.skillRing.clearColorScale))
            self.skillRingIval.start()
        elif timeSpentRecharging < self.totalRechargeTime:
            self.rechargeFilled = 0
            self.setGeomColor(0.5, 0.5, 0.5, 1.0)
            self.skillRing.update(timeSpentRecharging, self.totalRechargeTime)



    def updateSkillId(self, skillId):
        self.skillId = skillId
        if self.skillButton:
            if self.quantityLabel:
                self.quantityLabel.detachNode()

            self.skillButton.destroy()

        if self.showQuantity and not (self.quantity):
            geomColor = Vec4(0.5, 0.5, 0.5, 1.0)
        else:
            geomColor = Vec4(1.0, 1.0, 1.0, 1.0)
        if self.showIcon:
            asset = WeaponGlobals.getSkillIcon(skillId)
            if hasattr(self, '_skillIconName'):
                asset = self._skillIconName

            geom = SkillButton.SkillIcons.find('**/%s' % asset)
            if geom.isEmpty():
                geom = SkillButton.SkillIcons.find('**/base')

            repId = WeaponGlobals.getSkillReputationCategoryId(self.skillId)
            geom_scale = getGeomScale(repId, skillId)
            image_color = (1, 1, 1, 1)
        else:
            geom = (None,)
            geom_scale = 0.12
            image_color = (0.5, 0.5, 0.5, 0.5)
        specialIconId = 0
        if self.isBreakAttackSkill:
            specialIconId = 1
        elif self.isDefenseSkill:
            specialIconId = 2
        elif skillId == ItemGlobals.getSpecialAttack(localAvatar.currentWeaponId):
            specialIconId = 3

        if specialIconId:
            something = SkillButton.SpecialIcons[specialIconId][0]
            if self.skillRing:
                self.skillRing.setupFace(something)

            self['image'] = None
        elif self.skillRing:
            self.skillRing.setupFace()

        if self.showRing:
            image = None
        else:
            image = SkillButton.Image
        self.skillButton = DirectButton(parent = self, relief = None, pos = (0, 0, 0), text = ('', '', self.name), text_align = TextNode.ACenter, text_shadow = Vec4(0, 0, 0, 1), text_scale = 0.040000000000000001, text_fg = Vec4(1, 1, 1, 1), text_pos = (0.0, 0.089999999999999997), image = image, image_scale = 0.14999999999999999, image_color = image_color, geom = geom, geom_scale = geom_scale, geom_color = geomColor, command = self.callback, sortOrder = 50, extraArgs = [
            skillId])
        self.skillButton.bind(DGG.ENTER, self.showDetails)
        self.skillButton.bind(DGG.EXIT, self.hideDetails)
        if self.quantityLabel and not self.quantityLabel.isEmpty():
            self.quantityLabel.reparentTo(self.skillButton)



    def createHotkey(self, hotkey):
        self.hotkeyLabel = DirectLabel(parent = self, relief = None, text = hotkey, text_font = PiratesGlobals.getPirateBoldOutlineFont(), text_align = TextNode.ARight, text_scale = PiratesGuiGlobals.TextScaleLarge, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, textMayChange = 0, pos = (0.070000000000000007, 0, -0.059999999999999998), sortOrder = 70, state = DGG.DISABLED)
        self.hotkeyLabel.flattenLight()


    def createLock(self):
        if self.lock:
            return None

        self.lock = DirectFrame(parent = self, relief = None, image = SkillButton.SubLock, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, -0.025000000000000001), sortOrder = 99)
        if self.showIcon:
            self.lock.setColorScale(0.90000000000000002, 0.90000000000000002, 0.90000000000000002, 1)
            self.skillButton.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1, 1)
        else:
            self.lock.setColorScale(0.59999999999999998, 0.59999999999999998, 0.59999999999999998, 1, 2)
            self.skillButton.clearColorScale()
        if self.showHelp:
            self.lock.hide()



    def createHelpFrame(self, args = None):
        if self.helpFrame:
            return None

        inv = localAvatar.getInventory()
        if not inv:
            return None

        baseRank = max(self.skillRank, 1)
        lvlDamageMod = WeaponGlobals.getLevelDamageModifier(localAvatar.getLevel())
        buff = WeaponGlobals.getSkillEffectFlag(self.skillId)
        dur = WeaponGlobals.getAttackDuration(self.skillId)
        effect = dur + dur * (baseRank - 1) / 4.0
        bonus = localAvatar.getSkillRankBonus(self.skillId)
        upgradeAmt = WeaponGlobals.getAttackUpgrade(self.skillId)
        rank = localAvatar.getSkillRank(self.skillId)
        skillBoost = 0
        if self.skillId in ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId):
            linkedSkillId = WeaponGlobals.getLinkedSkillId(self.skillId)
            skillBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, linkedSkillId)
            skillBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), linkedSkillId)
        else:
            skillBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, self.skillId)
            skillBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), self.skillId)
        manaCost = 0
        if WeaponGlobals.getSkillTrack(self.skillId) != WeaponGlobals.PASSIVE_SKILL_INDEX:
            manaCost = WeaponGlobals.getMojoCost(self.skillId)
            if manaCost < 0:
                amt = localAvatar.getSkillRankBonus(InventoryType.StaffConservation)
                manaCost = min(manaCost - manaCost * amt, 1.0)


        damage = 0
        loDamage = 0
        mpDamage = 0
        mpLoDamage = 0
        if WeaponGlobals.getSkillTrack(self.skillId) == WeaponGlobals.TONIC_SKILL_INDEX:
            damage = WeaponGlobals.getAttackSelfHP(self.skillId)
        elif WeaponGlobals.getSkillTrack(self.skillId) != WeaponGlobals.PASSIVE_SKILL_INDEX:
            mod = (1.0 + bonus) * lvlDamageMod
            damage = int(WeaponGlobals.getAttackTargetHP(self.skillId) * mod)
            loDamage = damage / 2
            mpDamage = int(WeaponGlobals.getAttackTargetMojo(self.skillId) * mod)
            mpLoDamage = mpDamage / 2


        try:
            skillInfo = PLocalizer.SkillDescriptions.get(self.skillId)
            skillTitle = PLocalizer.makeHeadingString(PLocalizer.InventoryTypeNames.get(self.skillId), 2)
            skillType = PLocalizer.makeHeadingString(skillInfo[0], 1)
        except:
            self.notify.error('Error getting skill info for skillId %s' % self.skillId)

        description = skillInfo[1]
        if damage < 0:
            description += ' ' + PLocalizer.DealsDamage
        elif damage > 0:
            if loDamage:
                loDamage = 0
                description += ' ' + PLocalizer.HealsDamageRange
            else:
                description += ' ' + PLocalizer.HealsDamage

        if mpDamage < 0:
            description += ' ' + PLocalizer.DealsMpDamage

        effectId = WeaponGlobals.getSkillEffectFlag(self.skillId)
        if effectId:
            description += ' ' + SkillEffectDescriptions.get(effectId)[0]

        if bonus:
            if self.skillId == InventoryType.SailBroadsideLeft or self.skillId == InventoryType.SailBroadsideRight:
                description += ' ' + PLocalizer.BroadsideDesc

            if self.skillId == InventoryType.CannonShoot:
                description += ' ' + PLocalizer.CannonShootDesc

            if self.skillId == InventoryType.DollAttune:
                description += ' ' + PLocalizer.MultiAttuneDesc


        if WeaponGlobals.getSkillInterrupt(self.skillId):
            description += ' ' + PLocalizer.InterruptDesc

        if WeaponGlobals.getSkillUnattune(self.skillId):
            description += ' ' + PLocalizer.UnattuneDesc

        upgradeInfo = ''
        if self.showUpgrade and rank < 5:
            if rank > 0:
                upgradeInfo = skillInfo[2]
                if upgradeInfo == '':
                    if damage < 0:
                        upgradeInfo += PLocalizer.UpgradesDamage
                    elif damage > 0:
                        upgradeInfo += PLocalizer.UpgradesHealing

                    if mpDamage < 0:
                        upgradeInfo += ' ' + PLocalizer.UpgradesMpDamage

                    if effectId:
                        entry = SkillEffectDescriptions.get(effectId)
                        if len(entry) > 1:
                            if not damage:
                                upgradeInfo += PLocalizer.UpgradesDuration
                            else:
                                upgradeInfo += ' ' + PLocalizer.And
                            upgradeInfo += ' ' + entry[1]


                    upgradeInfo += '!'

            elif len(upgradeInfo) >= 4:
                upgradeInfo = skillInfo[3]
            else:
                upgradeInfo = PLocalizer.ClickToLearn
        elif not self.showIcon:
            unlockLevel = RepChart.getSkillUnlockLevel(self.skillId)
            if unlockLevel > 0:
                upgradeInfo = PLocalizer.UnlocksAtLevel % unlockLevel


        if self.skillId in SkillComboReq and SkillComboReq[self.skillId] and inv.getStackQuantity(self.skillId - 1) < 2:
            color = 'red'
            if rank == 0:
                color = 'red'
                upgradeInfo = ''

            description += '\n' + color + SkillComboReq[self.skillId] + '.'

        skillDesc = skillTitle + '\n' + skillType + '\n\n' + description + '\ngreen' + upgradeInfo
        stats = []
        if manaCost:
            stats.append(abs(manaCost))

        if damage and loDamage:
            stats.append(abs(loDamage))
            stats.append(abs(damage))
        elif damage:
            stats.append(abs(damage))

        if mpDamage:
            stats.append(abs(mpLoDamage))
            stats.append(abs(mpDamage))

        if buff == WeaponGlobals.C_CURSE:
            stats.append(WeaponGlobals.CURSED_DAM_AMP * 100)

        if buff == WeaponGlobals.C_WEAKEN:
            stats.append(WeaponGlobals.WEAKEN_PENALTY * 100)

        if effect > 0:
            stats.append(effect)

        if skillInfo[4]:
            if bonus == 0 and upgradeAmt > 0:
                if not self.skillId == InventoryType.SailBroadsideLeft and self.skillId == InventoryType.SailBroadsideRight:
                    pass
                if not (self.skillId == InventoryType.CannonShoot):
                    bonus = upgradeAmt

            if upgradeAmt < 1.0 and upgradeAmt > 0:
                bonus *= 100

            if self.skillId == InventoryType.SailTreasureSense:
                bonus /= 2.0
            elif self.skillId == InventoryType.CutlassParry:
                bonus += WeaponGlobals.getSubtypeParryBonus(localAvatar.currentWeaponId)

            if bonus:
                stats.append(abs(bonus))


        if self.skillId == InventoryType.DollAttune:
            stats.append(rank)

        if self.skillRank:
            rankText = DirectFrame(parent = self, relief = None, text = PLocalizer.makeHeadingString(PLocalizer.Rank + ' %s' % (self.skillRank + skillBoost), 2), text_align = TextNode.ARight, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 15, text_shadow = (0, 0, 0, 1), pos = (0.45000000000000001, 0, 0), textMayChange = 1, sortOrder = 92, state = DGG.DISABLED)

        stats = [stat + 0.01 for stat in stats]

        try:
            pass
        except TypeError:
            self.notify.error('Error formatting skillDesc(%s): %s' % (self.skillId, stats))

        helpText = DirectFrame(parent = self, relief = None, text = skillDesc % stats, text_align = TextNode.ALeft, text_scale = PiratesGuiGlobals.TextScaleSmall, text_fg = PiratesGuiGlobals.TextFG2, text_wordwrap = 17, textMayChange = 1, state = DGG.DISABLED, sortOrder = 91)
        height = -(helpText.getHeight() + 0.01)
        if self.lock:
            height = height - 0.040000000000000001

        width = 0.55000000000000004
        self.helpFrame = BorderFrame(parent = self, state = DGG.DISABLED, frameSize = (-0.040000000000000001, width, height, 0.050000000000000003), pos = (0, 0, -0.12), sortOrder = 90)
        self.helpFrame.setBin('gui-popup', 0)
        helpText.reparentTo(self.helpFrame)
        if self.skillRank:
            rankText.reparentTo(self.helpFrame)

        if self.lock:
            self.lockedFrame = DirectFrame(parent = self.helpFrame, relief = None, pos = (0.087999999999999995, 0, height + 0.029999999999999999), image = SkillButton.SubLock, image_scale = 0.13, image_pos = (-0.055, 0, 0.012999999999999999), text = PLocalizer.VR_AuthAccess, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG13)
            self.notify.debug('locked!')

        pos = self.helpFrame.getPos(aspect2d)
        x = min(pos[0], base.a2dRight - width)
        z = max(pos[2], base.a2dBottom - height)
        self.helpFrame.setPos(aspect2d, x, 0, z)


    def showDetails(self, event):
        if self.showHelp:
            self.createHelpFrame()

        if self.showRing:
            self.skillRing.rollover(True)



    def hideDetails(self, event):
        if self.helpFrame:
            self.helpFrame.destroy()
            self.helpFrame = None

        if self.showRing:
            self.skillRing.rollover(False)



    def updateQuantity(self, quantity):
        self.quantity = quantity
        if not self.showQuantity:
            return None

        if quantity == WeaponGlobals.INF_QUANT:
            text = ''
        elif self.assocAmmo:
            assocQuantity = 0
            inv = localAvatar.getInventory()
            if inv:
                for ammoId in self.assocAmmo:
                    assocQuantity += inv.getItemQuantity(self.getAmmoCat(), ammoId)


            if quantity != assocQuantity:
                text = '%s' % assocQuantity
            else:
                text = 'x%s' % quantity
        else:
            text = 'x%s' % quantity
        if self.quantityLabel and not self.quantityLabel.isEmpty():
            self.quantityLabel['text'] = text
        else:
            self.quantityLabel = DirectLabel(parent = NodePath(), relief = None, state = DGG.DISABLED, text = text, frameColor = (0, 0, 0, 1), frameSize = (-0.01, 0.02, -0.01, 0.025000000000000001), text_scale = PiratesGuiGlobals.TextScaleLarge, text_align = TextNode.ACenter, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_wordwrap = 11, pos = (0.029999999999999999, 0.0, 0.029999999999999999), text_font = PiratesGlobals.getPirateBoldOutlineFont(), sortOrder = 60)
            self.quantityLabel.flattenLight()
            self.quantityLabel.reparentTo(self)
            if self.skillButton and not self.skillButton.isEmpty():
                self.quantityLabel.reparentTo(self.skillButton)



    def getAmmoCat(self):
        pass


    def startRecharge(self):
        if not self.showRing:
            return None

        if self.isBreakAttackSkill:
            self.setGeomColor(0.5, 0.5, 0.5, 1.0)
            self.updateRechargeRing()
            return None

        if self.skillRingIval.isPlaying():
            self.createSkillRingIval()

        self.skillRingIval.start()


    def stopRecharge(self):
        if self.showRing:
            if self.isBreakAttackSkill:
                self.setGeomColor(0.5, 0.5, 0.5, 1.0)
                self.updateRechargeRing()
                return None

            if self.skillRingIval.isPlaying():
                self.skillRingIval.pause()




    def setGeomColor(self, r, g, b, a):
        self.skillButton['geom_color'] = Vec4(r, g, b, a)


    def setRingColor(self, color):
        self.skillRing.meterFaceHalf1.setColor(color[0], color[1], color[2], color[3], 100)
        self.skillRing.meterFaceHalf2.setColor(color[0], color[1], color[2], color[3], 100)


    def setShowUpgrade(self, show):
        if self.showUpgrade != show:
            self.showUpgrade = show
            if self.helpFrame:
                self.helpFrame.destroy()
                self.helpFrame = None
                self.showDetails(None)




    def setShowIcon(self, show):
        if self.showIcon != show:
            self.showIcon = show
            self.updateSkillId(self.skillId)
            if self.helpFrame:
                self.helpFrame.destroy()
                self.helpFrame = None




    def setShowLock(self, show):
        if self.showLock != show:
            self.showLock = show
            if show:
                self.createLock()
            elif self.lock:
                self.lock.destroy()
                self.lock = None
                self.skillButton.clearColorScale()




    def destroy(self):
        self.callback = None
        if self.skillRingIval:
            self.skillRingIval.pause()
            self.skillRingIval = None

        if self.quantityLabel:
            self.quantityLabel.destroy()
            self.quantityLabel = None

        if self.impulseIval:
            self.impulseIval.pause()
            self.impulseIval = None

        if self.quickImpulseIval:
            self.quickImpulseIval.pause()
            self.quickImpulseIval = None

        self.ignoreAll()
        DirectFrame.destroy(self)