StatBlock::AIPower* StatBlock::getAIPower(int ai_type) { std::vector<size_t> possible_ids; int chance = rand() % 100; for (size_t i=0; i<powers_ai.size(); ++i) { if (ai_type != powers_ai[i].type) continue; if (chance > powers_ai[i].chance) continue; if (powers_ai[i].ticks > 0) continue; if (powers->powers[powers_ai[i].id].type == Power::TYPE_SPAWN) { if (summonLimitReached(powers_ai[i].id)) continue; } if (!checkRequiredSpawns(powers->powers[powers_ai[i].id].requires_spawns)) continue; possible_ids.push_back(i); } if (!possible_ids.empty()) { size_t index = static_cast<size_t>(rand()) % possible_ids.size(); return &powers_ai[possible_ids[index]]; } return NULL; }
bool StatBlock::canUsePower(int powerid, bool allow_passive) const { const Power& power = powers->powers[powerid]; if (!alive) { // can't use powers when dead return false; } else if (!hero) { // AI can always use their powers return true; } else if (transformed) { // needed to unlock shapeshifter powers return mp >= power.requires_mp; } else { return ( mp >= power.requires_mp && (!power.passive || allow_passive) && !power.meta_power && (!effects.stun || (allow_passive && power.passive)) && (power.sacrifice || hp > power.requires_hp) && powers->checkRequiredMaxHPMP(power, this) && (!power.requires_corpse || (target_corpse && !target_corpse->corpse_timer.isEnd()) || (target_nearest_corpse && powers->checkNearestTargeting(power, this, true) && !target_nearest_corpse->corpse_timer.isEnd())) && (checkRequiredSpawns(power.requires_spawns)) && (menu_powers && menu_powers->meetsUsageStats(powerid)) && (power.type == Power::TYPE_SPAWN ? !summonLimitReached(powerid) : true) && !(power.spawn_type == "untransform" && !transformed) && std::includes(equip_flags.begin(), equip_flags.end(), power.requires_flags.begin(), power.requires_flags.end()) && (!power.buff_party || (power.buff_party && enemym && enemym->checkPartyMembers())) && powers->checkRequiredItems(power, this) ); } }
bool StatBlock::canUsePower(const Power &power, int powerid) const { if (!alive) { // can't use powers when dead return false; } else if (transformed) { // needed to unlock shapeshifter powers return mp >= power.requires_mp; } else { return ( mp >= power.requires_mp && !power.passive && !power.meta_power && !effects.stun && (power.sacrifice || hp > power.requires_hp) && (!power.requires_corpse || (power.requires_corpse && ((target_corpse && target_corpse->corpse_ticks > 0) || (target_nearest_corpse && powers->checkNearestTargeting(power, this, true) && target_nearest_corpse->corpse_ticks > 0)))) && (checkRequiredSpawns(power.requires_spawns)) && (menu_powers && menu_powers->meetsUsageStats(powerid)) && (power.type == POWTYPE_SPAWN ? !summonLimitReached(powerid) : true) && !(power.spawn_type == "untransform" && !transformed) && std::includes(equip_flags.begin(), equip_flags.end(), power.requires_flags.begin(), power.requires_flags.end()) && (!power.buff_party || (power.buff_party && enemym && enemym->checkPartyMembers())) && (power.requires_item == -1 || (power.requires_item > 0 && items->requirementsMet(this, power.requires_item))) ); } }
bool StatBlock::canUsePower(const Power &power, unsigned powerid) const { if (!menu_powers) return false; // needed to unlock shapeshifter powers if (transformed) return mp >= power.requires_mp; //don't use untransform power if hero is not transformed else if (power.spawn_type == "untransform" && !transformed) return false; else { return std::includes(equip_flags.begin(), equip_flags.end(), power.requires_flags.begin(), power.requires_flags.end()) && mp >= power.requires_mp && (!power.sacrifice == false || hp > power.requires_hp) && menu_powers->meetsUsageStats(powerid) && !power.passive && (power.type == POWTYPE_SPAWN ? !summonLimitReached(powerid) : true) && !power.meta_power && (power.requires_item == -1 || (power.requires_item > 0 && items->requirementsMet(this, power.requires_item))); } }