/** * \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 Arrow::notify_attacked_enemy(EnemyAttack attack, Enemy& victim, EnemyReaction::Reaction& result, bool killed) { if (result.type == EnemyReaction::PROTECTED) { stop(); attach_to(victim); } else if (result.type != EnemyReaction::IGNORED) { if (killed) { remove_from_map(); } else { attach_to(victim); } } }
/** * \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 Arrow::notify_collision_with_crystal(Crystal& crystal, CollisionMode collision_mode) { if (collision_mode == COLLISION_OVERLAPPING && is_flying()) { crystal.activate(*this); attach_to(crystal); } }
/** * \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 Arrow::notify_collision_with_switch(Switch& sw, CollisionMode collision_mode) { if (sw.is_arrow_target() && is_stopped()) { sw.try_activate(*this); } else if (sw.is_solid() && is_flying()) { sw.try_activate(); attach_to(sw); } }
/** * @brief This function is called when a destructible item detects a non-pixel precise collision with this entity. * @param destructible the destructible item * @param collision_mode the collision mode that detected the event */ void Hookshot::notify_collision_with_destructible(Destructible& destructible, CollisionMode collision_mode) { if (destructible.is_obstacle_for(*this) && is_flying()) { if (destructible.can_explode()) { destructible.explode(); go_back(); } else { attach_to(destructible); } } }
/** * \brief This function is called when a destructible item detects a non-pixel perfect collision with this entity. * \param destructible the destructible item * \param collision_mode the collision mode that detected the event */ void Arrow::notify_collision_with_destructible( Destructible& destructible, CollisionMode collision_mode) { if (destructible.is_obstacle_for(*this) && is_flying()) { if (destructible.get_can_explode()) { destructible.explode(); remove_from_map(); } else { attach_to(destructible); } } }
/** * @brief This function is called when a block detects a collision with this entity. * @param block the block */ void Hookshot::notify_collision_with_block(Block& block) { if (is_flying()) { attach_to(block); } }
/** * @brief This function is called when a chest detects a collision with this entity. * @param chest the chest */ void Hookshot::notify_collision_with_chest(Chest& chest) { if (is_flying()) { attach_to(chest); } }