rodecomp/Source/Contents/Effects/CellRangeEffect.cpp
ragnarok-clanker 1a49bb4241 Decompile 14 functions in Source/Contents/Effects/Bash.cpp, Source/Contents/Effects/Bash.h, ...
Batch #4269 by eAthena: 0 byte-identical, 14 confirmed by peer review.

- fn_18869 CBash::Close: logic confirmed by peer review
- fn_18870 CBash::Slot01: logic confirmed by peer review
- fn_18872 CBash::Slot03: logic confirmed by peer review
- fn_18873 CBash::Slot04: logic confirmed by peer review
- fn_18874 CCellRangeEffect::CCellRangeEffect: logic confirmed by peer review
- fn_18876 CCellRangeEffect::SetCellTexture: logic confirmed by peer review
- fn_18877 CCellRangeEffect::Close: logic confirmed by peer review
- fn_18878 CCellRangeEffect::Slot01: logic confirmed by peer review
- fn_18880 CCellRangeEffect::Slot03: logic confirmed by peer review
- fn_18881 CCellRangeEffect::Slot04: logic confirmed by peer review
- fn_18882 CCherryBlossomEffect::CCherryBlossomEffect: logic confirmed by peer review
- fn_18884 CCherryBlossomEffect::Close: logic confirmed by peer review
- fn_18885 CCherryBlossomEffect::Slot01: logic confirmed by peer review
- fn_18887 CCherryBlossomEffect::Slot03: logic confirmed by peer review

Peer-reviewed-by: willerthal, KWDev
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-10-30 02:51:03 +00:00

141 lines
4 KiB
C++

#include "Contents/Effects/CellRangeEffect.h"
#include "Client/Mode/CGameMode.h"
#include "Client/Mode/ModeMgr.h"
#include "Contents/Actors/Skill.h"
#include "Contents/Camera/Camera.h"
#include "Contents/Effects/EffectMemoryMgr.h"
#include "Contents/Effects/Particle.h"
#include "Contents/Ground/TerrainHeight.h"
#include "Contents/World/World.h"
#include "Resource/World/TerrainResource.h"
#include "Utility/Math/AffineMatrix.h"
#include "Utility/Text/FormatString.h"
#include <cstring>
#include <string>
// OFFSET: 0x00B43050
// FUNCTION: fn_18874
CCellRangeEffect::CCellRangeEffect() : CEffect(-1), cellSize(5.0f) {
}
// OFFSET: 0x00B431B0
// FUNCTION: fn_18876
void CCellRangeEffect::SetCellTexture(CParticle* particle) {
if (!particle) {
return;
}
const int frame = (particle->unknown_00E8 + particle->unknown_000C) / 10 % 3 + 1;
std::string name;
switch (this->id) {
case 992:
name = FormatOwnedString("effect\\water-%d.bmp", frame);
break;
case 993:
name = FormatOwnedString("effect\\stone-%d.bmp", frame);
break;
case 994:
name = FormatOwnedString("effect\\fire-%d.bmp", frame);
break;
case 995:
name = FormatOwnedString("effect\\lightning-%d.bmp", frame);
break;
case 1007:
name = "effect\\makibishi.bmp";
particle->scale = 2.5f;
particle->destinationBlend = 6;
break;
default:
break;
}
if (!name.empty()) {
particle->SetTexture(name);
}
}
// OFFSET: 0x00B433E0
// FUNCTION: fn_18877
void CCellRangeEffect::Close() {
for (CParticle* particle : this->particles) {
FreeParticle(particle);
}
this->particles.clear();
}
// OFFSET: 0x00B43420
// FUNCTION: fn_18878
void CCellRangeEffect::Slot01() {
CSkill* owner = static_cast<CSkill*>(FindRenderObject(this->actor));
if (!owner) {
return;
}
const int range = owner->range;
for (int row = -range; row <= range; ++row) {
for (int column = -range; column <= range; ++column) {
CParticle* particle = CreateParticle(reinterpret_cast<const vector3d*>(this->position), 5);
if (particle) {
particle->unknown_0004 = this->id;
particle->unknown_000C = column;
particle->unknown_0010 = row;
particle->unknown_0008 = 1;
particle->alpha = 255;
particle->SetColor(255, 255, 255);
particle->SetTexture("effect\\torch_violet08.bmp");
particle->scale = 8.0f;
this->particles.push_back(particle);
}
}
}
}
// OFFSET: 0x00B43520
// FUNCTION: fn_18880
void CCellRangeEffect::Slot03() {
for (CParticle* particle : this->particles) {
particle->position.x = this->position[0];
particle->position.y = this->position[1];
particle->position.z = this->position[2];
if (particle) {
vector3d position;
std::memcpy(&position, this->position, sizeof(position));
position.x = static_cast<float>(particle->unknown_000C) * this->cellSize + position.x;
position.z = static_cast<float>(particle->unknown_0010) * this->cellSize + position.z;
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
position.y = mode->scene->terrain->Grid().Height(position.x, position.z) - 1.2f;
particle->position.x = position.x;
particle->position.y = position.y;
particle->position.z = position.z;
matrix rotation;
std::memcpy(rotation.values, g_identityMatrix, sizeof(rotation.values));
rotation.MakeXRotation(static_cast<CGameMode*>(g_modeMgr.GetGameMode())->camera->camera.pitch / 180.0f * 3.141592f);
rotation.AppendXRotation(3.141592f);
matrix scale;
std::memcpy(scale.values, g_identityMatrix, sizeof(scale.values));
scale.SetScale(particle->scale, particle->scale, 1.0f);
matrix result;
result.Compose(scale, rotation);
particle->transform = result;
}
++particle->unknown_00E8;
}
}
// OFFSET: 0x00B43920
// FUNCTION: fn_18881
void CCellRangeEffect::Slot04() {
for (CParticle* particle : this->particles) {
if (particle) {
this->SetCellTexture(particle);
particle->Render(false, 0.0f, 1.0f, 0.0f, 1.0f, false, true);
}
}
}