def __init__(self, cr):
     DistributedMiniGameWorld.__init__(self, cr)
     Lootable.__init__(self)
     self.fsm = CannonDefenseFSM(self)
     self._numWaves = len(CannonDefenseGlobals.waveData)
     self._waveNumber = 0
     self._bonusSet = 0
     self.timeRemaining = 0
     self.treasurePercent = 1.0
     self._DistributedDefendWorld__isGameFull = False
     self.sfxGoldAttack = None
     self.goldBonus = 0
     self.endOfWaveData = EndOfWaveData()
     self.startingState = None
     self.flamingBarrels = []
     self.initGoldPiles()
예제 #2
0
 def __init__(self, cr):
     DistributedMiniGameWorld.__init__(self, cr)
     Lootable.__init__(self)
     self.fsm = CannonDefenseFSM(self)
     self._numWaves = len(CannonDefenseGlobals.waveData)
     self._waveNumber = 0
     self._bonusSet = 0
     self.timeRemaining = 0
     self.treasurePercent = 1.0
     self._DistributedDefendWorld__isGameFull = False
     self.sfxGoldAttack = None
     self.goldBonus = 0
     self.endOfWaveData = EndOfWaveData()
     self.startingState = None
     self.flamingBarrels = []
     self.initGoldPiles()
