void MenuPowers::logic() { for (unsigned i=0; i<power_cell_unlocked.size(); i++) { if (static_cast<unsigned>(power_cell_unlocked[i].id) < powers->powers.size() && powers->powers[power_cell_unlocked[i].id].passive) { bool unlocked_power = std::find(stats->powers_list.begin(), stats->powers_list.end(), power_cell_unlocked[i].id) != stats->powers_list.end(); std::vector<int>::iterator it = std::find(stats->powers_passive.begin(), stats->powers_passive.end(), power_cell_unlocked[i].id); if (it != stats->powers_passive.end()) { if (!baseRequirementsMet(power_cell_unlocked[i].id) && power_cell_unlocked[i].passive_on) { stats->powers_passive.erase(it); stats->effects.removeEffectPassive(power_cell_unlocked[i].id); power_cell[i].passive_on = false; stats->refresh_stats = true; } } else if (((baseRequirementsMet(power_cell_unlocked[i].id) && !power_cell_unlocked[i].requires_point) || unlocked_power) && !power_cell_unlocked[i].passive_on) { stats->powers_passive.push_back(power_cell_unlocked[i].id); power_cell_unlocked[i].passive_on = true; // for passives without special triggers, we need to trigger them here if (stats->effects.triggered_others) powers->activateSinglePassive(stats, power_cell_unlocked[i].id); } } } for (unsigned i=0; i<power_cell.size(); i++) { //upgrade buttons logic if (upgradeButtons[i] != NULL) { upgradeButtons[i]->enabled = false; // enable button only if current level is unlocked and next level can be unlocked if (canUpgrade(static_cast<short>(i))) { upgradeButtons[i]->enabled = true; } if ((!tab_control || power_cell[i].tab == tab_control->getActiveTab()) && upgradeButtons[i]->checkClick()) { upgradePower(static_cast<short>(i)); } } } points_left = static_cast<short>((stats->level * stats->power_points_per_level) - getPointsUsed()); if (points_left > 0) { newPowerNotification = true; } if (!visible) return; tablist.logic(); if (closeButton->checkClick()) { visible = false; snd->play(sfx_close); } if (tab_control) { // make shure keyboard navigation leads us to correct tab for (unsigned int i = 0; i < slots.size(); i++) { if (slots[i] && slots[i]->in_focus) tab_control->setActiveTab(power_cell[i].tab); } tab_control->logic(); } }
void MenuPowers::logic() { setUnlockedPowers(); for (size_t i=0; i<power_cell_unlocked.size(); i++) { if (static_cast<size_t>(power_cell_unlocked[i].id) < powers->powers.size() && powers->powers[power_cell_unlocked[i].id].passive) { bool unlocked_power = std::find(stats->powers_list.begin(), stats->powers_list.end(), power_cell_unlocked[i].id) != stats->powers_list.end(); std::vector<int>::iterator it = std::find(stats->powers_passive.begin(), stats->powers_passive.end(), power_cell_unlocked[i].id); int cell_index = getCellByPowerIndex(power_cell_unlocked[i].id, power_cell_all); bool is_current_upgrade_max = (getCellByPowerIndex(power_cell_unlocked[i].id, power_cell) != -1); if (it != stats->powers_passive.end()) { if (!is_current_upgrade_max || (!checkRequirements(cell_index) && power_cell_unlocked[i].passive_on)) { // passive power is activated, but does not meet requirements, so remove it stats->powers_passive.erase(it); stats->effects.removeEffectPassive(power_cell_unlocked[i].id); power_cell[i].passive_on = false; stats->refresh_stats = true; } } else if (is_current_upgrade_max && ((checkRequirements(cell_index) && !power_cell_unlocked[i].requires_point) || unlocked_power) && !power_cell_unlocked[i].passive_on) { // passive power has not been activated, so activate it here stats->powers_passive.push_back(power_cell_unlocked[i].id); power_cell_unlocked[i].passive_on = true; // for passives without special triggers, we need to trigger them here if (stats->effects.triggered_others) powers->activateSinglePassive(stats, power_cell_unlocked[i].id); } } } for (size_t i=0; i<power_cell.size(); i++) { //upgrade buttons logic if (upgradeButtons[i] != NULL) { upgradeButtons[i]->enabled = false; // enable button only if current level is unlocked and next level can be unlocked if (checkUpgrade(static_cast<int>(i))) { upgradeButtons[i]->enabled = true; } if ((!tab_control || power_cell[i].tab == tab_control->getActiveTab()) && upgradeButtons[i]->checkClick()) { upgradePower(static_cast<int>(i)); } // automatically apply upgrades when requires_point = false if (upgradeButtons[i]->enabled) { int next_index; int prev_index = -1; while ((next_index = getNextLevelCell(static_cast<int>(i))) != -1) { if (prev_index == next_index) { // this should never happen, but if it ever does, it would be an infinite loop break; } if (!power_cell_upgrade[next_index].requires_point && checkUpgrade(static_cast<int>(i))) { upgradePower(static_cast<int>(i), true); } else { break; } prev_index = next_index; } } } } points_left = (stats->level * stats->power_points_per_level) - getPointsUsed(); if (points_left > 0) { newPowerNotification = true; } if (!visible) return; tablist.logic(); if (!tabs.empty()) { for (size_t i=0; i<tabs.size(); i++) { if (tab_control && tab_control->getActiveTab() == static_cast<int>(i)) { tablist.setNextTabList(&tablist_pow[i]); } tablist_pow[i].logic(); } } if (closeButton->checkClick()) { visible = false; snd->play(sfx_close); } if (tab_control) { // make shure keyboard navigation leads us to correct tab for (size_t i=0; i<slots.size(); i++) { if (power_cell[i].tab == tab_control->getActiveTab()) continue; if (slots[i] && slots[i]->in_focus) slots[i]->defocus(); } tab_control->logic(); } }