tweaks inventory screen display

This commit is contained in:
Mark Suckerberg
2025-12-30 17:44:12 -06:00
parent b5568d5493
commit 2d2faebd10
5 changed files with 130 additions and 57 deletions

View File

@@ -9,6 +9,31 @@ using namespace glm;
namespace game::window
{
Inventory::Inventory()
{
count = 0;
for (auto& [type, quantity] : values)
{
count += quantity;
}
}
void Inventory::adjust_item(Item::Type type, int quantity)
{
values[type] += quantity;
count += quantity;
}
void Inventory::set_item(Item::Type type, int value)
{
count -= values[type];
values[type] = value;
count += value;
}
int Inventory::get_item(Item::Type type) { return values.contains(type) ? values[type] : 0; }
void Inventory::update(Resources& resources, Character& character, GameData& gameData)
{
auto& texture = resources.anm2s[anm2::ITEMS].content.spritesheets.at(0).texture;
@@ -18,9 +43,11 @@ namespace game::window
auto cursorPos = ImGui::GetCursorPos();
auto cursorStartX = ImGui::GetCursorPosX();
for (auto& [type, quantity] : values)
for (int index = 0; index < Item::ITEM_COUNT; index++)
{
if (quantity == 0) continue;
if (index == Item::INVALID) continue;
auto type = (Item::Type)index;
auto columns = (int)(texture.size.x / ITEM_SIZE.x);
auto crop = vec2(type % columns, type / columns) * ITEM_SIZE;
@@ -30,13 +57,84 @@ namespace game::window
ImGui::PushID(type);
ImGui::SetCursorPos(cursorPos);
auto cursorScreenPos = ImGui::GetCursorScreenPos();
if (ImGui::ImageButton("##Image Button", texture.id, IMAGE_SIZE, imgui::to_imvec2(uvMin),
imgui::to_imvec2(uvMax)))
{
queuedItemType = type;
isQueued = true;
resources.sound_play(audio::SUMMON);
auto quantity = 0;
auto seen = values.contains(type);
if (seen)
{
quantity = values[type];
ImGui::BeginDisabled(quantity < 1);
if (ImGui::ImageButton("##Image Button", texture.id, IMAGE_SIZE, imgui::to_imvec2(uvMin),
imgui::to_imvec2(uvMax)) &&
quantity > 0)
{
queuedItemType = type;
isQueued = true;
resources.sound_play(audio::SUMMON);
}
ImGui::EndDisabled();
if (ImGui::BeginItemTooltip())
{
auto& category = Item::CATEGORIES[type];
auto& rarity = Item::RARITIES[type];
auto& flavor = Item::FLAVORS[type];
auto& calories = Item::CALORIES[type];
auto& digestionRateBonus = Item::DIGESTION_RATE_BONUSES[type];
auto& eatSpeedBonus = Item::EAT_SPEED_BONUSES[type];
ImGui::Text("%s (x%i)", Item::NAMES[type], quantity);
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(imgui::to_imvec4(GRAY)));
ImGui::Text("-- %s (%s) --", Item::CATEGORY_NAMES[category], Item::RARITY_NAMES[rarity]);
if (category == Item::FOOD)
{
ImGui::Separator();
if (flavor != Item::FLAVORLESS) ImGui::Text("Flavor: %s", Item::FLAVOR_NAMES[flavor]);
if (calories != 0) ImGui::Text("%0.0f kcal", calories);
if (digestionRateBonus > 0)
ImGui::Text("Digestion Rate Bonus: +%0.2f%% / sec", digestionRateBonus * 60.0f);
else if (digestionRateBonus < 0)
ImGui::Text("Digestion Rate Penalty: %0.2f%% / sec", digestionRateBonus * 60.0f);
if (eatSpeedBonus > 0) ImGui::Text("Eat Speed Bonus: +%0.2fx ", eatSpeedBonus);
}
ImGui::Separator();
ImGui::TextUnformatted(Item::DESCRIPTIONS[type]);
ImGui::PopStyleColor();
ImGui::EndTooltip();
}
ImGui::PushFont(resources.font.get(), Font::BIG);
auto text = std::format("x{}", quantity);
auto textPos = ImVec2(cursorScreenPos.x + IMAGE_SIZE.x - ImGui::CalcTextSize(text.c_str()).x,
cursorScreenPos.y + IMAGE_SIZE.y - ImGui::GetTextLineHeight());
ImGui::GetWindowDrawList()->AddText(textPos, ImGui::GetColorU32(ImGui::GetStyleColorVec4(ImGuiCol_Text)),
text.c_str());
ImGui::PopFont();
}
else
{
ImGui::BeginDisabled(true);
ImGui::ImageButton("##Image Button", texture.id, IMAGE_SIZE, imgui::to_imvec2(uvMin), imgui::to_imvec2(uvMax),
ImVec4(0, 0, 0, 0), ImVec4(0, 0, 0, 1));
ImGui::EndDisabled();
if (ImGui::BeginItemTooltip())
{
ImGui::TextUnformatted("??? (x0)");
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(imgui::to_imvec4(GRAY)));
ImGui::TextUnformatted("-- ??? (\?\?\?) --");
ImGui::Separator();
ImGui::TextUnformatted("???");
ImGui::PopStyleColor();
ImGui::EndTooltip();
}
}
auto increment = ImGui::GetItemRectSize().x + ImGui::GetStyle().ItemSpacing.x;
@@ -48,47 +146,10 @@ namespace game::window
cursorPos.y += increment;
}
if (ImGui::BeginItemTooltip())
{
auto& category = Item::CATEGORIES[type];
auto& rarity = Item::RARITIES[type];
auto& flavor = Item::FLAVORS[type];
auto& calories = Item::CALORIES[type];
auto& digestionRateBonus = Item::DIGESTION_RATE_BONUSES[type];
auto& eatSpeedBonus = Item::EAT_SPEED_BONUSES[type];
ImGui::Text("%s (x%i)", Item::NAMES[type], quantity);
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(imgui::to_imvec4(GRAY)));
ImGui::Text("-- %s (%s) --", Item::CATEGORY_NAMES[category], Item::RARITY_NAMES[rarity]);
if (category == Item::FOOD)
{
ImGui::Separator();
if (flavor != Item::FLAVORLESS) ImGui::Text("Flavor: %s", Item::FLAVOR_NAMES[flavor]);
if (calories != 0) ImGui::Text("%0.0f kcal", calories);
if (digestionRateBonus > 0)
ImGui::Text("Digestion Rate Bonus: +%0.2f%% / sec", digestionRateBonus * 60.0f);
else if (digestionRateBonus < 0)
ImGui::Text("Digestion Rate Penalty: %0.2f%% / sec", digestionRateBonus * 60.0f);
if (eatSpeedBonus > 0) ImGui::Text("Eat Speed Bonus: +%0.2fx ", eatSpeedBonus);
}
ImGui::Separator();
ImGui::TextUnformatted(Item::DESCRIPTIONS[type]);
ImGui::PopStyleColor();
ImGui::EndTooltip();
}
ImGui::PopID();
ImGui::PushFont(resources.font.get(), Font::BIG);
auto text = std::format("x{}", quantity);
auto textPos = ImVec2(cursorScreenPos.x + IMAGE_SIZE.x - ImGui::CalcTextSize(text.c_str()).x,
cursorScreenPos.y + IMAGE_SIZE.y - ImGui::GetTextLineHeight());
ImGui::GetWindowDrawList()->AddText(textPos, ImGui::GetColorU32(ImGui::GetStyleColorVec4(ImGuiCol_Text)),
text.c_str());
ImGui::PopFont();
}
if (values.empty()) ImGui::Text("Check the \"Play\" tab to earn rewards!");
if (count == 0) ImGui::Text("Check the \"Play\" tab to earn rewards!");
ImGui::PopStyleVar();
}