Exemplo n.º 1
0
 def __init__(self, cannon):
     CannonGUI.__init__(self, cannon)
     self.exitEvent = None
     self.__dialog = None
     self.helpButton = None
     self.helpUI = None
     self.flashHelp = None
     self.ammoFade = None
     self.__ammoCountersHidden = False
     self.setupExtraButtons()
     self.exitCannon['command'] = self.showExitDialog
     self.volleyLabel.setPos(-0.28, 0, 0.09)
     self.reloadBar.setPos(-0.13, 0, 0.08)
     self.ammoImage.setPos(-0.38, 0, 0.06)
     self.repMeter = ReputationMeter(InventoryType.DefenseCannonRep,
                                     width=0.7)
     self.repMeter.reparentTo(base.a2dBottomCenter)
     self.repMeter.setPos(0.0, 0.0, 0.025)
     self.hud = CannonDefenseHUD()
     self.hud.create()
     self._exp = 0
     self.lastLevel = 1
     self.accept('incDefenseCannonExp', self.increaseExp)
     if __dev__:
         base.dcg = self
     return
Exemplo n.º 2
0
    def __init__(self):
        if not SkillPage.SkillIcons:
            SkillPage.SkillIcons = loader.loadModel(
                'models/textureCards/skillIcons')
            SkillPage.WeaponIcons = loader.loadModel(
                'models/gui/gui_icons_weapon')
            SkillPage.DotTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_dot')
            SkillPage.FrameTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_ring')

        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(SkillPage)
        self.tabBar = None
        self.currentRep = InventoryType.CannonRep
        self.skillFrames = {}
        self.boostDisplays = {}
        self.backFrames = {}
        self.lastUserSelectedTab = None
        self.dataChanged = True
        self.spentDialog = None
        self.localMods = {}
        self.demo = False
        self.demoSeq = None
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        ornament = loader.loadModel('models/gui/gui_skill_window')
        ornament.find('**/pPlane81').detachNode()
        ornament.find('**/pPlane83').detachNode()
        ornament.find('**/pPlane84').detachNode()
        ornament.find('**/pPlane93').detachNode()
        ornament.setScale(0.32500000000000001, 0, 0.32000000000000001)
        ornament.setPos(0.54000000000000004, 0, 0.71999999999999997)
        ornament.flattenStrong()
        ornament.reparentTo(self)
        self.box = loader.loadModel('models/gui/gui_title_box').find(
            '**/gui_title_box_top')
        box = loader.loadModel('models/gui/gui_title_box').find(
            '**/gui_title_box_top')
        box.setPos(0.55000000000000004, 0, 1.26)
        box.setScale(0.32500000000000001, 0.0, 0.25)
        box.reparentTo(ornament)
        ornament.flattenStrong()
        self.repMeter = ReputationMeter(self.getRep(),
                                        width=0.69999999999999996)
        self.repMeter.reparentTo(self)
        self.repMeter.setPos(0.55000000000000004, 0, 1.24)
        self.unspent = DirectLabel(parent=self,
                                   relief=None,
                                   text=PLocalizer.SkillPageUnspentPoints % 0,
                                   text_scale=0.040000000000000001,
                                   text_align=TextNode.ACenter,
                                   text_pos=(0, -0.01),
                                   text_fg=(1, 1, 1, 1),
                                   pos=(0.80000000000000004, 0, 0.02))
Exemplo n.º 3
0
 def __init__(self):
     if not SkillPage.SkillIcons:
         SkillPage.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
         SkillPage.WeaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
         SkillPage.DotTex = SkillPage.SkillIcons.find('**/skill_tree_level_dot')
         SkillPage.FrameTex = SkillPage.SkillIcons.find('**/skill_tree_level_ring')
     
     InventoryPage.InventoryPage.__init__(self)
     self.initialiseoptions(SkillPage)
     self.tabBar = None
     self.currentRep = InventoryType.CannonRep
     self.skillFrames = { }
     self.boostDisplays = { }
     self.backFrames = { }
     self.lastUserSelectedTab = None
     self.dataChanged = True
     self.spentDialog = None
     self.localMods = { }
     self.demo = False
     self.demoSeq = None
     self.blinkSeqs = []
     self.blinkSeqs2 = []
     ornament = loader.loadModel('models/gui/gui_skill_window')
     ornament.find('**/pPlane81').detachNode()
     ornament.find('**/pPlane83').detachNode()
     ornament.find('**/pPlane84').detachNode()
     ornament.find('**/pPlane93').detachNode()
     ornament.setScale(0.32500000000000001, 0, 0.32000000000000001)
     ornament.setPos(0.54000000000000004, 0, 0.71999999999999997)
     ornament.flattenStrong()
     ornament.reparentTo(self)
     self.box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
     box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
     box.setPos(0.55000000000000004, 0, 1.26)
     box.setScale(0.32500000000000001, 0.0, 0.25)
     box.reparentTo(ornament)
     ornament.flattenStrong()
     self.repMeter = ReputationMeter(self.getRep(), width = 0.69999999999999996)
     self.repMeter.reparentTo(self)
     self.repMeter.setPos(0.55000000000000004, 0, 1.24)
     self.unspent = DirectLabel(parent = self, relief = None, text = PLocalizer.SkillPageUnspentPoints % 0, text_scale = 0.040000000000000001, text_align = TextNode.ACenter, text_pos = (0, -0.01), text_fg = (1, 1, 1, 1), pos = (0.80000000000000004, 0, 0.02))
 def createGui(self):
     itemId = self.data[0]
     (item, quantity) = self.data
     name = ItemGlobals.getName(item)
     itemType = ItemGlobals.getType(item)
     itemTypeName = name
     repCategory = ItemGlobals.getItemRepId(itemId)
     if quantity:
         repValue = localAvatar.getInventory().getReputation(repCategory)
         self.repMeter = ReputationMeter(repCategory, width = 0.66000000000000003)
         self.repMeter.setPos(0.62, 0, 0.041000000000000002)
         self.repMeter.update(repValue)
         self.repMeter.reparentTo(self)
         self.repMeter.flattenLight()
         hotkeyLabel = ''
         hotkeys = ()
         desc = PLocalizer.WeaponDescriptions.get(itemId)
         helpText = PLocalizer.InventoryTypeNames[repCategory]
         self.weaponButton = CombatTray.WeaponButton(hotkeys = hotkeys, hotkeyLabel = hotkeyLabel, helpOpaque = True, helpText = helpText, parent = self, showQuant = 0, pos = (0.10000000000000001, 0, -0.02), scale = 1.1000000000000001)
         self.weaponButton.ignoreHotkeys()
         self.weaponButton.setWeaponId(itemId)
         self.weaponButton['extraArgs'] = [
             itemId]
         self.weaponButton.helpDelay = 0
         self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
         self.desc = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = PLocalizer.WeaponAlreadyUnlocked, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, -0.0050000000000000001), text_font = PiratesGlobals.getInterfaceFont())
     else:
         self.repMeter = None
         name = PLocalizer.makeHeadingString(PLocalizer.InventoryTypeNames[repCategory], 2)
         self.categoryLabel = DirectLabel(parent = self, relief = None, text = name, text_scale = PiratesGuiGlobals.TextScaleLarge, text_align = TextNode.ALeft, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, 0.059999999999999998), textMayChange = 0)
         self.weaponButton = CombatTray.WeaponButton(parent = self, state = DGG.DISABLED, showQuant = 0, scale = 1.1000000000000001)
         self.weaponButton.setPos(0.10000000000000001, 0, -0.02)
         self.weaponButton.setWeaponId(itemId)
         self.weaponButton.helpDelay = 0
         self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
         unlockDesc = PLocalizer.WeaponUnlockText[repCategory]
         self.desc = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = unlockDesc, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, 0.025000000000000001), text_font = PiratesGlobals.getInterfaceFont())
         self.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1, 1)
 def __init__(self, cannon):
     CannonGUI.__init__(self, cannon)
     self.exitEvent = None
     self._DefenseCannonGUI__dialog = None
     self.helpButton = None
     self.helpUI = None
     self.flashHelp = None
     self.ammoFade = None
     self._DefenseCannonGUI__ammoCountersHidden = False
     self.setupExtraButtons()
     self.exitCannon['command'] = self.showExitDialog
     self.volleyLabel.setPos(-0.28000000000000003, 0, 0.089999999999999997)
     self.reloadBar.setPos(-0.13, 0, 0.080000000000000002)
     self.ammoImage.setPos(-0.38, 0, 0.059999999999999998)
     self.repMeter = ReputationMeter(InventoryType.DefenseCannonRep, width = 0.69999999999999996)
     self.repMeter.reparentTo(base.a2dBottomCenter)
     self.repMeter.setPos(0.0, 0.0, 0.025000000000000001)
     self.hud = CannonDefenseHUD()
     self.hud.create()
     self._exp = 0
     self.lastLevel = 1
     self.accept('incDefenseCannonExp', self.increaseExp)
     if __dev__:
         base.dcg = self
Exemplo n.º 6
0
class DefenseCannonGUI(CannonGUI):
    notify = DirectNotifyGlobal.directNotify.newCategory('DefenseCannonGUI')

    def __init__(self, cannon):
        CannonGUI.__init__(self, cannon)
        self.exitEvent = None
        self.__dialog = None
        self.helpButton = None
        self.helpUI = None
        self.flashHelp = None
        self.ammoFade = None
        self.__ammoCountersHidden = False
        self.setupExtraButtons()
        self.exitCannon['command'] = self.showExitDialog
        self.volleyLabel.setPos(-0.28, 0, 0.09)
        self.reloadBar.setPos(-0.13, 0, 0.08)
        self.ammoImage.setPos(-0.38, 0, 0.06)
        self.repMeter = ReputationMeter(InventoryType.DefenseCannonRep,
                                        width=0.7)
        self.repMeter.reparentTo(base.a2dBottomCenter)
        self.repMeter.setPos(0.0, 0.0, 0.025)
        self.hud = CannonDefenseHUD()
        self.hud.create()
        self._exp = 0
        self.lastLevel = 1
        self.accept('incDefenseCannonExp', self.increaseExp)
        if __dev__:
            base.dcg = self
        return

    def destroy(self):
        if self.ammoFade:
            self.ammoFade.finish()
            self.ammoFade = None
        if self.flashHelp:
            self.flashHelp.finish()
            self.flashHelp = None
        if self.helpButton:
            self.helpButton.destroy()
            self.helpButton = None
        if self.helpUI:
            self.helpUI.destroy()
            self.helpUI = None
        if self.hud:
            self.hud.destroy()
            self.hud = None
        base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_MINIGAME_CANNON)
        self.repMeter.destroy()
        self.ignore('incDefenseCannonExp')
        CannonGUI.destroy(self)
        return

    def setupExtraButtons(self):
        weaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
        self.helpButton = DirectButton(
            parent=base.a2dBottomRight,
            relief=None,
            pos=(-0.6, 0, 0.09),
            scale=0.5,
            text='?',
            text_pos=(0, -0.055),
            text_scale=0.21,
            text_fg=PiratesGuiGlobals.TextFG2,
            text_shadow=PiratesGuiGlobals.TextShadow,
            text_font=PiratesGlobals.getPirateBoldOutlineFont(),
            sortOrder=2,
            command=self.toggleHelpUI)
        DirectLabel(parent=self.helpButton,
                    text=PLocalizer.CannonDefense['Help'],
                    text_pos=(0, -0.15),
                    text_scale=0.08,
                    text_fg=PiratesGuiGlobals.TextFG2,
                    text_shadow=PiratesGuiGlobals.TextShadow,
                    text_font=PiratesGlobals.getPirateBoldOutlineFont(),
                    frameColor=(1, 1, 1, 0))
        return

    def increaseExp(self, amt, total):
        self._exp += amt
        if self._exp > total:
            return
        level, leftoverValue = ReputationGlobals.getLevelFromTotalReputation(
            InventoryType.DefenseCannonRep, self._exp)
        self.repMeter.update(self._exp)
        if level > self.lastLevel:
            base.localAvatar.levelUpMsg(InventoryType.DefenseCannonRep, level,
                                        0)
            self.lastLevel = level

    def toggleHelpUI(self):
        if self.helpUI == None:
            self.__createHelpUI()
            self.fadeOutAmmoCounters()
            if self.cannon.ammoPanel.state == pirates.minigame.AmmoPanel.CLOSED:
                self.cannon.ammoPanel.onTabClick()
        else:
            self.__destroyHelpUI()
            self.fadeInAmmoCounters()
            if self.cannon.ammoPanel.state == pirates.minigame.AmmoPanel.OPENED:
                self.cannon.ammoPanel.onTabClick()
        return

    def __createHelpUI(self):
        self.helpUI = CannonDefenseHelpManager(0.5)
        self.helpUI.exit.reparentTo(self.exitCannon)
        self.helpUI.exit.setScale(2.0)
        self.helpUI.help.reparentTo(self.helpButton)
        self.helpUI.help.setScale(2.0)
        self.helpUI.ammoPanel.reparentTo(self.cannon.ammoPanel.panel)
        self.helpUI.ammoPanel.setScale(1.0 / 3.0)
        self.helpUI.ammo.reparentTo(base.a2dBottomCenter)
        self.helpUI.mine.reparentTo(self.hud.goldRemainingUI.mineCounter)
        self.helpUI.mine.setScale(2.0 / 3.0)
        self.helpUI.wave.reparentTo(self.hud.timeRemainingUI.timeRemaining)
        self.helpUI.wave.setScale(1.0 / 0.75)
        self.helpUI.fadeIn.start()

    def __destroyHelpUI(self):
        cleanup = Sequence(Func(self.helpUI.fadeIn.pause),
                           self.helpUI.fadeOut,
                           Func(self.helpUI.destroy),
                           name=self.cannon.uniqueName('HelpUI_FadeIn'))
        cleanup.start()
        self.helpUI = None
        return

    def isHelpUIVisible(self):
        return self.helpUI != None

    def flashHelpButton(self, delay=0.2, length=5):
        if self.flashHelp:
            self.flashHelp.finish()
            self.flashHelp = None
        self.flashHelp = Sequence(
            name=self.cannon.uniqueName('HelpButton_Flash'))

        def setColor(key, value):
            self.helpButton[key] = value

        for i in range(0, length):
            self.flashHelp.append(Wait(delay))
            self.flashHelp.append(
                Func(setColor, 'text_fg', PiratesGuiGlobals.TextFG19))
            self.flashHelp.append(Wait(delay))
            self.flashHelp.append(
                Func(setColor, 'text_fg', PiratesGuiGlobals.TextFG2))

        self.flashHelp.start()
        return

    def fadeOutAmmoCounters(self, length=0.5):
        if self.__ammoCountersHidden:
            return
        transparent = Vec4(1, 1, 1, 0)
        if self.ammoFade:
            self.ammoFade.finish()
        self.ammoFade = Parallel(
            self.volleyLabel.colorScaleInterval(length, transparent),
            self.reloadBar.colorScaleInterval(length, transparent),
            self.ammoImage.colorScaleInterval(length, transparent))
        self.ammoFade.start()
        self.__ammoCountersHidden = True

    def fadeInAmmoCounters(self, length=0.5):
        if self.__ammoCountersHidden == False:
            return
        opaque = Vec4(1, 1, 1, 1)
        transparent = Vec4(1, 1, 1, 0)
        if self.ammoFade:
            self.ammoFade.finish()
        self.ammoFade = Parallel(
            self.volleyLabel.colorScaleInterval(length, opaque, transparent),
            self.reloadBar.colorScaleInterval(length, opaque, transparent),
            self.ammoImage.colorScaleInterval(length, opaque, transparent))
        self.ammoFade.start()
        self.__ammoCountersHidden = False

    def showExitDialog(self):
        if self.__dialog == None:
            self.__dialog = PDialog(
                text=PLocalizer.CannonDefense['ExitCannon'],
                style=OTPDialog.YesNo,
                giveMouse=False,
                command=self.__onDialogItemSelected)
        else:
            self.__dialog.cleanup()
            self.__dialog = None
        return

    def __onDialogItemSelected(self, value):
        if value == 1:
            if self.exitEvent:
                self.exitEvent()
        self.__dialog.cleanup()
        self.__dialog = None
        return
class SkillPage(InventoryPage.InventoryPage):
    MAX_UPGRADE_DOTS = 5
    EXCLUDED_SKILLS = [
        InventoryType.CannonGrappleHook]
    notify = DirectNotifyGlobal.directNotify.newCategory('SkillPage')
    SkillIcons = None
    WeaponIcons = None
    TopGui = None
    DotTex = None
    FrameTex = None
    
    def __init__(self):
        if not SkillPage.SkillIcons:
            SkillPage.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            SkillPage.WeaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
            SkillPage.DotTex = SkillPage.SkillIcons.find('**/skill_tree_level_dot')
            SkillPage.FrameTex = SkillPage.SkillIcons.find('**/skill_tree_level_ring')
        
        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(SkillPage)
        self.tabBar = None
        self.currentRep = InventoryType.CannonRep
        self.skillFrames = { }
        self.boostDisplays = { }
        self.backFrames = { }
        self.lastUserSelectedTab = None
        self.dataChanged = True
        self.spentDialog = None
        self.localMods = { }
        self.demo = False
        self.demoSeq = None
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        ornament = loader.loadModel('models/gui/gui_skill_window')
        ornament.find('**/pPlane81').detachNode()
        ornament.find('**/pPlane83').detachNode()
        ornament.find('**/pPlane84').detachNode()
        ornament.find('**/pPlane93').detachNode()
        ornament.setScale(0.32500000000000001, 0, 0.32000000000000001)
        ornament.setPos(0.54000000000000004, 0, 0.71999999999999997)
        ornament.flattenStrong()
        ornament.reparentTo(self)
        self.box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
        box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
        box.setPos(0.55000000000000004, 0, 1.26)
        box.setScale(0.32500000000000001, 0.0, 0.25)
        box.reparentTo(ornament)
        ornament.flattenStrong()
        self.repMeter = ReputationMeter(self.getRep(), width = 0.69999999999999996)
        self.repMeter.reparentTo(self)
        self.repMeter.setPos(0.55000000000000004, 0, 1.24)
        self.unspent = DirectLabel(parent = self, relief = None, text = PLocalizer.SkillPageUnspentPoints % 0, text_scale = 0.040000000000000001, text_align = TextNode.ACenter, text_pos = (0, -0.01), text_fg = (1, 1, 1, 1), pos = (0.80000000000000004, 0, 0.02))

    
    def destroy(self):
        for spot in self.skillFrames.keys():
            self.skillFrames[spot].destroy()
        
        if self.tabBar:
            self.tabBar.destroy()
            self.tabBar = None
        
        self._SkillPage__handleFreeDialog()
        InventoryPage.InventoryPage.destroy(self)
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None
        
        for blinkSeq in self.blinkSeqs:
            blinkSeq.pause()
            blinkSeq = None
        
        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.pause()
            blinkSeq = None
Exemplo n.º 8
0
class SkillPage(InventoryPage.InventoryPage):
    MAX_UPGRADE_DOTS = 5
    EXCLUDED_SKILLS = [InventoryType.CannonGrappleHook]
    notify = DirectNotifyGlobal.directNotify.newCategory('SkillPage')
    SkillIcons = None
    WeaponIcons = None
    TopGui = None
    DotTex = None
    FrameTex = None

    def __init__(self):
        if not SkillPage.SkillIcons:
            SkillPage.SkillIcons = loader.loadModel(
                'models/textureCards/skillIcons')
            SkillPage.WeaponIcons = loader.loadModel(
                'models/gui/gui_icons_weapon')
            SkillPage.DotTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_dot')
            SkillPage.FrameTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_ring')

        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(SkillPage)
        self.tabBar = None
        self.currentRep = InventoryType.CannonRep
        self.skillFrames = {}
        self.boostDisplays = {}
        self.backFrames = {}
        self.lastUserSelectedTab = None
        self.dataChanged = True
        self.spentDialog = None
        self.localMods = {}
        self.demo = False
        self.demoSeq = None
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        ornament = loader.loadModel('models/gui/gui_skill_window')
        ornament.find('**/pPlane81').detachNode()
        ornament.find('**/pPlane83').detachNode()
        ornament.find('**/pPlane84').detachNode()
        ornament.find('**/pPlane93').detachNode()
        ornament.setScale(0.32500000000000001, 0, 0.32000000000000001)
        ornament.setPos(0.54000000000000004, 0, 0.71999999999999997)
        ornament.flattenStrong()
        ornament.reparentTo(self)
        self.box = loader.loadModel('models/gui/gui_title_box').find(
            '**/gui_title_box_top')
        box = loader.loadModel('models/gui/gui_title_box').find(
            '**/gui_title_box_top')
        box.setPos(0.55000000000000004, 0, 1.26)
        box.setScale(0.32500000000000001, 0.0, 0.25)
        box.reparentTo(ornament)
        ornament.flattenStrong()
        self.repMeter = ReputationMeter(self.getRep(),
                                        width=0.69999999999999996)
        self.repMeter.reparentTo(self)
        self.repMeter.setPos(0.55000000000000004, 0, 1.24)
        self.unspent = DirectLabel(parent=self,
                                   relief=None,
                                   text=PLocalizer.SkillPageUnspentPoints % 0,
                                   text_scale=0.040000000000000001,
                                   text_align=TextNode.ACenter,
                                   text_pos=(0, -0.01),
                                   text_fg=(1, 1, 1, 1),
                                   pos=(0.80000000000000004, 0, 0.02))

    def destroy(self):
        for spot in self.skillFrames.keys():
            self.skillFrames[spot].destroy()

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

        self._SkillPage__handleFreeDialog()
        InventoryPage.InventoryPage.destroy(self)
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None

        for blinkSeq in self.blinkSeqs:
            blinkSeq.pause()
            blinkSeq = None

        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.pause()
            blinkSeq = None
