/** * @brief Updates the entity. */ void ShopItem::update() { if (is_looking_item && !get_game().is_dialog_enabled()) { // the description message has just finished const std::string question_dialog_id = "_shop.question"; get_dialog_box().start_dialog(question_dialog_id); get_dialog_box().set_variable(question_dialog_id, price); is_asking_question = true; is_looking_item = false; } else if (is_asking_question && !get_game().is_dialog_enabled()) { // the question has just finished is_asking_question = false; int answer = get_dialog_box().get_last_answer(); if (answer == 0) { // the player wants to buy the item Equipment& equipment = get_equipment(); EquipmentItem& item = treasure.get_item(); if (equipment.get_money() < price) { // not enough rupees Sound::play("wrong"); get_dialog_box().start_dialog("_shop.not_enough_money"); } else if (item.has_amount() && item.get_amount() >= item.get_max_amount()) { // the player already has the maximum amount of this item Sound::play("wrong"); get_dialog_box().start_dialog("_shop.amount_full"); } else { bool can_buy = get_lua_context().shop_item_on_buying(*this); if (can_buy) { // give the treasure equipment.remove_money(price); get_hero().start_treasure(treasure, LUA_REFNIL); if (treasure.is_saved()) { remove_from_map(); get_savegame().set_boolean(treasure.get_savegame_variable(), true); } get_lua_context().shop_item_on_bought(*this); } } } } }
/** * @brief Notifies this detector that the player is interacting with it by * pressing the action command. * * This function is called when the player presses the action command * while the hero is facing this detector, and the action command effect lets * him do this. */ void Destructible::notify_action_command_pressed() { KeysEffect::ActionKeyEffect effect = get_keys_effect().get_action_key_effect(); if ((effect == KeysEffect::ACTION_KEY_LIFT || effect == KeysEffect::ACTION_KEY_LOOK) && features[subtype].can_be_lifted && !is_being_cut && !is_disabled() && !is_regenerating) { int weight = features[subtype].weight; if (get_equipment().has_ability("lift", weight)) { uint32_t explosion_date = can_explode() ? System::now() + 6000 : 0; get_hero().start_lifting(new CarriedItem(get_hero(), *this, get_animation_set_id(), get_destruction_sound_id(), get_damage_on_enemies(), explosion_date)); // play the sound Sound::play("lift"); // create the pickable item create_pickable(); // remove the item from the map if (!features[subtype].can_regenerate) { destruction_callback(); remove_from_map(); } else { // the item can actually regenerate play_destroy_animation(); } } else { if (features[subtype].can_be_cut && !features[subtype].can_explode && !get_equipment().has_ability("sword", 1)) { get_dialog_box().start_dialog("_cannot_lift_should_cut"); } else if (!get_equipment().has_ability("lift", 1)) { get_dialog_box().start_dialog("_cannot_lift_too_heavy"); } else { get_dialog_box().start_dialog("_cannot_lift_still_too_heavy"); } } } }
/** * @brief Notifies this detector that the player is interacting with it by * pressing the action command. * * This function is called when the player presses the action command * while the hero is facing this detector, and the action command effect lets * him do this. * The hero opens the door if possible, otherwise a message is shown. */ void Door::notify_action_command_pressed() { if (get_hero().is_free() && is_closed()) { if (can_open()) { Sound::play("door_unlocked"); Sound::play("door_open"); if (is_saved()) { get_savegame().set_boolean(savegame_variable, true); } if (is_opening_condition_consumed()) { consume_opening_condition(); } set_opening(); get_hero().check_position(); } else if (!cannot_open_dialog_id.empty()) { Sound::play("wrong"); get_dialog_box().start_dialog(cannot_open_dialog_id); } } }
/** * @brief Notifies this detector that the player is interacting with it by * pressing the action command. * * This function is called when the player presses the action command * while the hero is facing this detector, and the action command effect lets * him do this. * A dialog is shown to let the hero buy the item. */ void ShopItem::notify_action_command_pressed() { if (get_hero().is_free() && get_keys_effect().get_action_key_effect() == KeysEffect::ACTION_KEY_LOOK) { get_dialog_box().start_dialog(dialog_id); is_looking_item = true; } }
/** * @brief This function is called when the player interacts with this entity. * * This function is called when the player presses the action key * while the hero is facing this detector, and the action icon lets him do this. */ void CrystalSwitch::action_key_pressed() { if (get_hero().is_free()) { get_keys_effect().set_action_key_effect(KeysEffect::ACTION_KEY_NONE); // start a dialog get_dialog_box().start_dialog("_crystal_switch"); } }
/** * @brief Notifies this detector that the player is interacting with it by * pressing the action command. * * This function is called when the player presses the action command * while the hero is facing this detector, and the action command effect lets * him do this. */ void Crystal::notify_action_command_pressed() { if (get_hero().is_free()) { get_keys_effect().set_action_key_effect(KeysEffect::ACTION_KEY_NONE); // start a dialog get_dialog_box().start_dialog("_crystal"); } }
/** * @brief Notifies this detector that the player is interacting with it by * pressing the action command. * * This function is called when the player presses the action command * while the hero is facing this detector, and the action command effect lets * him do this. * The hero opens the chest if possible. */ void Chest::notify_action_command_pressed() { if (is_enabled() && get_hero().is_free()) { 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_dialog_box().start_dialog(get_cannot_open_dialog_id()); } } }
/** * @brief This function is called when the player interacts with this chest. * * This function is called when the player presses the action key * when the hero is facing this detector, and the action icon lets him do this. * The hero opens the chest if possible. */ void Chest::action_key_pressed() { if (is_visible() && get_hero().is_free()) { if (!big_chest || get_equipment().has_ability("open_dungeon_big_locks")) { 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 { Sound::play("wrong"); get_dialog_box().start_dialog("_big_key_required"); } } }
/** * @brief Updates the chest. * * This function is called repeatedly by the map. * This is a redefinition of MapEntity::update() * the handle the chest opening. */ void Chest::update() { if (is_open() && !suspended) { if (!treasure_given && treasure_date != 0 && System::now() >= treasure_date) { treasure_date = 0; if (!treasure.is_empty()) { // give a treasure to the player get_hero().start_treasure(treasure, LUA_REFNIL); treasure_given = true; } else { // the chest is empty // mark the treasure as found in the savegame if (treasure.is_saved()) { get_savegame().set_boolean(treasure.get_savegame_variable(), true); } treasure_given = true; bool done = get_lua_context().chest_on_empty(*this); if (!done) { // the script does not define any behavior: // by default, we tell the player the chest is empty Sound::play("wrong"); get_dialog_box().start_dialog("_empty_chest"); get_hero().start_free(); } } } } MapEntity::update(); }
/** * @brief Updates the chest. * * This function is called repeatedly by the map. * This is a redefinition of MapEntity::update() * the handle the chest opening. */ void Chest::update() { if (is_open() && !suspended) { if (!treasure_given && treasure_date != 0 && System::now() >= treasure_date) { treasure_date = 0; if (treasure.get_item_name() != "_none") { // give a treasure to the player get_hero().start_treasure(treasure); treasure_given = true; } else { // the chest is empty // mark the treasure as found in the savegame int savegame_variable = treasure.get_savegame_variable(); if (savegame_variable != -1) { get_savegame().set_boolean(savegame_variable, true); } treasure_given = true; if (!get_map_script().event_chest_empty(get_name())) { // the script does not define any behavior: // by default, we tell the player the chest is empty Sound::play("wrong"); get_dialog_box().start_dialog("_empty_chest"); get_hero().start_free(); } } } } MapEntity::update(); }