def updateArrows(self): if not self.gag: self.toggleArrows(False, False) else: track = GagGlobals.TrackGagNamesByTrackName.get( GagGlobals.getTrackOfGag(self.gag.getID())) index = None useTrack = [] for name in track: gag = self.gui.backpack.getGagByID( GagGlobals.getIDByName(name)) if gag == self.gag or gag not in self.gui.backpack.getLoadout( ): useTrack.append(name) index = useTrack.index(self.gag.getName()) if index == 0: self.toggleArrows(False, True) else: if index > 0 and index < len(useTrack) - 1: gagId = GagGlobals.getIDByName(useTrack[index + 1]) if not self.gui.backpack.hasGag(gagId): self.toggleArrows(True, False) else: if index == len(useTrack) - 1: self.toggleArrows(True, False) else: self.toggleArrows(True, True) return
def __init__(self): LightDropGag.__init__(self, CIGlobals.Sandbag, GagGlobals.getProp('5', 'sandbag-mod'), GagGlobals.getProp('5', 'sandbag-chan'), 18, GagGlobals.BAG_DROP_SFX, GagGlobals.BAG_MISS_SFX, rotate90 = False, sphereSize = 2) self.setImage('phase_3.5/maps/sandbag.png')
def updateLoadout(self, forward): if self.gag and self.gag.getState() in [ GagState.RECHARGING, GagState.LOADED ]: track = GagGlobals.TrackGagNamesByTrackName.get( GagGlobals.getTrackOfGag(self.gag.getID())) index = None useTrack = [] for name in track: gag = self.gui.backpack.getGagByID( GagGlobals.getIDByName(name)) if gag == self.gag or gag not in self.gui.backpack.getLoadout( ): useTrack.append(name) index = useTrack.index(self.gag.getName()) if forward == 1: nextGagIndex = index + 1 else: nextGagIndex = index - 1 if nextGagIndex < 0 or nextGagIndex >= len(useTrack): return gagId = GagGlobals.getIDByName(useTrack[nextGagIndex]) loadout = self.gui.backpack.getLoadout() if self.gui.backpack.hasGag(gagId) and self.gag in loadout: self.hideInfoText() if self.gag not in loadout: return loadout[loadout.index( self.gag)] = self.gui.backpack.getGagByID(gagId) self.gui.backpack.setLoadout(loadout) return
def __init__(self): LightDropGag.__init__(self, CIGlobals.FlowerPot, GagGlobals.getProp('5', 'flowerpot-mod'), GagGlobals.getProp('5', 'flowerpot-chan'), 10, GagGlobals.POT_DROP_SFX, GagGlobals.POT_MISS_SFX, rotate90 = False, sphereSize = 2, sphereZ = -3.5) self.setImage('phase_3.5/maps/flowerpot.png')
def setBackpackAmmo(self, gagIds, ammoList): if self.ammo == ammoList: return if len(self.backpack.gags.keys()) > 0: for index in range(len(gagIds)): gagId = gagIds[index] numOfThisGag = 0 for gag in self.backpack.gags.keys(): if type(self.backpack.gagMgr.getGagByName(GagGlobals.getGagByID(gagId))) == type(gag): numOfThisGag += 1 if numOfThisGag < 1: self.backpack.resetGags() break for index in range(len(ammoList)): amt = ammoList[index] gagId = gagIds[index] if amt < 0: amt = 0 self.backpack.setSupply(amt, GagGlobals.getGagByID(gagId)) self.ammo = ammoList self.gagIds = gagIds if self.setupGags == False: self.d_setBackpackAmmo(gagIds, ammoList)
def hitByGag(self, gagId): avatar = self.air.doId2do.get(self.air.getAvatarIdFromSender(), None) gagName = GagGlobals.getGagByID(gagId) data = GagGlobals.getGagData(gagId) dmg = data.get('damage') track = GagGlobals.getTrackOfGag(gagId, getId=True) if self.canGetHit(): self.b_setHealth(self.getHealth() - dmg) Sequence(Func(self.d_announceHealth, 0, dmg), Wait(self.showComboDamageTime), Func(self.__showComboLabel)).start() self.__handleCombos(avatar.doId, gagName) if self.isDead(): if track == GagType.THROW or gagName == CIGlobals.TNT: self.b_setAnimState('pie', 0) elif track == GagType.DROP: majorDrops = [ CIGlobals.GrandPiano, CIGlobals.Safe, CIGlobals.BigWeight ] if gagName in majorDrops: self.b_setAnimState('drop', 0) else: self.b_setAnimState('drop-react', 0) elif track == GagType.SQUIRT or track == GagType.SOUND: if gagName == CIGlobals.StormCloud: self.b_setAnimState('soak', 0) else: self.b_setAnimState('squirt-small', 0) avatar.questManager.cogDefeated(self) else: # I've been hit! Take appropriate actions. self.handleToonThreat(avatar, True)
def __init__(self): LightDropGag.__init__(self, CIGlobals.Anvil, GagGlobals.getProp('4', 'anvil-mod'), GagGlobals.getProp('4', 'anvil-chan'), 30, GagGlobals.ANVIL_DROP_SFX, GagGlobals.ANVIL_MISS_SFX, rotate90=True, sphereSize=2) self.setImage('phase_3.5/maps/anvil.png')
def __init__(self): LightDropGag.__init__( self, CIGlobals.Anvil, GagGlobals.getProp("4", "anvil-mod"), GagGlobals.getProp("4", "anvil-chan"), 30, GagGlobals.ANVIL_DROP_SFX, GagGlobals.ANVIL_MISS_SFX, rotate90=True, sphereSize=2, ) self.setImage("phase_3.5/maps/anvil.png")
def buildFlower(self): if self.flower: self.flower.removeNode() self.flower = None self.flower = loader.loadModel(GagGlobals.getProp(3.5, 'squirting-flower')) self.flower.setScale(GagGlobals.PNT3NEAR0) return
def addGag(self, gagId, curSupply=0, maxSupply=0): if not gagId in self.gags.keys(): gagName = GagGlobals.getGagByID(gagId) if not gagName is None: gag = self.gagManager.getGagByName(gagName) gag.setAvatar(self.avatar) self.gags.update({gagId: [gag, curSupply, maxSupply]})
def startEntity(self, cog): if not cog: self.completeSquirt() return scaleUpPoint = Point3(1.5, 1.5, 1.5) rainDelay = 1 effectDelay = 0.3 cloudHold = 4.7 tContact = 2.4 if cog.isDead(): cloudHold = 1.7 cloud01, trickleFx, rainEffects, entity = self.buildEntity() cloud01.setZ(cog.suitPlan.getNametagZ() + 2) cloud01.reparentTo(cog) cloud02 = Actor(self.model, {'chan': GagGlobals.getProp(4, 'stormcloud-chan')}) cloud02.reparentTo(cloud01) def damageCog(): if self.isLocal(): self.avatar.sendUpdate('suitHitByPie', [cog.doId, self.getID()]) def __getCloudTrack(cloud, useEffect = 1): track = Sequence(Func(cloud.pose, 'chan', 0), LerpScaleInterval(cloud, 1.5, scaleUpPoint, startScale=GagGlobals.PNT3NEAR0), Wait(rainDelay)) if useEffect == 1: pTrack = Parallel() delay = trickleDuration = cloudHold * 0.25 trickleTrack = ParticleInterval(trickleFx, cloud, worldRelative=0, duration=trickleDuration, cleanup=True) track.append(trickleTrack) for i in range(0, 3): dur = cloudHold - 2 * trickleDuration pTrack.append(Sequence(Wait(delay), ParticleInterval(rainEffects[i], cloud, worldRelative=0, duration=dur, cleanup=True))) delay += effectDelay pTrack.append(Sequence(Wait(3 * effectDelay), ActorInterval(cloud, 'chan', startTime=1, duration=cloudHold))) damageTrack = Sequence() if cog.getHealth() - self.getDamage() <= 0: damageTrack.append(Func(cog.d_disableMovement, wantRay=True)) damageTrack.append(Func(damageCog)) else: damageTrack.append(Wait(tContact)) damageTrack.append(Func(damageCog)) pTrack.append(damageTrack) track.append(pTrack) else: track.append(ActorInterval(cloud, 'chan', startTime=1, duration=cloudHold)) track.append(LerpScaleInterval(cloud, 0.5, GagGlobals.PNT3NEAR0)) track.append(Func(GagUtils.destroyProp, cloud)) return track tracks = Parallel() soundTrack01 = self.getSoundTrack(1.3, self.avatar) soundTrack02 = self.getSoundTrack(3.4, self.avatar) tracks.append(soundTrack01) tracks.append(soundTrack02) cloud01Track = __getCloudTrack(cloud01) cloud02Track = __getCloudTrack(cloud02, useEffect=0) tracks.append(cloud01Track) tracks.append(cloud02Track) tracks.append(Func(self.destroyEntity, entity)) tracks.start()
def __init__(self, name, model, damage, gagType, hitSfx, playRate = 1.0, anim = None, scale = 1, autoRelease = False): __metaclass__ = ABCMeta self.name = name self.model = model self.anim = anim self.scale = scale self.damage = damage self.gagType = gagType self.playRate = playRate self.avatar = None self.gag = None self.splat = None self.splatPos = None self.state = GagState.LOADED self.woosh = None self.handJoint = None self.equipped = False self.autoRelease = autoRelease self.index = None self.target = None self.health = 0 self.id = GagGlobals.getIDByName(name) self.image = None if game.process == 'client': if gagType == GagType.THROW: self.woosh = base.audio3d.loadSfx(GagGlobals.PIE_WOOSH_SFX) self.hitSfx = base.audio3d.loadSfx(hitSfx) return
def __init__(self): SquirtGag.__init__(self, CIGlobals.Geyser, GagGlobals.getProp(5, 'geyser'), 105, GagGlobals.GEYSER_HIT_SFX, None, None, None, None, None, None, 1, 1) ChargeUpGag.__init__(self, 24, 10, 50, 0.5, maxCogs=4) self.setImage('phase_3.5/maps/geyser.png') self.entities = [] self.timeout = 3.0 return
def gagRelease(self, gag_id): supply = self.backpack.getSupply(GagGlobals.getGagByID(gag_id)) amt = supply - 1 if amt < 0: self.ejectSelf() return self.b_setGagAmmo(gag_id, amt)
def setLabel(self, labelId): if labelId == 0: self.gagModel = loader.loadModel( 'phase_4/models/props/icecream.bam') self.gagModel.reparentTo(self.gagNode) self.gagModel.find('**/p1_2').clearBillboard() self.gagModel.setScale(0.6) self.gagModel.setPos(0, -0.1, -0.1 - 0.6) elif labelId == 1: purchaseModels = loader.loadModel( 'phase_4/models/gui/purchase_gui.bam') self.gagModel = purchaseModels.find('**/Jar') self.gagModel.reparentTo(self.gagNode) self.gagModel.setScale(3.0) self.gagModel.setPos(0, -0.1, 0) purchaseModels.removeNode() else: gagId = labelId - 2 iconName = GagGlobals.InventoryIconByName.get( GagGlobals.getGagByID(gagId)) invModel = loader.loadModel( 'phase_3.5/models/gui/inventory_icons.bam').find('**/%s' % iconName) if invModel: self.gagModel = invModel self.gagModel.reparentTo(self.gagNode) self.gagModel.setScale(13.0) self.gagModel.setPos(0, -0.1, 0) else: self.notify.warning('Failed to find gag label %s.' % (str(labelId)))
def toonHitByPie(self, avId, gag_id): obj = self.air.doId2do.get(avId, None) hp = self.gagMgr.getGagByName(GagGlobals.getGagByID(gag_id)).getHealth() if obj: if obj.getHealth() < obj.getMaxHealth() and not obj.isDead(): obj.toonUp(hp) return
def buildAmmoList(self, gagIds): ammoList = [] for index in range(len(gagIds)): gagId = gagIds[index] amt = self.backpack.getSupply(GagGlobals.getGagByID(gagId)) ammoList.append(amt) return ammoList
def __init__(self): SquirtGag.__init__(self, CIGlobals.StormCloud, GagGlobals.getProp(4, 'stormcloud-mod'), 60, GagGlobals.CLOUD_HIT_SFX, None, GagGlobals.CLOUD_MISS_SFX, None, None, None, None, 1, 1) LocationGag.__init__(self, 10, 50) LocationGag.setShadowData(self, isCircle=True, shadowScale=0.75) self.setImage('phase_3.5/maps/storm-cloud.png') self.entities = [] self.searchRadius = 6 return
def updateBackpackAmmo(self): gagIds = [] ammoList = [] for gag in self.backpack.getGags(): gagIds.append(GagGlobals.getIDByName(gag.getName())) ammoList.append(self.backpack.getSupply(gag.getName())) self.setBackpackAmmo(gagIds, ammoList)
def confirmPurchase(self): ammoList = [] gagIds = [] for gag in self.backpack.getGags(): gagId = GagGlobals.getIDByName(gag.getName()) gagIds.append(gagId) ammoList.append(self.backpack.getSupply(gag.getName())) self.distShop.sendUpdate('confirmPurchase', [gagIds, ammoList, base.localAvatar.getMoney()]) Shop.confirmPurchase(self)
def __init__(self): SquirtGag.__init__(self, CIGlobals.SquirtFlower, GagGlobals.getProp(3.5, 'button'), 3, GagGlobals.FLOWER_HIT_SFX, GagGlobals.FLOWER_HIT_SFX, GagGlobals.NULL_SFX, None, 0, 0, 0) self.setImage('phase_3.5/maps/squirting-flower.png') self.flower = None self.flowerScale = 1.5 self.track = Parallel() self.timeout = 4.0 self.sprayRotation = Vec3(0, 20, 0) return
def __init__(self): ToonUpGag.__init__(self, CIGlobals.Lipstick, GagGlobals.getProp(5, 'lipstick'), 25, 30, 75, GagGlobals.SMOOCH_SFX, 1) self.setImage('phase_3.5/maps/lipstick.png') self.avAnim = 'smooch' self.track = None self.soundInterval = None self.lips = None self.radius = 25 return
def __init__(self): SquirtGag.__init__(self, CIGlobals.StormCloud, GagGlobals.getProp(4, 'stormcloud-mod'), 60, GagGlobals.CLOUD_HIT_SFX, None, GagGlobals.CLOUD_MISS_SFX, None, None, None, None, 1, 1) LocationGag.__init__(self, 10, 50) LocationGag.setShadowData(self, isCircle = True, shadowScale = 0.75) self.setImage('phase_3.5/maps/storm-cloud.png') self.entities = [] self.searchRadius = 6 self.timeout = 3.0
def setBackpackAmmo(self, gagIds, ammoList): if not self.backpack: self.backpack = BackpackAI(self) for i in xrange(len(gagIds)): gagId = gagIds[i] ammo = ammoList[i] if not self.backpack.hasGag(gagId): self.backpack.addGag(gagId, ammo, GagGlobals.getGagData(gagId).get('maxSupply'))
def update(self): for item, values in self.items.iteritems(): entry = self.itemEntries.get(item) itemType = values.get('type') price = values.get('price') money = base.localAvatar.getMoney() button = entry[0] label = entry[1] button.setColorScale(NORMAL_COLOR) if price > money: button.setColorScale(GRAYED_OUT_COLOR) if itemType == ItemType.GAG: name = item().getName() backpack = base.localAvatar.getBackpack() supply = backpack.getSupply(name) maxSupply = backpack.getMaxSupply(name) inBackpack = backpack.hasGag(GagGlobals.getIDByName(name)) if not inBackpack or inBackpack and supply >= maxSupply: button.setColorScale(GRAYED_OUT_COLOR) supply = base.localAvatar.getBackpack().getSupply(name) maxSupply = base.localAvatar.getBackpack().getMaxSupply(name) label['text'] = '%s/%s\n%s JBS' % (str(supply), str(maxSupply), str(price)) elif itemType == ItemType.UPGRADE: maxSupply = values.get('maxUpgrades') upgradeID = values.get('upgradeID') avID = base.localAvatar.getPUInventory()[1] supply = 0 turretCount = 0 hasTurret = False battle = base.localAvatar.getMyBattle() if battle and battle.getTurretManager(): turretCount = battle.getTurretCount() turret = battle.getTurretManager().getTurret() if turret: hasTurret = True if turret.getGagID() == upgradeID: supply = 1 if avID == upgradeID: dataSupply = base.localAvatar.getPUInventory()[0] if dataSupply > 0: supply = dataSupply if supply > 0 or base.localAvatar.getPUInventory( )[0] > 0 or hasTurret or turretCount == CogBattleGlobals.MAX_TURRETS: button.setColorScale(GRAYED_OUT_COLOR) label['text'] = '%s\n%s/%s\n%s JBS' % ( item, str(supply), str(maxSupply), str(price)) elif itemType == ItemType.HEAL: if base.localAvatar.getHealth( ) == base.localAvatar.getMaxHealth() or self.shop.hasCooldown( item): button.setColorScale(GRAYED_OUT_COLOR)
def confirmPurchase(self): ammoList = [] if not hasattr(self.originalSupply, 'keys'): gagIds = [] else: gagIds = self.originalSupply.keys() for gagId in gagIds: ammoList.append(base.localAvatar.getBackpack().getSupply(GagGlobals.getGagByID(gagId))) self.distShop.sendUpdate('confirmPurchase', [gagIds, ammoList, base.localAvatar.getMoney()]) Shop.confirmPurchase(self)
def releaseGag(self): if not self.backpack or not self.backpack.getActiveGag(): return if self.backpack.getSupply() > 0: gag = self.backpack.getActiveGag() if not gag: gag = self.backpack.getCurrentGag() if gag.getState() != GagState.RELEASED: gagName = gag.getName() self.b_gagRelease(GagGlobals.getIDByName(gagName))
def d_setGrab(self, avId): self.sendUpdate('setGrab', [avId]) avatar = self.air.doId2do.get(avId) backpack = avatar.backpack track = GagGlobals.getTrackOfGag(self.gagId) availableGags = [] restockGags = {} if not self.loadoutOnly: trackGags = GagGlobals.TrackGagNamesByTrackName.get(GagGlobals.TrackNameById.get(GagGlobals.Type2TrackName.get(track))) # Get the gagids of gags in this gag track. for trackGag in trackGags: gagId = GagGlobals.getIDByName(trackGag) if backpack.hasGag(gagId): availableGags.append(gagId) # The strongest gags should be first. availableGags.reverse() else: loadout = backpack.getLoadout() for gagId in loadout: if GagGlobals.getTrackOfGag(gagId) == track: availableGags.append(gagId) restockLeft = int(self.maxRestock) for gagId in availableGags: if restockLeft <= 0: break supply = backpack.getSupply(gagId) maxAmount = backpack.getMaxSupply(gagId) if supply < maxAmount: giveAmount = maxAmount - backpack.getSupply(gagId) if restockLeft < giveAmount: giveAmount = restockLeft restockGags[gagId] = supply + giveAmount restockLeft -= giveAmount print 'Requesting to give %s %ss.' % (str(restockGags[gagId]), GagGlobals.getGagByID(gagId)) for gagId in restockGags.keys(): avatar.b_setGagAmmo(gagId, restockGags.get(gagId))
def releaseGag(self): if not self.canUseGag(False) or self.backpack.getCurrentGag( ).__class__.__name__ == 'BananaPeel': return gag = self.backpack.getActiveGag() if not gag: gag = self.backpack.getCurrentGag() if gag.getState() != GagState.RELEASED: gagName = gag.getName() self.b_gagRelease(GagGlobals.getIDByName(gagName))
def buildEntity(self): cloud = Actor(self.model, {'chan' : GagGlobals.getProp(4, 'stormcloud-chan')}) trickleFx = GagUtils.loadParticle(5, 'trickleLiquidate') rainFx01 = GagUtils.loadParticle(5, 'liquidate') rainFx02 = GagUtils.loadParticle(5, 'liquidate') rainFx03 = GagUtils.loadParticle(5, 'liquidate') rainEffects = [rainFx01, rainFx02, rainFx03] entity = [cloud, [trickleFx, rainEffects]] self.entities.append(entity) return cloud, trickleFx, rainEffects, entity
def __init__(self): ToonUpGag.__init__(self, CIGlobals.Lipstick, GagGlobals.getProp(5, 'lipstick'), 25, 30, 75, GagGlobals.SMOOCH_SFX, 1) self.setImage('phase_3.5/maps/lipstick.png') self.avAnim = 'smooch' self.track = None self.soundInterval = None self.lips = None self.radius = 25 self.timeout = 6.0
def setWeapon(self, weapon, playSound = True): if weapon == CIGlobals.TNT and self.backpack.getSupply(weapon) <= 0: return if self.backpack.getSupply(weapon) <= 0: return self.prevGag = self.weapon base.localAvatar.b_equip(GagGlobals.getIDByName(weapon)) self.weapon = self.backpack.getGagByIndex(self.backpack.getIndex()) if playSound: sfx = base.loadSfx("phase_3/audio/sfx/GUI_balloon_popup.mp3") SoundInterval(sfx).start() self.resetScroll() self.update()
def __handleCombos(self, avId, gagName): track = GagGlobals.getTrackOfGag(gagName) damage = GagGlobals.getGagData( GagGlobals.getIDByName(gagName)).get('damage') self.comboData.update({avId: {track: damage}}) data = self.comboData.values() tracks = [] damages = [] for hitData in data: for track, damage in hitData.iteritems(): tracks.append(track) damages.append(damage) isCombo = False comboPerct = 0.35 totalDamage = 0 totalGags = 0 for track in tracks: if tracks.count(track) > 1 and track == track: # Get the indices of each occurrence of this track in the tracks list. # For example, tracks could equal [GagType.THROW, GagType.SQUIRT, GagType.THROW] # If, the variable 'track' equaled GagType.THROW, then the next line would # return: [0, 2] damageIndices = [i for i, x in enumerate(tracks) if x == track] totalGags = len(damageIndices) for i in damageIndices: if i < len(damageIndices) and i >= 0: totalDamage += damages[damageIndices[i]] isCombo = True break continue if isCombo: self.comboDamage = int( (float(totalDamage) / float(totalGags)) * comboPerct) self.b_setHealth(self.getHealth() - self.comboDamage) self.comboData.clear() taskMgr.remove(self.comboDataTaskName)
def toonHitByPie(self, avId, gagId): obj = self.air.doId2do.get(avId, None) hp = GagGlobals.getGagData(gagId).get('health', 0) if obj: if obj.getHealth() < obj.getMaxHealth() and not obj.isDead(): if obj.__class__.__name__ == 'DistributedToonAI': obj.toonUp(hp) else: if obj.getHealth() + hp > obj.getMaxHealth(): hp = obj.getMaxHealth() - obj.getHealth() obj.b_setHealth(obj.getHealth() + hp) obj.d_announceHealth(1, hp)
def buildEntity(self): cloud = Actor(self.model, {'chan': GagGlobals.getProp(4, 'stormcloud-chan')}) trickleFx = GagUtils.loadParticle(5, 'trickleLiquidate') rainFx01 = GagUtils.loadParticle(5, 'liquidate') rainFx02 = GagUtils.loadParticle(5, 'liquidate') rainFx03 = GagUtils.loadParticle(5, 'liquidate') rainEffects = [rainFx01, rainFx02, rainFx03] entity = [cloud, [trickleFx, rainEffects]] self.entities.append(entity) return (cloud, trickleFx, rainEffects, entity)
def handlePieCollision(self, entry, proj): x, y, z = proj.pie.getPos(render) self.b_makeSplat([x, y, z]) proj.cleanup() if base.localAvatar.doId == self.getAvatar(): intoNP = entry.getIntoNodePath() avNP = intoNP.getParent() for key in self.cr.doId2do.keys(): obj = self.cr.doId2do[key] if obj.__class__.__name__ == "DistributedSuit": if obj.getKey() == avNP.getKey(): if obj.getHealth() > 0: base.localAvatar.sendUpdate('suitHitByPie', [obj.doId, GagGlobals.getIDByName(CIGlobals.WholeCreamPie)])
def setBackpackAmmo(self, gagIds, ammoList): if not self.backpack: self.backpack = Backpack(self) # We just want to update the network ammo sometimes, # let's ignore updates if we're not constructing a backpack. for i in xrange(len(gagIds)): gagId = gagIds[i] ammo = ammoList[i] if not self.backpack.hasGag(gagId): self.backpack.addGag( gagId, ammo, GagGlobals.getGagData(gagId).get('maxSupply')) else: self.backpack.setSupply(gagId, ammo)
def setBackpackAmmo(self, gagIds, ammoList): if -1 in ammoList: return else: self.gagBPData = [gagIds, ammoList] if not self.initAmmo: self.initAmmo = ammoList self.initGagIds = gagIds else: self.initAmmo = None self.initGagIds = None bpReset = False if len(self.backpack.gags.keys()) > 0: for index in range(len(gagIds)): gagId = gagIds[index] numOfThisGag = 0 for gag in self.backpack.gags.keys(): if type(self.backpack.gagMgr.getGagByName(GagGlobals.getGagByID(gagId))) == type(gag): numOfThisGag += 1 if numOfThisGag < 1: self.backpack.resetGags() bpReset = True break for index in range(len(ammoList)): amt = ammoList[index] gagId = gagIds[index] self.backpack.setSupply(amt, GagGlobals.getGagByID(gagId)) if self.backpack.gagGUI: if bpReset: self.disablePies() self.enablePies(1) self.backpack.gagGUI.update() return
def __init__(self, name, model, damage, gagType, hitSfx, playRate=1.0, anim=None, scale=1, autoRelease=False): __metaclass__ = ABCMeta self.name = name self.model = model self.anim = anim self.scale = scale self.damage = damage self.gagType = gagType self.playRate = playRate self.avatar = None self.gag = None self.splat = None self.splatPos = None self.state = GagState.LOADED self.woosh = None self.handJoint = None self.equipped = False self.autoRelease = autoRelease self.index = None self.target = None self.health = 0 self.id = GagGlobals.getIDByName(name) self.image = None self.timeout = 5 # Handles the new recharging for certain gags. # The time it takes (in seconds) to recharge this gag. self.rechargeTime = 0 # The elapsed time of the current recharge. Should be a float self.rechargeElapsedTime = 0 if game.process == 'client': if gagType == GagType.THROW: self.woosh = base.audio3d.loadSfx(GagGlobals.PIE_WOOSH_SFX) self.hitSfx = base.audio3d.loadSfx(hitSfx)
def announceGenerate(self): DistributedAvatarAI.announceGenerate(self) DistributedSmoothNodeAI.announceGenerate(self) if self.parentId != self.getDefaultShard(): self.b_setDefaultShard(self.parentId) if self.__class__.__name__ == "DistributedToonAI": # TEMPORARY: Any new gags that we make have to be given to toons automatically. newGags = GagGlobals.gagIds.keys() currentGags = self.backpack.gags needsToUpdate = False for newGag in newGags: if not newGag in currentGags.keys(): print 'This player is missing {0}'.format(GagGlobals.getGagByID(newGag)) self.backpack.addGag(newGag) if not needsToUpdate: needsToUpdate = True if needsToUpdate: self.backpack.updateNetAmmo()
def __init__(self, name, model, damage, gagType, hitSfx, playRate=1.0, anim=None, scale=1, autoRelease=False): __metaclass__ = ABCMeta self.name = name self.model = model self.anim = anim self.scale = scale self.damage = damage self.gagType = gagType self.playRate = playRate self.avatar = None self.gag = None self.splat = None self.splatPos = None self.state = GagState.LOADED self.woosh = None self.handJoint = None self.equipped = False self.autoRelease = autoRelease self.index = None self.target = None self.health = 0 self.id = GagGlobals.getIDByName(name) self.image = None self.timeout = 5 self.rechargeTime = 0 self.rechargeElapsedTime = 0 if game.process == 'client': if gagType == GagType.THROW: self.woosh = base.audio3d.loadSfx(GagGlobals.PIE_WOOSH_SFX) self.hitSfx = base.audio3d.loadSfx(hitSfx) return
def suitHitByPie(self, avId, gag_id): obj = self.air.doId2do.get(avId, None) gag = self.gagMgr.getGagByName(GagGlobals.getGagByID(gag_id)) dmg = gag.getDamage() if obj: obj.b_setHealth(obj.getHealth() - dmg) if obj.getHealth() <= 0: if gag.getType() == GagType.THROW or gag.getName() == CIGlobals.TNT: obj.b_setAnimState('pie') elif gag.getType() == GagType.DROP: majorDrops = [CIGlobals.GrandPiano, CIGlobals.Safe, CIGlobals.BigWeight] if gag.getName() in majorDrops: obj.b_setAnimState('drop') else: obj.b_setAnimState('drop-react') elif gag.getType() == GagType.SQUIRT or gag.getType() == GagType.SOUND: if gag.getName() == CIGlobals.StormCloud: obj.b_setAnimState('soak') else: obj.b_setAnimState('squirt-small') if obj.__class__.__name__ == 'DistributedSuit': self.questManager.cogDefeated(obj) return
def setWeapon(self, slot, playSound = True): if isinstance(slot, str): for iSlot in self.slots: if iSlot.getGag(): if iSlot.getGag().getName() == slot: slot = iSlot if self.activeSlot: self.activeSlot.setOutlineImage('idle') self.prevSlot = self.activeSlot if self.backpack.getSupply(slot.getGag().getName()) > 0: if self.activeSlot != slot: base.localAvatar.b_equip(GagGlobals.getIDByName(slot.getGag().getName())) slot.setOutlineImage('selected') self.activeSlot = slot elif self.activeSlot == slot and slot.getGag().getState() == GagState.LOADED: base.localAvatar.b_unEquip() self.activeSlot = None self.update() if self.switchSound and playSound: SoundInterval(self.switchSoundSfx).start() else: return return
def setGagAmmo(self, gagId, ammo): if self.backpack.getGagByID(gagId): self.backpack.setSupply(ammo, GagGlobals.getGagByID(gagId))
def __init__(self): SquirtGag.__init__(self, CIGlobals.Geyser, GagGlobals.getProp(5, 'geyser'), 105, GagGlobals.GEYSER_HIT_SFX, None, None, None, None, None, None, 1, 1) ChargeUpGag.__init__(self, 24, 10, 50, 0.5, maxCogs=4) self.setImage('phase_3.5/maps/geyser.png') self.entities = [] return
def startEntity(self, cog): if not cog: self.completeSquirt() return scaleUpPoint = Point3(1.5, 1.5, 1.5) rainDelay = 1 effectDelay = 0.3 cloudHold = 4.7 tContact = 2.4 if cog.isDead(): cloudHold = 1.7 cloud01, trickleFx, rainEffects, entity = self.buildEntity() cloud01.setZ(cog.suitPlan.getNametagZ() + 2) cloud01.reparentTo(cog) cloud02 = Actor(self.model, {'chan' : GagGlobals.getProp(4, 'stormcloud-chan')}) cloud02.reparentTo(cloud01) def damageCog(): if self.isLocal(): cog.sendUpdate('hitByGag', [self.getID()]) def __getCloudTrack(cloud, useEffect = 1): track = Sequence( Func(cloud.pose, 'chan', 0), LerpScaleInterval(cloud, 1.5, scaleUpPoint, startScale = GagGlobals.PNT3NEAR0), Wait(rainDelay) ) if useEffect == 1: pTrack = Parallel() delay = trickleDuration = cloudHold * 0.25 trickleTrack = ParticleInterval(trickleFx, cloud, worldRelative=0, duration=trickleDuration, cleanup=True) track.append(trickleTrack) for i in range(0, 3): dur = cloudHold - 2 * trickleDuration pTrack.append(Sequence(Wait(delay), ParticleInterval(rainEffects[i], cloud, worldRelative=0, duration=dur, cleanup=True))) delay += effectDelay pTrack.append(Sequence( Wait(3 * effectDelay), ActorInterval(cloud, 'chan', startTime = 1, duration = cloudHold)) ) damageTrack = Sequence() if cog.getHealth() - self.getDamage() <= 0: damageTrack.append(Func(cog.d_disableMovement, wantRay = True)) damageTrack.append(Func(damageCog)) else: damageTrack.append(Wait(tContact)) damageTrack.append(Func(damageCog)) pTrack.append(damageTrack) track.append(pTrack) else: track.append(ActorInterval(cloud, 'chan', startTime = 1, duration = cloudHold)) track.append(LerpScaleInterval(cloud, 0.5, GagGlobals.PNT3NEAR0)) track.append(Func(GagUtils.destroyProp, cloud)) return track tracks = Parallel() soundTrack01 = self.getSoundTrack(1.3, self.avatar) soundTrack02 = self.getSoundTrack(3.4, self.avatar) tracks.append(soundTrack01) tracks.append(soundTrack02) cloud01Track = __getCloudTrack(cloud01) cloud02Track = __getCloudTrack(cloud02, useEffect = 0) tracks.append(cloud01Track) tracks.append(cloud02Track) tracks.append(Func(self.destroyEntity, entity)) tracks.start()
def setGagAmmo(self, gagId, ammo): self.backpack.setSupply(ammo, GagGlobals.getGagByID(gagId)) if self.backpack.gagGUI: self.backpack.gagGUI.update()
def __init__(self): LightDropGag.__init__(self, CIGlobals.FlowerPot, GagGlobals.getProp('5', 'flowerpot-mod'), GagGlobals.getProp('5', 'flowerpot-chan'), 10, GagGlobals.POT_DROP_SFX, GagGlobals.POT_MISS_SFX, rotate90=False, sphereSize=2, sphereZ=-3.5) self.setImage('phase_3.5/maps/flowerpot.png')
def buildLips(self): self.cleanupLips() self.lips = GagGlobals.loadProp(5, 'lips')
def __init__(self): LightDropGag.__init__(self, CIGlobals.Sandbag, GagGlobals.getProp('5', 'sandbag-mod'), GagGlobals.getProp('5', 'sandbag-chan'), 18, GagGlobals.BAG_DROP_SFX, GagGlobals.BAG_MISS_SFX, rotate90=False, sphereSize=2) self.setImage('phase_3.5/maps/sandbag.png')