From b5567b362fe560b24a859715243851929bf26726 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 12 Mar 2026 08:10:17 -0700 Subject: [PATCH] feat: add colored gold/silver/copper text in vendor, trainer, and mail windows --- src/ui/game_screen.cpp | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 1db48391..8853a7b5 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -71,6 +71,23 @@ namespace { return s; } + // Render gold/silver/copper amounts in WoW-canonical colors on the current ImGui line. + // Skips zero-value denominations (except copper, which is always shown when gold=silver=0). + void renderCoinsText(uint32_t g, uint32_t s, uint32_t c) { + bool any = false; + if (g > 0) { + ImGui::TextColored(ImVec4(1.00f, 0.82f, 0.00f, 1.0f), "%ug", g); + any = true; + } + if (s > 0 || g > 0) { + if (any) ImGui::SameLine(0, 3); + ImGui::TextColored(ImVec4(0.80f, 0.80f, 0.80f, 1.0f), "%us", s); + any = true; + } + if (any) ImGui::SameLine(0, 3); + ImGui::TextColored(ImVec4(0.72f, 0.45f, 0.20f, 1.0f), "%uc", c); + } + bool isPortBotTarget(const std::string& target) { std::string t = toLower(trim(target)); return t == "portbot" || t == "gmbot" || t == "telebot"; @@ -10701,7 +10718,8 @@ void GameScreen::renderVendorWindow(game::GameHandler& gameHandler) { uint32_t mg = static_cast(money / 10000); uint32_t ms = static_cast((money / 100) % 100); uint32_t mc = static_cast(money % 100); - ImGui::Text("Your money: %ug %us %uc", mg, ms, mc); + ImGui::TextDisabled("Your money:"); ImGui::SameLine(0, 4); + renderCoinsText(mg, ms, mc); if (vendor.canRepair) { ImGui::SameLine(); @@ -10911,9 +10929,11 @@ void GameScreen::renderVendorWindow(game::GameHandler& gameHandler) { uint32_t s = (item.buyPrice / 100) % 100; uint32_t c = item.buyPrice % 100; bool canAfford = money >= item.buyPrice; - if (!canAfford) ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.3f, 0.3f, 1.0f)); - ImGui::Text("%ug %us %uc", g, s, c); - if (!canAfford) ImGui::PopStyleColor(); + if (canAfford) { + renderCoinsText(g, s, c); + } else { + ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "%ug %us %uc", g, s, c); + } } ImGui::TableSetColumnIndex(3); @@ -10991,7 +11011,8 @@ void GameScreen::renderTrainerWindow(game::GameHandler& gameHandler) { uint32_t mg = static_cast(money / 10000); uint32_t ms = static_cast((money / 100) % 100); uint32_t mc = static_cast(money % 100); - ImGui::Text("Your money: %ug %us %uc", mg, ms, mc); + ImGui::TextDisabled("Your money:"); ImGui::SameLine(0, 4); + renderCoinsText(mg, ms, mc); // Filter controls static bool showUnavailable = false; @@ -11146,8 +11167,11 @@ void GameScreen::renderTrainerWindow(game::GameHandler& gameHandler) { uint32_t s = (spell->spellCost / 100) % 100; uint32_t c = spell->spellCost % 100; bool canAfford = money >= spell->spellCost; - ImVec4 costColor = canAfford ? color : ImVec4(1.0f, 0.3f, 0.3f, 1.0f); - ImGui::TextColored(costColor, "%ug %us %uc", g, s, c); + if (canAfford) { + renderCoinsText(g, s, c); + } else { + ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "%ug %us %uc", g, s, c); + } } else { ImGui::TextColored(color, "Free"); } @@ -14300,7 +14324,8 @@ void GameScreen::renderMailWindow(game::GameHandler& gameHandler) { uint32_t mg = static_cast(money / 10000); uint32_t ms = static_cast((money / 100) % 100); uint32_t mc = static_cast(money % 100); - ImGui::Text("Your money: %ug %us %uc", mg, ms, mc); + ImGui::TextDisabled("Your money:"); ImGui::SameLine(0, 4); + renderCoinsText(mg, ms, mc); ImGui::SameLine(ImGui::GetWindowWidth() - 100); if (ImGui::Button("Compose")) { mailRecipientBuffer_[0] = '\0';