Decompile 6 functions in Source/Contents/Effects/EffectLists.cpp, Source/Contents/Effects/EffectLists.h, ...
Batch #1818 by Yommy: 0 byte-identical, 6 confirmed by peer review. - fn_18772 EffectLists::RetireActor: logic confirmed by peer review - fn_18777 EffectLists::Retire: logic confirmed by peer review - fn_18778 EffectLists::Retire: logic confirmed by peer review - fn_18779 EffectLists::Retire: logic confirmed by peer review - fn_18780 EffectLists::Clear: logic confirmed by peer review - fn_18781 EffectLists::Release: logic confirmed by peer review Reviewed-by: ragnarok-clanker
This commit is contained in:
parent
e4647a1535
commit
6d568f53db
3 changed files with 62 additions and 40 deletions
|
|
@ -19,19 +19,23 @@ struct EffectEvent {
|
||||||
class CEffect {
|
class CEffect {
|
||||||
public:
|
public:
|
||||||
explicit CEffect(int id);
|
explicit CEffect(int id);
|
||||||
virtual ~CEffect();
|
|
||||||
virtual void Close();
|
|
||||||
virtual void Slot00(int argument);
|
virtual void Slot00(int argument);
|
||||||
virtual void Slot01();
|
virtual void Slot01();
|
||||||
|
virtual void Slot02() = 0;
|
||||||
|
virtual void Slot03() {}
|
||||||
virtual void Slot04();
|
virtual void Slot04();
|
||||||
|
virtual void Close();
|
||||||
|
virtual bool Slot06() = 0;
|
||||||
virtual void Slot07();
|
virtual void Slot07();
|
||||||
virtual void Slot08(int argument1, int argument2, int argument3);
|
virtual void Slot08(int argument1, int argument2, int argument3);
|
||||||
|
virtual void Slot09(int) {}
|
||||||
virtual void Slot10(int argument);
|
virtual void Slot10(int argument);
|
||||||
virtual void Slot11(std::string name);
|
virtual void Slot11(std::string name);
|
||||||
virtual void Slot12();
|
virtual void Slot12();
|
||||||
virtual void Slot13(int argument);
|
virtual void Slot13(int argument);
|
||||||
virtual void Slot14(int argument);
|
virtual void Slot14(int argument);
|
||||||
virtual void Slot15(int argument);
|
virtual void Slot15(int argument);
|
||||||
|
virtual void Slot16(int) {}
|
||||||
virtual void Slot17(int argument);
|
virtual void Slot17(int argument);
|
||||||
virtual void Slot18(int argument);
|
virtual void Slot18(int argument);
|
||||||
virtual void Slot19(int argument);
|
virtual void Slot19(int argument);
|
||||||
|
|
@ -44,7 +48,11 @@ public:
|
||||||
virtual void Slot26(int argument);
|
virtual void Slot26(int argument);
|
||||||
virtual void Slot27(int argument);
|
virtual void Slot27(int argument);
|
||||||
virtual int Slot28();
|
virtual int Slot28();
|
||||||
|
virtual void Slot29(int id) = 0;
|
||||||
|
virtual ~CEffect();
|
||||||
|
virtual void Slot31() {}
|
||||||
virtual void Slot32();
|
virtual void Slot32();
|
||||||
|
virtual bool Slot33() = 0;
|
||||||
void AddEvent(int kind, const char* text, int frame, int argument);
|
void AddEvent(int kind, const char* text, int frame, int argument);
|
||||||
void SetEventFrame(int kind, int frame);
|
void SetEventFrame(int kind, int frame);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,23 +33,14 @@ CEffect* EffectLists::Find(int actor, int instance, int id) const {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// INLINED
|
|
||||||
void EffectLists::RemoveActive(CEffect* effect) {
|
|
||||||
const auto found = this->active.find(static_cast<int>(effect->actor));
|
|
||||||
|
|
||||||
if (found != this->active.end()) {
|
|
||||||
found->second.remove(effect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OFFSET: 0x00B253A0
|
// OFFSET: 0x00B253A0
|
||||||
// FUNCTION: fn_18779
|
// FUNCTION: fn_18779
|
||||||
void EffectLists::Retire(CEffect* effect, unsigned char removeActive) {
|
void EffectLists::Retire(CEffect* effect, unsigned char removeActive) {
|
||||||
if (effect) {
|
if (effect) {
|
||||||
this->retirement.effects.push_back(effect);
|
this->retired.push_back(effect);
|
||||||
|
|
||||||
if (removeActive == 1) {
|
if (removeActive == 1 && this->active.find(static_cast<int>(effect->actor)) != this->active.end()) {
|
||||||
this->RemoveActive(effect);
|
this->active[static_cast<int>(effect->actor)].remove(effect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -58,8 +49,11 @@ void EffectLists::Retire(CEffect* effect, unsigned char removeActive) {
|
||||||
// FUNCTION: fn_18777
|
// FUNCTION: fn_18777
|
||||||
void EffectLists::Retire(int actor, int id) {
|
void EffectLists::Retire(int actor, int id) {
|
||||||
if (CEffect* effect = this->Find(actor, id)) {
|
if (CEffect* effect = this->Find(actor, id)) {
|
||||||
this->retirement.effects.push_back(effect);
|
this->retired.push_back(effect);
|
||||||
this->RemoveActive(effect);
|
|
||||||
|
if (this->active.find(static_cast<int>(effect->actor)) != this->active.end()) {
|
||||||
|
this->active[static_cast<int>(effect->actor)].remove(effect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,8 +62,11 @@ void EffectLists::Retire(int actor, int id) {
|
||||||
void EffectLists::Retire(int actor, int instance, int id) {
|
void EffectLists::Retire(int actor, int instance, int id) {
|
||||||
if (actor > 0 && instance > 0) {
|
if (actor > 0 && instance > 0) {
|
||||||
if (CEffect* effect = this->Find(actor, instance, id)) {
|
if (CEffect* effect = this->Find(actor, instance, id)) {
|
||||||
this->retirement.effects.push_back(effect);
|
this->retired.push_back(effect);
|
||||||
this->RemoveActive(effect);
|
|
||||||
|
if (this->active.find(static_cast<int>(effect->actor)) != this->active.end()) {
|
||||||
|
this->active[static_cast<int>(effect->actor)].remove(effect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -79,13 +76,15 @@ void EffectLists::Retire(int actor, int instance, int id) {
|
||||||
void EffectLists::RetireActor(int actor) {
|
void EffectLists::RetireActor(int actor) {
|
||||||
const auto found = this->active.find(actor);
|
const auto found = this->active.find(actor);
|
||||||
|
|
||||||
if (found != this->active.end()) {
|
if (found == this->active.end()) {
|
||||||
for (CEffect* effect : found->second) {
|
return;
|
||||||
this->retirement.effects.push_back(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
found->second.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto effect = found->second.begin(); effect != found->second.end(); ++effect) {
|
||||||
|
this->retired.push_back(*effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
found->second.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: 0x00B25830
|
// OFFSET: 0x00B25830
|
||||||
|
|
@ -120,21 +119,27 @@ void EffectLists::Add(int actor, CEffect* effect) {
|
||||||
// OFFSET: 0x00B254C0
|
// OFFSET: 0x00B254C0
|
||||||
// FUNCTION: fn_18780
|
// FUNCTION: fn_18780
|
||||||
void EffectLists::Clear() {
|
void EffectLists::Clear() {
|
||||||
for (auto& [actor, effects] : this->active) {
|
for (auto entry = this->active.begin(); entry != this->active.end(); ++entry) {
|
||||||
this->RetireActor(actor);
|
this->RetireActor(entry->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->active.clear();
|
this->active.clear();
|
||||||
this->RetireActor(0);
|
this->RetireActor(0);
|
||||||
this->indexed.clear();
|
this->indexed.clear();
|
||||||
this->retirement.Clear();
|
|
||||||
|
for (auto effect = this->retired.begin(); effect != this->retired.end(); ++effect) {
|
||||||
|
(*effect)->Close();
|
||||||
|
delete *effect;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->retired.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: 0x00B255B0
|
// OFFSET: 0x00B255B0
|
||||||
// FUNCTION: fn_18781
|
// FUNCTION: fn_18781
|
||||||
void EffectLists::Release() {
|
void EffectLists::Release() {
|
||||||
for (auto& [id, allocator] : this->allocators) {
|
for (auto entry = this->allocators.begin(); entry != this->allocators.end(); ++entry) {
|
||||||
delete allocator;
|
delete entry->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->allocators.clear();
|
this->allocators.clear();
|
||||||
|
|
|
||||||
|
|
@ -3,21 +3,25 @@
|
||||||
|
|
||||||
#include "Contents/Effects/Effect.h"
|
#include "Contents/Effects/Effect.h"
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
class EffectAllocator {
|
struct CAllocator {
|
||||||
public:
|
virtual ~CAllocator() = default;
|
||||||
virtual ~EffectAllocator() = default;
|
|
||||||
virtual CEffect* Create() = 0;
|
virtual CEffect* Create() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EffectLists {
|
class EffectLists {
|
||||||
std::map<int, std::list<CEffect*>>& active;
|
public:
|
||||||
EffectRetirement& retirement;
|
/* 0004 */ bool initialized;
|
||||||
std::map<int, std::vector<CEffect*>>& indexed;
|
/* 0008 */ std::map<int, CAllocator*> allocators;
|
||||||
std::map<int, EffectAllocator*>& allocators;
|
/* 0010 */ std::map<int, std::list<CEffect*>> active;
|
||||||
|
/* 0018 */ std::list<CEffect*> retired;
|
||||||
|
/* 0020 */ std::map<int, std::vector<CEffect*>> indexed;
|
||||||
|
|
||||||
~EffectLists();
|
virtual ~EffectLists();
|
||||||
|
|
||||||
CEffect* Find(int actor, int id) const;
|
CEffect* Find(int actor, int id) const;
|
||||||
CEffect* Find(int actor, int instance, int id) const;
|
CEffect* Find(int actor, int instance, int id) const;
|
||||||
|
|
@ -29,11 +33,16 @@ struct EffectLists {
|
||||||
void RetireActor(int actor);
|
void RetireActor(int actor);
|
||||||
void Clear();
|
void Clear();
|
||||||
void Release();
|
void Release();
|
||||||
|
|
||||||
private:
|
|
||||||
void RemoveActive(CEffect* effect);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(_WIN64)
|
||||||
|
static_assert(sizeof(EffectLists) == 0x28);
|
||||||
|
static_assert(offsetof(EffectLists, allocators) == 0x08);
|
||||||
|
static_assert(offsetof(EffectLists, active) == 0x10);
|
||||||
|
static_assert(offsetof(EffectLists, retired) == 0x18);
|
||||||
|
static_assert(offsetof(EffectLists, indexed) == 0x20);
|
||||||
|
#endif
|
||||||
|
|
||||||
void DestroyEffectMgr();
|
void DestroyEffectMgr();
|
||||||
|
|
||||||
extern EffectLists* g_effectMgr;
|
extern EffectLists* g_effectMgr;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue