From 9af125e254c0064a69848e251c183f5aa49f6095 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sun, 1 Nov 2026 01:25:41 +0000 Subject: [PATCH] Decompile fn_21257 (CGameMode::RefreshMiniMapTooltips) Batch #9098 by Bielhp: 0 byte-identical, 1 confirmed by peer review. - fn_21257 CGameMode::RefreshMiniMapTooltips: logic confirmed by peer review Peer-reviewed-by: Lumen, KWDev, pedrao Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/CGameMode.h | 1 + Source/Client/Mode/GameModeMiniMap.cpp | 91 ++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/Source/Client/Mode/CGameMode.h b/Source/Client/Mode/CGameMode.h index 880214cf..169c0259 100644 --- a/Source/Client/Mode/CGameMode.h +++ b/Source/Client/Mode/CGameMode.h @@ -456,6 +456,7 @@ public: const TextureRegion& view, int x, int y, int size, std::string texture, int kind, std::uint32_t color, bool clamp ); void DrawMiniMapCoordinates(); + void RefreshMiniMapTooltips(); void ReceiveGradeEnchantInfo(const unsigned char* packet); void ReceivePartyItemPickup(const unsigned char* packet); void ReceiveItemDisappear(std::uint32_t itemAid); diff --git a/Source/Client/Mode/GameModeMiniMap.cpp b/Source/Client/Mode/GameModeMiniMap.cpp index abf3a71b..3e8ca05c 100644 --- a/Source/Client/Mode/GameModeMiniMap.cpp +++ b/Source/Client/Mode/GameModeMiniMap.cpp @@ -797,3 +797,94 @@ void CGameMode::DrawTimeAttackCountdown(std::uint32_t value, int mode) { ); } } + +// GLOBAL: gl_25101 +int g_miniMapTooltipId = -1; +// STRING: st_16849 +char g_miniMapTooltipText[256]; + +// OFFSET: 0x00CD1690 +// FUNCTION: fn_21257 +void CGameMode::RefreshMiniMapTooltips() { + int& tooltipId = *reinterpret_cast(&this->unknown_0418[0x04]); + std::string& tooltipText = *reinterpret_cast(&this->unknown_0418[0x08]); + std::map& tooltipWindows = *reinterpret_cast*>(&this->unknown_05D4[0x08]); + + if (tooltipId == -1) { + if (tooltipWindows.size() == 0) { + return; + } + + if (tooltipText.size() == 0) { + for (auto it = tooltipWindows.begin(); it != tooltipWindows.end(); ++it) { + g_windowMgr.CloseWindow(it->first); + } + tooltipWindows.clear(); + } else { + for (auto it = tooltipWindows.begin(); it != tooltipWindows.end(); ++it) { + if (it->second == tooltipText) { + g_windowMgr.CloseWindow(it->first); + tooltipWindows.erase(it); + return; + } + } + } + return; + } + + if (tooltipId == g_miniMapTooltipId && std::strcmp(g_miniMapTooltipText, tooltipText.c_str()) == 0) { + return; + } + + g_miniMapTooltipId = tooltipId; + std::sprintf(g_miniMapTooltipText, tooltipText.c_str()); + if (tooltipText.size() == 0) { + return; + } + + UIWindow* window = nullptr; + for (int windowId = 216; windowId < 225; ++windowId) { + if (tooltipWindows.find(windowId) == tooltipWindows.end()) { + window = g_windowMgr.EnsureWindow(windowId); + tooltipWindows.insert(std::make_pair(windowId, tooltipText)); + break; + } + } + + int x; + int y = 0; + switch (tooltipId) { + case 10: + g_windowMgr.CycleWindowVisibilityTwice(); + window->SendMsg(nullptr, 0x4E, reinterpret_cast(tooltipText.c_str()), 0, 0, 0); + window->SendMsg(nullptr, 0x22, 10, 0, 0, 0); + x = g_renderer->viewport.centerX - window->geometry.width / 2; + y = g_renderer->viewport.centerY - window->geometry.height / 2; + break; + case 12: + window->SendMsg(nullptr, 0x4E, reinterpret_cast(tooltipText.c_str()), 0, 0, 0); + x = 0; + y = g_renderer->viewport.height - window->geometry.height; + break; + case 13: + window->SendMsg(nullptr, 0x4E, reinterpret_cast(tooltipText.c_str()), 0, 0, 0); + x = g_renderer->viewport.centerX - window->geometry.width / 2; + y = g_renderer->viewport.height - window->geometry.height; + break; + case 14: + window->SendMsg(nullptr, 0x4E, reinterpret_cast(tooltipText.c_str()), 0, 0, 0); + x = g_renderer->viewport.width - window->geometry.width; + y = g_renderer->viewport.height - window->geometry.height; + break; + case -1: + case 11: + g_windowMgr.RestoreHiddenWindows(); + tooltipWindows.clear(); + tooltipId = -1; + default: + x = 160; + break; + } + + window->Move(x, y); +}