From b722d4e36da9556612b15f63d4aeaac00385c028 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Tue, 27 Oct 2026 21:05:10 +0000 Subject: [PATCH] Decompile 8 functions in Source/Contents/Sound/SoundMaker.cpp, Source/Contents/Actors/EffectActors.h Batch #1131 by eAthena: 0 byte-identical, 8 confirmed by peer review. - fn_22365 CBlowEffect::`scalar deleting destructor': logic confirmed by peer review - fn_22367 CCorpse::`scalar deleting destructor': logic confirmed by peer review - fn_22373 CMasterChaser::`scalar deleting destructor': logic confirmed by peer review - fn_22375 CNumEffect::`scalar deleting destructor': logic confirmed by peer review - fn_22405 CNumEffect::Update: logic confirmed by peer review - fn_22418 CBlowEffect::SendObjectMessage: logic confirmed by peer review - fn_22420 CCorpse::SendObjectMessage: logic confirmed by peer review - fn_22427 CNumEffect::SendObjectMessage: logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker Reviewed-by: ragnarok-clanker --- Source/Contents/Actors/EffectActors.h | 57 ++++++++++++++++ Source/Contents/Sound/SoundMaker.cpp | 94 +++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 Source/Contents/Actors/EffectActors.h diff --git a/Source/Contents/Actors/EffectActors.h b/Source/Contents/Actors/EffectActors.h new file mode 100644 index 0000000..df3d10c --- /dev/null +++ b/Source/Contents/Actors/EffectActors.h @@ -0,0 +1,57 @@ +#ifndef RAGNAROK_SOURCE_CONTENTS_ACTORS_EFFECTACTORS_H +#define RAGNAROK_SOURCE_CONTENTS_ACTORS_EFFECTACTORS_H + +#include "Contents/Actors/RenderObject.h" + +#include +#include + +class CBlowEffect : public CRenderObject { +public: + ~CBlowEffect() override; + void SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m + ) override; +}; + +class CCorpse : public CRenderObject { +public: + ~CCorpse() override; + void SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m + ) override; + + /* 0138 */ std::uint32_t unknown_0138; + /* 013C */ std::uint32_t unknown_013C; +}; + +class CMasterChaser : public CRenderObject { +public: + ~CMasterChaser() override; + + /* 0138 */ std::uint32_t unknown_0138; + /* 013C */ std::uint32_t unknown_013C; +}; + +class CNumEffect : public CRenderObject { +public: + ~CNumEffect() override; + bool Update() override; + void SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m + ) override; + + /* 0138 */ float baseHeight; + /* 013C */ float baseScale; +}; + +#if defined(_WIN32) && !defined(_WIN64) +static_assert(sizeof(CBlowEffect) == 0x138); +static_assert(sizeof(CCorpse) == 0x140); +static_assert(sizeof(CMasterChaser) == 0x140); +static_assert(sizeof(CNumEffect) == 0x140); +static_assert(offsetof(CNumEffect, baseHeight) == 0x138); +static_assert(offsetof(CNumEffect, baseScale) == 0x13C); +#endif + +#endif diff --git a/Source/Contents/Sound/SoundMaker.cpp b/Source/Contents/Sound/SoundMaker.cpp index 23653fc..1590d69 100644 --- a/Source/Contents/Sound/SoundMaker.cpp +++ b/Source/Contents/Sound/SoundMaker.cpp @@ -1,5 +1,6 @@ #include "Contents/Sound/SoundMaker.h" +#include "Contents/Actors/EffectActors.h" #include "Contents/Sound/SoundMgr.h" #include "Resource/World/WorldResource.h" #include "Utility/Math/AffineMatrix.h" @@ -22,6 +23,39 @@ CSoundMaker::CSoundMaker(ResourceMgr& resources, JobNames& names, SoundMakerCont this->lastTick = timeGetTime() - 4000u; } +// OFFSET: 0x00DA2370 +// FUNCTION: fn_22365 +CBlowEffect::~CBlowEffect() = default; + +// OFFSET: 0x00DA2450 +// FUNCTION: fn_22367 +CCorpse::~CCorpse() = default; + +// OFFSET: 0x00DA2720 +// FUNCTION: fn_22373 +CMasterChaser::~CMasterChaser() = default; + +// OFFSET: 0x00DA27C0 +// FUNCTION: fn_22375 +CNumEffect::~CNumEffect() = default; + +// OFFSET: 0x00DA3980 +// FUNCTION: fn_22405 +bool CNumEffect::Update() { + const float elapsed = static_cast((timeGetTime() - this->render.unknown_008C) / 24.0); + this->render.previousAnimation = this->render.animation; + this->render.position[1] = this->baseHeight - elapsed * 0.18f; + this->SetColor(static_cast(255.0f - (elapsed + elapsed)), -1, -1, -1); + + if (this->render.scale > 1.0f) { + this->render.scale = this->baseScale - elapsed * 0.24f; + } else if (this->render.scale < 1.0f) { + this->render.scale = 1.0f; + } + + return elapsed <= 120.0f; +} + // OFFSET: 0x00DA3A60 // FUNCTION: fn_22406 bool CSoundMaker::Update() { @@ -84,6 +118,66 @@ bool CSoundMaker::Update() { void CSoundMaker::Draw(int) { } +// OFFSET: 0x00DA4970 +// FUNCTION: fn_22418 +void CBlowEffect::SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int, int, int, int +) { + if (message != 14 || a != 0) { + CRenderObject::SendObjectMessage(sender, message, a, b, c, d, e, f, g, h, i, 0, 0, 0, 0); + return; + } + + const float* position = reinterpret_cast(b); + this->render.position[0] = position[0]; + this->render.position[1] = position[1]; + this->render.position[2] = position[2]; + this->render.visible = 1; + this->render.color = (d | e) ? 0xFFFF0000u : 0xFFFFFFFFu; + this->render.unknown_008C = timeGetTime(); +} + +// OFFSET: 0x00DA4AD0 +// FUNCTION: fn_22420 +void CCorpse::SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int, int, int, int +) { + CRenderObject::SendObjectMessage(sender, message, a, b, c, d, e, f, g, h, i, 0, 0, 0, 0); +} + +// OFFSET: 0x00DA5610 +// FUNCTION: fn_22427 +void CNumEffect::SendObjectMessage( + CGameObject* sender, int message, int a, int b, int c, int d, int e, int f, int g, int h, int i, int, int, int, int +) { + if (message == 14 && a == 0) { + const float* position = reinterpret_cast(b); + this->render.position[0] = position[0]; + this->render.position[1] = position[1]; + this->render.position[2] = position[2]; + this->render.visible = 1; + this->render.position[1] -= 12.0f; + this->baseHeight = this->render.position[1]; + + this->render.unknown_003C = d; + if (d > 9 || d < 0) { + this->render.unknown_003C = 0; + } + + this->render.unknown_0078 = f; + this->render.scale = 5.0f; + this->baseScale = 5.0f; + this->render.unknown_008C = timeGetTime(); + return; + } + + if (message == 22 && a == 0) { + return; + } + + CRenderObject::SendObjectMessage(sender, message, a, b, c, d, e, f, g, h, i, 0, 0, 0, 0); +} + // OFFSET: 0x00DA56E0 // FUNCTION: fn_22428 void CSoundMaker::SendObjectMessage(