bool Game_Party::IsItemUsable(int item_id, const Game_Actor* target) const { if (target && !target->IsItemUsable(item_id)) { return false; } const RPG::Item* item = ReaderUtil::GetElement(Data::items, item_id); if (!item) { Output::Warning("IsItemUsable: Invalid item ID %d", item_id); return false; } if (data().party.size() == 0) { return false; } switch (item->type) { case RPG::Item::Type_weapon: case RPG::Item::Type_shield: case RPG::Item::Type_armor: case RPG::Item::Type_helmet: case RPG::Item::Type_accessory: return item->use_skill && IsSkillUsable(item->skill_id, nullptr, true); case RPG::Item::Type_special: return IsSkillUsable(item->skill_id, nullptr, true); } if (Game_Temp::battle_running) { switch (item->type) { case RPG::Item::Type_medicine: return !item->occasion_field1; case RPG::Item::Type_switch: return item->occasion_battle; } } else { switch (item->type) { case RPG::Item::Type_medicine: case RPG::Item::Type_material: case RPG::Item::Type_book: return true; case RPG::Item::Type_switch: return item->occasion_field2; } } return false; }
bool Game_Enemy::IsActionValid(const RPG::EnemyAction& action) { if (action.kind == action.Kind_skill) { if (!IsSkillUsable(action.skill_id)) { return false; } } switch (action.condition_type) { case RPG::EnemyAction::ConditionType_always: return true; case RPG::EnemyAction::ConditionType_switch: return Game_Switches[action.switch_id]; case RPG::EnemyAction::ConditionType_turn: { int turns = Game_Battle::GetTurn(); return Game_Battle::CheckTurns(turns, action.condition_param2, action.condition_param1); } case RPG::EnemyAction::ConditionType_actors: { std::vector<Game_Battler*> battlers; GetParty().GetActiveBattlers(battlers); int count = (int)battlers.size(); return count >= action.condition_param1 && count <= action.condition_param2; } case RPG::EnemyAction::ConditionType_hp: { int hp_percent = GetHp() * 100 / GetMaxHp(); return hp_percent >= action.condition_param1 && hp_percent <= action.condition_param2; } case RPG::EnemyAction::ConditionType_sp: { int sp_percent = GetSp() * 100 / GetMaxSp(); return sp_percent >= action.condition_param1 && sp_percent <= action.condition_param2; } case RPG::EnemyAction::ConditionType_party_lvl: { int party_lvl = Main_Data::game_party->GetAverageLevel(); return party_lvl >= action.condition_param1 && party_lvl <= action.condition_param2; } case RPG::EnemyAction::ConditionType_party_fatigue: { int party_exh = Main_Data::game_party->GetFatigue(); return party_exh >= action.condition_param1 && party_exh <= action.condition_param2; } default: return true; } }