rodecomp/Source/Contents/SpriteLayerDrawing.cpp
ragnarok-clanker 8c53ce0c93 Decompile fn_04808 (SpriteLayerRenderer::QueueQuad)
Batch #5207 by youko: 0 byte-identical, 1 confirmed by peer review.

- fn_04808 SpriteLayerRenderer::QueueQuad: logic confirmed by peer review

Peer-reviewed-by: Yommy, alisonrag, OvoKore
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-10-30 09:26:35 +00:00

109 lines
3.1 KiB
C++

#include "Contents/SpriteLayerDrawing.h"
#include "Client/Session.h"
#include "Contents/Actors/ActorStateFlags.h"
#include "Contents/Actors/Pc.h"
#include "Contents/Configuration/ServiceOptions.h"
#include "Contents/SpriteRidingOffset.h"
#include "Contents/SpriteRidingPolicy.h"
#include "Resource/PaletteResource.h"
#include "Resource/ResourceMgr.h"
#include "Resource/Sprites/ActionResource.h"
#include "Resource/Sprites/SpriteResource.h"
#include "Script/LuaScript.h"
#include <cstring>
// OFFSET: 0x0063FC90
// FUNCTION: fn_04808
void SpriteLayerRenderer::QueueQuad(int layer, const SpriteQuad* quad, const std::uint32_t* palette, int blend) {
const int direction = this->pc->render.previousAnimation - this->pc->render.animation;
if (this->layerViews[layer] > 0) {
int priority = -1;
g_luaScript->Call("GetLayerPriority", "ddd>d", direction, layer, this->layerViews[layer], &priority);
if (priority == -1) {
return;
}
SpriteLayerQuad entry;
memcpy_s(&entry.quad, sizeof(entry.quad), quad, sizeof(SpriteQuad));
entry.palette = palette;
entry.blend = blend;
this->quads.insert(std::make_pair(priority, entry));
} else {
SpriteLayerQuad entry;
memcpy_s(&entry.quad, sizeof(entry.quad), quad, sizeof(SpriteQuad));
entry.palette = palette;
entry.blend = blend;
this->quads.emplace(static_cast<int>(this->quads.size()) + 1, entry);
}
}
// OFFSET: 0x00640050
// OFFSET: 0x00640AD0
// OFFSET: 0x00640ED0
// OFFSET: 0x00641130
// FUNCTION: fn_04813
std::pair<int, int> SpriteLayerRenderer::GetItemOffset(int layer) {
if (g_session.IsDoramJob(this->pc->unknown_025C) == true) {
CPc* pc = this->pc;
int turn = 0;
if (pc->unknown_043C == 2) {
turn = -1;
} else if (pc->unknown_043C == 1) {
turn = 1;
}
int direction = pc->render.previousAnimation - pc->render.animation + turn;
if (direction < 0) {
direction = 7;
}
if (direction > 7) {
direction = 0;
}
int x = 0;
int y = 0;
g_luaScript->Call("OffsetItemPos_GetOffsetForDoram", "ddd>dd", this->layerViews[layer], direction, pc->unknown_0260, &x, &y);
return std::make_pair(x, y);
}
return std::make_pair(0, 0);
}
// OFFSET: 0x006412B0
// FUNCTION: fn_04814
const std::uint32_t* SpriteLayerRenderer::GetPalette(int layer, CSprRes* sprite, CActRes*) {
switch (layer) {
case 0:
if (static_cast<int>(this->pc->render.unknown_0048) > 0) {
return static_cast<CPaletteRes*>(ResourceMgr::Instance().Load(this->pc->render.name))->palette;
}
break;
case 1:
if (this->pc->unknown_0444 > 0) {
return static_cast<CPaletteRes*>(ResourceMgr::Instance().Load(this->pc->unknown_0478))->palette;
}
break;
}
return sprite->palette;
}
// OFFSET: 0x00641420
// FUNCTION: fn_04815
std::pair<bool, SpriteLayerResources> SpriteLayerRenderer::FindLayer(int layer) {
const auto found = this->layers.find(layer);
if (found == this->layers.end()) {
return std::make_pair(false, SpriteLayerResources{});
}
return std::make_pair(true, found->second);
}
// OFFSET: 0x00641620
// OFFSET: 0x00641E40