/** * @brief Notifies this entity that it has just attacked an enemy. * * This function is called even if this attack was not successful. * * @param attack the attack * @param victim the enemy just hurt * @param result indicates how the enemy has reacted to the attack * @param killed indicates that the attack has just killed the enemy */ void Hookshot::notify_attacked_enemy(EnemyAttack attack, Enemy& victim, EnemyReaction::Reaction& result, bool killed) { if (result.type != EnemyReaction::IGNORED && !is_going_back()) { go_back(); } }
/** * \brief This function is called when a crystal detects a collision with this entity. * \param crystal the crystal * \param collision_mode the collision mode that detected the event */ void Boomerang::notify_collision_with_crystal(Crystal &crystal, CollisionMode collision_mode) { if (collision_mode == COLLISION_RECTANGLE) { crystal.activate(*this); if (!is_going_back()) { go_back(); } } }
/** * @brief This function is called when a crystal detects a collision with this entity. * @param crystal the crystal * @param collision_mode the collision mode that detected the event */ void Hookshot::notify_collision_with_crystal(Crystal& crystal, CollisionMode collision_mode) { if (is_flying()) { crystal.activate(*this); if (!is_going_back()) { go_back(); } } }
/** * \copydoc MapEntity::notify_attacked_enemy */ void Boomerang::notify_attacked_enemy( EnemyAttack attack, Enemy& victim, const Sprite* victim_sprite, EnemyReaction::Reaction& result, bool killed) { if (result.type != EnemyReaction::IGNORED && !is_going_back()) { go_back(); } }
/** * \brief This function is called when a switch detects a collision with this entity. * \param sw the switch * \param collision_mode the collision mode that detected the event */ void Boomerang::notify_collision_with_switch(Switch& sw, CollisionMode collision_mode) { if (collision_mode == COLLISION_RECTANGLE) { sw.try_activate(); if (!is_going_back()) { go_back(); Sound::play("sword_tapping"); } } }
/** * \brief This function is called when the movement of the entity is finished. */ void Boomerang::notify_movement_finished() { if (!is_going_back()) { // the maximum distance is reached go_back(); } else { // the boomerang is back remove_from_map(); } }
/** * \copydoc Entity::notify_attacked_enemy */ void Boomerang::notify_attacked_enemy( EnemyAttack /* attack */, Enemy& /* victim */, const Sprite* /* victim_sprite */, EnemyReaction::Reaction& result, bool /* killed */) { if (result.type != EnemyReaction::ReactionType::IGNORED && !is_going_back()) { go_back(); } }
/** * \brief This function is called when a switch detects a collision with this entity. * \param sw the switch * \param collision_mode the collision mode that detected the event */ void Hookshot::notify_collision_with_switch(Switch& sw, CollisionMode collision_mode) { if (is_flying() && collision_mode == COLLISION_OVERLAPPING) { sw.try_activate(); if (!is_going_back()) { go_back(); Sound::play("sword_tapping"); } } }
/** * \brief Notifies this entity that it has just failed to change its position * because of obstacles. */ void Boomerang::notify_obstacle_reached() { if (!is_going_back()) { if (!get_map().test_collision_with_border( get_movement()->get_last_collision_box_on_obstacle())) { // play a sound unless the obstacle is the map border Sound::play("sword_tapping"); } go_back(); } }
/** * \brief Makes the boomerang go back towards the hero. */ void Boomerang::go_back() { Debug::check_assertion(!is_going_back(), "The boomerang is already going back"); has_to_go_back = true; }
/** * @brief Makes the hookshot go back towards the hero. */ void Hookshot::go_back() { Debug::check_assertion(!is_going_back(), "The hookshot is already going back"); has_to_go_back = true; }
/** * @brief Returns whether the hookshot is currently flying. * @return true if the hookshot was shot, is not going back and has not reached any target yet */ bool Hookshot::is_flying() { return !is_going_back() && entity_reached == NULL; }
/** * \brief Returns whether the hookshot is currently flying. * \return true if the hookshot was shot, is not going back and has not reached any target yet */ bool Hookshot::is_flying() const { return !is_going_back() && entity_reached == nullptr; }