Пример #1
0
 def _handleCapsuleStorage(self,pos,player):
     self.capsules = player.gameData['capsules']
     
     if player.gameData['capsules'] > 10: 
         player.gameData['capsules'] = 10
         self.capsules = 10
         bsUtils.PopupText('Full Capacity!',
                         color=(1,0.85,0),
                         scale=1.75,
                         position=(pos[0],pos[1]-1,pos[2])).autoRetain()
     # Make a different color and size depending on the storage
     if self.capsules > 7:
         self.color = (1,0,0)
         self.size = 2.4
     elif self.capsules > 7:
         self.color = (1,0.4,0.4)
         self.size = 2.1
     elif self.capsules > 4:
         self.color = (1,1,0.4)
         self.size = 2.0
     else:
         self.color = (1,1,1)
         self.size = 1.9
     if self.capsules < 10:
         bsUtils.PopupText((str(player.gameData['capsules'])),
                                         color=self.color,
                                         scale=self.size+(0.02*self.capsules),
                                         position=(pos[0],pos[1]-1,pos[2])).autoRetain()
Пример #2
0
            def _apply(name, score, showPoints, color, scale, sound):

                # only award this if they're still alive and we can get their pos
                try:
                    ourPos = self.getSpaz().node.position
                except Exception:
                    return

                # jitter position a bit since these often come in clusters
                ourPos = (ourPos[0] + (random.random() - 0.5) * 2.0,
                          ourPos[1] + (random.random() - 0.5) * 2.0,
                          ourPos[2] + (random.random() - 0.5) * 2.0)
                activity = self.getActivity()
                if activity is not None:
                    bsUtils.PopupText(
                        # (('+'+str(score)+' ') if showPoints else '')+name,
                        bs.Lstr(value=(
                            ('+' + str(score) + ' ') if showPoints else '') +
                                '${N}',
                                subs=[('${N}', name)]),
                        color=color,
                        scale=scale,
                        position=ourPos).autoRetain()
                bs.playSound(sound)

                self.score += score
                self.accumScore += score

                # inform a running game of the score
                if score != 0 and activity is not None:
                    activity.handleMessage(PlayerScoredMessage(score=score))
Пример #3
0
 def checkVal(val):
     self._powersGiven = True
     if val and spaz.isAlive():
         m = bs.newNode('math',
                        owner=spaz,
                        attrs={
                            'input1': (0, 1.3, 0),
                            'operation': 'add'
                        })
         spaz.node.connectAttr('torsoPosition', m,
                               'input2')
         activatedText = bsUtils.PopupText(
             "ACTIVATED",
             color=(1, 1, 1),
             scale=0.7,
             offset=(0, -1, 0)).autoRetain()
         m.connectAttr('output', activatedText.node,
                       'position')
         bs.playSound(
             bs.Powerup.getFactory().martyrdomPickSound,
             position=spaz.node.position)
         spaz.isDropped = True
         spaz.dropss = bs.Timer(1,
                                bs.Call(checkDead),
                                repeat=True)
Пример #4
0
 def _onCapsulePlayerCollide(self):
     if not self.hasEnded():
         capsuleNode, playerNode = bs.getCollisionInfo('sourceNode','opposingNode')
         if capsuleNode is not None and playerNode is not None:
             capsule = capsuleNode.getDelegate()
             spaz = playerNode.getDelegate()
             player = spaz.getPlayer() if hasattr(spaz,'getPlayer') else None
             if player is not None and player.exists() and capsule is not None:
                 if player.isAlive():
                     if capsuleNode.colorTexture == self._capsuleLuckyTex:
                         player.gameData['capsules'] += 4
                         bsUtils.PopupText('BONUS!',
                                           color=(1,1,0),
                                           scale=1.5,
                                           position=(capsuleNode.position)).autoRetain()
                         bs.playSound(self._luckyCollectSound,1.0,position=capsuleNode.position)
                         bs.emitBGDynamics(position=capsuleNode.position,velocity=(0,0,0),count=int(6.4+random.random()*24),scale=1.2, spread=2.0,chunkType='spark');
                         bs.emitBGDynamics(position=capsuleNode.position,velocity=(0,0,0),count=int(4.0+random.random()*6),emitType='tendrils');
                     else:
                         player.gameData['capsules'] += 1
                         bs.playSound(self._collectSound,0.6,position=capsuleNode.position)
                     # create a flash
                     light = bs.newNode('light',
                                     attrs={'position': capsuleNode.position,
                                             'heightAttenuated':False,
                                             'radius':0.1,
                                             'color':(1,1,0)})
                     
                     # Create a short text informing about your inventory
                     self._handleCapsuleStorage(playerNode.position,player)
                     
                     bs.animate(light,'intensity',{0:0,100:0.5,200:0},loop=False)
                     bs.gameTimer(200,light.delete)
                     capsule.handleMessage(bs.DieMessage())
Пример #5
0
 def checkFreezer(val):
     self._powersGiven = True
     if spaz.isAlive() and spaz.node.invincible:
         bs.playSound(
             bs.Powerup.getFactory().blockSound,
             position=spaz.node.position)
     if spaz.isAlive() and not spaz.node.invincible:
         setattr(spaz, 'frozen', val)
     if val and spaz.isAlive(
     ) and not spaz.node.invincible:
         spaz.node.frozen = 1
         m = bs.newNode('math',
                        owner=spaz,
                        attrs={
                            'input1': (0, 1.3, 0),
                            'operation': 'add'
                        })
         spaz.node.connectAttr('torsoPosition', m,
                               'input2')
         opsText = bsUtils.PopupText(
             "Oops!",
             color=(1, 1, 1),
             scale=0.9,
             offset=(0, -1, 0)).autoRetain()
         m.connectAttr('output', opsText.node,
                       'position')
         bs.playSound(
             bs.Powerup.getFactory().iceCubeSound,
             position=spaz.node.position)
     if not val and spaz.isAlive():
         spaz.node.frozen = 0
