From d2db0b46ff46fe7c56b8a56bac8c773566a0746f Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 12 Mar 2026 14:15:45 -0700 Subject: [PATCH] feat: show quest giver ! and ? indicators in target frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reads QuestGiverStatus from the existing npcQuestStatus_ cache and displays a colored badge next to the target's name: ! (gold) — quest available ! (gray) — low-level quest available ? (gold) — quest ready to turn in ? (gray) — quest incomplete / in progress Matches the standard WoW quest indicator convention. --- src/ui/game_screen.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index feb0cee6..54b2c9fc 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -3315,6 +3315,29 @@ void GameScreen::renderTargetFrame(game::GameHandler& gameHandler) { ImVec2(ImGui::CalcTextSize(name.c_str()).x, 0)); ImGui::PopStyleColor(4); + // Quest giver indicator — "!" for available quests, "?" for completable quests + { + using QGS = game::QuestGiverStatus; + QGS qgs = gameHandler.getQuestGiverStatus(target->getGuid()); + if (qgs == QGS::AVAILABLE) { + ImGui::SameLine(0, 4); + ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.0f, 1.0f), "!"); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Has a quest available"); + } else if (qgs == QGS::AVAILABLE_LOW) { + ImGui::SameLine(0, 4); + ImGui::TextColored(ImVec4(0.6f, 0.6f, 0.6f, 1.0f), "!"); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Has a low-level quest available"); + } else if (qgs == QGS::REWARD || qgs == QGS::REWARD_REP) { + ImGui::SameLine(0, 4); + ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.0f, 1.0f), "?"); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Quest ready to turn in"); + } else if (qgs == QGS::INCOMPLETE) { + ImGui::SameLine(0, 4); + ImGui::TextColored(ImVec4(0.6f, 0.6f, 0.6f, 1.0f), "?"); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Quest incomplete"); + } + } + // Creature subtitle (e.g. "", "Captain of the Guard") if (target->getType() == game::ObjectType::UNIT) { auto unit = std::static_pointer_cast(target);