From 35ee1c44835479cf7316663ba74d6d8d01413cb0 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 6 Nov 2026 03:09:25 +0000 Subject: [PATCH] Decompile fn_19198 (CSpriteEffect::SetupParticle) Batch #12921 by Yommy: 0 byte-identical, 1 confirmed by peer review. - fn_19198 CSpriteEffect::SetupParticle: logic confirmed by peer review Peer-reviewed-by: aDw, cremane, codeplay Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- .../Effects/CharacterParticleBundle.cpp | 4 +- Source/Contents/Effects/SpriteEffect.cpp | 68 ++++++++++--------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/Source/Contents/Effects/CharacterParticleBundle.cpp b/Source/Contents/Effects/CharacterParticleBundle.cpp index 2e286699..56811f69 100644 --- a/Source/Contents/Effects/CharacterParticleBundle.cpp +++ b/Source/Contents/Effects/CharacterParticleBundle.cpp @@ -24,7 +24,9 @@ namespace { template class EncryptedName { public: - explicit EncryptedName(const std::uint8_t (&source)[Length]) : m_encrypted(true) { + // INLINED + template + explicit EncryptedName(const Byte (&source)[Length]) : m_encrypted(true) { for (std::uint64_t index = 0; index < Length; ++index) { this->m_text[index] = source[index]; } diff --git a/Source/Contents/Effects/SpriteEffect.cpp b/Source/Contents/Effects/SpriteEffect.cpp index 9f788032..67e75c1a 100644 --- a/Source/Contents/Effects/SpriteEffect.cpp +++ b/Source/Contents/Effects/SpriteEffect.cpp @@ -16,7 +16,8 @@ namespace { template class EncryptedName { public: - explicit EncryptedName(const std::uint8_t (&source)[Length]) : m_encrypted(true) { + // INLINED + explicit EncryptedName(const char (&source)[Length]) : m_encrypted(true) { for (std::uint64_t index = 0; index < Length; ++index) { this->m_text[index] = source[index]; } @@ -42,6 +43,13 @@ private: bool m_encrypted; }; +// INLINED +template +const char* DecryptName(const char (&source)[Length]) { + thread_local EncryptedName name(source); + return name.Text(); +} + } // OFFSET: 0x00B78840 @@ -316,6 +324,20 @@ void CSpriteEffect::SetupParticle(CSpriteParticle* particle) { particle->depthOffset = 0.001f; particle->frameDelay = 4.0f; break; + case 0x97E: + particle->SetSprite("이팩트\\C_Guide_Of_Dead_Text\\C_Guide_Of_Dead_Text.spr"); + particle->SetAction("이팩트\\C_Guide_Of_Dead_Text\\C_Guide_Of_Dead_Text.act"); + particle->loopMode = 0; + particle->depthOffset = 0.001f; + particle->frameDelay = 12.0f; + break; + case 0x97F: + particle->SetSprite("이팩트\\C_Medjed_Text\\C_Medjed_Text.spr"); + particle->SetAction("이팩트\\C_Medjed_Text\\C_Medjed_Text.act"); + particle->loopMode = 0; + particle->depthOffset = 0.001f; + particle->frameDelay = 12.0f; + break; case 0x97C: particle->SetSprite("이팩트\\Atque_Poenitentia\\Atque_Poenitentia.spr"); particle->SetAction("이팩트\\Atque_Poenitentia\\Atque_Poenitentia.act"); @@ -332,36 +354,6 @@ void CSpriteEffect::SetupParticle(CSpriteParticle* particle) { particle->loopMode = 0; particle->flags = 1; break; - case 0x97E: - particle->SetSprite("이팩트\\C_Guide_Of_Dead_Text\\C_Guide_Of_Dead_Text.spr"); - particle->SetAction("이팩트\\C_Guide_Of_Dead_Text\\C_Guide_Of_Dead_Text.act"); - particle->loopMode = 0; - particle->depthOffset = 0.001f; - particle->frameDelay = 12.0f; - break; - case 0x97F: - particle->SetSprite("이팩트\\C_Medjed_Text\\C_Medjed_Text.spr"); - particle->SetAction("이팩트\\C_Medjed_Text\\C_Medjed_Text.act"); - particle->loopMode = 0; - particle->depthOffset = 0.001f; - particle->frameDelay = 12.0f; - break; - case 0x98B: { - const std::uint8_t spriteSource[] = {0x99, 0x4B, 0xC5, 0xAC, 0x93, 0x65, 0x7B, 0x98, 0x06, 0xB5, 0x33, 0x4F, 0x60, - 0x99, 0x48, 0xA8, 0x1F, 0xE2, 0x70, 0x09, 0x34, 0xE5, 0x54, 0xAB, 0x2B, 0x87}; - thread_local EncryptedName spriteName(spriteSource); - particle->SetSprite(spriteName.Text()); - - const std::uint8_t actionSource[] = {0x4D, 0x71, 0x7D, 0xB2, 0x71, 0x97, 0xE7, 0x12, 0xD2, 0x8F, 0x8B, 0x51, 0x82, - 0x6B, 0xD4, 0x22, 0xCB, 0xD8, 0xC8, 0x17, 0xD6, 0x17, 0xDA, 0x32, 0xF9, 0xBD}; - thread_local EncryptedName actionName(actionSource); - particle->SetAction(actionName.Text()); - particle->flags = 1; - particle->depthOffset = 0.0015f; - particle->loopMode = 0; - particle->frameDelay = 8.0f; - break; - } case 0x99A: particle->SetSprite("이팩트\\S_Beelzebub_Wing\\S_Beelzebub_Wing.spr"); particle->SetAction("이팩트\\S_Beelzebub_Wing\\S_Beelzebub_Wing.act"); @@ -370,6 +362,20 @@ void CSpriteEffect::SetupParticle(CSpriteParticle* particle) { particle->loopMode = 0; particle->frameDelay = 8.0f; break; + case 0x98B: { + const char spriteSource[] = {'\x99', '\x4B', '\xC5', '\xAC', '\x93', '\x65', '\x7B', '\x98', '\x06', '\xB5', '\x33', '\x4F', '\x60', + '\x99', '\x48', '\xA8', '\x1F', '\xE2', '\x70', '\x09', '\x34', '\xE5', '\x54', '\xAB', '\x2B', '\x87'}; + particle->SetSprite(DecryptName<0xDB27CB557D038759ULL>(spriteSource)); + + const char actionSource[] = {'\x4D', '\x71', '\x7D', '\xB2', '\x71', '\x97', '\xE7', '\x12', '\xD2', '\x8F', '\x8B', '\x51', '\x82', + '\x6B', '\xD4', '\x22', '\xCB', '\xD8', '\xC8', '\x17', '\xD6', '\x17', '\xDA', '\x32', '\xF9', '\xBD'}; + particle->SetAction(DecryptName<0x51BB39B763BBBD8DULL>(actionSource)); + particle->flags = 1; + particle->depthOffset = 0.0015f; + particle->loopMode = 0; + particle->frameDelay = 8.0f; + break; + } } }