示例#1
0
    def onBegin(self):

        bs.CoopGameActivity.onBegin(self)

        # spit out a few powerups and start dropping more shortly
        self._dropPowerups(standardPoints=True)
        bs.gameTimer(2000,bs.WeakCall(self._startPowerupDrops))
        bs.gameTimer(1,bs.WeakCall(self._startBotUpdates))
        self.setupLowLifeWarningSound()
        self._updateScores()
        self._bots = bs.BotSet()
        self._dingSound = bs.getSound('dingSmall')
        self._dingSoundHigh = bs.getSound('dingSmallHigh')

        # our TNT spawner (if applicable)
        self._tntSpawner = bs.TNTSpawner(position=self._tntSpawnPosition,respawnTime=10000)
    def onBegin(self):

        bs.CoopGameActivity.onBegin(self)
        playerCount = len(self.players)
        self._dingSound = bs.getSound('dingSmall')
        self._dingSoundHigh = bs.getSound('dingSmallHigh')

        hard = False if self._preset in [
            'trainingEasy', 'rookieEasy', 'proEasy', 'uberEasy'] else True

        if self._preset in ['training', 'trainingEasy']:
            import bsUtils
            bsUtils.ControlsHelpOverlay(
                delay=3000, lifespan=10000, bright=True).autoRetain()

            self._haveTnt = False
            self._excludePowerups = ['curse', 'landMines']
            self._waves = [

                {'baseAngle': 195,
                 'entries': ([
                     {'type': bs.BomberBotLame, 'spacing': 5},
                 ] * playerCount)},

                {'baseAngle': 130,
                 'entries': ([
                     {'type': bs.ToughGuyBotLame, 'spacing': 5},
                 ] * playerCount)},

                {'baseAngle': 195,
                 'entries': ([
                     {'type': bs.BomberBotLame, 'spacing': 10},
                 ] * (playerCount+1))},

                {'baseAngle': 130,
                 'entries': ([
                     {'type': bs.ToughGuyBotLame, 'spacing': 10},
                 ] * (playerCount+1))},

                {'baseAngle': 130,
                 'entries': ([
                     {'type': bs.ToughGuyBotLame,
                      'spacing': 5} if playerCount > 1 else None,
                     {'type': bs.ToughGuyBotLame, 'spacing': 5},
                     {'type': None, 'spacing': 30},
                     {'type': bs.BomberBotLame,
                      'spacing': 5} if playerCount > 3 else None,
                     {'type': bs.BomberBotLame, 'spacing': 5},
                     {'type': None, 'spacing': 30},
                     {'type': bs.ToughGuyBotLame, 'spacing': 5},
                     {'type': bs.ToughGuyBotLame,
                      'spacing': 5} if playerCount > 2 else None,
                 ])},

                {'baseAngle': 195,
                 'entries': ([
                     {'type': bs.SkeletonBot, 'spacing': 90},
                     {'type': bs.SkeletonBot,
                      'spacing': 90} if playerCount > 1 else None
                 ])},
            ]

        elif self._preset in ['rookie', 'rookieEasy']:
            self._haveTnt = False
            self._excludePowerups = ['curse']
            self._waves = [

                {'entries': [
                    {'type': bs.NinjaBot,
                     'point': 'LeftUpperMore'} if playerCount > 2 else None,
                    {'type': bs.NinjaBot, 'point': 'LeftUpper'},
                ]},

                {'entries': [
                    {'type': bs.BomberBotStaticLame, 'point': 'TurretTopRight'},
                    {'type': bs.ToughGuyBotLame, 'point': 'RightUpper'},
                    {'type': bs.ToughGuyBotLame, 'point': 'RightLower'} \
                    if playerCount > 1 else None,
                    {'type': bs.BomberBotStaticLame,
                     'point': 'TurretBottomRight'} if playerCount > 2 else None,
                ]},

                {'entries': [
                    {'type': bs.BomberBotStaticLame,
                     'point': 'TurretBottomLeft'},
                    {'type': bs.CallingBot,
                     'point': 'Left'},
                ]},
                {'entries': [
                    {'type': bs.ToughGuyBotLame, 'point': 'TopRight'},
                    {'type': bs.ToughGuyBot,
                     'point': 'TopHalfRight'} if playerCount > 1 else None,
                    {'type': bs.ToughGuyBotLame, 'point': 'TopLeft'},
                    {'type': bs.ToughGuyBotLame,
                     'point': 'TopHalfLeft'} if playerCount > 2 else None,
                    {'type': bs.ToughGuyBot, 'point': 'Top'},
                    {'type': bs.BomberBotStaticLame,
                     'point': 'TurretTopMiddle'},
                ]},

                {'entries': [
                    {'type': bs.ChickBotStatic, 'point': 'TurretBottomLeft'},
                    {'type': bs.ChickBotStatic, 'point': 'TurretBottomRight'},
                    {'type': bs.ChickBot, 'point': 'Bottom'},
                    {'type': bs.ChickBot,
                     'point': 'BottomHalfRight'} if playerCount > 1 else None,
                    {'type': bs.ChickBot,
                     'point': 'BottomHalfLeft'} if playerCount > 2 else None,
                ]},

                {'entries': [
                    {'type': bs.BomberBotStaticLame, 'point': 'TurretTopLeft'},
                    {'type': bs.BomberBotStaticLame, 'point': 'TurretTopRight'},
                    {'type': bs.NinjaBot, 'point': 'Bottom'},
                    {'type': bs.NinjaBot,
                     'point': 'BottomHalfLeft'} if playerCount > 1 else None,
                    {'type': bs.NinjaBot,
                     'point': 'BottomHalfRight'} if playerCount > 2 else None,
                ]},
            ]

        elif self._preset in ['pro', 'proEasy']:
            self._excludePowerups = ['curse']
            self._haveTnt = True
            self._waves = [

                {'baseAngle': -50,
                 'entries': ([
                     {'type': bs.ToughGuyBot,
                      'spacing': 12} if playerCount > 3 else None,
                     {'type': bs.ToughGuyBot, 'spacing': 12},
                     {'type': bs.BomberTNTBot, 'spacing': 1},
                     {'type': bs.BomberTNTBot, 'spacing': 6},
                     {'type': bs.BomberBot,
                         'spacing': 6} if self._preset == 'pro' else None,
                     {'type': bs.BomberBot,
                      'spacing': 6} if playerCount > 1 else None,
                     {'type': bs.ToughGuyBot, 'spacing': 12},
                     {'type': bs.ToughGuyBot,
                      'spacing': 12} if playerCount > 2 else None,
                 ])},

                {'baseAngle': 180,
                 'entries': ([
                     {'type': bs.ToughGuyBot,
                      'spacing': 6} if playerCount > 3 else None,
                     {'type': bs.ToughGuyBot,
                         'spacing': 6} if self._preset == 'pro' else None,
                     {'type': bs.ToughGuyBot, 'spacing': 6},
                     {'type': bs.SkeletonBot, 'spacing': 45},
                     {'type': bs.NinjaBot,
                      'spacing': 45} if playerCount > 1 else None,
                     {'type': bs.SkeletonBot, 'spacing': 6},
                     {'type': bs.ToughGuyBot,
                         'spacing': 6} if self._preset == 'pro' else None,
                     {'type': bs.ToughGuyBot,
                      'spacing': 6} if playerCount > 2 else None,
                 ])},

                {'baseAngle': 0,
                 'entries': ([
                     {'type': bs.NinjaBot, 'spacing': 30},
                     {'type': bs.BomberTNTBot, 'spacing': 30},
                     {'type': bs.BomberTNTBot, 'spacing': 30},
                     {'type': bs.ChickBot, 'spacing': 30},
                     {'type': bs.BomberTNTBot,
                         'spacing': 30} if self._preset == 'pro' else None,
                     {'type': bs.ChickBot,
                      'spacing': 30} if playerCount > 1 else None,
                     {'type': bs.ChickBot,
                      'spacing': 30} if playerCount > 3 else None,
                     {'type': bs.NinjaBot, 'spacing': 30},
                 ])},

                {'baseAngle': 90,
                 'entries': ([
                     {'type': bs.MelBot, 'spacing': 50},
                     {'type': bs.MelBot,
                      'spacing': 50} if self._preset == 'pro' else None,
                     {'type': bs.MelBot, 'spacing': 50},
                     {'type': bs.MelBot,
                      'spacing': 50} if playerCount > 1 else None,
                     {'type': bs.MelBot,
                      'spacing': 50} if playerCount > 3 else None,
                 ])},

                {'baseAngle': 0,
                 'entries': ([
                     {'type': bs.ChickBot, 'spacing': 72},
                     {'type': bs.ChickBot, 'spacing': 72},
                     {'type': bs.ChickBot,
                         'spacing': 72} if self._preset == 'pro' else None,
                     {'type': bs.ChickBot, 'spacing': 72},
                     {'type': bs.ChickBot, 'spacing': 72},
                     {'type': bs.ChickBot,
                      'spacing': 36} if playerCount > 2 else None,
                 ])},

                {'baseAngle': 30,
                 'entries': ([
                     {'type': bs.NinjaBotProShielded, 'spacing': 50},
                     {'type': bs.NinjaBotProShielded, 'spacing': 50},
                     {'type': bs.NinjaBotProShielded,
                         'spacing': 50} if self._preset == 'pro' else None,
                     {'type': bs.NinjaBotProShielded,
                         'spacing': 50} if playerCount > 1 else None,
                     {'type': bs.NinjaBotProShielded,
                         'spacing': 50} if playerCount > 2 else None,
                 ])},
            ]

        elif self._preset in ['uber', 'uberEasy']:

            # show controls help in kiosk mode
            if bs.getEnvironment()['kioskMode']:
                import bsUtils
                bsUtils.ControlsHelpOverlay(
                    delay=3000, lifespan=10000, bright=True).autoRetain()

            self._haveTnt = True
            self._excludePowerups = []
            self._waves = [

                {'entries': [
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopMiddleLeft'} if hard else None,
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopMiddleRight'},
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopLeft'} if playerCount > 2 else None,
                    {'type': bot.SantaBot, 'point': 'TopRight'},
                    {'type': 'delay', 'duration': 4000},
                    {'type': bot.SantaBot, 'point': 'TopLeft'},
                ]},

                {'entries': [
                    {'type': bs.SkeletonBot, 'point': 'Left'},
                    {'type': bs.SkeletonBot, 'point': 'Right'},
                    {'type': bs.NinjaBot, 'point': 'Right'},
                    {'type': bs.NinjaBot,
                     'point': 'RightUpperMore'} if playerCount > 2 else None,
                    {'type': bs.BomberBotProStatic, 'point': 'TurretTopLeft'},
                    {'type': bs.BomberBotProStatic, 'point': 'TurretTopRight'},
                ]},

                {'entries': [
                    {'type': bs.ChickBotPro, 'point': 'TopRight'},
                    {'type': bs.ChickBotPro,
                     'point': 'RightUpperMore'} if playerCount > 1 else None,
                    {'type': bs.ChickBotPro, 'point': 'RightUpper'},
                    {'type': bs.ChickBotPro,
                     'point': 'RightLower'} if hard else None,
                    {'type': bs.ChickBotPro,
                     'point': 'RightLowerMore'} if playerCount > 2 else None,
                    {'type': bs.ChickBotPro, 'point': 'BottomRight'},
                ]},

                {'entries': [
                    {'type': bs.NinjaBotProShielded, 'point': 'BottomRight'},
                    {'type': bs.NinjaBotProShielded,
                     'point': 'Bottom'} if playerCount > 2 else None,
                    {'type': bs.NinjaBotProShielded, 'point': 'BottomLeft'},
                    {'type': bs.NinjaBotProShielded,
                     'point': 'Top'} if hard else None,
                    {'type': bs.BomberBotProStatic, 'point': 'TurretTopMiddle'},
                ]},

                {'entries': [
                    {'type': bs.PirateBot, 'point': 'LeftUpper'},
                    {'type': 'delay', 'duration': 1000},
                    {'type': bs.ToughGuyBotProShielded, 'point': 'LeftLower'},
                    {'type': bs.ToughGuyBotProShielded,
                     'point': 'LeftLowerMore'},
                    {'type': 'delay', 'duration': 4000},
                    {'type': bs.PirateBot, 'point': 'RightUpper'},
                    {'type': 'delay', 'duration': 1000},
                    {'type': bs.ToughGuyBotProShielded, 'point': 'RightLower'},
                    {'type': bs.ToughGuyBotProShielded,
                     'point': 'RightUpperMore'},
                    {'type': 'delay', 'duration': 4000},
                    {'type': bs.PirateBot, 'point': 'Left'},
                    {'type': 'delay', 'duration': 5000},
                    {'type': bs.PirateBot, 'point': 'Right'},
                ]},

                {'entries': [
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopLeft'},
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopRight'},
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretBottomLeft'},
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretBottomRight'},
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopMiddleLeft'} if hard else None,
                    {'type': bs.BomberBotProStatic,
                     'point': 'TurretTopMiddleRight'} if hard else None,
                ]},
            ]
        # we generate these on the fly in endless..
        elif self._preset in ['endless', 'endlessTournament']:
            self._haveTnt = True
            self._excludePowerups = []

        else:
            raise Exception("Invalid preset: "+str(self._preset))

        # FIXME - should migrate to use setupStandardPowerupDrops()

        # spit out a few powerups and start dropping more shortly
        self._dropPowerups(
            standardPoints=True, powerupType='curse'
            if self._preset
            in ['uber', 'uberEasy']
            else(
                'landMines'
                if self._preset in ['rookie', 'rookieEasy'] else None))
        bs.gameTimer(4000, self._startPowerupDrops)
        # our TNT spawner (if applicable)
        if self._haveTnt:
            self._tntSpawner = bs.TNTSpawner(position=self._tntSpawnPosition)

        self.setupLowLifeWarningSound()

        self._updateScores()
        self._bots = bs.BotSet()

        bs.gameTimer(4000, self._startUpdatingWaves)
