From 98b925a90c8193a7b1ff6da15d92cf4b8846aabe Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 30 Oct 2026 05:47:08 +0000 Subject: [PATCH] Decompile 2 functions in Source/Contents/Effects/SpriteEffect.cpp, Source/Contents/Effects/SpriteEffect.h, ... Batch #4657 by Lumen: 0 byte-identical, 2 confirmed by peer review. - fn_19199 CSpriteEffect::Slot06: logic confirmed by peer review - fn_19200 CSpriteEffect::Slot03: logic confirmed by peer review Peer-reviewed-by: eAthena, alisonrag, Qwenkler3.8, gordaoprogramas, youko Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Contents/Actors/GameActor.h | 1 + Source/Contents/Effects/SpriteEffect.cpp | 222 +++++++++++++++++++++++ Source/Contents/Effects/SpriteEffect.h | 2 + 3 files changed, 225 insertions(+) diff --git a/Source/Contents/Actors/GameActor.h b/Source/Contents/Actors/GameActor.h index 12f4cdb3..12136587 100644 --- a/Source/Contents/Actors/GameActor.h +++ b/Source/Contents/Actors/GameActor.h @@ -238,6 +238,7 @@ public: int WeaponActionBase(int weaponType); int GetUnknown0404(); int MountHeightOffset(); + float sub_CAD4B0(); void ResetState(); void UpdateMotionFrame(); void ProcessHitMessage(CGameObject* sender, const ActorHitInfo* info, int unused1, int unused2); diff --git a/Source/Contents/Effects/SpriteEffect.cpp b/Source/Contents/Effects/SpriteEffect.cpp index b9a2750b..f926dcd5 100644 --- a/Source/Contents/Effects/SpriteEffect.cpp +++ b/Source/Contents/Effects/SpriteEffect.cpp @@ -1,7 +1,12 @@ #include "Contents/Effects/SpriteEffect.h" +#include "Client/Mode/CGameMode.h" +#include "Client/Mode/ModeMgr.h" +#include "Client/Session.h" +#include "Contents/Actors/GameActor.h" #include "Contents/Effects/EffectMemoryMgr.h" #include "Contents/Effects/SpriteParticle.h" +#include "Contents/World/World.h" #include "Utility/Cipher/XorBytes.h" #include @@ -378,3 +383,220 @@ void CSpriteEffect::Slot04() { } } } + +// OFFSET: 0x00B79520 +// FUNCTION: fn_19199 +bool CSpriteEffect::Slot06() { + switch (this->id) { + case 0x3DE: + return !this->IsFinished(); + case 0x4A8: { + if (this->actor == 0) { + return false; + } + + if (!g_modeMgr.GetGameMode()) { + return false; + } + + CWorld* scene = static_cast(g_modeMgr.GetGameMode())->scene; + if (!scene) { + return false; + } + + if (!scene->GetItemByAID(this->actor)) { + return false; + } + + return true; + } + case 0x46A: + case 0x47F: + case 0x480: + case 0x481: + case 0x482: + case 0x483: + case 0x484: + case 0x485: + case 0x486: + case 0x487: + case 0x488: + case 0x4BB: + case 0x4BC: + case 0x4BD: + case 0x561: + case 0x58B: + case 0x651: + case 0x652: + case 0x653: + case 0x95A: + case 0x978: + case 0x97C: + case 0x97D: + case 0x97E: + case 0x97F: + case 0x98B: + case 0x99A: + return this->ActorExists(); + } + + for (CSpriteParticle* particle : this->particles) { + if (particle->life == 0.0f) { + return true; + } + + if (particle->life * 60.0f > static_cast(particle->unknown_00E8)) { + return true; + } + } + + return false; +} + +// OFFSET: 0x00B79780 +// FUNCTION: fn_19200 +void CSpriteEffect::Slot03() { + for (CSpriteParticle* particle : this->particles) { + ++particle->unknown_00E8; + + switch (this->id) { + case 0x46A: { + int height = 8; + if (CGameActor* actor = static_cast(FindRenderObject(this->actor))) { + height = static_cast(actor->sub_CAD4B0() + 8.0f); + } + + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - static_cast(height); + particle->position.z = this->position[2]; + break; + } + case 0x47B: + case 0x4A8: + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - 10.0f; + particle->position.z = this->position[2]; + break; + case 0x47F: + case 0x480: + case 0x481: + case 0x482: + case 0x483: + case 0x484: + case 0x485: + case 0x486: + case 0x487: + case 0x488: { + int height = 25; + if (CGameActor* actor = static_cast(FindRenderObject(this->actor))) { + height = static_cast(actor->sub_CAD4B0() + 25.0f); + } + + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - static_cast(height); + particle->position.z = this->position[2]; + break; + } + case 0x4BB: + case 0x4BC: + case 0x4BD: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const int height = static_cast(actor->sub_CAD4B0() + 8.0f); + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - static_cast(height); + particle->position.z = this->position[2]; + break; + } + case 0x561: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const int height = static_cast(actor->sub_CAD4B0() + 3.0f); + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - static_cast(height); + particle->position.z = this->position[2]; + break; + } + case 0x95A: + case 0x978: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const int height = static_cast(actor->sub_CAD4B0()); + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - static_cast(height); + particle->position.z = this->position[2]; + break; + } + case 0x97C: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const float height = actor->sub_CAD4B0(); + const float offset = g_session.IsDoramJob(actor->GetEffectiveJob(-1)) ? height + 13.7f : height + 17.0f; + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - offset; + particle->position.z = this->position[2]; + break; + } + case 0x97D: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const float offset = g_session.IsDoramJob(actor->GetEffectiveJob(-1)) ? 2.2f : 0.4f; + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - offset; + particle->position.z = this->position[2]; + break; + } + case 0x97E: + case 0x97F: { + CGameActor* actor = static_cast(FindRenderObject(this->actor)); + if (!actor) { + break; + } + + const float height = actor->sub_CAD4B0(); + particle->position.x = this->position[0]; + particle->position.y = this->position[1] - height; + particle->position.z = this->position[2]; + break; + } + case 0x98B: + particle->unknown_02BC = 1; + particle->unknown_02BD = 1; + particle->unknown_02C4 = 0.0f; + particle->unknown_02C0 = 0.0f; + particle->position.x = this->position[0]; + particle->position.y = this->position[1]; + particle->position.z = this->position[2]; + break; + case 0x99A: + particle->unknown_02BC = 1; + particle->unknown_02BD = 1; + particle->unknown_02C4 = -105.0f; + particle->unknown_02C0 = 0.0f; + particle->position.x = this->position[0]; + particle->position.y = this->position[1]; + particle->position.z = this->position[2]; + break; + default: + particle->position.x = this->position[0]; + particle->position.y = this->position[1]; + particle->position.z = this->position[2]; + break; + } + } +} diff --git a/Source/Contents/Effects/SpriteEffect.h b/Source/Contents/Effects/SpriteEffect.h index 3e5f1d91..a006dd8b 100644 --- a/Source/Contents/Effects/SpriteEffect.h +++ b/Source/Contents/Effects/SpriteEffect.h @@ -13,8 +13,10 @@ public: CSpriteEffect(); void Slot01() override; + void Slot03() override; void Slot04() override; void Close() override; + bool Slot06() override; void SetupParticle(CSpriteParticle* particle);