From 5b4ba2d9ada214969c9e8f96fa6d8dae45334a4a Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sat, 31 Oct 2026 08:45:48 +0000 Subject: [PATCH] Decompile fn_19884 (CEffectPrim::RenderTeiFacingSlots) Batch #7497 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_19884 CEffectPrim::RenderTeiFacingSlots: logic confirmed by peer review Peer-reviewed-by: meitogi, gordaoprogramas, Lumen, superintelligence Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- .../Effects/EffectPrimitiveRendering.cpp | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/Source/Contents/Effects/EffectPrimitiveRendering.cpp b/Source/Contents/Effects/EffectPrimitiveRendering.cpp index c6ae3150..4d6ddaeb 100644 --- a/Source/Contents/Effects/EffectPrimitiveRendering.cpp +++ b/Source/Contents/Effects/EffectPrimitiveRendering.cpp @@ -5909,4 +5909,148 @@ void CEffectPrim::RenderSphere(matrix& wtm) { } // OFFSET: 0x00BD6510 +// FUNCTION: fn_19884 +void CEffectPrim::RenderTeiFacingSlots(matrix& wtm) { + vector3d vec1{}; + vector3d vec2{}; + vector3d vec4{}; + vector3d vec3{}; + int rpCnt = 0; + + for (int ec = 0; ec < 4; ++ec) { + EffectPrimitiveSlot& slot = this->state.slots[ec]; + + if (slot.life != 1 || slot.alphaB <= 0) { + continue; + } + + const float dist = slot.distance * g_sinTable[static_cast(slot.height[8])] * 0.05f + slot.distance; + const float shape = slot.height[10]; + + int angle = slot.fullDisplayAngle; + vec1 = {dist * g_cosTable[angle], 0.0f, dist * g_sinTable[angle]}; + + if (shape == 0.0f) { + angle = angle >= 90 ? angle - 90 : angle + 270; + } else if (shape == 1.0f) { + angle = angle >= 60 ? angle - 60 : angle + 300; + } else if (shape == 2.0f) { + angle -= 130; + if (angle < 0) { + angle += 360; + } + } + vec2 = {dist * g_cosTable[angle], 0.0f, dist * g_sinTable[angle]}; + + if (shape == 0.0f) { + angle -= 90; + if (angle < 0) { + angle += 360; + } + } else if (shape == 1.0f) { + angle -= 120; + if (angle < 0) { + angle += 360; + } + } else if (shape == 2.0f) { + angle -= 50; + if (angle < 0) { + angle += 360; + } + } + vec3 = {dist * g_cosTable[angle], 0.0f, dist * g_sinTable[angle]}; + + if (shape == 0.0f) { + angle -= 90; + if (angle < 0) { + angle += 360; + } + } else if (shape == 1.0f) { + angle -= 60; + if (angle < 0) { + angle += 360; + } + } else if (shape == 2.0f) { + angle -= 130; + if (angle < 0) { + angle += 360; + } + } + vec4 = {dist * g_cosTable[angle], 0.0f, dist * g_sinTable[angle]}; + + const char kind = slot.flag1[2]; + if (kind == 3) { + vec1.x += 3.1f; + vec2.x += 3.1f; + vec3.x += 3.1f; + vec4.x += 3.1f; + vec4.z += 6.0f; + vec3.z += 6.0f; + vec2.z += 6.0f; + vec1.z += 6.0f; + } else if (kind >= 17 && kind <= 31) { + vec4.z += 6.0f; + vec3.z += 6.0f; + vec2.z += 6.0f; + vec1.z += 6.0f; + } + + this->Tei_TowardScreen(vec1, vec2, vec3, vec4, this->state.slots[0].alphaT, this->state.slots[1].alphaT); + + const vector3d& base = slot.vecBNow; + vec1.x += base.x; + vec1.y += base.y; + vec1.z += base.z; + vec2.x += base.x; + vec2.y += base.y; + vec2.z += base.z; + vec3.x += base.x; + vec3.y += base.y; + vec3.z += base.z; + vec4.x += base.x; + vec4.y += base.y; + vec4.z += base.z; + + switch (kind) { + case 0: + case 3: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec1, vec2, vec3, vec4, wtm, 1, slot.flag1[0], 1, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 2: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 130, 130, 250, 0.0f, 1.0f, 0.0f, 1.0f, 0); + case 4: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0); + case 5: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 125, 255, 125, 0.0f, 1.0f, 0.0f, 1.0f, 0); + case 10: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 150, 150, 150, 0.0f, 1.0f, 0.0f, 1.0f, 0); + case 12: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 50, 50, 50, 0.0f, 1.0f, 0.0f, 1.0f, 0); + case 15: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 51, 153, 153, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 16: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 1, slot.flag1[0], 1, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 3); + break; + case 17: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 18: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 5, 5, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0); + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 155, 155, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 19: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 5, 255, 5, 0.0f, 1.0f, 0.0f, 1.0f, 0); + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 155, 255, 155, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 20: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 255, 5, 5, 0.0f, 1.0f, 0.0f, 1.0f, 0); + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 255, 155, 155, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + case 32: + this->RenderTeiRect(&rpCnt, slot.alphaB, vec2, vec1, vec4, vec3, wtm, 0, slot.flag1[0], 1, 255, 5, 5, 0.0f, 1.0f, 0.0f, 1.0f, 0); + break; + } + } +}