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()
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))
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)
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())
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
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
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
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()
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)
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)
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)