def detonate(self): bomb = self.bombs.pop(0) # Remember to account for range starting at the first parameter, and stopping before the second parameter # Which is really stupid <_< Why do that??? It's just confusing IMO for x in range(bomb[0] - self.bombBlastZone, bomb[0] + self.bombBlastZone + 1): for y in range(bomb[1] - self.bombBlastZone, bomb[1] + self.bombBlastZone + 1): # This is REALLY inefficient, the loops make a square where there should be a diamond of explosions if x < 0 or x >= MAP_WIDTH or y < 0 or y >= MAP_HEIGHT: continue if CombatUtils.distance(x, y, bomb[0], bomb[1]) > self.bombBlastZone: continue super(Homura, self).abilityThree(x, y) # Normally, enemy deaths are checked at the end of the player's turn # But bombs don't work that way for event in pygame.event.get(EventType.DIED): if event.beingType == BeingType.FAMILIAR: self.killedFamiliar() elif event.beingType == BeingType.WITCH: self.killedWitch() elif event.beingType == BeingType.WALPURGISNACHT: self.killedWalpurgisnacht()
def abilityTwo(self, x, y): for xIndex in range(self.x - self.abilityTwoRange, self.x + self.abilityTwoRange + 1): for yIndex in range(self.y - self.abilityTwoRange, self.y + self.abilityTwoRange + 1): if xIndex < 0 or xIndex >= MAP_WIDTH or yIndex < 0 or yIndex >= MAP_HEIGHT: continue if CombatUtils.distance(self.x, self.y, xIndex, yIndex) > self.abilityTwoRange: continue if self.x == xIndex and self.y == yIndex: continue super(Kyoko, self).abilityTwo(xIndex, yIndex) return self.spinMagicCost
def takeTurnTargeting(self, event): if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: if self.targetY > 0 and CombatUtils.distance( self.x, self.y, self.targetX, self.targetY - 1) <= self.getRange(self.targeting): self.targetY -= 1 self.targetPath.append((self.targetX, self.targetY)) return False elif event.key == pygame.K_DOWN: if self.targetY < ( MAP_HEIGHT - 1) and CombatUtils.distance( self.x, self.y, self.targetX, self.targetY + 1) <= self.getRange(self.targeting): self.targetY += 1 self.targetPath.append((self.targetX, self.targetY)) return False elif event.key == pygame.K_LEFT: if self.targetX > 0 and CombatUtils.distance( self.x, self.y, self.targetX - 1, self.targetY) <= self.getRange(self.targeting): self.targetX -= 1 self.targetPath.append((self.targetX, self.targetY)) return False elif event.key == pygame.K_RIGHT: if self.targetX < (MAP_WIDTH - 1) and CombatUtils.distance( self.x, self.y, self.targetX + 1, self.targetY) <= self.getRange(self.targeting): self.targetX += 1 self.targetPath.append((self.targetX, self.targetY)) return False elif event.key == pygame.K_QUOTE and self.targeting == ABILITY_ONE: self.targeting = None if not board.grid[self.targetX][self.targetY].beings: target = None else: target = board.grid[self.targetX][ self.targetY].beings[-1] if not CombatUtils.canTarget(target, self.abilityOneTargets): self.targetPath = [] return False magicLoss = self.abilityOne(self.targetX, self.targetY) self.targetPath = [] if magicLoss is None: return False self.magic -= magicLoss if self.magic <= 0: Event.lossEvent() return True elif event.key == pygame.K_COMMA and self.targeting == ABILITY_TWO: self.targeting = None if not board.grid[self.targetX][self.targetY].beings: target = None else: target = board.grid[self.targetX][ self.targetY].beings[-1] if not CombatUtils.canTarget(target, self.abilityTwoTargets): self.targetPath = [] return False magicLoss = self.abilityTwo(self.targetX, self.targetY) self.targetPath = [] if magicLoss is None: return False self.magic -= magicLoss if self.magic <= 0: Event.lossEvent() return True elif event.key == pygame.K_PERIOD and self.targeting == ABILITY_THREE: self.targeting = None if not board.grid[self.targetX][self.targetY].beings: target = None else: target = board.grid[self.targetX][ self.targetY].beings[-1] if not CombatUtils.canTarget(target, self.abilityThreeTargets): self.targetPath = [] return False magicLoss = self.abilityThree(self.targetX, self.targetY) self.targetPath = [] if magicLoss is None: return False self.magic -= magicLoss if self.magic <= 0: Event.lossEvent() return True elif event.key == pygame.K_p and self.targeting == ABILITY_FOUR: self.targeting = None if not board.grid[self.targetX][self.targetY].beings: target = None else: target = board.grid[self.targetX][ self.targetY].beings[-1] if not CombatUtils.canTarget(target, self.abilityFourTargets): self.targetPath = [] return False magicLoss = self.abilityFour(self.targetX, self.targetY) self.targetPath = [] if magicLoss is None: return False self.magic -= magicLoss if self.magic <= 0: Event.lossEvent() return True self.targeting = None return False # Mouse support to be implemented later return False