From d84cf3367b06fc704c396e9a5ca880dd02b910e9 Mon Sep 17 00:00:00 2001 From: Pheenoh Date: Sun, 22 Jan 2023 17:36:03 -0700 Subject: [PATCH] do_wait_1 checkpoint --- include/rel/d/a/d_a_do/d_a_do.h | 4 +- rel/d/a/d_a_do/d_a_do.cpp | 523 +++++++++++++++++++++++++------- 2 files changed, 417 insertions(+), 110 deletions(-) diff --git a/include/rel/d/a/d_a_do/d_a_do.h b/include/rel/d/a/d_a_do/d_a_do.h index 7b4a76eafab..79e3bee5894 100644 --- a/include/rel/d/a/d_a_do/d_a_do.h +++ b/include/rel/d/a/d_a_do/d_a_do.h @@ -98,7 +98,7 @@ public: /* 0x5B5 */ u8 field_0x5b5; /* 0x5B6 */ u8 field_0x5b6; /* 0x5B7 */ u8 field_0x5b7; - /* 0x5B8 */ cXyz field_0x588; + /* 0x5B8 */ cXyz field_0x5b8; /* 0x5C4 */ u8 field_0x5c4[4]; /* 0x5C8 */ f32 mDistFromPlayer; /* 0x5CC */ s16 mAngleYFromPlayer; @@ -117,7 +117,7 @@ public: /* 0x5EC */ f32 field_0x5ec; /* 0x5F0 */ s16 field_0x5f0; /* 0x5F2 */ s16 mAction; - /* 0x5F4 */ u16 field_0x5f4; + /* 0x5F4 */ s16 field_0x5f4; /* 0x5F6 */ s16 mStayStatus; // probably a better name for this /* 0x5F8 */ u32 mShadowKey; /* 0x5FC */ s16 field_0x5fc[4]; diff --git a/rel/d/a/d_a_do/d_a_do.cpp b/rel/d/a/d_a_do/d_a_do.cpp index 5caaa8ac620..2a17ad78897 100644 --- a/rel/d/a/d_a_do/d_a_do.cpp +++ b/rel/d/a/d_a_do/d_a_do.cpp @@ -884,7 +884,7 @@ COMPILER_STRIP_GATE(0x8066EE2C, &lit_4027); #ifdef NONMATCHING // regalloc static int dansa_check(do_class* i_dogP, cXyz i_pos, f32 param_2) { - i_pos.y += FLOAT_LABEL(lit_4025); + i_pos.y = i_pos.y + FLOAT_LABEL(lit_4025); dBgS_GndChk gnd_chk; Vec pos; @@ -911,7 +911,7 @@ static int dansa_check(do_class* i_dogP, cXyz i_pos, f32 param_2) { if (dComIfG_Bgsp().LineCross(&lin_chk) != 0) { return -1; } else { - if (depth_check(i_dogP,i_pos,FLOAT_LABEL(lit_4027)) && l_HIO[29] == 0) { + if (depth_check(i_dogP,i_pos,FLOAT_LABEL(lit_4027)) && l_HIO.mSwimming == 0) { return 0xffffff9c; } else { @@ -1050,10 +1050,10 @@ static void area_check(do_class* i_dogP) { cXyz pos_delta = i_dogP->orig.pos - i_dogP->current.pos; if (i_dogP->field_0x5b6 != 255) { - if ((i_dogP->field_0x5b6 * 100.f * 2.0f) > pos_delta.abs()) { + if ((i_dogP->field_0x5b6 * FLOAT_LABEL(lit_3772) * FLOAT_LABEL(lit_3665)) > pos_delta.abs()) { i_dogP->mAction = ACT_WALK; i_dogP->mStayStatus = -1; - i_dogP->field_0x600 = cM_rndF(100.0f) + 100.0f; // random value between 100 and 200 + i_dogP->field_0x5fc[2] = cM_rndF(FLOAT_LABEL(lit_3772)) + FLOAT_LABEL(lit_3772); // random value between 100 and 200 } } } @@ -1076,109 +1076,6 @@ SECTION_RODATA static f32 const lit_4189 = 20.0f; COMPILER_STRIP_GATE(0x8066EE60, &lit_4189); #pragma pop -/* 80668D5C-80669050 0010FC 02F4+00 2/1 0/0 0/0 .text do_stay__FP8do_class */ -#ifdef NONMATCHING -// regalloc and float literals -static void do_stay(do_class* i_dogP) { - switch (i_dogP->mStayStatus) { - case 0: { - if (i_dogP->field_0x5b4 == 0) { - anm_init(i_dogP,12,0.0f,2,FLOAT_LABEL(lit_3662)); // fix float literals - i_dogP->mStayStatus++; - i_dogP->field_0x5fc = 10; - } else { - i_dogP->mAction = ACT_WALK; - i_dogP->mStayStatus = 0; - return; - } - } - case 1: { - if (i_dogP->field_0x5fc == 0 && i_dogP->mDistFromPlayer < l_HIO.mRunSpeed) { - i_dogP->mStayStatus++; - i_dogP->field_0x5fc = cM_rndF(50.0) + 20.f; // fix float literals // random number between 20 and 70 - } - break; - } - case 2: { - i_dogP->field_0x616 = 1; - i_dogP->field_0x614 = 0xe764; - i_dogP->field_0x648 = 1000.0f; // fix float literals - if (i_dogP->field_0x5fc == 0) { - anm_init(i_dogP,11,0.0f,0,2.0f); // fix float literals - i_dogP->mStayStatus++; - } - break; - } - case 3: { - i_dogP->field_0x616 = 1; - i_dogP->field_0x648 = 2000.0f; // fix float literals - - if (i_dogP->mpMorf->isStop()) { - i_dogP->mAction = ACT_WALK_RUN; - i_dogP->mStayStatus = 0; - } - break; - } - case 10: { - anm_init(i_dogP,12,0.0f,2,2.0f); // fix float literals - i_dogP->mStayStatus++; - } - case 11: { - i_dogP->field_0x616 = 1; - i_dogP->field_0x614 = 0xe764; - i_dogP->field_0x648 = 1000.0f; // fix float literals - - if (i_dogP->mEyePosYDistFromPlayer > 30.0f) { - i_dogP->mStayStatus++; - i_dogP->field_0x5fc = cM_rndF(10.0) + 10.f; // fix float literals // random number between 10 and 20 - } - - if (i_dogP->mDistFromPlayer > l_HIO.mRunSpeed + 100.0f) { // fix float literals - i_dogP->field_0x5f4 = 0; - i_dogP->mStayStatus = 0; - } - break; - } - case 12: { - i_dogP->field_0x616 = 1; - i_dogP->field_0x614 = 0xe764; - i_dogP->field_0x648 = 1500.0f; - - if (i_dogP->mEyePosYDistFromPlayer > 30.0f) { - if (i_dogP->field_0x5fc == 0) { - anm_init(i_dogP,11,0.0f,0,2.0f); // fix float literals - i_dogP->mStayStatus = 13; - } - } else { - i_dogP->mStayStatus = 11; - } - break; - } - case 13: { - i_dogP->field_0x616 = 1; - i_dogP->field_0x648 = 1500.0f; // fix float literals - - if (i_dogP->mpMorf->isStop()) { - i_dogP->mAction = ACT_WAIT_1; - i_dogP->mStayStatus = 0; - } - } - } - - cLib_addCalc0(&i_dogP->mSpeedF,1.0f,1.0f); -} -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void do_stay(do_class* i_dogP) { - nofralloc -#include "asm/rel/d/a/d_a_do/d_a_do/do_stay__FP8do_class.s" -} -#pragma pop -#endif - -/* ############################################################################################## */ /* 8066EE64-8066EE68 00007C 0004+00 0/4 0/0 0/0 .rodata @4190 */ #pragma push #pragma force_active on @@ -1242,6 +1139,111 @@ SECTION_RODATA static f32 const lit_4339 = 300.0f; COMPILER_STRIP_GATE(0x8066EE84, &lit_4339); #pragma pop +/* 80668D5C-80669050 0010FC 02F4+00 2/1 0/0 0/0 .text do_stay__FP8do_class */ +#ifdef NONMATCHING +// regalloc and float literals +static void do_stay(do_class* i_dogP) { + switch (i_dogP->mStayStatus) { + case 0: { + if (i_dogP->field_0x5b4 == 0) { + anm_init(i_dogP,ANM_DOWN_WT,FLOAT_LABEL(lit_4069),2,FLOAT_LABEL(lit_3662)); + i_dogP->mStayStatus++; + i_dogP->field_0x5fc[0] = 10; + } else { + i_dogP->mAction = ACT_WALK; + i_dogP->mStayStatus = 0; + return; + } + } + case 1: { + if (i_dogP->field_0x5fc[0] == 0 && i_dogP->mDistFromPlayer < l_HIO.mRunSpeed) { + i_dogP->mStayStatus++; + i_dogP->field_0x5fc[0] = cM_rndF(FLOAT_LABEL(lit_3816)) + FLOAT_LABEL(lit_4189); // random number between 20 and 70 + } + break; + } + case 2: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x614 = 0xe764; + i_dogP->field_0x648 = FLOAT_LABEL(lit_4190); + if (i_dogP->field_0x5fc[0] == 0) { + anm_init(i_dogP,ANM_DOWN,FLOAT_LABEL(lit_4027),0,FLOAT_LABEL(lit_3662)); + i_dogP->mStayStatus++; + } + break; + } + case 3: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x648 = FLOAT_LABEL(lit_4191); + + if (i_dogP->mpMorf->isStop()) { + i_dogP->mAction = ACT_WALK_RUN; + i_dogP->mStayStatus = 0; + } + break; + } + case 10: { + anm_init(i_dogP,ANM_DOWN_WT,FLOAT_LABEL(lit_4069),2,FLOAT_LABEL(lit_3662)); + i_dogP->mStayStatus++; + } + case 11: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x614 = 0xe764; + i_dogP->field_0x648 = FLOAT_LABEL(lit_4190); + + if (i_dogP->mEyePosYDistFromPlayer > FLOAT_LABEL(lit_3846)) { + i_dogP->mStayStatus++; + i_dogP->field_0x5fc[0] = cM_rndF(FLOAT_LABEL(lit_4192)) + FLOAT_LABEL(lit_4192); // random number between 10 and 20 + } + + if (i_dogP->mDistFromPlayer > FLOAT_LABEL(lit_3772) + l_HIO.mPlayerRecogniztionDist) { + i_dogP->field_0x5f4 = 0; + i_dogP->mStayStatus = 0; + } + break; + } + case 12: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x614 = 0xe764; + i_dogP->field_0x648 = FLOAT_LABEL(lit_4193); + + if (i_dogP->mEyePosYDistFromPlayer > FLOAT_LABEL(lit_3846)) { + if (i_dogP->field_0x5fc[0] == 0) { + anm_init(i_dogP,ANM_DOWN,FLOAT_LABEL(lit_4194),0,FLOAT_LABEL(lit_3662)); + i_dogP->mStayStatus = 13; + } + } else { + i_dogP->mStayStatus = 11; + } + break; + } + case 13: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x648 = FLOAT_LABEL(lit_4193); + + if (i_dogP->mpMorf->isStop()) { + i_dogP->mAction = ACT_WAIT_1; + i_dogP->mStayStatus = 0; + } + } + } + + f32* speedF = (f32*)&i_dogP->mSpeedF; + + cLib_addCalc0(speedF,FLOAT_LABEL(lit_3662),FLOAT_LABEL(lit_3662)); +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +static asm void do_stay(do_class* i_dogP) { + nofralloc +#include "asm/rel/d/a/d_a_do/d_a_do/do_stay__FP8do_class.s" +} +#pragma pop +#endif + +/* ############################################################################################## */ /* 8066EE88-8066EE8C 0000A0 0004+00 0/1 0/0 0/0 .rodata @4340 */ #pragma push #pragma force_active on @@ -1286,8 +1288,144 @@ COMPILER_STRIP_GATE(0x8066EE9C, &lit_4345); /* 80669050-8066973C 0013F0 06EC+00 2/1 0/0 0/0 .text do_walk__FP8do_class */ #ifdef NONMATCHING +// float literals + regalloc static void do_walk(do_class* i_dogP) { + cXyz local_5c; + i_dogP->field_0x648 = 1000.0; + + switch(i_dogP->mStayStatus+1) { + case 12: { + i_dogP->field_0x5b8 = i_dogP->orig.pos; + i_dogP->mSpeedF >= l_HIO.mRunSpeed ? i_dogP->field_0x5e8 = 1.7 : i_dogP->field_0x5e8 = 4.0; + + i_dogP->field_0x5ec = 1.7; + anm_init(i_dogP,ANM_WALK,0.0,2,i_dogP->field_0x5e8); + i_dogP->mStayStatus = 3; + break; + } + case 0: { + if (i_dogP->field_0x5f4 == 8) { + anm_init(i_dogP,ANM_SIT,0.0,0,1.0); + } + else { + anm_init(i_dogP,ANM_DOWN,0.0,0,1.0); + } + + i_dogP->mStayStatus++; + break; + } + + case 1: { + if (i_dogP->mpMorf->isStop()) { + i_dogP->mStayStatus++;; + } + break; + } + + case 2: { + local_5c.x = 0.0; + local_5c.y = 20.0; + + for (int i = 0; i < 100; i++) { + mDoMtx_YrotS((MtxP)calc_mtx,cM_rndF(65536.0)); + + local_5c.z = cM_rndF(100.0f * i_dogP->field_0x5b6); + MtxPosition(&local_5c,&i_dogP->field_0x5b8); + + i_dogP->field_0x5b8 += i_dogP->orig.pos; + + if (dansa_check(i_dogP,i_dogP->field_0x5b8,0.0) == 0) { + local_5c = i_dogP->field_0x5b8 - i_dogP->current.pos; + + if (local_5c.abs() > 300.0f) break; + } + } + + f32 rnd_number = cM_rndF(0.6); + i_dogP->field_0x5ec = rnd_number + 1.3; + i_dogP->field_0x5e8 = rnd_number + 1.3; + + anm_init(i_dogP,ANM_WALK,0.0,2,i_dogP->field_0x5e8); + + i_dogP->mStayStatus++; + } + + case 3: { + local_5c = i_dogP->field_0x5b8 - i_dogP->current.pos; + + cLib_addCalcAngleS2(&i_dogP->current.angle.y,(s16)cM_atan2s(local_5c.x,local_5c.z),0x10,0x100); + cLib_addCalc2(&i_dogP->mSpeedF,i_dogP->field_0x5e8 * l_HIO.mWalkSpeed,1.0,l_HIO.mWalkSpeed * 0.2); + + if (local_5c.abs() < 150.0) { + if (i_dogP->field_0x5b4 == 0) { + i_dogP->mAction = ACT_STAY; + i_dogP->mStayStatus = 0; + } else { + anm_init(i_dogP,ANM_WAIT,0.0,2,1.0); + i_dogP->field_0x5fc[0] = cM_rndF(50.0) + 20.0; + i_dogP->field_0x5ec = 1.0; + i_dogP->mStayStatus++; + } + } + + break; + } + + case 4: { + cLib_addCalc0(&i_dogP->mSpeedF,1.0,1.0); + + if (i_dogP->field_0x5fc[0] == 0) { + i_dogP->mStayStatus = 2; + } + + break; + } + + case 10: { + cLib_addCalc0(&i_dogP->mSpeedF,1.0,1.0); + cLib_addCalcAngleS2(&i_dogP->current.angle.y,i_dogP->mAngleYFromPlayer,4,0x400); + + i_dogP->field_0x616 = 1; + i_dogP->field_0x648 = 2000.0; + + s16 angle_diff = i_dogP->current.angle.y - i_dogP->mAngleYFromPlayer; + + if (angle_diff < 0) { + angle_diff *= -1; + } + + if (angle_diff < 0x800) { + i_dogP->mStayStatus++; + anm_init(i_dogP,ANM_WAIT,0.0,2,1.0); + i_dogP->field_0x5ec = 1.0; + i_dogP->field_0x5fc[0] = cM_rndF(10.0) + 10.0; + } + + break; + } + + case 11: { + i_dogP->field_0x616 = 1; + i_dogP->field_0x648 = 3000.0; + if (i_dogP->field_0x5fc[0] == 0) { + i_dogP->mAction = ACT_WALK_RUN; + i_dogP->mStayStatus = 0; + return; + } + break; + } + + } + cLib_addCalc2(&i_dogP->field_0x5e8,i_dogP->field_0x5ec,1.0,0.05); + i_dogP->mpMorf->setPlaySpeed(i_dogP->field_0x5e8); + + if (i_dogP->field_0x5fc[2] == 0 && i_dogP->mStayStatus < 10 && i_dogP->mDistFromPlayer < l_HIO.mPlayerRecogniztionDist) { + anm_init(i_dogP,ANM_STEP_2,0.0,2,1.0); + i_dogP->mStayStatus = 10; + } + + move_dansa_check(i_dogP,i_dogP->mSpeedF); } #else #pragma push @@ -1477,7 +1615,176 @@ static void do_run_walk(do_class* i_dogP) { /* 80669B80-8066A1C4 001F20 0644+00 2/1 0/0 0/0 .text do_wait_1__FP8do_class */ #ifdef NONMATCHING static void do_wait_1(do_class* i_dogP) { - + fopAc_ac_c* player = dComIfGp_getPlayer(0); + i_dogP->field_0x616 = 1; + i_dogP->field_0x648 = 2000.0; + + s16 player_angle = i_dogP->mAngleYFromPlayer; + s16 angle_diff = i_dogP->current.angle.y - player_angle; + + if (angle_diff < 0) { + angle_diff *= -1; + } + + s16 some_val = 0x3000; + + if ((i_dogP->field_0x5f0 & 0x7fU) == 0) { + some_val = 0x1000; + } + + switch(i_dogP->mStayStatus) { + case 0: { + if (i_dogP->mDistFromPlayer <= i_dogP->field_0x674.z * 320.0) { + anm_init(i_dogP,ANM_WAIT,0.0,2,0.0); + i_dogP->mStayStatus++; + } else { + anm_init(i_dogP,ANM_JOYFUL,0.0,2,cM_rndFX(0.1) + 0.6); + i_dogP->mStayStatus = -1; + } + // goto default; + } + case 2: { + cLib_addCalcAngleS2(&i_dogP->current.angle.y,player_angle,4,0x400); + + if (angle_diff < 0x800) { + i_dogP->mStayStatus = 0; + } + + break; + } + case 3: { + if (75.0 <= i_dogP->mEyePosYDistFromPlayer) { + i_dogP->mStayStatus = 1; + } else if (i_dogP->field_0x5fc[0] == 0) { + if (30.0 <= i_dogP->mEyePosYDistFromPlayer) { + i_dogP->mAction = ACT_SIT; + i_dogP->mStayStatus = 0; + } else { + i_dogP->mAction = ACT_STAY; + i_dogP->mStayStatus = 10; + } + } + break; + } + case 5: { + cLib_addCalcAngleS2(&i_dogP->current.angle.y,player_angle + i_dogP->field_0x654,4,0x800); + cLib_addCalcAngleS2(&i_dogP->field_0x654,i_dogP->field_0x656,4,0x1000); + cLib_addCalc2(&i_dogP->current.pos.x,i_dogP->field_0x5b8.x,0.2,3.5); + cLib_addCalc2(&i_dogP->current.pos.z,i_dogP->field_0x5b8.z,0.2,3.5); + + if (i_dogP->field_0x5fc[0] == 0) { + i_dogP->mStayStatus = 0; + } + break; + } + case 6: { + i_dogP->field_0x648 = 4000.0; + + if (i_dogP->field_0x674.z * 176.0 < i_dogP->mDistFromPlayer) { + i_dogP->mStayStatus = 0; + } + } + default: { + if (some_val < angle_diff) { + anm_init(i_dogP,ANM_STEP_2,0.0,2,0.0); + i_dogP->mStayStatus = 2; + } else if (75.0 <= i_dogP->mEyePosYDistFromPlayer) { + + // i_dogP->field_0x674.z might be a store in a variable + if (i_dogP->field_0x674.z * 96.0 <= i_dogP->mDistFromPlayer) { + if ((i_dogP->mStayStatus != 6) && (i_dogP->mDistFromPlayer < i_dogP->field_0x674.z * 120.0)) { + anm_init(i_dogP,ANM_JOYFUL,0.0,2,cM_rndFX(0.1) + 1.0); + i_dogP->mStayStatus = 6; + } + } else { + cXyz local_68; + local_68.x = 0.0; + f32 dVar10 = 20.0; + local_68.y = 20.0; + + f32 dVar11 = -176.0; + f32 dVar12 = 0.2000000029802322; + + for (int i = 0; i < 20; i++) { + if (i < 10) { + mDoMtx_YrotS((MtxP)calc_mtx,i_dogP->mAngleYFromPlayer + cM_rndFX(5000.0)); + } else { + mDoMtx_YrotS((MtxP)calc_mtx,cM_rndF(65536.0)); + } + + local_68.z = dVar11 * i_dogP->field_0x674.z; + + MtxPosition(&local_68,&i_dogP->field_0x5b8); + i_dogP->field_0x5b8 += player->current.pos; + + if (cM_rndF(1.0) < dVar12) break; + + // local_74 = i_dogP->field6_0x5b8; + if (dansa_check(i_dogP,i_dogP->field_0x5b8,0.0) == 0) break; + + i_dogP->mUnkPos = i_dogP->field_0x5b8; + i_dogP->field_0x624 = dVar10 + cM_rndF(10.0); + } + + i_dogP->mStayStatus = 5; + i_dogP->field_0x656 = cM_rndFX(10000.0); + + anm_init(i_dogP,ANM_WALK,0.0,2,0.0); + i_dogP->field_0x5fc[0] = cM_rndF(10.0) + 15.0; + } + } + else { + i_dogP->mStayStatus = 3; + i_dogP->field_0x5fc[0] = cM_rndF(10.0) + 10.0; + } + break; + } + case 10: { + i_dogP->field_0x5e8 = 5.0; + anm_init(i_dogP,ANM_WALK,0.0,2,i_dogP->field_0x5e8); + + i_dogP->mStayStatus++; + } + case 11: { + cLib_addCalc2(&i_dogP->field_0x5e8,2.0,1.0,0.2); + i_dogP->mpMorf->setPlaySpeed(i_dogP->field_0x5e8); + + if (i_dogP->field_0x5e8 <= 2.2) { + i_dogP->mStayStatus = 0; + } + + break; + } + case -1: {} + case 1: { + // goto default; + } + } + + cLib_addCalc0(&i_dogP->mSpeedF,1.0,1.0); + + if (i_dogP->field_0x674.z * 240.0 < i_dogP->mDistFromPlayer && !dansa_check2(i_dogP,0.0) && i_dogP->mStayStatus < 10) { + i_dogP->mAction = ACT_WALK_RUN; + i_dogP->field_0x5e8 = 1.5; + anm_init(i_dogP,ANM_WALK,0.0,2,i_dogP->field_0x5e8); + i_dogP->mStayStatus = 1; + } + + // might be a seperate variable for link + if (daPy_getLinkPlayerActorClass()->checkCanoeRide() && i_dogP->mDistFromPlayer < 1000.0) { + i_dogP->mAction = ACT_HELP; + i_dogP->mStayStatus = 0; + } + + if (i_dogP->field_0x5b4 == 2) { + f32 distance = i_dogP->mDistFromPlayer * 0.0215; + + if (127.0 < distance) { + distance = 127.0; + } + + i_dogP->mSound.startLevelSound(JAISoundID(Z2SE_DOG_V_CALL_HELP),distance,-1); + } } #else #pragma push