Exemplo n.º 9
0
class SkillPage(InventoryPage.InventoryPage):
    MAX_UPGRADE_DOTS = 5
    EXCLUDED_SKILLS = [InventoryType.CannonGrappleHook]
    notify = DirectNotifyGlobal.directNotify.newCategory('SkillPage')
    SkillIcons = None
    WeaponIcons = None
    TopGui = None
    DotTex = None
    FrameTex = None

    def __init__(self):
        if not SkillPage.SkillIcons:
            SkillPage.SkillIcons = loader.loadModel(
                'models/textureCards/skillIcons')
            SkillPage.WeaponIcons = loader.loadModel(
                'models/gui/gui_icons_weapon')
            SkillPage.DotTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_dot')
            SkillPage.FrameTex = SkillPage.SkillIcons.find(
                '**/skill_tree_level_ring')
        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(SkillPage)
        self.tabBar = None
        self.currentRep = InventoryType.CannonRep
        self.skillFrames = {}
        self.boostDisplays = {}
        self.backFrames = {}
        self.lastUserSelectedTab = None
        self.dataChanged = True
        self.spentDialog = None
        self.localMods = {}
        self.demo = False
        self.demoSeq = None
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        ornament = loader.loadModel('models/gui/gui_skill_window')
        ornament.find('**/pPlane81').detachNode()
        ornament.find('**/pPlane83').detachNode()
        ornament.find('**/pPlane84').detachNode()
        ornament.find('**/pPlane93').detachNode()
        ornament.setScale(0.325, 0, 0.32)
        ornament.setPos(0.54, 0, 0.72)
        ornament.flattenStrong()
        ornament.reparentTo(self)
        self.box = box = loader.loadModel('models/gui/gui_title_box').find(
            '**/gui_title_box_top')
        box.setPos(0.55, 0, 1.26)
        box.setScale(0.325, 0.0, 0.25)
        box.reparentTo(ornament)
        ornament.flattenStrong()
        self.repMeter = ReputationMeter(self.getRep(), width=0.7)
        self.repMeter.reparentTo(self)
        self.repMeter.setPos(0.55, 0, 1.24)
        self.unspent = DirectLabel(parent=self,
                                   relief=None,
                                   text=PLocalizer.SkillPageUnspentPoints % 0,
                                   text_scale=0.04,
                                   text_align=TextNode.ACenter,
                                   text_pos=(0, -0.01),
                                   text_fg=(1, 1, 1, 1),
                                   pos=(0.8, 0, 0.02))
        return

    def destroy(self):
        for spot in self.skillFrames.keys():
            self.skillFrames[spot].destroy()

        if self.tabBar:
            self.tabBar.destroy()
            self.tabBar = None
        self.__handleFreeDialog()
        InventoryPage.InventoryPage.destroy(self)
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None
        for blinkSeq in self.blinkSeqs:
            blinkSeq.pause()
            blinkSeq = None

        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.pause()
            blinkSeq = None

        self.blinkSeqs2 = []
        return

    def __handleFreeDialog(self, value=None):
        if self.spentDialog:
            self.spentDialog.destroy()
            self.spentDialog = None
        return

    def createTabs(self):
        def invArrived(inventory):
            if not inventory:
                inventoryId = base.localAvatar.getInventoryId()
                self.getInventory(inventoryId, invArrived)
                return
            repIds = [InventoryType.CannonRep, InventoryType.SailingRep]
            tokenReps = ([
                InventoryType.CutlassToken, InventoryType.CutlassRep
            ], [InventoryType.PistolToken, InventoryType.PistolRep
                ], [InventoryType.DaggerToken, InventoryType.DaggerRep
                    ], [InventoryType.GrenadeToken, InventoryType.GrenadeRep
                        ], [InventoryType.WandToken, InventoryType.WandRep],
                         [InventoryType.DollToken, InventoryType.DollRep])
            for tokenRep in tokenReps:
                token = tokenRep[0]
                repId = tokenRep[1]
                if inventory.getStackQuantity(token):
                    repIds.append(repId)

            for repId in repIds:
                tab = self.tabBar.getTab(str(repId))
                if not tab:
                    self.createTab(repId)
                else:
                    tab.show()

            if localAvatar.guiMgr.ignoreAllButSkillHotKey:
                self.tabBar.tabs[str(InventoryType.CannonRep)].hide()
                self.tabBar.tabs[str(InventoryType.SailingRep)].hide()

        inventoryId = base.localAvatar.getInventoryId()
        self.getInventory(inventoryId, invArrived)

    def createTab(self, repId):
        newTab = self.tabBar.addTab(str(repId),
                                    frameSize=(-0.12, 0.12, -0.11, 0.11),
                                    focusSize=(-0.12, 0.12, -0.12, 0.12),
                                    heightFactor=0.55,
                                    command=self.update,
                                    extraArgs=[repId, 1])
        if repId == InventoryType.SailingRep:
            model = SkillPage.SkillIcons
        else:
            model = SkillPage.WeaponIcons
        asset = ReputationGlobals.RepIcons.get(repId)
        image = model.find('**/%s' % asset)
        name = PLocalizer.InventoryTypeNames[repId]
        newTab.nameTag = DirectLabel(parent=newTab,
                                     relief=None,
                                     state=DGG.DISABLED,
                                     image=image,
                                     image_scale=0.1,
                                     image_color=Vec4(0.8, 0.8, 0.8, 1),
                                     image_pos=Vec3(-0.15, 0.0, 0.0),
                                     pos=(0, 0, 0))

        def mouseOver(tab=newTab):
            tab.nameTag.setScale(1.1)
            tab.nameTag['image_color'] = Vec4(1, 1, 1, 1)
            base.playSfx(PiratesGuiGlobals.getDefaultRolloverSound())

        def mouseOff(tab=newTab):
            if not tab['selected']:
                tab.nameTag.setScale(1.0)
                tab.nameTag['image_color'] = Vec4(0.8, 0.8, 0.8, 1)
            else:
                mouseOver(tab)

        newTab['mouseEntered'] = mouseOver
        newTab['mouseLeft'] = mouseOff
        return

    def show(self):
        if self.tabBar == None:
            self.tabBar = localAvatar.guiMgr.chestPanel.makeTabBar()
        else:
            self.tabBar.unstash()
        self.createTabs()
        InventoryPage.InventoryPage.show(self)
        self.update()
        return

    def update(self, repId=None, fromUser=0):
        inv = localAvatar.getInventory()
        if not inv:
            self.notify.warning('SkillPage unable to find inventory')
            return
        if self.tabBar == None:
            return
        if self.demo:
            return
        if fromUser:
            self.lastUserSelectedTab = repId
        if repId == None:
            if localAvatar.getGameState() == 'Fishing':
                if self.lastUserSelectedTab:
                    repId = self.lastUserSelectedTab
                else:
                    repId = InventoryType.CannonRep
            elif localAvatar.cannon:
                repId = InventoryType.CannonRep
            elif localAvatar.gameFSM.state == 'ShipPilot':
                repId = InventoryType.SailingRep
            elif localAvatar.currentWeaponId and localAvatar.isWeaponDrawn:
                repId = WeaponGlobals.getRepId(localAvatar.currentWeaponId)
            elif localAvatar.currentWeaponId and not localAvatar.isWeaponDrawn and self.lastUserSelectedTab:
                repId = self.lastUserSelectedTab
            else:
                repId = InventoryType.CannonRep
        self.setRep(repId)
        self.tabBar.selectTab(str(repId))
        self.repMeter.setCategory(repId)
        self.repMeter.update(inv.getReputation(repId))
        unSpentId = self.getUnspent()
        amt = inv.getStackQuantity(unSpentId)
        if unSpentId in self.localMods:
            amt = self.localMods[unSpentId]
        self.unspent['text'] = PLocalizer.SkillPageUnspentPoints % amt
        if amt > 0:
            self.unspent['text_fg'] = (0.8, 1, 0.8, 1)
        else:
            self.unspent['text_fg'] = (1, 1, 1, 1)
        comboSkills = RadialMenu.ComboSkills(repId, 1)
        totalComboSkills = RadialMenu.ComboSkills(repId, 0)
        activeSkills = RadialMenu.ActiveSkills(repId, 1)
        totalActiveSkills = RadialMenu.ActiveSkills(repId, 0)
        passiveSkills = RadialMenu.PassiveSkills(repId, 1)
        totalPassiveSkills = RadialMenu.PassiveSkills(repId, 0)
        self.linkedSkillIds = {}
        linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
        if linkedSkills:
            for skillId in linkedSkills:
                realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
                self.linkedSkillIds[realSkillId] = skillId

        for excludedSkillId in self.EXCLUDED_SKILLS:
            for skillId in activeSkills:
                if excludedSkillId == skillId:
                    activeSkills.remove(skillId)
                    totalActiveSkills.remove(skillId)

        for spot in self.skillFrames.keys():
            if spot not in totalComboSkills:
                self.skillFrames[spot].hide()

        count = 0
        for skill in totalComboSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            showIcon = skill in comboSkills or skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                skill = self.linkedSkillIds[skill]
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = 0.2 + 0.175 * count
            y = 1.11
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton[
                        'command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' +
                        WeaponGlobals.getSkillName(skill), 5
                    ]
            count += 1

        count = 0
        for skill in totalActiveSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            xMod, yMod = self.ringOffset(count)
            xMod *= 0.9
            yMod *= 0.9
            showIcon = skill in activeSkills or skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                skill = self.linkedSkillIds[skill]
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = xMod + 0.53
            y = yMod + 0.615
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton[
                        'command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' +
                        WeaponGlobals.getSkillName(skill), 5
                    ]
            ammo = self.getAmmo(skill)
            if ammo != None and showIcon:
                self.skillFrames[skill].showQuantity = True
                self.skillFrames[skill].updateQuantity(ammo)
            count += 1

        count = 0
        for skill in totalPassiveSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            showIcon = skill in passiveSkills or skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                skill = self.linkedSkillIds[skill]
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = 0.2 + 0.175 * count
            y = 0.15
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton[
                        'command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' +
                        WeaponGlobals.getSkillName(skill), 5
                    ]
            count += 1

        self.dataChanged = False
        return

    def hide(self):
        if self.tabBar:
            self.tabBar.stash()
        InventoryPage.InventoryPage.hide(self)

    def makeBoostDisplay(self, skillId, points):
        if skillId == InventoryType.SailPowerRecharge:
            return
        if skillId not in self.skillFrames:
            return
        if skillId not in self.boostDisplays:
            self.backFrames[skillId] = DirectLabel(
                parent=self.skillFrames[skillId],
                pos=(0.04, 0, -0.04),
                frameColor=(0.21, 0.125, 0.035, 1),
                frameSize=(-0.023, 0.023, -0.023, 0.023))
            self.boostDisplays[skillId] = DirectLabel(
                parent=self.skillFrames[skillId],
                text='',
                text_scale=PiratesGuiGlobals.TextScaleMed,
                text_pos=(0.0, -0.01),
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(0.04, 0, -0.04),
                frameColor=(0, 0, 0, 1),
                frameSize=(-0.02, 0.02, -0.02, 0.02))
            self.backFrames[skillId].setBin('gui-fixed', 1)
            self.boostDisplays[skillId].setBin('gui-fixed', 1)
        itemBoost = 0
        if localAvatar.currentWeaponId:
            if skillId in ItemGlobals.getLinkedSkills(
                    localAvatar.currentWeaponId):
                linkedSkillId = WeaponGlobals.getLinkedSkillId(skillId)
                itemBoost = ItemGlobals.getWeaponBoosts(
                    localAvatar.currentWeaponId, linkedSkillId)
                itemBoost += ItemGlobals.getWeaponBoosts(
                    localAvatar.getCurrentCharm(), linkedSkillId)
            else:
                itemBoost = ItemGlobals.getWeaponBoosts(
                    localAvatar.currentWeaponId, skillId)
                itemBoost += ItemGlobals.getWeaponBoosts(
                    localAvatar.getCurrentCharm(), skillId)
        elif localAvatar.getCurrentCharm():
            itemBoost += ItemGlobals.getWeaponBoosts(
                localAvatar.getCurrentCharm(), skillId)
        shipBoost = 0
        if localAvatar.ship:
            shipBoost = localAvatar.ship.getSkillBoost(skillId)
        if itemBoost or shipBoost:
            self.boostDisplays[skillId]['text'] = str(points + itemBoost +
                                                      shipBoost)
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG11
            return
        self.boostDisplays[skillId]['text'] = str(points)
        if points == 5:
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG18
        else:
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG2

    def removeBoostDisplay(self, skillId):
        boostDisplay = self.boostDisplays.pop(skillId, None)
        if boostDisplay:
            boostDisplay.destroy()
        backFrame = self.backFrames.pop(skillId, None)
        if backFrame:
            backFrame.destroy()
        return

    def addPoint(self, skillId):
        if skillId == InventoryType.SailPowerRecharge:
            return
        inv = localAvatar.getInventory()
        frameSkillId = skillId
        skillId = WeaponGlobals.getLinkedSkillId(frameSkillId)
        if not skillId:
            skillId = frameSkillId
        if self.currentRep == InventoryType.CutlassRep and localAvatar.style.tutorial < PiratesGlobals.TUT_GOT_CUTLASS:
            if inv.getStackQuantity(InventoryType.CutlassSweep) < 2:
                if skillId != InventoryType.CutlassSweep:
                    return
            elif skillId == InventoryType.CutlassSweep:
                messenger.send('skillImprovementAttempted')
        unSpentId = self.getUnspent()
        unSp = inv.getStackQuantity(unSpentId)
        if unSpentId in self.localMods:
            unSp = self.localMods[unSpentId]
        if unSp < 1:
            return
        if inv.getStackLimit(skillId):
            curAmt = inv.getStackQuantity(skillId)
            if skillId in self.localMods:
                curAmt = self.localMods[skillId]
            if curAmt > 5:
                return
            else:
                curAmt += 1
        else:
            return
        self.__handleFreeDialog()
        if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
            if curAmt > Freebooter.FreeSkillCap:
                self.spentDialog = PDialog.PDialog(
                    text=PLocalizer.FreebooterSkillMax,
                    style=OTPDialog.CancelOnly,
                    command=self.__handleFreeDialog)
                return
            playerExp = inv.getAccumulator(self.currentRep)
            categoryLevel, extra = ReputationGlobals.getLevelFromTotalReputation(
                self.currentRep, playerExp)
            alreadySpent = categoryLevel - 1 - unSp
            if alreadySpent > 5:
                self.spentDialog = PDialog.PDialog(
                    text=PLocalizer.FreebooterSkillLock,
                    style=OTPDialog.CancelOnly,
                    command=self.__handleFreeDialog)
                return
        if not base.config.GetBool('want-combo-skips', 0):
            comboSkills = [
                InventoryType.CutlassSlash, InventoryType.CutlassCleave,
                InventoryType.CutlassFlourish, InventoryType.CutlassStab,
                InventoryType.DaggerSwipe, InventoryType.DaggerGouge,
                InventoryType.DaggerEviscerate
            ]
            if skillId in comboSkills and inv.getStackQuantity(skillId -
                                                               1) <= 1:
                base.localAvatar.guiMgr.createWarning(
                    PLocalizer.ComboOrderWarn, PiratesGuiGlobals.TextFG6)
                return
        messenger.send('skillImprovementAttempted')
        localAvatar.spendSkillPoint(skillId)
        self.localMods[skillId] = curAmt
        self.localMods[unSpentId] = unSp - 1
        self.skillFrames[frameSkillId].skillRank = curAmt - 1

    def createFrame(self,
                    skillId,
                    skillPts,
                    upgradeMode=0,
                    freeLock=False,
                    showIcon=True):
        skillRank = max(0, skillPts - 1)
        if skillId in self.skillFrames:
            button = self.skillFrames[skillId]
            showUpgrade = upgradeMode and showIcon
            button.setShowUpgrade(showUpgrade)
            button.setShowIcon(showIcon)
            button.setShowLock(freeLock)
            button.show()
        else:
            button = SkillButton(skillId,
                                 self.addPoint,
                                 0,
                                 skillRank,
                                 showHelp=True,
                                 showIcon=showIcon,
                                 showLock=freeLock)
            showUpgrade = upgradeMode and showIcon
            button.setShowUpgrade(showUpgrade)
            button.reparentTo(self)
            self.skillFrames[skillId] = button
        button.skillButton['image_scale'] = 0.12
        if skillPts == 1:
            self.skillFrames[skillId]['text_fg'] = (0.5, 0.5, 0.5, 1)
            self.skillFrames[skillId].skillButton.setColorScale(1, 1, 1, 0.5)
        else:
            self.skillFrames[skillId]['text_fg'] = (1, 1, 1, 1)
            self.skillFrames[skillId].skillButton.clearColorScale()

    def getAmmo(self, skillId):
        ammoId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
        if ammoId == None:
            return
        else:
            amount = localAvatar.getInventory().getStackQuantity(ammoId)
            return amount
        return

    def setRep(self, repId):
        self.currentRep = repId

    def getRep(self):
        return self.currentRep

    def updateUnspent(self, category, value):
        if category in self.localMods:
            del self.localMods[category]
        self.dataChanged = True
        self.update(self.currentRep)

    def updateSkillUnlock(self, skillId):
        self.dataChanged = True
        self.update(self.currentRep)

    def getUnspent(self):
        if self.currentRep == InventoryType.CutlassRep:
            return InventoryType.UnspentCutlass
        elif self.currentRep == InventoryType.DaggerRep:
            return InventoryType.UnspentDagger
        elif self.currentRep == InventoryType.PistolRep:
            return InventoryType.UnspentPistol
        elif self.currentRep == InventoryType.GrenadeRep:
            return InventoryType.UnspentGrenade
        elif self.currentRep == InventoryType.DollRep:
            return InventoryType.UnspentDoll
        elif self.currentRep == InventoryType.WandRep:
            return InventoryType.UnspentWand
        elif self.currentRep == InventoryType.SailingRep:
            return InventoryType.UnspentSailing
        else:
            return InventoryType.UnspentCannon

    def ringOffset(self, num):
        if num == 0:
            return (-0.175, 0.175)
        elif num == 1:
            return (0.0, 0.25)
        elif num == 2:
            return (0.175, 0.175)
        elif num == 3:
            return (0.25, 0.0)
        elif num == 4:
            return (0.175, -0.175)
        elif num == 5:
            return (0.0, -0.25)
        elif num == 6:
            return (-0.175, -0.175)
        elif num == 7:
            return (-0.25, 0.0)
        else:
            return self.ringOffset(num % 8)

    def slideOpenPrecall(self):
        self.dataChanged = True
        self.update()

    def respec(self, weaponRep):
        listReset1 = WeaponGlobals.StartingSkills
        begin = -1
        end = -1
        unSpentId = -1
        if weaponRep == InventoryType.CutlassRep:
            begin = InventoryType.begin_WeaponSkillCutlass
            end = InventoryType.end_WeaponSkillCutlass
            unSpentId = InventoryType.UnspentCutlass
        else:
            if weaponRep == InventoryType.PistolRep:
                begin = InventoryType.begin_WeaponSkillPistol
                end = InventoryType.end_WeaponSkillPistol
                unSpentId = InventoryType.UnspentPistol
            else:
                if weaponRep == InventoryType.DaggerRep:
                    begin = InventoryType.begin_WeaponSkillDagger
                    end = InventoryType.end_WeaponSkillDagger
                    unSpentId = InventoryType.UnspentDagger
                elif weaponRep == InventoryType.GrenadeRep:
                    begin = InventoryType.begin_WeaponSkillGrenade
                    end = InventoryType.end_WeaponSkillGrenade
                    unSpentId = InventoryType.UnspentGrenade
                elif weaponRep == InventoryType.DollRep:
                    begin = InventoryType.begin_WeaponSkillDoll
                    end = InventoryType.end_WeaponSkillDoll
                    unSpentId = InventoryType.UnspentDoll
                elif weaponRep == InventoryType.WandRep:
                    begin = InventoryType.begin_WeaponSkillWand
                    end = InventoryType.end_WeaponSkillWand
                    unSpentId = InventoryType.UnspentWand
                elif weaponRep == InventoryType.SailingRep:
                    begin = InventoryType.begin_SkillSailing
                    end = InventoryType.end_SkillSailing
                    unSpentId = InventoryType.UnspentSailing
                elif weaponRep == InventoryType.CannonRep:
                    begin = InventoryType.begin_WeaponSkillCannon
                    end = InventoryType.end_WeaponSkillCannon
                    unSpentId = InventoryType.UnspentCannon
                else:
                    return
                inv = localAvatar.getInventory()
                extra = 0
                for skillId in range(begin, end):
                    if skillId in WeaponGlobals.DontResetSkills:
                        continue
                    curAmt = inv.getStackQuantity(skillId)
                    if skillId in self.localMods:
                        curAmt = self.localMods[skillId]
                    resetAmt = 1
                    if skillId in listReset1:
                        resetAmt = 2
                    if curAmt > resetAmt:
                        extra += curAmt - resetAmt
                        self.localMods[skillId] = resetAmt
                        if self.tabBar and skillId in self.skillFrames:
                            self.skillFrames[skillId].skillRank = resetAmt - 1
                        if self.tabBar:
                            if resetAmt > 1:
                                self.makeBoostDisplay(skillId, resetAmt - 1)
                            else:
                                self.removeBoostDisplay(skillId)
                        for linkedSkills in ItemGlobals.LinkedSkills.values():
                            for linkedSkillId in linkedSkills:
                                if skillId == WeaponGlobals.getLinkedSkillId(
                                        linkedSkillId):
                                    if self.tabBar and linkedSkillId in self.skillFrames:
                                        self.skillFrames[
                                            linkedSkillId].skillRank = resetAmt - 1
                                    if self.tabBar:
                                        if resetAmt > 1:
                                            self.makeBoostDisplay(
                                                linkedSkillId, resetAmt - 1)
                                        else:
                                            self.removeBoostDisplay(
                                                linkedSkillId)

            if unSpentId in self.localMods:
                self.localMods[unSpentId] += extra

    def showDemo(self):
        self.demo = True
        self.demoSeq = Sequence()
        comboSkills = [
            InventoryType.CutlassCleave, InventoryType.CutlassFlourish,
            InventoryType.CutlassStab
        ]
        activeSkills = [
            InventoryType.CutlassBrawl, InventoryType.CutlassTaunt,
            InventoryType.CutlassBladestorm
        ]
        passiveSkills = [
            InventoryType.CutlassParry, InventoryType.CutlassEndurance
        ]
        weapons = [
            InventoryType.PistolRep, InventoryType.DollRep,
            InventoryType.DaggerRep, InventoryType.GrenadeRep,
            InventoryType.WandRep
        ]
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        for i in range(0, 5):
            blinkInPar = Parallel()
            blinkOutPar = Parallel()
            blinkInPar2 = Parallel()
            blinkOutPar2 = Parallel()
            blinkSeq = Sequence()
            blinkSeq2 = Sequence()
            self.demoSeq.append(Wait(1.2))
            if i < len(comboSkills):
                self.demoSeq.append(
                    Func(self.skillFrames[comboSkills[i]].setShowIcon, True))
                blinkInPar.append(
                    LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5,
                                      Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(
                    LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(
                    LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5,
                                      Vec3(1.1, 1.1, 1.1)))
                blinkOutPar2.append(
                    LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
            if i < len(activeSkills):
                self.demoSeq.append(
                    Func(self.skillFrames[activeSkills[i]].setShowIcon, True))
                blinkInPar.append(
                    LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5,
                                      Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(
                    LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(
                    LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5,
                                      Vec3(1.1, 1.1, 1.1)))
                blinkOutPar2.append(
                    LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
            if i < len(passiveSkills):
                self.demoSeq.append(
                    Func(self.skillFrames[passiveSkills[i]].setShowIcon, True))
                blinkInPar.append(
                    LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5,
                                      Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(
                    LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(
                    LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5,
                                      Vec3(1.1, 1.1, 1.1)))
                blinkOutPar2.append(
                    LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5,
                                      Vec3(1.0, 1.0, 1.0)))
            self.createTab(weapons[i])
            self.tabBar.getTab(str(weapons[i])).hide()
            self.demoSeq.append(Func(self.tabBar.getTab(str(weapons[i])).show))
            blinkInPar.append(
                LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5,
                                  Vec3(1.25, 1.25, 1.25)))
            blinkOutPar.append(
                LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5,
                                  Vec3(1.0, 1.0, 1.0)))
            blinkInPar2.append(
                LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5,
                                  Vec3(1.1, 1.1, 1.1)))
            blinkOutPar2.append(
                LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5,
                                  Vec3(1.0, 1.0, 1.0)))
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq2.append(blinkInPar2)
            blinkSeq2.append(blinkOutPar2)
            blinkSeq.append(Func(blinkSeq2.loop))
            self.demoSeq.append(Func(blinkSeq.start))
            self.blinkSeqs.append(blinkSeq)
            self.blinkSeqs2.append(blinkSeq2)

        self.demoSeq.start()

    def removeDemo(self):
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None
        for blinkSeq in self.blinkSeqs:
            blinkSeq.finish()
            blinkSeq = None

        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.finish()
            blinkSeq = None

        self.blinkSeqs2 = []
        if self.tabBar:
            self.tabBar.removeTab(str(InventoryType.PistolRep))
            self.tabBar.removeTab(str(InventoryType.DollRep))
            self.tabBar.removeTab(str(InventoryType.DaggerRep))
            self.tabBar.removeTab(str(InventoryType.GrenadeRep))
            self.tabBar.removeTab(str(InventoryType.WandRep))
        self.demo = False
        return
