bool Game_Party::UseItem(int item_id, Game_Actor* target) { bool was_used = false; auto* item = ReaderUtil::GetElement(Data::items, item_id); if (!item) { Output::Warning("UseItem: Can't use item with invalid ID %d", item_id); return false; } bool do_skill = (item->type == RPG::Item::Type_special) || (item->use_skill && ( item->type == RPG::Item::Type_weapon || item->type == RPG::Item::Type_shield || item->type == RPG::Item::Type_armor || item->type == RPG::Item::Type_helmet || item->type == RPG::Item::Type_accessory ) ); const RPG::Skill* skill = nullptr; if (do_skill) { skill = ReaderUtil::GetElement(Data::skills, item->skill_id); if (skill == nullptr) { Output::Warning("UseItem: Can't use item %d skill with invalid ID %d", item->ID, item->skill_id); return false; } } const Game_Actor* fixed_source = nullptr; if (skill && skill->scope != RPG::Skill::Scope_self) { fixed_source = GetHighestLeveledActorWhoCanUse(item); if (fixed_source == nullptr) { return false; } } if (target) { const auto* source = fixed_source ? fixed_source : target; if (IsItemUsable(item_id, source)) { was_used = target->UseItem(item_id, source); } } else { for (auto* actor: GetActors()) { const auto* source = fixed_source ? fixed_source : actor; if (IsItemUsable(item_id, source)) { was_used |= actor->UseItem(item_id, source); } } } if (was_used) { ConsumeItemUse(item_id); } return was_used; }
bool Game_Party::UseItem(int item_id, Game_Actor* target) { bool was_used = false; if (target) { was_used = target->UseItem(item_id); } else { std::vector<Game_Actor*> actors = GetActors(); std::vector<Game_Actor*>::iterator it; for (it = actors.begin(); it != actors.end(); ++it) { was_used |= (*it)->UseItem(item_id); } } if (was_used) { ConsumeItemUse(item_id); } return was_used; }