Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend/StarItemTooltip.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/frontend/StarItemTooltip.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/frontend/StarItemTooltip.cpp')
-rw-r--r--source/frontend/StarItemTooltip.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/source/frontend/StarItemTooltip.cpp b/source/frontend/StarItemTooltip.cpp
new file mode 100644
index 0000000..9138349
--- /dev/null
+++ b/source/frontend/StarItemTooltip.cpp
@@ -0,0 +1,221 @@
+#include "StarItemTooltip.hpp"
+#include "StarGuiReader.hpp"
+#include "StarPane.hpp"
+#include "StarListWidget.hpp"
+#include "StarLabelWidget.hpp"
+#include "StarRoot.hpp"
+#include "StarStoredFunctions.hpp"
+#include "StarObjectItem.hpp"
+#include "StarImageWidget.hpp"
+#include "StarItemSlotWidget.hpp"
+#include "StarPreviewableItem.hpp"
+#include "StarFireableItem.hpp"
+#include "StarStatusEffectItem.hpp"
+#include "StarObject.hpp"
+#include "StarLogging.hpp"
+#include "StarAssets.hpp"
+#include "StarObjectDatabase.hpp"
+#include "StarStatusEffectDatabase.hpp"
+#include "StarJsonExtra.hpp"
+
+namespace Star {
+
+PanePtr ItemTooltipBuilder::buildItemTooltip(ItemPtr const& item, PlayerPtr const& viewer) {
+ if (!item) {
+ return {};
+ } else {
+ PanePtr tooltip = make_shared<Pane>();
+ tooltip->removeAllChildren();
+
+ String title;
+ String subTitle;
+
+ String tooltipKind = item->tooltipKind();
+
+ if (tooltipKind.empty())
+ tooltipKind = "base";
+ if (!tooltipKind.endsWith(".tooltip"))
+ tooltipKind = "/interface/tooltips/" + tooltipKind + ".tooltip";
+
+ buildItemDescriptionInner(tooltip, item, tooltipKind, title, subTitle, viewer);
+
+ auto titleIcon = make_shared<ItemSlotWidget>(item, "/interface/inventory/portrait.png");
+ titleIcon->setBackingImageAffinity(true, true);
+ titleIcon->showRarity(false);
+ tooltip->setTitle(titleIcon, title, subTitle);
+
+ return tooltip;
+ }
+}
+
+void ItemTooltipBuilder::buildItemDescription(WidgetPtr const& container, ItemPtr const& item) {
+ String tooltipKind = item->tooltipKind();
+
+ if (tooltipKind.empty())
+ tooltipKind = "base";
+ if (!tooltipKind.endsWith(".itemdescription"))
+ tooltipKind = "/interface/itemdescriptions/" + tooltipKind + ".itemdescription";
+
+ String title;
+ String subTitle;
+ buildItemDescriptionInner(container, item, tooltipKind, title, subTitle);
+}
+
+String categoryDisplayName(String const& category) {
+ Json categories = Root::singleton().assets()->json("/items/categories.config:labels");
+ return categories.getString(category, category);
+}
+
+void ItemTooltipBuilder::buildItemDescriptionInner(
+ WidgetPtr const& container, ItemPtr const& item, String const& tooltipKind, String& title, String& subTitle, PlayerPtr const& viewer) {
+ GuiReader reader;
+ auto& root = Root::singleton();
+
+ title = item->friendlyName();
+ subTitle = categoryDisplayName(item->category());
+ String description = item->description();
+
+ reader.construct(root.assets()->json(tooltipKind), container.get());
+
+ if (container->containsChild("icon"))
+ container->fetchChild<ItemSlotWidget>("icon")->setItem(item);
+
+ container->setLabel("nameLabel", item->name());
+ container->setLabel("countLabel", strf("%s", item->count()));
+
+ container->setLabel("rarityLabel", RarityNames.getRight(item->rarity()).titleCase());
+
+ if (item->twoHanded())
+ container->setLabel("handednessLabel", "2-Handed");
+ else
+ container->setLabel("handednessLabel", "1-Handed");
+
+ container->setLabel("countLabel", strf("%s", item->instanceValue("fuelAmount", 0).toUInt() * item->count()));
+ container->setLabel("priceLabel", strf("%s", (int)item->price()));
+
+ if (auto objectItem = as<ObjectItem>(item)) {
+ try {
+ auto object = Root::singleton().objectDatabase()->createObject(objectItem->objectName(), objectItem->objectParameters());
+
+ if (container->containsChild("objectImage")) {
+ auto drawables = object->cursorHintDrawables();
+ container->fetchChild<ImageWidget>("objectImage")->setDrawables(drawables);
+ }
+
+ if (objectItem->tooltipKind() == "container")
+ container->setLabel("slotCountLabel", strf("Holds %s Items", objectItem->instanceValue("slotCount")));
+
+ title = object->shortDescription();
+ subTitle = categoryDisplayName(object->category());
+ description = object->description();
+ } catch (StarException const& e) {
+ Logger::error("Failed to instantiate object for object item tooltip. %s", outputException(e, false));
+ }
+ } else {
+ if (container->containsChild("objectImage")) {
+ if (auto previewable = as<PreviewableItem>(item)) {
+ container->fetchChild<ImageWidget>("objectImage")->setDrawables(previewable->preview(viewer));
+ } else {
+ auto drawables = item->iconDrawables();
+ container->fetchChild<ImageWidget>("objectImage")->setDrawables(drawables);
+ }
+ }
+ }
+
+ auto tooltipFields = item->instanceValue("tooltipFields", JsonObject());
+ for (auto const& pair : tooltipFields.iterateObject()) {
+ if (pair.first.equalsIgnoreCase("subtitle"))
+ subTitle = pair.second.toString();
+ if (pair.first.endsWith("Label"))
+ container->setLabel(pair.first, pair.second.type() == Json::Type::String ? pair.second.toString() : toString(pair.second));
+ if (pair.first.endsWith("Image") && container->containsChild(pair.first)) {
+ if (pair.second.isType(Json::Type::String))
+ container->fetchChild<ImageWidget>(pair.first)->setImage(pair.second.toString());
+ else
+ container->fetchChild<ImageWidget>(pair.first)->setDrawables(pair.second.toArray().transformed(construct<Drawable>()));
+ }
+ }
+
+ if (auto fireable = as<FireableItem>(item)) {
+ container->setLabel("cooldownTimeLabel", strf("%.2f", fireable->cooldownTime()));
+ container->setLabel("windupTimeLabel", strf("%.2f", fireable->windupTime()));
+ container->setLabel("speedLabel", strf("%.2f", 1.0f / (fireable->cooldownTime() + fireable->windupTime())));
+ }
+
+ if (container->containsChild("largeImage")) {
+ container->fetchChild<ImageWidget>("largeImage")->setImage(item->largeImage());
+ }
+
+ container->setLabel("descriptionLabel", description);
+ container->setLabel("friendlyNameLabel", title);
+
+ if (container->containsChild("statusList")) {
+ auto statusList = container->fetchChild<ListWidget>("statusList");
+ if (auto statusEffects = as<StatusEffectItem>(item)) {
+ for (auto effect : statusEffects->statusEffects())
+ describePersistentEffect(statusList, effect);
+ }
+ }
+
+ if (item->instanceValue("acceptsAugmentType", false)) {
+ if (auto augmentLabel = container->fetchChild<LabelWidget>("augmentNameLabel")) {
+ if (auto currentAugment = item->instanceValue("currentAugment")) {
+ container->setLabel("augmentNameLabel", currentAugment.getString("displayName", "???"));
+ if (auto augmentIcon = container->fetchChild<ImageWidget>("augmentIconImage"))
+ augmentIcon->setImage(currentAugment.getString("displayIcon", ""));
+ augmentLabel->setColor(Color::White);
+ } else {
+ container->setLabel("augmentNameLabel", "NO AUGMENT INSERTED");
+ if (auto augmentIcon = container->fetchChild<ImageWidget>("augmentIconImage"))
+ augmentIcon->setImage("");
+ augmentLabel->setColor(Color::Gray);
+ }
+ }
+ }
+
+ container->setLabel("title", title);
+ container->setLabel("subTitle", subTitle);
+ if (container->containsChild("titleIcon")) {
+ auto titleIcon = container->fetchChild<ItemSlotWidget>("titleIcon");
+ titleIcon->setItem(item);
+ }
+}
+
+void ItemTooltipBuilder::describePersistentEffect(
+ ListWidgetPtr const& container, PersistentStatusEffect const& effect) {
+ if (auto uniqueStatusEffect = effect.ptr<UniqueStatusEffect>()) {
+ auto statusEffectDatabase = Root::singleton().statusEffectDatabase();
+ auto effectConfig = statusEffectDatabase->uniqueEffectConfig(*uniqueStatusEffect);
+ if (effectConfig.icon) {
+ auto listItem = container->addItem();
+ listItem->setLabel("statusLabel", effectConfig.label);
+ listItem->fetchChild<ImageWidget>("statusImage")->setImage(*effectConfig.icon);
+ }
+ } else if (auto modifierEffect = effect.ptr<StatModifier>()) {
+ auto statsConfig = Root::singleton().assets()->json("/interface/stats/stats.config");
+ if (auto baseMultiplier = modifierEffect->ptr<StatBaseMultiplier>()) {
+ if (statsConfig.contains(baseMultiplier->statName)) {
+ auto listItem = container->addItem();
+ listItem->fetchChild<ImageWidget>("statusImage")
+ ->setImage(statsConfig.get(baseMultiplier->statName).getString("icon"));
+ listItem->setLabel("statusLabel", strf("%s%%", (baseMultiplier->baseMultiplier - 1) * 100));
+ }
+ } else if (auto valueModifier = modifierEffect->ptr<StatValueModifier>()) {
+ if (statsConfig.contains(valueModifier->statName)) {
+ auto listItem = container->addItem();
+ listItem->fetchChild<ImageWidget>("statusImage")
+ ->setImage(statsConfig.get(valueModifier->statName).getString("icon"));
+ listItem->setLabel("statusLabel", strf("%s%s", valueModifier->value < 0 ? "-" : "", valueModifier->value));
+ }
+ } else if (auto effectiveMultiplier = modifierEffect->ptr<StatEffectiveMultiplier>()) {
+ if (statsConfig.contains(effectiveMultiplier->statName)) {
+ auto listItem = container->addItem();
+ listItem->fetchChild<ImageWidget>("statusImage")
+ ->setImage(statsConfig.get(effectiveMultiplier->statName).getString("icon"));
+ listItem->setLabel("statusLabel", strf("%s%%", (effectiveMultiplier->effectiveMultiplier - 1) * 100));
+ }
+ }
+ }
+}
+
+}