From d2fab322d2706c1fe22be9f592ed48d46468f5ce Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 30 Oct 2026 23:46:30 +0000 Subject: [PATCH] Decompile fn_17201 (UIWindowMgr::HasTitleAtActorCell) Batch #6220 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_17201 UIWindowMgr::HasTitleAtActorCell: logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker, alisonrag, System4z Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/UI/Chat/UIChatRoomTitle.h | 2 ++ Source/UI/Window/FrameFocus.cpp | 58 ++++++++++++++++++++++++++++++++ Source/UI/Window/UIWindowMgr.h | 1 + 3 files changed, 61 insertions(+) diff --git a/Source/UI/Chat/UIChatRoomTitle.h b/Source/UI/Chat/UIChatRoomTitle.h index f02d8d14..9767dabd 100644 --- a/Source/UI/Chat/UIChatRoomTitle.h +++ b/Source/UI/Chat/UIChatRoomTitle.h @@ -9,6 +9,8 @@ class UIStaticText; struct UIButtonContext; class UIChatRoomTitle : public UIWindow { + friend class UIWindowMgr; + public: explicit UIChatRoomTitle(UIWindowContext& context); void Slot15(int width, int height) override; diff --git a/Source/UI/Window/FrameFocus.cpp b/Source/UI/Window/FrameFocus.cpp index 57054241..5a163f9e 100644 --- a/Source/UI/Window/FrameFocus.cpp +++ b/Source/UI/Window/FrameFocus.cpp @@ -4,6 +4,14 @@ #include "UI/Party/UIMiniPartyWnd.h" #include #include "Client/Session.h" +#include "Client/Mode/CGameMode.h" +#include "Client/Mode/ModeMgr.h" +#include "Contents/Actors/RenderObject.h" +#include "Contents/World/World.h" +#include "Resource/World/TerrainResource.h" +#include "UI/Chat/UIChatRoomTitle.h" +#include "UI/Shop/UIMerchantShopTitle.h" +#include // STATIC: 0x014576A0 // GLOBAL: gl_24367 @@ -146,6 +154,56 @@ bool UIWindowMgr::HasPendingDialog() { this->unknown_01F4; } +// OFFSET: 0x00A97200 +// FUNCTION: fn_17201 +bool UIWindowMgr::HasTitleAtActorCell(std::uint32_t aid) { + CRenderObject* actor = static_cast(g_modeMgr.GetGameMode())->scene->GetGameActorByAidIncludeMe(aid); + if (actor == nullptr) { + return true; + } + + int titleColumn = 0; + int titleRow = 0; + int actorColumn = 0; + int actorRow = 0; + CWorld* world = static_cast(g_modeMgr.GetGameMode())->scene; + world->terrain->Grid().SpatialCell(actor->render.position.x, actor->render.position.z, actorColumn, actorRow); + for (std::list::iterator it = this->rendered.begin(); it != this->rendered.end(); ++it) { + UIWindow* window = *it; + CRenderObject* owner; + if (typeid(*window) == typeid(UIMerchantShopTitle)) { + owner = g_session.FindGameActor(static_cast(window)->ownerAid); + if (owner == nullptr) { + return true; + } + } else if (typeid(*window) == typeid(UIChatRoomTitle)) { + const int roomId = static_cast(window)->roomId; + if (roomId == 0) { + return true; + } + + const std::uint32_t ownerAid = static_cast(g_modeMgr.GetGameMode())->FindUnknown01AC(roomId); + if (ownerAid == 0) { + return true; + } + + owner = g_session.FindGameActor(ownerAid); + if (owner == nullptr) { + return true; + } + } else { + continue; + } + + world->terrain->Grid().SpatialCell(owner->render.position.x, owner->render.position.z, titleColumn, titleRow); + if (titleColumn == actorColumn && titleRow == actorRow) { + return true; + } + } + + return false; +} + // OFFSET: 0x00A97490 // FUNCTION: fn_17204 void UIWindowMgr::CancelActiveDialog() { diff --git a/Source/UI/Window/UIWindowMgr.h b/Source/UI/Window/UIWindowMgr.h index e092c7bb..aef24c0f 100644 --- a/Source/UI/Window/UIWindowMgr.h +++ b/Source/UI/Window/UIWindowMgr.h @@ -519,6 +519,7 @@ public: bool IsSharedWindowId(int id); bool HasNavigationBlocker(); bool HasPendingDialog(); + bool HasTitleAtActorCell(std::uint32_t aid); void CancelActiveDialog(); void CenterSurface0478(); std::vector SaveReplaySettings();