mirror of https://github.com/zeldaret/tp.git
4565 lines
154 KiB
C++
4565 lines
154 KiB
C++
/**
|
|
* @file d_a_horse.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h"
|
|
|
|
#include "d/actor/d_a_horse.h"
|
|
#include "d/actor/d_a_alink.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/actor/d_a_hozelda.h"
|
|
#include "d/actor/d_a_cow.h"
|
|
#include "d/actor/d_a_tag_hstop.h"
|
|
#include "d/d_demo.h"
|
|
#include "d/d_meter2_info.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
#include <cmath.h>
|
|
|
|
#define ANM_HS_BACK_WALK 6
|
|
#define ANM_HS_WALK_START 7
|
|
#define ANM_HS_EXCITEMENT 8
|
|
#define ANM_HS_EXCITEMENT_2 9
|
|
#define ANM_HS_JUMP_END 10
|
|
#define ANM_HS_JUMP_MIDDLE 11
|
|
#define ANM_HS_JUMP_START 12
|
|
#define ANM_HS_JUMP_START_CLIFT 13
|
|
#define ANM_HS_LASH 14
|
|
#define ANM_HS_NECK_WAITBACK_LEFT 15
|
|
#define ANM_HS_NECK_WAITBACK_RIGHT 16
|
|
#define ANM_HS_RUN_DASH 17
|
|
#define ANM_HS_RUN_FAST 18
|
|
#define ANM_HS_RUN_SLOW 19
|
|
#define ANM_HS_STAND 20
|
|
#define ANM_HS_STOP_SLOW 21
|
|
#define ANM_HS_STOP_STAND 22
|
|
#define ANM_HS_TURN_LEFT 23
|
|
#define ANM_HS_TURN_LEFT_START 24
|
|
#define ANM_HS_TURN_RIGHT 25
|
|
#define ANM_HS_TURN_RIGHT_START 26
|
|
#define ANM_HS_WAIT_01 27
|
|
#define ANM_HS_WAIT_01B 28
|
|
#define ANM_HS_WAIT_01B_CONNECT 29
|
|
#define ANM_HS_WAIT_02 30
|
|
#define ANM_HS_WAIT_03 31
|
|
#define ANM_HS_WAIT_04 32
|
|
#define ANM_HS_WAIT_05 33
|
|
#define ANM_HS_WALK_FAST 34
|
|
#define ANM_HS_WALK_SLOW 35
|
|
|
|
/* 808454AC-808454B8 000000 000C+00 41/41 0/0 0/0 .rodata @3894 */
|
|
static u8 const lit_3894[12] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
/* 808454B8-808454C0 00000C 0006+02 2/6 0/0 0/0 .rodata l_arcName */
|
|
static char const l_arcName[] = "Horse";
|
|
|
|
/* 808454C0-808454C8 000014 0008+00 2/5 0/0 0/0 .rodata m_footJointTable__9daHorse_c */
|
|
const u16 daHorse_c::m_footJointTable[] = {
|
|
3, 7, 27, 31,
|
|
};
|
|
|
|
/* 808454C8-808454CC 00001C 0004+00 0/0 0/0 0/0 .rodata m_callLimitDistance2__9daHorse_c */
|
|
const f32 daHorse_c::m_callLimitDistance2 = 640000.0f;
|
|
|
|
/* 808454CC-808455F0 000020 0124+00 1/20 0/0 0/0 .rodata m__14daHorse_hio_c0 */
|
|
const daHorse_hio_c1 daHorse_hio_c0::m = {
|
|
600,
|
|
50,
|
|
45,
|
|
7,
|
|
14,
|
|
8,
|
|
90,
|
|
210,
|
|
15,
|
|
7,
|
|
13,
|
|
8,
|
|
3,
|
|
45,
|
|
42.0f,
|
|
1.0f,
|
|
0.8f,
|
|
1.5f,
|
|
1.2f,
|
|
1.5f,
|
|
1.0f,
|
|
0.08f,
|
|
0.45f,
|
|
0.9f,
|
|
1.1f,
|
|
5.0f,
|
|
1.4f,
|
|
0.4f,
|
|
2.0f,
|
|
6.5f,
|
|
1.0f,
|
|
0.5f,
|
|
1.0f,
|
|
1.1f,
|
|
5.0f,
|
|
45.0f,
|
|
1.7f,
|
|
2.5f,
|
|
1.1f,
|
|
5.0f,
|
|
57.0f,
|
|
50.0f,
|
|
31.0f,
|
|
2.0f,
|
|
12.0f,
|
|
1.7f,
|
|
4.0f,
|
|
1.0f,
|
|
0.0f,
|
|
1.0f,
|
|
1.0f,
|
|
1.0f,
|
|
1.0f,
|
|
9.0f,
|
|
40.0f,
|
|
350.0f,
|
|
150.0f,
|
|
100.0f,
|
|
1000.0f,
|
|
50.0f,
|
|
40.0f,
|
|
1.3f,
|
|
0.5f,
|
|
4.0f,
|
|
0.7f,
|
|
2.0f,
|
|
3.0f,
|
|
0.3f,
|
|
7.0f,
|
|
6.0f,
|
|
1.0f,
|
|
2.0f,
|
|
2.0f,
|
|
9.0f,
|
|
125.0f,
|
|
0.0f,
|
|
35.0f,
|
|
1.1f,
|
|
1.3f,
|
|
15.0f,
|
|
};
|
|
|
|
/* 80837F2C-8083836C 0000EC 0440+00 1/1 0/0 0/0 .text setReinPos__13daHorseRein_cFi */
|
|
// NONMATCHING
|
|
void daHorseRein_c::setReinPos(int param_0) {
|
|
cXyz* var_r27 = &field_0x0[0][param_0];
|
|
var_r27++;
|
|
|
|
cXyz spE0 = *field_0x0[0] - *var_r27;
|
|
spE0.normalizeZP();
|
|
|
|
f32 var_f31 = (f32)param_0 / (f32)field_0x8[0];
|
|
f32 var_f30 = var_f31 * var_f31;
|
|
|
|
spE0 *= (1.0f - var_f30) * 3.0f;
|
|
|
|
spE0.y += -4.5f;
|
|
spE0.x += var_f30 * field_0x10;
|
|
spE0.z += var_f30 * field_0x14;
|
|
|
|
cXyz* var_r28 = &field_0x0[0][param_0];
|
|
cXyz* var_r25 = &field_0x0[1][param_0];
|
|
cXyz spD4(*var_r28);
|
|
|
|
cXyz spC8 = ((*var_r28 - *var_r27) + *var_r25) + spE0;
|
|
|
|
if (field_0x18 > 0.0f) {
|
|
cXyz spBC = field_0x1c - *var_r27;
|
|
spBC.normalizeZP();
|
|
|
|
spC8 += spBC * field_0x18;
|
|
field_0x18 -= 1.1764706f;
|
|
}
|
|
|
|
spC8.normalizeZP();
|
|
*var_r28 = *var_r27 + (spC8 * 5.5f);
|
|
|
|
spC8 = *var_r28 - *field_0x0[0];
|
|
|
|
f32 var_f29 = spC8.abs();
|
|
f32 var_f28 = (f32)param_0 * 5.5f * 1.2f;
|
|
if (var_f29 > var_f28) {
|
|
spC8 *= var_f28 / var_f29;
|
|
*var_r28 = ((*field_0x0[0] + spC8) * (1.0f - var_f31)) + (*var_r28 * var_f31);
|
|
}
|
|
|
|
*var_r25 = (*var_r28 - spD4) * 0.2f;
|
|
}
|
|
|
|
/* 808383A8-80838498 000568 00F0+00 2/2 0/0 0/0 .text setReinPosPart__13daHorseRein_cFi
|
|
*/
|
|
void daHorseRein_c::setReinPosPart(int param_0) {
|
|
field_0x8[0] = param_0 + 1;
|
|
field_0x0[1][param_0] = cXyz::Zero;
|
|
|
|
cXyz* var_r25 = &field_0x0[0][param_0];
|
|
|
|
int var_r28 = field_0x8[1] - 1;
|
|
cXyz* var_r27 = &field_0x0[0][var_r28];
|
|
cXyz* var_r26 = &field_0x0[1][var_r28];
|
|
|
|
for (int i = var_r28; i > param_0; i--, var_r27--, var_r26--) {
|
|
*var_r27 = *var_r25;
|
|
*var_r26 = cXyz::Zero;
|
|
}
|
|
|
|
for (int i = param_0 - 1; i > 0; i--) {
|
|
setReinPos(i);
|
|
}
|
|
}
|
|
|
|
/* 808458F4-808458F8 000020 0004+00 1/2 0/0 0/0 .data l_autoUpHeight */
|
|
static f32 l_autoUpHeight = 50.0f;
|
|
|
|
/* 808458F8-8084593C 000024 0044+00 0/1 0/0 0/0 .data l_cylSrc */
|
|
static dCcD_SrcCyl l_cylSrc = {
|
|
{
|
|
{0x0, {{AT_TYPE_HORSE, 0x1, 0x12}, {0xd8fbfdff, 0x9}, 0x79}}, // mObj
|
|
{dCcD_SE_HARD_BODY, 0x1, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x226}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
50.0f, // mRadius
|
|
230.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
|
|
/* 8084593C-8084597C 000068 0040+00 0/1 0/0 0/0 .data l_sphSrc */
|
|
static dCcD_SrcSph l_sphSrc = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x9}, 0x79}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x226}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 35.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 80838498-80838750 000658 02B8+00 2/2 0/0 0/0 .text
|
|
* coHitCallbackBoarJump__9daHorse_cFP10fopAc_ac_c */
|
|
void daHorse_c::coHitCallbackBoarJump(fopAc_ac_c* i_hitActor) {
|
|
if (!dComIfGp_event_runCheck() &&
|
|
!checkEndResetStateFlg0(daHorse_ERFLG0(ERFLG0_UNK_4 | ERFLG0_UNK_2 | ERFLG0_UNK_1)) &&
|
|
fopAcM_GetName(i_hitActor) == PROC_E_WB &&
|
|
((fopEn_enemy_c*)i_hitActor)->checkDownFlg())
|
|
{
|
|
f32 sin_y = cM_ssin(current.angle.y);
|
|
f32 cos_y = cM_scos(current.angle.y);
|
|
f32 jump_chk_dist = (daHorse_hio_c0::m.boar_jump_horizontal + daHorse_hio_c0::m.boar_jump_horizontal) + 100.0f;
|
|
|
|
cXyz start(current.pos);
|
|
cXyz end(start.x + (jump_chk_dist * sin_y), start.y, start.z + (jump_chk_dist * cos_y));
|
|
|
|
int i;
|
|
for (i = 0; i < 3; i++) {
|
|
start.y = current.pos.y + m_acchcir[i].GetWallH();
|
|
end.y = start.y;
|
|
m_linechk.Set(&start, &end, this);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&m_linechk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(m_linechk, &plane);
|
|
|
|
if (cBgW_CheckBWall(plane.mNormal.y)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (i == 3) {
|
|
cXyz chk_pos;
|
|
chk_pos.y = current.pos.y + 200.0f;
|
|
|
|
while (jump_chk_dist > 0.0f) {
|
|
chk_pos.x = current.pos.x + (jump_chk_dist * sin_y);
|
|
chk_pos.z = current.pos.z + (jump_chk_dist * cos_y);
|
|
|
|
if (!fopAcM_gc_c::gndCheck(&chk_pos) || fopAcM_gc_c::getHorseNoEntry()) {
|
|
break;
|
|
}
|
|
|
|
jump_chk_dist -= 25.0f;
|
|
}
|
|
}
|
|
|
|
if (jump_chk_dist <= 0.0f) {
|
|
onEndResetStateFlg0(ERFLG0_UNK_20);
|
|
field_0x1768 = daHorse_hio_c0::m.boar_jump_horizontal;
|
|
field_0x176c = daHorse_hio_c0::m.boar_jump_height + current.pos.y;
|
|
field_0x1770 = field_0x1768;
|
|
} else if (m_procID == PROC_MOVE_e && speedF > 5.0f) {
|
|
setBoarHit(this, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80838798-80838904 000958 016C+00 1/1 0/0 0/0 .text
|
|
* coHitCallbackBoarHit__9daHorse_cFP10fopAc_ac_cP12dCcD_GObjInf */
|
|
void daHorse_c::coHitCallbackBoarHit(fopAc_ac_c* i_hitActor, dCcD_GObjInf* i_hitGObj) {
|
|
if (!dComIfGp_event_runCheck() &&
|
|
((m_procID == PROC_MOVE_e && speedF > 5.0f) || checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000))) &&
|
|
checkStateFlg0(FLG0_UNK_1) &&
|
|
fopAcM_GetName(i_hitActor) == PROC_E_WB &&
|
|
!((fopEn_enemy_c*)i_hitActor)->checkDownFlg())
|
|
{
|
|
if (checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000))) {
|
|
m_cowHitAngle = fopAcM_searchActorAngleY(i_hitActor, this);
|
|
if (m_cowHitAngle > 0x5000) {
|
|
m_cowHitAngle = 0x5000;
|
|
} else if (m_cowHitAngle < -0x5000) {
|
|
m_cowHitAngle = -0x5000;
|
|
} else if (abs(m_cowHitAngle) < 0x3000) {
|
|
if (m_cowHitAngle > 0) {
|
|
m_cowHitAngle = 0x3000;
|
|
} else {
|
|
m_cowHitAngle = -0x3000;
|
|
}
|
|
}
|
|
|
|
m_cowHit = 5;
|
|
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER3, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
if (checkStateFlg0(FLG0_UNK_100000)) {
|
|
procLargeDamageInit();
|
|
}
|
|
} else {
|
|
setBoarHit(i_hitActor, i_hitGObj->GetStts()->GetWeightUc() == 0xFE);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80838904-80838A20 000AC4 011C+00 2/2 0/0 0/0 .text
|
|
* coHitCallbackCowHit__9daHorse_cFP10fopAc_ac_c */
|
|
void daHorse_c::coHitCallbackCowHit(fopAc_ac_c* i_hitActor) {
|
|
if ((fopAcM_GetName(i_hitActor) == PROC_COW) && ((daCow_c*)i_hitActor)->isAngry()) {
|
|
((daCow_c*)i_hitActor)->setAngryHit();
|
|
|
|
if (!dComIfGp_event_runCheck() && checkStateFlg0(FLG0_UNK_1)) {
|
|
m_cowHitAngle = fopAcM_searchActorAngleY(i_hitActor, this);
|
|
if ((s16)(m_cowHitAngle - shape_angle.y) >= 0) {
|
|
field_0x1702 = -0x500;
|
|
} else {
|
|
field_0x1702 = 0x500;
|
|
}
|
|
|
|
m_cowHit = 5;
|
|
}
|
|
} else if (fopAcM_GetName(i_hitActor) == PROC_ALINK) {
|
|
if (daAlink_getAlinkActorClass()->checkSlideMode()) {
|
|
onEndResetStateFlg0(ERFLG0_UNK_800);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80838A20-80838A44 000BE0 0024+00 1/1 0/0 0/0 .text
|
|
* daHorse_coHitCallbackBoarJump__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */
|
|
static void daHorse_coHitCallbackBoarJump(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA,
|
|
fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) {
|
|
((daHorse_c*)i_coActorA)->coHitCallbackBoarJump(i_coActorB);
|
|
}
|
|
|
|
/* 80838A44-80838A68 000C04 0024+00 1/1 0/0 0/0 .text
|
|
* daHorse_coHitCallbackCowHit__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */
|
|
static void daHorse_coHitCallbackCowHit(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA,
|
|
fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) {
|
|
((daHorse_c*)i_coActorA)->coHitCallbackCowHit(i_coActorB);
|
|
}
|
|
|
|
/* 80838A68-80838AC4 000C28 005C+00 1/1 0/0 0/0 .text
|
|
* daHorse_coHitCallbackAll__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */
|
|
static void daHorse_coHitCallbackAll(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA,
|
|
fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) {
|
|
daHorse_c* a_this = (daHorse_c*)i_coActorA;
|
|
|
|
a_this->coHitCallbackBoarJump(i_coActorB);
|
|
a_this->coHitCallbackBoarHit(i_coActorB, i_coObjInfB);
|
|
a_this->coHitCallbackCowHit(i_coActorB);
|
|
}
|
|
|
|
/* 80838AC4-80838B78 000C84 00B4+00 1/1 0/0 0/0 .text daHorse_searchEnemy__FP10fopAc_ac_cPv */
|
|
static void* daHorse_searchEnemy(fopAc_ac_c* i_actor, void* i_data) {
|
|
daHorse_c* horse_p = dComIfGp_getHorseActor();
|
|
f32 search_dist = *(f32*)i_data;
|
|
|
|
if (fopAcM_GetGroup(i_actor) == fopAc_ENEMY_e && fopAcM_GetName(i_actor) != PROC_E_WS && horse_p->current.pos.abs2XZ(i_actor->current.pos) < search_dist * search_dist) {
|
|
return i_actor;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 80838B78-80838F3C 000D38 03C4+00 1/1 0/0 0/0 .text modelCallBack__9daHorse_cFi */
|
|
int daHorse_c::modelCallBack(int i_jntNo) {
|
|
if (i_jntNo == 0) {
|
|
if (m_procID == PROC_TOOL_DEMO_e) {
|
|
J3DTransformInfo* var_r24 = m_oldFrame->getOldFrameTransInfo(i_jntNo);
|
|
var_r24->mTranslate.x = 0.0f;
|
|
var_r24->mTranslate.z = 0.0f;
|
|
|
|
MtxP m = m_model->getAnmMtx(i_jntNo);
|
|
m[0][3] = current.pos.x;
|
|
m[2][3] = current.pos.z;
|
|
cMtx_copy(m, J3DSys::mCurrentMtx);
|
|
}
|
|
} else if (i_jntNo == 3 || i_jntNo == 7 || i_jntNo == 11 || i_jntNo == 22 || i_jntNo == 24 || i_jntNo == 27 || i_jntNo == 31) {
|
|
if (i_jntNo == 11) {
|
|
MtxP m = m_model->getAnmMtx(11);
|
|
mDoMtx_stack_c::transS(m[0][3], m[1][3], m[2][3]);
|
|
mDoMtx_stack_c::YrotM(field_0x16f0);
|
|
mDoMtx_stack_c::transM(-m[0][3], -m[1][3], -m[2][3]);
|
|
mDoMtx_stack_c::concat(m);
|
|
} else {
|
|
mDoMtx_stack_c::copy(m_model->getAnmMtx(i_jntNo));
|
|
}
|
|
|
|
if (i_jntNo == 27 || i_jntNo == 31 || i_jntNo == 22 || i_jntNo == 24) {
|
|
mDoMtx_stack_c::ZrotM((shape_angle.x >> 1));
|
|
} else {
|
|
mDoMtx_stack_c::ZrotM(-(shape_angle.x >> 1));
|
|
}
|
|
|
|
m_model->setAnmMtx(i_jntNo, mDoMtx_stack_c::get());
|
|
mDoMtx_copy(m_model->getAnmMtx(i_jntNo), J3DSys::mCurrentMtx);
|
|
} else if ((!checkEndResetStateFlg0(ERFLG0_UNK_40) && (i_jntNo == 35 || i_jntNo == 36 || i_jntNo == 37)) || i_jntNo == 2 || i_jntNo == 26) {
|
|
Quaternion sp20;
|
|
Quaternion sp10;
|
|
BOOL spC;
|
|
s16 sp8;
|
|
if (i_jntNo == 2 || i_jntNo == 26) {
|
|
sp8 = -field_0x16fa;
|
|
spC = FALSE;
|
|
} else {
|
|
sp8 = field_0x16d4[i_jntNo - 35];
|
|
spC = TRUE;
|
|
}
|
|
|
|
JMAEulerToQuat(0, sp8, 0, &sp10);
|
|
mDoMtx_QuatConcat(m_oldFrame->getOldFrameQuaternion(i_jntNo), &sp10, &sp20);
|
|
|
|
J3DTransformInfo* var_r27 = m_oldFrame->getOldFrameTransInfo(i_jntNo);
|
|
mDoMtx_stack_c::transS(var_r27->mTranslate.x, var_r27->mTranslate.y, var_r27->mTranslate.z);
|
|
mDoMtx_stack_c::quatM(m_oldFrame->getOldFrameQuaternion(i_jntNo));
|
|
mDoMtx_stack_c::inverse();
|
|
|
|
MtxP m = m_model->getAnmMtx(i_jntNo);
|
|
cMtx_concat(m, mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
MTXQuat(m, &sp20);
|
|
m[0][3] = var_r27->mTranslate.x;
|
|
m[1][3] = var_r27->mTranslate.y;
|
|
m[2][3] = var_r27->mTranslate.z;
|
|
cMtx_concat(J3DSys::mCurrentMtx, m, J3DSys::mCurrentMtx);
|
|
cMtx_copy(J3DSys::mCurrentMtx, m);
|
|
|
|
if (spC) {
|
|
*m_oldFrame->getOldFrameQuaternion(i_jntNo) = sp20;
|
|
}
|
|
} else if (i_jntNo == 34) {
|
|
setFootMatrix();
|
|
}
|
|
|
|
if (m_anmRatio[2].getAnmTransform() != NULL) {
|
|
if (i_jntNo == 10) {
|
|
m_anmRatio[2].setRatio(1.0f);
|
|
} else if (i_jntNo == 20) {
|
|
m_anmRatio[2].setRatio(0.0f);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80838F3C-80838F80 0010FC 0044+00 1/1 0/0 0/0 .text daHorse_modelCallBack__FP8J3DJointi
|
|
*/
|
|
static int daHorse_modelCallBack(J3DJoint* i_joint, int param_1) {
|
|
int jnt_no = i_joint->getJntNo();
|
|
daHorse_c* a_this = (daHorse_c*)j3dSys.getModel()->getUserArea();
|
|
|
|
if (param_1 == 0) {
|
|
a_this->modelCallBack(jnt_no);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80838F80-80838F98 001140 0018+00 1/1 0/0 0/0 .text daHorse_searchSingleBoar__FP10fopAc_ac_cPv
|
|
*/
|
|
static void* daHorse_searchSingleBoar(fopAc_ac_c* i_actor, void* i_data) {
|
|
if (fopAcM_GetName(i_actor) == PROC_E_WB) {
|
|
*(fopAc_ac_c**)i_data = i_actor;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* 80838F98-808392D8 001158 0340+00 1/1 0/0 0/0 .text createHeap__9daHorse_cFv */
|
|
int daHorse_c::createHeap() {
|
|
m_modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 0x26);
|
|
JUT_ASSERT(0x487, m_modelData != 0);
|
|
|
|
m_model = mDoExt_J3DModel__create(m_modelData, 0x80000, 0x11020084);
|
|
if (m_model == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
J3DTransformInfo* transInfoBuf = new J3DTransformInfo[38];
|
|
if (transInfoBuf == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
Quaternion* quatBuf = new Quaternion[38];
|
|
if (quatBuf == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
m_oldFrame = new mDoExt_MtxCalcOldFrame(transInfoBuf, quatBuf);
|
|
if (m_oldFrame == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
m_mtxcalc = new mDoExt_MtxCalcAnmBlendTblOld(m_oldFrame, 3, m_anmRatio);
|
|
if (m_mtxcalc == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!m_btp.init(m_modelData, (J3DAnmTexPattern*)dComIfG_getObjectRes(l_arcName, 0x29), FALSE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1)) {
|
|
return 0;
|
|
}
|
|
|
|
m_hio = new daHorse_hio_c();
|
|
if (m_hio == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
ResTIMG* texImg = (ResTIMG*)dComIfG_getObjectRes(l_arcName, 0x2C);
|
|
JUT_ASSERT(0x4B6, texImg != 0);
|
|
|
|
if (!m_reinLine.init(1, 75, texImg, 0)) {
|
|
return 0;
|
|
}
|
|
|
|
m_rein[0].field_0x8[1] = 35;
|
|
m_rein[1].field_0x8[1] = 35;
|
|
m_rein[2].field_0x8[1] = 5;
|
|
|
|
daHorseRein_c* rein_p = m_rein;
|
|
for (int i = 0; i < 3; i++) {
|
|
rein_p->field_0x0[0] = new cXyz[rein_p->field_0x8[1]];
|
|
if (rein_p->field_0x0[0] == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
rein_p->field_0x0[1] = new cXyz[rein_p->field_0x8[1]];
|
|
if (rein_p->field_0x0[1] == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
rein_p++;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808393EC-8083940C 0015AC 0020+00 1/1 0/0 0/0 .text daHorse_createHeap__FP10fopAc_ac_c
|
|
*/
|
|
static int daHorse_createHeap(fopAc_ac_c* i_this) {
|
|
return ((daHorse_c*)i_this)->createHeap();
|
|
}
|
|
|
|
/* 8083940C-80839498 0015CC 008C+00 1/1 0/0 0/0 .text checkEnding__9daHorse_cFv */
|
|
BOOL daHorse_c::checkEnding() {
|
|
return (daAlink_c::checkStageName("F_SP108") && dComIfG_play_c::getLayerNo(0) == 4) ||
|
|
(daAlink_c::checkStageName("F_SP104") && dComIfG_play_c::getLayerNo(0) == 12 && dComIfGp_roomControl_getStayNo() == 1);
|
|
}
|
|
|
|
/* 80839498-80839CFC 001658 0864+00 1/1 0/0 0/0 .text create__9daHorse_cFv */
|
|
int daHorse_c::create() {
|
|
fopAcM_SetupActor(this, daHorse_c);
|
|
|
|
if (checkEnding()) {
|
|
onStateFlg0(FLG0_UNK_8000);
|
|
}
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_8000) &&
|
|
/* Cutscene - Cutscene - attacked by monsters at Ordon spring */
|
|
(((dComIfGs_isEventBit(dSv_event_flag_c::M_008)
|
|
/* Main Event - Epona rescued flag */
|
|
&& !dComIfGs_isEventBit(dSv_event_flag_c::M_023))
|
|
&& (!daAlink_c::checkStageName("F_SP109")
|
|
/* Death Mountain - First saw Goron cutscene on mountain path */
|
|
|| !dComIfGs_isEventBit(dSv_event_flag_c::F_0066)))
|
|
/* General use - When on (while changing scenes) stage name is not shown */
|
|
|| dComIfGs_isTmpBit(dSv_event_tmp_flag_c::NO_TELOP)))
|
|
{
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
int phase_state = dComIfG_resLoad(&m_phase, l_arcName);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
if (daAlink_getAlinkActorClass() == NULL) {
|
|
return cPhs_INIT_e;
|
|
}
|
|
|
|
if (dComIfGp_getHorseActor() != NULL) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
int room_no;
|
|
if (((fopAcM_GetParam(this) >> 8) & 0xF) == 1) {
|
|
room_no = fopAcM_GetRoomNo(this);
|
|
} else {
|
|
room_no = -1;
|
|
}
|
|
|
|
m_checkSpecialWallHit = &daHorse_c::checkSpecialWallHitSubstance;
|
|
m_setReinPosHand = &daHorse_c::setReinPosHandSubstance;
|
|
m_setReinPosNormal = &daHorse_c::setReinPosNormalSubstance;
|
|
m_callHorse = &daHorse_c::callHorseSubstance;
|
|
m_setHorsePosAngle = &daHorse_c::setHorsePosAndAngleSubstance;
|
|
m_onRideFlg = &daHorse_c::onRideFlgSubstance;
|
|
m_offRideFlg = &daHorse_c::offRideFlgSubstance;
|
|
|
|
if (!daAlink_getAlinkActorClass()->checkHorseStart() && !checkStateFlg0(FLG0_UNK_8000)) {
|
|
if (strcmp(dComIfGs_getHorseRestartStageName(), "") != 0
|
|
/* dSv_event_flag_c::M_002 - Cutscene - [cutscene: 2] Met with Ilia (brings horse to spring) */
|
|
&& (!dComIfGs_isEventBit(0x1580)
|
|
/* dSv_event_flag_c::M_023 - Main Event - Epona rescued flag */
|
|
|| dComIfGs_isEventBit(0x601))) {
|
|
if (daAlink_c::checkStageName(dComIfGs_getHorseRestartStageName()) && (room_no == -1 || fopAcM_GetRoomNo(this) == dComIfGs_getHorseRestartRoomNo())) {
|
|
current.pos = dComIfGs_getHorseRestartPos();
|
|
old.pos = current.pos;
|
|
shape_angle.y = dComIfGs_getHorseRestartAngleY();
|
|
current.angle.y = shape_angle.y;
|
|
fopAcM_SetRoomNo(this, dComIfGs_getHorseRestartRoomNo());
|
|
} else {
|
|
onStateFlg0(FLG0_NO_DRAW_WAIT);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!fopAcM_entrySolidHeap(this, daHorse_createHeap, 0x6E60)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (daAlink_c::checkStageName("F_SP00") || daAlink_c::checkStageName("F_SP103") || daAlink_c::checkStageName("F_SP104") || daAlink_c::checkStageName("F_SP108") || daAlink_c::checkStageName("F_SP113")) {
|
|
onStateFlg0(FLG0_UNK_2000);
|
|
m_normalMaxSpeedF = daHorse_hio_c0::m.kakariko_max_speed;
|
|
m_lashAddSpeed = daHorse_hio_c0::m.kakariko_add_lash_speed;
|
|
} else {
|
|
m_normalMaxSpeedF = daHorse_hio_c0::m.max_speed;
|
|
m_lashAddSpeed = daHorse_hio_c0::m.add_lash_speed;
|
|
}
|
|
|
|
field_0x16c2 = daHorse_hio_c0::m.max_turn;
|
|
m_flowID = shape_angle.z;
|
|
if (m_flowID == 0) {
|
|
m_flowID = 5000;
|
|
}
|
|
|
|
shape_angle.z = 0;
|
|
current.angle.z = 0;
|
|
|
|
m_path = dPath_GetRoomPath(fopAcM_GetParam(this) & 0xFF, room_no);
|
|
if (m_path != NULL) {
|
|
m_rodeoPath = dPath_GetNextRoomPath(m_path, room_no);
|
|
}
|
|
|
|
m_rodeoPoint = 1;
|
|
|
|
m_modelData->getJointNodePointer(0)->setMtxCalc(m_mtxcalc);
|
|
fopAcM_SetMtx(this, m_model->getBaseTRMtx());
|
|
|
|
m_cc_stts.Init(0xFE, 0xFF, this);
|
|
m_acchcir[0].SetWall(l_autoUpHeight + 0.1f, 60.0f);
|
|
m_acchcir[1].SetWall(150.0f, 60.0f);
|
|
m_acchcir[2].SetWall(240.0f, 60.0f);
|
|
m_acch.Set(this, 3, m_acchcir);
|
|
m_acch.SetWaterCheckOffset(500.0f);
|
|
|
|
field_0x1764 = daHorse_hio_c0::m.walk_to_fastwalk_rate * m_normalMaxSpeedF;
|
|
m_lashMaxSpeedF = m_normalMaxSpeedF + m_lashAddSpeed;
|
|
|
|
attention_info.distances[fopAc_attn_ETC_e] = 14;
|
|
attention_info.distances[fopAc_attn_SPEAK_e] = 38;
|
|
|
|
m_sound.init(¤t.pos, &eyePos, 6, 1);
|
|
|
|
resetBasAnime();
|
|
m_anmRatio[2].setAnmTransform(NULL);
|
|
m_anmRatio[2].setRatio(0.0f);
|
|
m_anmIdx[2] = 0xFFFF;
|
|
|
|
field_0x17dc.init(&m_acch, 60.0f, 200.0f);
|
|
gravity = -5.0f;
|
|
field_0x16ce = 0xD000;
|
|
field_0x16d0 = 0xF000;
|
|
|
|
dCcD_Cyl* cyl_p = m_tgco_cyl;
|
|
for (int i = 0; i < 3; i++) {
|
|
cyl_p->Set(l_cylSrc);
|
|
cyl_p->SetStts(&m_cc_stts);
|
|
cyl_p++;
|
|
}
|
|
|
|
m_tgco_cyl[1].SetR(35.0f);
|
|
|
|
m_head_sph.Set(l_sphSrc);
|
|
m_head_sph.SetStts(&m_cc_stts);
|
|
|
|
setServiceWaitTimer();
|
|
|
|
m_tgco_cyl[0].SetCoHitCallback(daHorse_coHitCallbackAll);
|
|
m_tgco_cyl[1].SetCoHitCallback(daHorse_coHitCallbackCowHit);
|
|
m_tgco_cyl[2].SetCoHitCallback(daHorse_coHitCallbackCowHit);
|
|
|
|
m_boar_cyl.Set(l_cylSrc);
|
|
m_boar_cyl.SetStts(&m_cc_stts);
|
|
m_boar_cyl.SetCoHitCallback(daHorse_coHitCallbackBoarJump);
|
|
m_boar_cyl.SetCoVsGrp(0x20);
|
|
m_boar_cyl.OnCoNoCrrBit();
|
|
m_boar_cyl.OnCoNoCoHitInfSet();
|
|
m_boar_cyl.OffTgSetBit();
|
|
m_boar_cyl.SetR(55.0f);
|
|
|
|
m_at_cyl.Set(l_cylSrc);
|
|
m_at_cyl.SetStts(&m_cc_stts);
|
|
m_at_cyl.OffTgSetBit();
|
|
m_at_cyl.OffCoSetBit();
|
|
m_at_cyl.OnAtSetBit();
|
|
m_at_cyl.SetH(150.0f);
|
|
m_at_cyl.SetR(60.0f);
|
|
|
|
m_procID = PROC_NONE_e;
|
|
m_demoStaffId = -1;
|
|
this->model = m_model;
|
|
|
|
procWaitInit();
|
|
|
|
m_model->setUserArea((u32)this);
|
|
for (u16 i = 0; i < 38; i++) {
|
|
m_modelData->getJointNodePointer(i)->setCallBack(daHorse_modelCallBack);
|
|
}
|
|
|
|
setMatrix();
|
|
m_model->calc();
|
|
setBodyPart();
|
|
field_0x17b8 = m_bodyEyePos;
|
|
|
|
m_acch.CrrPos(dComIfG_Bgsp());
|
|
setRoomInfo(1);
|
|
|
|
dComIfGp_setHorseActor(this);
|
|
field_0x16e8 = shape_angle.y;
|
|
|
|
cXyz* sp2C;
|
|
cXyz* sp28;
|
|
int j;
|
|
daHorseRein_c* rein_p = m_rein;
|
|
for (int i = 0; i < 3; i++) {
|
|
sp2C = rein_p->field_0x0[0];
|
|
sp28 = rein_p->field_0x0[1];
|
|
|
|
for (j = 0; j < rein_p->field_0x8[1]; j++, sp2C++, sp28++) {
|
|
*sp2C = cXyz::Zero;
|
|
*sp28 = cXyz::Zero;
|
|
}
|
|
|
|
rein_p++;
|
|
}
|
|
|
|
field_0x170e = shape_angle.y;
|
|
field_0x1710 = field_0x170e;
|
|
|
|
(this->*m_setReinPosNormal)();
|
|
m_lashCnt = 6;
|
|
field_0x170a = shape_angle.y;
|
|
|
|
if (daAlink_c::checkStageName("F_SP102") || daAlink_c::checkStageName("D_MN09B") || daAlink_c::checkStageName("F_SP123")) {
|
|
onStateFlg0(FLG0_UNK_4000000);
|
|
}
|
|
|
|
fopAcM_setStageLayer(this);
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
/* 80839CFC-80839D1C 001EBC 0020+00 1/0 0/0 0/0 .text daHorse_Create__FP10fopAc_ac_c */
|
|
static int daHorse_Create(fopAc_ac_c* i_this) {
|
|
return ((daHorse_c*)i_this)->create();
|
|
}
|
|
|
|
/* 80839D1C-80839EBC 001EDC 01A0+00 2/2 0/0 0/0 .text setBasAnime__9daHorse_cFi */
|
|
void daHorse_c::setBasAnime(int param_0) {
|
|
daPy_frameCtrl_c* frame_ctrl = &m_frameCtrl[param_0];
|
|
|
|
if (((mDoExt_transAnmBas*)m_anmRatio[param_0].getAnmTransform())->getBas() == NULL) {
|
|
resetBasAnime();
|
|
} else if (field_0x16f6 == m_anmIdx[param_0] && field_0x175c * frame_ctrl->getRate() >= 0.0f) {
|
|
field_0x1144 = frame_ctrl;
|
|
} else {
|
|
field_0x1140 = ((mDoExt_transAnmBas*)m_anmRatio[param_0].getAnmTransform())->getBas();
|
|
field_0x1144 = frame_ctrl;
|
|
field_0x16f6 = m_anmIdx[param_0];
|
|
field_0x175c = frame_ctrl->getRate();
|
|
|
|
f32 var_f31;
|
|
if (field_0x1144->getAttribute() == 2) {
|
|
f32 temp_f30 = field_0x1144->getRate();
|
|
var_f31 = field_0x1144->getFrame() - temp_f30;
|
|
|
|
if (var_f31 <= (f32)field_0x1144->getStart()) {
|
|
var_f31 = (f32)field_0x1144->getEnd() - var_f31;
|
|
} else if (var_f31 >= (f32)field_0x1144->getEnd()) {
|
|
var_f31 -= (f32)field_0x1144->getEnd();
|
|
}
|
|
} else {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
m_sound.initAnime(field_0x1140, field_0x1144->getRate() >= 0.0f, field_0x1144->getLoop(), var_f31);
|
|
}
|
|
}
|
|
|
|
/* 80839EBC-80839ED4 00207C 0018+00 2/2 0/0 0/0 .text resetBasAnime__9daHorse_cFv */
|
|
void daHorse_c::resetBasAnime() {
|
|
field_0x16f6 = 0xFFFF;
|
|
field_0x1144 = NULL;
|
|
}
|
|
|
|
/* 80839ED4-8083A20C 002094 0338+00 1/1 0/0 0/0 .text setDoubleAnime__9daHorse_cFfffUsUsf
|
|
*/
|
|
int daHorse_c::setDoubleAnime(f32 i_ratio, f32 i_anmSpeedA, f32 i_anmSpeedB, u16 i_anmIdxA, u16 i_anmIdxB,
|
|
f32 i_morf) {
|
|
J3DAnmTransform* temp_r26 = m_anmRatio[0].getAnmTransform();
|
|
if (i_morf < 0.0f && (m_anmIdx[0] != ANM_HS_RUN_DASH || i_anmIdxA != ANM_HS_RUN_SLOW) && (m_anmIdx[0] != i_anmIdxA || m_anmIdx[1] != i_anmIdxB)) {
|
|
i_morf = 3.0f;
|
|
}
|
|
|
|
if (i_anmIdxA == ANM_HS_TURN_LEFT || i_anmIdxA == ANM_HS_TURN_RIGHT) {
|
|
i_morf = -1.0f;
|
|
} else if (i_anmIdxA != ANM_HS_TURN_RIGHT_START && i_anmIdxA != ANM_HS_TURN_LEFT_START) {
|
|
if (m_anmIdx[0] == ANM_HS_TURN_LEFT) {
|
|
setNeckAnime(ANM_HS_NECK_WAITBACK_LEFT, 1.0f, 0.0f, -1);
|
|
i_morf = 8.0f;
|
|
} else if (m_anmIdx[0] == ANM_HS_TURN_RIGHT) {
|
|
setNeckAnime(ANM_HS_NECK_WAITBACK_RIGHT, 1.0f, 0.0f, -1);
|
|
i_morf = 8.0f;
|
|
}
|
|
}
|
|
|
|
f32 var_f28;
|
|
if (temp_r26 != NULL && m_anmRatio[1].getAnmTransform() != NULL) {
|
|
var_f28 = temp_r26->getFrame() / temp_r26->getFrameMax();
|
|
} else {
|
|
var_f28 = 0.0f;
|
|
}
|
|
|
|
J3DAnmTransform* bckA = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, i_anmIdxA);
|
|
J3DAnmTransform* bckB = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, i_anmIdxB);
|
|
m_anmIdx[0] = i_anmIdxA;
|
|
m_anmIdx[1] = i_anmIdxB;
|
|
|
|
m_anmRatio[0].setRatio(1.0f - i_ratio);
|
|
m_anmRatio[1].setRatio(i_ratio);
|
|
|
|
f32 frame_maxA = bckA->getFrameMax();
|
|
f32 frame_maxB = bckB->getFrameMax();
|
|
f32 temp_f25 = 1.0f / frame_maxA;
|
|
f32 speed = i_anmSpeedA + (i_ratio * (((i_anmSpeedB * frame_maxA) / frame_maxB) - i_anmSpeedA));
|
|
|
|
m_frameCtrl[0].setFrameCtrl(bckA->getAttribute(), 0, frame_maxA, speed, var_f28 * frame_maxA);
|
|
bckA->setFrame(m_frameCtrl[0].getFrame());
|
|
|
|
m_frameCtrl[1].setFrameCtrl(bckB->getAttribute(), 0, frame_maxB, temp_f25 * (speed * frame_maxB), var_f28 * frame_maxB);
|
|
bckB->setFrame(m_frameCtrl[1].getFrame());
|
|
|
|
m_anmRatio[0].setAnmTransform(bckA);
|
|
m_anmRatio[1].setAnmTransform(bckB);
|
|
|
|
if (i_morf >= 0.0f) {
|
|
m_oldFrame->initOldFrameMorf(i_morf, 0, 38);
|
|
m_morf_frame = i_morf;
|
|
}
|
|
|
|
if (m_procID == PROC_WAIT_e || i_ratio < 0.5f) {
|
|
setBasAnime(0);
|
|
} else {
|
|
setBasAnime(1);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8083A20C-8083A3C4 0023CC 01B8+00 10/10 0/0 0/0 .text setSingleAnime__9daHorse_cFUsffsfi */
|
|
int daHorse_c::setSingleAnime(u16 i_anmIdx, f32 i_speed, f32 i_startF, s16 i_endF, f32 i_morf,
|
|
BOOL i_isDemoAnm) {
|
|
J3DAnmTransform* bck;
|
|
if (i_isDemoAnm) {
|
|
if (i_anmIdx & 0x8000) {
|
|
JUT_ASSERT(0x6D4, 0);
|
|
}
|
|
|
|
bck = (J3DAnmTransform*)dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), i_anmIdx);
|
|
i_anmIdx |= 0x8000;
|
|
} else {
|
|
bck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, i_anmIdx);
|
|
}
|
|
|
|
m_anmIdx[0] = i_anmIdx;
|
|
m_anmIdx[1] = 0xFFFF;
|
|
|
|
m_anmRatio[0].setRatio(1.0f);
|
|
m_anmRatio[1].setRatio(0.0f);
|
|
m_anmRatio[0].setAnmTransform(bck);
|
|
m_anmRatio[1].setAnmTransform(NULL);
|
|
|
|
s16 end_frame;
|
|
if (i_endF < 0) {
|
|
end_frame = bck->getFrameMax();
|
|
} else {
|
|
end_frame = i_endF;
|
|
}
|
|
|
|
f32 frame;
|
|
if (i_speed < 0.0f) {
|
|
frame = end_frame;
|
|
} else {
|
|
frame = i_startF;
|
|
}
|
|
|
|
m_frameCtrl[0].setFrameCtrl(bck->getAttribute(), i_startF, end_frame, i_speed, frame);
|
|
bck->setFrame(frame);
|
|
|
|
if (i_morf >= 0.0f) {
|
|
m_oldFrame->initOldFrameMorf(i_morf, 0, 38);
|
|
m_morf_frame = i_morf;
|
|
}
|
|
|
|
setBasAnime(0);
|
|
return 1;
|
|
}
|
|
|
|
/* 8083A3C4-8083A5AC 002584 01E8+00 1/1 0/0 0/0 .text animePlay__9daHorse_cFv */
|
|
void daHorse_c::animePlay() {
|
|
if (m_frameCtrl[2].getRate() < 0.1f) {
|
|
resetNeckAnime();
|
|
}
|
|
|
|
if (daAlink_getAlinkActorClass()->checkHorseGetItem()) {
|
|
m_frameCtrl[0].setFrame(0);
|
|
} else {
|
|
m_frameCtrl[0].updateFrame();
|
|
}
|
|
|
|
m_anmRatio[0].getAnmTransform()->setFrame(m_frameCtrl[0].getFrame());
|
|
|
|
if (m_anmRatio[1].getAnmTransform() != NULL) {
|
|
if (daAlink_getAlinkActorClass()->checkHorseGetItem()) {
|
|
m_frameCtrl[1].setFrame(0);
|
|
} else {
|
|
m_frameCtrl[1].updateFrame();
|
|
}
|
|
|
|
m_anmRatio[1].getAnmTransform()->setFrame(m_frameCtrl[1].getFrame());
|
|
}
|
|
|
|
if (m_anmRatio[2].getAnmTransform() != NULL) {
|
|
m_frameCtrl[2].updateFrame();
|
|
if (m_anmIdx[2] == ANM_HS_WAIT_03 && m_frameCtrl[2].checkPass(18)) {
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_BURURU, m_reverb);
|
|
}
|
|
|
|
m_anmRatio[2].getAnmTransform()->setFrame(m_frameCtrl[2].getFrame());
|
|
}
|
|
|
|
if (m_btpFrame != 0) {
|
|
m_btpFrame++;
|
|
if (m_btpFrame > m_btp.getBtpAnm()->getFrameMax()) {
|
|
m_btpFrame = 0;
|
|
}
|
|
} else if (cM_rnd() < 0.012f) {
|
|
m_btpFrame++;
|
|
}
|
|
}
|
|
|
|
/* 8083A5AC-8083A890 00276C 02E4+00 1/1 0/0 0/0 .text checkDemoAction__9daHorse_cFv */
|
|
int daHorse_c::checkDemoAction() {
|
|
if (checkStateFlg0(FLG0_CALL_HORSE)) {
|
|
setStickCallMove();
|
|
offStateFlg0(FLG0_CALL_HORSE);
|
|
onStateFlg0(FLG0_UNK_10000000);
|
|
|
|
shape_angle.y = cLib_targetAngleY(¤t.pos, &daAlink_getAlinkActorClass()->current.pos);
|
|
current.angle.y = shape_angle.y;
|
|
field_0x1728 = 0;
|
|
field_0x16b8 = 0;
|
|
m_callMoveTimer = 450;
|
|
speedF = m_normalMaxSpeedF;
|
|
return procMoveInit();
|
|
}
|
|
|
|
if (dComIfGp_getEvent().isOrderOK()) {
|
|
return 0;
|
|
}
|
|
|
|
JUT_ASSERT(0x752, (m_demoMode < DEMO_LAST_e) || (m_demoMode == DEMO_NEW_ANM0_e));
|
|
|
|
if (m_demoMode == DEMO_NEW_ANM0_e) {
|
|
onStateFlg0(FLG0_UNK_80000);
|
|
if (m_procID == PROC_TOOL_DEMO_e) {
|
|
return 1;
|
|
}
|
|
|
|
return procToolDemoInit();
|
|
}
|
|
|
|
if (m_demoMode == 7) {
|
|
onStateFlg0(FLG0_UNK_80000);
|
|
if (m_procID == PROC_JUMP_e || m_procID == PROC_LAND_e) {
|
|
return 1;
|
|
}
|
|
|
|
return procJumpInit(0);
|
|
}
|
|
|
|
if (m_demoMode == 16) {
|
|
onStateFlg0(FLG0_UNK_80000);
|
|
if (m_procID == PROC_STOP_e) {
|
|
return 1;
|
|
}
|
|
|
|
if (m_procID == PROC_MOVE_e && checkStateFlg0(FLG0_UNK_2)) {
|
|
return procStopInit();
|
|
}
|
|
|
|
if (m_procID == PROC_WAIT_e) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
if (m_demoMode == 8 || m_demoMode == 14) {
|
|
onStateFlg0(FLG0_UNK_80000);
|
|
if (m_procID == PROC_STOP_e) {
|
|
return 1;
|
|
}
|
|
|
|
return procStopInit();
|
|
}
|
|
|
|
if (m_demoMode == 9 || m_demoMode == 15) {
|
|
onStateFlg0(FLG0_UNK_80000);
|
|
if (m_procID == PROC_TURN_e) {
|
|
return 1;
|
|
}
|
|
|
|
return procTurnInit(0);
|
|
}
|
|
|
|
if (m_demoMode == 5) {
|
|
int temp_r3 = procWaitInit();
|
|
if (temp_r3 != 0) {
|
|
m_oldFrame->initOldFrameMorf(0.0f, 0, 38);
|
|
}
|
|
|
|
return temp_r3;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_80000) && (m_demoMode == 1 || m_demoMode == 2 || m_demoMode == 10 || m_demoMode == 3 || m_demoMode == 11 || m_demoMode == 4)) {
|
|
offStateFlg0(FLG0_UNK_80000);
|
|
if (fabsf(speedF) < 0.05f) {
|
|
return procWaitInit();
|
|
}
|
|
|
|
return procMoveInit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 8083A890-8083AC7C 002A50 03EC+00 1/1 0/0 0/0 .text setStickRodeoMove__9daHorse_cFv */
|
|
void daHorse_c::setStickRodeoMove() {
|
|
if (m_rodeoPath != NULL) {
|
|
Vec* path_pnt_pos = &m_rodeoPath->m_points[m_rodeoPoint].m_position;
|
|
|
|
cXyz pos_vec(path_pnt_pos->x - current.pos.x, path_pnt_pos->y - current.pos.y, path_pnt_pos->z - current.pos.z);
|
|
f32 dist_to_pnt = pos_vec.absXZ();
|
|
|
|
m_padStickValue = 1.0f;
|
|
onEndResetStateFlg0(ERFLG0_MOVE_ACCEPT);
|
|
|
|
BOOL var_r27;
|
|
if (dist_to_pnt < 400.0f && field_0x16bc == 0) {
|
|
if (((!checkStateFlg0(FLG0_UNK_1) && m_rodeoPath->m_points[m_rodeoPoint].mArg0 != 1) || m_rodeoPointCnt >= 15) && m_procID == PROC_MOVE_e) {
|
|
onEndResetStateFlg0(ERFLG0_UNK_200);
|
|
if (!checkStateFlg0(FLG0_UNK_1)) {
|
|
field_0x16bc = cM_rndF(3.0f);
|
|
}
|
|
}
|
|
|
|
m_rodeoPoint++;
|
|
if (m_rodeoPath->m_num == m_rodeoPoint) {
|
|
m_rodeoPoint = 0;
|
|
}
|
|
|
|
path_pnt_pos = &m_rodeoPath->m_points[m_rodeoPoint].m_position;
|
|
pos_vec.set(path_pnt_pos->x - current.pos.x, path_pnt_pos->y - current.pos.y, path_pnt_pos->z - current.pos.z);
|
|
|
|
var_r27 = 1;
|
|
if (checkStateFlg0(FLG0_UNK_1)) {
|
|
m_rodeoPointCnt++;
|
|
}
|
|
} else {
|
|
if (dist_to_pnt < 400.0f && m_procID != PROC_STOP_e && m_procID != PROC_TURN_e && field_0x16bc != 0) {
|
|
field_0x16bc = 0;
|
|
}
|
|
var_r27 = 0;
|
|
}
|
|
|
|
m_padStickAngleY = pos_vec.atan2sX_Z();
|
|
|
|
if (m_procID != PROC_TURN_e && cLib_distanceAngleS(m_padStickAngleY, shape_angle.y) > 0x5000) {
|
|
m_rodeoPoint++;
|
|
if (m_rodeoPath->m_num == m_rodeoPoint) {
|
|
m_rodeoPoint = 0;
|
|
}
|
|
|
|
path_pnt_pos = &m_rodeoPath->m_points[m_rodeoPoint].m_position;
|
|
pos_vec.set(path_pnt_pos->x - current.pos.x, path_pnt_pos->y - current.pos.y, path_pnt_pos->z - current.pos.z);
|
|
m_padStickAngleY = pos_vec.atan2sX_Z();
|
|
var_r27 = 1;
|
|
field_0x16bc = 0;
|
|
}
|
|
|
|
if (var_r27) {
|
|
if ((s16)(m_padStickAngleY - shape_angle.y) > 0) {
|
|
offStateFlg0(FLG0_RODEO_LEFT);
|
|
} else {
|
|
onStateFlg0(FLG0_RODEO_LEFT);
|
|
}
|
|
}
|
|
} else {
|
|
m_padStickAngleY = 0;
|
|
m_padStickValue = 0.0f;
|
|
}
|
|
}
|
|
|
|
/* 8083AC7C-8083ACEC 002E3C 0070+00 2/2 0/0 0/0 .text setStickCallMove__9daHorse_cFv */
|
|
void daHorse_c::setStickCallMove() {
|
|
m_padStickValue = 1.0f;
|
|
|
|
u32 mode = 3;
|
|
setDemoMoveData(&mode, &daAlink_getAlinkActorClass()->current.pos);
|
|
m_padStickAngleY = m_demoMoveAngle;
|
|
|
|
if (m_callMoveTimer != 0) {
|
|
m_callMoveTimer--;
|
|
}
|
|
}
|
|
|
|
/* 8083ACEC-8083AEC0 002EAC 01D4+00 2/2 0/0 0/0 .text setDemoMoveData__9daHorse_cFPUlPC4cXyz */
|
|
void daHorse_c::setDemoMoveData(u32* i_mode, cXyz const* i_pos) {
|
|
cXyz pos_vec;
|
|
pos_vec = *i_pos - current.pos;
|
|
|
|
if (field_0x1728 != 0 && (*i_mode == 4 || *i_mode == 11 || *i_mode == 3)) {
|
|
m_demoMoveAngle = pos_vec.atan2sX_Z();
|
|
if (abs((s16)(m_demoMoveAngle - shape_angle.y)) > 0x4000 && m_demoStaffId != -1) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
}
|
|
} else {
|
|
f32 temp_f29 = SQUARE(20.0f);
|
|
f32 temp_f28 = SQUARE(40.0f);
|
|
f32 temp_f30 = SQUARE(100.0f);
|
|
|
|
f32 dist_xz2 = pos_vec.abs2XZ();
|
|
if (dist_xz2 < temp_f29 || (dist_xz2 < temp_f30 && fabsf(speedF) <= 0.05f)) {
|
|
*i_mode = 1;
|
|
speedF = 0.0f;
|
|
m_padStickValue = 0.0f;
|
|
} else if (((*i_mode == 2 || *i_mode == 10) && dist_xz2 < temp_f28) || dist_xz2 < temp_f30) {
|
|
if (*i_mode == 10) {
|
|
*i_mode = 10;
|
|
} else {
|
|
*i_mode = 2;
|
|
}
|
|
}
|
|
|
|
if ((0.5f * (speedF * speedF)) / daHorse_hio_c0::m.stopping_deceleration > JMAFastSqrt(dist_xz2)) {
|
|
m_padStickValue = 0.0f;
|
|
}
|
|
|
|
m_demoMoveAngle = pos_vec.atan2sX_Z();
|
|
}
|
|
}
|
|
|
|
/* 8083AEC0-8083B578 003080 06B8+00 1/1 0/0 0/0 .text setDemoData__9daHorse_cFv */
|
|
void daHorse_c::setDemoData() {
|
|
if (!dComIfGp_event_runCheck()) {
|
|
offStateFlg0(FLG0_UNK_2000000);
|
|
}
|
|
|
|
if (dComIfGp_getEvent().isOrderOK()) {
|
|
if (checkHorseDemoMode()) {
|
|
u32 old_demoMode = m_demoMode;
|
|
field_0x16b8 = 0;
|
|
m_demoMode = 0;
|
|
field_0x1728 = 0;
|
|
m_demoStaffId = -1;
|
|
m_demoStickR = 0.0f;
|
|
|
|
offStateFlg0(FLG0_UNK_80000);
|
|
|
|
if (checkStateFlg0(FLG0_UNK_400)) {
|
|
offStateFlg0(FLG0_UNK_400);
|
|
speedF = field_0x1794;
|
|
}
|
|
|
|
if (old_demoMode != 12 && old_demoMode != 15 && old_demoMode != 13) {
|
|
if (fabsf(speedF) < 0.05f) {
|
|
procWaitInit();
|
|
} else {
|
|
procMoveInit();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
m_lashAccelerationTime = 0;
|
|
dDemo_actor_c* demo_actor_p = dDemo_c::getActor(demoActorID);
|
|
cXyz* pos_p = NULL;
|
|
u32 mode = 1;
|
|
s16 angle;
|
|
int* prm_p = NULL;
|
|
m_demoStaffId = dComIfGp_evmng_getMyStaffId("Horse", this, 0);
|
|
|
|
if (demo_actor_p != NULL) {
|
|
demo_actor_p->setModel(m_model);
|
|
m_demoStaffId = -1;
|
|
|
|
if (field_0x16b8 != 1) {
|
|
field_0x16b8 = 1;
|
|
procWaitInit();
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(dDemo_actor_c::ENABLE_ANM_e)) {
|
|
mode = demo_actor_p->getAnmId();
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(dDemo_actor_c::ENABLE_TRANS_e)) {
|
|
pos_p = &demo_actor_p->getTrans();
|
|
} else {
|
|
pos_p = ¤t.pos;
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(dDemo_actor_c::ENABLE_ROTATE_e)) {
|
|
angle = demo_actor_p->getRatate().y;
|
|
} else {
|
|
angle = shape_angle.y;
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(1)) {
|
|
int sp20, sp1C, sp18;
|
|
u16 sp8;
|
|
while (demo_actor_p->getDemoIDData(&sp20, &sp1C, &sp18, &sp8, NULL) != 0) {
|
|
if (sp20 == 0 && sp1C == 0) {
|
|
if (sp18 == 2) {
|
|
if (sp8 != 0) {
|
|
onEndResetStateFlg0(ERFLG0_UNK_40);
|
|
}
|
|
} else if (sp18 == 3) {
|
|
if (sp8 != 0) {
|
|
onResetStateFlg0(RFLG0_UNK_1);
|
|
}
|
|
} else if (sp18 == 4) {
|
|
if (sp8 != 0) {
|
|
onResetStateFlg0(RFLG0_UNK_80);
|
|
}
|
|
} else if (sp18 == 5) {
|
|
if (sp8 != 0) {
|
|
onResetStateFlg0(RFLG0_UNK_100);
|
|
}
|
|
} else if (sp18 == 6 && sp8 != 0) {
|
|
onResetStateFlg0(RFLG0_UNK_200);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (!checkHorseDemoMode()) {
|
|
field_0x16b8 = 2;
|
|
}
|
|
|
|
if (m_demoStaffId != -1) {
|
|
char* cutname = dComIfGp_getPEvtManager()->getMyNowCutName(m_demoStaffId);
|
|
if (cutname != NULL) {
|
|
mode = ((cutname[0] - '0') * 100) + ((cutname[1] - '0') * 10) + (cutname[2] - '0');
|
|
|
|
pos_p = dComIfGp_evmng_getMyXyzP(m_demoStaffId, "pos");
|
|
if (pos_p == NULL) {
|
|
pos_p = dComIfGp_evmng_getGoal();
|
|
}
|
|
|
|
int* angle_p = dComIfGp_evmng_getMyIntegerP(m_demoStaffId, "angle");
|
|
if (angle_p != NULL) {
|
|
angle = *angle_p;
|
|
} else {
|
|
angle = shape_angle.y;
|
|
}
|
|
|
|
prm_p = dComIfGp_evmng_getMyIntegerP(m_demoStaffId, "prm0");
|
|
|
|
if (dComIfGp_evmng_getMyIntegerP(m_demoStaffId, "ride") != NULL && !checkStateFlg0(FLG0_UNK_1)) {
|
|
mode = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (field_0x16b8 == 1 || (field_0x16b8 == 2 && m_demoStaffId != -1)) {
|
|
if (prm_p != NULL) {
|
|
field_0x1728 = *prm_p;
|
|
} else {
|
|
field_0x1728 = 0;
|
|
}
|
|
|
|
if (mode == 5) {
|
|
speedF = 0.0f;
|
|
m_cc_stts.ClrCcMove();
|
|
setHorsePosAndAngle(pos_p, angle);
|
|
m_demoMoveAngle = angle;
|
|
} else if (mode == 2 || mode == 10 || mode == 3 || mode == 11 || mode == 4) {
|
|
setDemoMoveData(&mode, pos_p);
|
|
} else if (field_0x16b8 == 2 && mode == 7) {
|
|
f32* dis_p = dComIfGp_evmng_getMyFloatP(m_demoStaffId, "disXZ");
|
|
if (dis_p != NULL) {
|
|
field_0x1768 = *dis_p;
|
|
field_0x1770 = field_0x1768;
|
|
}
|
|
|
|
dis_p = dComIfGp_evmng_getMyFloatP(m_demoStaffId, "disY");
|
|
if (dis_p != NULL) {
|
|
field_0x176c = *dis_p;
|
|
}
|
|
}
|
|
|
|
m_demoMode = mode;
|
|
if (m_demoMode == 1) {
|
|
speedF = 0.0f;
|
|
}
|
|
} else if (field_0x16b8 == 3) {
|
|
if (m_demoMode == 14 && !checkStateFlg0(FLG0_UNK_400)) {
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
onStateFlg0(FLG0_UNK_400);
|
|
field_0x1794 = speedF;
|
|
} else {
|
|
m_demoMode = 1;
|
|
}
|
|
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
if (m_demoMode == 2 || m_demoMode == 10 || m_demoMode == 3 || m_demoMode == 11 || m_demoMode == 4) {
|
|
setDemoMoveData(&m_demoMode, &m_demoPos0);
|
|
}
|
|
|
|
if (m_demoMode == 5) {
|
|
speedF = 0.0f;
|
|
m_cc_stts.ClrCcMove();
|
|
} else if (m_demoMode == 1) {
|
|
speedF = 0.0f;
|
|
}
|
|
} else if (checkStateFlg0(FLG0_RODEO_MODE)) {
|
|
m_demoMode = 13;
|
|
} else {
|
|
if ((m_demoMode != 0 || mode != 1) && !checkStateFlg0(FLG0_UNK_10000000) && (m_procID != PROC_STOP_e || field_0x171c == 0)) {
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
m_demoMode = mode;
|
|
}
|
|
|
|
if (m_demoStaffId != -1 && (m_demoMode == 1 || m_demoMode == 6 || m_demoMode == 5)) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083B578-8083B600 003738 0088+00 4/4 0/0 0/0 .text acceptPlayerRide__9daHorse_cFv */
|
|
void daHorse_c::acceptPlayerRide() {
|
|
if (!checkStateFlg0(FLG0_UNK_1) && !daPy_py_c::checkNowWolf()) {
|
|
int angle = fopAcM_seenPlayerAngleY(this);
|
|
if (angle > 0x2800 && (!daAlink_getAlinkActorClass()->checkHorseZelda() || angle < 0x5800)) {
|
|
attention_info.flags |= 0x80;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083B600-8083B828 0037C0 0228+00 1/1 0/0 0/0 .text setStickData__9daHorse_cFv */
|
|
void daHorse_c::setStickData() {
|
|
if (checkStateFlg0(daHorse_FLG0(FLG0_RODEO_MODE | FLG0_UNK_10000000))) {
|
|
field_0x16c2 = 2000;
|
|
} else {
|
|
field_0x16c2 = daHorse_hio_c0::m.max_turn;
|
|
}
|
|
|
|
if (dComIfGp_event_runCheck()) {
|
|
if (field_0x16b8 == 1 || field_0x16b8 == 3 || (field_0x16b8 == 2 && m_demoStaffId != -1)) {
|
|
if (m_demoMode == 2 || m_demoMode == 10 || m_demoMode == 4 || m_demoMode == 11 || m_demoMode == 3) {
|
|
m_padStickValue = 1.0f;
|
|
} else if (m_demoMode == 6) {
|
|
m_padStickValue = m_demoStickR;
|
|
} else {
|
|
m_padStickValue = 0.0f;
|
|
}
|
|
|
|
m_padStickAngleY = m_demoMoveAngle;
|
|
} else if (checkStateFlg0(FLG0_RODEO_MODE)) {
|
|
setStickRodeoMove();
|
|
} else if (checkStateFlg0(FLG0_UNK_10000000)) {
|
|
setStickCallMove();
|
|
} else {
|
|
m_padStickValue = 0.0f;
|
|
m_padStickAngleY = 0;
|
|
}
|
|
} else if (checkStateFlg0(FLG0_UNK_10000000)) {
|
|
setStickCallMove();
|
|
} else if (checkStateFlg0(FLG0_RODEO_MODE)) {
|
|
if (!checkStateFlg0(FLG0_UNK_400000)) {
|
|
onStateFlg0(FLG0_UNK_400000);
|
|
mDoAud_subBgmStart(Z2BGM_RODEO);
|
|
}
|
|
setStickRodeoMove();
|
|
} else {
|
|
if (checkStateFlg0(FLG0_UNK_1) && !daAlink_getAlinkActorClass()->checkHorseGetOffMode()) {
|
|
if (!daAlink_getAlinkActorClass()->checkHorseHangMode()) {
|
|
if (!checkStateFlg0(FLG0_PLAYER_BACK_RIDE_LASH)) {
|
|
m_padStickValue = mDoCPd_c::getStickValue(PAD_1);
|
|
|
|
s16 stick_angle = mDoCPd_c::getStickAngle3D(PAD_1);
|
|
m_padStickAngleY = (dCam_getControledAngleY(dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0))) + 0x10000 + stick_angle) - 0x8000;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (checkEndResetStateFlg0(ERFLG0_RIDE_RUN_FLG)) {
|
|
m_padStickValue = 1.0f;
|
|
m_padStickAngleY = shape_angle.y;
|
|
} else {
|
|
m_padStickValue = 0.0f;
|
|
m_padStickAngleY = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083B828-8083B82C 0039E8 0004+00 1/1 0/0 0/0 .text setTurnStartVibration__9daHorse_cFv
|
|
*/
|
|
void daHorse_c::setTurnStartVibration() {}
|
|
|
|
/* 8083B82C-8083B830 0039EC 0004+00 1/1 0/0 0/0 .text setTurnVibration__9daHorse_cFv */
|
|
void daHorse_c::setTurnVibration() {}
|
|
|
|
/* 8083B830-8083BF48 0039F0 0718+00 6/6 0/0 0/0 .text setMoveAnime__9daHorse_cFf */
|
|
void daHorse_c::setMoveAnime(f32 i_morf) {
|
|
daPy_frameCtrl_c* frame_ctrl = &m_frameCtrl[0];
|
|
|
|
f32 run_anm_speed, fastrun_anm_speed;
|
|
if (checkStateFlg0(FLG0_UNK_2000)) {
|
|
run_anm_speed = daHorse_hio_c0::m.kakariko_run_anm_speed;
|
|
fastrun_anm_speed = daHorse_hio_c0::m.kakariko_fastrun_anm_speed;
|
|
} else {
|
|
run_anm_speed = daHorse_hio_c0::m.run_anm_speed;
|
|
fastrun_anm_speed = daHorse_hio_c0::m.fast_run_anm_speed;
|
|
}
|
|
|
|
if (m_anmIdx[0] == ANM_HS_RUN_DASH && !m_frameCtrl[0].checkAnmEnd()) {
|
|
field_0x16b7 = 0;
|
|
if (frame_ctrl->checkPass(10) || frame_ctrl->checkPass(34)) {
|
|
field_0x16b6 |= 4;
|
|
}
|
|
|
|
if (frame_ctrl->checkPass(12) || frame_ctrl->checkPass(35)) {
|
|
field_0x16b6 |= 8;
|
|
} else if (frame_ctrl->checkPass(14)) {
|
|
field_0x16b6 |= 1;
|
|
} else if (frame_ctrl->checkPass(19)) {
|
|
field_0x16b6 |= 2;
|
|
}
|
|
return;
|
|
}
|
|
|
|
f32 var_f31;
|
|
f32 ratio;
|
|
if (speedF >= 0.0f) {
|
|
var_f31 = speedF * (1.0f / m_normalMaxSpeedF);
|
|
} else {
|
|
var_f31 = speedF * (1.0f / daHorse_hio_c0::m.max_backward_speed);
|
|
}
|
|
|
|
if (var_f31 < daHorse_hio_c0::m.walk_to_fastwalk_rate) {
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
offStateFlg0(FLG0_UNK_2);
|
|
i_morf = daHorse_hio_c0::m.walk_run_interpolation;
|
|
}
|
|
|
|
if (var_f31 < 0.0f && m_anmIdx[0] == ANM_HS_WALK_START && !m_frameCtrl[0].checkAnmEnd()) {
|
|
return;
|
|
}
|
|
|
|
if (var_f31 < -daHorse_hio_c0::m.backward_idle_to_walk_rate) {
|
|
setDoubleAnime(1.0f, daHorse_hio_c0::m.backwalk_anm_speed, daHorse_hio_c0::m.backwalk_anm_speed, ANM_HS_BACK_WALK, ANM_HS_BACK_WALK, i_morf);
|
|
} else if (var_f31 < 0.0f) {
|
|
ratio = 1.0f - ((var_f31 + daHorse_hio_c0::m.backward_idle_to_walk_rate) / daHorse_hio_c0::m.backward_idle_to_walk_rate);
|
|
setDoubleAnime(ratio, daHorse_hio_c0::m.wait_anm_speed, daHorse_hio_c0::m.backwalk_anm_speed, ANM_HS_WAIT_01, ANM_HS_BACK_WALK, i_morf);
|
|
} else if (var_f31 < daHorse_hio_c0::m.wait_to_walk_rate) {
|
|
int sp8 = cLib_distanceAngleS(m_padStickAngleY, shape_angle.y);
|
|
if (checkWaitTurn() && checkInputOnR() && sp8 >= 0x800 && sp8 <= 0x6000) {
|
|
f32 anm_speed = 1.0f;
|
|
u16 anm_idx;
|
|
resetNeckAnime();
|
|
|
|
if ((s16)(shape_angle.y - field_0x16e8) > 0) {
|
|
if (m_anmIdx[0] == ANM_HS_TURN_LEFT_START) {
|
|
if (m_frameCtrl[0].checkAnmEnd()) {
|
|
anm_idx = ANM_HS_TURN_LEFT;
|
|
} else {
|
|
setTurnStartVibration();
|
|
return;
|
|
}
|
|
} else if (m_anmIdx[0] == ANM_HS_TURN_LEFT) {
|
|
anm_idx = ANM_HS_TURN_LEFT;
|
|
anm_speed = 0.5f + ((0.5f / (f32)field_0x16c2) * (f32)abs((s16)(shape_angle.y - field_0x16e8)));
|
|
if (anm_speed > 1.0f) {
|
|
anm_speed = 1.0f;
|
|
}
|
|
setTurnVibration();
|
|
} else {
|
|
m_anmRatio[0].getAnmTransform()->setFrame(0);
|
|
anm_idx = ANM_HS_TURN_LEFT_START;
|
|
}
|
|
} else if (m_anmIdx[0] == ANM_HS_TURN_RIGHT_START) {
|
|
if (m_frameCtrl[0].checkAnmEnd()) {
|
|
anm_idx = ANM_HS_TURN_RIGHT;
|
|
} else {
|
|
setTurnStartVibration();
|
|
return;
|
|
}
|
|
} else {
|
|
if (m_anmIdx[0] == ANM_HS_TURN_RIGHT) {
|
|
anm_idx = ANM_HS_TURN_RIGHT;
|
|
anm_speed = 0.5f + ((0.5f / (f32)field_0x16c2) * (f32)abs((s16)(shape_angle.y - field_0x16e8)));
|
|
if (anm_speed > 1.0f) {
|
|
anm_speed = 1.0f;
|
|
}
|
|
setTurnVibration();
|
|
} else {
|
|
m_anmRatio[0].getAnmTransform()->setFrame(0);
|
|
anm_idx = ANM_HS_TURN_RIGHT_START;
|
|
}
|
|
}
|
|
|
|
setDoubleAnime(0.0f, anm_speed, anm_speed, anm_idx, anm_idx, i_morf);
|
|
} else {
|
|
ratio = var_f31 / daHorse_hio_c0::m.wait_to_walk_rate;
|
|
if (m_procID != PROC_WAIT_e && speedF > 0.05f) {
|
|
ratio = daHorse_hio_c0::m.field_0xdc + (ratio * (1.0f - daHorse_hio_c0::m.field_0xdc));
|
|
}
|
|
setDoubleAnime(ratio, daHorse_hio_c0::m.wait_anm_speed, daHorse_hio_c0::m.walk_anm_speed, ANM_HS_WAIT_01, ANM_HS_WALK_SLOW, i_morf);
|
|
}
|
|
} else {
|
|
ratio = (var_f31 - daHorse_hio_c0::m.wait_to_walk_rate) / (daHorse_hio_c0::m.walk_to_fastwalk_rate - daHorse_hio_c0::m.wait_to_walk_rate);
|
|
setDoubleAnime(ratio, daHorse_hio_c0::m.walk_anm_speed, daHorse_hio_c0::m.fast_walk_anm_speed, ANM_HS_WALK_SLOW, ANM_HS_WALK_FAST, i_morf);
|
|
}
|
|
} else if (var_f31 < daHorse_hio_c0::m.fastwalk_to_run_rate) {
|
|
if (checkStateFlg0(FLG0_UNK_2) == 0) {
|
|
setDoubleAnime(1.0f, daHorse_hio_c0::m.fast_walk_anm_speed, daHorse_hio_c0::m.fast_walk_anm_speed, ANM_HS_WALK_FAST, ANM_HS_WALK_FAST, i_morf);
|
|
} else {
|
|
setDoubleAnime(0.0f, run_anm_speed, run_anm_speed, ANM_HS_RUN_SLOW, ANM_HS_RUN_SLOW, i_morf);
|
|
}
|
|
} else {
|
|
if (!checkStateFlg0(FLG0_UNK_2)) {
|
|
onStateFlg0(FLG0_UNK_2);
|
|
if (m_lashAccelerationTime == 0) {
|
|
onResetStateFlg0(RFLG0_UNK_4);
|
|
setSingleAnime(ANM_HS_RUN_DASH, daHorse_hio_c0::m.dash_anm_speed, 0.0f, -1, 3.0f, 0);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (var_f31 < daHorse_hio_c0::m.run_to_fastrun_rate) {
|
|
ratio = 0.1f * ((var_f31 - daHorse_hio_c0::m.fastwalk_to_run_rate) / (daHorse_hio_c0::m.run_to_fastrun_rate - daHorse_hio_c0::m.fastwalk_to_run_rate));
|
|
} else {
|
|
ratio = 0.1f + ((var_f31 - daHorse_hio_c0::m.run_to_fastrun_rate) / ((1.0f + (m_lashAddSpeed / m_normalMaxSpeedF)) - daHorse_hio_c0::m.run_to_fastrun_rate));
|
|
if (ratio > 1.0f) {
|
|
ratio = 1.0f;
|
|
}
|
|
}
|
|
|
|
setDoubleAnime(ratio, run_anm_speed, fastrun_anm_speed, ANM_HS_RUN_SLOW, ANM_HS_RUN_FAST, i_morf);
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
onResetStateFlg0(RFLG0_UNK_20);
|
|
|
|
if (m_lashAccelerationTime != 0 || (checkStateFlg0(FLG0_RODEO_MODE) && checkStateFlg0(FLG0_UNK_1))) {
|
|
m_at_cyl.SetAtSpl(dCcG_At_Spl_UNK_1);
|
|
m_at_cyl.SetAtHitMark(3);
|
|
m_at_cyl.SetAtAtp(2);
|
|
} else {
|
|
m_at_cyl.SetAtSpl(dCcG_At_Spl_UNK_0);
|
|
m_at_cyl.SetAtHitMark(1);
|
|
m_at_cyl.SetAtAtp(1);
|
|
}
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
field_0x16b7 = 0;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
static f32 const footEffectRate[4] = {
|
|
0.27f, 0.4f, 0.9f, 0.17f
|
|
};
|
|
|
|
if (frame_ctrl->checkPass(footEffectRate[i] * frame_ctrl->getEnd())) {
|
|
field_0x16b6 |= (1 << i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083BF48-8083CA80 004108 0B38+00 6/6 0/0 0/0 .text checkHorseNoMove__9daHorse_cFi */
|
|
// NONMATCHING - some float regalloc, equivalent
|
|
int daHorse_c::checkHorseNoMove(int param_0) {
|
|
cXyz sp50;
|
|
cXyz sp44;
|
|
|
|
if (checkStateFlg0(FLG0_UNK_2000000)) {
|
|
return 0;
|
|
}
|
|
|
|
if (checkPlayerHeavy()) {
|
|
return 3;
|
|
}
|
|
|
|
s16 spA;
|
|
if (daAlink_c::getMoveBGActorName(m_acch.m_gnd, 0) == PROC_OBJ_BRG) {
|
|
spA = 0;
|
|
} else if (m_procID == PROC_TURN_e && dComIfG_Bgsp().ChkPolySafe(m_acch.m_gnd)) {
|
|
spA = fopAcM_getPolygonAngle(m_acch.m_gnd, shape_angle.y);
|
|
} else {
|
|
spA = field_0x1714;
|
|
}
|
|
|
|
f32 sp28;
|
|
f32 var_f31;
|
|
f32 var_f30;
|
|
f32 var_f29;
|
|
f32 var_f28;
|
|
f32 var_f27;
|
|
|
|
if (param_0 != 0) {
|
|
if (checkEndResetStateFlg0(ERFLG0_UNK_200) || (checkStateFlg0(FLG0_UNK_100000) && (m_procID == PROC_MOVE_e || m_procID == PROC_TURN_e || m_procID == PROC_STOP_e) && ((current.pos.z < -33500.0f && abs(shape_angle.y) > 0x4000) || (current.pos.z > -20500.0f && abs(shape_angle.y) < 0x4000)))) {
|
|
return 3;
|
|
}
|
|
|
|
var_f31 = fabsf(speedF) / m_normalMaxSpeedF;
|
|
if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
} else if (m_procID == PROC_WAIT_e || m_procID == PROC_STOP_e) {
|
|
var_f31 = 0.5f;
|
|
}
|
|
var_f31 *= var_f31;
|
|
|
|
var_f31 = 200.0f + (300.0f * var_f31);
|
|
var_f29 = cM_ssin(current.angle.y);
|
|
var_f28 = cM_scos(current.angle.y);
|
|
sp28 = -var_f31 * cM_ssin(spA);
|
|
var_f27 = var_f31 * cM_scos(spA);
|
|
} else {
|
|
var_f29 = -cM_ssin(current.angle.y);
|
|
var_f28 = -cM_scos(current.angle.y);
|
|
sp28 = 200.0f * cM_ssin(spA);
|
|
var_f27 = 200.0f * cM_scos(spA);
|
|
}
|
|
|
|
daAlink_c* player = daAlink_getAlinkActorClass();
|
|
cXyz start(current.pos.x, current.pos.y + m_acchcir[0].GetWallH(), current.pos.z);
|
|
|
|
if (daAlink_c::getMoveBGActorName(m_acch.m_gnd, 0) == PROC_OBJ_BRG) {
|
|
start.y = 200.0f + current.pos.y;
|
|
}
|
|
|
|
cXyz end(start.x + (var_f27 * var_f29), start.y + sp28, start.z + (var_f27 * var_f28));
|
|
int rt = 0;
|
|
m_linechk.Set(&start, &end, this);
|
|
|
|
onStateFlg0(FLG0_UNK_100);
|
|
BOOL line_cross = dComIfG_Bgsp().LineCross(&m_linechk);
|
|
offStateFlg0(FLG0_UNK_100);
|
|
|
|
if (line_cross) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(m_linechk, &plane);
|
|
sp50 = m_linechk.GetCross();
|
|
|
|
if (cBgW_CheckBWall(plane.mNormal.y) && ((param_0 != 0 && cLib_distanceAngleS(plane.mNormal.atan2sX_Z(), shape_angle.y) > 0x6000) || (param_0 == 0 && cLib_distanceAngleS(plane.mNormal.atan2sX_Z(), shape_angle.y) < 0x2000))) {
|
|
m_linechk.Set(&start, &end, this);
|
|
if (m_procID == PROC_MOVE_e && param_0 != 0 && !dComIfG_Bgsp().LineCross(&m_linechk)) {
|
|
if (sp50.abs2(start) < 23716.0f) {
|
|
return 4;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
if (start.abs(sp50) < 300.0f) {
|
|
return 2;
|
|
}
|
|
rt = 1;
|
|
}
|
|
}
|
|
|
|
if (m_procID == PROC_TURN_e) {
|
|
var_f30 = 0.0f;
|
|
} else {
|
|
var_f30 = 50.0f;
|
|
}
|
|
|
|
sp50.y = 200.0f + current.pos.y;
|
|
|
|
f32 sp18;
|
|
if (param_0 != 0 && speedF > (0.5f * m_normalMaxSpeedF)) {
|
|
sp18 = 500.0;
|
|
} else {
|
|
sp18 = 200.0f;
|
|
}
|
|
|
|
while (var_f30 < sp18) {
|
|
sp50.x = current.pos.x + (var_f30 * var_f29);
|
|
sp50.z = current.pos.z + (var_f30 * var_f28);
|
|
|
|
if (fopAcM_gc_c::gndCheck(&sp50)) {
|
|
cM3dGPla sp5C;
|
|
fopAcM_gc_c::getTriPla(&sp5C);
|
|
|
|
s16 sp8 = cM_atan2s(sp5C.mNormal.absXZ(), sp5C.mNormal.y);
|
|
f32 sp14 = cM_deg2s(daHorse_hio_c0::m.floor_angle_limit);
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_1)) {
|
|
for (int i = 0; i < m_scnChg_num; i++) {
|
|
if (m_scnChg_buffer[i]->checkArea(&sp50)) {
|
|
if (var_f30 <= 101.0f) {
|
|
if (param_0 != 0 && !player->checkHorseGetOffMode()) {
|
|
onStateFlg0(FLG0_UNK_40000);
|
|
field_0x1704 = 30;
|
|
}
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fopAcM_gc_c::getHorseNoEntry() ||
|
|
(!checkStateFlg0(FLG0_UNK_1) && dComIfG_Bgsp().GetExitId(*fopAcM_gc_c::getGroundCheck()) != 0x3F) ||
|
|
(sp8 > sp14 && daAlink_c::getMoveBGActorName(*fopAcM_gc_c::getGroundCheck(), 1) != PROC_OBJ_BRG && dComIfG_Bgsp().GetSpecialCode(*fopAcM_gc_c::getGroundCheck()) != 2))
|
|
{
|
|
if (var_f30 <= 101.0f) {
|
|
if (sp8 > sp14 && param_0 != 0) {
|
|
onStateFlg0(FLG0_UNK_40000);
|
|
field_0x1704 = 30;
|
|
}
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
if (fopAcM_wt_c::waterCheck(&sp50)) {
|
|
if (fopAcM_wt_c::getWaterY() - fopAcM_gc_c::getGroundY() > daHorse_hio_c0::m.water_depth_limit) {
|
|
if (var_f30 <= 101.0f) {
|
|
if (param_0 != 0) {
|
|
onStateFlg0(FLG0_UNK_40000);
|
|
field_0x1704 = 30;
|
|
}
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (daTagHstop_c::getTop() != NULL) {
|
|
for (daTagHstop_c* hstop = daTagHstop_c::getTop(); hstop != NULL; hstop = hstop->getNext()) {
|
|
if (hstop->getActiveFlg()) {
|
|
fpoAcM_relativePos(hstop, &sp50, &sp44);
|
|
|
|
if (sp44.y >= -200.0f && sp44.y <= (400.0f + hstop->scale.y) && fabsf(sp44.x) <= hstop->scale.x && fabsf(sp44.z) <= hstop->scale.z) {
|
|
if (param_0 != 0 && speedF > 0.0f && m_procID == PROC_MOVE_e) {
|
|
onStateFlg0(FLG0_UNK_200);
|
|
hstop->onTagStop();
|
|
}
|
|
|
|
if (var_f30 <= 101.0f) {
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var_f30 += 25.0f;
|
|
}
|
|
|
|
return rt;
|
|
}
|
|
|
|
/* 8083CA80-8083CB38 004C40 00B8+00 1/1 0/0 0/0 .text checkTurnPlayerState__9daHorse_cFv
|
|
*/
|
|
BOOL daHorse_c::checkTurnPlayerState() {
|
|
daAlink_c* player = daAlink_getAlinkActorClass();
|
|
return player->checkHorseBackInput() && !player->checkHorseWaitLashAnime() && (!player->checkHorseWalkStartAnm() || player->getBaseAnimeFrame() < 1.0f);
|
|
}
|
|
|
|
/* 8083CB38-8083D748 004CF8 0C10+00 2/2 0/0 0/0 .text setSpeedAndAngle__9daHorse_cFv */
|
|
int daHorse_c::setSpeedAndAngle() {
|
|
int var_r28 = checkHorseNoMove(1);
|
|
if (var_r28 == 3) {
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
return 3;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
if (var_r28 == 4) {
|
|
return 5;
|
|
}
|
|
|
|
if (var_r28 == 2 && m_procID == PROC_MOVE_e) {
|
|
if (speedF >= 0.0f) {
|
|
if (speedF <= daHorse_hio_c0::m.cliff_rise_rate) {
|
|
onStateFlg0(FLG0_UNK_40000000);
|
|
}
|
|
return 4;
|
|
}
|
|
}
|
|
|
|
daAlink_c* player = daAlink_getAlinkActorClass();
|
|
|
|
if (player->checkHorseSubjectivity() && checkStateFlg0(FLG0_UNK_1)) {
|
|
if (speedF < 0.0f) {
|
|
var_r28 = checkHorseNoMove(0);
|
|
if (var_r28 == 2) {
|
|
speedF = 0.0f;
|
|
} else if (var_r28 == 1) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
}
|
|
} else if (m_lashAccelerationTime == 0 && speedF > m_normalMaxSpeedF) {
|
|
cLib_chaseF(&speedF, m_normalMaxSpeedF, daHorse_hio_c0::m.stopping_deceleration);
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_200000)) {
|
|
if (abs(current.angle.y) < 0x4000) {
|
|
cLib_addCalcAngleS(¤t.angle.y, 0, 2, 0x2000, 0x100);
|
|
} else {
|
|
cLib_addCalcAngleS(¤t.angle.y, -0x8000, 2, 0x2000, 0x100);
|
|
}
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 2, 0x2000, 0x100);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
s16 spA;
|
|
if (checkInputOnR()) {
|
|
spA = m_padStickAngleY - shape_angle.y;
|
|
} else {
|
|
spA = 0;
|
|
}
|
|
|
|
int var_r27;
|
|
if (abs(spA) > 0x6000 && !checkStateFlg0(FLG0_UNK_10000000)) {
|
|
var_r27 = 1;
|
|
} else if (spA >= 0x3000) {
|
|
var_r27 = 2;
|
|
} else if (spA <= -0x3000) {
|
|
var_r27 = 3;
|
|
} else {
|
|
var_r27 = 0;
|
|
}
|
|
|
|
if (checkInputOnR()) {
|
|
if (checkStateFlg0(FLG0_UNK_40000) && (m_anmIdx[2] != ANM_HS_WAIT_03 || m_frameCtrl[2].getFrame() >= 18.0f)) {
|
|
if (var_r27 == 1) {
|
|
cLib_addCalcAngleS(¤t.angle.y, m_padStickAngleY + 0x8000, 5, field_0x16c2, daHorse_hio_c0::m.min_turn);
|
|
} else {
|
|
cLib_addCalcAngleS(¤t.angle.y, m_padStickAngleY, 5, field_0x16c2, daHorse_hio_c0::m.min_turn);
|
|
}
|
|
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
} else if (var_r27 != 1) {
|
|
if (checkStateFlg0(FLG0_UNK_10000000) || (!player->checkHorseWalkStartAnm() && (!player->checkHorseWaitLashAnime() || checkEndResetStateFlg0(ERFLG0_MOVE_ACCEPT)))) {
|
|
if (speedF <= 0.05f) {
|
|
f32 var_f28 = m_padStickValue;
|
|
if (var_f28 < 0.5f) {
|
|
var_f28 = 0.5f;
|
|
}
|
|
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
cLib_addCalcAngleS(¤t.angle.y, m_padStickAngleY, 5, field_0x16c2 * var_f28, daHorse_hio_c0::m.min_turn * var_f28);
|
|
}
|
|
} else {
|
|
cLib_addCalcAngleS(¤t.angle.y, m_padStickAngleY, 5, field_0x16c2, daHorse_hio_c0::m.min_turn);
|
|
}
|
|
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
}
|
|
} else {
|
|
if (checkStateFlg0(FLG0_UNK_2) && player->checkHorseBackInput()) {
|
|
return 3;
|
|
}
|
|
|
|
cLib_addCalcAngleS(¤t.angle.y, (m_padStickAngleY + 0x8000), 5, field_0x16c2, daHorse_hio_c0::m.min_turn);
|
|
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_demoMode == 6) {
|
|
if (var_r28 != 0 && speedF > 0.0f) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_1)) {
|
|
dAttention_c* attention = dComIfGp_getAttention();
|
|
if (attention->GetLockonList(0) != NULL && attention->LockonTruth() && fopAcM_searchActorDistanceXZ2(this, attention->GetLockonList(0)->getActor()) > 1000000.0f) {
|
|
cLib_addCalcAngleS(¤t.angle.y, fopAcM_searchActorAngleY(this, attention->GetLockonList(0)->getActor()), 5, field_0x16c2, daHorse_hio_c0::m.min_turn);
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (field_0x1702 != 0) {
|
|
shape_angle.y += field_0x1702;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
if (checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
fopAc_ac_c* boar_p = NULL;
|
|
fopAcIt_Executor((fopAcIt_ExecutorFunc)daHorse_searchSingleBoar, &boar_p);
|
|
|
|
if (checkInputOnR() && boar_p != NULL && fopAcM_seenActorAngleY(this, boar_p) < 0x4000 && boar_p->current.pos.abs2XZ(current.pos) < 2250000.0f) {
|
|
s16 sp8;
|
|
if (abs((s16)(shape_angle.y - current.angle.y)) > 0x5000) {
|
|
sp8 = field_0x170a + ((s16)((current.angle.y + 0x8000) - field_0x170a) / 4);
|
|
} else {
|
|
sp8 = field_0x170a + ((s16)(current.angle.y - field_0x170a) / 4);
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.y, sp8, 5, 0x2000, 0x100);
|
|
} else {
|
|
if (current.angle.y < 0x4000 && current.angle.y > 0x1800) {
|
|
current.angle.y = 0x1800;
|
|
} else if (current.angle.y > -0x4000 && current.angle.y < -0x1800) {
|
|
current.angle.y = -0x1800;
|
|
} else if (current.angle.y < 0x6800 && current.angle.y >= 0x4000) {
|
|
current.angle.y = 0x6800;
|
|
} else if (current.angle.y > -0x6800 && current.angle.y <= -0x4000) {
|
|
current.angle.y = -0x6800;
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 5, 0x2000, 0x100);
|
|
}
|
|
}
|
|
|
|
cLib_chaseAngleS(&field_0x1702, 0, 0xC0);
|
|
|
|
f32 var_f30 = cM_scos(spA);
|
|
if (checkStateFlg0(FLG0_UNK_2)) {
|
|
if (var_f30 < 0.7f) {
|
|
var_f30 = 0.7f;
|
|
}
|
|
} else if (speedF < 0.05f && var_r27 != 0) {
|
|
var_f30 = 0.0f;
|
|
} else if (var_f30 < 0.0f) {
|
|
var_f30 = 0.0f;
|
|
}
|
|
|
|
if (var_r28 != 0 && speedF > 0.0f) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
} else if (checkStateFlg0(FLG0_UNK_40000)) {
|
|
if (m_anmIdx[2] != ANM_HS_WAIT_03 || m_frameCtrl[2].getFrame() >= 18.0f) {
|
|
cLib_chaseF(&speedF, -daHorse_hio_c0::m.max_backward_speed, daHorse_hio_c0::m.max_backward_acceleration);
|
|
|
|
field_0x1704--;
|
|
if (field_0x1704 == 0) {
|
|
offStateFlg0(FLG0_UNK_40000);
|
|
} else if (checkHorseNoMove(0) == 2) {
|
|
offStateFlg0(FLG0_UNK_40000);
|
|
field_0x1704 = 0;
|
|
speedF = 0.0f;
|
|
}
|
|
}
|
|
} else if (checkInputOnR() && m_lashAccelerationTime == 0 && var_r27 == 1) {
|
|
if (speedF > 0.0f) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
} else if (!checkStateFlg0(FLG0_UNK_8) && (checkTurnInput() || checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) && checkTurnPlayerState() && speedF > (0.2f * -daHorse_hio_c0::m.max_backward_speed)) {
|
|
return 1;
|
|
} else {
|
|
int spC = checkHorseNoMove(0);
|
|
if (spC == 0) {
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
cLib_chaseF(&speedF, -daHorse_hio_c0::m.max_backward_speed, daHorse_hio_c0::m.max_backward_acceleration);
|
|
}
|
|
} else if (spC == 1) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
} else {
|
|
speedF = 0.0f;
|
|
}
|
|
}
|
|
} else if (m_cowHit != 0) {
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_100000 | FLG0_UNK_200000))) {
|
|
cLib_chaseF(&speedF, 0.5f * m_normalMaxSpeedF, daHorse_hio_c0::m.lash_acceleration);
|
|
}
|
|
} else {
|
|
f32 var_f31;
|
|
f32 var_f29;
|
|
if (var_r28 != 0) {
|
|
var_f31 = 0.0f;
|
|
var_f29 = daHorse_hio_c0::m.deceleration;
|
|
} else if (m_lashAccelerationTime != 0 || (checkStateFlg0(FLG0_RODEO_MODE) && checkStateFlg0(FLG0_UNK_1)) || m_demoMode == 4) {
|
|
var_f31 = m_lashMaxSpeedF;
|
|
var_f29 = daHorse_hio_c0::m.lash_acceleration;
|
|
if (speedF < daHorse_hio_c0::m.min_lash_speed) {
|
|
speedF = daHorse_hio_c0::m.min_lash_speed;
|
|
}
|
|
} else {
|
|
if (player->checkHorseHangMode()) {
|
|
var_f31 = speedF;
|
|
if (m_lashAccelerationTime == 0 && speedF > m_normalMaxSpeedF) {
|
|
var_f31 = m_normalMaxSpeedF;
|
|
}
|
|
} else {
|
|
var_f31 = var_f30 * (m_normalMaxSpeedF * (m_padStickValue * m_padStickValue));
|
|
}
|
|
|
|
var_f29 = daHorse_hio_c0::m.acceleration;
|
|
if (checkStateFlg0(FLG0_UNK_4) && abs(field_0x16ea) < 0x4000) {
|
|
var_f31 *= 1.0f - (0.8f * cM_scos(field_0x16ea));
|
|
}
|
|
}
|
|
|
|
if (dComIfG_Bgsp().ChkPolySafe(m_acch.m_gnd) && dComIfG_Bgsp().GetGroundCode(m_acch.m_gnd) == 11 && var_f31 > (m_normalMaxSpeedF + (0.5f * m_lashAddSpeed))) {
|
|
var_f31 = m_normalMaxSpeedF + (0.5f * m_lashAddSpeed);
|
|
}
|
|
|
|
if (var_f31 > fabsf(speedF)) {
|
|
cLib_chaseF(&speedF, var_f31, var_f29);
|
|
} else if (checkStateFlg0(FLG0_UNK_4) || (!dComIfGp_event_runCheck() && !daAlink_getAlinkActorClass()->checkHorseRide() && !checkStateFlg0(daHorse_FLG0(FLG0_RODEO_MODE | FLG0_UNK_10000000)) && m_procID == PROC_MOVE_e)) {
|
|
if (checkStateFlg0(FLG0_UNK_2) && !checkStateFlg0(FLG0_UNK_4)) {
|
|
return 3;
|
|
}
|
|
|
|
cLib_chaseF(&speedF, var_f31, daHorse_hio_c0::m.stopping_deceleration);
|
|
} else {
|
|
if (dComIfGp_event_runCheck() || checkStateFlg0(FLG0_UNK_10000000)) {
|
|
var_f29 = daHorse_hio_c0::m.stopping_deceleration;
|
|
} else {
|
|
var_f29 = daHorse_hio_c0::m.deceleration;
|
|
}
|
|
|
|
cLib_chaseF(&speedF, var_f31, var_f29);
|
|
}
|
|
}
|
|
|
|
if (checkInputOnR() && m_procID == PROC_MOVE_e && var_r28 == 0 && var_r27 == 0 && speedF > 0.05f && speedF < daHorse_hio_c0::m.walk_min_speed) {
|
|
speedF = daHorse_hio_c0::m.walk_min_speed;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 8083D748-8083D774 005908 002C+00 1/1 0/0 0/0 .text checkWaitTurn__9daHorse_cCFv */
|
|
BOOL daHorse_c::checkWaitTurn() const {
|
|
return m_procID == PROC_WAIT_e && shape_angle.y != field_0x16e8;
|
|
}
|
|
|
|
/* 8083D774-8083D918 005934 01A4+00 2/2 0/0 0/0 .text setRoomInfo__9daHorse_cFi */
|
|
void daHorse_c::setRoomInfo(int param_0) {
|
|
int room_no;
|
|
if (-1000000000.0f != m_acch.GetGroundH() && (checkStateFlg0(FLG0_UNK_1) || m_procID == PROC_LARGE_DAMAGE_e || m_procID == PROC_JUMP_e || current.pos.y - m_acch.GetGroundH() < 500.0f)) {
|
|
room_no = dComIfG_Bgsp().GetRoomId(m_acch.m_gnd);
|
|
tevStr.YukaCol = dComIfG_Bgsp().GetPolyColor(m_acch.m_gnd);
|
|
|
|
if (m_acch.ChkWaterHit() && m_acch.m_wtr.GetHeight() > current.pos.y) {
|
|
m_poly_sound = dKy_pol_sound_get(&m_acch.m_wtr);
|
|
} else if (m_acch.ChkGroundHit()) {
|
|
m_poly_sound = dKy_pol_sound_get(&m_acch.m_gnd);
|
|
} else {
|
|
m_poly_sound = 0;
|
|
}
|
|
|
|
if (m_acch.ChkGroundHit() && m_procID != PROC_LARGE_DAMAGE_e && m_procID != PROC_JUMP_e) {
|
|
savePos();
|
|
}
|
|
|
|
onStateFlg0(FLG0_UNK_4000);
|
|
} else {
|
|
room_no = fopAcM_GetRoomNo(this);
|
|
m_poly_sound = 0;
|
|
savePos();
|
|
offStateFlg0(FLG0_UNK_4000);
|
|
}
|
|
|
|
if (param_0 != 0 || room_no != fopAcM_GetRoomNo(this)) {
|
|
tevStr.room_no = room_no;
|
|
if (tevStr.room_no == -1) {
|
|
tevStr.room_no = dComIfGp_roomControl_getStayNo();
|
|
}
|
|
|
|
m_reverb = dComIfGp_getReverb(room_no);
|
|
m_cc_stts.SetRoomId(room_no);
|
|
fopAcM_SetRoomNo(this, room_no);
|
|
}
|
|
}
|
|
|
|
/* 80845C04-80845C10 000054 000C+00 1/2 0/0 0/0 .bss l_frontFootOffset */
|
|
static cXyz l_frontFootOffset(23.5f, -20.0f, 0.0f);
|
|
|
|
/* 80845C1C-80845C28 00006C 000C+00 1/2 0/0 0/0 .bss l_backFootOffset */
|
|
static cXyz l_backFootOffset(25.5f, 12.0f, 0.0f);
|
|
|
|
/* 8083D918-8083D9D8 005AD8 00C0+00 2/2 0/0 0/0 .text setBodyPart__9daHorse_cFv */
|
|
void daHorse_c::setBodyPart() {
|
|
static cXyz localEyePos(25.0f, -15.0f, 0.0f);
|
|
|
|
mDoMtx_multVec(m_model->getAnmMtx(15), &localEyePos, &eyePos);
|
|
mDoMtx_multVecZero(m_model->getAnmMtx(0), &m_bodyEyePos);
|
|
}
|
|
|
|
/* 8083D9D8-8083DC58 005B98 0280+00 2/2 0/0 0/0 .text setMatrix__9daHorse_cFv */
|
|
void daHorse_c::setMatrix() {
|
|
s16 var_r29 = 0;
|
|
s16 var_r27 = 0;
|
|
f32 temp_f31 = m_normalMaxSpeedF * daHorse_hio_c0::m.fastwalk_to_run_rate;
|
|
|
|
if (m_procID == PROC_MOVE_e && speedF > temp_f31) {
|
|
f32 var_f30;
|
|
if (speedF <= m_normalMaxSpeedF) {
|
|
var_f30 = (0.3f * (speedF - temp_f31)) / (m_normalMaxSpeedF - temp_f31);
|
|
} else {
|
|
var_f30 = 0.5f + ((0.5f * speedF) / m_lashMaxSpeedF);
|
|
}
|
|
|
|
var_r29 = 4.0f * var_f30 * ((500.0f / (f32)field_0x16c2) * (f32)(s16)(field_0x16e8 - shape_angle.y));
|
|
var_r27 = -var_r29;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_1) && checkStateFlg0(FLG0_RODEO_MODE) && m_procID == PROC_MOVE_e) {
|
|
if (checkStateFlg0(FLG0_RODEO_LEFT)) {
|
|
if (var_r29 < 1500) {
|
|
var_r29 = 1500;
|
|
}
|
|
} else if (var_r29 > -1500) {
|
|
var_r29 = -1500;
|
|
}
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.z, var_r29, 4, 1000, 100);
|
|
|
|
if (var_r27 == 0) {
|
|
cLib_addCalcAngleS(&field_0x16fa, 0, 2, 4000, 1000);
|
|
} else {
|
|
cLib_addCalcAngleS(&field_0x16fa, var_r27, 4, 1200, 200);
|
|
}
|
|
|
|
setNeckAngle();
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
m_model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
attention_info.position.set(current.pos.x + (140.0f * cM_ssin(shape_angle.y)), 200.0f + current.pos.y, current.pos.z + (140.0f * cM_scos(shape_angle.y)));
|
|
} else {
|
|
attention_info.position.set(current.pos.x, 200.0f + current.pos.y, current.pos.z);
|
|
}
|
|
}
|
|
|
|
/* 8083DC58-8083DEEC 005E18 0294+00 1/1 0/0 0/0 .text setDashEffect__9daHorse_cFPUl */
|
|
void daHorse_c::setDashEffect(u32* i_emitterID) {
|
|
camera_class* camera_p = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
cXyz* eye_p = fopCamM_GetEye_p(camera_p);
|
|
|
|
if (!(eye_p->abs(current.pos) > 1200.0f)) {
|
|
s16 var_r28 = shape_angle.y - fopCamM_GetAngleY(camera_p);
|
|
f32 temp_f31 = (200.0f * std::abs(cM_ssin(var_r28))) + (700.0f * std::abs(cM_scos(var_r28)));
|
|
f32 temp_f30 = temp_f31 * cM_scos(fopCamM_GetAngleX(camera_p));
|
|
|
|
Vec pos = {0.0f, 0.0f, 0.0f};
|
|
pos.x = eye_p->x + (temp_f30 * cM_ssin(fopCamM_GetAngleY(camera_p)));
|
|
pos.y = eye_p->y + (temp_f31 * cM_ssin(-fopCamM_GetAngleX(camera_p)));
|
|
pos.z = eye_p->z + (temp_f30 * cM_scos(fopCamM_GetAngleY(camera_p)));
|
|
|
|
SVec angle = {0, shape_angle.y, 0};
|
|
|
|
*i_emitterID = dComIfGp_particle_set(*i_emitterID, 0x8657, (cXyz*)&pos, &tevStr, (csXyz*)&angle, NULL, 0xFF, NULL, -1, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
/* 8083DEEC-8083E4D8 0060AC 05EC+00 1/1 0/0 0/0 .text setEffect__9daHorse_cFv */
|
|
// NONMATCHING - regalloc
|
|
void daHorse_c::setEffect() {
|
|
JPABaseEmitter* sp50;
|
|
int sp4C;
|
|
if (checkEndResetStateFlg0(ERFLG0_UNK_400)) {
|
|
setDashEffect(&field_0x1738[field_0x16bd]);
|
|
sp4C = field_0x16bd;
|
|
field_0x16bd ^= 1;
|
|
} else {
|
|
sp4C = -1;
|
|
}
|
|
|
|
f32 var_f31 = 2.0f * (speedF / m_normalMaxSpeedF);
|
|
if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
}
|
|
|
|
u8 sp21 = 255.0f * var_f31;
|
|
|
|
for (int sp48 = 0; sp48 < 2; sp48++) {
|
|
if (sp48 != sp4C) {
|
|
sp50 = dComIfGp_particle_getEmitter(field_0x1738[sp48]);
|
|
if (sp50 != NULL && !sp50->isEnableDeleteEmitter()) {
|
|
setDashEffect(&field_0x1738[sp48]);
|
|
if (sp50->getGlobalAlpha() > sp21) {
|
|
sp50->setGlobalAlpha(sp21);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
u32 sp44 = 0;
|
|
if (field_0x16b7 == 2) {
|
|
sp44 |= 3;
|
|
}
|
|
|
|
u32 sp40 = 0;
|
|
if (field_0x16b8 == 1) {
|
|
sp40 |= 0x20000;
|
|
}
|
|
|
|
if (m_acch.ChkGroundHit()) {
|
|
field_0x17dc.setEffectFour(&tevStr,
|
|
¤t.pos,
|
|
sp44,
|
|
sp40,
|
|
NULL,
|
|
(field_0x16b6 & 1) ? &m_footData[0].field_0xc : NULL,
|
|
(field_0x16b6 & 2) ? &m_footData[1].field_0xc : NULL,
|
|
(field_0x16b6 & 4) ? &m_footData[2].field_0xc : NULL,
|
|
(field_0x16b6 & 8) ? &m_footData[3].field_0xc : NULL,
|
|
¤t.angle,
|
|
NULL,
|
|
fopAcM_GetRoomNo(this),
|
|
1.0f,
|
|
speedF);
|
|
} else {
|
|
field_0x17dc.setEffectFour(&tevStr,
|
|
¤t.pos,
|
|
sp44,
|
|
sp40,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
¤t.angle,
|
|
NULL,
|
|
fopAcM_GetRoomNo(this),
|
|
1.0f,
|
|
speedF);
|
|
}
|
|
|
|
static cXyz runScale(2.0f, 2.0f, 2.0f);
|
|
static cXyz landScale(1.5f, 1.5f, 1.5f);
|
|
static cXyz grassRunScale(1.8f, 1.8f, 1.8f);
|
|
static cXyz waterDirection(0.0f, 1.0f, -0.75f);
|
|
|
|
int k, j, i;
|
|
for (i = 0; i < 5; i++) {
|
|
for (j = 0; j < 2; j++) {
|
|
u8 sp20 = field_0x17dc.getTypeFour(i, j);
|
|
if (sp20 == 0) {
|
|
sp50 = field_0x17dc.getEmitterFour(i, j, 0);
|
|
if (sp50 != NULL) {
|
|
if (field_0x16b7 == 2) {
|
|
sp50->setGlobalScale(landScale);
|
|
} else {
|
|
sp50->setGlobalScale(runScale);
|
|
if (field_0x16b7 == 0) {
|
|
sp50->setRate(3.0f);
|
|
} else {
|
|
sp50->setRate(0.75f);
|
|
}
|
|
}
|
|
}
|
|
} else if (sp20 == 1) {
|
|
sp50 = field_0x17dc.getEmitterFour(i, j, 0);
|
|
if (sp50 != NULL) {
|
|
if (field_0x16b7 == 2) {
|
|
sp50->setGlobalScale(landScale);
|
|
} else {
|
|
sp50->setGlobalScale(grassRunScale);
|
|
if (field_0x16b7 == 0) {
|
|
sp50->setRate(4.0f);
|
|
} else {
|
|
sp50->setRate(0.5f);
|
|
}
|
|
}
|
|
}
|
|
} else if (sp20 == 2) {
|
|
for (k = 0; k < 4; k++) {
|
|
sp50 = field_0x17dc.getEmitterFour(i, j, k);
|
|
if (sp50 != NULL) {
|
|
if (field_0x16b7 == 2) {
|
|
sp50->setGlobalScale(landScale);
|
|
} else {
|
|
sp50->setGlobalScale(this->scale);
|
|
if (field_0x16b7 == 1) {
|
|
sp50->setRateStep(3);
|
|
}
|
|
|
|
if (k != 0) {
|
|
sp50->setDirection(waterDirection);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083E4D8-8083E6E8 006698 0210+00 1/1 0/0 0/0 .text setCollision__9daHorse_cFv */
|
|
void daHorse_c::setCollision() {
|
|
m_cc_stts.Move();
|
|
f32 sin_y = cM_ssin(shape_angle.y);
|
|
f32 cos_y = cM_scos(shape_angle.y);
|
|
|
|
cXyz center(current.pos.x + (170.0f * sin_y), current.pos.y, current.pos.z + (170.0f * cos_y));
|
|
m_boar_cyl.SetC(center);
|
|
|
|
center.set(current.pos.x + (83.0f * sin_y), current.pos.y, current.pos.z + (83.0f * cos_y));
|
|
|
|
sin_y *= 80.0f;
|
|
cos_y *= 80.0f;
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
m_tgco_cyl[i].SetC(center);
|
|
center.x -= sin_y;
|
|
center.z -= cos_y;
|
|
}
|
|
|
|
static const Vec localHeadPos = {20.0f, 0.0f, 0.0f};
|
|
mDoMtx_multVec(m_model->getAnmMtx(15), &localHeadPos, ¢er);
|
|
m_head_sph.SetC(center);
|
|
|
|
dComIfG_Ccsp()->Set(&m_tgco_cyl[0]);
|
|
dComIfG_Ccsp()->Set(&m_tgco_cyl[1]);
|
|
dComIfG_Ccsp()->Set(&m_tgco_cyl[2]);
|
|
g_dComIfG_gameInfo.play.mCcs.SetMass(&m_tgco_cyl[0], 1); // fakematch
|
|
g_dComIfG_gameInfo.play.mCcs.SetMass(&m_tgco_cyl[2], 1); // fakematch
|
|
dComIfG_Ccsp()->Set(&m_head_sph);
|
|
dComIfG_Ccsp()->Set(&m_boar_cyl);
|
|
|
|
center.y = current.pos.y;
|
|
m_at_cyl.MoveCAt(center);
|
|
|
|
if (checkResetStateFlg0(RFLG0_UNK_20)) {
|
|
dComIfG_Ccsp()->Set(&m_at_cyl);
|
|
g_dComIfG_gameInfo.play.mCcs.SetMass(&m_at_cyl, 1); // fakematch
|
|
} else {
|
|
m_at_cyl.ResetAtHit();
|
|
}
|
|
}
|
|
|
|
/* 8083E6E8-8083E760 0068A8 0078+00 1/1 0/0 0/0 .text autoGroundHit__9daHorse_cFv */
|
|
void daHorse_c::autoGroundHit() {
|
|
if (checkStateFlg0(FLG0_UNK_10) && m_procID != PROC_LARGE_DAMAGE_e && m_procID != PROC_JUMP_e) {
|
|
f32 dist_to_ground = m_acch.GetGroundH() - current.pos.y;
|
|
if (!m_acch.ChkGroundHit() && dist_to_ground < 0.0f && dist_to_ground >= -l_autoUpHeight) {
|
|
current.pos.y = m_acch.GetGroundH();
|
|
m_acch.SetGroundHit();
|
|
speed.y = 0.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083E760-8083E8A4 006920 0144+00 1/1 0/0 0/0 .text setTailAngle__9daHorse_cFv */
|
|
void daHorse_c::setTailAngle() {
|
|
s16* var_r30 = field_0x16d4;
|
|
s16* var_r29 = field_0x16e0;
|
|
s16 var_r27 = shape_angle.y - field_0x16e8;
|
|
|
|
for (int i = 0; i < 3; i++, var_r30++, var_r29++) {
|
|
if (checkResetStateFlg0(RFLG0_UNK_1) || m_procID == PROC_TOOL_DEMO_e) {
|
|
*var_r30 = 0;
|
|
*var_r29 = 0;
|
|
} else {
|
|
*var_r30 -= var_r27;
|
|
s16 sp8 = *var_r30;
|
|
|
|
cLib_addCalcAngleS(var_r30, 0, 5, 400, 35);
|
|
*var_r30 += *var_r29;
|
|
if (*var_r30 > 0x1000) {
|
|
*var_r30 = 0x1000;
|
|
} else if (*var_r30 < -0x1000) {
|
|
*var_r30 = -0x1000;
|
|
}
|
|
|
|
var_r27 = *var_r30 - sp8;
|
|
*var_r29 = 0.5f * var_r27;
|
|
|
|
if (checkEndResetStateFlg0(ERFLG0_UNK_40)) {
|
|
*var_r29 = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083E8A4-8083EA78 006A64 01D4+00 1/1 0/0 0/0 .text setNeckAngle__9daHorse_cFv */
|
|
void daHorse_c::setNeckAngle() {
|
|
int var_r27 = 0;
|
|
if (eventInfo.checkCommandTalk()) {
|
|
m_aimNeckAngleY = fopAcM_searchActorAngleY(this, daAlink_getAlinkActorClass()) - shape_angle.y;
|
|
} else if (field_0x1702 != 0) {
|
|
cLib_addCalcAngleS(&field_0x16f0, field_0x1702 * 3, 3, 0x400, 0x100);
|
|
return;
|
|
} else if (field_0x16fa != 0) {
|
|
field_0x16f0 = field_0x16fa;
|
|
return;
|
|
} else if (!checkStateFlg0(FLG0_UNK_1) && !checkResetStateFlg0(RFLG0_ENEMY_SEARCH) && m_procID == PROC_WAIT_e && m_anmIdx[0] == ANM_HS_WAIT_01) {
|
|
var_r27 = 1;
|
|
|
|
if (current.pos.abs2XZ(daAlink_getAlinkActorClass()->current.pos) < 250000.0f) {
|
|
daPy_py_c::setLookPos(&eyePos);
|
|
|
|
s16 var_r26 = fopAcM_searchActorAngleY(this, daAlink_getAlinkActorClass()) - shape_angle.y;
|
|
if (abs(var_r26) < 0x2000) {
|
|
m_aimNeckAngleY = var_r26;
|
|
} else {
|
|
m_aimNeckAngleY = 0;
|
|
}
|
|
} else {
|
|
m_aimNeckAngleY = 0;
|
|
}
|
|
} else {
|
|
m_aimNeckAngleY = 0;
|
|
}
|
|
|
|
s16 var_r29;
|
|
s16 var_r28;
|
|
if (var_r27 != 0) {
|
|
var_r29 = 0x100;
|
|
var_r28 = 0x40;
|
|
} else if (m_aimNeckAngleY == 0 || (m_aimNeckAngleY * field_0x16f0) < 0) {
|
|
var_r29 = 0x1000;
|
|
var_r28 = 0x100;
|
|
} else {
|
|
var_r29 = 0x200;
|
|
var_r28 = 0x40;
|
|
}
|
|
|
|
cLib_addCalcAngleS(&field_0x16f0, m_aimNeckAngleY, 3, var_r29, var_r28);
|
|
}
|
|
|
|
/* 8083EA78-8083EB10 006C38 0098+00 1/1 0/0 0/0 .text copyFootMatrix__9daHorse_cFv */
|
|
void daHorse_c::copyFootMatrix() {
|
|
daHorseFootData_c* footdata_p = m_footData;
|
|
for (int i = 0; i < 4; i++, footdata_p++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
cMtx_copy(m_model->getAnmMtx(j + m_footJointTable[i]), footdata_p->field_0x24[j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083EB10-8083ED88 006CD0 0278+00 1/1 0/0 0/0 .text setFootMatrix__9daHorse_cFv */
|
|
int daHorse_c::setFootMatrix() {
|
|
copyFootMatrix();
|
|
|
|
if (!m_oldFrame->getOldFrameFlg()) {
|
|
return 0;
|
|
}
|
|
|
|
daHorseFootData_c* footdata_p = m_footData;
|
|
int i;
|
|
int spC = 1;
|
|
|
|
for (i = 0; i < 4; i++, footdata_p++) {
|
|
u16 joint_no = m_footJointTable[i];
|
|
|
|
mDoMtx_stack_c::ZrotS(footdata_p->field_0x4[0] * spC);
|
|
mDoMtx_stack_c::revConcat(m_model->getAnmMtx(joint_no));
|
|
m_model->setAnmMtx(joint_no, mDoMtx_stack_c::get());
|
|
joint_no++;
|
|
|
|
J3DTransformInfo* transInfo_p = m_oldFrame->getOldFrameTransInfo(joint_no);
|
|
Quaternion* quat_p = m_oldFrame->getOldFrameQuaternion(joint_no);
|
|
|
|
mDoMtx_stack_c::transM(transInfo_p->mTranslate.x, transInfo_p->mTranslate.y, transInfo_p->mTranslate.z);
|
|
mDoMtx_stack_c::quatM(quat_p);
|
|
mDoMtx_stack_c::ZrotM(spC * (footdata_p->field_0x4[1] - footdata_p->field_0x4[0]));
|
|
mDoMtx_stack_c::scaleM(transInfo_p->mScale.x, transInfo_p->mScale.y, transInfo_p->mScale.z);
|
|
m_model->setAnmMtx(joint_no, mDoMtx_stack_c::get());
|
|
joint_no++;
|
|
transInfo_p++;
|
|
quat_p++;
|
|
|
|
mDoMtx_stack_c::transM(transInfo_p->mTranslate.x, transInfo_p->mTranslate.y, transInfo_p->mTranslate.z);
|
|
mDoMtx_stack_c::quatM(quat_p);
|
|
mDoMtx_stack_c::ZrotM(spC * (footdata_p->field_0x4[2] - footdata_p->field_0x4[1]));
|
|
mDoMtx_stack_c::scaleM(transInfo_p->mScale.x, transInfo_p->mScale.y, transInfo_p->mScale.z);
|
|
m_model->setAnmMtx(joint_no, mDoMtx_stack_c::get());
|
|
joint_no++;
|
|
transInfo_p++;
|
|
quat_p++;
|
|
|
|
mDoMtx_stack_c::transM(transInfo_p->mTranslate.x, transInfo_p->mTranslate.y, transInfo_p->mTranslate.z);
|
|
mDoMtx_stack_c::quatM(quat_p);
|
|
mDoMtx_stack_c::scaleM(transInfo_p->mScale.x, transInfo_p->mScale.y, transInfo_p->mScale.z);
|
|
|
|
if (i >= 2) {
|
|
mDoMtx_stack_c::ZrotM(spC * (footdata_p->field_0x4[3] - footdata_p->field_0x4[2]));
|
|
} else {
|
|
mDoMtx_stack_c::ZrotM(footdata_p->field_0x4[3]);
|
|
}
|
|
|
|
m_model->setAnmMtx(joint_no, mDoMtx_stack_c::get());
|
|
|
|
if (i == 1) {
|
|
spC = -1;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8083ED88-8083F3B0 006F48 0628+00 1/1 0/0 0/0 .text setLegAngle__9daHorse_cFfiiPs */
|
|
int daHorse_c::setLegAngle(f32 param_0, int param_1, int param_2, s16* param_3) {
|
|
if (fabsf(param_0) < 0.1f || ((param_1 == 0 || param_1 == 1) && param_2 == 0)) {
|
|
return 0;
|
|
}
|
|
|
|
cXyz spC0[4];
|
|
cXyz spB0;
|
|
cXyz spA4;
|
|
cXyz sp98;
|
|
cXyz sp8C;
|
|
cXyz sp80;
|
|
cXyz sp74;
|
|
cXyz sp68;
|
|
cXyz sp5C;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
mDoMtx_multVecZero(m_footData[param_1].field_0x24[i], &spB0);
|
|
mDoMtx_stack_c::multVec(&spB0, &spC0[i]);
|
|
spC0[i].x = 0.0f;
|
|
}
|
|
|
|
int sp10;
|
|
f32 var_f27;
|
|
if (param_1 == 0 || param_1 == 1) {
|
|
sp10 = 0;
|
|
var_f27 = 0.005f;
|
|
} else {
|
|
sp10 = 1;
|
|
var_f27 = 0.05f;
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
cXyz* sp1C = &spC0[i];
|
|
cXyz* sp18 = &spC0[i + 1];
|
|
cXyz* sp14 = &spC0[i + 2];
|
|
|
|
spA4 = *sp18 - *sp1C;
|
|
sp98 = *sp14 - *sp18;
|
|
|
|
if (i == 0) {
|
|
sp14->y += param_0 * var_f27;
|
|
} else {
|
|
sp14->y += param_0 * (1.0f - var_f27);
|
|
}
|
|
|
|
if (sp14->y >= sp1C->y) {
|
|
return 0;
|
|
}
|
|
|
|
sp74 = *sp14 - *sp1C;
|
|
|
|
f32 var_f29 = sp74.abs2();
|
|
if (cM3d_IsZero(var_f29)) {
|
|
return 0;
|
|
}
|
|
|
|
f32 temp_f26 = spA4.abs2();
|
|
f32 temp_f25 = sp98.abs2();
|
|
if (JMAFastSqrt(temp_f26) + JMAFastSqrt(temp_f25) <= JMAFastSqrt(var_f29)) {
|
|
return 0;
|
|
}
|
|
|
|
f32 temp_f28 = ((var_f29 + temp_f26) - temp_f25) / (2.0f * var_f29);
|
|
sp68.x = 0.0f;
|
|
sp68.y = sp1C->y + (temp_f28 * sp74.y);
|
|
sp68.z = sp1C->z + (temp_f28 * sp74.z);
|
|
|
|
f32 var_f31 = temp_f26 - (temp_f28 * (var_f29 * temp_f28));
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
var_f31 = JMAFastSqrt(var_f31);
|
|
if (param_1 == 0 || param_1 == 1) {
|
|
if (i == 0) {
|
|
sp5C.set(0.0f, -sp74.z, sp74.y);
|
|
} else {
|
|
sp5C.set(0.0f, sp74.z, -sp74.y);
|
|
}
|
|
} else if (i == 0) {
|
|
sp5C.set(0.0f, sp74.z, -sp74.y);
|
|
} else {
|
|
sp5C.set(0.0f, -sp74.z, sp74.y);
|
|
}
|
|
|
|
f32 temp_f30 = sp5C.abs();
|
|
if (cM3d_IsZero(temp_f30)) {
|
|
return 0;
|
|
}
|
|
|
|
temp_f30 = var_f31 / temp_f30;
|
|
|
|
sp18->set(0.0f, sp68.y + (temp_f30 * sp5C.y), sp68.z + (temp_f30 * sp5C.z));
|
|
|
|
sp8C = *sp18 - *sp1C;
|
|
sp80 = *sp14 - *sp18;
|
|
|
|
param_3[i] += (s16)(cM_atan2s(spA4.y, spA4.z) - cM_atan2s(sp8C.y, sp8C.z));
|
|
param_3[i + 1] += (s16)(cM_atan2s(sp98.y, sp98.z) - cM_atan2s(sp80.y, sp80.z));
|
|
|
|
if (i == 0) {
|
|
spC0[3].y += param_0 * var_f27;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8083F3B0-8083F9AC 007570 05FC+00 1/1 0/0 0/0 .text footBgCheck__9daHorse_cFv */
|
|
void daHorse_c::footBgCheck() {
|
|
int i;
|
|
daHorseFootData_c* footdata_p;
|
|
s16 spA0[4][4];
|
|
cXyz sp94;
|
|
cXyz sp88;
|
|
|
|
int sp24 = 4;
|
|
u32 sp20;
|
|
|
|
MtxP sp18 = m_model->getBaseTRMtx();
|
|
sp20 = fabsf(speedF) < 0.05f && m_procID != PROC_TURN_e;
|
|
|
|
footdata_p = m_footData;
|
|
mDoMtx_multVec(m_model->getAnmMtx(6), &l_frontFootOffset, &m_footData[0].field_0xc);
|
|
mDoMtx_multVec(m_model->getAnmMtx(0xA), &l_frontFootOffset, &m_footData[1].field_0xc);
|
|
mDoMtx_multVec(m_model->getAnmMtx(0x1E), &l_backFootOffset, &m_footData[2].field_0xc);
|
|
mDoMtx_multVec(m_model->getAnmMtx(0x22), &l_backFootOffset, &m_footData[3].field_0xc);
|
|
|
|
cXyz sp7C = current.pos - old.pos;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
spA0[i][j] = 0;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < 4; i++, footdata_p++) {
|
|
sp88 = footdata_p->field_0xc - footdata_p->field_0x18;
|
|
footdata_p->field_0xc += sp7C;
|
|
|
|
if (m_anmIdx[0] == ANM_HS_WAIT_02) {
|
|
footdata_p->field_0xc = footdata_p->field_0x18;
|
|
} else if (sp88.abs2XZ() < 100.0f && sp20 != 0) {
|
|
if (footdata_p->field_0x1 != 0) {
|
|
footdata_p->field_0x1--;
|
|
} else {
|
|
footdata_p->field_0xc = footdata_p->field_0x18 + sp7C;
|
|
}
|
|
} else {
|
|
footdata_p->field_0x1 = 5;
|
|
}
|
|
|
|
footdata_p->field_0x18 = footdata_p->field_0xc;
|
|
footdata_p->field_0xc.y += 120.0f;
|
|
|
|
if (fopAcM_gc_c::gndCheck(&footdata_p->field_0xc) && footdata_p->field_0xc.y - fopAcM_gc_c::getGroundY() < 240.0f) {
|
|
spA0[i][3] = fopAcM_gc_c::getGroundAngleDirection(shape_angle.y);
|
|
if (spA0[i][3] < 0) {
|
|
spA0[i][3] = 0;
|
|
}
|
|
footdata_p->field_0xc.y = fopAcM_gc_c::getGroundY();
|
|
} else {
|
|
footdata_p->field_0xc.y = current.pos.y;
|
|
}
|
|
}
|
|
|
|
if (!m_acch.ChkGroundHit() || m_procID == PROC_TOOL_DEMO_e) {
|
|
sp24 = 4;
|
|
} else {
|
|
f32 var_f30 = 1000.0f + current.pos.y;
|
|
|
|
if (checkResetStateFlg0(RFLG0_TURN_STAND)) {
|
|
i = 2;
|
|
} else {
|
|
i = 0;
|
|
}
|
|
|
|
for (; i < 4; i++) {
|
|
if (var_f30 > m_footData[i].field_0xc.y) {
|
|
var_f30 = m_footData[i].field_0xc.y;
|
|
sp24 = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
int sp14;
|
|
if (m_anmIdx[0] != ANM_HS_WAIT_02 && fabsf(m_footData[0].field_0xc.y - m_footData[1].field_0xc.y) > 30.0f) {
|
|
sp14 = 1;
|
|
} else {
|
|
sp14 = 0;
|
|
}
|
|
|
|
if (m_procID == PROC_JUMP_e || m_procID == PROC_TOOL_DEMO_e) {
|
|
field_0x1714 = 0;
|
|
} else {
|
|
cXyz sp70 = ((m_footData[0].field_0xc + m_footData[1].field_0xc) * 0.5f) - ((m_footData[2].field_0xc + m_footData[3].field_0xc) * 0.5f);
|
|
field_0x1714 = sp70.atan2sY_XZ();
|
|
}
|
|
|
|
s16 spA;
|
|
if (checkResetStateFlg0(RFLG0_TURN_STAND)) {
|
|
spA = 0;
|
|
} else {
|
|
spA = field_0x1714;
|
|
if (spA > 0x1C72) {
|
|
spA = 0x1C72;
|
|
} else if (spA < -0x1C72) {
|
|
spA = -0x1C72;
|
|
}
|
|
}
|
|
|
|
cLib_addCalcAngleS(&shape_angle.x, spA, 10, 2000, 182);
|
|
|
|
if (sp24 != 4) {
|
|
mDoMtx_stack_c::YrotS(-field_0x16e8);
|
|
mDoMtx_stack_c::transM(-old.pos.x, -old.pos.y, -old.pos.z);
|
|
setLegAngle(m_footData[sp24].field_0xc.y - sp18[1][3], sp24, sp14, spA0[sp24]);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (i != sp24) {
|
|
f32 temp_f31 = m_footData[i].field_0xc.y - sp18[1][3];
|
|
if (temp_f31 > 0.0f || sp20 != 0) {
|
|
setLegAngle(temp_f31, i, sp14, spA0[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
footdata_p = m_footData;
|
|
for (i = 0; i < 4; i++, footdata_p++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
cLib_addCalcAngleS(&footdata_p->field_0x4[j], spA0[i][j], 2, 0x1800, 0x10);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083F9AC-8083FDAC 007B6C 0400+00 2/2 0/0 0/0 .text setReinPosMoveInit__9daHorse_cFi */
|
|
void daHorse_c::setReinPosMoveInit(int param_0) {
|
|
static cXyz reinLeftStart(63.0f, 17.0f, 11.0f);
|
|
static cXyz reinRightStart(63.0f, 17.0f, -11.0f);
|
|
static cXyz localNeckLeft(10.0f, 10.0f, 35.0f);
|
|
static cXyz localNeckRight(10.0f, 10.0f, -35.0f);
|
|
|
|
mDoMtx_multVec(m_model->getAnmMtx(0xF), &reinLeftStart, m_rein[0].field_0x0[0]);
|
|
mDoMtx_multVec(m_model->getAnmMtx(0xF), &reinRightStart, m_rein[1].field_0x0[0]);
|
|
|
|
s16 spC = field_0x170e + 0x4000;
|
|
f32 var_f31 = 10.0f;
|
|
f32 temp_f28 = cM_ssin(spC);
|
|
f32 temp_f27 = cM_scos(spC);
|
|
f32 temp_f29 = fabsf((f32)field_0x1712 / 8192.0f);
|
|
|
|
if (shape_angle.x < 0) {
|
|
var_f31 += 0.0005f * -shape_angle.x;
|
|
}
|
|
|
|
if (param_0 != 3) {
|
|
var_f31 += 1.0f;
|
|
}
|
|
|
|
f32 var_f30 = var_f31;
|
|
m_rein[0].field_0x18 = 0.0f;
|
|
m_rein[1].field_0x18 = 0.0f;
|
|
|
|
if (field_0x1712 > 0) {
|
|
mDoMtx_multVec(m_model->getAnmMtx(0xB), &localNeckRight, &m_rein[1].field_0x1c);
|
|
m_rein[1].field_0x18 = 20.0f * temp_f29;
|
|
var_f30 += 10.0f * temp_f29;
|
|
} else if (field_0x1712 < 0) {
|
|
mDoMtx_multVec(m_model->getAnmMtx(0xB), &localNeckLeft, &m_rein[0].field_0x1c);
|
|
m_rein[0].field_0x18 = 20.0f * temp_f29;
|
|
var_f31 += 10.0f * temp_f29;
|
|
}
|
|
|
|
m_rein[0].field_0x10 = var_f31 * temp_f28;
|
|
m_rein[0].field_0x14 = var_f31 * temp_f27;
|
|
m_rein[1].field_0x10 = -var_f30 * temp_f28;
|
|
m_rein[1].field_0x14 = -var_f30 * temp_f27;
|
|
|
|
if ((current.pos.abs2(old.pos) < 1.0f && field_0x170e - field_0x1710 == 0) || checkResetStateFlg0(RFLG0_UNK_1)) {
|
|
return;
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(field_0x170e - field_0x1710);
|
|
mDoMtx_stack_c::transM(-old.pos.x, -old.pos.y, -old.pos.z);
|
|
cXyz sp24;
|
|
|
|
cXyz* sp20;
|
|
int j, i;
|
|
daHorseRein_c* rein_p = m_rein;
|
|
|
|
for (i = 0; i < 3; i++, rein_p++) {
|
|
sp20 = rein_p->field_0x0[0] + 1;
|
|
for (j = 1; j < rein_p->field_0x8[1]; j++, sp20++) {
|
|
sp24 = *sp20;
|
|
mDoMtx_stack_c::multVec(&sp24, sp20);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8083FDAC-8083FEB4 007F6C 0108+00 2/2 0/0 0/0 .text copyReinPos__9daHorse_cFv */
|
|
void daHorse_c::copyReinPos() {
|
|
int i;
|
|
cXyz* pos_p = m_reinLine.getPos(0);
|
|
field_0x1204 = m_rein[0].field_0x8[0];
|
|
|
|
for (i = 0; i < m_rein[0].field_0x8[0]; i++, pos_p++) {
|
|
*pos_p = m_rein[0].field_0x0[0][i];
|
|
}
|
|
|
|
if (m_rein[2].field_0x8[0] > 1) {
|
|
field_0x1204 += m_rein[2].field_0x8[0];
|
|
for (i = 0; i < m_rein[2].field_0x8[0]; i++, pos_p++) {
|
|
*pos_p = m_rein[2].field_0x0[0][i];
|
|
}
|
|
}
|
|
|
|
field_0x1204 += m_rein[1].field_0x8[0];
|
|
for (i = m_rein[1].field_0x8[0] - 1; i >= 0; i--, pos_p++) {
|
|
*pos_p = m_rein[1].field_0x0[0][i];
|
|
}
|
|
}
|
|
|
|
/* 8083FEB4-8084010C 008074 0258+00 1/0 0/0 0/0 .text setReinPosHandSubstance__9daHorse_cFi */
|
|
void daHorse_c::setReinPosHandSubstance(int param_0) {
|
|
static const Vec zeldaLocalLeft = {3.0f, -0.5f, -5.0f};
|
|
static const Vec zeldaLocalRight = {3.0f, -0.5f, 5.0f};
|
|
|
|
setReinPosMoveInit(param_0);
|
|
|
|
daAlink_c* player_p = daAlink_getAlinkActorClass();
|
|
int var_r29 = (-field_0x1712 * 5) / 0x2000;
|
|
if (param_0 != 3) {
|
|
var_r29 *= 2;
|
|
}
|
|
|
|
int var_r25;
|
|
if (param_0 & 1) {
|
|
var_r25 = var_r29 + 20;
|
|
} else {
|
|
var_r25 = var_r29 + 24;
|
|
}
|
|
|
|
int var_r24;
|
|
if (param_0 & 2) {
|
|
var_r24 = 20 - var_r29;
|
|
} else {
|
|
var_r24 = 24 - var_r29;
|
|
}
|
|
|
|
if (param_0 & 4) {
|
|
daHoZelda_c* hozelda_p = (daHoZelda_c*)m_zeldaActorKeep.getActor();
|
|
mDoMtx_multVec(hozelda_p->getRightFingerMtx(), &zeldaLocalLeft, &m_rein[0].field_0x0[0][var_r25]);
|
|
mDoMtx_multVec(hozelda_p->getRightFingerMtx(), &zeldaLocalRight, &m_rein[1].field_0x0[0][var_r24]);
|
|
} else {
|
|
player_p->getHorseReinHandPos(&m_rein[0].field_0x0[0][var_r25], &m_rein[1].field_0x0[0][var_r24]);
|
|
}
|
|
|
|
m_rein[0].setReinPosPart(var_r25);
|
|
m_rein[1].setReinPosPart(var_r24);
|
|
|
|
if (param_0 & 4) {
|
|
m_rein[2].setReinPosPart(0);
|
|
} else {
|
|
cXyz* temp_r26 = m_rein[2].field_0x0[0];
|
|
player_p->getHorseReinCenterLeftPos(temp_r26);
|
|
|
|
if (param_0 == 3) {
|
|
player_p->getHorseReinCenterRightPos(temp_r26 + 4);
|
|
m_rein[2].setReinPosPart(4);
|
|
} else {
|
|
m_rein[2].setReinPosPart(0);
|
|
}
|
|
|
|
if (checkResetStateFlg0(RFLG0_UNK_1)) {
|
|
for (int i = 0; i < 5; i++) {
|
|
m_rein[0].setReinPosPart(var_r25);
|
|
m_rein[1].setReinPosPart(var_r24);
|
|
|
|
temp_r26 = m_rein[2].field_0x0[0];
|
|
player_p->getHorseReinCenterLeftPos(temp_r26);
|
|
|
|
if (param_0 == 3) {
|
|
player_p->getHorseReinCenterRightPos(temp_r26 + 4);
|
|
m_rein[2].setReinPosPart(4);
|
|
} else {
|
|
m_rein[2].setReinPosPart(0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
copyReinPos();
|
|
}
|
|
|
|
/* 8084010C-808402F8 0082CC 01EC+00 1/0 0/0 0/0 .text setReinPosNormalSubstance__9daHorse_cFv */
|
|
void daHorse_c::setReinPosNormalSubstance() {
|
|
static cXyz saddleLeft(29.0f, -2.0f, 30.0f);
|
|
static cXyz saddleRight(29.0f, 2.0f, 30.0f);
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_1) && getZeldaActor() != NULL) {
|
|
if (((daHoZelda_c*)getZeldaActor())->checkSingleRide()) {
|
|
offStateFlg0(FLG0_UNK_4000000);
|
|
return;
|
|
}
|
|
}
|
|
|
|
setReinPosMoveInit(0);
|
|
|
|
mDoMtx_multVec(m_model->getAnmMtx(0x15), &saddleLeft, m_rein[0].field_0x0[0] + 24);
|
|
m_rein[0].setReinPosPart(24);
|
|
|
|
mDoMtx_multVec(m_model->getAnmMtx(0x15), &saddleRight, m_rein[1].field_0x0[0] + 24);
|
|
m_rein[1].setReinPosPart(24);
|
|
|
|
*m_rein[2].field_0x0[0] = m_rein[0].field_0x0[0][24];
|
|
m_rein[2].setReinPosPart(0);
|
|
|
|
if (checkResetStateFlg0(RFLG0_UNK_1)) {
|
|
for (int i = 0; i < 5; i++) {
|
|
m_rein[0].setReinPosPart(24);
|
|
m_rein[1].setReinPosPart(24);
|
|
*m_rein[2].field_0x0[0] = m_rein[0].field_0x0[0][24];
|
|
m_rein[2].setReinPosPart(0);
|
|
}
|
|
}
|
|
|
|
copyReinPos();
|
|
}
|
|
|
|
/* 808402F8-80840714 0084B8 041C+00 1/1 0/0 0/0 .text bgCheck__9daHorse_cFv */
|
|
void daHorse_c::bgCheck() {
|
|
if (m_procID != PROC_LARGE_DAMAGE_e) {
|
|
static cXyz localCenterPos(0.0f, 100.0f, 0.0f);
|
|
static cXyz localFrontPos(0.0f, 100.0f, 220.0f);
|
|
static cXyz localBackPos(0.0f, 100.0f, -170.0f);
|
|
|
|
cXyz line_start;
|
|
cXyz line_end;
|
|
cXyz* linecross_p = NULL;
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x1714, shape_angle.y, 0);
|
|
mDoMtx_stack_c::multVec(&localCenterPos, &line_start);
|
|
mDoMtx_stack_c::multVec(&localFrontPos, &line_end);
|
|
|
|
cM3dGPla plane;
|
|
m_linechk.Set(&line_start, &line_end, this);
|
|
|
|
if (dComIfG_Bgsp().LineCross(&m_linechk)) {
|
|
dComIfG_Bgsp().GetTriPla(m_linechk, &plane);
|
|
if (cBgW_CheckBWall(plane.mNormal.y)) {
|
|
linecross_p = m_linechk.GetCrossP();
|
|
onStateFlg0(FLG0_UNK_4);
|
|
field_0x16ea = (current.angle.y + 0x8000) - plane.mNormal.atan2sX_Z();
|
|
}
|
|
}
|
|
|
|
if (linecross_p == NULL) {
|
|
offStateFlg0(FLG0_UNK_4);
|
|
mDoMtx_stack_c::multVec(&localBackPos, &line_end);
|
|
|
|
m_linechk.Set(&line_start, &line_end, this);
|
|
if (dComIfG_Bgsp().LineCross(&m_linechk) != 0) {
|
|
dComIfG_Bgsp().GetTriPla(m_linechk, &plane);
|
|
if (cBgW_CheckBWall(plane.mNormal.y)) {
|
|
linecross_p = m_linechk.GetCrossP();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (linecross_p != NULL) {
|
|
line_end -= *linecross_p;
|
|
|
|
f32 temp_f31 = -line_end.absXZ() * cM_scos(line_end.atan2sX_Z() - cM_atan2s(-plane.mNormal.x, -plane.mNormal.z));
|
|
current.pos.x -= temp_f31 * plane.mNormal.x;
|
|
current.pos.y -= line_end.y;
|
|
current.pos.z -= temp_f31 * plane.mNormal.z;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80840714-808407B0 0088D4 009C+00 1/0 0/0 0/0 .text
|
|
* checkSpecialWallHitSubstance__9daHorse_cCFRC4cXyz */
|
|
bool daHorse_c::checkSpecialWallHitSubstance(const cXyz& param_0) const {
|
|
if (m_procID == PROC_JUMP_e) {
|
|
return 0;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_100)) {
|
|
return 1;
|
|
}
|
|
|
|
if (speedF < (0.7f * m_normalMaxSpeedF)) {
|
|
return 1;
|
|
}
|
|
|
|
if (cLib_distanceAngleS(shape_angle.y, param_0.atan2sX_Z()) > 0x6000) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808407B0-80840800 008970 0050+00 3/3 0/0 0/0 .text setServiceWaitTimer__9daHorse_cFv
|
|
*/
|
|
void daHorse_c::setServiceWaitTimer() {
|
|
m_serviceWaitTimer = cM_rndF(80.0f) + 150.0f;
|
|
}
|
|
|
|
/* 80840800-80840844 0089C0 0044+00 2/2 0/0 0/0 .text checkServiceWaitAnime__9daHorse_cFv
|
|
*/
|
|
BOOL daHorse_c::checkServiceWaitAnime() {
|
|
return m_anmIdx[0] == ANM_HS_WAIT_03 ||
|
|
m_anmIdx[0] == ANM_HS_WAIT_04 ||
|
|
m_anmIdx[0] == ANM_HS_WAIT_05 ||
|
|
m_anmIdx[0] == ANM_HS_WAIT_01B ||
|
|
m_anmIdx[0] == ANM_HS_WAIT_01B_CONNECT ||
|
|
m_anmIdx[0] == ANM_HS_WAIT_02;
|
|
}
|
|
|
|
/* 80840844-808408F0 008A04 00AC+00 2/2 0/0 0/0 .text checkTurnInput__9daHorse_cFv */
|
|
BOOL daHorse_c::checkTurnInput() {
|
|
return m_padStickValue > 0.9f && (!dComIfGp_getAttention()->Lockon() || daAlink_getAlinkActorClass()->getAtnActor() != NULL);
|
|
}
|
|
|
|
/* 808408F0-808409C0 008AB0 00D0+00 2/2 0/0 0/0 .text checkTgHitTurn__9daHorse_cFv */
|
|
BOOL daHorse_c::checkTgHitTurn() {
|
|
if (!dComIfGp_event_runCheck() && !checkStateFlg0(FLG0_UNK_1)) {
|
|
if (!daAlink_getAlinkActorClass()->checkHorseRideReady() &&
|
|
(checkEndResetStateFlg0(ERFLG0_UNK_800) ||
|
|
m_tgco_cyl[0].ChkTgHit() ||
|
|
m_tgco_cyl[1].ChkTgHit() ||
|
|
m_tgco_cyl[2].ChkTgHit() ||
|
|
m_head_sph.ChkTgHit()))
|
|
{
|
|
return procTurnInit(1);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 808409C0-80840B28 008B80 0168+00 3/3 0/0 0/0 .text checkTurnAfterFastMove__9daHorse_cFf */
|
|
BOOL daHorse_c::checkTurnAfterFastMove(f32 param_0) {
|
|
if (param_0 > field_0x177C) {
|
|
if (checkTgHitTurn()) {
|
|
return 1;
|
|
}
|
|
|
|
if (checkInputOnR()) {
|
|
int temp_r29 = abs((s16)(m_padStickAngleY - shape_angle.y));
|
|
if (field_0x16bc != 0) {
|
|
field_0x16bc--;
|
|
return procTurnInit(0);
|
|
}
|
|
|
|
if (temp_r29 < 0x2000 && !checkHorseNoMove(1)) {
|
|
speedF = daHorse_hio_c0::m.fastwalk_to_run_rate * m_normalMaxSpeedF;
|
|
return procMoveInit();
|
|
}
|
|
|
|
if (m_procID == PROC_TURN_e && field_0x1722 != 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (temp_r29 < 0x6000) {
|
|
return procWaitInit();
|
|
}
|
|
|
|
if (daAlink_getAlinkActorClass()->checkHorseTurnMode()) {
|
|
if (checkTurnInput() && !checkStateFlg0(FLG0_UNK_200)) {
|
|
return procTurnInit(0);
|
|
}
|
|
return procWaitInit();
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 80840B28-80840B88 008CE8 0060+00 2/2 0/0 0/0 .text setNeckAnimeMorf__9daHorse_cFv */
|
|
void daHorse_c::setNeckAnimeMorf() {
|
|
u16 start_jnt_no;
|
|
u16 end_jnt_no;
|
|
if (m_oldFrame->getOldFrameRate() > 0.1f && m_oldFrame->getOldFrameStartJoint() == 0) {
|
|
start_jnt_no = 0;
|
|
end_jnt_no = 38;
|
|
} else {
|
|
start_jnt_no = 11;
|
|
end_jnt_no = 21;
|
|
}
|
|
|
|
m_oldFrame->initOldFrameMorf(3.0f, start_jnt_no, end_jnt_no);
|
|
}
|
|
|
|
/* 80840B88-80840CA4 008D48 011C+00 4/4 0/0 0/0 .text setNeckAnime__9daHorse_cFUsffs */
|
|
void daHorse_c::setNeckAnime(u16 i_anmIdx, f32 i_speed, f32 i_startF, s16 i_endF) {
|
|
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, i_anmIdx);
|
|
|
|
s16 endF;
|
|
if (i_endF < 0) {
|
|
endF = bck->getFrameMax();
|
|
} else {
|
|
endF = i_endF;
|
|
}
|
|
|
|
f32 frame;
|
|
if (i_speed < 0.0f) {
|
|
frame = endF;
|
|
} else {
|
|
frame = i_startF;
|
|
}
|
|
|
|
m_anmIdx[2] = i_anmIdx;
|
|
m_anmRatio[2].setAnmTransform(bck);
|
|
m_frameCtrl[2].setFrameCtrl(bck->getAttribute(), i_startF, endF, i_speed, frame);
|
|
bck->setFrame(frame);
|
|
setNeckAnimeMorf();
|
|
}
|
|
|
|
/* 80840CA4-80840CE4 008E64 0040+00 9/9 0/0 0/0 .text resetNeckAnime__9daHorse_cFv */
|
|
void daHorse_c::resetNeckAnime() {
|
|
if (m_anmRatio[2].getAnmTransform() != NULL) {
|
|
m_anmRatio[2].setAnmTransform(NULL);
|
|
m_anmIdx[2] = 0xFFFF;
|
|
setNeckAnimeMorf();
|
|
}
|
|
}
|
|
|
|
/* 80840CE4-80840FE0 008EA4 02FC+00 1/1 0/0 0/0 .text setLashCnt__9daHorse_cFv */
|
|
void daHorse_c::setLashCnt() {
|
|
if (checkEndResetStateFlg0(ERFLG0_UNK_8) && checkStateFlg0(FLG0_UNK_1)) {
|
|
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER4, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
if (checkStateFlg0(FLG0_PLAYER_BACK_RIDE_LASH) || m_lashCnt > 0) {
|
|
mDoAud_seStart(Z2SE_WHIP_HORSE, NULL, 0, 0);
|
|
|
|
if (!checkStateFlg0(FLG0_PLAYER_BACK_RIDE_LASH)) {
|
|
m_lashCnt--;
|
|
if (m_lashCnt == 0) {
|
|
m_lashRecoverTime = daHorse_hio_c0::m.full_spur_recovery_time;
|
|
} else {
|
|
m_lashRecoverTime = daHorse_hio_c0::m.spur_recovery_time;
|
|
}
|
|
} else {
|
|
offStateFlg0(FLG0_PLAYER_BACK_RIDE_LASH);
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_2000)) {
|
|
m_lashAccelerationTime = daHorse_hio_c0::m.kakariko_lash_acceleration_time;
|
|
} else {
|
|
m_lashAccelerationTime = daHorse_hio_c0::m.lash_acceleration_time;
|
|
}
|
|
|
|
onResetStateFlg0(RFLG0_LASH_DASH_START);
|
|
setNeckAnime(ANM_HS_LASH, 1.0f, 0.0f, -1);
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_RUSH, -1);
|
|
onEndResetStateFlg0(ERFLG0_UNK_400);
|
|
} else {
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_ANNOY, -1);
|
|
}
|
|
} else if (checkStateFlg0(FLG0_UNK_1)) {
|
|
if (m_lashAccelerationTime > 0) {
|
|
m_lashAccelerationTime--;
|
|
}
|
|
|
|
if (m_lashRecoverTime > 0) {
|
|
m_lashRecoverTime--;
|
|
if (m_lashRecoverTime == 0) {
|
|
if (m_lashCnt == 0) {
|
|
m_lashCnt = 6;
|
|
if (!dComIfGp_event_runCheck()) {
|
|
mDoAud_seStart(Z2SE_WHIP_RECOVER_ALL, NULL, 0, 0);
|
|
}
|
|
} else {
|
|
m_lashCnt++;
|
|
if (m_lashCnt < 6) {
|
|
m_lashRecoverTime = daHorse_hio_c0::m.continuous_spur_recovery_time;
|
|
}
|
|
|
|
if (!dComIfGp_event_runCheck()) {
|
|
mDoAud_seStart(Z2SE_WHIP_RECOVER, NULL, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
m_lashAccelerationTime = 0;
|
|
m_lashRecoverTime = 0;
|
|
}
|
|
}
|
|
|
|
/* 80840FE0-80841084 0091A0 00A4+00 1/1 0/0 0/0 .text setTalkModeWolf__9daHorse_cFv */
|
|
void daHorse_c::setTalkModeWolf() {
|
|
if (eventInfo.checkCommandTalk()) {
|
|
if (!checkStateFlg0(FLG0_UNK_20000)) {
|
|
m_msgflow.init(this, m_flowID, 0, NULL);
|
|
onStateFlg0(FLG0_UNK_20000);
|
|
} else {
|
|
if (m_msgflow.doFlow(this, NULL, 0)) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
}
|
|
} else {
|
|
offStateFlg0(FLG0_UNK_20000);
|
|
}
|
|
}
|
|
|
|
/* 80841084-8084116C 009244 00E8+00 2/2 0/0 0/0 .text setBoarHit__9daHorse_cFP10fopAc_ac_ci */
|
|
void daHorse_c::setBoarHit(fopAc_ac_c* param_0, int param_1) {
|
|
int vibmode;
|
|
s16 var_r30;
|
|
if (param_1) {
|
|
vibmode = VIBMODE_S_POWER2;
|
|
var_r30 = 0x800;
|
|
} else {
|
|
vibmode = VIBMODE_S_POWER1;
|
|
var_r30 = 0x500;
|
|
}
|
|
|
|
if (abs(field_0x1702) < 0x100) {
|
|
dComIfGp_getVibration().StartShock(vibmode, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
daAlink_getAlinkActorClass()->seStartOnlyReverb(Z2SE_HORSE_BODYHIT);
|
|
}
|
|
|
|
if ((s16)(fopAcM_searchActorAngleY(this, param_0) - shape_angle.y) >= 0) {
|
|
field_0x1702 = -var_r30;
|
|
} else {
|
|
field_0x1702 = var_r30;
|
|
}
|
|
}
|
|
|
|
/* 8084116C-808411D0 00932C 0064+00 1/1 0/0 0/0 .text savePos__9daHorse_cFv */
|
|
void daHorse_c::savePos() {
|
|
if (this->model != NULL && !checkStateFlg0(FLG0_UNK_8000) && !checkStateFlg0(FLG0_NO_DRAW_WAIT)) {
|
|
dComIfGs_setHorseRestart(dComIfGp_getStartStageName(), current.pos, shape_angle.y, fopAcM_GetRoomNo(this));
|
|
}
|
|
}
|
|
|
|
/* 808411D0-80841468 009390 0298+00 1/0 0/0 0/0 .text callHorseSubstance__9daHorse_cFPC4cXyz */
|
|
int daHorse_c::callHorseSubstance(cXyz const* i_pos) {
|
|
int room_no = dComIfGp_roomControl_getStayNo();
|
|
if (checkStateFlg0(FLG0_RODEO_MODE) ||
|
|
(daAlink_c::checkStageName("F_SP108") && (room_no == 5 || room_no == 6 || room_no == 11 || room_no == 14)) ||
|
|
(daAlink_c::checkStageName("F_SP110") && (room_no == 1 || room_no == 2 || room_no == 3)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
cXyz pos_vec = current.pos - *i_pos;
|
|
f32 dist_xz2 = pos_vec.abs2XZ();
|
|
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_CRY_UMAKUSA, m_reverb);
|
|
|
|
int rt = 2;
|
|
if (m_zeldaActorKeep.getActor() != NULL) {
|
|
if (((daHoZelda_c*)m_zeldaActorKeep.getActor())->checkSingleRide()) {
|
|
changeOriginalDemo();
|
|
changeDemoMode(15, 0);
|
|
return 4;
|
|
}
|
|
}
|
|
|
|
if (m_path != NULL && (checkStateFlg0(FLG0_NO_DRAW_WAIT) || dist_xz2 > SQUARE(2000.0f))) {
|
|
daAlink_c* player = daAlink_getAlinkActorClass();
|
|
Vec* farthest_pos;
|
|
Vec* path_pnt_pos;
|
|
|
|
for (int i = 0; i < m_path->m_num; i++) {
|
|
path_pnt_pos = &m_path->m_points[i].m_position;
|
|
f32 x_dist = path_pnt_pos->x - i_pos->x;
|
|
f32 z_dist = path_pnt_pos->z - i_pos->z;
|
|
f32 farthest_sqdist;
|
|
f32 sqdist = (x_dist * x_dist) + (z_dist * z_dist);
|
|
|
|
if (i == 0 || (farthest_sqdist > sqdist && sqdist > SQUARE(2000.0f))) {
|
|
farthest_sqdist = sqdist;
|
|
farthest_pos = path_pnt_pos;
|
|
}
|
|
}
|
|
|
|
cXyz pos(farthest_pos->x, farthest_pos->y, farthest_pos->z);
|
|
setHorsePosAndAngle(&pos, shape_angle.y);
|
|
rt = 1;
|
|
} else if (dist_xz2 <= SQUARE(800.0f)) {
|
|
return 3;
|
|
}
|
|
|
|
onStateFlg0(FLG0_CALL_HORSE);
|
|
changeOriginalDemo();
|
|
changeDemoMode(12, 0);
|
|
return rt;
|
|
}
|
|
|
|
/* 80841468-808415B4 009628 014C+00 1/0 0/0 0/0 .text
|
|
* setHorsePosAndAngleSubstance__9daHorse_cFPC4cXyzs */
|
|
// NONMATCHING - small regalloc, equivalent
|
|
int daHorse_c::setHorsePosAndAngleSubstance(cXyz const* param_0, s16 param_1) {
|
|
int i, j;
|
|
|
|
cXyz sp10(current.pos);
|
|
s16 var_r24 = shape_angle.y;
|
|
|
|
if (param_0 != NULL) {
|
|
current.pos = *param_0;
|
|
old.pos = current.pos;
|
|
}
|
|
|
|
shape_angle.y = param_1;
|
|
current.angle.y = param_1;
|
|
field_0x16e8 = shape_angle.y;
|
|
field_0x170e = param_1;
|
|
field_0x1710 = param_1;
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y - var_r24);
|
|
mDoMtx_stack_c::transM(-sp10.x, -sp10.y, -sp10.z);
|
|
mDoMtx_stack_c::multVec(&field_0x17a0, &field_0x17a0);
|
|
|
|
daHorseRein_c* m_rein = m_rein;
|
|
for (i = 0; i < 3; i++) {
|
|
cXyz* var_r28 = m_rein->field_0x0[0];
|
|
for (j = 0; j < m_rein->field_0x8[1]; j++, var_r28++) {
|
|
mDoMtx_stack_c::multVec(var_r28, var_r28);
|
|
}
|
|
m_rein++;
|
|
}
|
|
}
|
|
|
|
/* 808415B4-80841628 009774 0074+00 2/2 0/0 0/0 .text checkPlayerHeavy__9daHorse_cFv */
|
|
BOOL daHorse_c::checkPlayerHeavy() {
|
|
return !dComIfGp_event_runCheck() && checkStateFlg0(FLG0_UNK_1) && !checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000)) && daAlink_getAlinkActorClass()->checkBootsOrArmorHeavy();
|
|
}
|
|
|
|
/* 80841628-80841698 0097E8 0070+00 2/2 0/0 0/0 .text setTgCoGrp__9daHorse_cFUlUl */
|
|
void daHorse_c::setTgCoGrp(u32 i_tgGrp, u32 i_coGrp) {
|
|
m_head_sph.SetTgGrp(i_tgGrp);
|
|
|
|
dCcD_Cyl* cyl_p = m_tgco_cyl;
|
|
for (int i = 0; i < 3; i++) {
|
|
cyl_p->SetTgGrp(i_tgGrp);
|
|
cyl_p->SetCoVsGrp(i_coGrp);
|
|
cyl_p++;
|
|
}
|
|
}
|
|
|
|
/* 80841698-808416D4 009858 003C+00 1/0 0/0 0/0 .text onRideFlgSubstance__9daHorse_cFv */
|
|
void daHorse_c::onRideFlgSubstance() {
|
|
onStateFlg0(FLG0_UNK_1);
|
|
m_rodeoPointCnt = 0;
|
|
setTgCoGrp(4, 0x60);
|
|
}
|
|
|
|
/* 808416D4-80841708 009894 0034+00 1/0 0/0 0/0 .text offRideFlgSubstance__9daHorse_cFv
|
|
*/
|
|
void daHorse_c::offRideFlgSubstance() {
|
|
offStateFlg0(FLG0_UNK_1);
|
|
setTgCoGrp(8, 0x70);
|
|
}
|
|
|
|
/* 80841708-808417B8 0098C8 00B0+00 8/8 0/0 0/0 .text procWaitInit__9daHorse_cFv */
|
|
int daHorse_c::procWaitInit() {
|
|
if (m_procID == PROC_WAIT_e) {
|
|
return 0;
|
|
}
|
|
|
|
offStateFlg0(daHorse_FLG0(FLG0_UNK_10000000 | FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_200));
|
|
m_proc = &daHorse_c::procWait;
|
|
m_procID = PROC_WAIT_e;
|
|
speedF = 0.0f;
|
|
field_0x1760 = 0.0f;
|
|
|
|
if (!checkServiceWaitAnime()) {
|
|
setMoveAnime(3.0f);
|
|
setServiceWaitTimer();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808417B8-80841F04 009978 074C+00 1/0 0/0 0/0 .text procWait__9daHorse_cFv */
|
|
int daHorse_c::procWait() {
|
|
if ((!dComIfGp_event_runCheck() && checkStateFlg0(FLG0_UNK_4000000)) || checkPlayerHeavy()) {
|
|
return procTurnInit(0);
|
|
}
|
|
|
|
int sp18 = setSpeedAndAngle();
|
|
field_0x1760 = speedF;
|
|
|
|
if (!checkEndResetStateFlg0(ERFLG0_MOVE_ACCEPT) && !checkStateFlg0(FLG0_UNK_40000) && (m_anmIdx[0] != ANM_HS_WALK_START || !(m_frameCtrl[0].getFrame() >= 15.0f)) && !dComIfGp_event_runCheck()) {
|
|
if (sp18 == 0 && speedF < 0.0f && m_anmIdx[0] != ANM_HS_WALK_START) {
|
|
setSingleAnime(ANM_HS_WALK_START, 1.0f, 0.0f, -1, 3.0f, 0);
|
|
}
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
if (m_anmIdx[0] == ANM_HS_WAIT_03 && m_frameCtrl[0].checkPass(18)) {
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_BURURU, m_reverb);
|
|
}
|
|
|
|
if (sp18 != 0) {
|
|
return procTurnInit(0);
|
|
}
|
|
|
|
if (fabsf(speedF) >= 0.05f) {
|
|
if (checkEndResetStateFlg0(ERFLG0_RIDE_RUN_FLG)) {
|
|
speedF = daHorse_hio_c0::m.fastwalk_to_run_rate * m_normalMaxSpeedF;
|
|
}
|
|
return procMoveInit();
|
|
}
|
|
|
|
daAlink_c* player = daAlink_getAlinkActorClass();
|
|
if (checkTgHitTurn()) {
|
|
return 1;
|
|
}
|
|
|
|
f32 enemy_search_range = daHorse_hio_c0::m.enemy_search_range;
|
|
if ((!checkInputOnR() || !checkStateFlg0(FLG0_UNK_1)) && fopAcIt_Judge((fopAcIt_JudgeFunc)daHorse_searchEnemy, &enemy_search_range) != NULL) {
|
|
onResetStateFlg0(RFLG0_ENEMY_SEARCH);
|
|
|
|
if (field_0x170c == 0 && !checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000)) && !dComIfGp_event_runCheck() && !player->checkHorseRideReady() && !player->checkHorseLieAnime() && !checkStateFlg0(FLG0_PLAYER_BACK_RIDE_LASH) && !checkStateFlg0(FLG0_UNK_1)) {
|
|
return procTurnInit(1);
|
|
}
|
|
|
|
if (!dComIfGp_event_runCheck() && !player->checkHorseRideReady() && m_anmIdx[0] != ANM_HS_EXCITEMENT && m_anmIdx[0] != ANM_HS_EXCITEMENT_2) {
|
|
if (cM_rnd() < 0.7f) {
|
|
setSingleAnime(ANM_HS_EXCITEMENT_2, 1.0f, 0.0f, -1, 3.0f, 0);
|
|
field_0x170c = 80.0f + cM_rndF(30.0f);
|
|
} else {
|
|
setSingleAnime(ANM_HS_EXCITEMENT, 1.0f, 0.0f, -1, 3.0f, 0);
|
|
field_0x170c = 30.0f + cM_rndF(30.0f);
|
|
}
|
|
}
|
|
} else if ((m_anmIdx[0] == ANM_HS_EXCITEMENT || m_anmIdx[0] == ANM_HS_EXCITEMENT_2) && !m_frameCtrl[0].checkPass(0.0f)) {
|
|
onResetStateFlg0(RFLG0_ENEMY_SEARCH);
|
|
}
|
|
|
|
f32 temp_f30 = fabsf(m_frameCtrl[0].getRate());
|
|
|
|
if (m_anmIdx[0] == ANM_HS_WALK_START) {
|
|
setServiceWaitTimer();
|
|
if (fabsf(field_0x1760) < 0.05f) {
|
|
m_anmIdx[0] = 0xFFFF;
|
|
setMoveAnime(3.0f);
|
|
}
|
|
} else if (temp_f30 < 0.01f || shape_angle.y != field_0x16e8 || field_0x16f0 != 0 || eventInfo.checkCommandTalk()) {
|
|
int spC = 0;
|
|
if (shape_angle.y == field_0x16e8 && field_0x16f0 == 0 && !eventInfo.checkCommandTalk()) {
|
|
if (m_anmIdx[0] == ANM_HS_WAIT_04 || (m_anmIdx[0] == ANM_HS_WAIT_01B_CONNECT && m_frameCtrl[0].getFrame() > 1.0f)) {
|
|
setSingleAnime(ANM_HS_WAIT_01B, 1.0f, 0.0f, -1, 3.0f, 0);
|
|
m_frameCtrl[0].setAttribute(0);
|
|
spC = 1;
|
|
} else if (m_anmIdx[0] == ANM_HS_WAIT_01B) {
|
|
setSingleAnime(ANM_HS_WAIT_01B_CONNECT, -1.0f, 0.0f, -1, 3.0f, 0);
|
|
spC = 1;
|
|
}
|
|
}
|
|
|
|
if (spC == 0) {
|
|
f32 var_f29;
|
|
if (temp_f30 < 0.01f) {
|
|
var_f29 = 3.0f;
|
|
} else {
|
|
var_f29 = -1.0f;
|
|
}
|
|
|
|
if (!checkResetStateFlg0(RFLG0_ENEMY_SEARCH) || (checkInputOnR() && checkStateFlg0(FLG0_UNK_1))) {
|
|
setMoveAnime(var_f29);
|
|
}
|
|
|
|
setServiceWaitTimer();
|
|
}
|
|
} else if (shape_angle.y == field_0x16e8 && !dComIfGp_event_runCheck() && fabsf(field_0x1760) < 0.05f && !checkResetStateFlg0(RFLG0_ENEMY_SEARCH) && m_anmRatio[2].getAnmTransform() == NULL) {
|
|
if (m_serviceWaitTimer == 0) {
|
|
if (!checkServiceWaitAnime()) {
|
|
f32 rnd = cM_rnd();
|
|
u16 anm_idx;
|
|
if (rnd < 0.2f) {
|
|
anm_idx = ANM_HS_WAIT_02;
|
|
} else if (rnd < 0.4f) {
|
|
anm_idx = ANM_HS_WAIT_03;
|
|
} else if (rnd < 0.6f) {
|
|
anm_idx = ANM_HS_WAIT_04;
|
|
} else if (rnd < 0.8f) {
|
|
anm_idx = ANM_HS_WAIT_05;
|
|
} else {
|
|
anm_idx = ANM_HS_WAIT_01B_CONNECT;
|
|
}
|
|
|
|
setSingleAnime(anm_idx, 1.0f, 0.0f, -1, 6.0f, 0);
|
|
}
|
|
} else {
|
|
m_serviceWaitTimer--;
|
|
setMoveAnime(-1.0f);
|
|
}
|
|
} else {
|
|
if (!checkResetStateFlg0(RFLG0_ENEMY_SEARCH) || (checkInputOnR() && checkStateFlg0(FLG0_UNK_1))) {
|
|
setMoveAnime(-1.0f);
|
|
}
|
|
setServiceWaitTimer();
|
|
}
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_1)) {
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
attention_info.flags |= 0x8;
|
|
eventInfo.onCondition(1);
|
|
} else if (m_procID == PROC_WAIT_e) {
|
|
acceptPlayerRide();
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_RIDE_START_FLG)) {
|
|
offStateFlg0(FLG0_RIDE_START_FLG);
|
|
if (!checkServiceWaitAnime() || m_anmIdx[0] == ANM_HS_WAIT_01B || m_anmIdx[0] == ANM_HS_WAIT_04 || (m_anmIdx[0] == ANM_HS_WAIT_01B_CONNECT && m_frameCtrl[0].getRate() > 0.0f)) {
|
|
setSingleAnime(ANM_HS_WAIT_02, 1.0f, 0.0f, -1, 3.0f, 0);
|
|
m_serviceWaitTimer = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80841F04-80841F80 00A0C4 007C+00 6/6 0/0 0/0 .text procMoveInit__9daHorse_cFv */
|
|
int daHorse_c::procMoveInit() {
|
|
m_proc = &daHorse_c::procMove;
|
|
m_procID = PROC_MOVE_e;
|
|
offStateFlg0(daHorse_FLG0(FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_200));
|
|
setMoveAnime(3.0f);
|
|
field_0x171a = 0;
|
|
return 1;
|
|
}
|
|
|
|
/* 80841F80-808423DC 00A140 045C+00 1/0 0/0 0/0 .text procMove__9daHorse_cFv */
|
|
int daHorse_c::procMove() {
|
|
int var_r30 = setSpeedAndAngle();
|
|
if (var_r30 != 0) {
|
|
offStateFlg0(FLG0_UNK_10000000);
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_800) && !daAlink_getAlinkActorClass()->checkHorseSubjectivity()) {
|
|
offStateFlg0(FLG0_UNK_800);
|
|
if (var_r30 == 0) {
|
|
speedF = field_0x1798;
|
|
}
|
|
}
|
|
|
|
if (m_demoMode == 2 && speedF > (daHorse_hio_c0::m.walk_to_fastwalk_rate * m_normalMaxSpeedF)) {
|
|
speedF = daHorse_hio_c0::m.walk_to_fastwalk_rate * m_normalMaxSpeedF;
|
|
} else if (m_demoMode == 10 && speedF > (daHorse_hio_c0::m.wait_to_walk_rate * m_normalMaxSpeedF)) {
|
|
speedF = daHorse_hio_c0::m.wait_to_walk_rate * m_normalMaxSpeedF;
|
|
} else if (m_demoMode == 11 && speedF > (daHorse_hio_c0::m.fastwalk_to_run_rate * m_normalMaxSpeedF)) {
|
|
speedF = daHorse_hio_c0::m.fastwalk_to_run_rate * m_normalMaxSpeedF;
|
|
}
|
|
|
|
if (checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000)) && !m_acch.ChkGroundHit()) {
|
|
field_0x1768 = 350.0f;
|
|
field_0x176c = 0.0f;
|
|
field_0x1770 = field_0x1768;
|
|
current.pos.y = old.pos.y;
|
|
procJumpInit(0);
|
|
speed.y = 0.0f;
|
|
setSingleAnime(ANM_HS_JUMP_END, 0.0f, 0.0f, -1, 8.0f, 0);
|
|
} else if (!checkStateFlg0(FLG0_UNK_10000000) && checkEndResetStateFlg0(daHorse_ERFLG0(ERFLG0_UNK_20 | ERFLG0_UNK_1))) {
|
|
procJumpInit(0);
|
|
} else if (var_r30 == 5) {
|
|
field_0x1768 = daHorse_hio_c0::m.cliff_jump_horizontal;
|
|
field_0x176c = daHorse_hio_c0::m.cliff_jump_vertical + current.pos.y;
|
|
field_0x1770 = field_0x1768;
|
|
procJumpInit(1);
|
|
} else if (var_r30 == 1) {
|
|
procTurnInit(0);
|
|
} else if (var_r30 == 3 || var_r30 == 4) {
|
|
if (!checkStateFlg0(FLG0_UNK_2)) {
|
|
resetNeckAnime();
|
|
m_lashAccelerationTime = 0;
|
|
offStateFlg0(daHorse_FLG0(FLG0_TURN_CANCEL_KEEP | FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_2));
|
|
procWaitInit();
|
|
} else {
|
|
if (var_r30 == 4) {
|
|
speedF = 0.0f;
|
|
}
|
|
procStopInit();
|
|
}
|
|
} else if (fabsf(speedF) < 0.05f) {
|
|
if (checkStateFlg0(FLG0_UNK_200)) {
|
|
procTurnInit(0);
|
|
} else {
|
|
procWaitInit();
|
|
}
|
|
} else if (checkStateFlg0(FLG0_UNK_10000000) && field_0x171a != 0 && (m_cc_stts.GetCCMoveP()->abs() > 1.0f || checkStateFlg0(FLG0_UNK_4) || m_acch.ChkWallHit() || m_callMoveTimer == 0 || daAlink_getAlinkActorClass()->current.pos.abs2XZ(current.pos) < 640000.0f)) {
|
|
procStopInit();
|
|
offStateFlg0(FLG0_UNK_10000000);
|
|
} else {
|
|
setMoveAnime(-1.0f);
|
|
}
|
|
|
|
if (m_procID == PROC_MOVE_e) {
|
|
field_0x171a = 1;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808423DC-808425BC 00A59C 01E0+00 3/3 0/0 0/0 .text procStopInit__9daHorse_cFv */
|
|
int daHorse_c::procStopInit() {
|
|
m_proc = &daHorse_c::procStop;
|
|
m_procID = PROC_STOP_e;
|
|
resetNeckAnime();
|
|
m_lashAccelerationTime = 0;
|
|
offStateFlg0(daHorse_FLG0(FLG0_TURN_CANCEL_KEEP | FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_2));
|
|
field_0x171a = 0;
|
|
|
|
if (m_demoMode == 8 || m_demoMode == 16 || m_demoMode == 14 || checkStateFlg0(FLG0_UNK_40000000) || (speedF * (1.0f / m_normalMaxSpeedF)) < daHorse_hio_c0::m.run_to_fastrun_rate) {
|
|
setSingleAnime(ANM_HS_STOP_SLOW, daHorse_hio_c0::m.faststop_anm_speed, 0.0f, -1, daHorse_hio_c0::m.faststop_interpolation, 0);
|
|
field_0x177C = daHorse_hio_c0::m.fast_stop_cancel_frame;
|
|
|
|
if (checkStateFlg0(FLG0_UNK_40000000)) {
|
|
offStateFlg0(FLG0_UNK_40000000);
|
|
field_0x171a = 1;
|
|
}
|
|
} else {
|
|
setSingleAnime(ANM_HS_STOP_STAND, daHorse_hio_c0::m.faststop_stand_anm_speed, 0.0f, -1, daHorse_hio_c0::m.faststop_interpolation, 0);
|
|
field_0x177C = daHorse_hio_c0::m.faststop_stand_cancel_frame;
|
|
}
|
|
|
|
field_0x16b7 = 1;
|
|
field_0x171c = 0;
|
|
|
|
if (checkStateFlg0(FLG0_UNK_10000000)) {
|
|
field_0x1774 = 2.7f;
|
|
field_0x171c = 1;
|
|
} else if (speedF <= m_normalMaxSpeedF) {
|
|
field_0x1774 = daHorse_hio_c0::m.faststop_deceleration_slow;
|
|
} else {
|
|
f32 var_f31 = (2.0f * ((m_normalMaxSpeedF * m_normalMaxSpeedF) / (2.0f * daHorse_hio_c0::m.faststop_deceleration_slow)));
|
|
field_0x1774 = (speedF * speedF) / var_f31;
|
|
if (field_0x1774 > daHorse_hio_c0::m.faststop_deceleration) {
|
|
field_0x1774 = daHorse_hio_c0::m.faststop_deceleration;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808425BC-80842878 00A77C 02BC+00 1/0 0/0 0/0 .text procStop__9daHorse_cFv */
|
|
int daHorse_c::procStop() {
|
|
struct unk_foot_eff_t {
|
|
f32 _0;
|
|
f32 _4;
|
|
f32 _8;
|
|
};
|
|
|
|
static const unk_foot_eff_t stopFootEffectFrame[] = {
|
|
{8, 11, 24},
|
|
{11, 14, 27},
|
|
{5, 8, 18},
|
|
{8, 13, 23}
|
|
};
|
|
|
|
static const unk_foot_eff_t stopStandFootEffectFrame[] = {
|
|
{7, 12, 24},
|
|
{11, 19, 26},
|
|
{5, 10, 18},
|
|
{7, 18, 26}
|
|
};
|
|
|
|
const unk_foot_eff_t* var_r29;
|
|
daPy_frameCtrl_c* frame_ctrl = &m_frameCtrl[0];
|
|
int var_r25 = checkHorseNoMove(1);
|
|
|
|
if (var_r25 == 2) {
|
|
speedF = 0.0f;
|
|
} else if (checkStateFlg0(FLG0_RODEO_MODE)) {
|
|
cLib_chaseF(&speedF, 0.0f, 3.5f);
|
|
} else {
|
|
cLib_chaseF(&speedF, 0.0f, field_0x1774);
|
|
}
|
|
|
|
if (fabsf(speedF) < 1.0f) {
|
|
acceptPlayerRide();
|
|
if (checkStateFlg0(FLG0_RIDE_START_FLG)) {
|
|
offStateFlg0(FLG0_RIDE_START_FLG);
|
|
procWaitInit();
|
|
}
|
|
}
|
|
|
|
f32 var_f30;
|
|
if (frame_ctrl->checkAnmEnd() || checkEndResetStateFlg0(ERFLG0_CUT_TURN_CANCEL)) {
|
|
if (m_demoMode == 8 || m_demoMode == 16) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
} else {
|
|
if (m_demoMode == 14) {
|
|
m_demoMode = 1;
|
|
return procWaitInit();
|
|
} else if (checkEndResetStateFlg0(ERFLG0_CUT_TURN_CANCEL)) {
|
|
return procMoveInit();
|
|
} else if (field_0x171a != 0) {
|
|
setNeckAnime(ANM_HS_WAIT_03, 1.0f, 0.0f, -1);
|
|
}
|
|
|
|
return procWaitInit();
|
|
}
|
|
} else {
|
|
if (frame_ctrl->getFrame() > field_0x177C) {
|
|
if (checkStateFlg0(FLG0_RODEO_MODE) || checkStateFlg0(FLG0_UNK_200)) {
|
|
return procTurnInit(0);
|
|
}
|
|
|
|
if (var_r25 == 0 && checkTurnAfterFastMove(frame_ctrl->getFrame())) {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (m_anmIdx[0] == ANM_HS_STOP_STAND) {
|
|
if (frame_ctrl->checkPass(59)) {
|
|
field_0x16b6 = 1;
|
|
field_0x16b7 = 2;
|
|
}
|
|
var_r29 = stopStandFootEffectFrame;
|
|
var_f30 = 32.0f;
|
|
} else {
|
|
var_r29 = stopFootEffectFrame;
|
|
var_f30 = 29.0f;
|
|
}
|
|
}
|
|
|
|
f32 frame = frame_ctrl->getFrame();
|
|
if (frame <= var_f30) {
|
|
for (int i = 0; i < 4; i++, var_r29++) {
|
|
if ((frame >= var_r29->_0 && frame <= var_r29->_4) || frame >= var_r29->_8) {
|
|
field_0x16b6 |= (1 << i);
|
|
}
|
|
}
|
|
|
|
m_sound.startCreatureSoundLevel(Z2SE_FN_HORSE_SLIP, m_poly_sound, m_reverb);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80842878-80842AB0 00AA38 0238+00 6/6 0/0 0/0 .text procTurnInit__9daHorse_cFi */
|
|
int daHorse_c::procTurnInit(int param_0) {
|
|
if (checkEndResetStateFlg0(ERFLG0_RIDE_RUN_FLG)) {
|
|
speedF = 0.0f;
|
|
return 0;
|
|
}
|
|
|
|
m_proc = &daHorse_c::procTurn;
|
|
m_procID = PROC_TURN_e;
|
|
|
|
resetNeckAnime();
|
|
setSingleAnime(ANM_HS_STAND, daHorse_hio_c0::m.stand_anm_speed, 0.0f, -1, daHorse_hio_c0::m.stand_interpolation, 0);
|
|
|
|
field_0x1774 = 52.0f;
|
|
field_0x1778 = 0.09817477f;
|
|
field_0x177C = daHorse_hio_c0::m.stand_cancel_frame;
|
|
field_0x1780 = 20.0f;
|
|
field_0x1784 = 53.0f;
|
|
speedF = 0.0f;
|
|
|
|
field_0x171a = 0;
|
|
field_0x171c = shape_angle.y;
|
|
current.angle.y = shape_angle.y;
|
|
offStateFlg0(daHorse_FLG0(FLG0_TURN_CANCEL_KEEP | FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_8));
|
|
field_0x171e = shape_angle.y + 0x8000;
|
|
|
|
if (!dComIfGp_event_runCheck() && !checkStateFlg0(FLG0_UNK_4000000)) {
|
|
field_0x170a += 0x8000;
|
|
} else if (checkStateFlg0(FLG0_UNK_4000000)) {
|
|
field_0x171e = shape_angle.y;
|
|
}
|
|
|
|
if (!dComIfGp_event_runCheck()) {
|
|
offStateFlg0(FLG0_UNK_4000000);
|
|
}
|
|
|
|
field_0x1730 = param_0;
|
|
if (field_0x1730 != 0) {
|
|
field_0x171e = (f32)shape_angle.y + cM_rndFX(8192.0f);
|
|
}
|
|
|
|
field_0x1720 = 0;
|
|
field_0x170c = 30.0f + cM_rndF(30.0f);
|
|
field_0x16b7 = 2;
|
|
|
|
acceptPlayerRide();
|
|
m_at_cyl.SetAtSpl(dCcG_At_Spl_UNK_1);
|
|
m_at_cyl.SetAtHitMark(3);
|
|
m_at_cyl.SetAtAtp(2);
|
|
|
|
if (checkInputOnR()) {
|
|
field_0x1722 = 1;
|
|
} else {
|
|
field_0x1722 = 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80842AB0-80843008 00AC70 0558+00 1/0 0/0 0/0 .text procTurn__9daHorse_cFv */
|
|
int daHorse_c::procTurn() {
|
|
daPy_frameCtrl_c* frame_ctrl = &m_frameCtrl[0];
|
|
|
|
if (!checkInputOnR()) {
|
|
field_0x1722 = 0;
|
|
}
|
|
|
|
if (field_0x1730 != 0) {
|
|
onResetStateFlg0(RFLG0_ENEMY_SEARCH);
|
|
}
|
|
|
|
int sp14 = checkHorseNoMove(1);
|
|
|
|
if (m_anmIdx[0] == ANM_HS_STAND) {
|
|
if (frame_ctrl->checkPass(8.0f) && !checkInputOnR()) {
|
|
field_0x171a = 0;
|
|
}
|
|
|
|
if (frame_ctrl->checkPass(14.0f) && !checkEndResetStateFlg0(ERFLG0_CUT_TURN_CANCEL)) {
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_CRY, m_reverb);
|
|
}
|
|
}
|
|
|
|
if (frame_ctrl->checkPass(field_0x1784) != 0) {
|
|
field_0x16b6 = 1;
|
|
}
|
|
|
|
bool sp8 = frame_ctrl->getFrame() < field_0x1784;
|
|
|
|
if (field_0x1720 != 0) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
setMoveAnime(-1.0f);
|
|
} else if (frame_ctrl->checkAnmEnd() || checkEndResetStateFlg0(ERFLG0_CUT_TURN_CANCEL)) {
|
|
if (m_demoMode == 9) {
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
setMoveAnime(3.0f);
|
|
field_0x1720 = 1;
|
|
} else {
|
|
acceptPlayerRide();
|
|
return procWaitInit();
|
|
}
|
|
} else {
|
|
if (sp14 == 0) {
|
|
if (checkTurnAfterFastMove(frame_ctrl->getFrame())) {
|
|
if (sp8) {
|
|
field_0x16b6 = 1;
|
|
field_0x16b7 = 2;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (frame_ctrl->getFrame() >= field_0x1780 && frame_ctrl->getFrame() < field_0x1774) {
|
|
onResetStateFlg0(RFLG0_TURN_STAND);
|
|
if (!checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000)) || frame_ctrl->getFrame() < field_0x1774 - 10.0f) {
|
|
onResetStateFlg0(RFLG0_TURN_STAND_CAMERA);
|
|
}
|
|
|
|
if (checkInputOnR() || (checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000)) && !dComIfGp_event_runCheck()) || checkStateFlg0(FLG0_UNK_200) || field_0x1730 != 0) {
|
|
s16 spE = 2000.0f * cM_fsin(field_0x1778 * (frame_ctrl->getFrame() - field_0x1780));
|
|
s16 var_r27;
|
|
if (checkStateFlg0(daHorse_FLG0(FLG0_UNK_200000 | FLG0_UNK_100000 | FLG0_UNK_200)) || field_0x1730 != 0) {
|
|
var_r27 = field_0x171e;
|
|
} else {
|
|
var_r27 = m_padStickAngleY;
|
|
}
|
|
|
|
s16 var_r26 = var_r27 - shape_angle.y;
|
|
if (var_r26 != 0 && (field_0x171a * var_r26) >= 0) {
|
|
if (field_0x171a == 0 && abs((s16)(shape_angle.y - field_0x171c)) > 1000) {
|
|
if (var_r26 > 0) {
|
|
field_0x171a = 1;
|
|
} else {
|
|
field_0x171a = -1;
|
|
}
|
|
}
|
|
|
|
cLib_chaseAngleS(&shape_angle.y, var_r27, spE);
|
|
|
|
cXyz sp24(current.pos.x - (60.0f * cM_ssin(current.angle.y)), current.pos.y, current.pos.z - (60.0f * cM_scos(current.angle.y)));
|
|
cXyz sp18 = current.pos - sp24;
|
|
|
|
mDoMtx_stack_c::transS(sp24.x, sp24.y, sp24.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y - current.angle.y);
|
|
mDoMtx_stack_c::multVec(&sp18, ¤t.pos);
|
|
current.pos.y += 300.0f;
|
|
|
|
if (fopAcM_gc_c::gndCheck(¤t.pos)) {
|
|
current.pos.y = fopAcM_gc_c::getGroundY();
|
|
} else {
|
|
current.pos = old.pos;
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
s16 spC = shape_angle.y;
|
|
s16 spA = shape_angle.x;
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (checkHorseNoMove(1) == 2) {
|
|
current.pos = old.pos;
|
|
break;
|
|
}
|
|
|
|
shape_angle.y += 0x2000;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
shape_angle.y = spC;
|
|
current.angle.y = shape_angle.y;
|
|
if (cLib_distanceAngleS(shape_angle.y, field_0x171c) >= 0x4000) {
|
|
offStateFlg0(FLG0_UNK_40000);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
acceptPlayerRide();
|
|
if (checkStateFlg0(FLG0_RIDE_START_FLG)) {
|
|
offStateFlg0(FLG0_RIDE_START_FLG);
|
|
procWaitInit();
|
|
} else if (frame_ctrl->getFrame() > field_0x1784 - 3.0f && frame_ctrl->getFrame() < 3.0f + field_0x1784) {
|
|
onResetStateFlg0(RFLG0_UNK_20);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80843008-808432E0 00B1C8 02D8+00 2/2 0/0 0/0 .text procJumpInit__9daHorse_cFi */
|
|
int daHorse_c::procJumpInit(int param_0) {
|
|
if (checkEndResetStateFlg0(ERFLG0_RIDE_RUN_FLG)) {
|
|
return 0;
|
|
}
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_1) && m_demoMode != 7) {
|
|
return procStopInit();
|
|
}
|
|
|
|
m_proc = &daHorse_c::procJump;
|
|
|
|
m_procID = PROC_JUMP_e;
|
|
resetNeckAnime();
|
|
|
|
field_0x1720 = param_0;
|
|
|
|
if (param_0) {
|
|
setSingleAnime(ANM_HS_JUMP_START_CLIFT, daHorse_hio_c0::m.cliff_jump_anm_speed, daHorse_hio_c0::m.cliff_jump_start_frame, daHorse_hio_c0::m.cliff_jump_end_frame, daHorse_hio_c0::m.cliff_jump_interpolation, 0);
|
|
} else {
|
|
setSingleAnime(ANM_HS_JUMP_START, daHorse_hio_c0::m.jump_anm_speed, daHorse_hio_c0::m.jump_start_frame, daHorse_hio_c0::m.jump_end_frame, daHorse_hio_c0::m.jump_interpolation, 0);
|
|
}
|
|
|
|
if (speedF < 0.75f * m_normalMaxSpeedF) {
|
|
speedF = 0.75f * m_normalMaxSpeedF;
|
|
}
|
|
|
|
field_0x1774 = 0.8f * speedF;
|
|
|
|
f32 temp_f31 = 20.0f + (field_0x176c - current.pos.y);
|
|
speedF *= field_0x1768 / JMAFastSqrt((field_0x1768 * field_0x1768) + (temp_f31 * temp_f31));
|
|
|
|
field_0x171a = field_0x1768 / speedF;
|
|
if (field_0x171a < daHorse_hio_c0::m.min_jump_time) {
|
|
field_0x171a = daHorse_hio_c0::m.min_jump_time;
|
|
speedF = field_0x1768 / (f32)field_0x171a;
|
|
}
|
|
|
|
field_0x171e = field_0x1770 / speedF;
|
|
if (field_0x171e < daHorse_hio_c0::m.min_jump_time) {
|
|
field_0x171e = daHorse_hio_c0::m.min_jump_time;
|
|
}
|
|
|
|
field_0x177C = (-2.0f * temp_f31) / (f32)(field_0x171e * field_0x171e);
|
|
gravity = (-2.0f * temp_f31) / (f32)(field_0x171a * field_0x171a);
|
|
speed.y = -gravity * (f32)field_0x171a;
|
|
|
|
offStateFlg0(daHorse_FLG0(FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_200 | FLG0_UNK_10));
|
|
field_0x1702 = 0;
|
|
field_0x171c = 0;
|
|
field_0x17d0 = current.pos;
|
|
field_0x1778 = 1.5f * (1.5f * (field_0x1768 * field_0x1768));
|
|
field_0x1722 = 300;
|
|
return 1;
|
|
}
|
|
|
|
/* 808432E0-80843604 00B4A0 0324+00 1/0 0/0 0/0 .text procJump__9daHorse_cFv */
|
|
int daHorse_c::procJump() {
|
|
if (field_0x1722 != 0) {
|
|
field_0x1722--;
|
|
}
|
|
|
|
if ((field_0x171c != 0) && ((speed.y < 0.0f && field_0x17d0.abs2XZ(current.pos) > field_0x1778) || field_0x1722 == 0) && m_acch.ChkGroundHit()) {
|
|
return procLandInit(field_0x1774, field_0x1720);
|
|
}
|
|
|
|
field_0x171c = 1;
|
|
|
|
if (m_anmIdx[0] == ANM_HS_JUMP_START_CLIFT) {
|
|
if (m_frameCtrl[0].checkAnmEnd()) {
|
|
setSingleAnime(ANM_HS_JUMP_MIDDLE, daHorse_hio_c0::m.cliff_air_anm_speed, daHorse_hio_c0::m.cliff_air_start_frame, daHorse_hio_c0::m.cliff_air_end_frame, daHorse_hio_c0::m.cliff_air_interpolation, 0);
|
|
}
|
|
} else if (m_anmIdx[0] == ANM_HS_JUMP_START) {
|
|
if (m_frameCtrl[0].checkAnmEnd()) {
|
|
int temp_r28 = (f32)field_0x171a - ((1.0f / daHorse_hio_c0::m.jump_anm_speed) * (f32)(m_frameCtrl[0].getEnd() - m_frameCtrl[0].getStart()));
|
|
if (temp_r28 <= 0) {
|
|
temp_r28 += field_0x171e;
|
|
gravity = field_0x177C;
|
|
|
|
if (temp_r28 <= 0) {
|
|
setSingleAnime(ANM_HS_JUMP_END, 0.0f, 0.0f, -1, field_0x171e, 0);
|
|
} else {
|
|
setSingleAnime(ANM_HS_JUMP_MIDDLE, (daHorse_hio_c0::m.air_end_frame - 6.0f) / temp_r28, 6.0f, daHorse_hio_c0::m.air_end_frame, daHorse_hio_c0::m.air_interpolation, 0);
|
|
}
|
|
} else {
|
|
setSingleAnime(ANM_HS_JUMP_MIDDLE, (6.0f - daHorse_hio_c0::m.air_start_frame) / temp_r28, daHorse_hio_c0::m.air_start_frame, 6, daHorse_hio_c0::m.air_interpolation, 0);
|
|
}
|
|
}
|
|
} else if (m_anmIdx[0] == ANM_HS_JUMP_MIDDLE && field_0x1720 == 0 && m_frameCtrl[0].checkAnmEnd() && m_frameCtrl[0].getEnd() == 6) {
|
|
setSingleAnime(ANM_HS_JUMP_MIDDLE, (1.0f + (daHorse_hio_c0::m.air_end_frame - 6.0f)) / field_0x171e, 7.0f, daHorse_hio_c0::m.air_end_frame, -1.0f, 0);
|
|
gravity = field_0x177C;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80843604-80843770 00B7C4 016C+00 1/1 0/0 0/0 .text procLandInit__9daHorse_cFfi */
|
|
int daHorse_c::procLandInit(f32 i_speedF, BOOL param_1) {
|
|
m_proc = &daHorse_c::procLand;
|
|
m_procID = PROC_LAND_e;
|
|
|
|
resetNeckAnime();
|
|
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER2, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
if (param_1) {
|
|
setSingleAnime(ANM_HS_JUMP_END, daHorse_hio_c0::m.cliff_land_anm_speed, daHorse_hio_c0::m.cliff_land_start_frame, daHorse_hio_c0::m.cliff_land_end_frame, daHorse_hio_c0::m.cliff_land_interpolation, 0);
|
|
field_0x177C = daHorse_hio_c0::m.cliff_land_cancel_frame;
|
|
} else {
|
|
setSingleAnime(ANM_HS_JUMP_END, daHorse_hio_c0::m.land_anm_speed, daHorse_hio_c0::m.land_start_frame, daHorse_hio_c0::m.land_end_frame, daHorse_hio_c0::m.land_interpolation, 0);
|
|
field_0x177C = daHorse_hio_c0::m.land_cancel_frame;
|
|
}
|
|
|
|
speedF = i_speedF;
|
|
if (speedF >= m_lashMaxSpeedF) {
|
|
speedF = m_lashMaxSpeedF;
|
|
}
|
|
|
|
gravity = -5.0f;
|
|
field_0x171a = 0;
|
|
field_0x16b6 = 1;
|
|
field_0x16b7 = 2;
|
|
offStateFlg0(daHorse_FLG0(FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_200));
|
|
return 1;
|
|
}
|
|
|
|
/* 80843770-808438AC 00B930 013C+00 1/0 0/0 0/0 .text procLand__9daHorse_cFv */
|
|
int daHorse_c::procLand() {
|
|
daPy_frameCtrl_c* frame_ctrl = &m_frameCtrl[0];
|
|
int temp_r3 = checkHorseNoMove(1);
|
|
|
|
if (temp_r3 == 2) {
|
|
speedF = 0.0f;
|
|
} else if (temp_r3 != 0) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
}
|
|
|
|
if (field_0x171a != 0) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
setMoveAnime(-1.0f);
|
|
} else if (frame_ctrl->checkAnmEnd()) {
|
|
if (m_demoMode == 7) {
|
|
cLib_chaseF(&speedF, 0.0f, daHorse_hio_c0::m.stopping_deceleration);
|
|
dComIfGp_evmng_cutEnd(m_demoStaffId);
|
|
setMoveAnime(3.0f);
|
|
field_0x171a = 1;
|
|
} else {
|
|
procMoveInit();
|
|
}
|
|
} else if (temp_r3 == 0) {
|
|
checkTurnAfterFastMove(frame_ctrl->getFrame());
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808438AC-8084396C 00BA6C 00C0+00 1/1 0/0 0/0 .text procLargeDamageInit__9daHorse_cFv
|
|
*/
|
|
int daHorse_c::procLargeDamageInit() {
|
|
m_proc = &daHorse_c::procLargeDamage;
|
|
m_procID = PROC_LARGE_DAMAGE_e;
|
|
|
|
resetNeckAnime();
|
|
setSingleAnime(ANM_HS_STAND, daHorse_hio_c0::m.stand_anm_speed, 0.0f, -1, daHorse_hio_c0::m.stand_interpolation, 0);
|
|
|
|
current.angle.y = m_cowHitAngle;
|
|
speedF = 60.0f;
|
|
speed.y = 50.0f;
|
|
gravity = -5.0f;
|
|
offStateFlg0(daHorse_FLG0(FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_200));
|
|
return 1;
|
|
}
|
|
|
|
/* 8084396C-808439C8 00BB2C 005C+00 1/0 0/0 0/0 .text procLargeDamage__9daHorse_cFv */
|
|
int daHorse_c::procLargeDamage() {
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 5, 0x2000, 0x1000);
|
|
if (m_acch.ChkWallHit()) {
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 808439C8-80843A44 00BB88 007C+00 1/1 0/0 0/0 .text procToolDemoInit__9daHorse_cFv */
|
|
int daHorse_c::procToolDemoInit() {
|
|
m_proc = &daHorse_c::procToolDemo;
|
|
m_procID = PROC_TOOL_DEMO_e;
|
|
|
|
speedF = 0.0f;
|
|
speed.y = 0.0f;
|
|
resetNeckAnime();
|
|
offStateFlg0(daHorse_FLG0(FLG0_PLAYER_BACK_RIDE_LASH | FLG0_UNK_800 | FLG0_UNK_200));
|
|
return 1;
|
|
}
|
|
|
|
/* 80843A44-80843BFC 00BC04 01B8+00 1/0 0/0 0/0 .text procToolDemo__9daHorse_cFv */
|
|
int daHorse_c::procToolDemo() {
|
|
dDemo_actor_c* demo_actor_p = dDemo_c::getActor(demoActorID);
|
|
field_0x1730 = 0;
|
|
|
|
if (demo_actor_p != NULL) {
|
|
f32 anm_frame = 0.0f;
|
|
|
|
if (demo_actor_p->checkEnable(2)) {
|
|
current.pos = demo_actor_p->getTrans();
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(8)) {
|
|
shape_angle = demo_actor_p->getRatate();
|
|
current.angle = shape_angle;
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(0x40)) {
|
|
anm_frame = demo_actor_p->getAnmFrame();
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(1) != 0) {
|
|
int sp14, sp10, spC;
|
|
u16 anm_idx;
|
|
while (demo_actor_p->getDemoIDData(&sp14, &sp10, &spC, &anm_idx, NULL) != 0) {
|
|
if (sp14 != 0 && sp14 == 2 && sp10 == 1 && spC == 2) {
|
|
setSingleAnime(anm_idx, 1.0f, 0.0f, -1, -1.0f, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (demo_actor_p->checkEnable(0x40)) {
|
|
m_anmRatio[0].getAnmTransform()->setFrame(anm_frame);
|
|
demo_actor_p->setAnmFrameMax(m_anmRatio[0].getAnmTransform()->getFrameMax());
|
|
m_frameCtrl[0].setFrame(anm_frame);
|
|
}
|
|
} else {
|
|
offStateFlg0(FLG0_UNK_80000);
|
|
procWaitInit();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80843BFC-80843C40 00BDBC 0044+00 1/1 0/0 0/0 .text
|
|
* searchSceneChangeArea__9daHorse_cFP10fopAc_ac_c */
|
|
void daHorse_c::searchSceneChangeArea(fopAc_ac_c* i_scnChg) {
|
|
if (fopAcM_GetName(i_scnChg) == PROC_SCENE_EXIT) {
|
|
if (m_scnChg_num == 50) {
|
|
// "Exceeded buffer!!!!!\n"
|
|
OS_PANIC(0x1CD6, "バッファ越え!!!!!\n");
|
|
m_scnChg_num = 49;
|
|
}
|
|
|
|
m_scnChg_buffer[m_scnChg_num] = (daScex_c*)i_scnChg;
|
|
m_scnChg_num++;
|
|
}
|
|
}
|
|
|
|
/* 80843C40-80843C74 00BE00 0034+00 1/1 0/0 0/0 .text
|
|
* daHorse_searchSceneChangeArea__FP10fopAc_ac_cPv */
|
|
static void* daHorse_searchSceneChangeArea(fopAc_ac_c* i_actor, void* i_data) {
|
|
dComIfGp_getHorseActor()->searchSceneChangeArea(i_actor);
|
|
return NULL;
|
|
}
|
|
|
|
/* 80843C74-80844570 00BE34 08FC+00 1/1 0/0 0/0 .text execute__9daHorse_cFv */
|
|
int daHorse_c::execute() {
|
|
m_scnChg_num = 0;
|
|
fopAcIt_Executor((fopAcIt_ExecutorFunc)daHorse_searchSceneChangeArea, NULL);
|
|
m_zeldaActorKeep.setActor();
|
|
|
|
if (checkStateFlg0(FLG0_NO_DRAW_WAIT)) {
|
|
if (checkStateFlg0(FLG0_CALL_HORSE)) {
|
|
offStateFlg0(FLG0_NO_DRAW_WAIT);
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
daAlink_c* player_p = daAlink_getAlinkActorClass();
|
|
|
|
if (player_p->checkBoarSingleBattleFirst()) {
|
|
onStateFlg0(FLG0_UNK_100000);
|
|
} else if (player_p->checkBoarSingleBattleSecond()) {
|
|
onStateFlg0(FLG0_UNK_200000);
|
|
}
|
|
|
|
if (m_acch.ChkGroundHit()) {
|
|
onStateFlg0(FLG0_UNK_10);
|
|
} else {
|
|
offStateFlg0(FLG0_UNK_10);
|
|
}
|
|
|
|
m_resetStateFlg0 = 0;
|
|
attention_info.flags &= ~0x88;
|
|
field_0x16b6 = 0;
|
|
field_0x16e8 = shape_angle.y;
|
|
field_0x1710 = field_0x170e;
|
|
|
|
setDemoData();
|
|
setStickData();
|
|
m_morf_frame = -1.0f;
|
|
setLashCnt();
|
|
setTalkModeWolf();
|
|
|
|
if (checkStateFlg0(FLG0_UNK_1) && m_anmIdx[2] == 0xFFFF && (m_tgco_cyl[0].ChkTgHit() || m_tgco_cyl[1].ChkTgHit() || m_tgco_cyl[2].ChkTgHit() || m_head_sph.ChkTgHit())) {
|
|
setNeckAnime(ANM_HS_LASH, 1.0f, 0.0f, -1);
|
|
m_sound.startCreatureVoice(Z2SE_HS_V_RUSH, -1);
|
|
}
|
|
|
|
if (m_cowHit != 0) {
|
|
m_cowHit--;
|
|
}
|
|
|
|
if (m_procID != PROC_TURN_e && field_0x170c != 0) {
|
|
field_0x170c--;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_1)) {
|
|
field_0x16bc = 0;
|
|
}
|
|
|
|
animePlay();
|
|
checkDemoAction();
|
|
|
|
(this->*m_proc)();
|
|
|
|
cXyz old_pos(current.pos);
|
|
f32 old_speedF = speedF;
|
|
speedF *= cM_scos(shape_angle.x);
|
|
|
|
if (m_procID == PROC_JUMP_e) {
|
|
fopAcM_posMoveF(this, NULL);
|
|
} else {
|
|
fopAcM_posMoveF(this, m_cc_stts.GetCCMoveP());
|
|
if (m_cc_stts.GetCCMoveP()->abs() > 0.0001f) {
|
|
s16 old_shape_y = shape_angle.y;
|
|
s16 old_angle_y = current.angle.y;
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (checkHorseNoMove(1) == 2) {
|
|
current.pos -= *m_cc_stts.GetCCMoveP();
|
|
break;
|
|
}
|
|
|
|
shape_angle.y += 0x2000;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
shape_angle.y = old_shape_y;
|
|
current.angle.y = old_angle_y;
|
|
}
|
|
}
|
|
|
|
speedF = old_speedF;
|
|
|
|
m_cc_stts.ClrCcMove();
|
|
f32 old_speed_y = speed.y;
|
|
|
|
bgCheck();
|
|
m_acch.CrrPos(dComIfG_Bgsp());
|
|
|
|
if (checkStateFlg0(FLG0_UNK_4000)) {
|
|
autoGroundHit();
|
|
} else {
|
|
current.pos.y = old_pos.y;
|
|
speed.y = 0.0f;
|
|
}
|
|
|
|
if (m_procID == PROC_TOOL_DEMO_e) {
|
|
J3DTransformInfo sp70;
|
|
m_mtxcalc->getAnm(0)->getTransform(0, &sp70);
|
|
|
|
mDoMtx_stack_c::transS(old_pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
|
|
Vec sp54 = {0.0f, 0.0f, 0.0f};
|
|
sp54.x = sp70.mTranslate.x;
|
|
sp54.z = sp70.mTranslate.z;
|
|
|
|
mDoMtx_stack_c::multVec(&sp54, ¤t.pos);
|
|
if (field_0x1730 != 0 && -1000000000.0f != m_acch.GetGroundH()) {
|
|
current.pos.y = m_acch.GetGroundH();
|
|
}
|
|
} else if (m_procID == PROC_JUMP_e) {
|
|
speed.y = old_speed_y;
|
|
}
|
|
|
|
if (checkStateFlg0(FLG0_UNK_1) && m_acch.ChkGroundHit() && checkStateFlg0(FLG0_UNK_2)) {
|
|
if (!checkStateFlg0(FLG0_UNK_1000)) {
|
|
dComIfGp_getVibration().StartQuake(VIBMODE_S_DOKUTT, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
onStateFlg0(FLG0_UNK_1000);
|
|
}
|
|
} else if (checkStateFlg0(FLG0_UNK_1000)) {
|
|
dComIfGp_getVibration().StopQuake(0x1F);
|
|
offStateFlg0(FLG0_UNK_1000);
|
|
}
|
|
|
|
setRoomInfo(0);
|
|
setMatrix();
|
|
footBgCheck();
|
|
setTailAngle();
|
|
|
|
m_model->calc();
|
|
setBodyPart();
|
|
|
|
if (m_procID == PROC_TOOL_DEMO_e) {
|
|
cXyz sp48;
|
|
mDoMtx_multVec(m_model->getAnmMtx(0), &cXyz::BaseX, &sp48);
|
|
field_0x170e = cM_atan2s(-sp48.x, -sp48.z);
|
|
} else {
|
|
field_0x170e = shape_angle.y;
|
|
}
|
|
|
|
cXyz sp3C;
|
|
cXyz sp30;
|
|
mDoMtx_multVecZero(m_model->getAnmMtx(0xB), &sp3C);
|
|
mDoMtx_multVecZero(m_model->getAnmMtx(0x14), &sp30);
|
|
sp30 -= sp3C;
|
|
|
|
field_0x1712 = sp30.atan2sX_Z() - field_0x170e;
|
|
if (field_0x1712 > 0x2000) {
|
|
field_0x1712 = 0x2000;
|
|
} else if (field_0x1712 < -0x2000) {
|
|
field_0x1712 = -0x2000;
|
|
}
|
|
|
|
if (checkResetStateFlg0(RFLG0_UNK_1)) {
|
|
mDoMtx_stack_c::transS(m_bodyEyePos.x, m_bodyEyePos.y, m_bodyEyePos.z);
|
|
mDoMtx_stack_c::YrotM(field_0x170e - field_0x1710);
|
|
mDoMtx_stack_c::transM(-field_0x17b8.x, -field_0x17b8.y, -field_0x17b8.z);
|
|
|
|
daHorseRein_c* rein_p = m_rein;
|
|
cXyz* var_r26;
|
|
for (int i = 0; i < 3; i++) {
|
|
var_r26 = rein_p->field_0x0[0];
|
|
for (int j = 0; j < rein_p->field_0x8[1]; j++, var_r26++) {
|
|
mDoMtx_stack_c::multVec(var_r26, var_r26);
|
|
}
|
|
rein_p++;
|
|
}
|
|
}
|
|
|
|
field_0x17b8 = m_bodyEyePos;
|
|
|
|
m_sound.framework(m_poly_sound, m_reverb);
|
|
|
|
if (field_0x1144 != NULL) {
|
|
m_sound.updateAnime(field_0x1144->getFrame(), field_0x1144->getRate());
|
|
}
|
|
|
|
setEffect();
|
|
setCollision();
|
|
|
|
if (!checkStateFlg0(FLG0_UNK_1)) {
|
|
setReinPosNormal();
|
|
m_sound.setLinkRiding(false);
|
|
} else {
|
|
m_sound.setLinkRiding(true);
|
|
}
|
|
|
|
if (!player_p->checkHorseRide()) {
|
|
m_lashCnt = 6;
|
|
}
|
|
|
|
if (!checkInputOnR() && fabsf(speedF) < 0.05f) {
|
|
offStateFlg0(FLG0_UNK_8);
|
|
} else if (fabsf(speedF) > 0.2f * daHorse_hio_c0::m.max_backward_speed || (m_anmIdx[0] == ANM_HS_WALK_START && m_frameCtrl[0].getFrame() > 2.0f)) {
|
|
onStateFlg0(FLG0_UNK_8);
|
|
}
|
|
|
|
m_endResetStateFlg0 = 0;
|
|
|
|
if (checkResetStateFlg0(RFLG0_UNK_200) || player_p->checkHorseZelda()) {
|
|
m_modelData->getMaterialNodePointer(5)->getShape()->hide();
|
|
} else {
|
|
m_modelData->getMaterialNodePointer(5)->getShape()->show();
|
|
}
|
|
|
|
dMeter2Info_setHorseLifeCount(m_lashCnt);
|
|
return 1;
|
|
}
|
|
|
|
/* 80844570-80844590 00C730 0020+00 1/0 0/0 0/0 .text daHorse_Execute__FP9daHorse_c */
|
|
static int daHorse_Execute(daHorse_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 80844590-8084476C 00C750 01DC+00 1/1 0/0 0/0 .text draw__9daHorse_cFv */
|
|
int daHorse_c::draw() {
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
if (checkStateFlg0(FLG0_NO_DRAW_WAIT) || checkResetStateFlg0(RFLG0_UNK_80)) {
|
|
return 1;
|
|
}
|
|
|
|
g_env_light.setLightTevColorType_MAJI(m_model, &tevStr);
|
|
|
|
if (dComIfGp_getCameraAttentionStatus(0) & 0x40) {
|
|
m_modelData->getMaterialNodePointer(2)->getShape()->hide();
|
|
} else {
|
|
m_modelData->getMaterialNodePointer(2)->getShape()->show();
|
|
}
|
|
|
|
m_btp.entry(m_modelData, m_btpFrame);
|
|
mDoExt_modelEntryDL(m_model);
|
|
|
|
cXyz shadow_pos(current.pos.x, 100.0f + current.pos.y, current.pos.z);
|
|
m_shadowID = dComIfGd_setShadow(m_shadowID, 0, m_model, &shadow_pos, 1000.0f, 0.0f, current.pos.y, m_acch.GetGroundH(), m_acch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
|
|
if (!checkResetStateFlg0(RFLG0_UNK_100) && (!checkStateFlg0(FLG0_UNK_1) || !daAlink_getAlinkActorClass()->checkHorseSubjectivity())) {
|
|
static GXColor reinLineColor = {0x00, 0x00, 0x00, 0xFF};
|
|
m_reinLine.update(field_0x1204, 1.5f, reinLineColor, 0, &tevStr);
|
|
dComIfGd_set3DlineMat(&m_reinLine);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8084476C-8084478C 00C92C 0020+00 1/0 0/0 0/0 .text daHorse_Draw__FP9daHorse_c */
|
|
static int daHorse_Draw(daHorse_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 8084478C-80844B1C 00C94C 0390+00 1/1 0/0 0/0 .text __dt__9daHorse_cFv */
|
|
daHorse_c::~daHorse_c() {
|
|
m_sound.deleteObject();
|
|
dComIfG_resDelete(&m_phase, l_arcName);
|
|
|
|
if (dComIfGp_getHorseActor() == this) {
|
|
dComIfGp_setHorseActor(NULL);
|
|
}
|
|
}
|
|
|
|
/* 80844B1C-80844B44 00CCDC 0028+00 1/0 0/0 0/0 .text daHorse_Delete__FP9daHorse_c */
|
|
static int daHorse_Delete(daHorse_c* i_this) {
|
|
i_this->~daHorse_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 80845A34-80845A54 -00001 0020+00 1/0 0/0 0/0 .data l_daHorse_Method */
|
|
static actor_method_class l_daHorse_Method = {
|
|
(process_method_func)daHorse_Create,
|
|
(process_method_func)daHorse_Delete,
|
|
(process_method_func)daHorse_Execute,
|
|
0,
|
|
(process_method_func)daHorse_Draw,
|
|
};
|
|
|
|
/* 80845A54-80845A84 -00001 0030+00 0/0 0/0 1/0 .data g_profile_HORSE */
|
|
extern actor_process_profile_definition g_profile_HORSE = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
4, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_HORSE, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daHorse_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
90, // mPriority
|
|
&l_daHorse_Method, // sub_method
|
|
0x00060000, // mStatus
|
|
fopAc_UNK_GROUP_5_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
AUDIO_INSTANCES;
|