From de1e07768d0f4650915bf00f29becd9acc2d881d Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sat, 31 Oct 2026 18:53:39 +0000 Subject: [PATCH] Decompile fn_21353 (CGameMode::sub_CEBBB0) Batch #8422 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_21353 CGameMode::sub_CEBBB0: logic confirmed by peer review Peer-reviewed-by: Yommy, Lumen, KWDev Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/CGameMode.h | 3 +- Source/Client/Mode/GameMode.cpp | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/Source/Client/Mode/CGameMode.h b/Source/Client/Mode/CGameMode.h index 00d576612..8ebfd82eb 100644 --- a/Source/Client/Mode/CGameMode.h +++ b/Source/Client/Mode/CGameMode.h @@ -165,7 +165,7 @@ public: void sub_CFE480(int actorId); void NotifyUnknown0604(int value); void UpdatePetFriendlyWindow(int previousFriendly); - bool SaveEmblemFile(const std::vector& data); + __declspec(noinline) bool SaveEmblemFile(const std::vector& data); void SendNpcInputText(std::uint32_t npcId, const char* text, const char* replacement, int unused); std::string HuntTargetText(const RenewQuestOngoingInfo& quest, int index); std::vector SaveActiveSkillEffects(); @@ -438,6 +438,7 @@ public: void AddUnknown0604(UIWindow* window); void RequestAdminStatus(); void sub_CEB8E0(); + unsigned sub_CEBBB0(const std::vector& data); unsigned sub_CEBF30(const std::vector& data); unsigned sub_CEC100(const std::vector& data); unsigned sub_CEC6A0(const std::vector& data); diff --git a/Source/Client/Mode/GameMode.cpp b/Source/Client/Mode/GameMode.cpp index 0bd995541..3417fe3b3 100644 --- a/Source/Client/Mode/GameMode.cpp +++ b/Source/Client/Mode/GameMode.cpp @@ -1692,3 +1692,63 @@ std::vector CGameMode::WriteReplaySkillState() { } return output; } + +// OFFSET: 0x00CEBBB0 +// FUNCTION: fn_21353 +unsigned CGameMode::sub_CEBBB0(const std::vector& data) { + if (data.empty()) { + return 0xFFFFFFFFu; + } + + GameModeChunkHeader header = {}; + std::vector record; + unsigned offset = 6; + std::uint32_t guildId = 0; + header = *reinterpret_cast(data.data()); + if (header.type == 13000) { + while (offset < data.size()) { + header = {}; + header = *reinterpret_cast(data.data() + offset); + offset += 6; + + if (static_cast(header.size) > 0) { + record.resize(header.size); + } + + switch (header.type) { + case 13001: + goto finished; + case 13002: + std::memcpy(record.data(), data.data() + offset, header.size); + offset += header.size; + this->SaveEmblemFile(record); + break; + case 13003: + std::memcpy(record.data(), data.data() + offset, header.size); + offset += header.size; + this->nameCard.Load(reinterpret_cast&>(record)); + break; + case 13004: + std::memcpy(&guildId, data.data() + offset, header.size); + offset += header.size; + break; + case 13005: { + int emblemVersion = 0; + std::memcpy(&emblemVersion, data.data() + offset, header.size); + offset += header.size; + this->scene->player->Slot49(guildId, emblemVersion); + g_guildId = guildId; + break; + } + default: + offset += header.size; + break; + } + } + } else { + offset = 0xFFFFFFFFu; + } + +finished: + return offset; +}