def apply_end_effect(self, game_state: GameState, buffed_entity: WorldEntity, buffed_npc: NonPlayerCharacter): game_state.player_state.stun_status.remove_one() hero_center_pos = game_state.player_entity.get_center_position() distance = 80 affected_enemies = game_state.get_enemies_within_x_y_distance_of( distance, hero_center_pos) game_state.visual_effects.append( VisualRect((50, 50, 50), hero_center_pos, distance * 2, int(distance * 2.1), Millis(200), 2, None)) game_state.visual_effects.append( VisualRect((150, 150, 0), hero_center_pos, distance, distance * 2, Millis(150), 3, None)) game_state.visual_effects.append( VisualRect((250, 250, 0), hero_center_pos, distance, distance * 2, Millis(100), 4, None)) for enemy in affected_enemies: damage: float = MIN_DMG + random.random() * (MAX_DMG - MIN_DMG) deal_player_damage_to_enemy(game_state, enemy, damage, DamageType.PHYSICAL) enemy.gain_buff_effect(get_buff_effect(STUNNED_BY_STOMP), STUN_DURATION) game_state.player_state.gain_buff_effect( get_buff_effect(BuffType.RECOVERING_AFTER_ABILITY), Millis(300)) play_sound(SoundId.ABILITY_STOMP_HIT) game_state.camera_shake = CameraShake(Millis(50), Millis(200), 12)
def control_npc(self, game_state: GameState, npc: NonPlayerCharacter, player_entity: WorldEntity, is_player_invisible: bool, time_passed: Millis): self._time_since_updated_path += time_passed self._time_since_reevaluated += time_passed self._time_since_attack += time_passed summon_entity = npc.world_entity if self._time_since_updated_path > self._update_path_interval: self._time_since_updated_path = 0 nearby_enemies = game_state.get_enemies_within_x_y_distance_of(300, npc.world_entity.get_position()) if nearby_enemies: target_entity = nearby_enemies[0].world_entity else: target_entity = game_state.player_entity self.pathfinder.update_path_towards_target(summon_entity, game_state, target_entity) new_next_waypoint = self.pathfinder.get_next_waypoint_along_path(summon_entity) should_update_waypoint = self.next_waypoint != new_next_waypoint if self._time_since_reevaluated > self._reevaluate_next_waypoint_direction_interval: self._time_since_reevaluated = 0 should_update_waypoint = True if should_update_waypoint: self.next_waypoint = new_next_waypoint if self.next_waypoint: direction = self.pathfinder.get_dir_towards_considering_collisions( game_state, summon_entity, self.next_waypoint) _move_in_dir(summon_entity, direction) else: summon_entity.set_not_moving() if self._time_since_attack > self._attack_interval: self._time_since_attack = 0 nearby_enemies = game_state.get_enemies_within_x_y_distance_of(100, summon_entity.get_position()) if nearby_enemies: damage_amount = 3 target = nearby_enemies[0] deal_npc_damage_to_npc(game_state, target, damage_amount) game_state.visual_effects.append( VisualLine((220, 0, 0), summon_entity.get_center_position(), target.world_entity.get_center_position(), Millis(100), damage_amount))
def apply_middle_effect(self, game_state: GameState, time_passed: Millis): if self.timer.update_and_check_if_ready(time_passed): player_entity = game_state.player_entity player_center_position = player_entity.get_center_position() close_enemies = game_state.get_enemies_within_x_y_distance_of( 140, player_center_position) if close_enemies: damage_amount: float = self.min_dmg + random.random() * ( self.max_dmg - self.min_dmg) deal_player_damage_to_enemy(game_state, close_enemies[0], damage_amount, DamageType.MAGIC) enemy_center_position = close_enemies[ 0].world_entity.get_center_position() game_state.visual_effects.append( VisualCircle((250, 250, 0), player_center_position, 50, 140, Millis(100), 1, player_entity)) game_state.visual_effects.append( VisualLine((250, 250, 0), player_center_position, enemy_center_position, Millis(80), 3))
def _apply_ability(game_state: GameState) -> AbilityResult: player_entity = game_state.player_entity player_center_pos = player_entity.get_center_position() game_state.visual_effects.append( VisualCircle((150, 150, 250), player_center_pos, 95, 190, Millis(200), 3)) affected_enemies = game_state.get_enemies_within_x_y_distance_of( 180, player_center_pos) effect_position = get_position_from_center_position( player_center_pos, EFFECT_SPRITE_SIZE) game_state.visual_effects.append( VisualSprite(Sprite.EFFECT_ABILITY_FROST_NOVA, effect_position, Millis(200), player_entity)) for enemy in affected_enemies: damage_was_dealt = deal_player_damage_to_enemy(game_state, enemy, 5, DamageType.MAGIC) if damage_was_dealt: enemy.gain_buff_effect( get_buff_effect(BuffType.REDUCED_MOVEMENT_SPEED), Millis(4000)) return AbilityWasUsedSuccessfully()
def _apply_ability(game_state: GameState) -> AbilityResult: player_entity = game_state.player_entity for enemy in game_state.get_enemies_within_x_y_distance_of( 400, player_entity.get_center_position()): enemy.health_resource.set_zero() return AbilityWasUsedSuccessfully()