From 2bf070d8cc807cf275b0ce1015fff4c545964ce6 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 6 Nov 2026 21:14:57 +0000 Subject: [PATCH] Decompile fn_22266 (CLoginMode::SubD8D500) Batch #13669 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_22266 CLoginMode::SubD8D500: logic confirmed by peer review Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/CLoginMode.h | 1 + Source/Client/Mode/LoginMode.cpp | 84 +++++++++++++++++------------- Source/Network/ClientKeepalive.cpp | 16 +++--- Source/Network/ClientKeepalive.h | 7 --- 4 files changed, 58 insertions(+), 50 deletions(-) diff --git a/Source/Client/Mode/CLoginMode.h b/Source/Client/Mode/CLoginMode.h index 466ffd915..a42f0693d 100644 --- a/Source/Client/Mode/CLoginMode.h +++ b/Source/Client/Mode/CLoginMode.h @@ -98,6 +98,7 @@ class CLoginMode : public CMode { public: CLoginMode(); void SubD97780(int value); + void SendKeepalive(); /* 0058 */ int charParams[6]; /* 0070 */ int unknown_0070; /* 0074 */ int unknown_0074; diff --git a/Source/Client/Mode/LoginMode.cpp b/Source/Client/Mode/LoginMode.cpp index c86975804..ec703a9cf 100644 --- a/Source/Client/Mode/LoginMode.cpp +++ b/Source/Client/Mode/LoginMode.cpp @@ -30,7 +30,6 @@ #include "Contents/Schedule/PartialShutDownSchedule.h" #include "Contents/Schedule/TimeScheduler.h" #include "Contents/Sound/SoundMgr.h" -#include "Network/ClientKeepalive.h" #include "Network/Connection/Connection.h" #include "Network/Packets/PacketLengths.h" #include "Render/DeviceContext/DCSurface.h" @@ -397,7 +396,6 @@ void CLoginMode::SubD8D4F0(int) { // FUNCTION: fn_22266 void CLoginMode::SubD8D500(const char* packet) { UIWindow* window = g_windowMgr.window_03D4; - int message; switch (*reinterpret_cast(packet + 2)) { case 0: g_windowMgr.Confirm(LookupMessage(0x4BE), 0, true, false, 0, "Message", 280, 120, 0); @@ -406,8 +404,10 @@ void CLoginMode::SubD8D500(const char* packet) { } return; case 1: - message = 0x4C2; - break; + if (g_windowMgr.Confirm(LookupMessage(0x4C2), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { + g_windowMgr.CloseWindow(0x80); + } + return; case 2: if (g_windowMgr.Confirm(LookupMessage(0x4C3), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { return; @@ -417,27 +417,46 @@ void CLoginMode::SubD8D500(const char* packet) { } return; case 3: - message = 0x4BF; - break; + if (g_windowMgr.Confirm(LookupMessage(0x4BF), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { + g_windowMgr.CloseWindow(0x80); + } + return; case 4: - message = 0x4C4; - goto retry; + if (g_windowMgr.Confirm(LookupMessage(0x4C4), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { + return; + } + if (window) { + window->SendMsg(nullptr, 6, 0x15F, 0, 0, 0); + } + return; case 5: - message = 0x7E6; - break; + if (g_windowMgr.Confirm(LookupMessage(0x7E6), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { + g_windowMgr.CloseWindow(0x80); + } + return; case 6: - message = 0x7E7; - break; + if (g_windowMgr.Confirm(LookupMessage(0x7E7), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { + g_windowMgr.CloseWindow(0x80); + } + return; case 7: - message = 0x7EB; - goto retry; + if (g_windowMgr.Confirm(LookupMessage(0x7EB), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { + return; + } + if (window) { + window->SendMsg(nullptr, 6, 0x15F, 0, 0, 0); + } + return; case 8: - message = 0x7EC; - goto retry; + if (g_windowMgr.Confirm(LookupMessage(0x7EC), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { + return; + } + if (window) { + window->SendMsg(nullptr, 6, 0x15F, 0, 0, 0); + } + return; case 9: - message = 0x7ED; - retry: - if (g_windowMgr.Confirm(LookupMessage(message), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { + if (g_windowMgr.Confirm(LookupMessage(0x7ED), 0, true, true, 0, "Message", 280, 120, 0) != 0xB8) { return; } if (window) { @@ -445,15 +464,13 @@ void CLoginMode::SubD8D500(const char* packet) { } return; case 10: - message = 0x7E8; - break; + if (g_windowMgr.Confirm(LookupMessage(0x7E8), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { + g_windowMgr.CloseWindow(0x80); + } + return; default: return; } - - if (g_windowMgr.Confirm(LookupMessage(message), 0, true, true, 0, "Message", 280, 120, 0) == 0xB8 && g_windowMgr.window_03DC) { - g_windowMgr.CloseWindow(0x80); - } } // OFFSET: 0x00D8E1D0 @@ -965,20 +982,15 @@ void CLoginMode::End() { // OFFSET: 0x00D975C0 // FUNCTION: fn_22301 void CLoginMode::Slot5(int value) { - if (value == 0) { - if (this->running == 0) { - return; - } - if (g_modalImmediate != 0) { - return; - } - } else { + if (value != 0) { GetRagConnection().UpdateStatus(); + } else if (this->running == 0 || g_modalImmediate != 0) { + return; } PumpApplicationMessages(); this->PollNetworkStatus(); - SendClientKeepalive(this->cursorType, this->unknown_6F10, GetRagConnection(), *reinterpret_cast(&GetRagConnection()), g_session.m_aid); + this->SendKeepalive(); g_mouse.Update(); g_windowMgr.ProcessMouse(); if (this->running != 0) { @@ -1121,7 +1133,7 @@ void CLoginMode::SubD97B20(int) { void CLoginMode::Update() { PumpApplicationMessages(); this->PollNetworkStatus(); - SendClientKeepalive(this->cursorType, this->unknown_6F10, GetRagConnection(), *reinterpret_cast(&GetRagConnection()), g_session.m_aid); + this->SendKeepalive(); g_mouse.Update(); g_windowMgr.ProcessMouse(); if (this->running != 0) { @@ -1928,7 +1940,7 @@ char g_loginFailCount; // OFFSET: 0x00D91790 // FUNCTION: fn_22289 void CLoginMode::ShowLoginError(int code, int argument) { - std::string message; + std::string message(""); if (code != 0x12) { GetRagConnection().Close(); } diff --git a/Source/Network/ClientKeepalive.cpp b/Source/Network/ClientKeepalive.cpp index 789fbba58..d30a4a4a7 100644 --- a/Source/Network/ClientKeepalive.cpp +++ b/Source/Network/ClientKeepalive.cpp @@ -1,4 +1,5 @@ -#include "Network/ClientKeepalive.h" +#include "Client/Mode/CLoginMode.h" +#include "Client/Session.h" #include "Network/Connection/Connection.h" #include "Network/Packets/PacketLengths.h" @@ -16,17 +17,18 @@ namespace { // OFFSET: 0x00D8D960 // FUNCTION: fn_22268 -void SendClientKeepalive(int subMode, std::uint32_t& nextPingTime, CConnection& connection, const PacketLengths& lengths, const std::uint32_t& accountId) { - if (subMode != 7 && subMode != 8 && subMode != 11 && subMode != 19) { +void CLoginMode::SendKeepalive() { + if (this->cursorType != 7 && this->cursorType != 8 && this->cursorType != 11 && this->cursorType != 19) { return; } - if (timeGetTime() > nextPingTime) { - nextPingTime = timeGetTime() + 12000; + if (timeGetTime() > this->unknown_6F10) { + this->unknown_6F10 = timeGetTime() + 12000; KeepalivePacket packet; packet.id = 0x0187; - packet.accountId = accountId; - connection.Send(lengths.FixedLength(packet.id), &packet); + packet.accountId = g_session.m_aid; + CRagConnection& connection = GetRagConnection(); + connection.Send(reinterpret_cast(&GetRagConnection())->FixedLength(packet.id), &packet); } } diff --git a/Source/Network/ClientKeepalive.h b/Source/Network/ClientKeepalive.h index c04ef8cbd..4bed01928 100644 --- a/Source/Network/ClientKeepalive.h +++ b/Source/Network/ClientKeepalive.h @@ -1,11 +1,4 @@ #ifndef RAGNAROK_SOURCE_NETWORK_CLIENTKEEPALIVE_H #define RAGNAROK_SOURCE_NETWORK_CLIENTKEEPALIVE_H -#include - -class CConnection; -class PacketLengths; - -void SendClientKeepalive(int subMode, std::uint32_t& nextPingTime, CConnection& connection, const PacketLengths& lengths, const std::uint32_t& accountId); - #endif