From 8368c61686aa6ab065a896e83d4eb8a1644aa2d1 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 30 Oct 2026 02:13:04 +0000 Subject: [PATCH] Decompile 4 functions in Source/Client/Mode/LoginMode.cpp, Source/Client/Mode/CLoginMode.h Batch #4302 by eAthena: 0 byte-identical, 4 confirmed by peer review. - fn_22277 CLoginMode::ReceiveCharacterResult: logic confirmed by peer review - fn_22281 CLoginMode::ReceiveDeleteCharacter: logic confirmed by peer review - fn_22282 CLoginMode::ReceiveDeleteCancel: logic confirmed by peer review - fn_22283 CLoginMode::ReceiveDeleteReservation: logic confirmed by peer review Peer-reviewed-by: KWDev, tayoba, Snow Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/CLoginMode.h | 14 ++- Source/Client/Mode/LoginMode.cpp | 179 +++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+), 2 deletions(-) diff --git a/Source/Client/Mode/CLoginMode.h b/Source/Client/Mode/CLoginMode.h index 4860bba5..444a8517 100644 --- a/Source/Client/Mode/CLoginMode.h +++ b/Source/Client/Mode/CLoginMode.h @@ -8,13 +8,18 @@ struct CharacterListPacket; struct CharacterSlotsPacket; +struct CharacterResultPacket; +struct CharacterDeletePacket; +struct WindowDialogs; #pragma pack(push, 1) struct CharacterInfo { /* 0000 */ std::uint32_t gid; /* 0004 */ unsigned char unknown_0004[0x86]; /* 008A */ unsigned char slot; - /* 008B */ unsigned char unknown_008B[0x24]; + /* 008B */ unsigned char unknown_008B[0x13]; + /* 009E */ std::int32_t deleteDate; + /* 00A2 */ unsigned char unknown_00A2[0x0D]; }; struct CharacterSlotExtension { @@ -33,7 +38,8 @@ public: /* 01D0 */ unsigned char unknown_01D0[0x8]; /* 01D8 */ int unknown_01D8; /* 01DC */ int unknown_01DC; - /* 01E0 */ unsigned char unknown_01E0[0x3E88]; + /* 01E0 */ bool characterDeleted; + /* 01E1 */ unsigned char unknown_01E1[0x3E87]; /* 4068 */ CharacterInfo characters[68]; /* 6EE4 */ unsigned char unknown_6EE4[0x18]; /* 6EFC */ CharacterSlotExtension slotExtension; @@ -43,8 +49,12 @@ public: int GetMaxCharacterSlot(); void ReceiveCharacterSlots(const CharacterSlotsPacket* packet); void SubD8EDC0(int); + void ReceiveCharacterResult(const CharacterResultPacket* packet, WindowDialogs& dialogs); void SubD8F560(int); void ReceiveCharacterList(const CharacterListPacket* packet); + void ReceiveDeleteCharacter(const CharacterDeletePacket* packet, WindowDialogs& dialogs); + void ReceiveDeleteCancel(const CharacterDeletePacket* packet, WindowDialogs& dialogs); + void ReceiveDeleteReservation(const CharacterDeletePacket* packet, WindowDialogs& dialogs); void SubD91780(int); }; diff --git a/Source/Client/Mode/LoginMode.cpp b/Source/Client/Mode/LoginMode.cpp index dc672a85..0fc0c8df 100644 --- a/Source/Client/Mode/LoginMode.cpp +++ b/Source/Client/Mode/LoginMode.cpp @@ -2,10 +2,15 @@ #include "Client/Session.h" #include "Contents/Configuration/ServiceConfiguration.h" #include "Contents/MessageTable.h" +#include "UI/Window/UIWindow.h" +#include "UI/Window/UIWindowMgr.h" +#include "UI/Window/WindowDialogs.h" #include #include #include +#include +#include #include #include @@ -21,6 +26,18 @@ struct CharacterSlotsPacket { /* 0009 */ CharacterSlotExtension extension; }; +struct CharacterResultPacket { + /* 0000 */ std::int16_t id; + /* 0002 */ std::int16_t result; +}; + +struct CharacterDeletePacket { + /* 0000 */ std::int16_t id; + /* 0002 */ std::uint32_t gid; + /* 0006 */ int result; + /* 000A */ int remaining; +}; + struct CharacterListPacket { /* 0000 */ std::int16_t id; /* 0002 */ std::uint16_t length; @@ -207,6 +224,52 @@ void CLoginMode::ReceiveCharacterSlots(const CharacterSlotsPacket* packet) { void CLoginMode::SubD8EDC0(int) { } +// OFFSET: 0x00D8EDD0 +// FUNCTION: fn_22277 +void CLoginMode::ReceiveCharacterResult(const CharacterResultPacket* packet, WindowDialogs& dialogs) { + UIWindow* window = g_windowMgr.window_03D4; + int message; + switch (packet->result) { + case 0: + dialogs.Confirm(LookupMessage(1214), 0, true, false, 0, "Message", 280, 120, 0); + if (window) { + window->SendMsg(nullptr, 6, 352, 0, 0, 0); + } + return; + case 1: + message = 1218; + break; + case 2: + message = 1219; + break; + case 3: + if (dialogs.Confirm(LookupMessage(1215), 0, true, true, 0, "Message", 280, 120, 0) == 184 && window) { + window->SendMsg(nullptr, 6, 351, 0, 0, 0); + } + return; + case 4: + if (dialogs.Confirm(LookupMessage(1220), 0, true, true, 0, "Message", 280, 120, 0) == 184 && window) { + window->SendMsg(nullptr, 6, 351, 0, 0, 0); + } + return; + case 5: + message = 2022; + break; + case 6: + message = 2023; + break; + case 10: + message = 2024; + break; + default: + return; + } + + if (dialogs.Confirm(LookupMessage(message), 0, true, true, 0, "Message", 280, 120, 0) == 184 && window) { + window->SendMsg(nullptr, 6, 185, 0, 0, 0); + } +} + // OFFSET: 0x00D8F560 // FUNCTION: fn_22279 void CLoginMode::SubD8F560(int) { @@ -221,6 +284,122 @@ void CLoginMode::ReceiveCharacterList(const CharacterListPacket* packet) { this->pendingCursorType = 7; } +// OFFSET: 0x00D8FA00 +// FUNCTION: fn_22281 +void CLoginMode::ReceiveDeleteCharacter(const CharacterDeletePacket* packet, WindowDialogs& dialogs) { + std::string message; + switch (packet->result) { + case 0: + message = LookupMessage(1816); + break; + case 1: + this->characterDeleted = true; + break; + case 2: + message = LookupMessage(1820); + break; + case 3: + message = LookupMessage(1817); + break; + case 4: + message = LookupMessage(1821); + break; + case 5: + message = LookupMessage(1822); + break; + case 6: + message = LookupMessage(2369); + break; + case 7: + message = LookupMessage(301); + break; + case 8: + message = LookupMessage(3044); + break; + default: + message = LookupMessage(1816); + break; + } + + if (!message.empty()) { + dialogs.Confirm(message.c_str(), 0, true, false, 0, "Message", 280, 120, 0); + } + if (this->characterDeleted != true) { + this->pendingCursorType = 7; + } +} + +// OFFSET: 0x00D8FC80 +// FUNCTION: fn_22282 +void CLoginMode::ReceiveDeleteCancel(const CharacterDeletePacket* packet, WindowDialogs& dialogs) { + std::string message; + if (packet->result == 0) { + message = LookupMessage(1816); + } else if (packet->result == 1) { + for (int i = 0; i < this->characterCount; ++i) { + if (this->characters[i].gid == packet->gid) { + this->characters[i].deleteDate = 0; + break; + } + } + this->pendingCursorType = 7; + } else if (packet->result == 2) { + message = LookupMessage(1817); + } else { + message = LookupMessage(1816); + } + + if (!message.empty()) { + dialogs.Confirm(message.c_str(), 0, true, false, 0, "Message", 280, 120, 0); + } +} + +// OFFSET: 0x00D8FE40 +// FUNCTION: fn_22283 +void CLoginMode::ReceiveDeleteReservation(const CharacterDeletePacket* packet, WindowDialogs& dialogs) { + std::string message; + switch (packet->result) { + case 0: + message = LookupMessage(1816); + break; + case 1: + for (int i = 0; i < this->characterCount; ++i) { + if (this->characters[i].gid == packet->gid) { + __time32_t now; + _time32(&now); + this->characters[i].deleteDate = packet->remaining + now; + break; + } + } + this->pendingCursorType = 7; + break; + case 2: + break; + case 3: + message = LookupMessage(1817); + break; + case 4: + message = LookupMessage(1818); + break; + case 5: + message = LookupMessage(1819); + break; + case 6: + message = LookupMessage(2981); + break; + case 7: + message = LookupMessage(3092); + break; + default: + message = LookupMessage(1816); + break; + } + + if (!message.empty()) { + dialogs.Confirm(message.c_str(), 0, true, false, 0, "Message", 280, 120, 0); + } +} + // OFFSET: 0x00D91780 // FUNCTION: fn_22288 void CLoginMode::SubD91780(int) {