示例#3
0
    def onBegin(self):
        bs.CoopGameActivity.onBegin(self)

        # show controls help in kiosk mode
        if bs.getEnvironment()['kioskMode']:
            import bsUtils
            bsUtils.ControlsHelpOverlay(delay=3000,
                                        lifespan=10000,
                                        bright=True).autoRetain()

        if self._preset in ['rookie', 'rookieEasy']:
            self._excludePowerups = ['curse']
            self._haveTnt = False
            tgb = bs.ToughGuyBotLame if self._preset == 'rookieEasy' else bs.ToughGuyBot
            self._botTypesInitial = [tgb] * len(self.initialPlayerInfo)
            bb = bs.BomberBotLame if self._preset == 'rookieEasy' else bs.BomberBot
            self._botTypes7 = [bb] * (1 if len(self.initialPlayerInfo) < 3 else
                                      2)
            cb = bs.BomberBot if self._preset == 'rookieEasy' else bs.ChickBot
            self._botTypes14 = [cb] * (1 if len(self.initialPlayerInfo) < 3
                                       else 2)
        elif self._preset == 'tournament':
            self._excludePowerups = []
            self._haveTnt = True
            self._botTypesInitial = [bs.ToughGuyBot] * (
                1 if len(self.initialPlayerInfo) < 2 else 2)
            self._botTypes7 = [bs.ChickBot] * (
                1 if len(self.initialPlayerInfo) < 3 else 2)
            self._botTypes14 = [bs.NinjaBot] * (
                1 if len(self.initialPlayerInfo) < 4 else 2)
        elif self._preset in ['pro', 'proEasy', 'tournamentPro']:
            self._excludePowerups = ['curse']
            self._haveTnt = True
            self._botTypesInitial = [bs.NinjaBot] * len(self.initialPlayerInfo)
            tgb = bs.ToughGuyBot if self._preset == 'pro' else bs.ToughGuyBotLame
            self._botTypes7 = [
                tgb
            ] + [bs.BomberBot] * (1 if len(self.initialPlayerInfo) < 3 else 2)
            cb = bs.ChickBotPro if self._preset == 'pro' else bs.ChickBot
            self._botTypes14 = [cb] * (1 if len(self.initialPlayerInfo) < 3
                                       else 2)
        elif self._preset in ['uber', 'uberEasy']:
            self._excludePowerups = []
            self._haveTnt = True
            tgb = bs.ToughGuyBotPro if self._preset == 'uber' else bs.ToughGuyBot
            cb = bs.ChickBotPro if self._preset == 'uber' else bs.ChickBot
            self._botTypesInitial = [bs.MelBot
                                     ] + [tgb] * len(self.initialPlayerInfo)
            self._botTypes7 = [cb] * (1 if len(self.initialPlayerInfo) < 3 else
                                      2)
            self._botTypes14 = [bs.PirateBot] * (
                1 if len(self.initialPlayerInfo) < 3 else 2)
        else:
            raise Exception()

        self.setupLowLifeWarningSound()

        self._dropPowerups(standardPoints=True)
        bs.gameTimer(4000, self._startPowerupDrops)

        # make a bogus team for our bots
        # badTeamName = self.getTeamNameLocalized('Bad Guys')
        badTeamName = self.getTeamDisplayString('Bad Guys')
        self._botTeam = bs.Team(1, badTeamName, (0.5, 0.4, 0.4))

        for team in [self.teams[0], self._botTeam]:
            team.gameData['score'] = 0

        self.updateScores()

        # time
        self._startTime = bs.getGameTime()
        self._timeText = bs.NodeActor(
            bs.newNode('text',
                       attrs={
                           'vAttach': 'top',
                           'hAttach': 'center',
                           'hAlign': 'center',
                           'color': (1, 1, 0.5, 1),
                           'flatness': 0.5,
                           'shadow': 0.5,
                           'position': (0, -50),
                           'scale': 1.3,
                           'text': ''
                       }))

        self._timeTextInput = bs.NodeActor(
            bs.newNode('timeDisplay', attrs={'showSubSeconds': True}))
        bs.getSharedObject('globals').connectAttr('gameTime',
                                                  self._timeTextInput.node,
                                                  'time2')
        self._timeTextInput.node.connectAttr('output', self._timeText.node,
                                             'text')

        # self._updateTime()

        # update fast enough so it looks continuous
        # self._timeTextTimer = bs.Timer(43,self._updateTime,repeat=True)

        # our TNT spawner (if applicable)
        if self._haveTnt:
            self._tntSpawner = bs.TNTSpawner(position=(0, 1, -1))

        self._bots = bs.BotSet()
        self._botSpawnTimer = bs.Timer(1000, self._updateBots, repeat=True)

        for b in self._botTypesInitial:
            self._spawnBot(b)
