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