d_a_midna equivalent (#2658)

This commit is contained in:
YunataSavior 2025-09-14 13:02:05 -07:00 committed by GitHub
parent 275135fe54
commit bd49d7b918
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 40 deletions

View File

@ -1577,8 +1577,8 @@ config.libs = [
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"),

View File

@ -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";
@ -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};
@ -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
);
@ -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();
@ -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;
@ -1779,10 +1778,8 @@ 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()) {
@ -1790,14 +1787,15 @@ void daMidna_c::setAnm() {
}
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;
@ -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)
@ -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);
@ -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;
@ -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];
@ -2135,7 +2134,7 @@ 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)
@ -2143,7 +2142,7 @@ void daMidna_c::setAnm() {
{
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
@ -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);
}
@ -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();
@ -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;
@ -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;
@ -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;
@ -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;