Exemplo n.º 10
0
 def createGui(self):
     itemId = self.data[0]
     (item, quantity) = self.data
     name = ItemGlobals.getName(item)
     itemType = ItemGlobals.getType(item)
     itemTypeName = name
     repCategory = ItemGlobals.getItemRepId(itemId)
     if quantity:
         repValue = localAvatar.getInventory().getReputation(repCategory)
         self.repMeter = ReputationMeter(repCategory,
                                         width=0.66000000000000003)
         self.repMeter.setPos(0.62, 0, 0.041000000000000002)
         self.repMeter.update(repValue)
         self.repMeter.reparentTo(self)
         self.repMeter.flattenLight()
         hotkeyLabel = ''
         hotkeys = ()
         desc = PLocalizer.WeaponDescriptions.get(itemId)
         helpText = PLocalizer.InventoryTypeNames[repCategory]
         self.weaponButton = CombatTray.WeaponButton(
             hotkeys=hotkeys,
             hotkeyLabel=hotkeyLabel,
             helpOpaque=True,
             helpText=helpText,
             parent=self,
             showQuant=0,
             pos=(0.10000000000000001, 0, -0.02),
             scale=1.1000000000000001)
         self.weaponButton.ignoreHotkeys()
         self.weaponButton.setWeaponId(itemId)
         self.weaponButton['extraArgs'] = [itemId]
         self.weaponButton.helpDelay = 0
         self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
         self.desc = DirectLabel(
             parent=self,
             relief=None,
             state=DGG.DISABLED,
             text=PLocalizer.WeaponAlreadyUnlocked,
             text_scale=PiratesGuiGlobals.TextScaleSmall,
             text_align=TextNode.ALeft,
             text_fg=PiratesGuiGlobals.TextFG2,
             text_shadow=PiratesGuiGlobals.TextShadow,
             pos=(0.28999999999999998, 0, -0.0050000000000000001),
             text_font=PiratesGlobals.getInterfaceFont())
     else:
         self.repMeter = None
         name = PLocalizer.makeHeadingString(
             PLocalizer.InventoryTypeNames[repCategory], 2)
         self.categoryLabel = DirectLabel(
             parent=self,
             relief=None,
             text=name,
             text_scale=PiratesGuiGlobals.TextScaleLarge,
             text_align=TextNode.ALeft,
             text_shadow=PiratesGuiGlobals.TextShadow,
             pos=(0.28999999999999998, 0, 0.059999999999999998),
             textMayChange=0)
         self.weaponButton = CombatTray.WeaponButton(
             parent=self,
             state=DGG.DISABLED,
             showQuant=0,
             scale=1.1000000000000001)
         self.weaponButton.setPos(0.10000000000000001, 0, -0.02)
         self.weaponButton.setWeaponId(itemId)
         self.weaponButton.helpDelay = 0
         self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
         unlockDesc = PLocalizer.WeaponUnlockText[repCategory]
         self.desc = DirectLabel(
             parent=self,
             relief=None,
             state=DGG.DISABLED,
             text=unlockDesc,
             text_scale=PiratesGuiGlobals.TextScaleSmall,
             text_align=TextNode.ALeft,
             text_fg=PiratesGuiGlobals.TextFG2,
             text_shadow=PiratesGuiGlobals.TextShadow,
             pos=(0.28999999999999998, 0, 0.025000000000000001),
             text_font=PiratesGlobals.getInterfaceFont())
         self.setColorScale(0.40000000000000002, 0.40000000000000002,
                            0.40000000000000002, 1, 1)
Exemplo n.º 11
0
class WeaponPanel(DirectFrame):
    width = PiratesGuiGlobals.InventoryInfoWidth
    height = PiratesGuiGlobals.InventoryInfoHeight
    guiLoaded = False
    topGui = None
    genericButton = None
    weaponIcons = None
    skillIcons = None
    kbButton = None
    MeterFrame = None

    def __init__(self, data, key, **kw):
        self.data = data
        self.key = key
        self.loadGui()
        DirectFrame.__init__(self, parent=NodePath())
        self.initialiseoptions(WeaponPanel)
        self.createGui()

    def destroyGui(self):
        pass

    def loadGui(self):
        if WeaponPanel.guiLoaded:
            return None

        WeaponPanel.topGui = loader.loadModel('models/gui/toplevel_gui')
        WeaponPanel.genericButton = (
            WeaponPanel.topGui.find('**/generic_button'),
            WeaponPanel.topGui.find('**/generic_button_down'),
            WeaponPanel.topGui.find('**/generic_button_over'),
            WeaponPanel.topGui.find('**/generic_button_disabled'))
        WeaponPanel.weaponIcons = loader.loadModel(
            'models/gui/gui_icons_weapon')
        WeaponPanel.skillIcons = loader.loadModel(
            'models/textureCards/skillIcons')
        WeaponPanel.kbButton = WeaponPanel.topGui.find('**/keyboard_button')
        WeaponPanel.MeterFrame = loader.loadModel('models/gui/ship_battle')
        WeaponPanel.guiLoaded = True

    def createGui(self):
        itemId = self.data[0]
        (item, quantity) = self.data
        name = ItemGlobals.getName(item)
        itemType = ItemGlobals.getType(item)
        itemTypeName = name
        repCategory = ItemGlobals.getItemRepId(itemId)
        if quantity:
            repValue = localAvatar.getInventory().getReputation(repCategory)
            self.repMeter = ReputationMeter(repCategory,
                                            width=0.66000000000000003)
            self.repMeter.setPos(0.62, 0, 0.041000000000000002)
            self.repMeter.update(repValue)
            self.repMeter.reparentTo(self)
            self.repMeter.flattenLight()
            hotkeyLabel = ''
            hotkeys = ()
            desc = PLocalizer.WeaponDescriptions.get(itemId)
            helpText = PLocalizer.InventoryTypeNames[repCategory]
            self.weaponButton = CombatTray.WeaponButton(
                hotkeys=hotkeys,
                hotkeyLabel=hotkeyLabel,
                helpOpaque=True,
                helpText=helpText,
                parent=self,
                showQuant=0,
                pos=(0.10000000000000001, 0, -0.02),
                scale=1.1000000000000001)
            self.weaponButton.ignoreHotkeys()
            self.weaponButton.setWeaponId(itemId)
            self.weaponButton['extraArgs'] = [itemId]
            self.weaponButton.helpDelay = 0
            self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
            self.desc = DirectLabel(
                parent=self,
                relief=None,
                state=DGG.DISABLED,
                text=PLocalizer.WeaponAlreadyUnlocked,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_align=TextNode.ALeft,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(0.28999999999999998, 0, -0.0050000000000000001),
                text_font=PiratesGlobals.getInterfaceFont())
        else:
            self.repMeter = None
            name = PLocalizer.makeHeadingString(
                PLocalizer.InventoryTypeNames[repCategory], 2)
            self.categoryLabel = DirectLabel(
                parent=self,
                relief=None,
                text=name,
                text_scale=PiratesGuiGlobals.TextScaleLarge,
                text_align=TextNode.ALeft,
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(0.28999999999999998, 0, 0.059999999999999998),
                textMayChange=0)
            self.weaponButton = CombatTray.WeaponButton(
                parent=self,
                state=DGG.DISABLED,
                showQuant=0,
                scale=1.1000000000000001)
            self.weaponButton.setPos(0.10000000000000001, 0, -0.02)
            self.weaponButton.setWeaponId(itemId)
            self.weaponButton.helpDelay = 0
            self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
            unlockDesc = PLocalizer.WeaponUnlockText[repCategory]
            self.desc = DirectLabel(
                parent=self,
                relief=None,
                state=DGG.DISABLED,
                text=unlockDesc,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_align=TextNode.ALeft,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(0.28999999999999998, 0, 0.025000000000000001),
                text_font=PiratesGlobals.getInterfaceFont())
            self.setColorScale(0.40000000000000002, 0.40000000000000002,
                               0.40000000000000002, 1, 1)

    def destroy(self):
        taskMgr.remove('helpInfoTask')
        taskMgr.remove(self.taskName('dragTask'))
        DirectFrame.destroy(self)

    def getData(self):
        return self.data

    def bringToFront(self):
        self.reparentTo(self.getParent())
 def updateSkillTray(self, rep, weaponMode, callback = None, hideFirst = True):
     if rep == InventoryType.MeleeRep:
         return None
     
     if not callback:
         callback = localAvatar.guiMgr.combatTray.triggerSkillTraySkill
     
     if taskMgr.hasTaskNamed('updateSkillTray'):
         taskMgr.remove('updateSkillTray')
     
     if self.skillTrayState and hideFirst:
         self.hideSkillTray()
         taskMgr.doMethodLater(0.75, self.updateSkillTray, 'updateSkillTray', extraArgs = [
             rep,
             weaponMode,
             callback])
         return None
     
     text = PLocalizer.InventoryTypeNames.get(rep, 'Unknown')
     for i in range(self.numberOfItems):
         self.tray[i + 1].destroy()
     
     self.tray = { }
     if self.repMeter:
         self.repMeter.destroy()
     
     self.rep = rep
     self.weaponMode = weaponMode
     self.callback = callback
     linkedSkillIds = { }
     linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
     for skillId in linkedSkills:
         realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
         linkedSkillIds[realSkillId] = skillId
     
     skillMap = []
     self.origMap = getAllSkills(self.rep, 2, wantWeaponSkill = 1)
     for i in range(len(self.origMap)):
         skillMap.append(self.origMap[i][0])
     
     self.traySkillMap = skillMap
     self.numberOfItems = len(self.traySkillMap)
     self.skillTray.setX(0)
     if self.rep != InventoryType.DefenseCannonRep:
         self.repMeter = ReputationMeter(self.rep, width = 0.69999999999999996)
         self.repMeter.setScale(1.1499999999999999, 1.1499999999999999, 1.1499999999999999)
         self.repMeter.reparentTo(self.skillTray)
         self.repMeter.setCategory(self.rep)
     
     inv = base.localAvatar.getInventory()
     if inv is None:
         return None
     
     if self.repMeter:
         self.repMeter.update(inv.getReputation(self.rep))
     
     x = 0.0
     offset = 0.0
     for i in range(self.numberOfItems):
         if self.origMap[i][1] == False:
             locked = False
             if locked:
                 image = (self.SkillIcons.find('**/base'), self.SkillIcons.find('**/base_down'), self.SkillIcons.find('**/base_over'))
             else:
                 image = self.SkillIcons.find('**/base')
             button = DirectButton(parent = self.skillTray, relief = None, state = DGG.DISABLED, image = image, image_pos = (0.0, 0.0, 0.059999999999999998), image_scale = 0.12, image_color = (0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.55000000000000004), sortOrder = 100, pos = (x, 0, -0.0))
             button.setTransparency(1)
             button.showQuantity = False
             button.greyOut = -1
             button.showRing = False
             button.skillStatus = False
             if locked:
                 lock = DirectFrame(parent = button, relief = None, image = self.lockArt, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, 0.035000000000000003))
                 button['state'] = DGG.NORMAL
                 button['command'] = base.localAvatar.guiMgr.showNonPayer
                 button['extraArgs'] = [
                     'Restricted_Radial_Menu',
                     5]
             
             self.tray[i + 1] = button
             x = x + 0.14999999999999999
             if i < self.numberOfItems - 1:
                 offset = offset + 0.01
                 self.skillTray.setX(self.skillTray.getX() - 0.074999999999999997)
             
         i < self.numberOfItems - 1
         if self.origMap[i][1] == True:
             skillId = self.traySkillMap[i]
             if linkedSkillIds.has_key(skillId):
                 skillId = linkedSkillIds[skillId]
             
             name = PLocalizer.InventoryTypeNames[skillId]
             hotkey = str(i + 1)
             totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, skillId)
             timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(skillId)
             if not timeSpentRecharging:
                 timeSpentRecharging = 0
             
             if weaponMode not in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF, WeaponGlobals.DEFENSE_CANNON) and skillId in WeaponGlobals.SpecialSkills or WeaponGlobals.getSkillReputationCategoryId(skillId) not in (InventoryType.PistolRep, InventoryType.WandRep, InventoryType.CannonRep, InventoryType.GrenadeRep, InventoryType.DefenseCannonRep):
                 showRing = True
             else:
                 showRing = False
             locked = self.origMap[i][2]
             if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                 button = AmmoSkillButton(skillId, i, self.callback, 99, 0, showQuantity = True, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
             else:
                 button = SkillButton(skillId, self.callback, 0, 0, showQuantity = False, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
             button.skillStatus = True
             if locked:
                 button.skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                 button.skillButton['extraArgs'] = [
                     'Restricted_Radial_Menu',
                     5]
             
             if showRing:
                 button.skillRing.meterFaceHalf1.setScale(0.95999999999999996)
                 button.skillRing.meterFaceHalf2.setScale(0.95999999999999996)
             
             button.reparentTo(self.skillTray)
             button.setPos(x, 0, 0.070000000000000007)
             self.tray[i + 1] = button
             if weaponMode in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF):
                 lastAmmo = localAvatar.guiMgr.combatTray.lastAmmoSkillId.get(localAvatar.currentWeaponId)
                 if lastAmmo is not None:
                     if lastAmmo == skillId:
                         button.toggleButton(True)
                     
                 elif self.tray[1].skillStatus is True:
                     self.tray[1].toggleButton(True)
                 
             
             if self.weaponMode in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
                 inv = localAvatar.getInventory()
                 maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                 if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                     ammoAmt = WeaponGlobals.INF_QUANT
                 else:
                     ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                     ammoAmt = inv.getStackQuantity(ammoInvId)
                     ammoMax = inv.getStackLimit(ammoInvId)
                     button.showQuantity = True
                     button.updateQuantity(ammoAmt)
             
             x = x + 0.17000000000000001
             if i < self.numberOfItems - 1:
                 if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                     self.skillTray.setX(self.skillTray.getX() - 0.072499999999999995)
                 else:
                     self.skillTray.setX(self.skillTray.getX() - 0.085000000000000006)
             
         i < self.numberOfItems - 1
     
     currentX = self.skillTray.getX()
     self.skillTray.setX(currentX + float(offset))
     if self.repMeter:
         self.repMeter.setPos(-currentX, 0.0, -0.11)
     
     self.updateSkillTrayStates()
     if weaponMode == WeaponGlobals.DEFENSE_CANNON:
         self.setMoveUpValue(0.34499999999999997)
     else:
         self.resetMoveUpVale()
     self.showSkillTray()
Exemplo n.º 13
0
class WeaponPage(InventoryPage.InventoryPage):
    def __init__(self):
        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(WeaponPage)
        self.weaponPanels = {}
        self.tonicButtons = {}
        self.fishingIcon = None
        self.potionIcon = None
        self.fishingRepMeter = None
        self.potionRepMeter = None
        self.fishingPoleName = None
        self.fishingChangeMsg = None
        self.needRefresh = 1
        self.showing = 0

    def show(self):
        self.showing = 1
        InventoryPage.InventoryPage.show(self)
        if self.needRefresh:
            self.refreshList()
            self.needRefresh = 0

    def hide(self):
        self.showing = 0
        self.equipStatus = 0
        InventoryPage.InventoryPage.hide(self)

    def tonicCallback(self, skillId):
        localAvatar.guiMgr.combatTray.trySkill(InventoryType.UseItem, skillId, 0)

    def rePanel(self, inventory):
        if not self.showing:
            self.needRefresh = 1
            return None

        skillTokens = {
            InventoryType.CutlassToken: (ItemGlobals.RUSTY_CUTLASS,),
            InventoryType.PistolToken: (ItemGlobals.FLINTLOCK_PISTOL,),
            InventoryType.DollToken: (ItemGlobals.VOODOO_DOLL,),
            InventoryType.DaggerToken: (ItemGlobals.BASIC_DAGGER,),
            InventoryType.GrenadeToken: (ItemGlobals.GRENADE_POUCH,),
            InventoryType.WandToken: (ItemGlobals.CURSED_STAFF,),
        }
        zIndex = 1
        for skillTokenKey in TOKEN_LIST:
            quantity = 0
            if localAvatar.getInventory().stacks.get(skillTokenKey):
                quantity = 1

            skillData = skillTokens[skillTokenKey]
            weaponId = skillData[0]
            key = None
            panel = WeaponPanel.WeaponPanel((weaponId, quantity), key)
            panel.reparentTo(self)
            panel.setZ(PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999 - zIndex * panel.height)
            zIndex += 1
            repCat = WeaponGlobals.getRepId(weaponId)
            self.weaponPanels[repCat] = panel
            self.ignore("inventoryQuantity-%s" % inventory.getDoId())
            self.acceptOnce("inventoryQuantity-%s-%s" % (inventory.getDoId(), skillTokenKey), self.refreshList)

        repIcon_gui = loader.loadModel("models/textureCards/skillIcons")
        repIcon = repIcon_gui.find("**/box_base")
        if config.GetBool("want-fishing-game", 0):
            self.fishingIcon = GuiButton(
                pos=(
                    0.16600000000000001,
                    0,
                    0.044999999999999998
                    + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999)
                    - zIndex * panel.height,
                ),
                helpText=PLocalizer.FishingRepDescription,
                helpOpaque=True,
                image=(repIcon, repIcon, repIcon, repIcon),
                image_scale=(0.14399999999999999, 0.14399999999999999, 0.14399999999999999),
            )
            fishIconCard = loader.loadModel("models/textureCards/fishing_icons")
            inv = localAvatar.getInventory()
            fishingChangeMsg = InventoryGlobals.getCategoryQuantChangeMsg(inv.doId, InventoryType.FishingRod)
            if self.fishingChangeMsg:
                self.ignore(fishingChangeMsg)

            self.fishingChangeMsg = fishingChangeMsg
            self.acceptOnce(fishingChangeMsg, self.refreshList)
            rodIcons = ["pir_t_gui_fsh_smRodIcon", "pir_t_gui_fsh_mdRodIcon", "pir_t_gui_fsh_lgRodIcon"]
            rodLvl = inv.getStackQuantity(InventoryType.FishingRod)
            rodIcon = rodIcons[rodLvl - 1]
            rodText = PLocalizer.FishingRodNames[rodLvl]
            if rodLvl >= 1:
                self.fishingIcon["geom"] = fishIconCard.find("**/" + rodIcon)

            self.fishingIcon["geom_scale"] = 0.10000000000000001
            self.fishingIcon["geom_pos"] = (0, 0, 0)
            self.fishingIcon.reparentTo(self)
            fishingRepValue = localAvatar.getInventory().getReputation(InventoryType.FishingRep)
            self.fishingRepMeter = ReputationMeter(InventoryType.FishingRep, width=0.66000000000000003)
            self.fishingRepMeter.setPos(
                0.62,
                0,
                0.041000000000000002
                + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999)
                - zIndex * panel.height,
            )
            self.fishingRepMeter.update(fishingRepValue)
            self.fishingRepMeter.reparentTo(self)
            self.fishingRepMeter.flattenLight()
            self.fishingPoleName = DirectLabel(
                parent=self,
                relief=None,
                state=DGG.DISABLED,
                text=rodText,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_align=TextNode.ALeft,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(
                    0.28999999999999998,
                    0,
                    -0.0050000000000000001
                    + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999)
                    - 7 * panel.height,
                ),
                text_font=PiratesGlobals.getInterfaceFont(),
            )
            self.fishingPoleName.reparentTo(self)
            zIndex += 1

        iconCard = loader.loadModel("models/textureCards/skillIcons")
        if config.GetBool("want-potion-game", 0):
            self.potionIcon = GuiButton(
                pos=(
                    0.16600000000000001,
                    0,
                    0.044999999999999998
                    + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999)
                    - zIndex * panel.height,
                ),
                helpText=PLocalizer.PotionRepDescription,
                helpOpaque=True,
                image=(repIcon, repIcon, repIcon, repIcon),
                image_scale=(0.14399999999999999, 0.14399999999999999, 0.14399999999999999),
            )
            self.potionIcon["geom"] = iconCard.find("**/pir_t_gui_pot_base")
            self.potionIcon["geom_scale"] = 0.10000000000000001
            self.potionIcon["geom_pos"] = (0, 0, 0)
            self.potionIcon.reparentTo(self)
            potionRepValue = localAvatar.getInventory().getReputation(InventoryType.PotionsRep)
            self.potionRepMeter = ReputationMeter(InventoryType.PotionsRep, width=0.66000000000000003)
            self.potionRepMeter.setPos(
                0.62,
                0,
                0.041000000000000002
                + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999)
                - zIndex * panel.height,
            )
            self.potionRepMeter.update(potionRepValue)
            self.potionRepMeter.reparentTo(self)
            self.potionRepMeter.flattenLight()
            zIndex += 1

        items = dict(map(lambda x: (x.getType(), x.getCount()), inventory.getConsumables().values()))
        possibleItems = ItemGlobals.getAllHealthIds()
        havePorky = items.get(ItemGlobals.ROAST_PORK)
        if not havePorky and ItemGlobals.ROAST_PORK in possibleItems:
            possibleItems.remove(ItemGlobals.ROAST_PORK)

        offset = 0
        if base.config.GetBool("want-potion-game", 0):
            items = inventory.getConsumables()
            listLength = len(InventoryType.PotionMinigamePotions)
            count = 0
            for i in range(listLength):
                tonicId = InventoryType.PotionMinigamePotions[i]
                if items.get(tonicId):
                    button = SkillButton(
                        tonicId, self.tonicCallback, items.get(tonicId), showQuantity=True, showHelp=True, showRing=True
                    )
                    button.skillButton["geom_scale"] = 0.080000000000000002
                    x = 0.16 * (count % 6) + -1.2
                    z = 1.0 - int(count / 6) * 0.16
                    button.setPos(x, 0, z)
                    button.reparentTo(self)
                    self.tonicButtons[tonicId] = button
                    count += 1
                    continue

    def refreshList(self, newWeaponId=None):
        for panel in self.weaponPanels.values():
            panel.destroy()

        for panel in self.tonicButtons.values():
            panel.destroy()

        if self.fishingIcon is not None:
            self.fishingIcon.destroy()

        if self.potionIcon is not None:
            self.potionIcon.destroy()

        if self.fishingRepMeter is not None:
            self.fishingRepMeter.destroy()

        if self.potionRepMeter is not None:
            self.potionRepMeter.destroy()

        if self.fishingPoleName is not None:
            self.fishingPoleName.destroy()

        inventory = localAvatar.getInventory()
        if inventory:
            if inventory.isReady():
                self.rePanel(inventory)
            else:
                self.ignore("inventoryReady-%s" % inventory.getDoId())
                self.acceptOnce("inventoryReady-%s" % inventory.getDoId(), self.rePanel)

    def destroy(self):
        if self.fishingChangeMsg:
            self.ignore(self.fishingChangeMsg)

        InventoryPage.InventoryPage.destroy(self)

    def updateTonics(self):
        if not hasattr(base, "localAvatar"):
            return None

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

        possibleTonics = ItemGlobals.getAllHealthIds()
        for tonicId in possibleTonics:
            tonicAmt = inv.getItemQuantity(InventoryType.ItemTypeConsumable, tonicId)
            if self.tonicButtons.has_key(tonicId):
                self.tonicButtons[tonicId].updateQuantity(tonicAmt)
                self.tonicButtons[tonicId].checkAmount()
                continue
