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
This commit is contained in:
parent
7f8b1faa57
commit
76ac1d4c92
4 changed files with 122 additions and 0 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include "Contents/Effects/Effect.h"
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue