Exemple #1
0
    def explode(self, game):
        (ao, ro, ag) = ([], [], [])
        for obj in game.objects.objects:
            if obj.alive and obj.player and utils.distLowerThanObjects(
                    self, obj, self.explosionRange + obj.stats.maxRadius):
                if self.launcher:
                    sender = self.launcher.player
                else:
                    sender = None

                waveEffect = 5
                angle = utils.angleBetweenObjects(self, obj)
                dist = utils.distBetweenObjects(self, obj)
                modif = max(
                    (self.explosionRange - dist - obj.stats.maxRadius) /
                    self.explosionRange, 1)
                obj.xi += cos(angle) * modif * waveEffect
                obj.yi += sin(angle) * modif * waveEffect
                (ao0, ro0,
                 ag0) = obj.hit(game, utils.angleBetweenObjects(obj, self),
                                sender, modif * self.weapon.stats.energyDamage,
                                self.weapon.stats.massDamage * modif)

                (ao, ro, ag) = (ao + ao0, ro + ro0, ag + ag0)
        self.alive = False
        ro0 = [self]
        ag0 = [
            GfxExplosion((self.xp, self.yp),
                         self.explosionRange,
                         sound=ids.S_EX_NUKE)
        ]
        return (ao, ro + ro0, ag + ag0)
Exemple #2
0
    def doTurn( self, game ):
        (ao,ro,ag) = Ship.doTurn(self, game)

        if self.inNebula and self.ttl%(config.fps*2)==0:
            self.loseTarget( game )

        if self.lostTarget and (self.originalTtl-self.ttl)>config.fps:
            self.launcher = None

        # detect hit
        for obj in game.objects.getWithinRadius( self, self.stats.maxRadius ):
             if obj.alive and obj.player and (not self.launcher or obj.player != self.launcher.player):
                 if self.launcher:
                     sender = self.launcher.player
                 else:
                     sender = None
                 (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, self ), sender, self.weapon.stats.energyDamage, self.weapon.stats.massDamage )
                 (ao1, ro1, ag1) = self.explode( game )
                 (ao, ro, ag) = (ao+ao0+ao1, ro+ro0+ro1, ag+ag0+ag1)
                 break

        if self.alive and not (self.originalTtl-self.ttl)%self.thinkFreq:
            if isinstance( self.target, Object ):
                target = ( self.target.xp, self.target.yp )
                if not self.target.alive:
                    self.target = target
            else:
                target = self.target

        # ori
            destAngle = utils.angleBetween( (self.xp,self.yp), target )
            angle = utils.angleDiff( destAngle, self.ori )

            absAngle = fabs( angle )
            if absAngle > self.stats.maxRg*2: # *(config.fps/10): #*5:
                if angle > 0:
                    self.rg = self.stats.maxRg
                else:
                    self.rg = -1*self.stats.maxRg
            else:
                self.rg = 0

 	    self.thrust = self.stats.maxThrust
        

            if utils.distLowerThan( (self.xp,self.yp), target, self.stats.maxRadius*4 ):
                 (ao1, ro1, ag1) = self.explode( game )
                 (ao, ro, ag) = (ao+ao1, ro+ro1, ag+ag1)
             #    self.alive = False
            #     ro.append( self )
             #    ag.append( GfxExplosion( (self.xp,self.yp), self.stats.maxRadius*3 ) )
                
        if self.alive:
            if self.ttl == 0:
                self.alive = False
                ro.append( self )
            else:
                self.ttl = self.ttl - 1

        return (ao,ro,ag)
Exemple #3
0
 def explode(self, game):
     (ao, ro, ag) = ([], [], [])
     for obj in game.objects.objects:
         if obj.alive and obj.player and utils.distLowerThanObjects(
                 self, obj, self.explosionRange + obj.stats.maxRadius):
             if self.launcher:
                 sender = self.launcher.player
             else:
                 sender = None
             (ao0, ro0,
              ag0) = obj.hit(game,
                             utils.angleBetweenObjects(obj, self),
                             sender,
                             self.weapon.stats.energyDamage,
                             self.weapon.stats.massDamage,
                             pulse=10 * 30)  # self.weapon.stats.pulseLength
             (ao, ro, ag) = (ao + ao0, ro + ro0, ag + ag0)
     self.alive = False
     ro0 = [self]
     ag0 = [
         GfxExplosion((self.xp, self.yp),
                      self.explosionRange,
                      sound=ids.S_EX_PULSE)
     ]
     return (ao, ro + ro0, ag + ag0)
Exemple #4
0
def explode(self,
            game,
            explosionRange,
            energyDamage=0,
            massDamage=0,
            pulseLength=0,
            sender=None,
            deadlyToSelf=True,
            sound=ids.S_EX_PULSE):
    (ao, ro, ag) = ([], [], [])
    for obj in game.objects.getWithinRadius(self, explosionRange):
        if obj.alive and obj.player:
            (ao0, ro0, ag0) = obj.hit(game,
                                      utils.angleBetweenObjects(obj, self),
                                      sender,
                                      energyDamage,
                                      massDamage,
                                      pulse=pulseLength)
            (ao, ro, ag) = (ao + ao0, ro + ro0, ag + ag0)

    if deadlyToSelf:
        self.alive = False
        ro.append(self)

    ag.append(GfxExplosion(self.pos, explosionRange, sound=sound))

    return (ao, ro, ag)
Exemple #5
0
 def fire( self, ship, game, target ):
     (ao,ro,ag) = ([],[],[])
     for obj in game.objects.objects:
         if obj.alive and obj.player and utils.distLowerThanObjects( self, obj, self.stats.explosionRange + obj.stats.maxRadius ):
              if ship.ai.player:
                  sender = ship.ai.player
              else:
                  sender = None
              (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, ship ), sender, self.stats.energyDamage, self.stats.massDamage, pulse=self.stats.pulseLength ) # self.weapon.stats.pulseLength
              (ao, ro, ag) = (ao+ao0, ro+ro0, ag+ag0)
     ag0 = [ GfxExplosion( (ship.xp,ship.yp), self.stats.explosionRange, sound=ids.S_EX_PULSE ) ]
     return (ao, ro+ro0, ag+ag0)
Exemple #6
0
    def manageFagship(self, ship, game):
        if not game.tick % 50:
            ## activated turrets
            for turret in ship.turrets:
                turret.activated = True

            ## launch harvesters
            for k in ship.ai.launching:
                if isinstance(game.stats[k], game.stats.HarvesterShipStats):
                    ship.ai.launching[k] = True

        if ship.ai.attacking:  # in combat
            ## launch fighters
            for k in ship.ai.launching:
                if not isinstance(game.stats[k],
                                  game.stats.HarvesterShipStats):
                    ship.ai.launching[k] = True

            ## maneuver
            dist = (ship.stats.maxRadius +
                    ship.ai.attacking.stats.maxRadius) * 1.5
            angle = utils.angleBetweenObjects(ship.ai.attacking, ship) + pi / 8
            ship.ai.goTo(ship, (ship.ai.attacking.xp + cos(angle) * dist,
                                ship.ai.attacking.yp + sin(angle) * dist))

        else:  # not in combat
            if not game.tick % (config.fps * 10):
                needToFindOre = False
                needToFindEnergy = False

                ## recall fighters when not in combat
                for k in ship.ai.launching:
                    if not isinstance(game.stats[k],
                                      game.stats.HarvesterShipStats):
                        ship.ai.recallShips(ship, game,
                                            k)  #ship.ai.launching[ k ] = False

                ## move closer to resources
                if sum( [ len(ship.shipyards[ shipyard ].docked)+len(ship.shipyards[ shipyard ].away) for shipyard in \
                  filter( lambda ship: isinstance( game.stats[ k ], game.stats.HarvesterShipStats ), ship.shipyards ) ] ): # if has any harvesters
                    closestAsteroid = game.harvestables.getClosestAccording(
                        ship.pos, ship.getRadarRange())
                    if closestAsteroid and not utils.distLowerThanObjects(
                            ship, closestAsteroid, ship.stats.maxRadius * 2):
                        dist = ship.stats.maxRadius * 1.5
                        angle = random() * 2 * pi
                        ship.ai.goTo(ship,
                                     (closestAsteroid.xp + dist * cos(angle),
                                      closestAsteroid.yp + dist * sin(angle)))
                    else:  # nothing in range
                        if ship.ore < ship.stats.maxOre / 10:  # low on ore
                            needToFindOre = True
Exemple #7
0
    def explode( self, game ):
        (ao,ro,ag) = ([],[],[])
        for obj in game.objects.objects:
            if obj.alive and obj.player and utils.distLowerThanObjects( self, obj, self.explosionRange + obj.stats.maxRadius ):
                 if self.launcher:
                     sender = self.launcher.player
                 else:
                     sender = None

                 waveEffect = 5
                 angle = utils.angleBetweenObjects( self, obj )
                 dist = utils.distBetweenObjects( self, obj )
                 modif = max((self.explosionRange-dist-obj.stats.maxRadius)/self.explosionRange, 1)
                 obj.xi += cos(angle)*modif*waveEffect
                 obj.yi += sin(angle)*modif*waveEffect
                 (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, self ), sender, modif*self.weapon.stats.energyDamage, self.weapon.stats.massDamage*modif )

                 (ao, ro, ag) = (ao+ao0, ro+ro0, ag+ag0)
        self.alive = False
        ro0 = [ self ]
        ag0 = [ GfxExplosion( (self.xp,self.yp), self.explosionRange, sound=ids.S_EX_NUKE ) ]
        return (ao, ro+ro0, ag+ag0)
Exemple #8
0
 def explode( self, game ):
     (ao,ro,ag) = ([],[],[])
     for obj in game.objects.objects:
         if obj.alive and obj.player and utils.distLowerThanObjects( self, obj, self.explosionRange + obj.stats.maxRadius ):
              if self.launcher:
                  sender = self.launcher.player
              else:
                  sender = None
              (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, self ), sender, self.weapon.stats.energyDamage, self.weapon.stats.massDamage, pulse=10*30 ) # self.weapon.stats.pulseLength
              (ao, ro, ag) = (ao+ao0, ro+ro0, ag+ag0)
     self.alive = False
     ro0 = [ self ]
     ag0 = [ GfxExplosion( (self.xp,self.yp), self.explosionRange, sound=ids.S_EX_PULSE ) ]
     return (ao, ro+ro0, ag+ag0)
Exemple #9
0
def explode( self, game, explosionRange, energyDamage=0, massDamage=0, pulseLength=0, sender=None, deadlyToSelf=True, sound=ids.S_EX_PULSE ):
    (ao,ro,ag) = ([],[],[])
    for obj in game.objects.getWithinRadius( self, explosionRange ):
        if obj.alive and obj.player:
             (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, self ), sender, energyDamage, massDamage, pulse=pulseLength )
             (ao, ro, ag) = (ao+ao0, ro+ro0, ag+ag0)
    
    if deadlyToSelf:
        self.alive = False
        ro.append( self )
        
    ag.append( GfxExplosion( self.pos, explosionRange, sound=sound ) )
    
    return (ao, ro, ag)
Exemple #10
0
    def manageFagship( self, ship, game ):
        if not game.tick%50:
            ## activated turrets
            for turret in ship.turrets:
                turret.activated = True
        
            ## launch harvesters
            for k in ship.ai.launching:
                if isinstance( game.stats[ k ], game.stats.HarvesterShipStats ):
                    ship.ai.launching[ k ] = True

        if ship.ai.attacking: # in combat
            ## launch fighters
            for k in ship.ai.launching:
                if not isinstance( game.stats[ k ], game.stats.HarvesterShipStats ):
                    ship.ai.launching[ k ] = True

            ## maneuver
            dist = (ship.stats.maxRadius + ship.ai.attacking.stats.maxRadius)*1.5
            angle = utils.angleBetweenObjects( ship.ai.attacking, ship )+pi/8
            ship.ai.goTo( ship, (ship.ai.attacking.xp+cos(angle)*dist, ship.ai.attacking.yp+sin(angle)*dist) )

        else: # not in combat
            if not game.tick%(config.fps*10):
                needToFindOre = False
                needToFindEnergy = False
                
                ## recall fighters when not in combat
                for k in ship.ai.launching:
                    if not isinstance( game.stats[ k ], game.stats.HarvesterShipStats ):
                        ship.ai.recallShips( ship, game, k )  #ship.ai.launching[ k ] = False
            
                ## move closer to resources
                if sum( [ len(ship.shipyards[ shipyard ].docked)+len(ship.shipyards[ shipyard ].away) for shipyard in \
                  filter( lambda ship: isinstance( game.stats[ k ], game.stats.HarvesterShipStats ), ship.shipyards ) ] ): # if has any harvesters
                    closestAsteroid = game.harvestables.getClosestAccording( ship.pos, ship.getRadarRange() )
                    if closestAsteroid and not utils.distLowerThanObjects( ship, closestAsteroid, ship.stats.maxRadius*2 ):
                        dist=ship.stats.maxRadius*1.5
                        angle=random()*2*pi
                        ship.ai.goTo( ship, (closestAsteroid.xp+dist*cos(angle),closestAsteroid.yp+dist*sin(angle)) )
                    else: # nothing in range
                        if ship.ore < ship.stats.maxOre/10: # low on ore
                            needToFindOre = True