Exemplo n.º 14
0
class SkillPage(InventoryPage.InventoryPage):
    MAX_UPGRADE_DOTS = 5
    EXCLUDED_SKILLS = [
        InventoryType.CannonGrappleHook]
    notify = DirectNotifyGlobal.directNotify.newCategory('SkillPage')
    SkillIcons = None
    WeaponIcons = None
    TopGui = None
    DotTex = None
    FrameTex = None
    
    def __init__(self):
        if not SkillPage.SkillIcons:
            SkillPage.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            SkillPage.WeaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
            SkillPage.DotTex = SkillPage.SkillIcons.find('**/skill_tree_level_dot')
            SkillPage.FrameTex = SkillPage.SkillIcons.find('**/skill_tree_level_ring')
        
        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(SkillPage)
        self.tabBar = None
        self.currentRep = InventoryType.CannonRep
        self.skillFrames = { }
        self.boostDisplays = { }
        self.backFrames = { }
        self.lastUserSelectedTab = None
        self.dataChanged = True
        self.spentDialog = None
        self.localMods = { }
        self.demo = False
        self.demoSeq = None
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        ornament = loader.loadModel('models/gui/gui_skill_window')
        ornament.find('**/pPlane81').detachNode()
        ornament.find('**/pPlane83').detachNode()
        ornament.find('**/pPlane84').detachNode()
        ornament.find('**/pPlane93').detachNode()
        ornament.setScale(0.32500000000000001, 0, 0.32000000000000001)
        ornament.setPos(0.54000000000000004, 0, 0.71999999999999997)
        ornament.flattenStrong()
        ornament.reparentTo(self)
        self.box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
        box = loader.loadModel('models/gui/gui_title_box').find('**/gui_title_box_top')
        box.setPos(0.55000000000000004, 0, 1.26)
        box.setScale(0.32500000000000001, 0.0, 0.25)
        box.reparentTo(ornament)
        ornament.flattenStrong()
        self.repMeter = ReputationMeter(self.getRep(), width = 0.69999999999999996)
        self.repMeter.reparentTo(self)
        self.repMeter.setPos(0.55000000000000004, 0, 1.24)
        self.unspent = DirectLabel(parent = self, relief = None, text = PLocalizer.SkillPageUnspentPoints % 0, text_scale = 0.040000000000000001, text_align = TextNode.ACenter, text_pos = (0, -0.01), text_fg = (1, 1, 1, 1), pos = (0.80000000000000004, 0, 0.02))

    
    def destroy(self):
        for spot in self.skillFrames.keys():
            self.skillFrames[spot].destroy()
        
        if self.tabBar:
            self.tabBar.destroy()
            self.tabBar = None
        
        self._SkillPage__handleFreeDialog()
        InventoryPage.InventoryPage.destroy(self)
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None
        
        for blinkSeq in self.blinkSeqs:
            blinkSeq.pause()
            blinkSeq = None
        
        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.pause()
            blinkSeq = None
        
        self.blinkSeqs2 = []

    
    def _SkillPage__handleFreeDialog(self, value = None):
        if self.spentDialog:
            self.spentDialog.destroy()
            self.spentDialog = None
        

    
    def createTabs(self):
        
        def invArrived(inventory):
            if not inventory:
                inventoryId = base.localAvatar.getInventoryId()
                self.getInventory(inventoryId, invArrived)
                return None
            
            repIds = [
                InventoryType.CannonRep,
                InventoryType.SailingRep]
            tokenReps = ([
                InventoryType.CutlassToken,
                InventoryType.CutlassRep], [
                InventoryType.PistolToken,
                InventoryType.PistolRep], [
                InventoryType.DaggerToken,
                InventoryType.DaggerRep], [
                InventoryType.GrenadeToken,
                InventoryType.GrenadeRep], [
                InventoryType.WandToken,
                InventoryType.WandRep], [
                InventoryType.DollToken,
                InventoryType.DollRep])
            for tokenRep in tokenReps:
                token = tokenRep[0]
                repId = tokenRep[1]
                if inventory.getStackQuantity(token):
                    repIds.append(repId)
                    continue
            
            for repId in repIds:
                tab = self.tabBar.getTab(str(repId))
                if not tab:
                    self.createTab(repId)
                    continue
                tab.show()
            
            if localAvatar.guiMgr.ignoreAllButSkillHotKey:
                self.tabBar.tabs[str(InventoryType.CannonRep)].hide()
                self.tabBar.tabs[str(InventoryType.SailingRep)].hide()
            

        inventoryId = base.localAvatar.getInventoryId()
        self.getInventory(inventoryId, invArrived)

    
    def createTab(self, repId):
        newTab = self.tabBar.addTab(str(repId), frameSize = (-0.12, 0.12, -0.11, 0.11), focusSize = (-0.12, 0.12, -0.12, 0.12), heightFactor = 0.55000000000000004, command = self.update, extraArgs = [
            repId,
            1])
        if repId == InventoryType.SailingRep:
            model = SkillPage.SkillIcons
        else:
            model = SkillPage.WeaponIcons
        asset = ReputationGlobals.RepIcons.get(repId)
        image = model.find('**/%s' % asset)
        name = PLocalizer.InventoryTypeNames[repId]
        newTab.nameTag = DirectLabel(parent = newTab, relief = None, state = DGG.DISABLED, image = image, image_scale = 0.10000000000000001, image_color = Vec4(0.80000000000000004, 0.80000000000000004, 0.80000000000000004, 1), image_pos = Vec3(-0.14999999999999999, 0.0, 0.0), pos = (0, 0, 0))
        
        def mouseOver(tab = newTab):
            tab.nameTag.setScale(1.1000000000000001)
            tab.nameTag['image_color'] = Vec4(1, 1, 1, 1)
            base.playSfx(PiratesGuiGlobals.getDefaultRolloverSound())

        
        def mouseOff(tab = newTab):
            if not tab['selected']:
                tab.nameTag.setScale(1.0)
                tab.nameTag['image_color'] = Vec4(0.80000000000000004, 0.80000000000000004, 0.80000000000000004, 1)
            else:
                mouseOver(tab)

        newTab['mouseEntered'] = mouseOver
        newTab['mouseLeft'] = mouseOff

    
    def show(self):
        if self.tabBar == None:
            self.tabBar = localAvatar.guiMgr.chestPanel.makeTabBar()
        else:
            self.tabBar.unstash()
        self.createTabs()
        InventoryPage.InventoryPage.show(self)
        self.update()
                # failed block decompiling. FIXME

    
    def update(self, repId = None, fromUser = 0):
        inv = localAvatar.getInventory()
        if not inv:
            self.notify.warning('SkillPage unable to find inventory')
            return None
        
        if self.tabBar == None:
            return None
        
        if self.demo:
            return None
        
        if fromUser:
            self.lastUserSelectedTab = repId
        
        if repId == None:
            if localAvatar.getGameState() == 'Fishing':
                if self.lastUserSelectedTab:
                    repId = self.lastUserSelectedTab
                else:
                    repId = InventoryType.CannonRep
            elif localAvatar.cannon:
                repId = InventoryType.CannonRep
            elif localAvatar.gameFSM.state == 'ShipPilot':
                repId = InventoryType.SailingRep
            elif localAvatar.currentWeaponId and localAvatar.isWeaponDrawn:
                repId = WeaponGlobals.getRepId(localAvatar.currentWeaponId)
            elif localAvatar.currentWeaponId and not (localAvatar.isWeaponDrawn) and self.lastUserSelectedTab:
                repId = self.lastUserSelectedTab
            else:
                repId = InventoryType.CannonRep
        
        self.setRep(repId)
        self.tabBar.selectTab(str(repId))
        self.repMeter.setCategory(repId)
        self.repMeter.update(inv.getReputation(repId))
        unSpentId = self.getUnspent()
        amt = inv.getStackQuantity(unSpentId)
        if unSpentId in self.localMods:
            amt = self.localMods[unSpentId]
        
        self.unspent['text'] = PLocalizer.SkillPageUnspentPoints % amt
        if amt > 0:
            self.unspent['text_fg'] = (0.80000000000000004, 1, 0.80000000000000004, 1)
        else:
            self.unspent['text_fg'] = (1, 1, 1, 1)
        comboSkills = RadialMenu.ComboSkills(repId, 1)
        totalComboSkills = RadialMenu.ComboSkills(repId, 0)
        activeSkills = RadialMenu.ActiveSkills(repId, 1)
        totalActiveSkills = RadialMenu.ActiveSkills(repId, 0)
        passiveSkills = RadialMenu.PassiveSkills(repId, 1)
        totalPassiveSkills = RadialMenu.PassiveSkills(repId, 0)
        self.linkedSkillIds = { }
        linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
        if linkedSkills:
            for skillId in linkedSkills:
                realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
                self.linkedSkillIds[realSkillId] = skillId
            
        
        for excludedSkillId in self.EXCLUDED_SKILLS:
            for skillId in activeSkills:
                if excludedSkillId == skillId:
                    activeSkills.remove(skillId)
                    totalActiveSkills.remove(skillId)
                    continue
            
        
        for spot in self.skillFrames.keys():
            if spot not in totalComboSkills:
                self.skillFrames[spot].hide()
                continue
        
        count = 0
        for skill in totalComboSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            
            if not skill in comboSkills:
                pass
            showIcon = skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
                
            
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                
                skill = self.linkedSkillIds[skill]
            
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = 0.20000000000000001 + 0.17499999999999999 * count
            y = 1.1100000000000001
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' + WeaponGlobals.getSkillName(skill),
                        5]
                
            
            count += 1
        
        count = 0
        for skill in totalActiveSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            
            (xMod, yMod) = self.ringOffset(count)
            xMod *= 0.90000000000000002
            yMod *= 0.90000000000000002
            if not skill in activeSkills:
                pass
            showIcon = skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
                
            
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                
                skill = self.linkedSkillIds[skill]
            
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = xMod + 0.53000000000000003
            y = yMod + 0.61499999999999999
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' + WeaponGlobals.getSkillName(skill),
                        5]
                
            
            ammo = self.getAmmo(skill)
            if ammo != None and showIcon:
                self.skillFrames[skill].showQuantity = True
                self.skillFrames[skill].updateQuantity(ammo)
            
            count += 1
        
        count = 0
        for skill in totalPassiveSkills:
            skillPts = inv.getStackQuantity(skill)
            if skill in self.localMods:
                skillPts = self.localMods[skill]
            
            if not skill in passiveSkills:
                pass
            showIcon = skillPts > 0
            freeLock = False
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    freeLock = True
                
            
            if self.linkedSkillIds.has_key(skill):
                if self.skillFrames.has_key(skill):
                    self.skillFrames[skill].hide()
                
                skill = self.linkedSkillIds[skill]
            
            self.createFrame(skill, skillPts, amt, freeLock, showIcon)
            x = 0.20000000000000001 + 0.17499999999999999 * count
            y = 0.14999999999999999
            self.skillFrames[skill].setPos(x, 0, y)
            if showIcon and skillPts > 1:
                self.makeBoostDisplay(skill, skillPts - 1)
            
            if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
                if not WeaponGlobals.canFreeUse(skill):
                    self.skillFrames[skill].skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                    self.skillFrames[skill].skillButton['extraArgs'] = [
                        'Restricted_Skill_' + WeaponGlobals.getSkillName(skill),
                        5]
                
            
            count += 1
        
        self.dataChanged = False

    
    def hide(self):
        if self.tabBar:
            self.tabBar.stash()
        
        InventoryPage.InventoryPage.hide(self)

    
    def makeBoostDisplay(self, skillId, points):
        if skillId == InventoryType.SailPowerRecharge:
            return None
        
        if skillId not in self.skillFrames:
            return None
        
        if skillId not in self.boostDisplays:
            self.backFrames[skillId] = DirectLabel(parent = self.skillFrames[skillId], pos = (0.040000000000000001, 0, -0.040000000000000001), frameColor = (0.20999999999999999, 0.125, 0.035000000000000003, 1), frameSize = (-0.023, 0.023, -0.023, 0.023))
            self.boostDisplays[skillId] = DirectLabel(parent = self.skillFrames[skillId], text = '', text_scale = PiratesGuiGlobals.TextScaleMed, text_pos = (0.0, -0.01), text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.040000000000000001, 0, -0.040000000000000001), frameColor = (0, 0, 0, 1), frameSize = (-0.02, 0.02, -0.02, 0.02))
            self.backFrames[skillId].setBin('gui-fixed', 1)
            self.boostDisplays[skillId].setBin('gui-fixed', 1)
        
        itemBoost = 0
        if localAvatar.currentWeaponId:
            if skillId in ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId):
                linkedSkillId = WeaponGlobals.getLinkedSkillId(skillId)
                itemBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, linkedSkillId)
                itemBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), linkedSkillId)
            else:
                itemBoost = ItemGlobals.getWeaponBoosts(localAvatar.currentWeaponId, skillId)
                itemBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), skillId)
        elif localAvatar.getCurrentCharm():
            itemBoost += ItemGlobals.getWeaponBoosts(localAvatar.getCurrentCharm(), skillId)
        
        shipBoost = 0
        if localAvatar.ship:
            shipBoost = localAvatar.ship.getSkillBoost(skillId)
        
        if itemBoost or shipBoost:
            self.boostDisplays[skillId]['text'] = str(points + itemBoost + shipBoost)
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG11
            return None
        
        self.boostDisplays[skillId]['text'] = str(points)
        if points == 5:
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG18
        else:
            self.boostDisplays[skillId]['text_fg'] = PiratesGuiGlobals.TextFG2

    
    def removeBoostDisplay(self, skillId):
        boostDisplay = self.boostDisplays.pop(skillId, None)
        if boostDisplay:
            boostDisplay.destroy()
        
        backFrame = self.backFrames.pop(skillId, None)
        if backFrame:
            backFrame.destroy()
        

    
    def addPoint(self, skillId):
        if skillId == InventoryType.SailPowerRecharge:
            return None
        
        inv = localAvatar.getInventory()
        frameSkillId = skillId
        skillId = WeaponGlobals.getLinkedSkillId(frameSkillId)
        if not skillId:
            skillId = frameSkillId
        
        if self.currentRep == InventoryType.CutlassRep and localAvatar.style.tutorial < PiratesGlobals.TUT_GOT_CUTLASS:
            if inv.getStackQuantity(InventoryType.CutlassSweep) < 2:
                if skillId != InventoryType.CutlassSweep:
                    return None
                
            elif skillId == InventoryType.CutlassSweep:
                messenger.send('skillImprovementAttempted')
            
        
        unSpentId = self.getUnspent()
        unSp = inv.getStackQuantity(unSpentId)
        if unSpentId in self.localMods:
            unSp = self.localMods[unSpentId]
        
        if unSp < 1:
            return None
        
        if inv.getStackLimit(skillId):
            curAmt = inv.getStackQuantity(skillId)
            if skillId in self.localMods:
                curAmt = self.localMods[skillId]
            
            if curAmt > 5:
                return None
            else:
                curAmt += 1
        else:
            return None
        self._SkillPage__handleFreeDialog()
        if not Freebooter.getPaidStatus(base.localAvatar.getDoId()):
            if curAmt > Freebooter.FreeSkillCap:
                self.spentDialog = PDialog.PDialog(text = PLocalizer.FreebooterSkillMax, style = OTPDialog.CancelOnly, command = self._SkillPage__handleFreeDialog)
                return None
            
            playerExp = inv.getAccumulator(self.currentRep)
            (categoryLevel, extra) = ReputationGlobals.getLevelFromTotalReputation(self.currentRep, playerExp)
            alreadySpent = categoryLevel - 1 - unSp
            if alreadySpent > 5:
                self.spentDialog = PDialog.PDialog(text = PLocalizer.FreebooterSkillLock, style = OTPDialog.CancelOnly, command = self._SkillPage__handleFreeDialog)
                return None
            
        
        if not base.config.GetBool('want-combo-skips', 0):
            comboSkills = [
                InventoryType.CutlassSlash,
                InventoryType.CutlassCleave,
                InventoryType.CutlassFlourish,
                InventoryType.CutlassStab,
                InventoryType.DaggerSwipe,
                InventoryType.DaggerGouge,
                InventoryType.DaggerEviscerate]
            if skillId in comboSkills and inv.getStackQuantity(skillId - 1) <= 1:
                base.localAvatar.guiMgr.createWarning(PLocalizer.ComboOrderWarn, PiratesGuiGlobals.TextFG6)
                return None
            
        
        messenger.send('skillImprovementAttempted')
        localAvatar.spendSkillPoint(skillId)
        self.localMods[skillId] = curAmt
        self.localMods[unSpentId] = unSp - 1
        self.skillFrames[frameSkillId].skillRank = curAmt - 1

    
    def createFrame(self, skillId, skillPts, upgradeMode = 0, freeLock = False, showIcon = True):
        skillRank = max(0, skillPts - 1)
        if skillId in self.skillFrames:
            button = self.skillFrames[skillId]
            if upgradeMode:
                pass
            showUpgrade = showIcon
            button.setShowUpgrade(showUpgrade)
            button.setShowIcon(showIcon)
            button.setShowLock(freeLock)
            button.show()
        else:
            button = SkillButton(skillId, self.addPoint, 0, skillRank, showHelp = True, showIcon = showIcon, showLock = freeLock)
            if upgradeMode:
                pass
            showUpgrade = showIcon
            button.setShowUpgrade(showUpgrade)
            button.reparentTo(self)
            self.skillFrames[skillId] = button
        button.skillButton['image_scale'] = 0.12
        if skillPts == 1:
            self.skillFrames[skillId]['text_fg'] = (0.5, 0.5, 0.5, 1)
            self.skillFrames[skillId].skillButton.setColorScale(1, 1, 1, 0.5)
        else:
            self.skillFrames[skillId]['text_fg'] = (1, 1, 1, 1)
            self.skillFrames[skillId].skillButton.clearColorScale()

    
    def getAmmo(self, skillId):
        ammoId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
        if ammoId == None:
            return None
        else:
            amount = localAvatar.getInventory().getStackQuantity(ammoId)
            return amount

    
    def setRep(self, repId):
        self.currentRep = repId

    
    def getRep(self):
        return self.currentRep

    
    def updateUnspent(self, category, value):
        if category in self.localMods:
            del self.localMods[category]
        
        self.dataChanged = True
        self.update(self.currentRep)

    
    def updateSkillUnlock(self, skillId):
        self.dataChanged = True
        self.update(self.currentRep)

    
    def getUnspent(self):
        if self.currentRep == InventoryType.CutlassRep:
            return InventoryType.UnspentCutlass
        elif self.currentRep == InventoryType.DaggerRep:
            return InventoryType.UnspentDagger
        elif self.currentRep == InventoryType.PistolRep:
            return InventoryType.UnspentPistol
        elif self.currentRep == InventoryType.GrenadeRep:
            return InventoryType.UnspentGrenade
        elif self.currentRep == InventoryType.DollRep:
            return InventoryType.UnspentDoll
        elif self.currentRep == InventoryType.WandRep:
            return InventoryType.UnspentWand
        elif self.currentRep == InventoryType.SailingRep:
            return InventoryType.UnspentSailing
        else:
            return InventoryType.UnspentCannon

    
    def ringOffset(self, num):
        if num == 0:
            return (-0.17499999999999999, 0.17499999999999999)
        elif num == 1:
            return (0.0, 0.25)
        elif num == 2:
            return (0.17499999999999999, 0.17499999999999999)
        elif num == 3:
            return (0.25, 0.0)
        elif num == 4:
            return (0.17499999999999999, -0.17499999999999999)
        elif num == 5:
            return (0.0, -0.25)
        elif num == 6:
            return (-0.17499999999999999, -0.17499999999999999)
        elif num == 7:
            return (-0.25, 0.0)
        else:
            return self.ringOffset(num % 8)

    
    def slideOpenPrecall(self):
        self.dataChanged = True
        self.update()

    
    def respec(self, weaponRep):
        listReset1 = WeaponGlobals.StartingSkills
        begin = -1
        end = -1
        unSpentId = -1
        if weaponRep == InventoryType.CutlassRep:
            begin = InventoryType.begin_WeaponSkillCutlass
            end = InventoryType.end_WeaponSkillCutlass
            unSpentId = InventoryType.UnspentCutlass
        elif weaponRep == InventoryType.PistolRep:
            begin = InventoryType.begin_WeaponSkillPistol
            end = InventoryType.end_WeaponSkillPistol
            unSpentId = InventoryType.UnspentPistol
        elif weaponRep == InventoryType.DaggerRep:
            begin = InventoryType.begin_WeaponSkillDagger
            end = InventoryType.end_WeaponSkillDagger
            unSpentId = InventoryType.UnspentDagger
        elif weaponRep == InventoryType.GrenadeRep:
            begin = InventoryType.begin_WeaponSkillGrenade
            end = InventoryType.end_WeaponSkillGrenade
            unSpentId = InventoryType.UnspentGrenade
        elif weaponRep == InventoryType.DollRep:
            begin = InventoryType.begin_WeaponSkillDoll
            end = InventoryType.end_WeaponSkillDoll
            unSpentId = InventoryType.UnspentDoll
        elif weaponRep == InventoryType.WandRep:
            begin = InventoryType.begin_WeaponSkillWand
            end = InventoryType.end_WeaponSkillWand
            unSpentId = InventoryType.UnspentWand
        elif weaponRep == InventoryType.SailingRep:
            begin = InventoryType.begin_SkillSailing
            end = InventoryType.end_SkillSailing
            unSpentId = InventoryType.UnspentSailing
        elif weaponRep == InventoryType.CannonRep:
            begin = InventoryType.begin_WeaponSkillCannon
            end = InventoryType.end_WeaponSkillCannon
            unSpentId = InventoryType.UnspentCannon
        else:
            return None
        inv = localAvatar.getInventory()
        extra = 0
        for skillId in range(begin, end):
            if skillId in WeaponGlobals.DontResetSkills:
                continue
            
            curAmt = inv.getStackQuantity(skillId)
            if skillId in self.localMods:
                curAmt = self.localMods[skillId]
            
            resetAmt = 1
            if skillId in listReset1:
                resetAmt = 2
            
            if curAmt > resetAmt:
                extra += curAmt - resetAmt
                self.localMods[skillId] = resetAmt
                if self.tabBar and skillId in self.skillFrames:
                    self.skillFrames[skillId].skillRank = resetAmt - 1
                
                if self.tabBar:
                    if resetAmt > 1:
                        self.makeBoostDisplay(skillId, resetAmt - 1)
                    else:
                        self.removeBoostDisplay(skillId)
                
                for linkedSkills in ItemGlobals.LinkedSkills.values():
                    for linkedSkillId in linkedSkills:
                        if skillId == WeaponGlobals.getLinkedSkillId(linkedSkillId):
                            if self.tabBar and linkedSkillId in self.skillFrames:
                                self.skillFrames[linkedSkillId].skillRank = resetAmt - 1
                            
                            if self.tabBar:
                                if resetAmt > 1:
                                    self.makeBoostDisplay(linkedSkillId, resetAmt - 1)
                                else:
                                    self.removeBoostDisplay(linkedSkillId)
                            
                    
                
        
        if unSpentId in self.localMods:
            self.localMods[unSpentId] += extra
        

    
    def showDemo(self):
        self.demo = True
        self.demoSeq = Sequence()
        comboSkills = [
            InventoryType.CutlassCleave,
            InventoryType.CutlassFlourish,
            InventoryType.CutlassStab]
        activeSkills = [
            InventoryType.CutlassBrawl,
            InventoryType.CutlassTaunt,
            InventoryType.CutlassBladestorm]
        passiveSkills = [
            InventoryType.CutlassParry,
            InventoryType.CutlassEndurance]
        weapons = [
            InventoryType.PistolRep,
            InventoryType.DollRep,
            InventoryType.DaggerRep,
            InventoryType.GrenadeRep,
            InventoryType.WandRep]
        self.blinkSeqs = []
        self.blinkSeqs2 = []
        for i in range(0, 5):
            blinkInPar = Parallel()
            blinkOutPar = Parallel()
            blinkInPar2 = Parallel()
            blinkOutPar2 = Parallel()
            blinkSeq = Sequence()
            blinkSeq2 = Sequence()
            self.demoSeq.append(Wait(1.2))
            if i < len(comboSkills):
                self.demoSeq.append(Func(self.skillFrames[comboSkills[i]].setShowIcon, True))
                blinkInPar.append(LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5, Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)))
                blinkOutPar2.append(LerpScaleInterval(self.skillFrames[comboSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
            
            if i < len(activeSkills):
                self.demoSeq.append(Func(self.skillFrames[activeSkills[i]].setShowIcon, True))
                blinkInPar.append(LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5, Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)))
                blinkOutPar2.append(LerpScaleInterval(self.skillFrames[activeSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
            
            if i < len(passiveSkills):
                self.demoSeq.append(Func(self.skillFrames[passiveSkills[i]].setShowIcon, True))
                blinkInPar.append(LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5, Vec3(1.25, 1.25, 1.25)))
                blinkOutPar.append(LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
                blinkInPar2.append(LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)))
                blinkOutPar2.append(LerpScaleInterval(self.skillFrames[passiveSkills[i]], 0.5, Vec3(1.0, 1.0, 1.0)))
            
            self.createTab(weapons[i])
            self.tabBar.getTab(str(weapons[i])).hide()
            self.demoSeq.append(Func(self.tabBar.getTab(str(weapons[i])).show))
            blinkInPar.append(LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5, Vec3(1.25, 1.25, 1.25)))
            blinkOutPar.append(LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5, Vec3(1.0, 1.0, 1.0)))
            blinkInPar2.append(LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5, Vec3(1.1000000000000001, 1.1000000000000001, 1.1000000000000001)))
            blinkOutPar2.append(LerpScaleInterval(self.tabBar.getTab(str(weapons[i])), 0.5, Vec3(1.0, 1.0, 1.0)))
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq.append(blinkInPar)
            blinkSeq.append(blinkOutPar)
            blinkSeq2.append(blinkInPar2)
            blinkSeq2.append(blinkOutPar2)
            blinkSeq.append(Func(blinkSeq2.loop))
            self.demoSeq.append(Func(blinkSeq.start))
            self.blinkSeqs.append(blinkSeq)
            self.blinkSeqs2.append(blinkSeq2)
        
        self.demoSeq.start()

    
    def removeDemo(self):
        if self.demoSeq:
            self.demoSeq.pause()
            self.demoSeq = None
        
        for blinkSeq in self.blinkSeqs:
            blinkSeq.finish()
            blinkSeq = None
        
        self.blinkSeqs = []
        for blinkSeq in self.blinkSeqs2:
            blinkSeq.finish()
            blinkSeq = None
        
        self.blinkSeqs2 = []
        if self.tabBar:
            self.tabBar.removeTab(str(InventoryType.PistolRep))
            self.tabBar.removeTab(str(InventoryType.DollRep))
            self.tabBar.removeTab(str(InventoryType.DaggerRep))
            self.tabBar.removeTab(str(InventoryType.GrenadeRep))
            self.tabBar.removeTab(str(InventoryType.WandRep))
        
        self.demo = False