class DistributedDefendWorld(DistributedMiniGameWorld, Lootable):
    __module__ = __name__

    def __init__(self, cr):
        DistributedMiniGameWorld.__init__(self, cr)
        Lootable.__init__(self)
        self.fsm = CannonDefenseFSM(self)
        self._numWaves = len(CannonDefenseGlobals.waveData)
        self._waveNumber = 0
        self._bonusSet = 0
        self.timeRemaining = 0
        self.treasurePercent = 1.0
        self.__isGameFull = False
        self.sfxGoldAttack = None
        self.goldBonus = 0
        self.endOfWaveData = EndOfWaveData()
        self.startingState = None
        self.flamingBarrels = []
        self.initGoldPiles()
        base.shipsVisibleFromIsland = True
        return

    def initGoldPiles(self):
        self.goldPiles = []
        self.goldPilesIndex = [5, 3, 7, 6, 4, 1, 9, 2, 8, 0]
        for i in range(10):
            goldPile = loader.loadModel(
                'models/minigames/pir_m_gam_can_goldPile')
            goldPile.setScale(3.0, 3.0, 9.0)
            goldPile.setPos(660.0 + i * 30.0 + i % 2 * 10,
                            -465.0 - i % 2 * 30.0, 25.0 - i % 2 * 5.0)
            goldPile.setHpr(random.random() * 360, 0, 0)
            goldPile.reparentTo(self)
            goldPile.setLightOff()
            self.goldPiles.append(goldPile)

        base.dw = self

    def setGoldBonus(self, goldBonusAmount):
        self.endOfWaveData.myGoldBonus = goldBonusAmount

    def setGoldPileSizes(self):
        treasureRemaining = CannonDefenseGlobals.MINE_TREASURE_START * self.treasurePercent
        for i in range(10):
            goldPile = self.goldPiles[self.goldPilesIndex[i]]
            if treasureRemaining > (
                    i + 1) * CannonDefenseGlobals.MINE_TREASURE_START / 10.0:
                goldPile.unstash()
                goldPile.setScale(3.0, 3.0, 3.0)
            elif treasureRemaining > i * CannonDefenseGlobals.MINE_TREASURE_START / 10.0:
                goldPile.unstash()
                goldMod = treasureRemaining - i * CannonDefenseGlobals.MINE_TREASURE_START / 10.0
                goldPile.setScale(
                    1.0 +
                    20.0 * goldMod / CannonDefenseGlobals.MINE_TREASURE_START,
                    1.0 +
                    goldMod * 20.0 / CannonDefenseGlobals.MINE_TREASURE_START,
                    0.5 +
                    goldMod * 25.0 / CannonDefenseGlobals.MINE_TREASURE_START)
            else:
                goldPile.stash()

    def generate(self):
        DistributedMiniGameWorld.generate(self)

    def announceGenerate(self):
        DistributedMiniGameWorld.announceGenerate(self)
        CullBinManager.getGlobalPtr().addBin('gui-cannonDefense',
                                             CullBinManager.BTFixed, 40)
        self.setupLocalPlayer()

    def disable(self):
        DistributedMiniGameWorld.disable(self)
        base.shipsVisibleFromIsland = False

    def delete(self):
        DistributedMiniGameWorld.delete(self)
        self.fsm.demand('Off')

    def setupLocalPlayer(self):
        base.musicMgr.request(SoundGlobals.MUSIC_MINIGAME_CANNON,
                              priority=1,
                              looping=1)
        localAvatar.disableLootUI()
        localAvatar.disableTutorial()
        localAvatar.surpressRepFlag(InventoryType.CannonRep)
        localAvatar.b_setTeleportFlag(PiratesGlobals.TFCannonDefense)
        self.loadSfx()

    def loadSfx(self):
        self.sfxGoldAttack = loadSfx(
            SoundGlobals.SFX_MINIGAME_CANNON_GOLD_ATTACK)

    def unloadSfx(self):
        if self.sfxGoldAttack:
            loader.unloadSfx(self.sfxGoldAttack)
            self.sfxGoldAttack = None
        return

    def kickPlayer(self):
        self.exitMiniGame()

    def turnOn(self, av=None):
        DistributedMiniGameWorld.turnOn(self, av)

    def enterCannon(self, cannonDoId):
        def avatarHere():
            doIds = [cannonDoId]
            base.cr.relatedObjectMgr.requestObjects(doIds,
                                                    self._doCannonInteraction)
            base.cr.timeOfDayManager.setEnvironment(TODGlobals.ENV_CANNONGAME)

        self.accept('localAvTeleportFinished', avatarHere)

    def requestState(self, stateName):
        if localAvatar.cannon:
            self.fsm.request(stateName)
            self.startingState = None
        else:
            self.startingState = stateName
        return

    def onPlayerJoin(self, doid, gameFull):
        self.__isGameFull = gameFull

    def onPlayerLeave(self, doid, gameFull):
        self.__isGameFull = gameFull

    def setCurrentWave(self, waveNumber, bonusSet):
        messenger.send('endOfWave')
        self._waveNumber = waveNumber
        self._bonusSet = bonusSet
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            actualWaveNumber = self._waveNumber + self._bonusSet * self._numWaves
            localAvatar.cannon.cgui.hud.timeRemainingUI.setWaveNumber(
                actualWaveNumber + 1)
        self.setGoldPileSizes()

    def updateTimer(self, timeLeft):
        self.timeRemaining = float(timeLeft) / 100.0
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            localAvatar.cannon.cgui.hud.timeRemainingUI.setPercent(
                self.timeRemaining)

    def setTreasureRemaining(self, percent):
        newValue = float(percent) / 100.0
        if newValue < self.treasurePercent:
            if self.sfxGoldAttack:
                if self.sfxGoldAttack.status() != AudioSound.PLAYING:
                    base.playSfx(self.sfxGoldAttack)
        self.treasurePercent = newValue
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            localAvatar.cannon.cgui.hud.goldRemainingUI.setPercent(
                self.treasurePercent)
        self.setGoldPileSizes()

    def getWaveNumber(self):
        return self._waveNumber

    def getBonusSet(self):
        return self._bonusSet

    def getNumWaves(self):
        return self._numWaves

    def getWorldPos(self, node):
        if not node.isEmpty() and self.isOnStage():
            return node.getPos(self)

    def _doCannonInteraction(self, dos):
        cannon = dos[0]
        base.cr.activeWorld.handleUseKey(self)
        currentInteractive = base.cr.interactionMgr.getCurrentInteractive()
        if currentInteractive and currentInteractive.isExclusiveInteraction():
            currentInteractive.requestExit()
        cannon.requestInteraction(localAvatar, 1)
        cannon.setReadyEvent(self.cannonReady)
        cannon.setExitEvent(self.exitMiniGame)

    def cannonReady(self):
        if self.startingState:
            self.fsm.demand(self.startingState)
        self.setCurrentWave(self._waveNumber, self._bonusSet)
        self.updateTimer(self.timeRemaining * 100.0)
        self.setTreasureRemaining(self.treasurePercent * 100.0)

    def disableCannonInput(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'disableInput'):
            localAvatar.cannon.disableInput()
            localAvatar.cannon.cgui.fadeOutAmmoCounters()

    def enableCannonInput(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'enableInput'):
            localAvatar.cannon.enableInput()
            localAvatar.cannon.cgui.fadeInAmmoCounters()

    def disableCannonFire(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon,
                                          'disableCannonFireInput'):
            localAvatar.cannon.disableCannonFireInput()
            localAvatar.cannon.cgui.fadeOutAmmoCounters()

    def enableCannonFire(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon,
                                          'enableCannonFireInput'):
            localAvatar.cannon.enableCannonFireInput()
            localAvatar.cannon.cgui.fadeInAmmoCounters()

    def exitMiniGame(self):
        localAvatar.enableLootUI()
        localAvatar.enableTutorial()
        localAvatar.clearRepFlags()
        self.unloadSfx()
        localAvatar.b_clearTeleportFlag(PiratesGlobals.TFCannonDefense)
        self.__isGameFull = False
        self.stopLooting()
        base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_MINIGAME_CANNON)
        self.fsm.demand('Off')
        self.clearDefenseAmmo()
        self.sendUpdate('requestLeave', [])

    def requestStartBonusRound(self):
        if self.fsm.state == 'Victory':
            self.sendUpdate('requestStartBonusRound', [localAvatar.getDoId()])

    def setPlayerNames(self, names):
        self.endOfWaveData.playerNames = names

    def setShipsSunkWave(self, shipsSunk):
        self.endOfWaveData.shipsSunkWave = shipsSunk

    def setDamageDealtWave(self, damageDealt):
        self.endOfWaveData.damgeDealtWave = damageDealt

    def setShotsFiredWave(self, shots):
        self.endOfWaveData.shotsFiredWave = shots

    def setAccuracyWave(self, accuracy):
        self.endOfWaveData.accuracyWave = accuracy

    def setTimePlayed(self, time):
        self.endOfWaveData.timePlayed = time

    def setShipsSunkOverall(self, shipsSunk):
        self.endOfWaveData.shipsSunkOverall = shipsSunk

    def setDamageDealtOverall(self, damageDealt):
        self.endOfWaveData.damgeDealtOverall = damageDealt

    def setShotsFiredOverall(self, shots):
        self.endOfWaveData.shotsFiredOverall = shots

    def setAccuracyOverall(self, accuracy):
        self.endOfWaveData.accuracyOverall = accuracy

    def setGoldPaidOverall(self, gold):
        self.endOfWaveData.goldPaidOverall = gold

    def setTreasureStats(self, stolen, remaining, earned):
        self.endOfWaveData.treasureStolen = stolen
        self.endOfWaveData.treasureRemaining = remaining
        self.endOfWaveData.treasureEarned = earned

    def setAwardedGold(self, gold):
        self.endOfWaveData.myGoldEarned = gold

    def setBankNotes(self, bankNotes, totalBankNotes):
        messenger.send('incBankNotes', [bankNotes, totalBankNotes])

    def setExperience(self, experience, totalExperience):
        self.experiece = experience
        messenger.send('incDefenseCannonExp', [experience, totalExperience])

    def d_addUnlockedAmmo(self, ammoSkillId):
        self.sendUpdate('addUnlockedAmmo', [ammoSkillId])

    def setUnlockedAmmo(self, ammoSkillIds):
        messenger.send('unlockAmmo', [ammoSkillIds])

    def updateWaitTimer(self, timeLeft):
        self.fsm.updateCountDown(timeLeft)

    def d_sendMessage(self, senderId, message):
        self.sendUpdate('sendMessage', [senderId, message])

    def setMessage(self, senderId, senderName, message):
        base.talkAssistant.receiveCannonDefenseMessage(message, senderName)

    def getTypeName(self):
        return 'Defense Rewards'

    def clearDefenseAmmo(self):
        for cannonball in render.findAllMatches('**/=DefenseAmmo'):
            ammo = cannonball.getPythonTag('DefenseAmmo')
            if ammo:
                ammo.destroy()
