예제 #1
0
    def update(self):
        #randomly determine action
        if not self.attacking:
            r = random.randint(0, 40)
            if r == 0:
                self.right = not self.right
            if self.moving:
                if self.right:
                    self.animation = self.spMoveRight
                    self.dx = 1
                else:
                    self.animation = self.spMoveLeft
                    self.dx = -1
            r = random.randint(0, 180)
            if r == 0 and not self.falling:
                self.shoot = True

        if self.shoot:
            self.dx = 0
            self.dy = 0
            if not self.attacking:
                self.frame = 0
                self.attacking = True
                Skeleton.arrowSound.play()
            if self.right:
                self.animation = self.spShootRight
                if self.frame == 18:
                    arrow = Arrow(self.rect.x + 44, self.rect.y + 24,
                                  self.right)
                    self.arrowSprites.add(arrow)
            else:
                self.animation = self.spShootLeft
                if self.frame == 18:
                    arrow = Arrow(self.rect.x + 18, self.rect.y + 24,
                                  self.right)
                    self.arrowSprites.add(arrow)

        Enemy.update(self)
예제 #2
0
	def __init__(self, caster, location, item):
		self.caster = caster
		self.target = location
		self.item = item
		self.color = THECOLORS['chocolate']
		self.range = self.__class__.range
		self.damage = self.__class__.damage
		
		casterName = self.caster.getName()
		
		self.entityHit = self.caster.world.getEntityFromLocation(self.target)
		if not self.entityHit is None:
			targetName = self.entityHit.getName()
			self.caster.world.log.append(casterName + ' shot ' + targetName + ' with a ' + self.__class__.__name__)
		else:
			self.caster.world.log.append(casterName + ' shot nothing!')

		self.projectile = Arrow(caster.position, location, self.color, self.fire, self.impact)
		self.done = False
예제 #3
0
class BowShot(object):
	
	range = 7
	damage = 2, 5
	heal = False
	name = "Shoot"
	icon = "arrow"
	cooldown = 0
		
	def __init__(self, caster, location, item):
		self.caster = caster
		self.target = location
		self.item = item
		self.color = THECOLORS['chocolate']
		self.range = self.__class__.range
		self.damage = self.__class__.damage
		
		casterName = self.caster.getName()
		
		self.entityHit = self.caster.world.getEntityFromLocation(self.target)
		if not self.entityHit is None:
			targetName = self.entityHit.getName()
			self.caster.world.log.append(casterName + ' shot ' + targetName + ' with a ' + self.__class__.__name__)
		else:
			self.caster.world.log.append(casterName + ' shot nothing!')

		self.projectile = Arrow(caster.position, location, self.color, self.fire, self.impact)
		self.done = False
		
	def update(self):
		pos = None
		if self.entityHit is not None:
			pos = Vector2(self.entityHit.position)

		self.projectile.update(pos)
		if self.projectile.done:
			if not self.entityHit is None:
				self.entityHit.inflict(self.caster, randint(self.damage[0], self.damage[1]))
			self.done = True
			return True
		
		return False
		
	def draw(self, surface, position, visible):
		if not self.done:
			self.projectile.draw(surface, position, visible)
			
	@classmethod
	def validTarget(cls, actor, target):
	
		if not target.isAlive():
			return False
		
		if target in actor.getFriends():
			return False
		
		return actor.partyCanSee(target.position)
		
	
	def fire(self):
		self.caster.world.sounds.get("pew.wav").play()
	
	def impact(self):
		self.caster.world.sounds.get("hit.wav").play()