class DefenseCannonGUI(CannonGUI):
    notify = DirectNotifyGlobal.directNotify.newCategory('DefenseCannonGUI')
    
    def __init__(self, cannon):
        CannonGUI.__init__(self, cannon)
        self.exitEvent = None
        self._DefenseCannonGUI__dialog = None
        self.helpButton = None
        self.helpUI = None
        self.flashHelp = None
        self.ammoFade = None
        self._DefenseCannonGUI__ammoCountersHidden = False
        self.setupExtraButtons()
        self.exitCannon['command'] = self.showExitDialog
        self.volleyLabel.setPos(-0.28000000000000003, 0, 0.089999999999999997)
        self.reloadBar.setPos(-0.13, 0, 0.080000000000000002)
        self.ammoImage.setPos(-0.38, 0, 0.059999999999999998)
        self.repMeter = ReputationMeter(InventoryType.DefenseCannonRep, width = 0.69999999999999996)
        self.repMeter.reparentTo(base.a2dBottomCenter)
        self.repMeter.setPos(0.0, 0.0, 0.025000000000000001)
        self.hud = CannonDefenseHUD()
        self.hud.create()
        self._exp = 0
        self.lastLevel = 1
        self.accept('incDefenseCannonExp', self.increaseExp)
        if __dev__:
            base.dcg = self
        

    
    def destroy(self):
        if self.ammoFade:
            self.ammoFade.finish()
            self.ammoFade = None
        
        if self.flashHelp:
            self.flashHelp.finish()
            self.flashHelp = None
        
        if self.helpButton:
            self.helpButton.destroy()
            self.helpButton = None
        
        if self.helpUI:
            self.helpUI.destroy()
            self.helpUI = None
        
        if self.hud:
            self.hud.destroy()
            self.hud = None
        
        base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_MINIGAME_CANNON)
        self.repMeter.destroy()
        self.ignore('incDefenseCannonExp')
        CannonGUI.destroy(self)

    
    def setupExtraButtons(self):
        weaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
        self.helpButton = DirectButton(parent = base.a2dBottomRight, relief = None, pos = (-0.59999999999999998, 0, 0.089999999999999997), scale = 0.5, text = '?', text_pos = (0, -0.055), text_scale = 0.20999999999999999, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_font = PiratesGlobals.getPirateBoldOutlineFont(), sortOrder = 2, command = self.toggleHelpUI)
        DirectLabel(parent = self.helpButton, text = PLocalizer.CannonDefense['Help'], text_pos = (0, -0.14999999999999999), text_scale = 0.080000000000000002, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, text_font = PiratesGlobals.getPirateBoldOutlineFont(), frameColor = (1, 1, 1, 0))

    
    def increaseExp(self, amt, total):
        self._exp += amt
        if self._exp > total:
            return None
        
        (level, leftoverValue) = ReputationGlobals.getLevelFromTotalReputation(InventoryType.DefenseCannonRep, self._exp)
        self.repMeter.update(self._exp)
        if level > self.lastLevel:
            base.localAvatar.levelUpMsg(InventoryType.DefenseCannonRep, level, 0)
            self.lastLevel = level
        

    
    def toggleHelpUI(self):
        if self.helpUI == None:
            self._DefenseCannonGUI__createHelpUI()
            self.fadeOutAmmoCounters()
            if self.cannon.ammoPanel.state == pirates.minigame.AmmoPanel.CLOSED:
                self.cannon.ammoPanel.onTabClick()
            
        else:
            self._DefenseCannonGUI__destroyHelpUI()
            self.fadeInAmmoCounters()
            if self.cannon.ammoPanel.state == pirates.minigame.AmmoPanel.OPENED:
                self.cannon.ammoPanel.onTabClick()
            

    
    def _DefenseCannonGUI__createHelpUI(self):
        self.helpUI = CannonDefenseHelpManager(0.5)
        self.helpUI.exit.reparentTo(self.exitCannon)
        self.helpUI.exit.setScale(2.0)
        self.helpUI.help.reparentTo(self.helpButton)
        self.helpUI.help.setScale(2.0)
        self.helpUI.ammoPanel.reparentTo(self.cannon.ammoPanel.panel)
        self.helpUI.ammoPanel.setScale(1.0 / 3.0)
        self.helpUI.ammo.reparentTo(base.a2dBottomCenter)
        self.helpUI.mine.reparentTo(self.hud.goldRemainingUI.mineCounter)
        self.helpUI.mine.setScale(2.0 / 3.0)
        self.helpUI.wave.reparentTo(self.hud.timeRemainingUI.timeRemaining)
        self.helpUI.wave.setScale(1.0 / 0.75)
        self.helpUI.fadeIn.start()

    
    def _DefenseCannonGUI__destroyHelpUI(self):
        cleanup = Sequence(Func(self.helpUI.fadeIn.pause), self.helpUI.fadeOut, Func(self.helpUI.destroy), name = self.cannon.uniqueName('HelpUI_FadeIn'))
        cleanup.start()
        self.helpUI = None

    
    def isHelpUIVisible(self):
        return self.helpUI != None

    
    def flashHelpButton(self, delay = 0.20000000000000001, length = 5):
        if self.flashHelp:
            self.flashHelp.finish()
            self.flashHelp = None
        
        self.flashHelp = Sequence(name = self.cannon.uniqueName('HelpButton_Flash'))
        
        def setColor(key, value):
            self.helpButton[key] = value

        for i in range(0, length):
            self.flashHelp.append(Wait(delay))
            self.flashHelp.append(Func(setColor, 'text_fg', PiratesGuiGlobals.TextFG19))
            self.flashHelp.append(Wait(delay))
            self.flashHelp.append(Func(setColor, 'text_fg', PiratesGuiGlobals.TextFG2))
        
        self.flashHelp.start()

    
    def fadeOutAmmoCounters(self, length = 0.5):
        if self._DefenseCannonGUI__ammoCountersHidden:
            return None
        
        transparent = Vec4(1, 1, 1, 0)
        if self.ammoFade:
            self.ammoFade.finish()
        
        self.ammoFade = Parallel(self.volleyLabel.colorScaleInterval(length, transparent), self.reloadBar.colorScaleInterval(length, transparent), self.ammoImage.colorScaleInterval(length, transparent))
        self.ammoFade.start()
        self._DefenseCannonGUI__ammoCountersHidden = True

    
    def fadeInAmmoCounters(self, length = 0.5):
        if self._DefenseCannonGUI__ammoCountersHidden == False:
            return None
        
        opaque = Vec4(1, 1, 1, 1)
        transparent = Vec4(1, 1, 1, 0)
        if self.ammoFade:
            self.ammoFade.finish()
        
        self.ammoFade = Parallel(self.volleyLabel.colorScaleInterval(length, opaque, transparent), self.reloadBar.colorScaleInterval(length, opaque, transparent), self.ammoImage.colorScaleInterval(length, opaque, transparent))
        self.ammoFade.start()
        self._DefenseCannonGUI__ammoCountersHidden = False

    
    def showExitDialog(self):
        if self._DefenseCannonGUI__dialog == None:
            self._DefenseCannonGUI__dialog = PDialog(text = PLocalizer.CannonDefense['ExitCannon'], style = OTPDialog.YesNo, giveMouse = False, command = self._DefenseCannonGUI__onDialogItemSelected)
        else:
            self._DefenseCannonGUI__dialog.cleanup()
            self._DefenseCannonGUI__dialog = None

    
    def _DefenseCannonGUI__onDialogItemSelected(self, value):
        if value == 1:
            if self.exitEvent:
                self.exitEvent()
            
        
        self._DefenseCannonGUI__dialog.cleanup()
        self._DefenseCannonGUI__dialog = None
 def rePanel(self, inventory):
     if not self.showing:
         self.needRefresh = 1
         return None
     
     skillTokens = {
         InventoryType.CutlassToken: (ItemGlobals.RUSTY_CUTLASS,),
         InventoryType.PistolToken: (ItemGlobals.FLINTLOCK_PISTOL,),
         InventoryType.DollToken: (ItemGlobals.VOODOO_DOLL,),
         InventoryType.DaggerToken: (ItemGlobals.BASIC_DAGGER,),
         InventoryType.GrenadeToken: (ItemGlobals.GRENADE_POUCH,),
         InventoryType.WandToken: (ItemGlobals.CURSED_STAFF,) }
     zIndex = 1
     for skillTokenKey in TOKEN_LIST:
         quantity = 0
         if localAvatar.getInventory().stacks.get(skillTokenKey):
             quantity = 1
         
         skillData = skillTokens[skillTokenKey]
         weaponId = skillData[0]
         key = None
         panel = WeaponPanel.WeaponPanel((weaponId, quantity), key)
         panel.reparentTo(self)
         panel.setZ(PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999 - zIndex * panel.height)
         zIndex += 1
         repCat = WeaponGlobals.getRepId(weaponId)
         self.weaponPanels[repCat] = panel
         self.ignore('inventoryQuantity-%s' % inventory.getDoId())
         self.acceptOnce('inventoryQuantity-%s-%s' % (inventory.getDoId(), skillTokenKey), self.refreshList)
     
     repIcon_gui = loader.loadModel('models/textureCards/skillIcons')
     repIcon = repIcon_gui.find('**/box_base')
     if config.GetBool('want-fishing-game', 0):
         self.fishingIcon = GuiButton(pos = (0.16600000000000001, 0, 0.044999999999999998 + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999) - zIndex * panel.height), helpText = PLocalizer.FishingRepDescription, helpOpaque = True, image = (repIcon, repIcon, repIcon, repIcon), image_scale = (0.14399999999999999, 0.14399999999999999, 0.14399999999999999))
         fishIconCard = loader.loadModel('models/textureCards/fishing_icons')
         inv = localAvatar.getInventory()
         fishingChangeMsg = InventoryGlobals.getCategoryQuantChangeMsg(inv.doId, InventoryType.FishingRod)
         if self.fishingChangeMsg:
             self.ignore(fishingChangeMsg)
         
         self.fishingChangeMsg = fishingChangeMsg
         self.acceptOnce(fishingChangeMsg, self.refreshList)
         rodIcons = [
             'pir_t_gui_fsh_smRodIcon',
             'pir_t_gui_fsh_mdRodIcon',
             'pir_t_gui_fsh_lgRodIcon']
         rodLvl = inv.getStackQuantity(InventoryType.FishingRod)
         rodIcon = rodIcons[rodLvl - 1]
         rodText = PLocalizer.FishingRodNames[rodLvl]
         if rodLvl >= 1:
             self.fishingIcon['geom'] = fishIconCard.find('**/' + rodIcon)
         
         self.fishingIcon['geom_scale'] = 0.10000000000000001
         self.fishingIcon['geom_pos'] = (0, 0, 0)
         self.fishingIcon.reparentTo(self)
         fishingRepValue = localAvatar.getInventory().getReputation(InventoryType.FishingRep)
         self.fishingRepMeter = ReputationMeter(InventoryType.FishingRep, width = 0.66000000000000003)
         self.fishingRepMeter.setPos(0.62, 0, 0.041000000000000002 + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999) - zIndex * panel.height)
         self.fishingRepMeter.update(fishingRepValue)
         self.fishingRepMeter.reparentTo(self)
         self.fishingRepMeter.flattenLight()
         self.fishingPoleName = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = rodText, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, -0.0050000000000000001 + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999) - 7 * panel.height), text_font = PiratesGlobals.getInterfaceFont())
         self.fishingPoleName.reparentTo(self)
         zIndex += 1
     
     iconCard = loader.loadModel('models/textureCards/skillIcons')
     if config.GetBool('want-potion-game', 0):
         self.potionIcon = GuiButton(pos = (0.16600000000000001, 0, 0.044999999999999998 + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999) - zIndex * panel.height), helpText = PLocalizer.PotionRepDescription, helpOpaque = True, image = (repIcon, repIcon, repIcon, repIcon), image_scale = (0.14399999999999999, 0.14399999999999999, 0.14399999999999999))
         self.potionIcon['geom'] = iconCard.find('**/pir_t_gui_pot_base')
         self.potionIcon['geom_scale'] = 0.10000000000000001
         self.potionIcon['geom_pos'] = (0, 0, 0)
         self.potionIcon.reparentTo(self)
         potionRepValue = localAvatar.getInventory().getReputation(InventoryType.PotionsRep)
         self.potionRepMeter = ReputationMeter(InventoryType.PotionsRep, width = 0.66000000000000003)
         self.potionRepMeter.setPos(0.62, 0, 0.041000000000000002 + (PiratesGuiGlobals.InventoryPanelHeight - 0.17999999999999999) - zIndex * panel.height)
         self.potionRepMeter.update(potionRepValue)
         self.potionRepMeter.reparentTo(self)
         self.potionRepMeter.flattenLight()
         zIndex += 1
     
     items = dict(map(lambda x: (x.getType(), x.getCount()), inventory.getConsumables().values()))
     possibleItems = ItemGlobals.getAllHealthIds()
     havePorky = items.get(ItemGlobals.ROAST_PORK)
     if not havePorky and ItemGlobals.ROAST_PORK in possibleItems:
         possibleItems.remove(ItemGlobals.ROAST_PORK)
     
     offset = 0
     if base.config.GetBool('want-potion-game', 0):
         items = inventory.getConsumables()
         listLength = len(InventoryType.PotionMinigamePotions)
         count = 0
         for i in range(listLength):
             tonicId = InventoryType.PotionMinigamePotions[i]
             if items.get(tonicId):
                 button = SkillButton(tonicId, self.tonicCallback, items.get(tonicId), showQuantity = True, showHelp = True, showRing = True)
                 button.skillButton['geom_scale'] = 0.080000000000000002
                 x = 0.16 * (count % 6) + -1.2
                 z = 1.0 - int(count / 6) * 0.16
                 button.setPos(x, 0, z)
                 button.reparentTo(self)
                 self.tonicButtons[tonicId] = button
                 count += 1
                 continue