Exemple #11
0
    def doTurn( self, game ):
        (ao,ro,ag) = Object.doTurn(self, game)

        # detect hit
        for obj in game.objects.getWithinRadius( self, self.stats.maxRadius ):
             if obj.alive and obj.player != None and obj.player != self.launcher.player: # TODO better
                 (ao0, ro0, ag0) = obj.hit( game, utils.angleBetweenObjects( obj, self), self.launcher.player, energy=self.weapon.stats.energyDamage, mass=self.weapon.stats.massDamage )
                 (ao, ro, ag) = (ao+ao0, ro+ro0, ag+ag0)
                 self.alive = False
                 ro.append( self )
                 break

        if self.alive and self.ttl == 0:
            self.alive = False
            ro.append( self )
        else:
            self.ttl = self.ttl - 1

        return (ao,ro,ag)
Exemple #12
0
    def doTurn(self, game):
        (ao, ro, ag) = Object.doTurn(self, game)

        # detect hit
        for obj in game.objects.getWithinRadius(self, self.stats.maxRadius):
            if obj.alive and obj.player != None and obj.player != self.launcher.player:  # TODO better
                (ao0, ro0,
                 ag0) = obj.hit(game,
                                utils.angleBetweenObjects(obj, self),
                                self.launcher.player,
                                energy=self.weapon.stats.energyDamage,
                                mass=self.weapon.stats.massDamage)
                (ao, ro, ag) = (ao + ao0, ro + ro0, ag + ag0)
                self.alive = False
                ro.append(self)
                break

        if self.alive and self.ttl == 0:
            self.alive = False
            ro.append(self)
        else:
            self.ttl = self.ttl - 1

        return (ao, ro, ag)
Exemple #13
0
 def fire(self, ship, game, target):
     (ao, ro, ag) = ([], [], [])
     for obj in game.objects.objects:
         if obj.alive and obj.player and utils.distLowerThanObjects(
                 self, obj,
                 self.stats.explosionRange + obj.stats.maxRadius):
             if ship.ai.player:
                 sender = ship.ai.player
             else:
                 sender = None
             (ao0, ro0, ag0) = obj.hit(game,
                                       utils.angleBetweenObjects(obj, ship),
                                       sender,
                                       self.stats.energyDamage,
                                       self.stats.massDamage,
                                       pulse=self.stats.pulseLength
                                       )  # self.weapon.stats.pulseLength
             (ao, ro, ag) = (ao + ao0, ro + ro0, ag + ag0)
     ag0 = [
         GfxExplosion((ship.xp, ship.yp),
                      self.stats.explosionRange,
                      sound=ids.S_EX_PULSE)
     ]
     return (ao, ro + ro0, ag + ag0)
Exemple #14
0
    def doTurn(self, game):
        (ao, ro, ag) = Ship.doTurn(self, game)

        if self.inNebula and self.ttl % (config.fps * 2) == 0:
            self.loseTarget(game)

        if self.lostTarget and (self.originalTtl - self.ttl) > config.fps:
            self.launcher = None

        # detect hit
        for obj in game.objects.getWithinRadius(self, self.stats.maxRadius):
            if obj.alive and obj.player and (
                    not self.launcher or obj.player != self.launcher.player):
                if self.launcher:
                    sender = self.launcher.player
                else:
                    sender = None
                (ao0, ro0, ag0) = obj.hit(game,
                                          utils.angleBetweenObjects(obj, self),
                                          sender,
                                          self.weapon.stats.energyDamage,
                                          self.weapon.stats.massDamage)
                (ao1, ro1, ag1) = self.explode(game)
                (ao, ro, ag) = (ao + ao0 + ao1, ro + ro0 + ro1, ag + ag0 + ag1)
                break

        if self.alive and not (self.originalTtl - self.ttl) % self.thinkFreq:
            if isinstance(self.target, Object):
                target = (self.target.xp, self.target.yp)
                if not self.target.alive:
                    self.target = target
            else:
                target = self.target

        # ori
            destAngle = utils.angleBetween((self.xp, self.yp), target)
            angle = utils.angleDiff(destAngle, self.ori)

            absAngle = fabs(angle)
            if absAngle > self.stats.maxRg * 2:  # *(config.fps/10): #*5:
                if angle > 0:
                    self.rg = self.stats.maxRg
                else:
                    self.rg = -1 * self.stats.maxRg
            else:
                self.rg = 0

            self.thrust = self.stats.maxThrust

            if utils.distLowerThan((self.xp, self.yp), target,
                                   self.stats.maxRadius * 4):
                (ao1, ro1, ag1) = self.explode(game)
                (ao, ro, ag) = (ao + ao1, ro + ro1, ag + ag1)
            #    self.alive = False
            #     ro.append( self )
            #    ag.append( GfxExplosion( (self.xp,self.yp), self.stats.maxRadius*3 ) )

        if self.alive:
            if self.ttl == 0:
                self.alive = False
                ro.append(self)
            else:
                self.ttl = self.ttl - 1

        return (ao, ro, ag)