Esempio n. 1
0
    def addGag(self, gagId, curSupply=None, maxSupply=None):
        if isinstance(gagId, str):
            gagId = self.avatar.getAttackMgr().getAttackIDByName(gagId)
        gagName = self.avatar.getAttackMgr().getAttackName(gagId)
        # Make sure the gag is actually a registered attack and we
        # don't already have it in our backpack
        if not self.hasGag(gagId) and gagId in self.avatar.getAttackMgr(
        ).AttackClasses.keys():
            if maxSupply is None:
                # Sets the max supply if one is not specified.
                maxSupply = GagGlobals.calculateMaxSupply(
                    self.avatar, gagName, GagGlobals.getGagData(gagName))

            # Sets the current supply to the max supply if current supply isn't
            # specified.
            if curSupply is None:
                curSupply = maxSupply

            gagData = GagGlobals.getGagData(gagName)

            attackCls = self.avatar.getAttackMgr().getAttackClassByID(gagId)
            if attackCls:
                attack = attackCls()
                attack.setAvatar(self.avatar)
                attack.setMaxAmmo(maxSupply)
                attack.setAmmo(curSupply)

                # ============================================================ #
                # Horrible hack until we start determining damage
                # based on the Gag's level.

                import types

                baseDamage = GagGlobals.calcBaseDamage(
                    self.avatar,
                    self.avatar.getAttackMgr().getAttackName(gagId), gagData)

                def getBaseDamage(self):
                    return baseDamage

                attack.getBaseDamage = types.MethodType(getBaseDamage, attack)

                damageMaxDistance = float(gagData.get('distance', 10))

                def getDamageMaxDistance(self):
                    return damageMaxDistance

                attack.getDamageMaxDistance = types.MethodType(
                    getDamageMaxDistance, attack)

                # ============================================================ #

                attack.load()
                self.avatar.attacks[gagId] = attack
                return True

        return False
Esempio n. 2
0
    def getDefaultMaxSupply(self, gagId):
        data = GagGlobals.getGagData(gagId)

        if 'minMaxSupply' in data.keys():
            return data.get('minMaxSupply')
        else:
            return data.get('maxSupply')
 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)
Esempio n. 4
0
    def handleHitByToon(self, player, gagId, distance):
        if self.isDead():
            return

        gagName = base.cr.attackMgr.getAttackName(gagId)
        data = dict(GagGlobals.getGagData(gagName))
        data['distance'] = distance
        baseDmg = GagGlobals.calculateDamage(player, gagName, data)
        hp = self.health - baseDmg
        self.setHealth(hp)
        self.announceHealth(0, baseDmg, -1)
        self.doDamageFade()
        if self.isDead():
            self.doRagdollMode()
Esempio n. 5
0
    def hitByGag(self, gagId, distance):
        if self.isDead():
            return

        avId = self.air.getAvatarIdFromSender()
        player = self.air.doId2do.get(avId, None)
        if not player:
            return

        gagName = self.air.attackMgr.getAttackName(gagId)
        data = dict(GagGlobals.getGagData(gagName))
        data['distance'] = distance
        baseDmg = GagGlobals.calculateDamage(player, gagName, data)
        hp = self.health - baseDmg
        self.b_setHealth(hp)
        self.d_announceHealth(0, baseDmg, -1)
        if self.isDead():
            self.dispatchOutput("OnDie")
            self.brain.stop()
            self.d_doRagdollMode()
Esempio n. 6
0
    def takeDamage(self, damageInfo):  #, gagId, distance):
        gagId = damageInfo.attackID
        distance = damageInfo.damageDistance
        avId = damageInfo.damager.doId
        avatar = damageInfo.damager
        gagName = self.air.attackMgr.getAttackName(gagId)

        dataRef = GagGlobals.getGagData(gagName)
        if dataRef:
            data = dict(dataRef)
        else:
            data = {}
        data['distance'] = distance
        track = GagGlobals.getTrackOfGag(gagId, getId=True, isAI=True)

        isPlayer = hasattr(avatar, "trackExperience")

        if self.canGetHit():
            damage = self.__handleTacticalAttacks(avatar.doId, gagName, data,
                                                  damageInfo, isPlayer)

            self.setDamageConditions(damage)

            if isPlayer and self.battleZone:
                # We only want to award credit when Toons use gags that are less than or at the level of the Cog
                # they're using them on.
                gagLevel = GagGlobals.TrackGagNamesByTrackName.get(
                    data.get('track')).index(gagName)

                if gagLevel <= self.level:
                    self.battleZone.handleGagUse(gagId, avId)

            if isPlayer and not avId in self.damagers:
                self.damagers.append(avId)

            if self.isDead():
                self.stopStun()

                #if self.firstTimeDead:
                #    self.sendUpdate('doStunEffect')

                deathAnim = self.__getAnimForGag(track, gagName)
                #self.b_setAnimState(deathAnim, 0)

                #self.stopAI()

                # Let's give everyone credit who damaged me.
                if self.battleZone:
                    for damager in self.damagers:
                        self.battleZone.handleCogDeath(self, damager)

                self.firstTimeDead = False

            elif gagName in GagGlobals.Stunnables and not self.stunned:
                # We have been stunned.
                self.clearTrack()

                animName = self.__getAnimForGag(track, gagName)
                animB4Stun = SuitGlobals.getAnimIdByName(animName)
                self.sendUpdate('stun', [animB4Stun])

                baseStunTime = 6.0
                stunTime = (baseStunTime /
                            self.suitPlan.getCogClassAttrs().dmgMod) * (
                                damage / 95.0)
                taskMgr.doMethodLater(stunTime, self.__stunTask,
                                      self.taskName('stunTask'))

                self.stunned = True

            else:
                # Sound will wake me up.
                if self.stunned and track == GagType.SOUND:
                    self.stopStun(restart=True)

            # Do appropriate gag effects.
            flags = 0
            if gagName == GagGlobals.TNT:
                flags |= GagEffects.GEAsh
            if flags != 0:
                self.sendUpdate('doGagEffect', [flags])