예제 #4
0
class DistributedDefendWorld(DistributedMiniGameWorld, Lootable):
    
    def __init__(self, cr):
        DistributedMiniGameWorld.__init__(self, cr)
        Lootable.__init__(self)
        self.fsm = CannonDefenseFSM(self)
        self._numWaves = len(CannonDefenseGlobals.waveData)
        self._waveNumber = 0
        self._bonusSet = 0
        self.timeRemaining = 0
        self.treasurePercent = 1.0
        self._DistributedDefendWorld__isGameFull = False
        self.sfxGoldAttack = None
        self.goldBonus = 0
        self.endOfWaveData = EndOfWaveData()
        self.startingState = None
        self.flamingBarrels = []
        self.initGoldPiles()

    
    def initGoldPiles(self):
        self.goldPiles = []
        self.goldPilesIndex = [
            5,
            3,
            7,
            6,
            4,
            1,
            9,
            2,
            8,
            0]
        for i in range(10):
            goldPile = loader.loadModel('models/minigames/pir_m_gam_can_goldPile')
            goldPile.setScale(3.0, 3.0, 9.0)
            goldPile.setPos(660.0 + i * 30.0 + (i % 2) * 10, -465.0 - (i % 2) * 30.0, 25.0 - (i % 2) * 5.0)
            goldPile.setHpr(random.random() * 360, 0, 0)
            goldPile.reparentTo(self)
            goldPile.setLightOff()
            self.goldPiles.append(goldPile)
        
        base.dw = self

    
    def setGoldBonus(self, goldBonusAmount):
        self.endOfWaveData.myGoldBonus = goldBonusAmount

    
    def setGoldPileSizes(self):
        treasureRemaining = CannonDefenseGlobals.MINE_TREASURE_START * self.treasurePercent
        for i in range(10):
            goldPile = self.goldPiles[self.goldPilesIndex[i]]
            if treasureRemaining > (i + 1) * CannonDefenseGlobals.MINE_TREASURE_START / 10.0:
                goldPile.unstash()
                goldPile.setScale(3.0, 3.0, 3.0)
                
            if treasureRemaining > i * CannonDefenseGlobals.MINE_TREASURE_START / 10.0:
                goldPile.unstash()
                goldMod = treasureRemaining - i * CannonDefenseGlobals.MINE_TREASURE_START / 10.0
                goldPile.setScale(1.0 + 20.0 * goldMod / CannonDefenseGlobals.MINE_TREASURE_START, 1.0 + goldMod * 20.0 / CannonDefenseGlobals.MINE_TREASURE_START, 0.5 + goldMod * 25.0 / CannonDefenseGlobals.MINE_TREASURE_START)
                
            goldPile.stash()
        

    
    def generate(self):
        DistributedMiniGameWorld.generate(self)

    
    def announceGenerate(self):
        DistributedMiniGameWorld.announceGenerate(self)
        CullBinManager.getGlobalPtr().addBin('gui-cannonDefense', CullBinManager.BTFixed, 40)
        self.setupLocalPlayer()

    
    def delete(self):
        DistributedMiniGameWorld.delete(self)
        self.fsm.demand('Off')

    
    def setupLocalPlayer(self):
        base.musicMgr.request(SoundGlobals.MUSIC_MINIGAME_CANNON, priority = 1, looping = 1)
        localAvatar.disableLootUI()
        localAvatar.disableTutorial()
        localAvatar.surpressRepFlag(InventoryType.CannonRep)
        localAvatar.b_setTeleportFlag(PiratesGlobals.TFCannonDefense)
        self.loadSfx()

    
    def loadSfx(self):
        self.sfxGoldAttack = loadSfx(SoundGlobals.SFX_MINIGAME_CANNON_GOLD_ATTACK)

    
    def unloadSfx(self):
        if self.sfxGoldAttack:
            loader.unloadSfx(self.sfxGoldAttack)
            self.sfxGoldAttack = None
        

    
    def kickPlayer(self):
        self.exitMiniGame()

    
    def turnOn(self, av = None):
        DistributedMiniGameWorld.turnOn(self, av)
        base.cr.timeOfDayManager.setEnvironment(TODGlobals.ENV_CANNONGAME)

    
    def enterCannon(self, cannonDoId):
        doIds = [
            cannonDoId]
        base.cr.relatedObjectMgr.requestObjects(doIds, self._doCannonInteraction)

    
    def requestState(self, stateName):
        if localAvatar.cannon:
            self.fsm.request(stateName)
        else:
            self.startingState = stateName

    
    def onPlayerJoin(self, doid, gameFull):
        self._DistributedDefendWorld__isGameFull = gameFull

    
    def onPlayerLeave(self, doid, gameFull):
        self._DistributedDefendWorld__isGameFull = gameFull

    
    def setCurrentWave(self, waveNumber, bonusSet):
        messenger.send('endOfWave')
        self._waveNumber = waveNumber
        self._bonusSet = bonusSet
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            actualWaveNumber = self._waveNumber + self._bonusSet * self._numWaves
            localAvatar.cannon.cgui.hud.timeRemainingUI.setWaveNumber(actualWaveNumber + 1)
        
        self.setGoldPileSizes()

    
    def updateTimer(self, timeLeft):
        self.timeRemaining = float(timeLeft) / 100.0
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            localAvatar.cannon.cgui.hud.timeRemainingUI.setPercent(self.timeRemaining)
        

    
    def setTreasureRemaining(self, percent):
        newValue = float(percent) / 100.0
        if newValue < self.treasurePercent:
            if self.sfxGoldAttack:
                if self.sfxGoldAttack.status() != AudioSound.PLAYING:
                    base.playSfx(self.sfxGoldAttack)
                
            
        
        self.treasurePercent = newValue
        if localAvatar.cannon and hasattr(localAvatar.cannon.cgui, 'hud'):
            localAvatar.cannon.cgui.hud.goldRemainingUI.setPercent(self.treasurePercent)
        
        self.setGoldPileSizes()

    
    def getWaveNumber(self):
        return self._waveNumber

    
    def getBonusSet(self):
        return self._bonusSet

    
    def getNumWaves(self):
        return self._numWaves

    
    def getWorldPos(self, node):
        if not node.isEmpty() and self.isOn():
            return node.getPos(self)
        

    
    def _doCannonInteraction(self, dos):
        cannon = dos[0]
        base.cr.activeWorld.handleUseKey(self)
        currentInteractive = base.cr.interactionMgr.getCurrentInteractive()
        if currentInteractive and currentInteractive.isExclusiveInteraction():
            currentInteractive.requestExit()
        
        cannon.requestInteraction(localAvatar, 1)
        cannon.setReadyEvent(self.cannonReady)
        cannon.setExitEvent(self.exitMiniGame)

    
    def cannonReady(self):
        if self.startingState:
            self.fsm.demand(self.startingState)
        
        self.setCurrentWave(self._waveNumber, self._bonusSet)
        self.updateTimer(self.timeRemaining * 100.0)
        self.setTreasureRemaining(self.treasurePercent * 100.0)

    
    def disableCannonInput(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'disableInput'):
            localAvatar.cannon.disableInput()
            localAvatar.cannon.cgui.fadeOutAmmoCounters()
        

    
    def enableCannonInput(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'enableInput'):
            localAvatar.cannon.enableInput()
            localAvatar.cannon.cgui.fadeInAmmoCounters()
        

    
    def disableCannonFire(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'disableCannonFireInput'):
            localAvatar.cannon.disableCannonFireInput()
            localAvatar.cannon.cgui.fadeOutAmmoCounters()
        

    
    def enableCannonFire(self):
        if localAvatar.cannon and hasattr(localAvatar.cannon, 'enableCannonFireInput'):
            localAvatar.cannon.enableCannonFireInput()
            localAvatar.cannon.cgui.fadeInAmmoCounters()
        

    
    def exitMiniGame(self):
        localAvatar.enableLootUI()
        localAvatar.enableTutorial()
        localAvatar.clearRepFlags()
        self.unloadSfx()
        localAvatar.b_clearTeleportFlag(PiratesGlobals.TFCannonDefense)
        self._DistributedDefendWorld__isGameFull = False
        self.stopLooting()
        base.musicMgr.requestFadeOut(SoundGlobals.MUSIC_MINIGAME_CANNON)
        self.fsm.demand('Off')
        self.clearDefenseAmmo()
        self.sendUpdate('requestLeave', [])

    
    def requestStartBonusRound(self):
        if self.fsm.state == 'Victory':
            self.sendUpdate('requestStartBonusRound', [
                localAvatar.getDoId()])
        

    
    def setPlayerNames(self, names):
        self.endOfWaveData.playerNames = names

    
    def setShipsSunkWave(self, shipsSunk):
        self.endOfWaveData.shipsSunkWave = shipsSunk

    
    def setDamageDealtWave(self, damageDealt):
        self.endOfWaveData.damgeDealtWave = damageDealt

    
    def setShotsFiredWave(self, shots):
        self.endOfWaveData.shotsFiredWave = shots

    
    def setAccuracyWave(self, accuracy):
        self.endOfWaveData.accuracyWave = accuracy

    
    def setTimePlayed(self, time):
        self.endOfWaveData.timePlayed = time

    
    def setShipsSunkOverall(self, shipsSunk):
        self.endOfWaveData.shipsSunkOverall = shipsSunk

    
    def setDamageDealtOverall(self, damageDealt):
        self.endOfWaveData.damgeDealtOverall = damageDealt

    
    def setShotsFiredOverall(self, shots):
        self.endOfWaveData.shotsFiredOverall = shots

    
    def setAccuracyOverall(self, accuracy):
        self.endOfWaveData.accuracyOverall = accuracy

    
    def setGoldPaidOverall(self, gold):
        self.endOfWaveData.goldPaidOverall = gold

    
    def setTreasureStats(self, stolen, remaining, earned):
        self.endOfWaveData.treasureStolen = stolen
        self.endOfWaveData.treasureRemaining = remaining
        self.endOfWaveData.treasureEarned = earned

    
    def setAwardedGold(self, gold):
        self.endOfWaveData.myGoldEarned = gold

    
    def setBankNotes(self, bankNotes, totalBankNotes):
        messenger.send('incBankNotes', [
            bankNotes,
            totalBankNotes])

    
    def setExperience(self, experience, totalExperience):
        self.experiece = experience
        messenger.send('incDefenseCannonExp', [
            experience,
            totalExperience])

    
    def d_addUnlockedAmmo(self, ammoSkillId):
        self.sendUpdate('addUnlockedAmmo', [
            ammoSkillId])

    
    def setUnlockedAmmo(self, ammoSkillIds):
        messenger.send('unlockAmmo', [
            ammoSkillIds])

    
    def updateWaitTimer(self, timeLeft):
        self.fsm.updateCountDown(timeLeft)

    
    def d_sendMessage(self, senderId, message):
        self.sendUpdate('sendMessage', [
            senderId,
            message])

    
    def setMessage(self, senderId, senderName, message):
        base.talkAssistant.receiveCannonDefenseMessage(message, senderName)

    
    def getTypeName(self):
        return 'Defense Rewards'

    
    def clearDefenseAmmo(self):
        for cannonball in render.findAllMatches('**/=DefenseAmmo'):
            ammo = cannonball.getPythonTag('DefenseAmmo')
            if ammo:
                ammo.destroy()