/** * \copydoc Detector::notify_action_command_pressed */ bool Chest::notify_action_command_pressed() { if (is_enabled() && get_hero().is_free() && get_keys_effect().get_action_key_effect() != KeysEffect::ACTION_KEY_NONE ) { if (can_open()) { Sound::play("chest_open"); set_open(true); treasure_date = System::now() + 300; get_keys_effect().set_action_key_effect(KeysEffect::ACTION_KEY_NONE); get_hero().start_freezed(); } else if (!get_cannot_open_dialog_id().empty()) { Sound::play("wrong"); get_game().start_dialog(get_cannot_open_dialog_id(), ScopedLuaRef(), ScopedLuaRef()); } return true; } return false; }
/** * @brief Notifies this detector that a collision was just detected with another entity. * * This function is called by the engine when there is a collision with another entity. * * @param entity_overlapping the entity overlapping the detector * @param collision_mode the collision mode that detected the collision */ void Door::notify_collision(MapEntity& entity_overlapping, CollisionMode collision_mode) { if (is_closed() && entity_overlapping.is_hero()) { Hero& hero = static_cast<Hero&>(entity_overlapping); if (get_keys_effect().get_action_key_effect() == KeysEffect::ACTION_KEY_NONE && hero.is_free()) { if (can_open()) { // The action command opens the door. get_keys_effect().set_action_key_effect(KeysEffect::ACTION_KEY_OPEN); } else if (!get_cannot_open_dialog_id().empty()) { // The action command shows a dialog. get_keys_effect().set_action_key_effect(KeysEffect::ACTION_KEY_LOOK); } } } }