Пример #6
0
def newPlayerSpazDeathMessageInit(self, spaz, wasKilled, killerPlayer, how):
        """
        Instantiate a message with the given values.
        """
        self.spaz = spaz
        self.killed = wasKilled
        self.killerPlayer = killerPlayer
        self.how = how

        deff = bs.getConfig()["effectsMod"]["deathEffect"]

        if deff == "none": pass
        elif deff == "bones":
                #self.node.dead = False
            char = 'Bones'
            factory = self.spaz.getFactory()
            media = factory._getMedia(char)
            self.spaz.node.colorTexture=media['colorTexture']
            self.spaz.node.colorMaskTexture=media['colorMaskTexture']
            self.spaz.node.headModel=media['headModel']
            self.spaz.node.torsoModel=media['torsoModel']
            self.spaz.node.pelvisModel=media['pelvisModel']
            self.spaz.node.upperArmModel=media['upperArmModel']
            self.spaz.node.foreArmModel=media['foreArmModel']
            self.spaz.node.handModel=media['handModel']
            self.spaz.node.upperLegModel=media['upperLegModel']
            self.spaz.node.lowerLegModel=media['lowerLegModel']
            self.spaz.node.toesModel=media['toesModel']
            self.spaz.node.style=factory._getStyle(char)
        
        elif deff == 'show':doRing(self,deff)
        elif deff == 'xplode':doRing(self,deff)
        elif deff == 'fly':
            if self.spaz.shattered: pass
            def update():
                pos = self.spaz.node.position
                self.spaz.node.handleMessage("impulse",pos[0],pos[1]+0.5,pos[2],0,5,0,3,10,0,0, 0,5,0)
            delay = 0
            for i in range(40):
                bs.gameTimer(delay,bs.Call(update))
                delay += 50
        elif deff == 'skull':
            pos = self.spaz.node.position
            bsUtils.PopupText(bs.getSpecialChar('skull'),color=(1,1,1),scale=5,position=(pos[0],pos[1]-2,pos[2])).autoRetain()
            bs.emitBGDynamics(position=self.spaz.node.position,velocity=self.spaz.node.velocity,count=int(4.0+random.random()*30),emitType='tendrils');
            #bs.emitBGDynamics(position=self.node.position,velocity=(0,10,0),count=100,spread=0.3,scale=3,chunkType='sweat');
        else:
            delay = 0
            for i in range(5):
                bs.gameTimer(delay,bs.Call(doRing,self,deff))
                delay += 300
        def regeneration():

            try:
                if self.node.exists(
                ) and self.hitPoints < self.hitPointsMax and self.hitPoints > 249:
                    bsUtils.PopupText(
                        "+10",
                        color=(0, 1, 0),
                        scale=1.7,
                        position=self.node.position).autoRetain()
                    self.hitPoints += 10
                    bs.gameTimer(4000, bs.Call(regeneration))
                else:
                    bs.gameTimer(3500, bs.Call(regeneration))
            except:
                pass
Пример #8
0
 def _doSleep(self):
     if self._isSleep == False:
         for i in bs.getActivity().players:
             try:
                 if i.actor.exists() and i.actor.isAlive():
                     i.actor.node.handleMessage("knockout", 3000)
                     zZZText = bsUtils.PopupText(
                         "Z",
                         color=(1, 1, 1),
                         scale=0.7,
                         randomOffset=0.2,
                         offset=(0, -1, 0),
                         position=(i.actor.node.position[0],
                                   i.actor.node.position[1] - 1.2,
                                   i.actor.node.position[2])).autoRetain()
             except Exception as e:
                 print('SleepRace : _doSleep : in try block : Exception : '
                       ), e