예제 #4
0
    def Update(self):
        """Update the troll group, each update gives a flag that basically tells us wether we need to create a javelin or not"""
        for troll in self.troll_group:
            troll_flag = troll.update(self.block_group, self.player.coords,
                                      self.breakable_group, self.passage_group)
            if troll_flag != None:
                info = troll_flag[1]
                javelin = Javelin(info[0], self.img_list[self.level.JAVELIN],
                                  info[1])
                self.projectile_group.add(javelin)
        """Update the bat group, since bats are not ranged, then there are no necessary flags"""
        if (len(self.bat_group.sprites()) > 0):
            self.bat_group.update(self.block_group, self.player.coords,
                                  self.breakable_group, self.passage_group)
        """Update the shooter group, each update gives a flag that basically tells us wether we need to create a ball or not"""
        for shooter in self.shooter_group:
            shooter_flag = shooter.update(self.block_group, self.player.coords,
                                          self.breakable_group,
                                          self.passage_group)
            if shooter_flag != None:
                info = shooter_flag[1]
                ball = Ball(info[0], self.img_list[self.level.BALL], info[1])
                self.projectile_group.add(ball)
        """Update the projectile group, each update gives a flag that basically tells us wether we hit something"""
        for projectile in self.projectile_group:
            projectile_flag = projectile.update(
                self.block_group, self.breakable_group, self.player_group,
                self.projectile_group, self.troll_group, self.shooter_group,
                self.bat_group, self.boss_group)
            if projectile_flag != None:
                if projectile_flag[0] != "Enemy":
                    self.projectile_group.remove(projectile)
        """Update the boss"""
        if self.boss != None:
            self.boss.update(self.block_group, self.passage_group)
        """Player update that returns flags"""
        player_flag = self.player.update(
            self.block_group, self.door_group, self.passage_group,
            self.breakable_group, self.troll_group, self.shooter_group,
            self.bat_group, self.projectile_group, self.potion_group,
            self.pickup_bomb_group, self.bowandquiver_group, self.boss_group)
        """If player has put a bomb, then update it, it may create a flag"""
        if self.player.bomb != None:
            bomb_flag = self.player.bomb.update(self.breakable_group,
                                                self.troll_group,
                                                self.shooter_group,
                                                self.bat_group,
                                                self.boss_group)
        else:
            bomb_flag = None
        """If player has put a arrow, it may create a flag"""
        if self.player.arrow != None:
            arrow_flag = self.player.arrow.update(
                self.block_group, self.breakable_group, self.player_group,
                self.projectile_group, self.troll_group, self.shooter_group,
                self.bat_group, self.boss_group)
        else:
            arrow_flag = None
        """
        Update the inventory
        """
        self.bomb_number.update(self.player.bombs)
        self.potion_number.update(self.player.potions)
        self.heart1_group.update(self.player.currentHealth - 8)
        self.heart2_group.update(self.player.currentHealth - 4)
        self.heart3_group.update(self.player.currentHealth)
        """check bomb_flag"""
        if bomb_flag != None:
            if bomb_flag[0] == "Enemy":
                for i in range(0, 7):
                    enemies = bomb_flag[1][i]
                    if len(enemies[0]) > 0:
                        for troll in enemies[0]:
                            self.troll_group.remove(troll)
                    if len(enemies[1]) > 0:
                        for shooter in enemies[1]:
                            self.shooter_group.remove(shooter)
                    if len(enemies[2]) > 0:
                        for bat in enemies[2]:
                            self.bat_group.remove(bat)
            if bomb_flag[0] == "Boss":
                self.boss.health -= 1

            self.player.bomb = None
            self.bomb_group.empty()
        """check arrow_flag"""
        if arrow_flag != None:
            if arrow_flag[0] == "Enemy":
                enemies = arrow_flag[1]
                if len(enemies[0]) > 0:
                    for troll in enemies[0]:
                        self.troll_group.remove(troll)
                if len(enemies[1]) > 0:
                    for shooter in enemies[1]:
                        self.shooter_group.remove(shooter)
                if len(enemies[2]) > 0:
                    for bat in enemies[2]:
                        self.bat_group.remove(bat)
            if arrow_flag[0] == "BossHit":
                self.boss.health -= 1

            elif arrow_flag[0] == "Projectile":
                projectiles = arrow_flag[1]
                if len(projectiles) > 0:
                    for projectile in projectiles:
                        self.projectile_group.remove(projectile)

            if arrow_flag[0] != "Player":
                self.player.arrow = None
                self.arrow_group.empty()
        """If the player has collided against something specific, we get a flag as player_flag, depending on the flag, do different things"""

        if player_flag == None:
            holder = 1
        elif player_flag[0] == "Potion":
            self.potion_group.remove(player_flag[1])
        elif player_flag[0] == "Bomb":
            self.pickup_bomb_group.remove(player_flag[1])
        elif player_flag[0] == "BowAndQuiver":
            self.bowandquiver_group.remove(player_flag[1])
        elif player_flag[0] == "PlaceBomb":
            bomb = Bomb(self.player.rect.center,
                        self.img_list[self.level.KINGBOMB])
            self.player.bomb = bomb
            self.bomb_group.add(bomb)
        elif player_flag[0] == "Arrow":
            arrow = Arrow(self.player.rect.center,
                          self.img_list[self.level.KINGARROW],
                          self.player.direction)
            self.player.arrow = arrow
            self.arrow_group.add(arrow)
        elif player_flag[0] == "Attacked":
            enemies = player_flag[1]
            if len(enemies[0]) > 0:
                for troll in enemies[0]:
                    self.troll_group.remove(troll)
            if len(enemies[1]) > 0:
                for shooter in enemies[1]:
                    self.shooter_group.remove(shooter)
            if len(enemies[2]) > 0:
                for bat in enemies[2]:
                    self.bat_group.remove(bat)
        elif player_flag[0] == "BossHit":
            if self.boss.attack == 1:
                self.boss.health -= 1
            else:
                self.player.currentHealth -= 1
        elif player_flag[0] == "Passage":
            self.current_level = player_flag[1]
            """
            Load all of our Sprites
            """
            self.LoadSprites(player_flag[2])
            """
            Create Background
            """
            self.background = pygame.Surface(self.screen.get_size())
            self.background = self.background.convert()
            self.background.fill((0, 0, 0))
            """
            We could draw here parts that would only need to be drawn once
            But since levels change there is no need for that
            """

            pygame.display.flip()
예제 #5
0
    def shoot(self):
        # If you don't have any ammo stab instead
        if self.ammo <= 0:
            self.stab()

        # If you do have, ammo shoot an arrow and remove one ammo
        elif self.ammo > 0:
            arcade.play_sound(self.sound_mapping['bow_shoot'])
            self.ammo -= 1
            arrow = Arrow(path / "images/arrow.png",
                          center_x=self.center_x,
                          center_y=self.center_y,
                          scale=.5)
            arrow.speed = 6
            if self.eye_pos == "right":
                arrow.change_x = arrow.speed
                arrow.change_y = 0
                arrow.angle = -90
            elif self.eye_pos == "left":
                arrow.change_x = -arrow.speed
                arrow.change_y = 0
                arrow.angle = 90
            elif self.eye_pos == "up":
                arrow.change_x = 0
                arrow.change_y = arrow.speed
                arrow.angle = 0
            elif self.eye_pos == "down":
                arrow.change_x = 0
                arrow.change_y = -arrow.speed
                arrow.angle = 180
            self.arrow_list.append(arrow)