Ejemplo n.º 1
0
 def __init__(self, cannon):
     DirectFrame.__init__(self, parent = base.a2dLeftCenter, relief = None)
     self.msgMgr = AmmoPanelMessageManager()
     self.cannon = cannon
     self._bankNotes = 0
     self._initVars()
     self._initGUI()
     self._initSfx()
     self._createBankNoteText()
     self.currentLevel = 0
     self.levelUp(1)
     self.usedMagicWord = False
     self.flashIval = None
     for i in range(4):
         self.accept('%d' % (i + 1), self.triggerSkillWithHotkey, [
             i])
Ejemplo n.º 2
0
class AmmoPanel(DirectFrame):
    notify = DirectNotifyGlobal.directNotify.newCategory('AmmoPanel')
    
    def __init__(self, cannon):
        DirectFrame.__init__(self, parent = base.a2dLeftCenter, relief = None)
        self.msgMgr = AmmoPanelMessageManager()
        self.cannon = cannon
        self._bankNotes = 0
        self._initVars()
        self._initGUI()
        self._initSfx()
        self._createBankNoteText()
        self.currentLevel = 0
        self.levelUp(1)
        self.usedMagicWord = False
        self.flashIval = None
        for i in range(4):
            self.accept('%d' % (i + 1), self.triggerSkillWithHotkey, [
                i])
        

    
    def _initVars(self):
        self.state = CLOSED
        self.buttons = { }
        self.ammoQuantities = { }
        self.accept('onSellClick', self.removeAmmoSkill)
        self.accept('defenseCannonLevelUp', self.levelUp)
        self.accept('incBankNotes', self.increaseBankNotes)
        self.accept('unlockAmmo', self.unlockAmmoFromAI)
        self.accept('cdUnlockAll', self.useMagicWord)
        self.accept('endOfWave', self.resetMin)
        self.accept('flashHandleStart', self.flashHandleStart)
        self.accept('flashHandleStop', self.flashHandleStop)

    
    def _initGUI(self):
        self.panel = loader.loadModel('models/gui/pir_m_gui_can_ammoShelf')
        self.panel.reparentTo(self)
        self.panel.setScale(3.0)
        self.panel.setPos(-0.26000000000000001, 0.0, 0.0)
        self.tabHandle = GuiButton.GuiButton(parent = self.panel, command = self.onTabClick, image = None, geom = (self.panel.find('**/ammoButton/idle'), self.panel.find('**/ammoButton/idle'), self.panel.find('**/ammoButton/over')), hotkeys = [
            'shift'], helpText = 'Help Text', helpDelay = 0)
        self.tabHandle.reparentTo(self.panel)
        for i in range(12):
            skillId = 12931 + i
            button = AmmoPanelButton.AmmoPanelButton(self.onAmmoClick, skillId, 0)
            button.reparentTo(self.panel)
            button.setScale(button.getScale() / 3.0)
            button.setPos(0.0, 0.0, 0.125 - 0.050000000000000003 * (i % 6))
            if i >= 6:
                button.setX(button.getX() + 0.050000000000000003)
            
            self.buttons[skillId] = button
            if i == 0:
                button.disablePurchase()
                continue
        
        self.oldAmmoSkillId = self.cannon.getAmmoSkillId()
        self.setBin('gui-cannonDefense', 2)

    
    def _initSfx(self):
        self.sfxAmmoBought = loadSfx(SoundGlobals.SFX_MINIGAME_CANNON_AMMO_BOUGHT)
        self.sfxAmmoDeny = loadSfx(SoundGlobals.SFX_MINIGAME_CANNON_AMMO_DENY)
        self.sfxAmmoOut = loadSfx(SoundGlobals.SFX_MINIGAME_CANNON_AMMO_RECHARGE)

    
    def _unloadSfx(self):
        if self.sfxAmmoBought:
            loader.unloadSfx(self.sfxAmmoBought)
            self.sfxAmmoBought = None
        
        if self.sfxAmmoDeny:
            loader.unloadSfx(self.sfxAmmoDeny)
            self.sfxAmmoDeny = None
        
        if self.sfxAmmoOut:
            loader.unloadSfx(self.sfxAmmoOut)
            self.sfxAmmoOut = None
        

    
    def _createBankNoteText(self):
        textPlaceHolder = self.panel.find('**/text')
        self.bankNoteTxt = TextNode('BankNoteText')
        self.bankNoteTxt.setFont(PiratesGlobals.getInterfaceFont())
        self.bankNoteTxt.setTextColor(PiratesGuiGlobals.TextFG1)
        self.bankNoteTxt.setShadow(0.050000000000000003, 0.050000000000000003)
        self.bankNoteTxt.setAlign(TextNode.ALeft)
        bankNoteTxtNode = textPlaceHolder.attachNewNode(self.bankNoteTxt)
        bankNoteTxtNode.setScale(0.014999999999999999)
        bankNoteTxtNode.setDepthTest(False)
        bankNoteTxtNode.setDepthWrite(False)
        bankNoteTxtNode.setPos(-0.02, 0, 0)
        self.updateBankNoteText()

    
    def onTabClick(self, event = None):
        if self.state == CLOSED:
            posInterval = self.panel.posInterval(0.25, Point3(0.10000000000000001, 0.0, 0.0))
            self.flashHandleStop()
        else:
            posInterval = self.panel.posInterval(0.25, Point3(-0.26000000000000001, 0.0, 0.0))
        self.state = 1 - self.state
        sequence = Sequence(posInterval)
        sequence.start()

    
    def onAmmoClick(self, skillId):
        button = self.buttons[skillId]
        if button.isLocked():
            if not Freebooter.getPaidStatus(base.localAvatar.doId) and skillId > CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
                localAvatar.guiMgr.showNonPayer()
            
            return None
        
        if button.canPurchase(self._bankNotes):
            if self.addAmmoSkill(skillId):
                self._bankNotes -= button.cost
                self.updateBankNoteText()
                button.disablePurchase()
                if self.sfxAmmoBought:
                    base.playSfx(self.sfxAmmoBought)
                
            elif not self.hasSkill(skillId):
                button.flash()
                self.msgMgr.showNoAmmoSlot()
                if self.sfxAmmoDeny:
                    base.playSfx(self.sfxAmmoDeny)
                
            
        elif not self.hasSkill(skillId):
            button.flash()
            self.msgMgr.showNotEnoughBankNotes()
            if self.sfxAmmoDeny:
                base.playSfx(self.sfxAmmoDeny)
            
        
        if self.hasSkill(skillId):
            base.localAvatar.guiMgr.combatTray.skillTray.updateSkillTray(InventoryType.DefenseCannonRep, WeaponGlobals.DEFENSE_CANNON, hideFirst = False)
            base.localAvatar.guiMgr.combatTray.triggerSkillTraySkill(skillId)
            self.cannon.cgui.showCannonControls()
            self.updateQuantities()
        

    
    def hasAmmo(self):
        hasNotEmpty = False
        for i in range(len(PiratesGlobals.CANNON_DEFENSE_SKILLS)):
            if PiratesGlobals.CANNON_DEFENSE_SKILLS[i] != InventoryType.DefenseCannonEmpty:
                hasNotEmpty = True
                continue
        
        return hasNotEmpty

    
    def hasCurrentAmmo(self):
        if not self.ammoQuantities.get(self.cannon.getAmmoSkillId(), 0) > 0:
            pass
        return self.ammoQuantities.get(self.cannon.getAmmoSkillId(), 0) == -1

    
    def hasSkill(self, skillId):
        for i in range(len(PiratesGlobals.CANNON_DEFENSE_SKILLS)):
            if PiratesGlobals.CANNON_DEFENSE_SKILLS[i] == skillId:
                return True
                continue
        
        return False

    
    def addAmmoSkill(self, skillId):
        index = -1
        for i in range(len(PiratesGlobals.CANNON_DEFENSE_SKILLS)):
            if PiratesGlobals.CANNON_DEFENSE_SKILLS[i] == InventoryType.DefenseCannonEmpty:
                index = i
                break
                continue
        
        if (index < 0 or not Freebooter.getPaidStatus(base.localAvatar.doId)) and index >= CannonDefenseGlobals.FREEBOOTER_MAX_AMMO_SLOTS:
            return False
        
        PiratesGlobals.CANNON_DEFENSE_SKILLS.remove(InventoryType.DefenseCannonEmpty)
        PiratesGlobals.CANNON_DEFENSE_SKILLS.insert(index, skillId)
        self.ammoQuantities[skillId] = CannonDefenseGlobals.getDefenseCannonAmmoAmount(skillId)
        return True

    
    def removeAmmoSkill(self, skillId, useDefaultAmmo = False):
        index = -1
        for i in range(len(PiratesGlobals.CANNON_DEFENSE_SKILLS)):
            if PiratesGlobals.CANNON_DEFENSE_SKILLS[i] == skillId:
                index = i
                break
                continue
        
        if index < 0:
            return False
        
        PiratesGlobals.CANNON_DEFENSE_SKILLS.remove(skillId)
        PiratesGlobals.CANNON_DEFENSE_SKILLS.insert(index, InventoryType.DefenseCannonEmpty)
        button = self.buttons[skillId]
        modifier = max(0, self.ammoQuantities[skillId] / float(CannonDefenseGlobals.getDefenseCannonAmmoAmount(skillId)))
        self._bankNotes += int(button.cost * modifier)
        self.updateBankNoteText()
        button.enablePurchase()
        base.localAvatar.guiMgr.combatTray.skillTray.updateSkillTray(InventoryType.DefenseCannonRep, WeaponGlobals.DEFENSE_CANNON, hideFirst = False)
        self.updateQuantities()
        if useDefaultAmmo and not self.hasAmmo():
            self.onAmmoClick(InventoryType.DefenseCannonRoundShot)
        elif skillId == base.localAvatar.guiMgr.combatTray.getLastAmmoSkillId():
            self.cannon.cgui.hideCannonControls()
            self.cannon.cgui.skillTray.show()
            if self.state == CLOSED and not self.hasAmmo():
                self.onTabClick()
            
        
        self.ammoQuantities[skillId] = 0
        return True

    
    def addDefaultAmmo(self):
        default = InventoryType.DefenseCannonRoundShot
        PiratesGlobals.CANNON_DEFENSE_SKILLS.append(default)
        self.ammoQuantities[default] = CannonDefenseGlobals.getDefenseCannonAmmoAmount(default)
        base.localAvatar.guiMgr.combatTray.triggerSkillTraySkill(default)

    
    def addAmmoSlot(self):
        if len(PiratesGlobals.CANNON_DEFENSE_SKILLS) == 0:
            self.addDefaultAmmo()
        else:
            PiratesGlobals.CANNON_DEFENSE_SKILLS.append(InventoryType.DefenseCannonEmpty)
        base.localAvatar.guiMgr.combatTray.skillTray.updateSkillTray(InventoryType.DefenseCannonRep, WeaponGlobals.DEFENSE_CANNON, hideFirst = False)
        self.updateQuantities()

    
    def levelUp(self, level):
        if level > 1:
            base.cr.activeWorld.d_sendMessage(base.localAvatar.doId, PLocalizer.CannonDefenseLevelUp % (PLocalizer.InventoryTypeNames[InventoryType.DefenseCannonRep], level))
        
        message = ''
        while self.currentLevel < level:
            if self.currentLevel < len(CannonDefenseGlobals.levelUpgrades):
                upgradeArray = CannonDefenseGlobals.levelUpgrades[self.currentLevel]
                for i in range(len(upgradeArray)):
                    upgrade = upgradeArray[i]
                    if upgrade == 'upgrade':
                        message += PLocalizer.LevelUpCannonDefenseRepeaterCannon
                        self.cannon.requestUpgradeToRepeater()
                        continue
                    if upgrade < 5:
                        message += PLocalizer.LevelUpCannonDefenseAmmoSlot
                        self.addAmmoSlot()
                        continue
                    if self.buttons[upgrade].isLocked():
                        message += PLocalizer.LevelUpCannonDefense % PLocalizer.InventoryTypeNames[upgrade]
                        base.cr.activeWorld.d_addUnlockedAmmo(upgrade)
                        if level > 1:
                            base.cr.activeWorld.d_sendMessage(base.localAvatar.doId, PLocalizer.CannonDefenseAmmoUnlocked % PLocalizer.InventoryTypeNames[upgrade])
                        
                    level > 1
                
            
            self.currentLevel += 1
        if self.currentLevel > 1:
            self.msgMgr.showDefenseCannonSkillsUnlocked(message)
        

    
    def updateBankNoteText(self):
        if self._bankNotes < 0:
            bnotes = 0
        else:
            bnotes = math.floor(self._bankNotes)
        self.bankNoteTxt.setText(PLocalizer.BankNotes % bnotes)

    
    def increaseBankNotes(self, increase, total):
        self._bankNotes = self._bankNotes + increase
        if self._bankNotes > total:
            if not self.usedMagicWord:
                self._bankNotes = total
            
        
        self.updateBankNoteText()

    
    def decreaseAmmoAmount(self, update = True):
        if self.ammoQuantities[self.cannon.getAmmoSkillId()] >= 0:
            if update:
                self.ammoQuantities[self.cannon.getAmmoSkillId()] -= 1
                if self.ammoQuantities[self.cannon.getAmmoSkillId()] <= 0:
                    self.ammoQuantities[self.cannon.getAmmoSkillId()] = 0
                    self.removeAmmoSkill(self.cannon.getAmmoSkillId(), True)
                    if self.sfxAmmoOut:
                        base.playSfx(self.sfxAmmoOut)
                    
                    return None
                
            
        
        self.updateQuantities()

    
    def updateQuantities(self):
        for button in base.localAvatar.guiMgr.combatTray.skillTray.tray.itervalues():
            if button.skillId != InventoryType.DefenseCannonEmpty:
                if button.skillId in self.ammoQuantities:
                    button.updateQuantity(self.ammoQuantities[button.skillId])
                
            button.skillId in self.ammoQuantities
        

    
    def triggerSkillWithHotkey(self, hotkey):
        if hotkey < len(PiratesGlobals.CANNON_DEFENSE_SKILLS):
            skillId = PiratesGlobals.CANNON_DEFENSE_SKILLS[hotkey]
            if skillId != InventoryType.DefenseCannonEmpty:
                base.localAvatar.guiMgr.combatTray.triggerSkillTraySkill(skillId)
            
        

    
    def unlockAmmoFromAI(self, ammoSkillIds):
        for ammoSkillId in ammoSkillIds:
            if Freebooter.getPaidStatus(base.localAvatar.doId) or ammoSkillId <= CannonDefenseGlobals.FREEBOOTER_LAST_AMMO_AVAILABLE:
                self.buttons[ammoSkillId].unlock()
                continue
        

    
    def flashHandleStart(self):
        if self.flashIval or self.state == OPENED:
            return None
        
        self.flashIval = Sequence(LerpColorInterval(self.tabHandle, 0.25, color = VBase4(0.20000000000000001, 0.20000000000000001, 0.20000000000000001, 3.0), blendType = 'easeOut'), LerpColorInterval(self.tabHandle, 0.25, color = VBase4(1.0, 1.0, 1.0, 1.0), blendType = 'easeOut'))
        self.flashIval.loop()

    
    def flashHandleStop(self):
        if self.flashIval:
            self.flashIval.pause()
            self.flashIval = None
        
        self.tabHandle.setColor(1.0, 1.0, 1.0, 1.0)

    
    def useMagicWord(self):
        self.levelUp(20)
        self.usedMagicWord = True
        self._bankNotes = 99999
        self.updateBankNoteText()

    
    def destroy(self):
        self._unloadSfx()
        self.panel.detachNode()
        self.tabHandle.destroy()
        self.msgMgr.destroy()
        self.cannon.setAmmoSkillId(self.oldAmmoSkillId)
        PiratesGlobals.CANNON_DEFENSE_SKILLS = []
        self.ignore('onSellClick')
        self.ignore('incBankNotes')
        self.ignore('defenseCannonLevelUp')
        self.ignore('unlockAmmo')
        self.ignore('cdUnlockAll')
        self.ignore('endOfWave')
        self.ignore('flashHandleStart')
        self.ignore('flashHandleStop')
        for i in range(4):
            self.ignore('%d' % (i + 1))
        
        DirectFrame.destroy(self)

    
    def resetMin(self):
        if self._bankNotes < 0:
            self._bankNotes = 0