summaryrefslogtreecommitdiff
path: root/src/d/d_npc_lib.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2023-09-07 21:22:55 -0700
committerGitHub <noreply@github.com>2023-09-07 21:22:55 -0700
commit6deaa22a19c725fa62ee4db8eb6ec5a07e60b22f (patch)
tree3f39d25656c0b19fc4d521f6b30d942e5df1fc24 /src/d/d_npc_lib.cpp
parent3dd1963a59c4cf80c0348f10532d2ce445dec7de (diff)
d_a_npc / d_a_tag_mhint / d_a_grass work (#1916)
* some npc work / cleanup * tag_mhint / grass work * fix path / remove asm
Diffstat (limited to 'src/d/d_npc_lib.cpp')
-rw-r--r--src/d/d_npc_lib.cpp162
1 files changed, 134 insertions, 28 deletions
diff --git a/src/d/d_npc_lib.cpp b/src/d/d_npc_lib.cpp
index 29cb2333cd..955338722a 100644
--- a/src/d/d_npc_lib.cpp
+++ b/src/d/d_npc_lib.cpp
@@ -4,6 +4,7 @@
//
#include "d/d_npc_lib.h"
+#include "SSystem/SComponent/c_math.h"
#include "dol2asm.h"
//
@@ -52,29 +53,32 @@ extern "C" extern u8 data_80451164[4];
// Declarations:
//
-/* ############################################################################################## */
-/* 803C2B88-803C2B98 01FCA8 000C+04 2/2 0/0 0/0 .data __vt__16dNpcLib_lookat_c */
-SECTION_DATA extern void* __vt__16dNpcLib_lookat_c[3 + 1 /* padding */] = {
- (void*)NULL /* RTTI */,
- (void*)NULL,
- (void*)__dt__16dNpcLib_lookat_cFv,
- /* padding */
- NULL,
-};
-
/* 80251314-8025140C 24BC54 00F8+00 0/0 0/0 4/4 .text __ct__16dNpcLib_lookat_cFv */
dNpcLib_lookat_c::dNpcLib_lookat_c() {}
/* 8025140C-80251534 24BD4C 0128+00 0/0 0/0 2/2 .text
* init__16dNpcLib_lookat_cFP8J3DModelPiP5csXyzP5csXyz */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void dNpcLib_lookat_c::init(J3DModel* param_0, int* param_1, csXyz* param_2, csXyz* param_3) {
- nofralloc
-#include "asm/d/d_npc_lib/init__16dNpcLib_lookat_cFP8J3DModelPiP5csXyzP5csXyz.s"
+void dNpcLib_lookat_c::init(J3DModel* i_mdl_p, int* param_1, csXyz* param_2, csXyz* param_3) {
+ int i;
+ for (i = 0; i < 4; i++) {
+ field_0xbc[i] = -1;
+ }
+
+ mCount = 0;
+ for (i = 0; i < 3; i++) {
+ int a_jntNum = param_1[i];
+ if (a_jntNum < 0) {
+ break;
+ }
+
+ mDoMtx_stack_c::copy(i_mdl_p->i_getAnmMtx(a_jntNum));
+ mDoMtx_stack_c::multVecZero(&field_0x04[mCount]);
+ field_0xbc[i] = a_jntNum;
+ field_0x94[i] = param_2[i];
+ field_0x7c[i] = param_3[i];
+ mCount++;
+ }
}
-#pragma pop
/* ############################################################################################## */
/* 80454DE8-80454DEC 0033E8 0004+00 3/3 0/0 0/0 .sdata2 @3864 */
@@ -111,20 +115,96 @@ SECTION_SDATA2 static f64 lit_3873 = 4503601774854144.0 /* cast s32 to float */;
/* 80251534-80251B60 24BE74 062C+00 0/0 0/0 2/2 .text
* action__16dNpcLib_lookat_cF4cXyz4cXyzP10fopAc_ac_cPA4_fi */
+// regswap, equivalent
+#ifdef NONMATCHING
+void dNpcLib_lookat_c::action(cXyz param_0, cXyz param_1, fopAc_ac_c* param_2, Mtx param_3,
+ int param_4) {
+ cXyz spA0;
+
+ Mtx sp90;
+ cMtx_copy(param_3, sp90);
+ sp90[2][3] = 0.0f;
+ sp90[1][3] = 0.0f;
+ sp90[0][3] = 0.0f;
+
+ mDoMtx_stack_c::copy(sp90);
+ mDoMtx_stack_c::inverse();
+ cMtx_copy(mDoMtx_stack_c::get(), sp90);
+
+ for (int i = 0; i < mCount; i++) {
+ spA0 = field_0x04[i] - param_2->current.pos;
+ mDoMtx_stack_c::transS(param_2->current.pos);
+ mDoMtx_stack_c::concat(sp90);
+ mDoMtx_stack_c::multVec(&spA0, &field_0x04[i]);
+ }
+
+ spA0 = param_0 - param_2->current.pos;
+ mDoMtx_stack_c::transS(param_2->current.pos);
+ mDoMtx_stack_c::concat(sp90);
+ mDoMtx_stack_c::multVec(&spA0, &param_0);
+
+ spA0 = param_1 - param_2->current.pos;
+ mDoMtx_stack_c::transS(param_2->current.pos);
+ mDoMtx_stack_c::concat(sp90);
+ mDoMtx_stack_c::multVec(&spA0, &field_0x04[mCount]);
+
+ setPrm();
+ update();
+
+ cXyz spAC;
+ cXyz spB8;
+
+ f32 tmp = 1.0f;
+ for (int i = mCount - 1; i >= 0 && param_4 == 1; i--) {
+ spAC = param_0 - field_0x04[i];
+
+ if (!spAC.isZero()) {
+ spAC.normalize();
+
+ spB8 = field_0x04[mCount] - field_0x04[i];
+ if (!spB8.isZero()) {
+ spB8.normalize();
+
+ s16 svar7 = -cM_atan2s(spAC.y, spAC.absXZ());
+ s16 svar8 = cM_atan2s(spAC.x, spAC.z);
+
+ s16 svar9 = -cM_atan2s(spB8.y, spB8.absXZ());
+ s16 svar10 = cM_atan2s(spB8.x, spB8.z);
+
+ field_0x4c[i].x += (s16)(tmp * (f32)(svar7 - svar9));
+ field_0x4c[i].y += (s16)(tmp * (f32)(svar8 - svar10));
+
+ limitter(&field_0x4c[i].x, field_0x34[i].x, field_0x94[i].x, field_0x7c[i].x);
+ limitter(&field_0x4c[i].y, field_0x34[i].y, field_0x94[i].y, field_0x7c[i].y);
+ }
+ }
+
+ tmp *= 0.5f;
+ update();
+ }
+
+ csXyz sp114(csXyz::Zero);
+ for (int i = 0; i < 4; i++) {
+ sp114 += field_0x4c[i];
+ field_0x64[i].x = sp114.x;
+ field_0x64[i].y = sp114.y;
+ field_0x64[i].z = 0;
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
-asm void dNpcLib_lookat_c::action(cXyz param_0, cXyz param_1, fopAc_ac_c* param_2,
- f32 (*param_3)[4], int param_4) {
+asm void dNpcLib_lookat_c::action(cXyz param_0, cXyz param_1, fopAc_ac_c* param_2, Mtx param_3,
+ int param_4) {
nofralloc
#include "asm/d/d_npc_lib/action__16dNpcLib_lookat_cF4cXyz4cXyzP10fopAc_ac_cPA4_fi.s"
}
#pragma pop
+#endif
/* 80251B60-80251B64 24C4A0 0004+00 0/0 0/0 2/2 .text dbView__16dNpcLib_lookat_cFv */
-void dNpcLib_lookat_c::dbView() {
- /* empty function */
-}
+void dNpcLib_lookat_c::dbView() {}
/* ############################################################################################## */
/* 80454E18-80454E20 003418 0004+04 1/1 0/0 0/0 .sdata2 @3970 */
@@ -145,6 +225,29 @@ asm void dNpcLib_lookat_c::setPrm() {
#pragma pop
/* 80251EF8-80252018 24C838 0120+00 1/1 0/0 0/0 .text update__16dNpcLib_lookat_cFv */
+// matches with literals
+#ifdef NONMATCHING
+void dNpcLib_lookat_c::update() {
+ cXyz sp50;
+ csXyz sp58(csXyz::Zero);
+ Mtx m;
+
+ for (int i = 0; i < mCount; i++) {
+ mDoMtx_stack_c::XYZrotS(field_0x34[i]);
+ cMtx_copy(mDoMtx_stack_c::get(), m);
+
+ mDoMtx_stack_c::transS(field_0x04[i]);
+ sp58.x += field_0x4c[i].x;
+ sp58.y += field_0x4c[i].y;
+
+ mDoMtx_stack_c::ZXYrotM(sp58);
+ mDoMtx_stack_c::concat(m);
+
+ sp50.set(0.0f, 0.0f, field_0xac[i]);
+ mDoMtx_stack_c::multVec(&sp50, &field_0x04[i + 1]);
+ }
+}
+#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -153,24 +256,27 @@ asm void dNpcLib_lookat_c::update() {
#include "asm/d/d_npc_lib/update__16dNpcLib_lookat_cFv.s"
}
#pragma pop
+#endif
/* 80252018-80252094 24C958 007C+00 1/1 0/0 0/0 .text limitter__16dNpcLib_lookat_cFPssss */
-int dNpcLib_lookat_c::limitter(s16* param_0, s16 param_1, s16 param_2, s16 param_3) {
- int limit = param_1 + *param_0;
+int dNpcLib_lookat_c::limitter(s16* o_value, s16 param_1, s16 param_2, s16 param_3) {
+ int limit = param_1 + *o_value;
if (param_2 <= limit) {
if (param_2 <= param_1) {
- *param_0 = 0;
+ *o_value = 0;
} else {
- *param_0 -= (s16)(limit - param_2);
+ *o_value -= (s16)(limit - param_2);
}
}
+
if (limit <= param_3) {
if (param_1 <= param_3) {
- *param_0 = 0;
+ *o_value = 0;
} else {
- *param_0 -= (s16)(limit - param_3);
+ *o_value -= (s16)(limit - param_3);
}
}
+
return 1;
}