From 06c3b177b68fc1dbb4bd5bc1042d8cae96080b2b Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 30 Oct 2026 22:11:46 +0000 Subject: [PATCH] Decompile fn_21261 (CGameMode::DrawMiniMapNumber) Batch #6146 by superintelligence: 0 byte-identical, 1 confirmed by peer review. - fn_21261 CGameMode::DrawMiniMapNumber: logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker, eAthena, gordaoprogramas Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/CGameMode.h | 10 ++++- Source/Client/Mode/GameModeMiniMap.cpp | 60 ++++++++++++++++++++++++++ Source/UI/Buttons/UITextButton.h | 2 + 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/Source/Client/Mode/CGameMode.h b/Source/Client/Mode/CGameMode.h index 5d08099a..2de9868a 100644 --- a/Source/Client/Mode/CGameMode.h +++ b/Source/Client/Mode/CGameMode.h @@ -95,9 +95,14 @@ public: /* 03FC */ int unknown_03FC; /* 0400 */ int unknown_0400; /* 0404 */ int unknown_0404; - /* 0408 */ unsigned char unknown_0408[0x50]; + /* 0408 */ void* unknown_0408; + /* 040C */ unsigned char unknown_040C[0x08]; + /* 0414 */ int unknown_0414; + /* 0418 */ unsigned char unknown_0418[0x40]; /* 0458 */ int unknown_0458; - /* 045C */ unsigned char unknown_045C[0x80]; + /* 045C */ unsigned char unknown_045C[0x08]; + /* 0464 */ int unknown_0464; + /* 0468 */ unsigned char unknown_0468[0x74]; /* 04DC */ std::string unknown_04DC; /* 04F4 */ unsigned char unknown_04F4[0xD0]; /* 05C4 */ int unknown_05C4; @@ -183,6 +188,7 @@ public: bool LaunchTargetEffect(int effectId, CGameActor* source, CGameActor* target, int argument); void ShowGuildEmblem(CGameActor* actor, int guildId, int unused); void RemoveUnknown0604(int window); + void DrawMiniMapNumber(); CMsgEffect* SpawnCashEmotion(int aid, int packId, int emotionId, std::uint32_t duration); void ApplyMapFog(int enabled); void SpawnGrannyCorpse(float x, float y, float z, float angle, const char* name); diff --git a/Source/Client/Mode/GameModeMiniMap.cpp b/Source/Client/Mode/GameModeMiniMap.cpp index 82ea54c4..46587a75 100644 --- a/Source/Client/Mode/GameModeMiniMap.cpp +++ b/Source/Client/Mode/GameModeMiniMap.cpp @@ -12,6 +12,7 @@ #include "Resource/Sprites/ActionResource.h" #include "Resource/Sprites/SpriteResource.h" #include "Resource/World/TerrainResource.h" +#include "UI/Buttons/UITextButton.h" #include "UI/Window/UIWindow.h" #include "UI/Window/UIWindowMgr.h" #include "Utility/Math/AffineMatrix.h" @@ -383,3 +384,62 @@ void CGameMode::DrawMiniMapCoordinates() { DrawActionSprite(reinterpret_cast(*this), x, secondY, action, sprite, 0, digits[index], 1.0f, 0.0f, 0xFFFFFFFF, 0x201); } } + +// GLOBAL: gl_25044 +int g_minimapCoordinateValue; +// GLOBAL: gl_25045 +int g_minimapCoordinateDigits; +// GLOBAL: gl_25046 +int g_minimapCoordinateDigitValues[4]; +// GLOBAL: gl_24672 +int g_screenWidth; + + +// FUNCTION: fn_21261 +void CGameMode::DrawMiniMapNumber() { + if (this->unknown_0408 == nullptr || this->unknown_0414 == 0) { + return; + } + + if (this->unknown_0414 != g_minimapCoordinateValue) { + g_minimapCoordinateValue = this->unknown_0414; + int value; + int count; + if (this->unknown_0414 > 9999) { + value = 9999; + count = 4; + } else { + value = this->unknown_0414; + if (value < 0) { + value = 0; + } + count = 1; + if (value > 999) { + count = 4; + } else if (value > 99) { + count = 3; + } else if (value > 9) { + count = 2; + } + } + + g_minimapCoordinateDigits = count; + g_minimapCoordinateDigitValues[0] = value % 10; + g_minimapCoordinateDigitValues[1] = value / 10 % 10; + g_minimapCoordinateDigitValues[2] = value / 100 % 10; + g_minimapCoordinateDigitValues[3] = value / 1000 % 10; + } + + CActRes* action = static_cast(ResourceMgr::Instance().Load("이팩트\\숫자.act")); + CSprRes* sprite = static_cast(ResourceMgr::Instance().Load("이팩트\\숫자.spr")); + for (int index = 0; index < g_minimapCoordinateDigits; ++index) { + const int x = static_cast( + static_cast(g_screenWidth) + this->cursorOffsetX + 24.0f - static_cast(index * 16) + + static_cast(g_minimapCoordinateDigits * 16 - 16) + ); + const int y = static_cast(static_cast(g_screenHeight) + this->cursorOffsetY); + DrawActionSprite( + reinterpret_cast(*this), x, y, action, sprite, 0, g_minimapCoordinateDigitValues[index], 2.0f, 0.0f, 0xFAFFFFFF, 0x201 + ); + } +} diff --git a/Source/UI/Buttons/UITextButton.h b/Source/UI/Buttons/UITextButton.h index e36f8238..e2707c9d 100644 --- a/Source/UI/Buttons/UITextButton.h +++ b/Source/UI/Buttons/UITextButton.h @@ -7,6 +7,8 @@ #include #include +extern int g_screenHeight; + class UITextButton : public UIButton { friend class UITextViewer; friend class UIMessageBox;