class WeaponPanel(DirectFrame):
    width = PiratesGuiGlobals.InventoryInfoWidth
    height = PiratesGuiGlobals.InventoryInfoHeight
    guiLoaded = False
    topGui = None
    genericButton = None
    weaponIcons = None
    skillIcons = None
    kbButton = None
    MeterFrame = None
    
    def __init__(self, data, key, **kw):
        self.data = data
        self.key = key
        self.loadGui()
        DirectFrame.__init__(self, parent = NodePath())
        self.initialiseoptions(WeaponPanel)
        self.createGui()

    
    def destroyGui(self):
        pass

    
    def loadGui(self):
        if WeaponPanel.guiLoaded:
            return None
        
        WeaponPanel.topGui = loader.loadModel('models/gui/toplevel_gui')
        WeaponPanel.genericButton = (WeaponPanel.topGui.find('**/generic_button'), WeaponPanel.topGui.find('**/generic_button_down'), WeaponPanel.topGui.find('**/generic_button_over'), WeaponPanel.topGui.find('**/generic_button_disabled'))
        WeaponPanel.weaponIcons = loader.loadModel('models/gui/gui_icons_weapon')
        WeaponPanel.skillIcons = loader.loadModel('models/textureCards/skillIcons')
        WeaponPanel.kbButton = WeaponPanel.topGui.find('**/keyboard_button')
        WeaponPanel.MeterFrame = loader.loadModel('models/gui/ship_battle')
        WeaponPanel.guiLoaded = True

    
    def createGui(self):
        itemId = self.data[0]
        (item, quantity) = self.data
        name = ItemGlobals.getName(item)
        itemType = ItemGlobals.getType(item)
        itemTypeName = name
        repCategory = ItemGlobals.getItemRepId(itemId)
        if quantity:
            repValue = localAvatar.getInventory().getReputation(repCategory)
            self.repMeter = ReputationMeter(repCategory, width = 0.66000000000000003)
            self.repMeter.setPos(0.62, 0, 0.041000000000000002)
            self.repMeter.update(repValue)
            self.repMeter.reparentTo(self)
            self.repMeter.flattenLight()
            hotkeyLabel = ''
            hotkeys = ()
            desc = PLocalizer.WeaponDescriptions.get(itemId)
            helpText = PLocalizer.InventoryTypeNames[repCategory]
            self.weaponButton = CombatTray.WeaponButton(hotkeys = hotkeys, hotkeyLabel = hotkeyLabel, helpOpaque = True, helpText = helpText, parent = self, showQuant = 0, pos = (0.10000000000000001, 0, -0.02), scale = 1.1000000000000001)
            self.weaponButton.ignoreHotkeys()
            self.weaponButton.setWeaponId(itemId)
            self.weaponButton['extraArgs'] = [
                itemId]
            self.weaponButton.helpDelay = 0
            self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
            self.desc = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = PLocalizer.WeaponAlreadyUnlocked, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, -0.0050000000000000001), text_font = PiratesGlobals.getInterfaceFont())
        else:
            self.repMeter = None
            name = PLocalizer.makeHeadingString(PLocalizer.InventoryTypeNames[repCategory], 2)
            self.categoryLabel = DirectLabel(parent = self, relief = None, text = name, text_scale = PiratesGuiGlobals.TextScaleLarge, text_align = TextNode.ALeft, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, 0.059999999999999998), textMayChange = 0)
            self.weaponButton = CombatTray.WeaponButton(parent = self, state = DGG.DISABLED, showQuant = 0, scale = 1.1000000000000001)
            self.weaponButton.setPos(0.10000000000000001, 0, -0.02)
            self.weaponButton.setWeaponId(itemId)
            self.weaponButton.helpDelay = 0
            self.weaponButton.helpPos = (0.12, 0, -0.040000000000000001)
            unlockDesc = PLocalizer.WeaponUnlockText[repCategory]
            self.desc = DirectLabel(parent = self, relief = None, state = DGG.DISABLED, text = unlockDesc, text_scale = PiratesGuiGlobals.TextScaleSmall, text_align = TextNode.ALeft, text_fg = PiratesGuiGlobals.TextFG2, text_shadow = PiratesGuiGlobals.TextShadow, pos = (0.28999999999999998, 0, 0.025000000000000001), text_font = PiratesGlobals.getInterfaceFont())
            self.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1, 1)

    
    def destroy(self):
        taskMgr.remove('helpInfoTask')
        taskMgr.remove(self.taskName('dragTask'))
        DirectFrame.destroy(self)

    
    def getData(self):
        return self.data

    
    def bringToFront(self):
        self.reparentTo(self.getParent())
