inventory tweaks
This commit is contained in:
@@ -6,6 +6,9 @@ Interactive character simulation game.
|
|||||||
|
|
||||||
[Resources](https://shweetz.net/files/games/feed-snivy/resources.zip)
|
[Resources](https://shweetz.net/files/games/feed-snivy/resources.zip)
|
||||||
|
|
||||||
|
## Clarification
|
||||||
|
This application was developed with the assistance of a large language model.
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
After cloning and enter the repository's directory, make sure to initialize the submodules:
|
After cloning and enter the repository's directory, make sure to initialize the submodules:
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <format>
|
#include <format>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
|
#include <string_view>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
#include "../../../util/color.hpp"
|
#include "../../../util/color.hpp"
|
||||||
@@ -30,7 +31,9 @@ namespace game::state::play::menu
|
|||||||
|
|
||||||
void Inventory::update(Resources& resources, ItemManager& itemManager, entity::Character& character)
|
void Inventory::update(Resources& resources, ItemManager& itemManager, entity::Character& character)
|
||||||
{
|
{
|
||||||
static constexpr auto INFO_CHILD_HEIGHT_MULTIPLIER = 1.0f / 3.0f;
|
static constexpr auto INFO_CHILD_HEIGHT_MAX_MULTIPLIER = 0.5f;
|
||||||
|
bool isSelectedItemPressed{};
|
||||||
|
int pressedItemQuantity{-1};
|
||||||
|
|
||||||
auto& schema = character.data.itemSchema;
|
auto& schema = character.data.itemSchema;
|
||||||
auto& strings = character.data.strings;
|
auto& strings = character.data.strings;
|
||||||
@@ -51,17 +54,19 @@ namespace game::state::play::menu
|
|||||||
auto is_able_to_upgrade_get = [&](const resource::xml::Item::Entry& item, int quantity)
|
auto is_able_to_upgrade_get = [&](const resource::xml::Item::Entry& item, int quantity)
|
||||||
{ return is_possible_to_upgrade_get(item) && quantity >= *item.upgradeCount; };
|
{ return is_possible_to_upgrade_get(item) && quantity >= *item.upgradeCount; };
|
||||||
|
|
||||||
auto item_summary_draw = [&](const resource::xml::Item::Entry& item, int quantity)
|
auto item_header_draw = [&](const resource::xml::Item::Entry& item, int quantity)
|
||||||
|
{
|
||||||
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
|
ImGui::TextWrapped("%s (x%i)", item.name.c_str(), quantity);
|
||||||
|
ImGui::PopFont();
|
||||||
|
};
|
||||||
|
|
||||||
|
auto item_summary_draw = [&](const resource::xml::Item::Entry& item)
|
||||||
{
|
{
|
||||||
auto& category = schema.categories[item.categoryID];
|
auto& category = schema.categories[item.categoryID];
|
||||||
auto& rarity = schema.rarities[item.rarityID];
|
auto& rarity = schema.rarities[item.rarityID];
|
||||||
auto durability = item.durability.value_or(schema.durability);
|
auto durability = item.durability.value_or(schema.durability);
|
||||||
|
|
||||||
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
|
||||||
ImGui::TextWrapped("%s (x%i)", item.name.c_str(), quantity);
|
|
||||||
ImGui::PopFont();
|
|
||||||
|
|
||||||
ImGui::Separator();
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(imgui::to_imvec4(color::GRAY)));
|
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(imgui::to_imvec4(color::GRAY)));
|
||||||
ImGui::TextWrapped("-- %s (%s) --", category.name.c_str(), rarity.name.c_str());
|
ImGui::TextWrapped("-- %s (%s) --", category.name.c_str(), rarity.name.c_str());
|
||||||
if (item.flavorID.has_value())
|
if (item.flavorID.has_value())
|
||||||
@@ -92,23 +97,29 @@ namespace game::state::play::menu
|
|||||||
ImGui::TextWrapped(strings.get(Strings::InventoryUpgradePreviewFormat).c_str(), *item.upgradeCount,
|
ImGui::TextWrapped(strings.get(Strings::InventoryUpgradePreviewFormat).c_str(), *item.upgradeCount,
|
||||||
schema.idToStringMap.at(*item.upgradeID).c_str());
|
schema.idToStringMap.at(*item.upgradeID).c_str());
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
|
|
||||||
ImGui::Separator();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
auto item_details_draw = [&](const resource::xml::Item::Entry& item, int quantity)
|
auto info_section_separator_height_get = [&]()
|
||||||
{
|
{ return ImGui::GetStyle().ItemSpacing.y + 1.0f; };
|
||||||
item_summary_draw(item, quantity);
|
|
||||||
|
|
||||||
if (ImGui::BeginChild("##Info Description Child", ImGui::GetContentRegionAvail()))
|
auto info_section_separator_draw = [&]()
|
||||||
ImGui::TextWrapped("%s", item.description.c_str());
|
{
|
||||||
ImGui::EndChild();
|
auto separatorHeight = info_section_separator_height_get();
|
||||||
|
auto cursorScreenPos = ImGui::GetCursorScreenPos();
|
||||||
|
auto width = ImGui::GetContentRegionAvail().x;
|
||||||
|
auto y = cursorScreenPos.y + separatorHeight * 0.5f;
|
||||||
|
ImGui::GetWindowDrawList()->AddLine(ImVec2(cursorScreenPos.x, y), ImVec2(cursorScreenPos.x + width, y),
|
||||||
|
ImGui::GetColorU32(ImGuiCol_Separator));
|
||||||
|
ImGui::Dummy(ImVec2(0.0f, separatorHeight));
|
||||||
};
|
};
|
||||||
|
|
||||||
auto item_tooltip_draw = [&](const resource::xml::Item::Entry& item, int quantity)
|
auto item_tooltip_draw = [&](const resource::xml::Item::Entry& item, int quantity)
|
||||||
{
|
{
|
||||||
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 24.0f);
|
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 24.0f);
|
||||||
item_summary_draw(item, quantity);
|
item_header_draw(item, quantity);
|
||||||
|
ImGui::Separator();
|
||||||
|
item_summary_draw(item);
|
||||||
|
ImGui::Separator();
|
||||||
ImGui::TextWrapped("%s", item.description.c_str());
|
ImGui::TextWrapped("%s", item.description.c_str());
|
||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
};
|
};
|
||||||
@@ -122,6 +133,135 @@ namespace game::state::play::menu
|
|||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto wrapped_text_height_get = [](std::string_view text, float wrapWidth)
|
||||||
|
{
|
||||||
|
auto safeWrapWidth = std::max(1.0f, wrapWidth);
|
||||||
|
return ImGui::CalcTextSize(text.data(), text.data() + text.size(), false, safeWrapWidth).y;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto item_header_height_get = [&](const resource::xml::Item::Entry& item, int quantity, float width)
|
||||||
|
{
|
||||||
|
float height{};
|
||||||
|
|
||||||
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
|
height += wrapped_text_height_get(std::format("{} (x{})", item.name, quantity), width);
|
||||||
|
ImGui::PopFont();
|
||||||
|
|
||||||
|
return height;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto item_summary_height_get = [&](const resource::xml::Item::Entry& item, float width)
|
||||||
|
{
|
||||||
|
auto& category = schema.categories[item.categoryID];
|
||||||
|
auto& rarity = schema.rarities[item.rarityID];
|
||||||
|
auto durability = item.durability.value_or(schema.durability);
|
||||||
|
auto itemSpacing = ImGui::GetStyle().ItemSpacing.y;
|
||||||
|
float height{};
|
||||||
|
int lineCount{};
|
||||||
|
|
||||||
|
auto add_line_height = [&](std::string_view text)
|
||||||
|
{
|
||||||
|
if (lineCount > 0) height += itemSpacing;
|
||||||
|
height += wrapped_text_height_get(text, width);
|
||||||
|
lineCount++;
|
||||||
|
};
|
||||||
|
|
||||||
|
add_line_height(std::format("-- {} ({}) --", category.name, rarity.name));
|
||||||
|
if (item.flavorID.has_value())
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryFlavorFormat),
|
||||||
|
std::make_format_args(schema.flavors[*item.flavorID].name)));
|
||||||
|
if (item.calories.has_value())
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryCaloriesFormat), std::make_format_args(*item.calories)));
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryDurabilityFormat), std::make_format_args(durability)));
|
||||||
|
if (item.capacityBonus.has_value())
|
||||||
|
add_line_height(
|
||||||
|
std::vformat(strings.get(Strings::InventoryCapacityBonusFormat), std::make_format_args(*item.capacityBonus)));
|
||||||
|
if (item.digestionBonus.has_value())
|
||||||
|
{
|
||||||
|
if (*item.digestionBonus > 0)
|
||||||
|
{
|
||||||
|
auto digestionRateBonus = *item.digestionBonus * 60.0f;
|
||||||
|
add_line_height(
|
||||||
|
std::vformat(strings.get(Strings::InventoryDigestionRateBonusFormat), std::make_format_args(digestionRateBonus)));
|
||||||
|
}
|
||||||
|
else if (*item.digestionBonus < 0)
|
||||||
|
{
|
||||||
|
auto digestionRatePenalty = *item.digestionBonus * 60.0f;
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryDigestionRatePenaltyFormat),
|
||||||
|
std::make_format_args(digestionRatePenalty)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.eatSpeedBonus.has_value())
|
||||||
|
{
|
||||||
|
if (*item.eatSpeedBonus > 0)
|
||||||
|
add_line_height(
|
||||||
|
std::vformat(strings.get(Strings::InventoryEatSpeedBonusFormat), std::make_format_args(*item.eatSpeedBonus)));
|
||||||
|
else if (*item.eatSpeedBonus < 0)
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryEatSpeedPenaltyFormat),
|
||||||
|
std::make_format_args(*item.eatSpeedBonus)));
|
||||||
|
}
|
||||||
|
if (is_possible_to_upgrade_get(item))
|
||||||
|
add_line_height(std::vformat(strings.get(Strings::InventoryUpgradePreviewFormat),
|
||||||
|
std::make_format_args(*item.upgradeCount, schema.idToStringMap.at(*item.upgradeID))));
|
||||||
|
return height;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto item_details_height_get = [&](const resource::xml::Item::Entry& item, int quantity, float width)
|
||||||
|
{
|
||||||
|
auto separatorHeight = info_section_separator_height_get();
|
||||||
|
auto detailBodyHeight =
|
||||||
|
std::max(item_summary_height_get(item, width), wrapped_text_height_get(item.description, width));
|
||||||
|
return item_header_height_get(item, quantity, width) + separatorHeight + detailBodyHeight * 2.0f +
|
||||||
|
separatorHeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto item_unknown_height_get = [&](float width)
|
||||||
|
{
|
||||||
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
|
auto height = wrapped_text_height_get(strings.get(Strings::InventoryUnknown), width);
|
||||||
|
ImGui::PopFont();
|
||||||
|
return height;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto info_child_height_get = [&](ImVec2 available, bool isItemSelected, int selectedQuantity)
|
||||||
|
{
|
||||||
|
auto isInfoVisible = isItemSelected || count() == 0;
|
||||||
|
if (!isInfoVisible) return 0.0f;
|
||||||
|
|
||||||
|
auto infoWidth = std::max(1.0f, available.x - ImGui::GetStyle().WindowPadding.x * 2.0f);
|
||||||
|
auto infoPadding = ImGui::GetStyle().WindowPadding.y * 2.0f;
|
||||||
|
auto separatorHeight = info_section_separator_height_get();
|
||||||
|
auto measuredBodyHeight = 0.0f;
|
||||||
|
auto isSelectedItemKnown = isItemSelected && selectedQuantity > 0;
|
||||||
|
|
||||||
|
if (!isItemSelected)
|
||||||
|
{
|
||||||
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
|
measuredBodyHeight = wrapped_text_height_get(strings.get(Strings::InventoryEmptyHint), infoWidth);
|
||||||
|
ImGui::PopFont();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto& item = schema.items[selectedItemID];
|
||||||
|
measuredBodyHeight =
|
||||||
|
isSelectedItemKnown ? item_details_height_get(item, selectedQuantity, infoWidth) : item_unknown_height_get(infoWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto buttonChildHeight = 0.0f;
|
||||||
|
if (selectedQuantity > 0)
|
||||||
|
{
|
||||||
|
ImGui::PushFont(resources.font.get(), Font::HEADER_2);
|
||||||
|
auto buttonRowHeight = ImGui::GetFrameHeight();
|
||||||
|
buttonChildHeight = buttonRowHeight * 2.0f + ImGui::GetStyle().ItemSpacing.y * 5.0f;
|
||||||
|
ImGui::PopFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto desiredInfoChildHeight = infoPadding + separatorHeight + measuredBodyHeight + buttonChildHeight +
|
||||||
|
(buttonChildHeight > 0.0f ? separatorHeight : 0.0f);
|
||||||
|
auto maxInfoChildHeight = available.y * INFO_CHILD_HEIGHT_MAX_MULTIPLIER;
|
||||||
|
return glm::clamp(desiredInfoChildHeight, 0.0f, maxInfoChildHeight);
|
||||||
|
};
|
||||||
|
|
||||||
auto item_use = [&](int itemID)
|
auto item_use = [&](int itemID)
|
||||||
{
|
{
|
||||||
auto& item = schema.items[itemID];
|
auto& item = schema.items[itemID];
|
||||||
@@ -232,10 +372,10 @@ namespace game::state::play::menu
|
|||||||
auto available = ImGui::GetContentRegionAvail();
|
auto available = ImGui::GetContentRegionAvail();
|
||||||
auto isItemSelected = selectedItemID >= 0 && selectedItemID < (int)schema.items.size();
|
auto isItemSelected = selectedItemID >= 0 && selectedItemID < (int)schema.items.size();
|
||||||
auto isInfoVisible = isItemSelected || inventoryCount == 0;
|
auto isInfoVisible = isItemSelected || inventoryCount == 0;
|
||||||
auto infoChildHeight =
|
auto infoChildHeight = info_child_height_get(available, isItemSelected, isItemSelected ? quantity_get(selectedItemID) : 0);
|
||||||
isInfoVisible ? available.y * INFO_CHILD_HEIGHT_MULTIPLIER + ImGui::GetStyle().ItemSpacing.y * 2.0f : 0.0f;
|
|
||||||
auto inventoryChildHeight =
|
auto inventoryChildHeight =
|
||||||
isInfoVisible ? available.y - infoChildHeight - ImGui::GetStyle().ItemSpacing.y : available.y;
|
isInfoVisible ? std::max(0.0f, available.y - infoChildHeight - ImGui::GetStyle().ItemSpacing.y) : available.y;
|
||||||
auto childSize = ImVec2(available.x, inventoryChildHeight);
|
auto childSize = ImVec2(available.x, inventoryChildHeight);
|
||||||
auto infoChildSize = ImVec2(available.x, infoChildHeight);
|
auto infoChildSize = ImVec2(available.x, infoChildHeight);
|
||||||
|
|
||||||
@@ -277,9 +417,14 @@ namespace game::state::play::menu
|
|||||||
quantity <= 0 ? ImVec4(0, 0, 0, 0.5f) : ImVec4(1, 1, 1, 1)));
|
quantity <= 0 ? ImVec4(0, 0, 0, 0.5f) : ImVec4(1, 1, 1, 1)));
|
||||||
if (isSelected) ImGui::PopStyleColor(3);
|
if (isSelected) ImGui::PopStyleColor(3);
|
||||||
isAnyInventoryItemHovered = isAnyInventoryItemHovered || ImGui::IsItemHovered();
|
isAnyInventoryItemHovered = isAnyInventoryItemHovered || ImGui::IsItemHovered();
|
||||||
if (isPressed) selectedItemID = i;
|
if (isPressed)
|
||||||
|
{
|
||||||
|
isSelectedItemPressed = selectedItemID != i;
|
||||||
|
selectedItemID = i;
|
||||||
|
pressedItemQuantity = quantity;
|
||||||
|
}
|
||||||
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && quantity > 0) item_use(i);
|
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && quantity > 0) item_use(i);
|
||||||
if (ImGui::BeginItemTooltip())
|
if (!isSelected && ImGui::BeginItemTooltip())
|
||||||
{
|
{
|
||||||
if (quantity > 0)
|
if (quantity > 0)
|
||||||
item_tooltip_draw(item, quantity);
|
item_tooltip_draw(item, quantity);
|
||||||
@@ -316,52 +461,79 @@ namespace game::state::play::menu
|
|||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
|
||||||
isItemSelected = selectedItemID >= 0 && selectedItemID < (int)schema.items.size();
|
isItemSelected = selectedItemID >= 0 && selectedItemID < (int)schema.items.size();
|
||||||
auto selectedQuantity = isItemSelected ? quantity_get(selectedItemID) : 0;
|
isInfoVisible = isItemSelected || inventoryCount == 0;
|
||||||
|
auto selectedQuantity =
|
||||||
|
isItemSelected ? (isSelectedItemPressed && pressedItemQuantity >= 0 ? pressedItemQuantity : quantity_get(selectedItemID))
|
||||||
|
: 0;
|
||||||
|
infoChildHeight = info_child_height_get(available, isItemSelected, selectedQuantity);
|
||||||
|
infoChildSize = ImVec2(available.x, infoChildHeight);
|
||||||
auto isSelectedItemKnown = isItemSelected && selectedQuantity > 0;
|
auto isSelectedItemKnown = isItemSelected && selectedQuantity > 0;
|
||||||
auto selectedItemHasColor = isItemSelected && schema.items[selectedItemID].color.has_value();
|
auto selectedItemHasColor = isItemSelected && schema.items[selectedItemID].color.has_value();
|
||||||
|
|
||||||
if (isInfoVisible &&
|
if (isInfoVisible && ImGui::BeginChild("##Info Child", infoChildSize, ImGuiChildFlags_None,
|
||||||
ImGui::BeginChild("##Info Child", infoChildSize, ImGuiChildFlags_None, ImGuiWindowFlags_NoScrollbar))
|
ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse))
|
||||||
{
|
{
|
||||||
if (selectedItemHasColor) imgui::style::color_set(*schema.items[selectedItemID].color);
|
if (selectedItemHasColor) imgui::style::color_set(*schema.items[selectedItemID].color);
|
||||||
ImGui::Separator();
|
info_section_separator_draw();
|
||||||
auto isButtonChildVisible = selectedQuantity > 0;
|
auto isButtonChildVisible = selectedQuantity > 0;
|
||||||
ImGui::PushFont(resources.font.get(), Font::HEADER_2);
|
ImGui::PushFont(resources.font.get(), Font::HEADER_2);
|
||||||
auto buttonRowHeight = ImGui::GetFrameHeight();
|
auto buttonRowHeight = ImGui::GetFrameHeight();
|
||||||
auto buttonChildHeight =
|
auto buttonChildHeight =
|
||||||
isButtonChildVisible ? buttonRowHeight * 2.0f + ImGui::GetStyle().ItemSpacing.y * 5.0f : 0.0f;
|
isButtonChildVisible ? buttonRowHeight * 2.0f + ImGui::GetStyle().ItemSpacing.y * 5.0f : 0.0f;
|
||||||
auto buttonChildSize = ImVec2(ImGui::GetContentRegionAvail().x, buttonChildHeight);
|
|
||||||
auto infoBodySize =
|
|
||||||
ImVec2(ImGui::GetContentRegionAvail().x,
|
|
||||||
ImGui::GetContentRegionAvail().y - buttonChildSize.y -
|
|
||||||
(isButtonChildVisible ? ImGui::GetStyle().ItemSpacing.y : 0.0f));
|
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
auto separatorHeight = info_section_separator_height_get();
|
||||||
|
|
||||||
if (ImGui::BeginChild("##Info Content Child", infoBodySize))
|
|
||||||
{
|
|
||||||
if (!isItemSelected)
|
if (!isItemSelected)
|
||||||
{
|
{
|
||||||
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
ImGui::TextWrapped("%s", strings.get(Strings::InventoryEmptyHint).c_str());
|
ImGui::TextWrapped("%s", strings.get(Strings::InventoryEmptyHint).c_str());
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
else
|
else if (isSelectedItemKnown)
|
||||||
{
|
{
|
||||||
auto& item = schema.items[selectedItemID];
|
auto& selectedItem = schema.items[selectedItemID];
|
||||||
|
auto contentWidth = std::max(1.0f, ImGui::GetContentRegionAvail().x);
|
||||||
|
auto statsHeight = item_summary_height_get(selectedItem, contentWidth);
|
||||||
|
auto descriptionHeight = wrapped_text_height_get(selectedItem.description, contentWidth);
|
||||||
|
auto sharedDetailHeight = std::max(statsHeight, descriptionHeight);
|
||||||
|
auto headerHeight = item_header_height_get(selectedItem, selectedQuantity, contentWidth);
|
||||||
|
auto desiredInfoContentHeight =
|
||||||
|
headerHeight + separatorHeight + sharedDetailHeight * 2.0f + separatorHeight;
|
||||||
|
auto availableInfoContentHeight =
|
||||||
|
std::max(0.0f, ImGui::GetContentRegionAvail().y - (isButtonChildVisible ? separatorHeight + buttonChildHeight : 0.0f));
|
||||||
|
auto infoContentHeight = std::min(desiredInfoContentHeight, availableInfoContentHeight);
|
||||||
|
|
||||||
if (isSelectedItemKnown)
|
item_header_draw(selectedItem, selectedQuantity);
|
||||||
item_details_draw(item, selectedQuantity);
|
info_section_separator_draw();
|
||||||
else
|
|
||||||
item_unknown_draw();
|
auto detailChildHeight = sharedDetailHeight;
|
||||||
}
|
if (desiredInfoContentHeight > availableInfoContentHeight)
|
||||||
|
detailChildHeight = std::max(0.0f, (infoContentHeight - headerHeight - separatorHeight - separatorHeight) * 0.5f);
|
||||||
|
auto detailChildSize = ImVec2(ImGui::GetContentRegionAvail().x, detailChildHeight);
|
||||||
|
|
||||||
|
if (ImGui::BeginChild("##Info Stats Child", detailChildSize))
|
||||||
|
{
|
||||||
|
if (isSelectedItemPressed) ImGui::SetScrollY(0.0f);
|
||||||
|
item_summary_draw(selectedItem);
|
||||||
}
|
}
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
|
||||||
if (isButtonChildVisible &&
|
info_section_separator_draw();
|
||||||
ImGui::BeginChild("##Info Actions Child", buttonChildSize, ImGuiChildFlags_None,
|
|
||||||
ImGuiWindowFlags_NoScrollbar))
|
if (ImGui::BeginChild("##Info Description Child", detailChildSize))
|
||||||
|
{
|
||||||
|
if (isSelectedItemPressed) ImGui::SetScrollY(0.0f);
|
||||||
|
ImGui::TextWrapped("%s", selectedItem.description.c_str());
|
||||||
|
}
|
||||||
|
ImGui::EndChild();
|
||||||
|
|
||||||
|
if (isButtonChildVisible)
|
||||||
|
{
|
||||||
|
info_section_separator_draw();
|
||||||
|
|
||||||
|
if (ImGui::BeginChild("##Info Actions Child", ImVec2(ImGui::GetContentRegionAvail().x, buttonChildHeight),
|
||||||
|
ImGuiChildFlags_None, ImGuiWindowFlags_NoScrollbar))
|
||||||
{
|
{
|
||||||
auto& selectedItem = schema.items[selectedItemID];
|
|
||||||
auto canUseSelectedItem = true;
|
auto canUseSelectedItem = true;
|
||||||
auto canUpgradeSelectedItem = is_able_to_upgrade_get(selectedItem, selectedQuantity);
|
auto canUpgradeSelectedItem = is_able_to_upgrade_get(selectedItem, selectedQuantity);
|
||||||
auto rowTwoButtonSize = row_widget_size_get(2);
|
auto rowTwoButtonSize = row_widget_size_get(2);
|
||||||
@@ -374,8 +546,7 @@ namespace game::state::play::menu
|
|||||||
|
|
||||||
auto upgrade_tooltip_get = [&](bool isAll)
|
auto upgrade_tooltip_get = [&](bool isAll)
|
||||||
{
|
{
|
||||||
if (!is_possible_to_upgrade_get(selectedItem))
|
if (!is_possible_to_upgrade_get(selectedItem)) return strings.get(Strings::InventoryUpgradeNoPath);
|
||||||
return strings.get(Strings::InventoryUpgradeNoPath);
|
|
||||||
|
|
||||||
auto upgradeItemName = upgrade_item_name_get();
|
auto upgradeItemName = upgrade_item_name_get();
|
||||||
auto upgradeCount = *selectedItem.upgradeCount;
|
auto upgradeCount = *selectedItem.upgradeCount;
|
||||||
@@ -393,9 +564,6 @@ namespace game::state::play::menu
|
|||||||
std::make_format_args(upgradeCount, upgradedCount, upgradeItemName));
|
std::make_format_args(upgradeCount, upgradedCount, upgradeItemName));
|
||||||
};
|
};
|
||||||
|
|
||||||
ImGui::Separator();
|
|
||||||
ImGui::Dummy(ImVec2(0, ImGui::GetStyle().ItemSpacing.y));
|
|
||||||
|
|
||||||
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
ImGui::PushFont(ImGui::GetFont(), Font::HEADER_2);
|
||||||
|
|
||||||
ImGui::BeginDisabled(!canUseSelectedItem);
|
ImGui::BeginDisabled(!canUseSelectedItem);
|
||||||
@@ -405,8 +573,7 @@ namespace game::state::play::menu
|
|||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
ImGui::BeginDisabled(!canUpgradeSelectedItem);
|
ImGui::BeginDisabled(!canUpgradeSelectedItem);
|
||||||
if (WIDGET_FX(
|
if (WIDGET_FX(ImGui::Button(strings.get(Strings::InventoryUpgradeButton).c_str(), rowTwoButtonSize)))
|
||||||
ImGui::Button(strings.get(Strings::InventoryUpgradeButton).c_str(), rowTwoButtonSize)))
|
|
||||||
item_upgrade(selectedItemID, false);
|
item_upgrade(selectedItemID, false);
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
||||||
{
|
{
|
||||||
@@ -415,8 +582,7 @@ namespace game::state::play::menu
|
|||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (WIDGET_FX(ImGui::Button(strings.get(Strings::InventoryUpgradeAllButton).c_str(),
|
if (WIDGET_FX(ImGui::Button(strings.get(Strings::InventoryUpgradeAllButton).c_str(), rowTwoButtonSize)))
|
||||||
rowTwoButtonSize)))
|
|
||||||
item_upgrade(selectedItemID, true);
|
item_upgrade(selectedItemID, true);
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
||||||
{
|
{
|
||||||
@@ -428,7 +594,11 @@ namespace game::state::play::menu
|
|||||||
|
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
if (isButtonChildVisible) ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
item_unknown_draw();
|
||||||
if (selectedItemHasColor) style::color_set(resources, character);
|
if (selectedItemHasColor) style::color_set(resources, character);
|
||||||
}
|
}
|
||||||
if (isInfoVisible) ImGui::EndChild();
|
if (isInfoVisible) ImGui::EndChild();
|
||||||
|
|||||||
Reference in New Issue
Block a user