Пример #9
0
class ScoreSet(object):
    """ Manages individual score keeping for players; provides persistant scores and some other goodies.
    Players are indexed here by name so that if a player leaves and comes back he'll keep the same score """
    class _Player(object):
        def __init__(self, name, nameFull, player, scoreSet):
            self.name = name
            self.nameFull = nameFull
            self.score = 0
            self.accumScore = 0
            self.killCount = 0
            self.accumKillCount = 0
            self.killedCount = 0
            self.accumKilledCount = 0
            self.betrayCount = 0
            self.accumBetrayCount = 0
            self._multiKillTimer = None
            self._multiKillCount = 0
            self._scoreSet = weakref.ref(scoreSet)
            self._associateWithPlayer(player)

        def getTeam(self):
            return self.team()

        def getPlayer(self):
            return self._player

        def getName(self, full=False):
            return self.nameFull if full else self.name

        def getIcon(self):
            return self.lastPlayer.getIcon()

        def getSpaz(self):
            if self._spaz is None: return None
            return self._spaz()

        def cancelMultiKillTimer(self):
            self._multiKillTimer = None

        def getActivity(self):
            try:
                return self._scoreSet()._activity()
            except Exception:
                return None

        def _associateWithPlayer(self, player):
            self.lastPlayer = player
            self._player = player
            self.team = weakref.ref(player.getTeam())
            self.character = player.character
            self._spaz = None
            self.streak = 0

        def _endMultiKill(self):

            self._multiKillTimer = None
            self._multiKillCount = 0

        def submitKill(self, showPoints=True):
            self._multiKillCount += 1

            if self._multiKillCount == 1:
                score = 0
                name = None
            elif self._multiKillCount == 2:
                score = 20
                name = bs.Lstr(resource='twoKillText')
                color = (0.1, 1.0, 0.0, 1)
                scale = 1.0
                delay = 0
                sound = self._scoreSet()._orchestraHitSound
            elif self._multiKillCount == 3:
                score = 40
                name = bs.Lstr(resource='threeKillText')
                color = (1.0, 0.7, 0.0, 1)
                scale = 1.1
                delay = 300
                sound = self._scoreSet()._orchestraHitSound2
            elif self._multiKillCount == 4:
                score = 60
                name = bs.Lstr(resource='fourKillText')
                color = (1.0, 1.0, 0.0, 1)
                scale = 1.2
                delay = 600
                sound = self._scoreSet()._orchestraHitSound3
            elif self._multiKillCount == 5:
                score = 80
                name = bs.Lstr(resource='fiveKillText')
                color = (1.0, 0.5, 0.0, 1)
                scale = 1.3
                delay = 900
                sound = self._scoreSet()._orchestraHitSound4
            else:
                score = 100
                name = bs.Lstr(resource='multiKillText',
                               subs=[('${COUNT}', str(self._multiKillCount))])
                color = (1.0, 0.5, 0.0, 1)
                scale = 1.3
                delay = 1000
                sound = self._scoreSet()._orchestraHitSound4

            def _apply(name, score, showPoints, color, scale, sound):

                # only award this if they're still alive and we can get their pos
                try:
                    ourPos = self.getSpaz().node.position
                except Exception:
                    return

                # jitter position a bit since these often come in clusters
                ourPos = (ourPos[0] + (random.random() - 0.5) * 2.0,
                          ourPos[1] + (random.random() - 0.5) * 2.0,
                          ourPos[2] + (random.random() - 0.5) * 2.0)
                activity = self.getActivity()
                if activity is not None:
                    bsUtils.PopupText(
                        # (('+'+str(score)+' ') if showPoints else '')+name,
                        bs.Lstr(value=(
                            ('+' + str(score) + ' ') if showPoints else '') +
                                '${N}',
                                subs=[('${N}', name)]),
                        color=color,
                        scale=scale,
                        position=ourPos).autoRetain()
                bs.playSound(sound)

                self.score += score
                self.accumScore += score

                # inform a running game of the score
                if score != 0 and activity is not None:
                    activity.handleMessage(PlayerScoredMessage(score=score))

            if name is not None:
                bs.gameTimer(
                    300 + delay,
                    bs.Call(_apply, name, score, showPoints, color, scale,
                            sound))

            # keep the tally rollin'...
            # set a timer for a bit in the future
            self._multiKillTimer = bs.Timer(1000, self._endMultiKill)

    def __init__(self):
        self._activity = None
        self._players = {}

    def setActivity(self, activity):
        self._activity = None if activity is None else weakref.ref(activity)

        # load our media into this activity's context
        if activity is not None:
            if activity.isFinalized():
                bs.printError('unexpected finalized activity')
            with bs.Context(activity):
                self._loadMedia()

    def _loadMedia(self):
        self._orchestraHitSound = bs.getSound('orchestraHit')
        self._orchestraHitSound2 = bs.getSound('orchestraHit2')
        self._orchestraHitSound3 = bs.getSound('orchestraHit3')
        self._orchestraHitSound4 = bs.getSound('orchestraHit4')

    def reset(self):
        # just to be safe, lets make sure no multi-kill timers are gonna go off
        # for no-longer-on-the-list players
        for p in self._players.values():
            p.cancelMultiKillTimer()
        self._players = {}  # our dict of players indexed by name

    # for things like per-round sub-scores..
    def resetAccum(self):
        for p in self._players.values():
            p.cancelMultiKillTimer()
            p.accumScore = 0
            p.accumKillCount = 0
            p.accumKilledCount = 0
            p.accumBetrayCount = 0
            p.streak = 0

    def registerPlayer(self, player):
        name = player.getName()
        nameFull = player.getName(full=True)
        try:
            # if the player already exists, update his character and such as it may have changed
            self._players[name]._associateWithPlayer(player)
        except Exception:
            p = self._players[name] = self._Player(name, nameFull, player,
                                                   self)

    def getValidPlayers(self):
        validPlayers = {}

        # go through our player records and return ones whose player id still corresponds to a player with that name
        for pName, p in self._players.items():
            try:
                exists = (p.lastPlayer.exists()
                          and p.lastPlayer.getName() == pName)
            except Exception:
                exists = False
            if exists:
                validPlayers[pName] = p
        return validPlayers

    def _getSpaz(self, player):
        p = self._players[player.getName()]
        # this is a weak-ref
        if p._spaz is None: return None
        return p._spaz()

    def playerGotNewSpaz(self, player, spaz):
        p = self._players[player.getName()]
        if p.getSpaz() is not None:
            raise Exception(
                "got 2 playerGotNewSpaz() messages in a row without a lost-spaz message"
            )
        p._spaz = weakref.ref(spaz)

    def playerGotHit(self, player):
        p = self._players[player.getName()]
        p.streak = 0

    def playerScored(self,
                     player,
                     basePoints=1,
                     target=None,
                     kill=False,
                     victimPlayer=None,
                     scale=1.0,
                     color=None,
                     title=None,
                     screenMessage=True,
                     display=True,
                     importance=1,
                     showPoints=True,
                     bigMessage=False):
        """ register a score for the player; return value is actual score with multipliers and such factored in """

        name = player.getName()
        p = self._players[name]

        # if title is None: title = ''

        if kill: p.submitKill(showPoints=showPoints)

        displayColor = (1, 1, 1, 1)

        if color is not None: displayColor = color
        elif importance != 1:
            displayColor = (1.0, 1.0, 0.4, 1)
        points = basePoints
        exc = ''

        # if they want a big announcement, throw a zoom-text up there
        if display and bigMessage:
            try:
                activity = self._activity()
                if activity:
                    nameFull = player.getName(full=True, icon=False)
                    activity.showZoomMessage(bs.Lstr(resource='nameScoresText',
                                                     subs=[('${NAME}',
                                                            nameFull)]),
                                             color=bsUtils.getNormalizedColor(
                                                 player.getTeam().color))
            except Exception, e:
                print 'Exception showing bigMessage', e

        # if we currently have a spaz, pop up a score over it
        if display and showPoints:
            try:
                ourPos = p.getSpaz().node.position
            except Exception:
                ourPos = None
            if ourPos is not None:
                if target is None: target = ourPos

                # if display-pos is *way* lower than us, raise it up
                # (so we can still see scores from dudes that fell off cliffs)
                displayPos = (target[0], max(target[1], ourPos[1] - 2.0),
                              min(target[2], ourPos[2] + 2.0))

                # bs.printError('ignoring title arg in playerScored:',title)
                # if type(title) != str or title != '': title = ' '+title

                activity = self._activity()
                if activity is not None:
                    if title is not None:
                        s = bs.Lstr(value='+${A} ${B}',
                                    subs=[('${A}', str(points)),
                                          ('${B}', title)])
                    else:
                        s = bs.Lstr(value='+${A}',
                                    subs=[('${A}', str(points))])
                    # bsUtils.PopupText('+'+str(points)+title,
                    bsUtils.PopupText(s,
                                      color=displayColor,
                                      scale=1.2 * scale,
                                      position=displayPos).autoRetain()

        # tally kills
        if kill:
            p.accumKillCount += 1
            p.killCount += 1

        # report non-kill scorings
        try:
            if screenMessage and not kill:
                bs.screenMessage(bs.Lstr(resource='nameScoresText',
                                         subs=[('${NAME}', name)]),
                                 top=True,
                                 color=player.color,
                                 image=player.getIcon())

        except Exception, e:
            print 'Error announcing score:', e
 def look():
 	text = bsUtils.PopupText("O",color=(2.55, 1.48, 0.77), scale=0.75, randomOffset=0.2, offset=(0,-1,0), position=(node.position[0],node.position[1]-1.2,node.position[2])).autoRetain()
 def look():
 	bubble = bsUtils.PopupText("o",color=(2.55,1.53,1.02), scale=0.7, randomOffset=0.2, offset=(0,-1,0), position=(node.position[0],node.position[1]-1.2,node.position[2])).autoRetain()