Exemplo n.º 18
0
 def updateSkillTray(self, rep, weaponMode, callback = None, hideFirst = True):
     if rep == InventoryType.MeleeRep:
         return None
     
     if not callback:
         callback = localAvatar.guiMgr.combatTray.triggerSkillTraySkill
     
     if taskMgr.hasTaskNamed('updateSkillTray'):
         taskMgr.remove('updateSkillTray')
     
     if self.skillTrayState and hideFirst:
         self.hideSkillTray()
         taskMgr.doMethodLater(0.75, self.updateSkillTray, 'updateSkillTray', extraArgs = [
             rep,
             weaponMode,
             callback])
         return None
     
     text = PLocalizer.InventoryTypeNames.get(rep, 'Unknown')
     for i in range(self.numberOfItems):
         self.tray[i + 1].destroy()
     
     self.tray = { }
     if self.repMeter:
         self.repMeter.destroy()
     
     self.rep = rep
     self.weaponMode = weaponMode
     self.callback = callback
     linkedSkillIds = { }
     linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
     for skillId in linkedSkills:
         realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
         linkedSkillIds[realSkillId] = skillId
     
     skillMap = []
     self.origMap = getAllSkills(self.rep, 2, wantWeaponSkill = 1)
     for i in range(len(self.origMap)):
         skillMap.append(self.origMap[i][0])
     
     self.traySkillMap = skillMap
     self.numberOfItems = len(self.traySkillMap)
     self.skillTray.setX(0)
     if self.rep != InventoryType.DefenseCannonRep:
         self.repMeter = ReputationMeter(self.rep, width = 0.69999999999999996)
         self.repMeter.setScale(1.1499999999999999, 1.1499999999999999, 1.1499999999999999)
         self.repMeter.reparentTo(self.skillTray)
         self.repMeter.setCategory(self.rep)
     
     inv = base.localAvatar.getInventory()
     if inv is None:
         return None
     
     if self.repMeter:
         self.repMeter.update(inv.getReputation(self.rep))
     
     x = 0.0
     offset = 0.0
     for i in range(self.numberOfItems):
         if self.origMap[i][1] == False:
             locked = False
             if locked:
                 image = (self.SkillIcons.find('**/base'), self.SkillIcons.find('**/base_down'), self.SkillIcons.find('**/base_over'))
             else:
                 image = self.SkillIcons.find('**/base')
             button = DirectButton(parent = self.skillTray, relief = None, state = DGG.DISABLED, image = image, image_pos = (0.0, 0.0, 0.059999999999999998), image_scale = 0.12, image_color = (0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.55000000000000004), sortOrder = 100, pos = (x, 0, -0.0))
             button.setTransparency(1)
             button.showQuantity = False
             button.greyOut = -1
             button.showRing = False
             button.skillStatus = False
             if locked:
                 lock = DirectFrame(parent = button, relief = None, image = self.lockArt, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, 0.035000000000000003))
                 button['state'] = DGG.NORMAL
                 button['command'] = base.localAvatar.guiMgr.showNonPayer
                 button['extraArgs'] = [
                     'Restricted_Radial_Menu',
                     5]
             
             self.tray[i + 1] = button
             x = x + 0.14999999999999999
             if i < self.numberOfItems - 1:
                 offset = offset + 0.01
                 self.skillTray.setX(self.skillTray.getX() - 0.074999999999999997)
             
         i < self.numberOfItems - 1
         if self.origMap[i][1] == True:
             skillId = self.traySkillMap[i]
             if linkedSkillIds.has_key(skillId):
                 skillId = linkedSkillIds[skillId]
             
             name = PLocalizer.InventoryTypeNames[skillId]
             hotkey = str(i + 1)
             totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, skillId)
             timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(skillId)
             if not timeSpentRecharging:
                 timeSpentRecharging = 0
             
             if weaponMode not in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF, WeaponGlobals.DEFENSE_CANNON) and skillId in WeaponGlobals.SpecialSkills or WeaponGlobals.getSkillReputationCategoryId(skillId) not in (InventoryType.PistolRep, InventoryType.WandRep, InventoryType.CannonRep, InventoryType.GrenadeRep, InventoryType.DefenseCannonRep):
                 showRing = True
             else:
                 showRing = False
             locked = self.origMap[i][2]
             if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                 button = AmmoSkillButton(skillId, i, self.callback, 99, 0, showQuantity = True, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
             else:
                 button = SkillButton(skillId, self.callback, 0, 0, showQuantity = False, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
             button.skillStatus = True
             if locked:
                 button.skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                 button.skillButton['extraArgs'] = [
                     'Restricted_Radial_Menu',
                     5]
             
             if showRing:
                 button.skillRing.meterFaceHalf1.setScale(0.95999999999999996)
                 button.skillRing.meterFaceHalf2.setScale(0.95999999999999996)
             
             button.reparentTo(self.skillTray)
             button.setPos(x, 0, 0.070000000000000007)
             self.tray[i + 1] = button
             if weaponMode in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF):
                 lastAmmo = localAvatar.guiMgr.combatTray.lastAmmoSkillId.get(localAvatar.currentWeaponId)
                 if lastAmmo is not None:
                     if lastAmmo == skillId:
                         button.toggleButton(True)
                     
                 elif self.tray[1].skillStatus is True:
                     self.tray[1].toggleButton(True)
                 
             
             if self.weaponMode in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
                 inv = localAvatar.getInventory()
                 maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                 if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                     ammoAmt = WeaponGlobals.INF_QUANT
                 else:
                     ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                     ammoAmt = inv.getStackQuantity(ammoInvId)
                     ammoMax = inv.getStackLimit(ammoInvId)
                     button.showQuantity = True
                     button.updateQuantity(ammoAmt)
             
             x = x + 0.17000000000000001
             if i < self.numberOfItems - 1:
                 if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                     self.skillTray.setX(self.skillTray.getX() - 0.072499999999999995)
                 else:
                     self.skillTray.setX(self.skillTray.getX() - 0.085000000000000006)
             
         i < self.numberOfItems - 1
     
     currentX = self.skillTray.getX()
     self.skillTray.setX(currentX + float(offset))
     if self.repMeter:
         self.repMeter.setPos(-currentX, 0.0, -0.11)
     
     self.updateSkillTrayStates()
     if weaponMode == WeaponGlobals.DEFENSE_CANNON:
         self.setMoveUpValue(0.34499999999999997)
     else:
         self.resetMoveUpVale()
     self.showSkillTray()
Exemplo n.º 19
0
class SkillTray:
    SkillIcons = None
    MeterFrame = None
    
    def __init__(self):
        if not self.SkillIcons:
            self.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            icons = loader.loadModel('models/gui/gui_icons_weapon')
            icons.reparentTo(self.SkillIcons)
            self.MeterFrame = loader.loadModel('models/gui/ship_battle')
        
        self.tray = { }
        self.origMap = { }
        self.traySkillMap = None
        self.skillTrayState = False
        self.rep = None
        self.weaponMode = None
        self.callback = None
        self.numberOfItems = 0
        self.repMeter = None
        self.skillRechargedSound = loadSfx(SoundGlobals.SFX_GUI_SKILL_RECHARGED)
        self.skillTray = DirectFrame(parent = base.a2dBottomCenter, pos = (0, 0, -0.14000000000000001), scale = 0.85999999999999999, sortOrder = 2)
        self.hide()
        self.defaultMoveUp = 0.27000000000000002
        self.currentMoveUp = 0
        self.skillTrayz = self.skillTray.getZ()
        self.showSkillTrayIval = None
        self.hideSkillTrayIval = None
        self.resetMoveUpVale()
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.lockArt = gui.find('**/pir_t_gui_gen_key_subscriber')
        self.isPowerRecharged = False

    
    def show(self):
        self.skillTray.show()

    
    def hide(self):
        self.skillTray.hide()

    
    def setMoveUpValue(self, moveUp):
        if self.currentMoveUp != moveUp:
            self.currentMoveUp = moveUp
            if self.showSkillTrayIval:
                self.showSkillTrayIval.pause()
            
            self.showSkillTrayIval = Sequence(Func(self.show), LerpFunc(self.skillTray.setZ, 0.25, self.skillTrayz, moveUp + self.skillTrayz))
            if self.hideSkillTrayIval:
                self.hideSkillTrayIval.pause()
            
            self.hideSkillTrayIval = Sequence(LerpFunc(self.skillTray.setZ, 0.25, moveUp + self.skillTrayz, self.skillTrayz), Func(self.hide))
        

    
    def resetMoveUpVale(self):
        self.setMoveUpValue(self.defaultMoveUp)

    
    def showSkillTray(self, task = None):
        if localAvatar.isWeaponDrawn == False:
            if localAvatar.gameFSM.state != 'ShipPilot' and not (localAvatar.cannon):
                return None
            
        
        if self.skillTrayState:
            return None
        else:
            self.skillTrayState = True
        if self.showSkillTrayIval.isPlaying():
            self.showSkillTrayIval.pause()
        
        if self.hideSkillTrayIval.isPlaying():
            self.hideSkillTrayIval.pause()
        
        self.showSkillTrayIval.start()

    
    def hideSkillTray(self):
        if not self.skillTrayState:
            return None
        else:
            self.skillTrayState = False
        if self.showSkillTrayIval.isPlaying():
            self.showSkillTrayIval.pause()
        
        if self.hideSkillTrayIval.isPlaying():
            self.hideSkillTrayIval.pause()
        
        self.hideSkillTrayIval.start()

    
    def updateSkillTrayMeter(self):
        if not self.traySkillMap:
            return None
        
        inv = base.localAvatar.getInventory()
        reputation = inv.getReputation(self.rep)
        if self.repMeter:
            self.repMeter.setCategory(self.rep)
            self.repMeter.update(reputation, playFX = True)
        

    
    def rebuildSkillTray(self, rep = None, weaponMode = None, callback = None):
        if not rep:
            rep = self.rep
        
        if not weaponMode:
            weaponMode = self.weaponMode
        
        if not callback:
            callback = self.callback
        
        if rep is None:
            return None
        
        self.updateSkillTray(rep, weaponMode, callback, hideFirst = False)

    
    def updateSkillTray(self, rep, weaponMode, callback = None, hideFirst = True):
        if rep == InventoryType.MeleeRep:
            return None
        
        if not callback:
            callback = localAvatar.guiMgr.combatTray.triggerSkillTraySkill
        
        if taskMgr.hasTaskNamed('updateSkillTray'):
            taskMgr.remove('updateSkillTray')
        
        if self.skillTrayState and hideFirst:
            self.hideSkillTray()
            taskMgr.doMethodLater(0.75, self.updateSkillTray, 'updateSkillTray', extraArgs = [
                rep,
                weaponMode,
                callback])
            return None
        
        text = PLocalizer.InventoryTypeNames.get(rep, 'Unknown')
        for i in range(self.numberOfItems):
            self.tray[i + 1].destroy()
        
        self.tray = { }
        if self.repMeter:
            self.repMeter.destroy()
        
        self.rep = rep
        self.weaponMode = weaponMode
        self.callback = callback
        linkedSkillIds = { }
        linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
        for skillId in linkedSkills:
            realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
            linkedSkillIds[realSkillId] = skillId
        
        skillMap = []
        self.origMap = getAllSkills(self.rep, 2, wantWeaponSkill = 1)
        for i in range(len(self.origMap)):
            skillMap.append(self.origMap[i][0])
        
        self.traySkillMap = skillMap
        self.numberOfItems = len(self.traySkillMap)
        self.skillTray.setX(0)
        if self.rep != InventoryType.DefenseCannonRep:
            self.repMeter = ReputationMeter(self.rep, width = 0.69999999999999996)
            self.repMeter.setScale(1.1499999999999999, 1.1499999999999999, 1.1499999999999999)
            self.repMeter.reparentTo(self.skillTray)
            self.repMeter.setCategory(self.rep)
        
        inv = base.localAvatar.getInventory()
        if inv is None:
            return None
        
        if self.repMeter:
            self.repMeter.update(inv.getReputation(self.rep))
        
        x = 0.0
        offset = 0.0
        for i in range(self.numberOfItems):
            if self.origMap[i][1] == False:
                locked = False
                if locked:
                    image = (self.SkillIcons.find('**/base'), self.SkillIcons.find('**/base_down'), self.SkillIcons.find('**/base_over'))
                else:
                    image = self.SkillIcons.find('**/base')
                button = DirectButton(parent = self.skillTray, relief = None, state = DGG.DISABLED, image = image, image_pos = (0.0, 0.0, 0.059999999999999998), image_scale = 0.12, image_color = (0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.55000000000000004), sortOrder = 100, pos = (x, 0, -0.0))
                button.setTransparency(1)
                button.showQuantity = False
                button.greyOut = -1
                button.showRing = False
                button.skillStatus = False
                if locked:
                    lock = DirectFrame(parent = button, relief = None, image = self.lockArt, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, 0.035000000000000003))
                    button['state'] = DGG.NORMAL
                    button['command'] = base.localAvatar.guiMgr.showNonPayer
                    button['extraArgs'] = [
                        'Restricted_Radial_Menu',
                        5]
                
                self.tray[i + 1] = button
                x = x + 0.14999999999999999
                if i < self.numberOfItems - 1:
                    offset = offset + 0.01
                    self.skillTray.setX(self.skillTray.getX() - 0.074999999999999997)
                
            i < self.numberOfItems - 1
            if self.origMap[i][1] == True:
                skillId = self.traySkillMap[i]
                if linkedSkillIds.has_key(skillId):
                    skillId = linkedSkillIds[skillId]
                
                name = PLocalizer.InventoryTypeNames[skillId]
                hotkey = str(i + 1)
                totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, skillId)
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(skillId)
                if not timeSpentRecharging:
                    timeSpentRecharging = 0
                
                if weaponMode not in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF, WeaponGlobals.DEFENSE_CANNON) and skillId in WeaponGlobals.SpecialSkills or WeaponGlobals.getSkillReputationCategoryId(skillId) not in (InventoryType.PistolRep, InventoryType.WandRep, InventoryType.CannonRep, InventoryType.GrenadeRep, InventoryType.DefenseCannonRep):
                    showRing = True
                else:
                    showRing = False
                locked = self.origMap[i][2]
                if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                    button = AmmoSkillButton(skillId, i, self.callback, 99, 0, showQuantity = True, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
                else:
                    button = SkillButton(skillId, self.callback, 0, 0, showQuantity = False, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
                button.skillStatus = True
                if locked:
                    button.skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                    button.skillButton['extraArgs'] = [
                        'Restricted_Radial_Menu',
                        5]
                
                if showRing:
                    button.skillRing.meterFaceHalf1.setScale(0.95999999999999996)
                    button.skillRing.meterFaceHalf2.setScale(0.95999999999999996)
                
                button.reparentTo(self.skillTray)
                button.setPos(x, 0, 0.070000000000000007)
                self.tray[i + 1] = button
                if weaponMode in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF):
                    lastAmmo = localAvatar.guiMgr.combatTray.lastAmmoSkillId.get(localAvatar.currentWeaponId)
                    if lastAmmo is not None:
                        if lastAmmo == skillId:
                            button.toggleButton(True)
                        
                    elif self.tray[1].skillStatus is True:
                        self.tray[1].toggleButton(True)
                    
                
                if self.weaponMode in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
                    inv = localAvatar.getInventory()
                    maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                    if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                        ammoAmt = WeaponGlobals.INF_QUANT
                    else:
                        ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                        ammoAmt = inv.getStackQuantity(ammoInvId)
                        ammoMax = inv.getStackLimit(ammoInvId)
                        button.showQuantity = True
                        button.updateQuantity(ammoAmt)
                
                x = x + 0.17000000000000001
                if i < self.numberOfItems - 1:
                    if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                        self.skillTray.setX(self.skillTray.getX() - 0.072499999999999995)
                    else:
                        self.skillTray.setX(self.skillTray.getX() - 0.085000000000000006)
                
            i < self.numberOfItems - 1
        
        currentX = self.skillTray.getX()
        self.skillTray.setX(currentX + float(offset))
        if self.repMeter:
            self.repMeter.setPos(-currentX, 0.0, -0.11)
        
        self.updateSkillTrayStates()
        if weaponMode == WeaponGlobals.DEFENSE_CANNON:
            self.setMoveUpValue(0.34499999999999997)
        else:
            self.resetMoveUpVale()
        self.showSkillTray()

    
    def updateSkillTrayStates(self):
        if not self.traySkillMap:
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        inv = localAvatar.getInventory()
        if not inv:
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            skillId = self.traySkillMap[i]
            greyOut = 0
            if self.tray[i + 1].greyOut == -1:
                continue
            
            if self.tray[i + 1].showQuantity:
                maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                    quantity = WeaponGlobals.INF_QUANT
                else:
                    ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                    quantity = inv.getStackQuantity(ammoInvId)
                if quantity == 0:
                    greyOut = 1
                
            
            if localAvatar.mojo < -1 * WeaponGlobals.getMojoCost(skillId):
                greyOut = 1
            
            if localAvatar.ship:
                if (skillId == InventoryType.SailBroadsideLeft or skillId == InventoryType.SailBroadsideRight) and not (localAvatar.ship.broadside):
                    greyOut = 1
                elif localAvatar.guiMgr.combatTray.skillDisabled(skillId):
                    greyOut = 1
                
            
            rep = WeaponGlobals.getSkillReputationCategoryId(skillId)
            if rep == InventoryType.DollRep:
                haveFriendly = localAvatar.getFriendlyStickyTargets()
                haveHostile = localAvatar.getHostileStickyTargets()
                if haveFriendly and not haveHostile:
                    if not WeaponGlobals.isFriendlyFire(skillId):
                        greyOut = 1
                    
                elif not haveFriendly and haveHostile:
                    if WeaponGlobals.isFriendlyFire(skillId):
                        greyOut = 1
                    
                
            
            if self.tray[i + 1].greyOut != greyOut:
                if hasattr(self.tray[i + 1], 'skillButton'):
                    self.tray[i + 1].greyOut = greyOut
                    if greyOut == 1:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                        if self.tray[i + 1].showRing:
                            self.tray[i + 1].skillRing.meterFaceHalf1.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                            self.tray[i + 1].skillRing.meterFaceHalf2.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                        
                    elif greyOut == 2:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                    elif greyOut == 3:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                    else:
                        self.tray[i + 1].setGeomColor(1, 1, 1, 1)
                        if self.tray[i + 1].showRing:
                            self.tray[i + 1].skillRing.meterFaceHalf1.clearColorScale()
                            self.tray[i + 1].skillRing.meterFaceHalf2.clearColorScale()
                        
                
            
            if self.isPowerRecharged:
                self.continuePowerRechargeEffect()
                continue
        

    
    def callback(self, skillId):
        if WeaponGlobals.getSkillEffectFlag(skillId):
            localAvatar.guiMgr.combatTray.trySkill(InventoryType.UsePotion, skillId, 0)
        else:
            localAvatar.guiMgr.combatTray.trySkill(InventoryType.UseItem, skillId, 0)

    
    def decrementSkillTrayAmount(self, skillId, amt = 1):
        if not self.traySkillMap:
            return None
        
        if self.weaponMode not in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            if self.tray[i + 1].greyOut == -1:
                continue
            
            if self.tray[i + 1].showQuantity:
                if skillId == self.traySkillMap[i]:
                    currentAmt = self.tray[i + 1].quantity
                    newAmt = currentAmt - amt
                    if newAmt >= 0:
                        self.tray[i + 1].updateQuantity(newAmt)
                        if newAmt == 0:
                            self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                            if self.tray[i + 1].showRing:
                                self.tray[i + 1].skillRing.meterFaceHalf1.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                                self.tray[i + 1].skillRing.meterFaceHalf2.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                            
                        
                        return None
                    
                
            skillId == self.traySkillMap[i]
        

    
    def updateSkillTrayAmounts(self):
        if not self.traySkillMap:
            return None
        
        if self.weaponMode not in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        inv = localAvatar.getInventory()
        if not inv:
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            if self.tray[i + 1].greyOut == -1:
                continue
            
            skillId = self.traySkillMap[i]
            maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
            if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                ammoAmt = WeaponGlobals.INF_QUANT
            else:
                ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                ammoAmt = inv.getStackQuantity(ammoInvId)
                ammoMax = inv.getStackLimit(ammoInvId)
            self.tray[i + 1].updateQuantity(ammoAmt)
        

    
    def updateSkillIval(self, skillId):
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty() and self.tray[button].skillId == skillId:
                if not self.tray[button].skillRingIval.isPlaying():
                    self.tray[button].skillRingIval.start()
                
            self.tray[button].skillRingIval.isPlaying()
        

    
    def addPowerRechargeEffect(self):
        self.isPowerRecharged = True
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].quickGlowImpulse()
                    self.tray[button].startPowerImpulse()
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def continuePowerRechargeEffect(self):
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].startPowerImpulse()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def removePowerRechargeEffect(self):
        self.isPowerRecharged = False
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].stopPowerImpulse()
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def updateCharmSkills(self):
        self.rebuildSkillTray()
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def destroy(self):
        self.hideSkillTray()
        self.skillTray.destroy()
        if self.repMeter:
            self.repMeter.destroy()
        
        for i in range(self.numberOfItems):
            self.tray[i + 1].destroy()
        
        del self.tray
        del self.callback
        if self.showSkillTrayIval:
            self.showSkillTrayIval.pause()
            self.showSkillTrayIval = None
        
        if self.hideSkillTrayIval:
            self.hideSkillTrayIval.pause()
            self.hideSkillTrayIval = None
