void APITimelineItem::tooltipItems(acTimelineItemToolTip& tooltip) const { // Add the base class tooltip items: acAPITimelineItem::tooltipItems(tooltip); if (m_pTraceTableItem != NULL) { QString strDeviceTime = m_pTraceTableItem->GetColumnData(TraceTableModel::TRACE_DEVICE_TIME_COLUMN).toString(); if (!strDeviceTime.isEmpty()) { quint64 deviceTime = (quint64)(strDeviceTime.toFloat() * 1000000); strDeviceTime = getDurationString(deviceTime); tooltip.add(tr("Device Time"), strDeviceTime); } } }
void MenuPowers::createTooltip(TooltipData* tip, int slot_num, const std::vector<Power_Menu_Cell>& power_cells, bool show_unlock_prompt) { if (power_cells[slot_num].upgrade_level > 0) tip->addText(powers->powers[power_cells[slot_num].id].name + " (" + msg->get("Level %d", power_cells[slot_num].upgrade_level) + ")"); else tip->addText(powers->powers[power_cells[slot_num].id].name); if (powers->powers[power_cells[slot_num].id].passive) tip->addText(msg->get("Passive")); tip->addColoredText(substituteVarsInString(powers->powers[power_cells[slot_num].id].description, pc), color_flavor); // add mana cost if (powers->powers[power_cells[slot_num].id].requires_mp > 0) { tip->addText(msg->get("Costs %d MP", powers->powers[power_cells[slot_num].id].requires_mp)); } // add health cost if (powers->powers[power_cells[slot_num].id].requires_hp > 0) { tip->addText(msg->get("Costs %d HP", powers->powers[power_cells[slot_num].id].requires_hp)); } // add cooldown time if (powers->powers[power_cells[slot_num].id].cooldown > 0) { std::stringstream ss; ss << msg->get("Cooldown:") << " " << getDurationString(powers->powers[power_cells[slot_num].id].cooldown); tip->addText(ss.str()); } const Power &pwr = powers->powers[power_cells[slot_num].id]; for (size_t i=0; i<pwr.post_effects.size(); ++i) { std::stringstream ss; EffectDef* effect_ptr = powers->getEffectDef(pwr.post_effects[i].id); // base stats if (effect_ptr == NULL) { if (pwr.post_effects[i].magnitude > 0) { ss << "+"; } ss << pwr.post_effects[i].magnitude; bool found_key = false; for (size_t j=0; j<STAT_COUNT; ++j) { if (pwr.post_effects[i].id == STAT_KEY[j]) { if (STAT_PERCENT[j]) ss << "%"; ss << " " << STAT_NAME[j]; found_key = true; break; } } if (!found_key) { for (size_t j=0; j<ELEMENTS.size(); ++j) { if (pwr.post_effects[i].id == ELEMENTS[j].id + "_resist") { ss << "% " << msg->get("%s Resistance", ELEMENTS[j].name.c_str()); found_key = true; break; } } } if (!found_key) { for (size_t j=0; j<PRIMARY_STATS.size(); ++j) { if (pwr.post_effects[i].id == PRIMARY_STATS[j].id) { ss << " " << PRIMARY_STATS[j].name; found_key = true; break; } } } if (!found_key) { for (size_t j=0; j<DAMAGE_TYPES.size(); ++j) { if (pwr.post_effects[i].id == DAMAGE_TYPES[j].min) { ss << " " << DAMAGE_TYPES[j].name_min; found_key = true; break; } else if (pwr.post_effects[i].id == DAMAGE_TYPES[j].max) { ss << " " << DAMAGE_TYPES[j].name_max; found_key = true; break; } } } } else { if (effect_ptr->type == "damage") { ss << pwr.post_effects[i].magnitude << " " << msg->get("Damage per second"); } else if (effect_ptr->type == "damage_percent") { ss << pwr.post_effects[i].magnitude << "% " << msg->get("Damage per second"); } else if (effect_ptr->type == "hpot") { ss << pwr.post_effects[i].magnitude << " " << msg->get("HP per second"); } else if (effect_ptr->type == "hpot_percent") { ss << pwr.post_effects[i].magnitude << "% " << msg->get("HP per second"); } else if (effect_ptr->type == "mpot") { ss << pwr.post_effects[i].magnitude << " " << msg->get("MP per second"); } else if (effect_ptr->type == "mpot_percent") { ss << pwr.post_effects[i].magnitude << "% " << msg->get("MP per second"); } else if (effect_ptr->type == "speed") { if (pwr.post_effects[i].magnitude == 0) ss << msg->get("Immobilize"); else ss << msg->get("%d%% Speed", pwr.post_effects[i].magnitude); } else if (effect_ptr->type == "attack_speed") { ss << msg->get("%d%% Attack Speed", pwr.post_effects[i].magnitude); } else if (effect_ptr->type == "immunity") { ss << msg->get("Immunity"); } else if (effect_ptr->type == "immunity_damage") { ss << msg->get("Immunity to damage over time"); } else if (effect_ptr->type == "immunity_slow") { ss << msg->get("Immunity to slow"); } else if (effect_ptr->type == "immunity_stun") { ss << msg->get("Immunity to stun"); } else if (effect_ptr->type == "immunity_hp_steal") { ss << msg->get("Immunity to HP steal"); } else if (effect_ptr->type == "immunity_mp_steal") { ss << msg->get("Immunity to MP steal"); } else if (effect_ptr->type == "immunity_knockback") { ss << msg->get("Immunity to knockback"); } else if (effect_ptr->type == "immunity_damage_reflect") { ss << msg->get("Immunity to damage reflection"); } else if (effect_ptr->type == "stun") { ss << msg->get("Stun"); } else if (effect_ptr->type == "revive") { ss << msg->get("Automatic revive on death"); } else if (effect_ptr->type == "convert") { ss << msg->get("Convert"); } else if (effect_ptr->type == "fear") { ss << msg->get("Fear"); } else if (effect_ptr->type == "death_sentence") { ss << msg->get("Lifespan"); } else if (effect_ptr->type == "shield") { if (pwr.base_damage == DAMAGE_TYPES.size()) continue; if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_MULTIPLY) { int magnitude = stats->getDamageMax(pwr.base_damage) * pwr.mod_damage_value_min / 100; ss << magnitude; } else if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_ADD) { int magnitude = stats->getDamageMax(pwr.base_damage) + pwr.mod_damage_value_min; ss << magnitude; } else if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_ABSOLUTE) { if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) ss << pwr.mod_damage_value_min; else ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; } else { ss << stats->getDamageMax(pwr.base_damage); } ss << " " << msg->get("Magical Shield"); } else if (effect_ptr->type == "heal") { if (pwr.base_damage == DAMAGE_TYPES.size()) continue; int mag_min = stats->getDamageMin(pwr.base_damage); int mag_max = stats->getDamageMax(pwr.base_damage); if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_MULTIPLY) { mag_min = mag_min * pwr.mod_damage_value_min / 100; mag_max = mag_max * pwr.mod_damage_value_min / 100; ss << mag_min << "-" << mag_max; } else if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_ADD) { mag_min = mag_min + pwr.mod_damage_value_min; mag_max = mag_max + pwr.mod_damage_value_min; ss << mag_min << "-" << mag_max; } else if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_ABSOLUTE) { if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) ss << pwr.mod_damage_value_min; else ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; } else { ss << mag_min << "-" << mag_max; } ss << " " << msg->get("Healing"); } else if (effect_ptr->type == "knockback") { ss << pwr.post_effects[i].magnitude << " " << msg->get("Knockback"); } else if (pwr.post_effects[i].magnitude == 0) { // nothing } } if (!ss.str().empty()) { if (pwr.post_effects[i].duration > 0) { if (effect_ptr && effect_ptr->type == "death_sentence") { ss << ": " << getDurationString(pwr.post_effects[i].duration); } else { ss << " (" << getDurationString(pwr.post_effects[i].duration) << ")"; } if (pwr.post_effects[i].chance != 100) ss << " "; } if (pwr.post_effects[i].chance != 100) { ss << "(" << msg->get("%d%% chance", pwr.post_effects[i].chance) << ")"; } tip->addColoredText(ss.str(), color_bonus); } } if (pwr.use_hazard || pwr.type == POWTYPE_REPEATER) { std::stringstream ss; // modifier_damage if (pwr.mod_damage_mode > -1) { if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_ADD && pwr.mod_damage_value_min > 0) ss << "+"; if (pwr.mod_damage_value_max == 0 || pwr.mod_damage_value_min == pwr.mod_damage_value_max) { ss << pwr.mod_damage_value_min; } else { ss << pwr.mod_damage_value_min << "-" << pwr.mod_damage_value_max; } if (pwr.mod_damage_mode == STAT_MODIFIER_MODE_MULTIPLY) { ss << "%"; } ss << " "; if (pwr.base_damage != DAMAGE_TYPES.size()) { ss << DAMAGE_TYPES[pwr.base_damage].name; } if (pwr.count > 1 && pwr.type != POWTYPE_REPEATER) ss << " (x" << pwr.count << ")"; if (!ss.str().empty()) tip->addColoredText(ss.str(), color_bonus); } // modifier_accuracy if (pwr.mod_accuracy_mode > -1) { ss.str(""); if (pwr.mod_accuracy_mode == STAT_MODIFIER_MODE_ADD && pwr.mod_accuracy_value > 0) ss << "+"; ss << pwr.mod_accuracy_value; if (pwr.mod_accuracy_mode == STAT_MODIFIER_MODE_MULTIPLY) { ss << "%"; } ss << " "; ss << msg->get("Base Accuracy"); if (!ss.str().empty()) tip->addColoredText(ss.str(), color_bonus); } // modifier_critical if (pwr.mod_crit_mode > -1) { ss.str(""); if (pwr.mod_crit_mode == STAT_MODIFIER_MODE_ADD && pwr.mod_crit_value > 0) ss << "+"; ss << pwr.mod_crit_value; if (pwr.mod_crit_mode == STAT_MODIFIER_MODE_MULTIPLY) { ss << "%"; } ss << " "; ss << msg->get("Base Critical Chance"); if (!ss.str().empty()) tip->addColoredText(ss.str(), color_bonus); } if (pwr.trait_armor_penetration) { ss.str(""); ss << msg->get("Ignores Absorbtion"); tip->addColoredText(ss.str(), color_bonus); } if (pwr.trait_avoidance_ignore) { ss.str(""); ss << msg->get("Ignores Avoidance"); tip->addColoredText(ss.str(), color_bonus); } if (pwr.trait_crits_impaired > 0) { ss.str(""); ss << msg->get("%d%% Chance to crit slowed targets", pwr.trait_crits_impaired); tip->addColoredText(ss.str(), color_bonus); } if (pwr.trait_elemental > -1) { ss.str(""); ss << msg->get("%s Elemental Damage", ELEMENTS[pwr.trait_elemental].name.c_str()); tip->addColoredText(ss.str(), color_bonus); } } std::set<std::string>::iterator it; for (it = powers->powers[power_cells[slot_num].id].requires_flags.begin(); it != powers->powers[power_cells[slot_num].id].requires_flags.end(); ++it) { for (size_t i=0; i<EQUIP_FLAGS.size(); ++i) { if ((*it) == EQUIP_FLAGS[i].id) { tip->addText(msg->get("Requires a %s", msg->get(EQUIP_FLAGS[i].name))); } } } // add requirement for (size_t i = 0; i < PRIMARY_STATS.size(); ++i) { if (power_cells[slot_num].requires_primary[i] > 0) { if (stats->get_primary(i) < power_cells[slot_num].requires_primary[i]) tip->addColoredText(msg->get("Requires %s %d", power_cells[slot_num].requires_primary[i], PRIMARY_STATS[i].name.c_str()), color_penalty); else tip->addText(msg->get("Requires %s %d", power_cells[slot_num].requires_primary[i], PRIMARY_STATS[i].name.c_str())); } } // Draw required Level Tooltip if ((power_cells[slot_num].requires_level > 0) && stats->level < power_cells[slot_num].requires_level) { tip->addColoredText(msg->get("Requires Level %d", power_cells[slot_num].requires_level), color_penalty); } else if ((power_cells[slot_num].requires_level > 0) && stats->level >= power_cells[slot_num].requires_level) { tip->addText(msg->get("Requires Level %d", power_cells[slot_num].requires_level)); } for (size_t j=0; j < power_cells[slot_num].requires_power.size(); ++j) { if (power_cells[slot_num].requires_power[j] == 0) continue; int req_index = getCellByPowerIndex(power_cells[slot_num].requires_power[j], power_cell_all); if (req_index == -1) continue; std::string req_power_name; if (power_cell_all[req_index].upgrade_level > 0) req_power_name = powers->powers[power_cell_all[req_index].id].name + " (" + msg->get("Level %d", power_cell_all[req_index].upgrade_level) + ")"; else req_power_name = powers->powers[power_cell_all[req_index].id].name; // Required Power Tooltip int req_cell_index = getCellByPowerIndex(power_cells[slot_num].requires_power[j], power_cell_all); if (!checkUnlocked(req_cell_index)) { tip->addColoredText(msg->get("Requires Power: %s", req_power_name), color_penalty); } else { tip->addText(msg->get("Requires Power: %s", req_power_name)); } } // Draw unlock power Tooltip if (power_cells[slot_num].requires_point && !(std::find(stats->powers_list.begin(), stats->powers_list.end(), power_cells[slot_num].id) != stats->powers_list.end())) { int unlock_id = getCellByPowerIndex(power_cells[slot_num].id, power_cell_all); if (show_unlock_prompt && points_left > 0 && checkUnlock(unlock_id)) { tip->addColoredText(msg->get("Click to Unlock (uses 1 Skill Point)"), color_bonus); } else { if (power_cells[slot_num].requires_point && points_left < 1) tip->addColoredText(msg->get("Requires 1 Skill Point"), color_penalty); else tip->addText(msg->get("Requires 1 Skill Point")); } } }
void EventPerkDeedImplementation::fillAttributeList(AttributeListMessage* alm, CreatureObject* object) { DeedImplementation::fillAttributeList(alm, object); alm->insertAttribute("duration", getDurationString()); // Duration }