Пример #12
0
    def handleMessage(self, msg):
        self._handleMessageSanityCheck()

        if isinstance(msg, PowerupAcceptMessage):
            factory = self.getFactory()
            if self.powerupType == 'health':
                bs.playSound(factory.healthPowerupSound,
                             3,
                             position=self.node.position)
            bs.playSound(factory.powerupSound, 3, position=self.node.position)
            self._powersGiven = True
            self.handleMessage(bs.DieMessage())

        elif isinstance(msg, _TouchedMessage):
            if not self._powersGiven:
                node = bs.getCollisionInfo("opposingNode")
                if node is not None and node.exists():
                    if self.powerupType == "sloMo":
                        bs.getSharedObject(
                            'globals').slowMotion = bs.getSharedObject(
                                'globals').slowMotion == False
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        bsUtils.PopupText(
                            "SloMo",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "TNT":
                        p = node.positionForward
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        bs.Bomb((p[0] + 0.43, p[1] + 4, p[2] - 0.25),
                                velocity=(0, -6, 0),
                                bombType='tnt').autoRetain()
                        bsUtils.PopupText(
                            "TNT",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "strongICE":
                        p = node.positionForward
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        bs.Bomb((p[0] + 0.43, p[1] + 4, p[2] - 0.25),
                                velocity=(0, -6, 0),
                                bombType='ice').autoRetain()
                        bs.Bomb((p[0] + 0.43, p[1] + 4, p[2] - 0.25),
                                velocity=(0, -6, 0),
                                bombType='ice').autoRetain()
                        bs.Bomb((p[0] + 0.43, p[1] + 4, p[2] - 0.25),
                                velocity=(0, -6, 0),
                                bombType='ice').autoRetain()
                        bsUtils.PopupText(
                            "ICY",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "speedBoots":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        node.hockey = True
                        bsUtils.PopupText(
                            "Speed away",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "invisible":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        node.name = ' '
                        node.style = 'agent'
                        node.headModel = None
                        node.torsoModel = None
                        node.pelvisModel = None
                        node.upperArmModel = None
                        node.foreArmModel = None
                        node.handModel = None
                        node.upperLegModel = None
                        node.lowerLegModel = None
                        node.toesModel = None
                        bsUtils.PopupText(
                            "Invisible",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "character":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        testingEvent = 0

                        event = random.randint(
                            1, 6) if testingEvent == 0 else testingEvent
                        print 'Patron And Oore282 <3: ' + str(event)

                        if event in [1]:
                            node.colorTexture = bs.getTexture('frostyColor')
                            node.colorMaskTexture = bs.getTexture(
                                'frostyColorMask')
                            node.headModel = bs.getModel('frostyHead')
                            node.upperArmModel = bs.getModel('kronkUpperArm')
                            node.torsoModel = bs.getModel('frostyTorso')
                            node.pelvisModel = bs.getModel('frostyPelvis')
                            node.foreArmModel = bs.getModel('frostyForeArm')
                            node.handModel = bs.getModel('frostyHand')
                            node.upperLegModel = bs.getModel('frostyUpperLeg')
                            node.lowerLegModel = bs.getModel('frostyLowerLeg')
                            node.toesModel = bs.getModel('frostyToes')
                            node.style = 'frosty'
                            bsUtils.PopupText(
                                "Frosty The Snowman",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                        elif event in [2]:
                            node.colorTexture = bs.getTexture('santaColor')
                            node.colorMaskTexture = bs.getTexture(
                                'santaColorMask')
                            node.headModel = bs.getModel('santaHead')
                            node.upperArmModel = bs.getModel('santaUpperArm')
                            node.torsoModel = bs.getModel('santaTorso')
                            node.pelvisModel = bs.getModel('kronkPelvis')
                            node.foreArmModel = bs.getModel('santaForeArm')
                            node.handModel = bs.getModel('santaHand')
                            node.upperLegModel = bs.getModel('santaUpperLeg')
                            node.lowerLegModel = bs.getModel('santaLowerLeg')
                            node.toesModel = bs.getModel('santaToes')
                            node.style = 'santa'
                            bsUtils.PopupText(
                                "SANTA",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                        elif event in [3]:
                            node.colorTexture = bs.getTexture('wizardColor')
                            node.colorMaskTexture = bs.getTexture(
                                'wizardColorMask')
                            node.headModel = bs.getModel('wizardHead')
                            node.upperArmModel = bs.getModel('wizardUpperArm')
                            node.torsoModel = bs.getModel('wizardTorso')
                            node.pelvisModel = bs.getModel('wizardPelvis')
                            node.foreArmModel = bs.getModel('wizardForeArm')
                            node.handModel = bs.getModel('wizardHand')
                            node.upperLegModel = bs.getModel('wizardUpperLeg')
                            node.lowerLegModel = bs.getModel('wizardLowerLeg')
                            node.toesModel = bs.getModel('wizardToes')
                            node.style = 'wizard'
                            bsUtils.PopupText(
                                "EVIL SCEPTER WIZARD MAN",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                        elif event in [4]:
                            node.colorTexture = bs.getTexture('pixieColor')
                            node.colorMaskTexture = bs.getTexture(
                                'pixieColorMask')
                            node.headModel = bs.getModel('pixieHead')
                            node.upperArmModel = bs.getModel('pixieUpperArm')
                            node.torsoModel = bs.getModel('pixieTorso')
                            node.pelvisModel = bs.getModel('pixiePelvis')
                            node.foreArmModel = bs.getModel('pixieForeArm')
                            node.handModel = bs.getModel('pixieHand')
                            node.upperLegModel = bs.getModel('pixieUpperLeg')
                            node.lowerLegModel = bs.getModel('pixieLowerLeg')
                            node.toesModel = bs.getModel('pixieToes')
                            node.style = 'pixie'
                            bsUtils.PopupText(
                                "PIXIEL-ATED",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                        elif event in [5]:
                            node.colorTexture = bs.getTexture('cyborgColor')
                            node.colorMaskTexture = bs.getTexture(
                                'cyborgColorMask')
                            node.headModel = bs.getModel('cyborgHead')
                            node.upperArmModel = bs.getModel('cyborgUpperArm')
                            node.torsoModel = bs.getModel('cyborgTorso')
                            node.pelvisModel = bs.getModel('cyborgPelvis')
                            node.foreArmModel = bs.getModel('cyborgForeArm')
                            node.handModel = bs.getModel('cyborgHand')
                            node.upperLegModel = bs.getModel('cyborgUpperLeg')
                            node.lowerLegModel = bs.getModel('cyborgLowerLeg')
                            node.toesModel = bs.getModel('cyborgToes')
                            node.style = 'cyborg'
                            bsUtils.PopupText(
                                "The Robo",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                        elif event in [6]:
                            node.colorTexture = bs.getTexture('ninjaColor')
                            node.colorMaskTexture = bs.getTexture(
                                'ninjaColorMask')
                            node.headModel = bs.getModel('ninjaHead')
                            node.upperArmModel = bs.getModel('ninjaUpperArm')
                            node.torsoModel = bs.getModel('ninjaTorso')
                            node.pelvisModel = bs.getModel('ninjaPelvis')
                            node.foreArmModel = bs.getModel('ninjaForeArm')
                            node.handModel = bs.getModel('ninjaHand')
                            node.upperLegModel = bs.getModel('ninjaUpperLeg')
                            node.lowerLegModel = bs.getModel('ninjaLowerLeg')
                            node.toesModel = bs.getModel('ninjaToes')
                            node.style = 'ninja'
                            node.nameColor = (0, 0, 0)
                            node.color = (0, 0, 0)
                            node.highlight = (0, 0, 0)
                            bsUtils.PopupText(
                                "PC||Modder",
                                color=(1, 2, 1),
                                scale=1.5,
                                position=self.node.position).autoRetain()
                    elif self.powerupType == "spazColor":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        node.color = ((0 + random.random() * 6.5),
                                      (0 + random.random() * 6.5),
                                      (0 + random.random() * 6.5))
                        node.highlight = ((0 + random.random() * 6.5),
                                          (0 + random.random() * 6.5),
                                          (0 + random.random() * 6.5))
                        node.nameColor = ((0 + random.random() * 1.5),
                                          (0 + random.random() * 1.5),
                                          (0 + random.random() * 1.5))
                        node.name += random.choice([
                            '\nTHE BOSS', '\nNOOB', '\nPRO', '\nKill Me',
                            '\nNooby'
                        ])
                        bsUtils.PopupText(
                            "PC||Modder",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "troll":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        node.handleMessage(bs.FreezeMessage())
                        node.handleMessage(bs.FreezeMessage())
                        node.handleMessage(
                            bs.PowerupMessage(powerupType='curse'))
                        bsUtils.PopupText(
                            "TRoLL",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    elif self.powerupType == "champ":
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                        node.handleMessage(
                            bs.PowerupMessage(powerupType='punch'))
                        node.handleMessage(
                            bs.PowerupMessage(powerupType='shield'))
                        bsUtils.PopupText(
                            "Champ",
                            color=(1, 2, 1),
                            scale=1.5,
                            position=self.node.position).autoRetain()
                    else:
                        node.handleMessage(
                            PowerupMessage(self.powerupType,
                                           sourceNode=self.node))

        elif isinstance(msg, bs.DieMessage):
            if self.node.exists():
                if (msg.immediate):
                    self.node.delete()
                else:
                    curve = bs.animate(self.node, "modelScale", {0: 1, 100: 0})
                    bs.gameTimer(100, self.node.delete)
                    bs.gameTimer(100, self.nodeLight.delete)

        elif isinstance(msg, bs.OutOfBoundsMessage):
            self.handleMessage(bs.DieMessage())

        elif isinstance(msg, bs.HitMessage):
            # dont die on punches (thats annoying)
            if msg.hitType != 'punch':
                self.handleMessage(bs.DieMessage())
        else:
            bs.Actor.handleMessage(self, msg)
Пример #13
0
    def handleMessage(self, m):
        self._handleMessageSanityCheck()

        if isinstance(m, PowerupAcceptMessage):
            factory = self.getFactory()
            if self.powerupType == 'health':
                bs.playSound(factory.healthPowerupSound,
                             3,
                             position=self.node.position)
            bs.playSound(factory.powerupSound, 3, position=self.node.position)
            self._powersGiven = True
            self.handleMessage(bs.DieMessage())

        elif isinstance(m, _TouchedMessage):
            if not self._powersGiven:
                node = bs.getCollisionInfo("opposingNode")
                spaz = node.getDelegate()
                if spaz is not None and spaz.exists() and spaz.isAlive(
                ):  # pass deadbodies error
                    if self.powerupType == 'superStar':
                        tex = bs.Powerup.getFactory().texSuperStar
                        self._flashBillboard(tex, spaz)

                        def colorChanger():
                            if spaz.isAlive():
                                spaz.node.color = (random.random() * 2,
                                                   random.random() * 2,
                                                   random.random() * 2)
                                spaz.node.highlight = (random.random() * 2,
                                                       random.random() * 2,
                                                       random.random() * 2)

                        def checkStar(val):
                            self._powersGiven = True
                            if spaz.isAlive():
                                setattr(spaz.node, 'invincible', val)
                            if val and spaz.isAlive():
                                if spaz.node.frozen:
                                    spaz.node.handleMessage(bs.ThawMessage())
                                bs.playSound(
                                    bs.Powerup.getFactory().superStarSound,
                                    position=spaz.node.position)
                                spaz.colorSet = bs.Timer(100,
                                                         bs.Call(colorChanger),
                                                         repeat=True)
                                if spaz._cursed:
                                    spaz._cursed = False
                                    # remove cursed material
                                    factory = spaz.getFactory()
                                    for attr in [
                                            'materials', 'rollerMaterials'
                                    ]:
                                        materials = getattr(spaz.node, attr)
                                        if factory.curseMaterial in materials:
                                            setattr(
                                                spaz.node, attr,
                                                tuple(m for m in materials
                                                      if m !=
                                                      factory.curseMaterial))
                                    spaz.node.curseDeathTime = 0
                            if not val and spaz.isAlive():
                                spaz.node.color = spaz.getPlayer().color
                                spaz.node.highlight = spaz.getPlayer(
                                ).highlight
                                spaz.colorSet = None
                                bs.playSound(
                                    bs.Powerup.getFactory().powerdownSound,
                                    position=spaz.node.position)
                                spaz.node.billboardOpacity = 0.0

                        checkStar(True)
                        if self._powersGiven == True:
                            spaz.node.miniBillboard1Texture = tex
                            t = bs.getGameTime()
                            spaz.node.miniBillboard1StartTime = t
                            spaz.node.miniBillboard1EndTime = t + gMythBPowerUpsWearOffTime
                            spaz._starWearOffTimer = bs.Timer(
                                gMythBPowerUpsWearOffTime,
                                bs.Call(checkStar, False))
                            spaz._starWearOffFlashTimer = bs.Timer(
                                gMythBPowerUpsWearOffTime - 2000,
                                bs.WeakCall(self._powerUpWearOffFlash, tex,
                                            spaz))
                            self.handleMessage(bs.DieMessage())
                    elif self.powerupType == 'speed':
                        if bs.getActivity(
                        )._map.isHockey:  #dont give speed if map is already hockey.
                            self.handleMessage(bs.DieMessage(immediate=True))
                        if not bs.getActivity()._map.isHockey:
                            spaz = node.getDelegate()
                            tex = bs.Powerup.getFactory().texSpeed
                            self._flashBillboard(tex, spaz)

                            def checkSpeed(val):
                                self._powersGiven = True
                                if spaz.isAlive():
                                    setattr(spaz.node, 'hockey', val)
                                if val and spaz.isAlive():
                                    bs.playSound(
                                        bs.Powerup.getFactory().speedSound,
                                        position=spaz.node.position)
                                if not val and spaz.isAlive():
                                    bs.playSound(
                                        bs.Powerup.getFactory().powerdownSound,
                                        position=spaz.node.position)
                                    spaz.node.billboardOpacity = 0.0

                            checkSpeed(True)
                            if self._powersGiven == True:
                                spaz.node.miniBillboard3Texture = tex
                                t = bs.getGameTime()
                                spaz.node.miniBillboard3StartTime = t
                                spaz.node.miniBillboard3EndTime = t + gMythBPowerUpsWearOffTime
                                spaz._speedWearOffTimer = bs.Timer(
                                    gMythBPowerUpsWearOffTime,
                                    bs.Call(checkSpeed, False))
                                spaz._speedWearOffFlashTimer = bs.Timer(
                                    gMythBPowerUpsWearOffTime - 2000,
                                    bs.WeakCall(self._powerUpWearOffFlash, tex,
                                                spaz))
                                self.handleMessage(bs.DieMessage())
                    elif self.powerupType == 'iceCube':
                        spaz = node.getDelegate()

                        def checkFreezer(val):
                            self._powersGiven = True
                            if spaz.isAlive() and spaz.node.invincible:
                                bs.playSound(
                                    bs.Powerup.getFactory().blockSound,
                                    position=spaz.node.position)
                            if spaz.isAlive() and not spaz.node.invincible:
                                setattr(spaz, 'frozen', val)
                            if val and spaz.isAlive(
                            ) and not spaz.node.invincible:
                                spaz.node.frozen = 1
                                m = bs.newNode('math',
                                               owner=spaz,
                                               attrs={
                                                   'input1': (0, 1.3, 0),
                                                   'operation': 'add'
                                               })
                                spaz.node.connectAttr('torsoPosition', m,
                                                      'input2')
                                opsText = bsUtils.PopupText(
                                    "Oops!",
                                    color=(1, 1, 1),
                                    scale=0.9,
                                    offset=(0, -1, 0)).autoRetain()
                                m.connectAttr('output', opsText.node,
                                              'position')
                                bs.playSound(
                                    bs.Powerup.getFactory().iceCubeSound,
                                    position=spaz.node.position)
                            if not val and spaz.isAlive():
                                spaz.node.frozen = 0

                        checkFreezer(True)
                        if self._powersGiven == True:
                            spaz._iceCubeWearOffTimer = bs.Timer(
                                gMythBPowerUpsWearOffTime,
                                bs.Call(checkFreezer, False))
                            self.handleMessage(bs.DieMessage())
                    elif self.powerupType == 'surprise':
                        self._powersGiven = True
                        spaz = node.getDelegate()
                        if spaz.isAlive():
                            bs.shakeCamera(1)
                            bsUtils.PopupText(
                                "Surprise!",
                                color=(1, 1, 1),
                                scale=0.9,
                                offset=(0, -1, 0),
                                position=(spaz.node.position[0],
                                          spaz.node.position[1] - 1,
                                          spaz.node.position[2])).autoRetain()
                            bs.playSound(bs.Powerup.getFactory().surpriseSound,
                                         position=spaz.node.position)
                            bs.emitBGDynamics(position=spaz.node.position,
                                              velocity=(0, 1, 0),
                                              count=random.randrange(30, 70),
                                              scale=0.5,
                                              chunkType='spark')
                            spaz.node.handleMessage("knockout", 3000)
                            spaz.node.handleMessage(
                                "impulse", spaz.node.position[0],
                                spaz.node.position[1], spaz.node.position[2],
                                -spaz.node.velocity[0], -spaz.node.velocity[1],
                                -spaz.node.velocity[2], 400, 400, 0, 0,
                                -spaz.node.velocity[0], -spaz.node.velocity[1],
                                -spaz.node.velocity[2])
                        if self._powersGiven == True:
                            self.handleMessage(bs.DieMessage())
                    elif self.powerupType == 'martyrdom':
                        spaz = node.getDelegate()
                        tex = bs.Powerup.getFactory().texMartyrdom
                        self._flashBillboard(tex, spaz)

                        def checkDead():  #FIXME
                            if spaz.hitPoints <= 0 and (
                                (spaz.lastPlayerHeldBy is not None
                                 and spaz.lastPlayerHeldBy.exists()) or
                                (spaz.lastPlayerAttackedBy is not None
                                 and spaz.lastPlayerAttackedBy.exists()
                                 and bs.getGameTime() - spaz.lastAttackedTime <
                                 4000)):
                                try:
                                    spaz.lastDeathPos = spaz.node.position  #FIXME
                                except Exception:
                                    spaz.dropss = None
                                else:
                                    if not spaz.lastPlayerAttackedBy == spaz.getPlayer(
                                    ):
                                        dropBomb()
                                        spaz.dropss = None

                        def dropBomb():
                            bs.playSound(
                                bs.Powerup.getFactory().martyrdomSound,
                                position=spaz.lastDeathPos)
                            drop0 = bs.Bomb(
                                position=(spaz.lastDeathPos[0] + 0.43,
                                          spaz.lastDeathPos[1] + 4,
                                          spaz.lastDeathPos[2] - 0.25),
                                velocity=(0, -6, 0),
                                sourcePlayer=spaz.getPlayer(
                                ),  #some math for perfect triangle
                                bombType='sticky').autoRetain()
                            drop1 = bs.Bomb(
                                position=(spaz.lastDeathPos[0] - 0.43,
                                          spaz.lastDeathPos[1] + 4,
                                          spaz.lastDeathPos[2] - 0.25),
                                velocity=(0, -6, 0),
                                sourcePlayer=spaz.getPlayer(),
                                bombType='sticky').autoRetain()
                            drop2 = bs.Bomb(
                                position=(spaz.lastDeathPos[0],
                                          spaz.lastDeathPos[1] + 4,
                                          spaz.lastDeathPos[2] + 0.5),
                                velocity=(0, -6, 0),
                                sourcePlayer=spaz.getPlayer(),
                                bombType='sticky').autoRetain()

                        def checkVal(val):
                            self._powersGiven = True
                            if val and spaz.isAlive():
                                m = bs.newNode('math',
                                               owner=spaz,
                                               attrs={
                                                   'input1': (0, 1.3, 0),
                                                   'operation': 'add'
                                               })
                                spaz.node.connectAttr('torsoPosition', m,
                                                      'input2')
                                activatedText = bsUtils.PopupText(
                                    "ACTIVATED",
                                    color=(1, 1, 1),
                                    scale=0.7,
                                    offset=(0, -1, 0)).autoRetain()
                                m.connectAttr('output', activatedText.node,
                                              'position')
                                bs.playSound(
                                    bs.Powerup.getFactory().martyrdomPickSound,
                                    position=spaz.node.position)
                                spaz.isDropped = True
                                spaz.dropss = bs.Timer(1,
                                                       bs.Call(checkDead),
                                                       repeat=True)

                        checkVal(True)
                        if self._powersGiven == True:
                            self.handleMessage(bs.DieMessage())
                    else:
                        node.handleMessage(
                            PowerupMessage(self.powerupType,
                                           sourceNode=self.node))

        elif isinstance(m, bs.DieMessage):
            if self.node.exists():
                if (m.immediate):
                    self.node.delete()
                else:
                    curve = bs.animate(self.node, "modelScale", {0: 1, 100: 0})
                    bs.gameTimer(150, self.node.delete)

        elif isinstance(m, bs.OutOfBoundsMessage):
            self.handleMessage(bs.DieMessage())

        elif isinstance(m, bs.HitMessage):
            # dont die on punches (thats annoying)
            if m.hitType != 'punch':
                self.handleMessage(bs.DieMessage())
        else:
            bs.Actor.handleMessage(self, m)
Пример #14
0
    def handleMessage(self, m):
        self._handleMessageSanityCheck()
        if isinstance(m, PowerupAcceptMessage):
            factory = self.getFactory()
            if self.powerupType == 'health':
                bs.playSound(factory.healthPowerupSound,
                             3,
                             position=self.node.position)

            bs.playSound(factory.powerupSound, 3, position=self.node.position)
            self._powersGiven = True
            bs.addStats('Collected powerups')
            self.handleMessage(bs.DieMessage())

        elif isinstance(m, _TouchedMessage):
            if not self._powersGiven:
                node = bs.getCollisionInfo('opposingNode')
                if node is not None and node.exists():
                    if self.powerupType == 'bot':
                        bsUtils.PopupText(
                            (bs.Lstr(resource='descriptionBot')),
                            color=(1, 1, 1),
                            scale=1,
                            position=self.node.position).autoRetain()

                        p = node.getDelegate().getPlayer()
                        if 'bunnies' not in p.gameData:
                            p.gameData['bunnies'] = BuddyBunny.BunnyBotSet(p)

                        p.gameData['bunnies'].doBunny()
                        self._powersGiven = True
                        self.handleMessage(bs.DieMessage())
                    else:
                        node.handleMessage(
                            PowerupMessage(self.powerupType,
                                           sourceNode=self.node))

        elif isinstance(m, bs.DieMessage):
            if self.node.exists():
                if (m.immediate):
                    self.node.delete()
                    self.light.delete()
                else:
                    curve = bs.animate(self.node, 'modelScale', {0: 1, 100: 0})
                    bs.gameTimer(100, self.node.delete)

                    curveS = bs.animate(self.light, 'radius', {
                        0: self.light.radius,
                        400: 0
                    })
                    bs.gameTimer(401, curveS.delete)
                    bs.gameTimer(402, self.light.delete)

        elif isinstance(m, bs.OutOfBoundsMessage):
            self.handleMessage(bs.DieMessage())

        elif isinstance(m, bs.HitMessage):
            # dont die on punches (thats annoying)
            if m.hitType != 'punch':
                self.handleMessage(bs.DieMessage())
        else:
            bs.Actor.handleMessage(self, m)