class SkillTray:
    SkillIcons = None
    MeterFrame = None
    
    def __init__(self):
        if not self.SkillIcons:
            self.SkillIcons = loader.loadModel('models/textureCards/skillIcons')
            icons = loader.loadModel('models/gui/gui_icons_weapon')
            icons.reparentTo(self.SkillIcons)
            self.MeterFrame = loader.loadModel('models/gui/ship_battle')
        
        self.tray = { }
        self.origMap = { }
        self.traySkillMap = None
        self.skillTrayState = False
        self.rep = None
        self.weaponMode = None
        self.callback = None
        self.numberOfItems = 0
        self.repMeter = None
        self.skillRechargedSound = loadSfx(SoundGlobals.SFX_GUI_SKILL_RECHARGED)
        self.skillTray = DirectFrame(parent = base.a2dBottomCenter, pos = (0, 0, -0.14000000000000001), scale = 0.85999999999999999, sortOrder = 2)
        self.hide()
        self.defaultMoveUp = 0.27000000000000002
        self.currentMoveUp = 0
        self.skillTrayz = self.skillTray.getZ()
        self.showSkillTrayIval = None
        self.hideSkillTrayIval = None
        self.resetMoveUpVale()
        gui = loader.loadModel('models/gui/toplevel_gui')
        self.lockArt = gui.find('**/pir_t_gui_gen_key_subscriber')
        self.isPowerRecharged = False

    
    def show(self):
        self.skillTray.show()

    
    def hide(self):
        self.skillTray.hide()

    
    def setMoveUpValue(self, moveUp):
        if self.currentMoveUp != moveUp:
            self.currentMoveUp = moveUp
            if self.showSkillTrayIval:
                self.showSkillTrayIval.pause()
            
            self.showSkillTrayIval = Sequence(Func(self.show), LerpFunc(self.skillTray.setZ, 0.25, self.skillTrayz, moveUp + self.skillTrayz))
            if self.hideSkillTrayIval:
                self.hideSkillTrayIval.pause()
            
            self.hideSkillTrayIval = Sequence(LerpFunc(self.skillTray.setZ, 0.25, moveUp + self.skillTrayz, self.skillTrayz), Func(self.hide))
        

    
    def resetMoveUpVale(self):
        self.setMoveUpValue(self.defaultMoveUp)

    
    def showSkillTray(self, task = None):
        if localAvatar.isWeaponDrawn == False:
            if localAvatar.gameFSM.state != 'ShipPilot' and not (localAvatar.cannon):
                return None
            
        
        if self.skillTrayState:
            return None
        else:
            self.skillTrayState = True
        if self.showSkillTrayIval.isPlaying():
            self.showSkillTrayIval.pause()
        
        if self.hideSkillTrayIval.isPlaying():
            self.hideSkillTrayIval.pause()
        
        self.showSkillTrayIval.start()

    
    def hideSkillTray(self):
        if not self.skillTrayState:
            return None
        else:
            self.skillTrayState = False
        if self.showSkillTrayIval.isPlaying():
            self.showSkillTrayIval.pause()
        
        if self.hideSkillTrayIval.isPlaying():
            self.hideSkillTrayIval.pause()
        
        self.hideSkillTrayIval.start()

    
    def updateSkillTrayMeter(self):
        if not self.traySkillMap:
            return None
        
        inv = base.localAvatar.getInventory()
        reputation = inv.getReputation(self.rep)
        if self.repMeter:
            self.repMeter.setCategory(self.rep)
            self.repMeter.update(reputation, playFX = True)
        

    
    def rebuildSkillTray(self, rep = None, weaponMode = None, callback = None):
        if not rep:
            rep = self.rep
        
        if not weaponMode:
            weaponMode = self.weaponMode
        
        if not callback:
            callback = self.callback
        
        if rep is None:
            return None
        
        self.updateSkillTray(rep, weaponMode, callback, hideFirst = False)

    
    def updateSkillTray(self, rep, weaponMode, callback = None, hideFirst = True):
        if rep == InventoryType.MeleeRep:
            return None
        
        if not callback:
            callback = localAvatar.guiMgr.combatTray.triggerSkillTraySkill
        
        if taskMgr.hasTaskNamed('updateSkillTray'):
            taskMgr.remove('updateSkillTray')
        
        if self.skillTrayState and hideFirst:
            self.hideSkillTray()
            taskMgr.doMethodLater(0.75, self.updateSkillTray, 'updateSkillTray', extraArgs = [
                rep,
                weaponMode,
                callback])
            return None
        
        text = PLocalizer.InventoryTypeNames.get(rep, 'Unknown')
        for i in range(self.numberOfItems):
            self.tray[i + 1].destroy()
        
        self.tray = { }
        if self.repMeter:
            self.repMeter.destroy()
        
        self.rep = rep
        self.weaponMode = weaponMode
        self.callback = callback
        linkedSkillIds = { }
        linkedSkills = ItemGlobals.getLinkedSkills(localAvatar.currentWeaponId)
        for skillId in linkedSkills:
            realSkillId = WeaponGlobals.getLinkedSkillId(skillId)
            linkedSkillIds[realSkillId] = skillId
        
        skillMap = []
        self.origMap = getAllSkills(self.rep, 2, wantWeaponSkill = 1)
        for i in range(len(self.origMap)):
            skillMap.append(self.origMap[i][0])
        
        self.traySkillMap = skillMap
        self.numberOfItems = len(self.traySkillMap)
        self.skillTray.setX(0)
        if self.rep != InventoryType.DefenseCannonRep:
            self.repMeter = ReputationMeter(self.rep, width = 0.69999999999999996)
            self.repMeter.setScale(1.1499999999999999, 1.1499999999999999, 1.1499999999999999)
            self.repMeter.reparentTo(self.skillTray)
            self.repMeter.setCategory(self.rep)
        
        inv = base.localAvatar.getInventory()
        if inv is None:
            return None
        
        if self.repMeter:
            self.repMeter.update(inv.getReputation(self.rep))
        
        x = 0.0
        offset = 0.0
        for i in range(self.numberOfItems):
            if self.origMap[i][1] == False:
                locked = False
                if locked:
                    image = (self.SkillIcons.find('**/base'), self.SkillIcons.find('**/base_down'), self.SkillIcons.find('**/base_over'))
                else:
                    image = self.SkillIcons.find('**/base')
                button = DirectButton(parent = self.skillTray, relief = None, state = DGG.DISABLED, image = image, image_pos = (0.0, 0.0, 0.059999999999999998), image_scale = 0.12, image_color = (0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 0.55000000000000004), sortOrder = 100, pos = (x, 0, -0.0))
                button.setTransparency(1)
                button.showQuantity = False
                button.greyOut = -1
                button.showRing = False
                button.skillStatus = False
                if locked:
                    lock = DirectFrame(parent = button, relief = None, image = self.lockArt, image_scale = 0.14000000000000001, image_pos = (0.050000000000000003, 0, 0.035000000000000003))
                    button['state'] = DGG.NORMAL
                    button['command'] = base.localAvatar.guiMgr.showNonPayer
                    button['extraArgs'] = [
                        'Restricted_Radial_Menu',
                        5]
                
                self.tray[i + 1] = button
                x = x + 0.14999999999999999
                if i < self.numberOfItems - 1:
                    offset = offset + 0.01
                    self.skillTray.setX(self.skillTray.getX() - 0.074999999999999997)
                
            i < self.numberOfItems - 1
            if self.origMap[i][1] == True:
                skillId = self.traySkillMap[i]
                if linkedSkillIds.has_key(skillId):
                    skillId = linkedSkillIds[skillId]
                
                name = PLocalizer.InventoryTypeNames[skillId]
                hotkey = str(i + 1)
                totalRechargeTime = base.cr.battleMgr.getModifiedRechargeTime(localAvatar, skillId)
                timeSpentRecharging = localAvatar.skillDiary.getTimeSpentRecharging(skillId)
                if not timeSpentRecharging:
                    timeSpentRecharging = 0
                
                if weaponMode not in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF, WeaponGlobals.DEFENSE_CANNON) and skillId in WeaponGlobals.SpecialSkills or WeaponGlobals.getSkillReputationCategoryId(skillId) not in (InventoryType.PistolRep, InventoryType.WandRep, InventoryType.CannonRep, InventoryType.GrenadeRep, InventoryType.DefenseCannonRep):
                    showRing = True
                else:
                    showRing = False
                locked = self.origMap[i][2]
                if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                    button = AmmoSkillButton(skillId, i, self.callback, 99, 0, showQuantity = True, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
                else:
                    button = SkillButton(skillId, self.callback, 0, 0, showQuantity = False, showHelp = False, showRing = showRing, hotkey = hotkey, name = name, showLock = locked)
                button.skillStatus = True
                if locked:
                    button.skillButton['command'] = base.localAvatar.guiMgr.showNonPayer
                    button.skillButton['extraArgs'] = [
                        'Restricted_Radial_Menu',
                        5]
                
                if showRing:
                    button.skillRing.meterFaceHalf1.setScale(0.95999999999999996)
                    button.skillRing.meterFaceHalf2.setScale(0.95999999999999996)
                
                button.reparentTo(self.skillTray)
                button.setPos(x, 0, 0.070000000000000007)
                self.tray[i + 1] = button
                if weaponMode in (WeaponGlobals.CANNON, WeaponGlobals.FIREARM, WeaponGlobals.GRENADE, WeaponGlobals.STAFF):
                    lastAmmo = localAvatar.guiMgr.combatTray.lastAmmoSkillId.get(localAvatar.currentWeaponId)
                    if lastAmmo is not None:
                        if lastAmmo == skillId:
                            button.toggleButton(True)
                        
                    elif self.tray[1].skillStatus is True:
                        self.tray[1].toggleButton(True)
                    
                
                if self.weaponMode in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
                    inv = localAvatar.getInventory()
                    maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                    if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                        ammoAmt = WeaponGlobals.INF_QUANT
                    else:
                        ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                        ammoAmt = inv.getStackQuantity(ammoInvId)
                        ammoMax = inv.getStackLimit(ammoInvId)
                        button.showQuantity = True
                        button.updateQuantity(ammoAmt)
                
                x = x + 0.17000000000000001
                if i < self.numberOfItems - 1:
                    if weaponMode == WeaponGlobals.DEFENSE_CANNON:
                        self.skillTray.setX(self.skillTray.getX() - 0.072499999999999995)
                    else:
                        self.skillTray.setX(self.skillTray.getX() - 0.085000000000000006)
                
            i < self.numberOfItems - 1
        
        currentX = self.skillTray.getX()
        self.skillTray.setX(currentX + float(offset))
        if self.repMeter:
            self.repMeter.setPos(-currentX, 0.0, -0.11)
        
        self.updateSkillTrayStates()
        if weaponMode == WeaponGlobals.DEFENSE_CANNON:
            self.setMoveUpValue(0.34499999999999997)
        else:
            self.resetMoveUpVale()
        self.showSkillTray()

    
    def updateSkillTrayStates(self):
        if not self.traySkillMap:
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        inv = localAvatar.getInventory()
        if not inv:
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            skillId = self.traySkillMap[i]
            greyOut = 0
            if self.tray[i + 1].greyOut == -1:
                continue
            
            if self.tray[i + 1].showQuantity:
                maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
                if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                    quantity = WeaponGlobals.INF_QUANT
                else:
                    ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                    quantity = inv.getStackQuantity(ammoInvId)
                if quantity == 0:
                    greyOut = 1
                
            
            if localAvatar.mojo < -1 * WeaponGlobals.getMojoCost(skillId):
                greyOut = 1
            
            if localAvatar.ship:
                if (skillId == InventoryType.SailBroadsideLeft or skillId == InventoryType.SailBroadsideRight) and not (localAvatar.ship.broadside):
                    greyOut = 1
                elif localAvatar.guiMgr.combatTray.skillDisabled(skillId):
                    greyOut = 1
                
            
            rep = WeaponGlobals.getSkillReputationCategoryId(skillId)
            if rep == InventoryType.DollRep:
                haveFriendly = localAvatar.getFriendlyStickyTargets()
                haveHostile = localAvatar.getHostileStickyTargets()
                if haveFriendly and not haveHostile:
                    if not WeaponGlobals.isFriendlyFire(skillId):
                        greyOut = 1
                    
                elif not haveFriendly and haveHostile:
                    if WeaponGlobals.isFriendlyFire(skillId):
                        greyOut = 1
                    
                
            
            if self.tray[i + 1].greyOut != greyOut:
                if hasattr(self.tray[i + 1], 'skillButton'):
                    self.tray[i + 1].greyOut = greyOut
                    if greyOut == 1:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                        if self.tray[i + 1].showRing:
                            self.tray[i + 1].skillRing.meterFaceHalf1.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                            self.tray[i + 1].skillRing.meterFaceHalf2.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                        
                    elif greyOut == 2:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                    elif greyOut == 3:
                        self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                    else:
                        self.tray[i + 1].setGeomColor(1, 1, 1, 1)
                        if self.tray[i + 1].showRing:
                            self.tray[i + 1].skillRing.meterFaceHalf1.clearColorScale()
                            self.tray[i + 1].skillRing.meterFaceHalf2.clearColorScale()
                        
                
            
            if self.isPowerRecharged:
                self.continuePowerRechargeEffect()
                continue
        

    
    def callback(self, skillId):
        if WeaponGlobals.getSkillEffectFlag(skillId):
            localAvatar.guiMgr.combatTray.trySkill(InventoryType.UsePotion, skillId, 0)
        else:
            localAvatar.guiMgr.combatTray.trySkill(InventoryType.UseItem, skillId, 0)

    
    def decrementSkillTrayAmount(self, skillId, amt = 1):
        if not self.traySkillMap:
            return None
        
        if self.weaponMode not in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            if self.tray[i + 1].greyOut == -1:
                continue
            
            if self.tray[i + 1].showQuantity:
                if skillId == self.traySkillMap[i]:
                    currentAmt = self.tray[i + 1].quantity
                    newAmt = currentAmt - amt
                    if newAmt >= 0:
                        self.tray[i + 1].updateQuantity(newAmt)
                        if newAmt == 0:
                            self.tray[i + 1].setGeomColor(0.5, 0.5, 0.5, 1.0)
                            if self.tray[i + 1].showRing:
                                self.tray[i + 1].skillRing.meterFaceHalf1.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                                self.tray[i + 1].skillRing.meterFaceHalf2.setColorScale(0.40000000000000002, 0.40000000000000002, 0.40000000000000002, 1.0)
                            
                        
                        return None
                    
                
            skillId == self.traySkillMap[i]
        

    
    def updateSkillTrayAmounts(self):
        if not self.traySkillMap:
            return None
        
        if self.weaponMode not in (WeaponGlobals.FIREARM, WeaponGlobals.THROWING, WeaponGlobals.CANNON, WeaponGlobals.GRENADE):
            return None
        
        if not hasattr(base, 'localAvatar'):
            return None
        
        inv = localAvatar.getInventory()
        if not inv:
            return None
        
        self.numberOfItems = len(self.traySkillMap)
        for i in range(self.numberOfItems):
            if self.tray[i + 1].greyOut == -1:
                continue
            
            skillId = self.traySkillMap[i]
            maxQuant = WeaponGlobals.getSkillMaxQuantity(skillId)
            if maxQuant == WeaponGlobals.INF_QUANT and WeaponGlobals.canUseInfiniteAmmo(localAvatar.currentWeaponId, skillId) or WeaponGlobals.canUseInfiniteAmmo(localAvatar.getCurrentCharm(), skillId):
                ammoAmt = WeaponGlobals.INF_QUANT
            else:
                ammoInvId = WeaponGlobals.getSkillAmmoInventoryId(skillId)
                ammoAmt = inv.getStackQuantity(ammoInvId)
                ammoMax = inv.getStackLimit(ammoInvId)
            self.tray[i + 1].updateQuantity(ammoAmt)
        

    
    def updateSkillIval(self, skillId):
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty() and self.tray[button].skillId == skillId:
                if not self.tray[button].skillRingIval.isPlaying():
                    self.tray[button].skillRingIval.start()
                
            self.tray[button].skillRingIval.isPlaying()
        

    
    def addPowerRechargeEffect(self):
        self.isPowerRecharged = True
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].quickGlowImpulse()
                    self.tray[button].startPowerImpulse()
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def continuePowerRechargeEffect(self):
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].startPowerImpulse()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def removePowerRechargeEffect(self):
        self.isPowerRecharged = False
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].stopPowerImpulse()
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def updateCharmSkills(self):
        self.rebuildSkillTray()
        for button in self.tray:
            if isinstance(self.tray[button], SkillButton) and not self.tray[button].isEmpty():
                if (WeaponGlobals.getIsShipSkill(self.tray[button].skillId) or WeaponGlobals.getIsCannonSkill(self.tray[button].skillId)) and self.tray[button].skillId != InventoryType.SailPowerRecharge:
                    self.tray[button].updateSkillRingIval()
                
            self.tray[button].skillId != InventoryType.SailPowerRecharge
        

    
    def destroy(self):
        self.hideSkillTray()
        self.skillTray.destroy()
        if self.repMeter:
            self.repMeter.destroy()
        
        for i in range(self.numberOfItems):
            self.tray[i + 1].destroy()
        
        del self.tray
        del self.callback
        if self.showSkillTrayIval:
            self.showSkillTrayIval.pause()
            self.showSkillTrayIval = None
        
        if self.hideSkillTrayIval:
            self.hideSkillTrayIval.pause()
            self.hideSkillTrayIval = None
Exemplo n.º 21
0
class WeaponPage(InventoryPage.InventoryPage):
    __module__ = __name__

    def __init__(self):
        InventoryPage.InventoryPage.__init__(self)
        self.initialiseoptions(WeaponPage)
        self.weaponPanels = {}
        self.tonicButtons = {}
        self.fishingIcon = None
        self.potionIcon = None
        self.fishingRepMeter = None
        self.potionRepMeter = None
        self.fishingPoleName = None
        self.fishingChangeMsg = None
        self.needRefresh = 1
        self.showing = 0
        return

    def show(self):
        self.showing = 1
        InventoryPage.InventoryPage.show(self)
        if self.needRefresh:
            self.refreshList()
            self.needRefresh = 0

    def hide(self):
        self.showing = 0
        self.equipStatus = 0
        InventoryPage.InventoryPage.hide(self)

    def tonicCallback(self, skillId):
        localAvatar.guiMgr.combatTray.trySkill(InventoryType.UseItem, skillId,
                                               0)

    def rePanel(self, inventory):
        if not self.showing:
            self.needRefresh = 1
            return
        skillTokens = {
            InventoryType.CutlassToken: (ItemGlobals.RUSTY_CUTLASS, ),
            InventoryType.PistolToken: (ItemGlobals.FLINTLOCK_PISTOL, ),
            InventoryType.DollToken: (ItemGlobals.VOODOO_DOLL, ),
            InventoryType.DaggerToken: (ItemGlobals.BASIC_DAGGER, ),
            InventoryType.GrenadeToken: (ItemGlobals.GRENADE_POUCH, ),
            InventoryType.WandToken: (ItemGlobals.CURSED_STAFF, )
        }
        zIndex = 1
        for skillTokenKey in TOKEN_LIST:
            quantity = 0
            if localAvatar.getInventory().stacks.get(skillTokenKey):
                quantity = 1
            skillData = skillTokens[skillTokenKey]
            weaponId = skillData[0]
            key = None
            panel = WeaponPanel.WeaponPanel((weaponId, quantity), key)
            panel.reparentTo(self)
            panel.setZ(PiratesGuiGlobals.InventoryPanelHeight - 0.18 -
                       zIndex * panel.height)
            zIndex += 1
            repCat = WeaponGlobals.getRepId(weaponId)
            self.weaponPanels[repCat] = panel
            self.ignore('inventoryQuantity-%s' % inventory.getDoId())
            self.acceptOnce(
                'inventoryQuantity-%s-%s' %
                (inventory.getDoId(), skillTokenKey), self.refreshList)

        repIcon_gui = loader.loadModel('models/textureCards/skillIcons')
        repIcon = repIcon_gui.find('**/box_base')
        if config.GetBool('want-fishing-game', 0):
            self.fishingIcon = GuiButton(
                pos=(0.166, 0,
                     0.045 + (PiratesGuiGlobals.InventoryPanelHeight - 0.18) -
                     zIndex * panel.height),
                helpText=PLocalizer.FishingRepDescription,
                helpOpaque=True,
                image=(repIcon, repIcon, repIcon, repIcon),
                image_scale=(0.144, 0.144, 0.144))
            fishIconCard = loader.loadModel(
                'models/textureCards/fishing_icons')
            inv = localAvatar.getInventory()
            fishingChangeMsg = InventoryGlobals.getCategoryQuantChangeMsg(
                inv.doId, InventoryType.FishingRod)
            if self.fishingChangeMsg:
                self.ignore(fishingChangeMsg)
            self.fishingChangeMsg = fishingChangeMsg
            self.acceptOnce(fishingChangeMsg, self.refreshList)
            rodIcons = [
                'pir_t_gui_fsh_smRodIcon', 'pir_t_gui_fsh_mdRodIcon',
                'pir_t_gui_fsh_lgRodIcon'
            ]
            rodLvl = inv.getStackQuantity(InventoryType.FishingRod)
            rodIcon = rodIcons[rodLvl - 1]
            rodText = PLocalizer.FishingRodNames[rodLvl]
            if rodLvl >= 1:
                self.fishingIcon['geom'] = fishIconCard.find('**/' + rodIcon)
            self.fishingIcon['geom_scale'] = 0.1
            self.fishingIcon['geom_pos'] = (0, 0, 0)
            self.fishingIcon.reparentTo(self)
            fishingRepValue = localAvatar.getInventory().getReputation(
                InventoryType.FishingRep)
            self.fishingRepMeter = ReputationMeter(InventoryType.FishingRep,
                                                   width=0.66)
            self.fishingRepMeter.setPos(
                0.62, 0,
                0.041 + (PiratesGuiGlobals.InventoryPanelHeight - 0.18) -
                zIndex * panel.height)
            self.fishingRepMeter.update(fishingRepValue)
            self.fishingRepMeter.reparentTo(self)
            self.fishingRepMeter.flattenLight()
            self.fishingPoleName = DirectLabel(
                parent=self,
                relief=None,
                state=DGG.DISABLED,
                text=rodText,
                text_scale=PiratesGuiGlobals.TextScaleSmall,
                text_align=TextNode.ALeft,
                text_fg=PiratesGuiGlobals.TextFG2,
                text_shadow=PiratesGuiGlobals.TextShadow,
                pos=(0.29, 0,
                     -0.005 + (PiratesGuiGlobals.InventoryPanelHeight - 0.18) -
                     7 * panel.height),
                text_font=PiratesGlobals.getInterfaceFont())
            self.fishingPoleName.reparentTo(self)
            zIndex += 1
        iconCard = loader.loadModel('models/textureCards/skillIcons')
        if config.GetBool('want-potion-game', 0):
            self.potionIcon = GuiButton(
                pos=(0.166, 0,
                     0.045 + (PiratesGuiGlobals.InventoryPanelHeight - 0.18) -
                     zIndex * panel.height),
                helpText=PLocalizer.PotionRepDescription,
                helpOpaque=True,
                image=(repIcon, repIcon, repIcon, repIcon),
                image_scale=(0.144, 0.144, 0.144))
            self.potionIcon['geom'] = iconCard.find('**/pir_t_gui_pot_base')
            self.potionIcon['geom_scale'] = 0.1
            self.potionIcon['geom_pos'] = (0, 0, 0)
            self.potionIcon.reparentTo(self)
            potionRepValue = localAvatar.getInventory().getReputation(
                InventoryType.PotionsRep)
            self.potionRepMeter = ReputationMeter(InventoryType.PotionsRep,
                                                  width=0.66)
            self.potionRepMeter.setPos(
                0.62, 0,
                0.041 + (PiratesGuiGlobals.InventoryPanelHeight - 0.18) -
                zIndex * panel.height)
            self.potionRepMeter.update(potionRepValue)
            self.potionRepMeter.reparentTo(self)
            self.potionRepMeter.flattenLight()
            zIndex += 1
        items = dict(
            map(lambda x: (x.getType(), x.getCount()),
                inventory.getConsumables().values()))
        possibleItems = ItemGlobals.getAllHealthIds()
        havePorky = items.get(ItemGlobals.ROAST_PORK)
        if not havePorky and ItemGlobals.ROAST_PORK in possibleItems:
            possibleItems.remove(ItemGlobals.ROAST_PORK)
        offset = 0
        if base.config.GetBool('want-potion-game', 0):
            items = inventory.getConsumables()
            listLength = len(InventoryType.PotionMinigamePotions)
            count = 0
            for i in range(listLength):
                tonicId = InventoryType.PotionMinigamePotions[i]
                if items.get(tonicId):
                    button = SkillButton(tonicId,
                                         self.tonicCallback,
                                         items.get(tonicId),
                                         showQuantity=True,
                                         showHelp=True,
                                         showRing=True)
                    button.skillButton['geom_scale'] = 0.08
                    x = 0.16 * (count % 6) + -1.2
                    z = 1.0 - int(count / 6) * 0.16
                    button.setPos(x, 0, z)
                    button.reparentTo(self)
                    self.tonicButtons[tonicId] = button
                    count += 1

        return

    def refreshList(self, newWeaponId=None):
        for panel in self.weaponPanels.values():
            panel.destroy()

        for panel in self.tonicButtons.values():
            panel.destroy()

        if self.fishingIcon is not None:
            self.fishingIcon.destroy()
        if self.potionIcon is not None:
            self.potionIcon.destroy()
        if self.fishingRepMeter is not None:
            self.fishingRepMeter.destroy()
        if self.potionRepMeter is not None:
            self.potionRepMeter.destroy()
        if self.fishingPoleName is not None:
            self.fishingPoleName.destroy()
        inventory = localAvatar.getInventory()
        if inventory:
            if inventory.isReady():
                self.rePanel(inventory)
            else:
                self.ignore('inventoryReady-%s' % inventory.getDoId())
                self.acceptOnce('inventoryReady-%s' % inventory.getDoId(),
                                self.rePanel)
        return

    def destroy(self):
        if self.fishingChangeMsg:
            self.ignore(self.fishingChangeMsg)
        InventoryPage.InventoryPage.destroy(self)

    def updateTonics(self):
        if not hasattr(base, 'localAvatar'):
            return
        inv = localAvatar.getInventory()
        if not inv:
            return
        possibleTonics = ItemGlobals.getAllHealthIds()
        for tonicId in possibleTonics:
            tonicAmt = inv.getItemQuantity(InventoryType.ItemTypeConsumable,
                                           tonicId)
            if self.tonicButtons.has_key(tonicId):
                self.tonicButtons[tonicId].updateQuantity(tonicAmt)
                self.tonicButtons[tonicId].checkAmount()