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