Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -1577,8 +1577,8 @@ def MatchingFor(*versions) -> bool:
ActorRel(NonMatching, "d_a_demo00"),
ActorRel(MatchingFor("GZ2E01", "GZ2J01"), "d_a_disappear"),
ActorRel(NonMatching, "d_a_mg_rod"),
ActorRel(NonMatching, "d_a_midna"),
ActorRel(Equivalent, "d_a_nbomb"), # weak func order
ActorRel(Equivalent, "d_a_midna"), # weak func order
ActorRel(Equivalent, "d_a_nbomb"), # weak func order
ActorRel(MatchingFor("GZ2E01", "GZ2J01"), "d_a_obj_life_container"),
ActorRel(MatchingFor("GZ2E01", "GZ2J01"), "d_a_obj_yousei"),
ActorRel(MatchingFor("GZ2E01", "GZ2J01"), "d_a_spinner"),
Expand Down
74 changes: 36 additions & 38 deletions src/d/actor/d_a_midna.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,21 @@
#include "d/dolzel_rel.h"

#include "d/actor/d_a_midna.h"
#include "SSystem/SComponent/c_math.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/J3DGraphLoader/J3DAnmLoader.h"
#include "d/d_meter2_info.h"
#include "f_op/f_op_actor_mng.h"
#include "d/actor/d_a_alink.h"
#include "d/actor/d_a_kago.h"
#include "d/d_demo.h"
#include "d/d_msg_object.h"
#include "d/d_procname.h"
#include "d/d_stage.h"

/* 804C64C8-804C64D4 000000 000C+00 15/15 0/0 0/0 .rodata @3777 */
static u8 const lit_3777[12] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static f32 dummy_lit_3777(int idx, u8 foo) {
Vec dummy_vec = {0.0f, 0.0f, 0.0f};
switch (idx) {
case 0: return dummy_vec.x;
case 1: return dummy_vec.y;
default: return dummy_vec.z;
}
}

/* 804C64D4-804C64DC 00000C 0006+02 5/6 0/0 0/0 .rodata l_arcName */
static char const l_arcName[6] = "Midna";
Expand Down Expand Up @@ -741,7 +740,6 @@ void daMidna_c::allAnimePlay() {
}

