From 76ac1d4c92ccfca3dd3d4a6c2d4f34cdb7dd184d Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Thu, 29 Oct 2026 10:47:33 +0000 Subject: [PATCH] Decompile 3 functions in Source/Contents/Effects/EffectLists.cpp, Source/Contents/Effects/Effect.cpp, ... Batch #2114 by ragnarok-clanker: 0 byte-identical, 3 confirmed by peer review. - fn_18774 EffectLists::Spawn: logic confirmed by peer review - fn_18991 CEffect::SetActor: logic confirmed by peer review - fn_18992 CEffect::SetSourceActor: logic confirmed by peer review Reviewed-by: ragnarok-clanker --- Source/Contents/Effects/Effect.cpp | 18 +++++ Source/Contents/Effects/Effect.h | 2 + Source/Contents/Effects/EffectLists.cpp | 100 ++++++++++++++++++++++++ Source/Contents/Effects/EffectLists.h | 2 + 4 files changed, 122 insertions(+) diff --git a/Source/Contents/Effects/Effect.cpp b/Source/Contents/Effects/Effect.cpp index 887cfadd..8b94b34f 100644 --- a/Source/Contents/Effects/Effect.cpp +++ b/Source/Contents/Effects/Effect.cpp @@ -1,5 +1,6 @@ #include "Contents/Effects/Effect.h" +#include "Contents/Actors/RenderObject.h" #include "Contents/Effects/EffectLists.h" #include "Contents/World/WorldScene.h" @@ -59,6 +60,23 @@ void CEffect::SetEventFrame(int kind, int frame) { } } +// OFFSET: 0x00B4E390 +// FUNCTION: fn_18991 +void CEffect::SetActor(std::uint32_t aid) { + this->actor = aid; +} + +// OFFSET: 0x00B4E3A0 +// FUNCTION: fn_18992 +void CEffect::SetSourceActor(std::uint32_t aid) { + if (CRenderObject* source = FindRenderObject(aid)) { + this->sourceActor = aid; + this->sourcePosition[0] = source->render.position.x; + this->sourcePosition[1] = source->render.position.y; + this->sourcePosition[2] = source->render.position.z; + } +} + // OFFSET: 0x00B249A0 // FUNCTION: fn_18773 void EffectRetirement::Clear() { diff --git a/Source/Contents/Effects/Effect.h b/Source/Contents/Effects/Effect.h index 870d969e..9f3edad4 100644 --- a/Source/Contents/Effects/Effect.h +++ b/Source/Contents/Effects/Effect.h @@ -54,6 +54,8 @@ public: virtual void Slot32(); virtual bool Slot33(); void AddEvent(int kind, const char* text, int frame, int argument); + void SetActor(std::uint32_t aid); + void SetSourceActor(std::uint32_t aid); void SetEventFrame(int kind, int frame); bool RetireIfInactive(); diff --git a/Source/Contents/Effects/EffectLists.cpp b/Source/Contents/Effects/EffectLists.cpp index 00b44583..9d1a1e1b 100644 --- a/Source/Contents/Effects/EffectLists.cpp +++ b/Source/Contents/Effects/EffectLists.cpp @@ -121,6 +121,106 @@ void EffectLists::Add(int actor, CEffect* effect) { } } +// OFFSET: 0x00B24A50 +// FUNCTION: fn_18774 +CEffect* EffectLists::Spawn(int actor, int id, float x, float y, float z, std::uint32_t sourceActor, int frame, unsigned char reuse, int instance) { + CEffect* effect = nullptr; + + if (id < 0 || id > 60000) { + switch (id) { + case EF_READYPORTAL: + case EF_PORTAL: + case EF_LOCKON: + case EF_BOTTOM: + case EF_BOTTOM2: + case EF_FIREPILLARON: + case EF_REFINEOK: + case EF_REFINEFAIL: + case EF_TOPRANK: + case EF_PARTY: + case EF_STATUS_STATE: + case EF_TALK_FROSTJOKE: + case EF_TALK_SCREAM: + case EF_BLIND: + case EF_ANGEL2: + case EF_MINI_TETRIS: + case EF_ANGEL: + case EF_REFLECTBODY: + case EF_ASURABODY: + case EF_QUAKEBODY: + case EF_JUMPBODY: + case EF_LANDBODY: + case EF_TAE_READY: + case EF_DEVIL1: + case EF_DEVIL2: + case EF_DEVIL3: + case EF_DEVIL4: + case EF_DEVIL5: + case EF_DEVIL6: + case EF_DEVIL7: + case EF_DEVIL8: + case EF_DEVIL9: + case EF_DEVIL10: + case EF_BLUEBODY: + case EF_REDLIGHTBODY: + case EF_RED_HIT: + case EF_BLUE_HIT: + case EF_ANGEL3: + case EF_UNDEADBODY: + case EF_UNDEADBODY_DEL: + case EF_FIREPILLARON2: + case EF_JUMPBODY1: + case EF_UNK_1398: + break; + default: + return nullptr; + } + } else if (id == EF_LEVEL150 || id == EF_LEVEL150_SUB) { + if (this->Find(actor, EF_LEVEL99)) { + return nullptr; + } + } + + if (actor) { + effect = this->Find(actor, instance, id); + if (effect) { + if (instance > 0) { + return nullptr; + } + if (effect->retained || reuse) { + return effect; + } + } + } + + const auto allocator = this->allocators.find(id); + if (allocator == this->allocators.end()) { + return nullptr; + } + + effect = allocator->second->Create(); + if (effect) { + effect->SetActor(actor); + effect->SetSourceActor(sourceActor); + effect->position[0] = x; + effect->position[1] = y; + effect->position[2] = z; + effect->Slot29(id); + if (frame != -1) { + effect->unknown_00B0 = frame; + } + if (instance > 0) { + effect->unknown_00C4 = instance; + effect->retained = 1; + } + effect->Slot01(); + effect->Slot12(); + this->Add(actor, effect); + } + + return effect; +} + // OFFSET: 0x00B254C0 // FUNCTION: fn_18780 void EffectLists::Clear() { diff --git a/Source/Contents/Effects/EffectLists.h b/Source/Contents/Effects/EffectLists.h index 2ccebb44..8f171295 100644 --- a/Source/Contents/Effects/EffectLists.h +++ b/Source/Contents/Effects/EffectLists.h @@ -4,6 +4,7 @@ #include "Contents/Effects/Effect.h" #include +#include #include #include #include @@ -23,6 +24,7 @@ public: virtual ~EffectLists(); + CEffect* Spawn(int actor, int id, float x, float y, float z, std::uint32_t sourceActor, int frame, unsigned char reuse, int instance); CEffect* Find(int actor, int id) const; CEffect* Find(int actor, int instance, int id) const; CEffect* At(int id, unsigned index) const;