示例#4
0
    def onBegin(self):

        bs.CoopGameActivity.onBegin(self)
        self._dingSound = bs.getSound('dingSmall')
        self._dingSoundHigh = bs.getSound('dingSmallHigh')

        playerCount = len(self.players)

        hard = False if self._preset in ['proEasy', 'uberEasy'] else True

        if self._preset in ['pro', 'proEasy', 'tournament']:
            self._excludePowerups = ['curse']
            self._haveTnt = True
            self._waves = [
                {'entries': [
                    {'type': bs.BomberBot, 'path': 3 if hard else 2},
                    {'type': bs.BomberBot, 'path': 2},
                    {'type': bs.BomberBot, 'path': 2} if hard else None,
                    {'type': bs.BomberBot, 'path': 2} if playerCount > 1 \
                    else None,
                    {'type': bs.BomberBot, 'path': 1} if hard else None,
                    {'type': bs.BomberBot, 'path': 1} if playerCount > 2 \
                    else None,
                    {'type': bs.BomberBot, 'path': 1} if playerCount > 3 \
                    else None,
                ]},
                {'entries': [
                    {'type': bs.BomberBot, 'path': 1} if hard else None,
                    {'type': bs.BomberBot, 'path': 2} if hard else None,
                    {'type': bs.BomberBot, 'path': 2},
                    {'type': bs.BomberBot, 'path': 2},
                    {'type': bs.BomberBot, 'path': 2} if playerCount > 3 \
                    else None,
                    {'type': bs.ToughGuyBot, 'path': 3},
                    {'type': bs.ToughGuyBot, 'path': 3},
                    {'type': bs.ToughGuyBot, 'path': 3} if hard else None,
                    {'type': bs.ToughGuyBot, 'path': 3} if playerCount > 1 \
                    else None,
                    {'type': bs.ToughGuyBot, 'path': 3} if playerCount > 2 \
                    else None,
                ]},
                {'entries': [
                    {'type': bs.NinjaBot, 'path': 2} if hard else None,
                    {'type': bs.NinjaBot, 'path': 2} if playerCount > 2 \
                    else None,
                    {'type': bs.ChickBot, 'path': 2},
                    {'type': bs.ChickBot, 'path': 2} if playerCount > 1 \
                    else None,
                    {'type': 'spacing', 'duration': 3000},
                    {'type': bs.BomberBot, 'path': 2} if hard else None,
                    {'type': bs.BomberBot, 'path': 2} if hard else None,
                    {'type': bs.BomberBot, 'path': 2},
                    {'type': bs.BomberBot, 'path': 3} if hard else None,
                    {'type': bs.BomberBot, 'path': 3},
                    {'type': bs.BomberBot, 'path': 3},
                    {'type': bs.BomberBot, 'path': 3} if playerCount > 3 \
                    else None,
                ]},
                {'entries': [
                    {'type': bs.ChickBot, 'path': 1} if hard else None,
                    {'type': 'spacing', 'duration': 1000} if hard else None,
                    {'type': bs.ChickBot, 'path': 2},
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 3},
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 1} if hard else None,
                    {'type': 'spacing', 'duration': 1000} if hard else None,
                    {'type': bs.ChickBot, 'path': 2},
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 3},
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 1} if (playerCount > 1 \
                                                         and hard) else None,
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 2} if playerCount > 2 \
                    else None,
                    {'type': 'spacing', 'duration': 1000},
                    {'type': bs.ChickBot, 'path': 3} if playerCount > 3 \
                    else None,
                    {'type': 'spacing', 'duration': 1000},
                ]},
                {'entries': [
                    {'type': bs.NinjaBotProShielded if hard else bs.NinjaBot,
                     'path': 1},
                    {'type': bs.ToughGuyBot, 'path': 2} if hard else None,
                    {'type': bs.ToughGuyBot, 'path': 2},
                    {'type': bs.ToughGuyBot, 'path': 2},
                    {'type': bs.ToughGuyBot, 'path': 3} if hard else None,
                    {'type': bs.ToughGuyBot, 'path': 3},
                    {'type': bs.ToughGuyBot, 'path': 3},
                    {'type': bs.ToughGuyBot, 'path': 3} if playerCount > 1 \
                    else None,
                    {'type': bs.ToughGuyBot, 'path': 3} if playerCount > 2 \
                    else None,
                    {'type': bs.ToughGuyBot, 'path': 3} if playerCount > 3 \
                    else None,
                ]},
                {'entries': [
                    {'type': bs.BomberBotProShielded, 'path': 3},
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 1} if hard \
                    else None,
                    {'type': 'spacing', 'duration': 1000} if hard else None,
                    {'type': bs.BomberBotProShielded, 'path': 3},
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 1} if hard \
                    else None,
                    {'type': 'spacing', 'duration': 1500} if hard else None,
                    {'type': bs.BomberBotProShielded, 'path': 3} \
                    if playerCount > 1 else None,
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 2} \
                    if playerCount > 2 else None,
                    {'type': 'spacing', 'duration': 1500},
                    {'type': bs.BomberBotProShielded, 'path': 1} \
                    if playerCount > 3 else None,
                ]},
            ]
        elif self._preset in ['uberEasy', 'uber', 'tournamentUber']:
            self._excludePowerups = []
            self._haveTnt = True
            self._waves = [
                {'entries': [
                    {'type': bs.ChickBot, 'path': 1} if hard else None,
                    {'type': bs.ChickBot, 'path': 2},
                    {'type': bs.ChickBot, 'path': 2},
                    {'type': bs.ChickBot, 'path': 3},
                    {'type': bs.ToughGuyBotPro if hard else bs.ToughGuyBot,
                     'point': 'BottomLeft'},
                    {'type': bs.ToughGuyBotPro, 'point': 'BottomRight'} \
                    if playerCount > 2 else None,
                ]},
                {'entries': [
                    {'type': bs.NinjaBot, 'path': 2},
                    {'type': bs.NinjaBot, 'path': 3},
                    {'type': bs.NinjaBot, 'path': 1} if hard else None,
                    {'type': bs.NinjaBot, 'path': 2},
                    {'type': bs.NinjaBot, 'path': 3},
                    {'type': bs.NinjaBot, 'path': 1} if playerCount > 2 \
                    else None,
                ]},
                {'entries': [
                    {'type': bs.BomberBotProShielded, 'path': 1} if hard \
                    else None,
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.BomberBotProShielded, 'path': 3},
                    {'type': bs.BomberBotProShielded, 'path': 3},
                    {'type': bs.NinjaBot, 'point': 'BottomRight'},
                    {'type': bs.NinjaBot, 'point': 'BottomLeft'} \
                    if playerCount > 2 else None,
                ]},
                {'entries': [
                    {'type': bs.ChickBotPro, 'path': 1} if hard else None,
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2},
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2},
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2},
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2},
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2},
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2} \
                    if playerCount > 1 else None,
                    {'type': bs.ChickBotPro, 'path': 1 if hard else 2} \
                    if playerCount > 3 else None,
                ]},
                {'entries': [
                    {'type': bs.ChickBotProShielded if hard else bs.ChickBotPro,
                     'point': 'BottomLeft'},
                    {'type': bs.ChickBotProShielded, 'point': 'BottomRight'} \
                    if hard else None,
                    {'type': bs.ChickBotProShielded, 'point': 'BottomRight'} \
                    if playerCount > 2 else None,
                    {'type': bs.BomberBot, 'path': 3},
                    {'type': bs.BomberBot, 'path': 3},
                    {'type': 'spacing', 'duration': 5000},
                    {'type': bs.ToughGuyBot, 'path': 2},
                    {'type': bs.ToughGuyBot, 'path': 2},
                    {'type': 'spacing', 'duration': 5000},
                    {'type': bs.ChickBot, 'path': 1} if hard else None,
                    {'type': bs.ChickBot, 'path': 1} if hard else None,
                ]},
                {'entries': [
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.BomberBotProShielded, 'path': 2} if hard \
                    else None,
                    {'type': bs.MelBot, 'point': 'BottomRight'},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.MelBot, 'point': 'BottomRight'} \
                    if playerCount > 2 else None,
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.PirateBot, 'point': 'BottomLeft'},
                    {'type': bs.BomberBotProShielded, 'path': 2},
                    {'type': bs.BomberBotProShielded, 'path': 2} \
                    if playerCount > 1 else None,
                    {'type': 'spacing', 'duration': 5000},
                    {'type': bs.MelBot, 'point': 'BottomLeft'},
                    {'type': 'spacing', 'duration': 2000},
                    {'type': bs.PirateBot, 'point': 'BottomRight'},
                ]},
            ]
        elif self._preset in ['endless', 'endlessTournament']:
            self._excludePowerups = []
            self._haveTnt = True

        # spit out a few powerups and start dropping more shortly
        self._dropPowerups(standardPoints=True)
        bs.gameTimer(4000, self._startPowerupDrops)
        self.setupLowLifeWarningSound()
        self._updateScores()
        self._bots = bs.BotSet()

        # our TNT spawner (if applicable)
        if self._haveTnt:
            self._tntSpawner = bs.TNTSpawner(position=self._tntSpawnPosition)

        # make sure to stay out of the way of menu/party buttons in the corner
        interfaceType = bs.getEnvironment()['interfaceType']
        lOffs = (-80 if interfaceType == 'small' else
                 -40 if interfaceType == 'medium' else 0)

        self._livesBG = bs.NodeActor(
            bs.newNode('image',
                       attrs={
                           'texture': self._heartTex,
                           'modelOpaque': self._heartModelOpaque,
                           'modelTransparent': self._heartModelTransparent,
                           'attach': 'topRight',
                           'scale': (90, 90),
                           'position': (-110 + lOffs, -50),
                           'color': (1, 0.2, 0.2)
                       }))
        vr = bs.getEnvironment()['vrMode']
        self._startLives = 10
        self._lives = self._startLives
        self._livesText = bs.NodeActor(
            bs.newNode('text',
                       attrs={
                           'vAttach': 'top',
                           'hAttach': 'right',
                           'hAlign': 'center',
                           'color': (1, 1, 1, 1) if vr else
                           (0.8, 0.8, 0.8, 1.0),
                           'flatness': 1.0 if vr else 0.5,
                           'shadow': 1.0 if vr else 0.5,
                           'vrDepth': 10,
                           'position': (-113 + lOffs, -69),
                           'scale': 1.3,
                           'text': str(self._lives)
                       }))

        bs.gameTimer(2000, self._startUpdatingWaves)