/* 804BDE04-804BE470 001C64 066C+00 2/2 0/0 0/0 .text setMatrix__9daMidna_cFv */
// NONMATCHING regalloc / instruction ordering
void daMidna_c::setMatrix() {
Vec vec1 = {0.0f, daMidna_hio_c0::m.field_0x18, daMidna_hio_c0::m.field_0x1c};
Vec scale = {daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale};
Expand Down Expand Up @@ -777,8 +775,10 @@ void daMidna_c::setMatrix() {
current.pos = link->current.pos;
shape_angle.y = link->shape_angle.y;
} else if (checkStateFlg0(FLG0_UNK_80000)) {
// FIXME: x-val is a fakematch. Subtraction + negation fixes instruction order,
// but debug no longer matches.
current.pos.set(
link->current.pos.x + -30.0f * sin_link_y + 65.0f * cos_link_y,
link->current.pos.x + -30.0f * sin_link_y - -(65.0f * cos_link_y),
link->current.pos.y,
link->current.pos.z + -30.0f * cos_link_y - 65.0f * sin_link_y
);
Expand Down Expand Up @@ -1096,7 +1096,6 @@ BOOL daMidna_c::checkAppear() {
}

/* 804BF070-804BFF80 002ED0 0F10+00 1/1 0/0 0/0 .text checkMidnaPosState__9daMidna_cFv */
// NONMATCHING needs to load g_dComIfG_gameInfo twice for two calls to dComIfGp_event_getPt2
void daMidna_c::checkMidnaPosState() {
daAlink_c* link = daAlink_getAlinkActorClass();

Expand Down Expand Up @@ -1286,7 +1285,7 @@ void daMidna_c::checkMidnaPosState() {
dComIfGp_evmng_cutEnd(mStaffID);
}
} else if (mDemoMode == 19 || mDemoMode == 21 || mDemoMode == 20) {
if (dComIfGp_event_getPt2() != NULL) {
if (dComIfGp_event_getPt2()) {
s16 angle = fopAcM_searchActorAngleY(this, dComIfGp_event_getPt2());
cLib_addCalcAngleS(&shape_angle.y, angle, 2, 0x2000, 0x800);
current.angle.y = shape_angle.y;
Expand Down Expand Up @@ -1779,25 +1778,24 @@ void daMidna_c::setBckAnime(J3DAnmTransform* i_bck, int i_attr, f32 i_morf) {
}

/* 804C103C-804C287C 004E9C 1840+00 2/2 0/0 0/0 .text setAnm__9daMidna_cFv */
// NONMATCHING regalloc
void daMidna_c::setAnm() {
BOOL bVar1, bVar2, bVar3;

u16 sVar4, res_id;
offStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000));

if (setDemoAnm()) {
return;
}

daAlink_c* link = daAlink_getAlinkActorClass();
BOOL bVar1;

if (dComIfGp_event_runCheck() || checkEndResetStateFlg0(ERFLG0_NO_SERVICE_WAIT)) {
bVar1 = TRUE;
} else {
bVar1 = FALSE;
}
bVar2 = FALSE;
bVar3 = TRUE;
BOOL bVar2 = FALSE;
BOOL bVar3 = TRUE;
bool tired = checkMidnaTired();
daMidna_ANM anm;

Expand Down Expand Up @@ -2011,8 +2009,9 @@ void daMidna_c::setAnm() {
offStateFlg0(FLG0_UNK_4);
}

u16 sVar4 = mBckHeap[1].getIdx();
u16 res_id = m_anmDataTable[anm].mResID;
sVar4 = mBckHeap[1].getIdx();
res_id = m_anmDataTable[anm].mResID;
J3DAnmTransform* bck;

if (!mBckHeap[0].checkNoSetArcNo() || (!checkSetAnime(0, anm) &&
(mMotionNum != 0 || !checkStateFlg0(FLG0_UNK_1)
Expand Down Expand Up @@ -2041,7 +2040,7 @@ void daMidna_c::setAnm() {
} else {
morf = 5.0f;
}
J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
setBckAnime(bck, -1, morf);

offStateFlg0(FLG0_UNK_1);
Expand Down Expand Up @@ -2074,7 +2073,7 @@ void daMidna_c::setAnm() {
} else if (anm == ANM_S_RETURN) {
current.pos.x += 90.0f * cM_ssin(shape_angle.y);
current.pos.z += 90.0f * cM_scos(shape_angle.y);
shape_angle.y += (s16)0x8000;
shape_angle.y += 0x8000;
field_0x85a = shape_angle.y;
current.angle.y = shape_angle.y;
mpMorf->getOldTransInfo()[JNT_BACKBONE1].mTranslate.z += 90.0f;
Expand All @@ -2084,9 +2083,9 @@ void daMidna_c::setAnm() {
JMAEulerToQuat(0, 0x8000, 0, &quat1);
quat2 = *quat_backbone_ptr;
mDoMtx_QuatConcat(&quat1, &quat2, quat_backbone_ptr);
Quaternion* quat_waist_ptr = &mpMorf->getOldQuaternion()[JNT_WAIST];
quat2 = *quat_waist_ptr;
mDoMtx_QuatConcat(&quat1, &quat2, quat_waist_ptr);
quat_backbone_ptr = &mpMorf->getOldQuaternion()[JNT_WAIST];
quat2 = *quat_backbone_ptr;
mDoMtx_QuatConcat(&quat1, &quat2, quat_backbone_ptr);
} else if (anm == ANM_WLSWIMDIE) {
J3DTransformInfo* trans_backbone = &mpMorf->getOldTransInfo()[JNT_BACKBONE1];
J3DTransformInfo* trans_waist = &mpMorf->getOldTransInfo()[JNT_WAIST];
Expand Down Expand Up @@ -2135,15 +2134,15 @@ void daMidna_c::setAnm() {
|| (checkSetAnime(0, ANM_SWAITC) && fabsf(speedF) > 0.1f))
{
offStateFlg0(FLG0_UNK_1);
J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID);
setBckAnime(bck, J3DFrameCtrl::EMode_LOOP, 5.0f);
setUpperAnime(mBckHeap[0].getIdx(), 0xffff);
} else if (checkSetAnime(0, ANM_SWAITB) && mUpperBck.checkFrame(95.0f)
&& fabsf(speedF) < 0.1f && cM_rnd() < 0.5f)
{
anm = ANM_SWAITC;
setUpperAnimeAndSe(ANM_SWAITC);
J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID);
setBckAnime(bck, J3DFrameCtrl::EMode_NONE, 0.0f);
}
} else if (daPy_py_c::checkNowWolf() && !bVar1
Expand Down Expand Up @@ -2172,9 +2171,9 @@ void daMidna_c::setAnm() {
anm = ANM_HIT;
}
}
u16 res_id = m_anmDataTable[anm].mResID;
res_id = m_anmDataTable[anm].mResID;
setUpperAnimeAndSe(anm);
J3DAnmTransform* bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
setBckAnime(bck, J3DFrameCtrl::EMode_NONE, 5.0f);
}

Expand Down Expand Up @@ -2514,7 +2513,6 @@ void daMidna_c::initHairAngle() {
}

/* 804C3298-804C3F04 0070F8 0C6C+00 2/2 0/0 0/0 .text setHairAngle__9daMidna_cFv */
// NONMATCHING regalloc
void daMidna_c::setHairAngle() {
if (!checkStateFlg0(FLG0_UNK_8)) {
initHairAngle();
Expand All @@ -2526,6 +2524,7 @@ void daMidna_c::setHairAngle() {
mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_1), &prev_pos);
s16 head_angle = head_dir.atan2sX_Z();
s16 inv_head_angle = head_angle + 0x8000;
cXyz vec, old_pos;

int i;
cXyz* pos = mHairPos;
Expand All @@ -2536,12 +2535,14 @@ void daMidna_c::setHairAngle() {

f32 fVar4 = 0.75f;
f32 fVar1 = 0.05f;
s16 target_angle_y;
BOOL bVar5 = false;
f32 fVar2 = fabsf(speedF) * 0.04f;
if (fVar2 > 1.0f) {
fVar2 = 1.0f;
}
s16 iVar16 = field_0x872;
s16 target_angle_z, iVar16;
iVar16 = field_0x872;
BOOL bVar4 = false;
field_0x872 += fVar2 * 0x1000 + 0x800;

Expand All @@ -2556,14 +2557,11 @@ void daMidna_c::setHairAngle() {
}

for (i = 0; i < 5; i++, pos++, dir++, angle_z++, angle_y++, scale++) {
cXyz vec, old_pos;

if (checkStateFlg0(FLG0_UNK_10000000)) {
cXyz target = l_hairScale[4];
cLib_chasePos(scale, target, 0.1f);
cLib_chasePos(scale, l_hairScale[4], 0.1f);
} else {
cXyz target = l_hairScale[i];
cLib_chasePos(scale, target, 0.1f);
cLib_chasePos(scale, l_hairScale[i], 0.1f);
}

old_pos = *pos;
Expand All @@ -2583,11 +2581,11 @@ void daMidna_c::setHairAngle() {
vec = *atn_pos - prev_pos;
mDoMtx_stack_c::YrotS(-shape_angle.y);
mDoMtx_stack_c::multVec(&vec, &vec);
s16 target_angle_y = fVar1 * cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z));
target_angle_y = fVar1 * cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z));
if (i == 0 && (vec.z < 0.0f || vec.y >= 0.0f)) {
bVar4 = true;
}
s16 target_angle_z;

if (bVar4) {
if (vec.y < 1.0f && i < 4) {
vec.y = 1.0f;
Expand Down