TooltipData ItemManager::getShortTooltip(ItemStack stack) { std::stringstream ss; TooltipData tip; if (stack.empty()) return tip; // name if (stack.quantity > 1) { ss << stack.quantity << " " << getItemName(stack.item); } else { ss << getItemName(stack.item); } tip.addColoredText(ss.str(), getItemColor(stack.item)); return tip; }
/** * Create detailed tooltip showing all relevant item info */ TooltipData ItemManager::getTooltip(ItemStack stack, StatBlock *stats, int context) { TooltipData tip; if (stack.empty()) return tip; Color color = getItemColor(stack.item); // name std::stringstream ss; if (stack.quantity == 1) ss << getItemName(stack.item); else ss << getItemName(stack.item) << " (" << stack.quantity << ")"; tip.addColoredText(ss.str(), color); // quest item if (items[stack.item].quest_item) { tip.addColoredText(msg->get("Quest Item"), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } // only show the name of the currency item if (stack.item == eset->misc.currency_id) return tip; // flavor text if (items[stack.item].flavor != "") { tip.addColoredText(Utils::substituteVarsInString(items[stack.item].flavor, pc), font->getColor(FontEngine::COLOR_ITEM_FLAVOR)); } // level if (items[stack.item].level != 0) { tip.addText(msg->get("Level %d", items[stack.item].level)); } // type if (items[stack.item].type != "") { tip.addText(msg->get(getItemType(items[stack.item].type))); } // item quality text for colorblind users if (settings->colorblind && items[stack.item].quality != "") { color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); for (size_t i=0; i<item_qualities.size(); ++i) { if (item_qualities[i].id == items[stack.item].quality) { tip.addColoredText(msg->get("Quality: %s", msg->get(item_qualities[i].name)), color); break; } } } // damage for (size_t i = 0; i < eset->damage_types.list.size(); ++i) { if (items[stack.item].dmg_max[i] > 0) { std::stringstream dmg_str; dmg_str << eset->damage_types.list[i].name; if (items[stack.item].dmg_min[i] < items[stack.item].dmg_max[i]) { dmg_str << ": " << items[stack.item].dmg_min[i] << "-" << items[stack.item].dmg_max[i]; tip.addText(dmg_str.str()); } else { dmg_str << ": " << items[stack.item].dmg_max[i]; tip.addText(dmg_str.str()); } } } // absorb if (items[stack.item].abs_max > 0) { if (items[stack.item].abs_min < items[stack.item].abs_max) tip.addText(msg->get("Absorb: %d-%d", items[stack.item].abs_min, items[stack.item].abs_max)); else tip.addText(msg->get("Absorb: %d", items[stack.item].abs_max)); } // bonuses unsigned bonus_counter = 0; while (bonus_counter < items[stack.item].bonus.size()) { ss.str(""); BonusData* bdata = &items[stack.item].bonus[bonus_counter]; if (bdata->is_speed || bdata->is_attack_speed) { if (bdata->value >= 100) color = font->getColor(FontEngine::COLOR_ITEM_BONUS); else color = font->getColor(FontEngine::COLOR_ITEM_PENALTY); } else { if (bdata->value > 0) color = font->getColor(FontEngine::COLOR_ITEM_BONUS); else color = font->getColor(FontEngine::COLOR_ITEM_PENALTY); } getBonusString(ss, bdata); tip.addColoredText(ss.str(), color); bonus_counter++; } // power if (items[stack.item].power_desc != "") { tip.addColoredText(items[stack.item].power_desc, font->getColor(FontEngine::COLOR_ITEM_BONUS)); } // level requirement if (items[stack.item].requires_level > 0) { if (stats->level < items[stack.item].requires_level) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires Level %d", items[stack.item].requires_level), color); } // base stat requirement for (unsigned i=0; i<items[stack.item].req_stat.size(); ++i) { if (items[stack.item].req_val[i] > 0) { if (stats->get_primary(items[stack.item].req_stat[i]) < items[stack.item].req_val[i]) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires %s %d", eset->primary_stats.list[items[stack.item].req_stat[i]].name, items[stack.item].req_val[i]), color); } } // requires class if (items[stack.item].requires_class != "") { if (items[stack.item].requires_class != stats->character_class) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires Class: %s", msg->get(items[stack.item].requires_class)), color); } // buy or sell price if (items[stack.item].getPrice() > 0 && stack.item != eset->misc.currency_id) { int price_per_unit; if (context == VENDOR_BUY) { price_per_unit = items[stack.item].getPrice(); if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); else tip.addColoredText(msg->get("Buy Price: %d %s each", price_per_unit, eset->loot.currency), color); } else if (context == VENDOR_SELL) { price_per_unit = items[stack.item].getSellPrice(stack.can_buyback); if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); else tip.addColoredText(msg->get("Buy Price: %d %s each", price_per_unit, eset->loot.currency), color); } else if (context == PLAYER_INV) { price_per_unit = items[stack.item].getSellPrice(DEFAULT_SELL_PRICE); if (price_per_unit == 0) price_per_unit = 1; if (items[stack.item].max_quantity <= 1) tip.addText(msg->get("Sell Price: %d %s", price_per_unit, eset->loot.currency)); else tip.addText(msg->get("Sell Price: %d %s each", price_per_unit, eset->loot.currency)); } } if (items[stack.item].set > 0) { // item set bonuses ItemSet set = item_sets[items[stack.item].set]; bonus_counter = 0; tip.addColoredText("\n" + msg->get("Set:") + ' ' + msg->get(item_sets[items[stack.item].set].name), set.color); while (bonus_counter < set.bonus.size()) { ss.str(""); SetBonusData* bdata = &set.bonus[bonus_counter]; ss << msg->get("%d items:", bdata->requirement) << ' '; getBonusString(ss, bdata); tip.addColoredText(ss.str(), set.color); bonus_counter++; } } // input hint for consumables/books // TODO hint when not using mouse control. The action for using an item there is hard to describe if (context == PLAYER_INV && !settings->no_mouse) { int power_id = items[stack.item].power; if (power_id > 0 && items[stack.item].type == "consumable") { tip.addColoredText('\n' + msg->get("Press [%s] to use", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } else if (!items[stack.item].book.empty()) { tip.addColoredText('\n' + msg->get("Press [%s] to read", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } } return tip; }