tp/src/d/actor/d_a_midna.cpp

3436 lines
129 KiB
C++

/**
* @file d_a_midna.cpp
*
*/
#include "d/dolzel_rel.h"
#include "d/actor/d_a_midna.h"
#include "JSystem/J3DGraphLoader/J3DAnmLoader.h"
#include "d/d_meter2_info.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"
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";
/* 804C64DC-804C64E8 000014 000C+00 0/1 0/0 0/0 .rodata l_eyeOffset */
static Vec const l_eyeOffset = { 16.0f, -10.400001f, 0.0f };
/* 804C64E8-804C64F4 000020 000C+00 0/1 0/0 0/0 .rodata l_headCenterOffset */
static Vec const l_headCenterOffset = { 0.0f, -10.400001f, 0.0f };
/* 804C64F4-804C64FC 00002C 0008+00 0/2 0/0 0/0 .rodata l_normalColor */
static GXColorS10 const l_normalColor = { 0x50, 0x00, 0x00, 0x00 };
/* 804C64FC-804C6500 000034 0004+00 0/3 0/0 0/0 .rodata l_normalKColor */
static GXColor const l_normalKColor = { 0xB4, 0x87, 0x00, 0x00 };
/* 804C6500-804C6504 000038 0004+00 0/3 0/0 0/0 .rodata l_normalKColor2 */
static GXColor const l_normalKColor2 = { 0x00, 0xC3, 0xC3, 0x00 };
/* 804C6504-804C650C 00003C 0008+00 0/1 0/0 0/0 .rodata l_bigColor */
static GXColorS10 const l_bigColor = { 0xFF, 0x64, 0x78, 0x00 };
/* 804C650C-804C6510 000044 0004+00 0/1 0/0 0/0 .rodata l_bigKColor */
static GXColor const l_bigKColor = { 0x1E, 0x00, 0x00, 0x00 };
/* 804C6510-804C6514 000048 0004+00 0/3 0/0 0/0 .rodata l_lNormalKColor */
static GXColor const l_lNormalKColor = { 0xFF, 0xDC, 0x00, 0x00 };
/* 804C6514-804C6518 00004C 0004+00 0/3 0/0 0/0 .rodata l_lNormalKColor2 */
static GXColor const l_lNormalKColor2 = { 0x00, 0xC3, 0xEB, 0x00 };
/* 804C6518-804C6520 000050 0008+00 0/1 0/0 0/0 .rodata l_lBigColor */
static GXColorS10 const l_lBigColor = { 0xFF, 0x78, 0x00, 0x00 };
/* 804C6520-804C6524 000058 0004+00 0/1 0/0 0/0 .rodata l_lBigKColor2 */
static GXColor const l_lBigKColor2 = { 0xAA, 0xFF, 0xC3, 0x00 };
/* 804C6524-804C6560 00005C 003C+00 0/2 0/0 0/0 .rodata l_hairScale */
static Vec const l_hairScale[5] = {
{0.3f, 0.8f, 0.7f},
{0.2f, 0.8f, 0.4f},
{0.15f, 0.75f, 0.5f},
{0.1f, 0.7f, 0.7f},
{1.0f, 1.0f, 1.0f},
};
enum Joint {
/* 0x00 */ JNT_WORLD_ROOT,
/* 0x01 */ JNT_BACKBONE1,
/* 0x02 */ JNT_BACKBONE2,
/* 0x03 */ JNT_NECK,
/* 0x04 */ JNT_HEAD,
/* 0x05 */ JNT_CHIN,
/* 0x06 */ JNT_HAIR_1,
/* 0x07 */ JNT_HAIR_2,
/* 0x08 */ JNT_HAIR_3,
/* 0x09 */ JNT_HAIR_4,
/* 0x0A */ JNT_HAIR_5,
/* 0x0B */ JNT_MOUTH,
/* 0x0C */ JNT_SHOULDER_L,
/* 0x0D */ JNT_ARM_L1,
/* 0x0E */ JNT_ARM_L2,
/* 0x0F */ JNT_HAND_L,
/* 0x10 */ JNT_SHOULDER_R,
/* 0x11 */ JNT_ARM_R1,
/* 0x12 */ JNT_ARM_R2,
/* 0x13 */ JNT_HAND_R,
/* 0x14 */ JNT_WAIST,
/* 0x15 */ JNT_CLOTCHL,
/* 0x16 */ JNT_LEG_L1,
/* 0x17 */ JNT_LEG_L2,
/* 0x18 */ JNT_FOOT_L,
/* 0x19 */ JNT_CLOTCHR,
/* 0x1A */ JNT_LEG_R1,
/* 0x1B */ JNT_LEG_R2,
/* 0x1C */ JNT_FOOT_R,
/* 0x1D */ JNT_MAX,
};
/* 804C6560-804C6580 000098 0020+00 1/3 0/0 0/0 .rodata m__14daMidna_hio_c0 */
daMidna_hio_c0::param const daMidna_hio_c0::m = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1.0f,
-87.0f,
25.0f,
};
bool daMidna_matAnm_c::sEyeMoveFlg;
u8 daMidna_matAnm_c::sMorfFrame;
/* 804BC218-804BC248 000078 0030+00 2/2 0/0 0/0 .text init__16daMidna_matAnm_cFv */
void daMidna_matAnm_c::init() {
mOldTransX = 0.0f;
mOldTransY = 0.0f;
mNowOffsetX = 0.0f;
mNowOffsetY = 0.0f;
sEyeMoveFlg = false;
sMorfFrame = 0;
}
/* 804BC248-804BC36C 0000A8 0124+00 1/0 0/0 0/0 .text calc__16daMidna_matAnm_cCFP11J3DMaterial */
void daMidna_matAnm_c::calc(J3DMaterial* i_material) const {
J3DMaterialAnm::calc(i_material);
for (u32 i = 0; i < 8; i++) {
if (getTexMtxAnm(i).getAnmFlag()) {
J3DTexMtxInfo& tex_mtx = i_material->getTexGenBlock()->getTexMtx(i)->getTexMtxInfo();
if (sMorfFrame != 0) {
f32 t = 1.0f / (sMorfFrame + 1);
tex_mtx.mSRT.mTranslationX =
mOldTransX * (1.0f - t) + tex_mtx.mSRT.mTranslationX * t;
tex_mtx.mSRT.mTranslationY =
mOldTransY * (1.0f - t) + tex_mtx.mSRT.mTranslationY * t;
} else if (sEyeMoveFlg != 0) {
tex_mtx.mSRT.mTranslationX = mNowOffsetX;
tex_mtx.mSRT.mTranslationY = mNowOffsetY;
}
const_cast<daMidna_matAnm_c*>(this)->mOldTransX = tex_mtx.mSRT.mTranslationX;
const_cast<daMidna_matAnm_c*>(this)->mOldTransY = tex_mtx.mSRT.mTranslationY;
}
}
}
/* 804BC36C-804BC3E0 0001CC 0074+00 1/0 0/0 0/0 .text
* execute__20daMidna_McaMorfCB1_cFUsP16J3DTransformInfo */
int daMidna_McaMorfCB1_c::execute(u16 i_jointNo, J3DTransformInfo* transform) {
if (!daPy_py_c::m_midnaActor->checkNoHairScale()) {
if (i_jointNo >= JNT_HAIR_1 && i_jointNo <= JNT_HAIR_5) {
cXyz* scale = &mpScale[i_jointNo - JNT_HAIR_1];
transform->mScale.x *= scale->x;
transform->mScale.y *= scale->y;
transform->mScale.z *= scale->z;
}
}
return 1;
}
/* 804C6590-804C65E4 0000C8 0054+00 0/1 0/0 0/0 .rodata m_texDataTable__9daMidna_c */
daMidna_texData_s const daMidna_c::m_texDataTable[21] = {
0x0405, 0x03A4,
0x03F5, 0x0399,
0x03F6, 0x0399,
0x0407, 0x0399,
0x0406, 0x03A5,
0x0405, 0x03A0,
0x03FA, 0x0399,
0x0401, 0x039E,
0x03F7, 0x039F,
0x0403, 0x03A2,
0x0404, 0x03A3,
0x03F7, 0x03A1,
0x03FC, 0x039A,
0x0402, 0x0399,
0x03FE, 0x039B,
0x03FF, 0x039C,
0x03F8, 0x0399,
0x03F9, 0x0399,
0x0400, 0x039D,
0x03FB, 0x0399,
0x03FD, 0x0399,
};
/* 804C65E4-804C6860 00011C 027C+00 3/12 0/0 0/0 .rodata m_anmDataTable__9daMidna_c */
daMidna_anmData_s const daMidna_c::m_anmDataTable[53] = {
0x01DC, 0x00, -1.0f, 0,
0x01B7, 0x01, -1.0f, 0,
0x01B8, 0x02, -1.0f, 0,
0x01DD, 0x03, -1.0f, 0,
0x01D3, 0x04, 1.0f, Z2SE_MDN_V_LV_PANIC,
0x01DB, 0x00, -1.0f, 0,
0x01C8, 0x05, 1.0f, Z2SE_MDN_V_FLY_OUT,
0x01C7, 0x00, -1.0f, 0,
0x01CB, 0x10, -1.0f, 0,
0x01CA, 0x00, 2.0f, Z2SE_MDN_V_HIP,
0x01C9, 0x00, 0.1f, Z2SE_MDN_V_LEADSWAIT,
0x01BA, 0x06, 3.0f, Z2SE_MDN_V_CLINGST,
0x01D8, 0x07, 3.0f, Z2SE_MDN_V_SWAITB_1,
0x01D9, 0x08, 1.0f, Z2SE_MDN_V_SWAITC,
0x01E1, 0x09, 1.0f, Z2SE_MDN_V_WLDIEA,
0x01E2, 0x0A, 1.0f, Z2SE_MDN_V_WLSWIMDIE,
0x0217, 0x00, -1.0f, 0,
0x0218, 0x00, -1.0f, 0,
0x021C, 0x00, -1.0f, 0,
0x0219, 0x00, -1.0f, 0,
0x01E0, 0x0B, -1.0f, 0,
0x01DF, 0x10, 7.0f, Z2SE_MDN_V_WAITTP,
0x01BE, 0x0C, 1.0f, Z2SE_MDN_V_ENTRANCE,
0x01DA, 0x0D, 28.0f, Z2SE_MDN_V_SWAITD,
0x01C6, 0x0E, 10.0f, Z2SE_MDN_V_HIT,
0x01CC, 0x0F, 11.0f, Z2SE_MDN_V_LOOKABOUT_1,
0x01D7, 0x12, 8.0f, Z2SE_MDN_V_SWAITA,
0x021A, 0x00, -1.0f, 0,
0x01D4, 0x00, -1.0f, 0,
0x01DE, 0x11, -1.0f, 0,
0x01B9, 0x11, -1.0f, 0,
0x01D6, 0x00, 27.0f, Z2SE_MDN_V_ROPEWAIT_1,
0x01D5, 0x00, 48.0f, Z2SE_MDN_V_ROPEFALTER,
0x01BB, 0x00, -1.0f, 0,
0x01BC, 0x00, 17.0f, Z2SE_MDN_V_DOOROP,
0x01BD, 0x00, 20.0f, Z2SE_MDN_V_DOOROP,
0x01C2, 0x13, -1.0f, 0,
0x01C3, 0x14, 0.1f, Z2SE_MDN_V_WARP_LIFTUP,
0x01CE, 0x10, 1.0f, Z2SE_MDN_V_MGN_CATCH,
0x01CD, 0x10, -1.0f, 0,
0x01D0, 0x10, 1.0f, Z2SE_MDN_V_MGN_TAME,
0x01CF, 0x10, 1.0f, Z2SE_MDN_V_MGN_THROW,
0x01D2, 0x10, 1.0f, Z2SE_MDN_V_MGN_TAME,
0x01D1, 0x10, 1.0f, Z2SE_MDN_V_MGN_THROW,
0x01BF, 0x00, -1.0f, 0,
0x01C0, 0x10, -1.0f, 0,
0x01C1, 0x00, -1.0f, 0,
0x01C1, 0x11, -1.0f, 0,
0x01C5, 0x00, -1.0f, 0,
0x021D, 0x00, -1.0f, 0,
0x021E, 0x00, -1.0f, 0,
0x021B, 0x00, -1.0f, 0,
0x01C4, 0x00, -1.0f, 0,
};
/* 804BC3E0-804BC5C4 000240 01E4+00 1/1 0/0 0/0 .text modelCallBack__9daMidna_cFi */
int daMidna_c::modelCallBack(int i_jointNo) {
mDoMtx_stack_c::copy(J3DSys::mCurrentMtx);
if ((i_jointNo == JNT_BACKBONE1 || i_jointNo == JNT_WAIST) && mDemoMode == 0x200) {
mDoMtx_stack_c::get()[0][3] = current.pos.x;
mDoMtx_stack_c::get()[2][3] = current.pos.z;
}
if (i_jointNo == JNT_HEAD) {
mDoMtx_stack_c::YrotM(-mNeckAngle.y);
mDoMtx_stack_c::ZrotM(mNeckAngle.x);
} else if (i_jointNo == JNT_BACKBONE1 || i_jointNo == JNT_BACKBONE2) {
mDoMtx_stack_c::ZrotM(mBackboneAngleZ);
} else {
int hair_joint_no = i_jointNo - JNT_HAIR_1;
if (checkStateFlg0(FLG0_UNK_10000000)) {
if (i_jointNo != JNT_HAIR_1) {
mDoMtx_stack_c::YrotM(-mHairAngleY[hair_joint_no - 1]);
mDoMtx_stack_c::ZrotM(-mHairAngleZ[hair_joint_no - 1]);
} else {
mDoMtx_stack_c::transS(J3DSys::mCurrentMtx[0][3], J3DSys::mCurrentMtx[1][3],
J3DSys::mCurrentMtx[2][3]);
mDoMtx_stack_c::YrotM(shape_angle.y + 0x4000);
mDoMtx_stack_c::XrotM(0x8000);
mDoMtx_stack_c::scaleM(daMidna_hio_c0::m.mScale, daMidna_hio_c0::m.mScale,
daMidna_hio_c0::m.mScale);
}
mDoMtx_stack_c::XYZrotM(0, mHairAngleY[hair_joint_no], mHairAngleZ[hair_joint_no]);
}
}
mpShadowModel->setAnmMtx(i_jointNo, mDoMtx_stack_c::get());
PSMTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
return 1;
}
/* 804BC5C4-804BC614 000424 0050+00 1/1 0/0 0/0 .text changeUpperBck__9daMidna_cFv */
int daMidna_c::changeUpperBck() {
J3DAnmTransform* anm = mUpperBck.getBckAnm();
mUpperBck.changeBckOnly(mpMorf->getAnm());
mpMorf->changeAnm(anm);
return 1;
}
/* 804BC614-804BC670 000474 005C+00 1/1 0/0 0/0 .text changeFaceBck__9daMidna_cFv */
int daMidna_c::changeFaceBck() {
if (checkStateFlg0(FLG0_UNK_800000)) {
J3DAnmTransform* anm = mFaceBck.getBckAnm();
mFaceBck.changeBckOnly(mpMorf->getAnm());
mpMorf->changeAnm(anm);
}
return 1;
}
/* 804BC670-804BC6FC 0004D0 008C+00 1/1 0/0 0/0 .text baseModelCallBack__9daMidna_cFi */
int daMidna_c::baseModelCallBack(int i_jointNo) {
if (i_jointNo == field_0x87e) {
changeFaceBck();
}
if (i_jointNo == JNT_WORLD_ROOT || i_jointNo == JNT_HAND_R) {
changeUpperBck();
} else if (i_jointNo == JNT_MOUTH) {
changeFaceBck();
} else if (i_jointNo != JNT_CHIN) {
modelCallBack(i_jointNo);
}
return 1;
}
/* 804BC6FC-804BC740 00055C 0044+00 1/1 0/0 0/0 .text daMidna_modelCallBack__FP8J3DJointi
*/
static int daMidna_modelCallBack(J3DJoint* i_joint, int param_2) {
int jnt_no = i_joint->getJntNo();
daMidna_c* _this = (daMidna_c*)j3dSys.getModel()->getUserArea();
if (param_2 == 0) {
_this->baseModelCallBack(jnt_no);
}
return 1;
}
/* 804BC740-804BC7D4 0005A0 0094+00 1/1 0/0 0/0 .text
* initInvModel__9daMidna_cFUsPP8J3DModelP21mDoExt_invisibleModelUl */
int daMidna_c::initInvModel(u16 i_resNo, J3DModel** i_modelP, mDoExt_invisibleModel* i_invModel,
u32 flag) {
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, i_resNo);
*i_modelP = mDoExt_J3DModel__create(model_data, 0, flag);
if (*i_modelP == NULL) {
return 0;
}
if (!i_invModel->create(*i_modelP, 1)) {
return 0;
}
return 1;
}
/* 804BC7D4-804BC868 000634 0094+00 1/1 0/0 0/0 .text initDemoModel__9daMidna_cFPP8J3DModelPCcUl
*/
int daMidna_c::initDemoModel(J3DModel** i_modelP, char const* i_bmdName, u32 flag) {
*i_modelP = NULL;
J3DModelData* model_data =
(J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(), i_bmdName);
if (model_data != NULL) {
*i_modelP = mDoExt_J3DModel__create(model_data, 0x80000, flag | 0x11000084);
if (*i_modelP == NULL) {
return 0;
}
}
return 1;
}
/* 804BC868-804BD050 0006C8 07E8+00 1/1 0/0 0/0 .text createHeap__9daMidna_cFv */
int daMidna_c::createHeap() {
for (int i = 0; i < 3; i++) {
if (i == 2) {
mBckHeap[i].setBufferSize(0x1000);
} else {
mBckHeap[i].setBufferSize(0x3800);
}
if (!mBckHeap[i].mallocBuffer()) {
return 0;
}
}
for (int i = 0; i < 2; i++) {
mpEyeMatAnm[i] = new daMidna_matAnm_c();
if (mpEyeMatAnm[i] == NULL) {
return 0;
}
}
if (dStage_roomControl_c::getDemoArcName()[0] != '\0') {
if (!initDemoModel(&mpDemoHLTmpBmd, "demo00_Midna_cut00_HL_tmp.bmd", 0)) {
return 0;
}
if (mpDemoHLTmpBmd != NULL && !daAlink_c::initDemoBck(&mpDemoHLTmpBck,
"demo00_Midna_cut00_HL_tmp.bck")) {
return 0;
}
if (!initDemoModel(&mpDemoHRTmpBmd, "demo00_Midna_cut00_HR_tmp.bmd", 0)) {
return 0;
}
if (mpDemoHRTmpBmd != NULL && !daAlink_c::initDemoBck(&mpDemoHRTmpBck,
"demo00_Midna_cut00_HR_tmp.bck")) {
return 0;
}
J3DModelData* hd_bmd =
(J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(),
"demo00_Midna_cut00_HD_tmp.bmd");
if (hd_bmd != NULL) {
mpDemoHDTmpBmd = mDoExt_J3DModel__create(hd_bmd, 0, 0x11000084);
if (mpDemoHDTmpBmd == NULL) {
return 0;
}
if (!daAlink_c::initDemoBck(&mpDemoHDTmpBck, "demo00_Midna_cut00_HD_tmp.bck")) {
return 0;
}
}
if (!initDemoModel(&mpDemoFCBlendBmd, "demo00_Midna_cut00_FC_blend.bmd", 0x1000000)) {
return 0;
}
if (!initDemoModel(&mpDemoFCTongueBmd, "demo00_Midna_cut00_FC_tongue.bmd", 0x200)) {
return 0;
}
if (mpDemoFCTongueBmd != NULL && !daAlink_c::initDemoBck(&mpDemoFCTmpBck,
"demo00_Midna_cut00_FC_tmp.bck")) {
return 0;
}
J3DModelData* bd_bmd =
(J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(),
"demo00_Midna_cut00_BD_tmp.bmd");
if (bd_bmd != NULL) {
mpDemoBDTmpBmd = mDoExt_J3DModel__create(bd_bmd, 0, 0x11020284);
if (mpDemoBDTmpBmd == NULL) {
return 0;
}
bd_bmd->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]);
bd_bmd->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]);
}
if (!initDemoModel(&mpDemoBDMaskBmd, "demo00_Midna_cut00_BD_mask.bmd", 0)) {
return 0;
}
if (!initDemoModel(&mpDemoBDHandsBmd, "demo00_Midna_cut00_BD_hands.bmd", 0)) {
return 0;
}
if (mpDemoBDHandsBmd != NULL) {
J3DModelData* hands_bmd = mpDemoBDHandsBmd->getModelData();
for (u16 i = 0; i < 4; i++) {
hands_bmd->getMaterialNodePointer(i)->getShape()->hide();
}
}
J3DModelData* hairhand_bmd =
(J3DModelData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(),
"demo00_Midna_cut00_BD_hairhand.bmd");
if (hairhand_bmd != NULL) {
mpDemoBDHairhandBmd = mDoExt_J3DModel__create(hairhand_bmd, 0, 0x11000084);
if (mpDemoBDHairhandBmd == NULL) {
return 0;
}
}
}
JKRReadIdxResource(mBckHeap[0].getBuffer(), mBckHeap[0].getBufferSize(),
0x1DC, dComIfGp_getAnmArchive());
J3DAnmTransform* md_anm =
(J3DAnmTransform*)J3DAnmLoaderDataBase::load(mBckHeap[0].getBuffer(),
J3DLOADER_UNK_FLAG0);
J3DModelData* md_bmd = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 14);
mpMorf = new mDoExt_McaMorfSO(md_bmd, &mMorfCB, NULL, md_anm,
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, NULL, 0, 0x11000284);
if (mpMorf == NULL || mpMorf->getModel() == NULL) {
return 0;
}
mMorfCB.setScale(mHairScale);
if (!mInvModel.create(mpMorf->getModel(), 1)) {
return 0;
}
if (!mUpperBck.init(mpMorf->getAnm(), TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false)) {
return 0;
}
if (!mFaceBck.init(mpMorf->getAnm(), TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false)) {
return 0;
}
if (!mBtpHeap.mallocBuffer()) {
return 0;
}
if (!mBtkHeap.mallocBuffer()) {
return 0;
}
if (!initInvModel(8, &mpShadowMaskBmd, &mMaskInvModel, 0x11000284)) {
return 0;
}
if (!initInvModel(7, &mpShadowHandsBmd, &mHandsInvModel, 0x11000284)) {
return 0;
}
if (!initInvModel(15, &mpShadowHairhandBmd, &mHairhandInvModel, 0x11000284)) {
return 0;
}
J3DModelData* gokou_bmd = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 11);
mpGokouBmd = mDoExt_J3DModel__create(gokou_bmd, 0x80000, 0x11000084);
if (mpGokouBmd == NULL) {
return 0;
}
mpHIO = new daMidna_hio_c0();
if (mpHIO == NULL) {
return 0;
}
if (mpDemoFCBlendBmd != NULL) {
mpDemoFCTmpBlk = new mDoExt_blkAnm();
if (mpDemoFCTmpBlk == NULL) {
return 0;
}
mpDemoFCTmpBls =
(J3DDeformData*)dComIfG_getObjectRes(dStage_roomControl_c::getDemoArcName(),
"demo00_Midna_cut00_FC_tmp.bls");
if (mpDemoFCTmpBls != NULL && mpDemoFCBlendBmd->setDeformData(mpDemoFCTmpBls, 1)) {
return 0;
}
}
return 1;
}
/* 804BD254-804BD274 0010B4 0020+00 1/1 0/0 0/0 .text daMidna_createHeap__FP10fopAc_ac_c
*/
static int daMidna_createHeap(fopAc_ac_c* i_this) {
return static_cast<daMidna_c*>(i_this)->createHeap();
}
/* 804BD274-804BD8B8 0010D4 0644+00 1/1 0/0 0/0 .text create__9daMidna_cFv */
cPhs__Step daMidna_c::create() {
fopAcM_SetupActor(this, daMidna_c);
cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase, l_arcName);
if (step == cPhs_COMPLEATE_e) {
if (dStage_roomControl_c::getDemoArcName()[0] != '\0' &&
dComIfG_syncObjectRes(dStage_roomControl_c::getDemoArcName()) > 0) {
return cPhs_INIT_e;
}
u32 heap_size = 0x15b60;
if (dStage_roomControl_c::getDemoArcName()[0] != '\0') {
heap_size = 0x4d740;
heap_size |= 0x80000000;
}
if (!fopAcM_entrySolidHeap(this, daMidna_createHeap, heap_size)) {
return cPhs_ERROR_e;
}
mpFunc = &daMidna_c::checkMetamorphoseEnableBase;
for (u16 i = 0; i < 3; i++) {
mBckHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_3);
}
mBtpHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_1);
mBtkHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_2);
mSound.init(&current.pos, &eyePos, 3, 1);
mpShadowModel = mpMorf->getModel();
mpShadowModel->setUserArea((uintptr_t)this);
J3DModelData* model_data = mpShadowModel->getModelData();
model_data->getJointNodePointer(JNT_WORLD_ROOT)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_HAND_R)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_HEAD)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_BACKBONE1)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_BACKBONE2)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_MOUTH)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_CHIN)->setCallBack(&daMidna_modelCallBack);
model_data->getJointNodePointer(JNT_WAIST)->setCallBack(&daMidna_modelCallBack);
for (u16 i = JNT_HAIR_1; i < JNT_HAIR_5 + 1; i++) {
model_data->getJointNodePointer(i)->setCallBack(&daMidna_modelCallBack);
}
mpShadowLeftHandShape = model_data->getMaterialNodePointer(1)->getShape();
mpShadowRightHandShape = model_data->getMaterialNodePointer(2)->getShape();
mpMoyaBtk = setSimpleBtk(model_data, 27);
mpAppearBrk = setSimpleBrk(model_data, 18);
model_data = mpShadowMaskBmd->getModelData();
mpMaskMoyaBtk = setSimpleBtk(model_data, 26);
mpMaskAppearBrk = setSimpleBrk(model_data, 21);
model_data = mpShadowHandsBmd->getModelData();
mpHandsMoyaBtk = setSimpleBtk(model_data, 25);
for (u16 i = 0; i < 4; i++) {
model_data->getMaterialNodePointer(i)->getShape()->hide();
}
model_data = mpShadowHairhandBmd->getModelData();
mpHairhandMoyaBtk = setSimpleBtk(model_data, 24);
mpHairhandAppearBrk = setSimpleBrk(model_data, 20);
model_data = mpGokouBmd->getModelData();
mpGokouAppearBrk = setSimpleBrk(model_data, 19);
mpGokouAppearBrk->setFrame(0.0f);
fopAcM_setStageLayer(this);
fopAcM_SetMtx(this, mpShadowModel->getBaseTRMtx());
mVoiceFrame = -1.0f;
setMatrix();
setRoomInfo();
daPy_py_c::setMidnaActor(this);
mpMorf->setMorf(1.0f);
if (fopAcM_GetParam(this) == 1 && checkMidnaRealBody() && !checkMidnaTired()) {
changeOriginalDemo();
changeDemoMode(11);
}
setHairAngle();
offStateFlg0(FLG0_UNK_8);
setAnm();
mpMorf->setMorf(0.0f);
allAnimePlay();
mpMorf->modelCalc();
setBodyPartMatrix();
field_0x6e0.r = l_normalColor.r;
field_0x6e0.g = l_normalColor.g;
field_0x6e0.b = l_normalColor.b;
field_0x6e0.a = l_normalColor.a;
if (dKy_darkworld_check()) {
field_0x6e8.r = l_normalKColor.r;
field_0x6e8.g = l_normalKColor.g;
field_0x6e8.b = l_normalKColor.b;
field_0x6e8.a = l_normalKColor.a;
field_0x6ec.r = l_normalKColor2.r;
field_0x6ec.g = l_normalKColor2.g;
field_0x6ec.b = l_normalKColor2.b;
field_0x6ec.a = l_normalKColor2.a;
} else {
field_0x6e8.r = l_lNormalKColor.r;
field_0x6e8.g = l_lNormalKColor.g;
field_0x6e8.b = l_lNormalKColor.b;
field_0x6e8.a = l_lNormalKColor.a;
field_0x6ec.r = l_lNormalKColor2.r;
field_0x6ec.g = l_lNormalKColor2.g;
field_0x6ec.b = l_lNormalKColor2.b;
field_0x6ec.a = l_lNormalKColor2.a;
}
model = mpShadowModel;
setMidnaNoDrawFlg();
}
return step;
}
/* 804BD91C-804BD93C 00177C 0020+00 1/0 0/0 0/0 .text daMidna_Create__FP10fopAc_ac_c */
static cPhs__Step daMidna_Create(fopAc_ac_c* i_this) {
return static_cast<daMidna_c*>(i_this)->create();
}
/* 804BD93C-804BDE04 00179C 04C8+00 2/2 0/0 0/0 .text allAnimePlay__9daMidna_cFv */
void daMidna_c::allAnimePlay() {
daAlink_c::simpleAnmPlay(mpMoyaBtk);
daAlink_c::simpleAnmPlay(mpHandsMoyaBtk);
daAlink_c::simpleAnmPlay(mpMaskMoyaBtk);
daAlink_c::simpleAnmPlay(mpHairhandMoyaBtk);
daAlink_c::simpleAnmPlay(field_0x668);
daAlink_c::simpleAnmPlay(mpDemoFCBlendBrk);
mUpperBck.play();
if (mDemoMode == 0xc) {
mUpperBck.setFrame(0.0f);
}
mUpperBck.getBckAnm()->setFrame(mUpperBck.getFrame());
if (checkStateFlg0(FLG0_UNK_800000)) {
if (dMsgObject_c::isMouthCheck()) {
mFaceBckTimer = 20;
} else {
if (mFaceBckTimer != 0) {
mFaceBckTimer--;
}
}
if (mFaceBckTimer == 0 && mFaceBck.checkFrame(0.0f)) {
mFaceBck.setFrame(0.0f);
mFaceBck.getBckAnm()->setFrame(0.0f);
} else {
mFaceBck.play();
mFaceBck.getBckAnm()->setFrame(mFaceBck.getFrame());
}
}
if (mpModel != NULL && mpFaceBtp != NULL && mpFaceBtk != NULL) {
s16 uvar6, uvar7;
if (checkStateFlg0(FLG0_UNK_40)) {
if (field_0x84a != 0) {
field_0x84a++;
if (field_0x84a > mpFaceBtp->getFrameMax()) {
field_0x84a = 0;
}
} else {
if (cM_rnd() < 0.012f) {
field_0x84a++;
}
}
uvar7 = uvar6 = field_0x84a;
} else if (checkStateFlg0(FLG0_UNK_800000)) {
uvar7 = uvar6 = mFaceBck.getFrame();
} else {
uvar7 = uvar6 = mUpperBck.getFrame();
}
if (uvar6 > mpFaceBtp->getFrameMax()) {
uvar6 = mpFaceBtp->getFrameMax();
}
if (uvar7 > mpFaceBtk->getFrameMax()) {
uvar7 = mpFaceBtk->getFrameMax();
}
mpFaceBtp->setFrame(uvar6);
mpFaceBtk->setFrame(uvar7);
}
mpMorf->play(0, mReverb);
if (mDemoMode == 0xc) {
mpMorf->setFrame(0.0f);
}
if (checkSetAnime(0, ANM_S_APPEAR) || checkSetAnime(0, ANM_S_APPEARBL)) {
mpAppearBrk->setFrame(mpMorf->getFrame());
mpMaskAppearBrk->setFrame(mpMorf->getFrame());
mpHairhandAppearBrk->setFrame(mpMorf->getFrame());
mpGokouAppearBrk->setFrame(mpMorf->getFrame());
} else if (field_0x84e == 1 || field_0x84e == 2) {
mpAppearBrk->setFrame(0.0f);
mpMaskAppearBrk->setFrame(0.0f);
mpHairhandAppearBrk->setFrame(0.0f);
mpGokouAppearBrk->setFrame(0.0f);
} else {
mpAppearBrk->setFrame(mpAppearBrk->getFrameMax() - 0.001f);
mpMaskAppearBrk->setFrame(mpMaskAppearBrk->getFrameMax() - 0.001f);
mpHairhandAppearBrk->setFrame(mpHairhandAppearBrk->getFrameMax() - 0.001f);
if (checkSetAnime(0, ANM_S_RETURN)) {
mpGokouAppearBrk->setFrame(mpMorf->getEndFrame() - mpMorf->getFrame());
} else if (checkSetAnime(0, ANM_RETURN)) {
f32 fvar8 = mpGokouAppearBrk->getFrame() - 2.0f;
if (fvar8 < 0.0f) {
fvar8 = 0.0f;
}
mpGokouAppearBrk->setFrame(fvar8);
} else {
mpGokouAppearBrk->setFrame(mpGokouAppearBrk->getFrameMax() - 0.001f);
}
}
if (mLeftHandShapeIdx == 0xfd && mpDemoHLTmpBck != NULL) {
mpDemoHLTmpBck->play();
}
if (mRightHandShapeIdx == 0xfd && mpDemoHRTmpBck != NULL) {
mpDemoHRTmpBck->play();
}
if (checkStateFlg1(FLG1_UNK_10) && mpDemoHDTmpBck != NULL) {
mpDemoHDTmpBck->play();
}
if (checkStateFlg0(FLG0_UNK_10)) {
if (mpDemoFCTmpBlk != NULL && mpDemoFCTmpBlk->getBlkAnm() != NULL) {
daAlink_c::simpleAnmPlay(mpDemoFCTmpBlk->getBlkAnm());
}
if (mpDemoFCTongueBtk != NULL) {
daAlink_c::simpleAnmPlay(mpDemoFCTongueBtk);
}
if (mpDemoFCTmpBck != NULL) {
mpDemoFCTmpBck->play();
}
}
}
/* 804BDE04-804BE470 001C64 066C+00 2/2 0/0 0/0 .text setMatrix__9daMidna_cFv */
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};
if (mpModel != NULL) {
mpModel->setBaseScale(scale);
}
mpShadowModel->setBaseScale(scale);
daAlink_c* link = daAlink_getAlinkActorClass();
if (mDemoMode == 0x200) {
J3DTransformInfo transform;
mpMorf->getTransform(1, &transform);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(shape_angle.y);
Vec vec2 = {transform.mTranslate.x, 0.0f, transform.mTranslate.z};
mDoMtx_stack_c::multVec(&vec2, &current.pos);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get());
} else if (mpKago != NULL) {
mDoMtx_multVecZero(mpKago->getMidnaLocaterMtx(), &current.pos);
shape_angle.y = mpKago->shape_angle.y;
mDoMtx_MtxToRot(mpKago->getMidnaLocaterMtx(), &shape_angle);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::transM(0.0f, -98.0f, 17.0f);
mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get());
} else if (!checkStateFlg0(FLG0_WOLF_NO_POS) &&
(!daPy_py_c::checkNowWolf() || checkShadowModelDrawSmode())) {
if (field_0x84e != 4) {
f32 sin_link_y = cM_ssin(link->shape_angle.y);
f32 cos_link_y = cM_scos(link->shape_angle.y);
if (field_0x84e == 2) {
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.y,
link->current.pos.z + -30.0f * cos_link_y - 65.0f * sin_link_y
);
shape_angle.y = link->shape_angle.y - cM_deg2s(50.0f);
field_0x85a = shape_angle.y;
} else {
current.pos.set(
link->current.pos.x + 90.0f * sin_link_y,
link->current.pos.y,
link->current.pos.z + 90.0f * cos_link_y
);
shape_angle.y = link->shape_angle.y + 0x8000;
field_0x85a = shape_angle.y;
}
if (!checkStateFlg0(FLG0_UNK_80000) && checkStateFlg0(FLG0_UNK_40000000)) {
current.pos.x += 80.0f * sin_link_y;
current.pos.z += 80.0f * cos_link_y;
}
if (link->checkHorseRide() || link->checkBoarRide()) {
current.pos.y -= 100.0f;
} else if (dComIfGp_checkPlayerStatus0(0, 0x100000)) {
current.pos.y -= 150.0f;
}
if (mDemoMode == 2) {
current.pos.x += field_0x8dc * sin_link_y;
current.pos.z += field_0x8dc * cos_link_y;
}
}
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(shape_angle.y);
mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get());
} else {
if (!checkStateFlg0(FLG0_WOLF_NO_POS) && mDemoMode != 9) {
mDoMtx_stack_c::copy(link->getWolfMidnaMatrix());
mDoMtx_stack_c::ZXYrotM(-0x4000, -0x4000, 0);
mDoMtx_stack_c::transM(-1.6f, -1.56f, -6.6f);
if (checkSetAnime(0, ANM_WLSWIMDIE) && !checkStateFlg0(FLG0_NO_DRAW)) {
mDoMtx_stack_c::multVecZero(&current.pos);
} else {
mDoMtx_stack_c::multVec(&vec1, &current.pos);
}
shape_angle = link->shape_angle;
mDoMtx_stack_c::get()[0][3] = current.pos.x;
mDoMtx_stack_c::get()[1][3] = current.pos.y;
mDoMtx_stack_c::get()[2][3] = current.pos.z;
} else {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(shape_angle.y);
if (checkSetAnime(0, ANM_WARPIN) && checkStateFlg1(FLG1_SIDE_WARP)) {
f32 fvar7 = (mpMorf->getFrame() - 24.0f) * 0.05f;
if (fvar7 < 0.0f) {
fvar7 = 0.0f;
} else if (fvar7 > 1.0f) {
fvar7 = 1.0f;
}
mDoMtx_stack_c::transM(0.0f, 150.0f, 0.0f);
mDoMtx_stack_c::XrotM(fvar7 * 16384.0f);
mDoMtx_stack_c::transM(0.0f, -150.0f, 0.0f);
}
}
mpShadowModel->setBaseTRMtx(mDoMtx_stack_c::get());
speedF = link->speedF;
current.angle = shape_angle;
s16 target_backbone_angle;
if (checkStateFlg0(FLG0_UNK_4)) {
target_backbone_angle = -(shape_angle.x >> 1);
} else {
target_backbone_angle = 0;
}
cLib_addCalcAngleS(&mBackboneAngleZ, target_backbone_angle, 3, 0x800, 0x100);
}
}
/* 804BE470-804BED1C 0022D0 08AC+00 2/2 0/0 0/0 .text setBodyPartMatrix__9daMidna_cFv */
void daMidna_c::setBodyPartMatrix() {
if (mpHandsBmd != NULL) {
mpHandsBmd->setBaseTRMtx(mpShadowModel->getBaseTRMtx());
mpHandsBmd->calc();
mpHandsBmd->setAnmMtx(1, mpShadowModel->getAnmMtx(JNT_HAND_L));
mpHandsBmd->setAnmMtx(2, mpShadowModel->getAnmMtx(JNT_HAND_R));
}
mpShadowHandsBmd->setBaseTRMtx(mpShadowModel->getBaseTRMtx());
mpShadowHandsBmd->calc();
mpShadowHandsBmd->setAnmMtx(1, mpShadowModel->getAnmMtx(JNT_HAND_L));
mpShadowHandsBmd->setAnmMtx(2, mpShadowModel->getAnmMtx(JNT_HAND_R));
if (mpMaskBmd != NULL) {
mpMaskBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD));
mpMaskBmd->calc();
}
mpShadowMaskBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD));
mpShadowMaskBmd->calc();
mDoMtx_stack_c::copy(mpShadowModel->getAnmMtx(JNT_HAIR_5));
mDoMtx_stack_c::transM(6.5f, 0.0f, 0.0f);
if (checkStateFlg1(FLG1_UNK_10)) {
mpDemoHDTmpBmd->setBaseTRMtx(mDoMtx_stack_c::get());
if (mpDemoHDTmpBck != NULL) {
J3DModelData* model_data = mpDemoHDTmpBmd->getModelData();
mpDemoHDTmpBck->entry(model_data, mpDemoHDTmpBck->getFrame());
}
mpDemoHDTmpBmd->calc();
}
BOOL bvar8 = false;
if (!checkStateFlg0((daMidna_FLG0)(FLG0_UNK_10000000 | FLG0_UNK_200000))) {
cXyz vec1, vec2;
mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_1), &vec1);
mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_5), &vec2);
vec2 -= vec1;
mDoMtx_stack_c::XYZrotM(0, mHairAngleY[4], mHairAngleZ[4] - vec2.atan2sY_XZ());
} else if (daAlink_getAlinkActorClass()->getWolfLockActorEnd() != NULL) {
cXyz vec;
mDoMtx_stack_c::multVecZero(&vec);
vec = daAlink_getAlinkActorClass()->getWolfLockActorEnd()->eyePos - vec;
mDoMtx_stack_c::XrotM(vec.atan2sX_Z() - shape_angle.y);
bvar8 = true;
}
if (mDemoMode == 0x13 || mDemoMode == 0x14 || mDemoMode == 0x15) {
bvar8 = true;
}
mpShadowHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get());
mpShadowHairhandBmd->calc();
J3DModelData* hairhand_model_data = mpShadowHairhandBmd->getModelData();
for (u16 i = 0; i < 3; i++) {
hairhand_model_data->getMaterialNodePointer(i)->getShape()->hide();
}
BOOL bvar2;
if (checkStateFlg0(FLG0_UNK_10000000) || checkSetAnime(2, ANM_HAIR)
|| checkSetAnime(2, ANM_S_TAKES) || checkSetAnime(2, ANM_S_WAITS)
|| checkSetAnime(2, ANM_S_PACKAWAY) || checkSetAnime(2, ANM_GRABST)
|| checkEndResetStateFlg0(ERFLG0_UNK_40) || dComIfGp_checkPlayerStatus1(0, 0x800000))
{
if (bvar8) {
hairhand_model_data->getMaterialNodePointer(2)->getShape()->show();
} else {
hairhand_model_data->getMaterialNodePointer(1)->getShape()->show();
}
bvar2 = true;
} else {
hairhand_model_data->getMaterialNodePointer(0)->getShape()->show();
bvar2 = false;
}
if (mpHairhandBmd != NULL) {
mpHairhandBmd->setBaseTRMtx(mDoMtx_stack_c::get());
mpHairhandBmd->calc();
J3DModelData* model_data = mpHairhandBmd->getModelData();
for (u16 i = 0; i < 3; i++) {
model_data->getMaterialNodePointer(i)->getShape()->hide();
}
const GXColorS10* color;
const GXColor* kcolor1;
const GXColor* kcolor2;
if (bvar2) {
if (bvar8) {
model_data->getMaterialNodePointer(2)->getShape()->show();
} else {
model_data->getMaterialNodePointer(1)->getShape()->show();
}
kcolor1 = &l_bigKColor;
if (dKy_darkworld_check()) {
color = &l_bigColor;
kcolor2 = &l_normalKColor2;
} else {
color = &l_lBigColor;
kcolor2 = &l_lBigKColor2;
}
} else {
model_data->getMaterialNodePointer(0)->getShape()->show();
color = &l_normalColor;
if (dKy_darkworld_check()) {
kcolor1 = &l_normalKColor;
kcolor2 = &l_normalKColor2;
} else {
kcolor1 = &l_lNormalKColor;
kcolor2 = &l_lNormalKColor2;
}
}
cLib_chaseS(&field_0x6e0.r, color->r, 10);
cLib_chaseS(&field_0x6e0.g, color->g, 10);
cLib_chaseS(&field_0x6e0.b, color->b, 10);
cLib_chaseUC(&field_0x6e8.r, kcolor1->r, 10);
cLib_chaseUC(&field_0x6e8.g, kcolor1->g, 10);
cLib_chaseUC(&field_0x6e8.b, kcolor1->b, 10);
cLib_chaseUC(&field_0x6ec.r, kcolor2->r, 10);
cLib_chaseUC(&field_0x6ec.g, kcolor2->g, 10);
cLib_chaseUC(&field_0x6ec.b, kcolor2->b, 10);
}
if (mpModel != NULL) {
mpModel->setBaseTRMtx(mpShadowModel->getBaseTRMtx());
for (int i = 0; i < JNT_MAX; i++) {
mpModel->setAnmMtx(i, mpShadowModel->getAnmMtx(i));
}
mpModel->calcWeightEnvelopeMtx();
}
mDoMtx_stack_c::transS(mpShadowModel->getAnmMtx(JNT_BACKBONE1)[0][3],
mpShadowModel->getAnmMtx(JNT_BACKBONE1)[1][3] + 20.0f,
mpShadowModel->getAnmMtx(JNT_BACKBONE1)[2][3]);
mpGokouBmd->setBaseTRMtx(mDoMtx_stack_c::get());
mpGokouBmd->calc();
if (mLeftHandShapeIdx == 0xfd) {
mpDemoHLTmpBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HAND_L));
if (mpDemoHLTmpBck != NULL) {
mpDemoHLTmpBck->entry(mpDemoHLTmpBmd->getModelData());
}
mpDemoHLTmpBmd->calc();
mpShadowLeftHandShape->hide();
if (mpLeftHandShape != NULL) {
mpLeftHandShape->hide();
}
} else {
mpShadowLeftHandShape->show();
if (mpLeftHandShape != NULL) {
mpLeftHandShape->show();
}
}
if (mRightHandShapeIdx == 0xfd) {
mpDemoHRTmpBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HAND_R));
if (mpDemoHRTmpBck != NULL) {
mpDemoHRTmpBck->entry(mpDemoHRTmpBmd->getModelData());
}
mpDemoHRTmpBmd->calc();
mpShadowRightHandShape->hide();
if (mpRightHandShape != NULL) {
mpRightHandShape->hide();
}
} else {
mpShadowRightHandShape->show();
if (mpRightHandShape != NULL) {
mpRightHandShape->show();
}
}
if (checkStateFlg0(FLG0_UNK_10)) {
mpDemoFCBlendBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD));
mpDemoFCBlendBmd->calc();
mpDemoFCTongueBmd->setBaseTRMtx(mpShadowModel->getAnmMtx(JNT_HEAD));
if (mpDemoFCTmpBck != NULL) {
mpDemoFCTmpBck->entry(mpDemoFCTongueBmd->getModelData());
}
mpDemoFCTongueBmd->calc();
}
}
/* 804BED1C-804BEDB8 002B7C 009C+00 2/2 0/0 0/0 .text setRoomInfo__9daMidna_cFv */
void daMidna_c::setRoomInfo() {
int room_no;
if (fopAcM_gc_c::gndCheck(&current.pos)) {
room_no = fopAcM_gc_c::getRoomId();
tevStr.YukaCol = fopAcM_gc_c::getPolyColor();
} else {
room_no = dComIfGp_roomControl_getStayNo();
}
tevStr.room_no = room_no;
mReverb = dComIfGp_getReverb(room_no);
fopAcM_SetRoomNo(this, room_no);
}
/* 804BEDB8-804BEFA0 002C18 01E8+00 1/1 0/0 0/0 .text setBodyPartPos__9daMidna_cFv */
void daMidna_c::setBodyPartPos() {
if (!(checkSetAnime(0, ANM_S_RETURN) && mpMorf->getFrame() > 14.0f)) {
mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &l_eyeOffset, &eyePos);
}
if (field_0x84e == 1 || (checkSetAnime(0, ANM_S_APPEAR) && mpMorf->getFrame() < 3.0f)) {
daAlink_c* link = daAlink_getAlinkActorClass();
f32 fvar1 = daPy_py_c::checkNowWolf() ? 250.0f : 50.0f;
attention_info.position.set(
link->current.pos.x + fvar1 * cM_ssin(link->shape_angle.y),
link->current.pos.y - 30.0f,
link->current.pos.z + fvar1 * cM_scos(link->shape_angle.y)
);
eyePos = attention_info.position;
} else if (field_0x84e == 2) {
attention_info.position = eyePos;
} else {
attention_info.position.set(current.pos.x, current.pos.y + 120.0f, current.pos.z);
}
mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &l_headCenterOffset, &mHeadCenterPos);
if (!checkStateFlg0(FLG0_NO_DRAW)) {
cXyz item_pos;
static Vec const localItemPos = { 0.0f, -68.0f, 0.0f };
mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HEAD), &localItemPos, &item_pos);
daAlink_getAlinkActorClass()->setItemPos(&item_pos);
}
}
/* 804BEFA0-804BF070 002E00 00D0+00 1/1 0/0 0/0 .text checkAppear__9daMidna_cFv */
BOOL daMidna_c::checkAppear() {
if (daPy_py_c::checkNowWolf() && daPy_py_c::checkFirstMidnaDemo() &&
(!daAlink_getAlinkActorClass()->checkMidnaDisappearMode()
|| checkStateFlg0(FLG0_WOLF_NO_POS)
|| (checkSetAnime(0, ANM_RETURN) && !mpMorf->isStop())))
{
return TRUE;
}
return FALSE;
}
/* 804BF070-804BFF80 002ED0 0F10+00 1/1 0/0 0/0 .text checkMidnaPosState__9daMidna_cFv */
void daMidna_c::checkMidnaPosState() {
daAlink_c* link = daAlink_getAlinkActorClass();
const cXyz* jump_point = link->checkMidnaLockJumpPoint();
if (checkStateFlg1(FLG1_UNK_200) || checkSetAnime(0, ANM_LEADTOWAITA)) {
jump_point = NULL;
}
offStateFlg1(FLG1_UNK_200);
const cXyz* pos = NULL;
if (jump_point == NULL) {
offStateFlg1(FLG1_UNK_400);
field_0x850 = 0;
}
if (mDemoMode == 0x200) {
dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID);
if (demo_actor != NULL) {
int tmp1, tmp2, tmp3;
u16 tmp4;
while (demo_actor->getDemoIDData(&tmp1, &tmp2, &tmp3, &tmp4, NULL)) {
if (tmp1 == 0 && tmp2 == 0 && tmp3 == 1) {
if (tmp4 != 0) {
offStateFlg0(FLG0_WOLF_NO_POS);
} else {
onStateFlg0(FLG0_WOLF_NO_POS);
}
}
}
}
offStateFlg0(FLG0_UNK_20);
return;
}
if (checkStateFlg0(FLG0_TAG_WAIT)) {
if (!checkEndResetStateFlg0(ERFLG0_UNK_2)) {
onStateFlg0(FLG0_NO_INPUT);
}
onStateFlg0(FLG0_WOLF_NO_POS);
pos = &mTagWaitPos;
field_0x8d4 = 30.0f;
offStateFlg0(FLG0_UNK_20);
} else if (link->checkMidnaWolfDeadAnime()) {
offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_200 | FLG0_UNK_20));
if (checkSetAnime(0, ANM_WLDIEA) && !checkStateFlg0(FLG0_NO_DRAW)
&& mpMorf->getFrame() >= 72.0f) {
onStateFlg0(FLG0_WOLF_NO_POS);
} else {
offStateFlg0(FLG0_WOLF_NO_POS);
}
} else if (link->checkMidnaWolfSwimDeadAnime()) {
offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_200 | FLG0_UNK_20));
if (checkSetAnime(0, ANM_WLSWIMDIE) && !checkStateFlg0(FLG0_NO_DRAW)
&& mpMorf->getFrame() >= 2.0f) {
onStateFlg0(FLG0_WOLF_NO_POS);
} else {
offStateFlg0(FLG0_WOLF_NO_POS);
}
} else if (jump_point != NULL) {
if (checkStateFlg0(FLG0_UNK_100) && !link->checkWolfTagLockJump()
&& field_0x9a0.abs2(*jump_point) > 100.0f) {
offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_UNK_200 | FLG0_UNK_100));
field_0x850 = 0;
field_0x851 = 0;
jump_point = pos;
} else {
onStateFlg0(FLG0_WOLF_NO_POS);
if (!checkStateFlg0(FLG0_UNK_100) || (field_0x9a0.abs2(*jump_point) > 100.0f
&& link->current.pos.abs2(field_0x9a0) < 40000.0f)) {
field_0x9a0 = *jump_point;
field_0x8d4 = jump_point->abs(current.pos) / link->getWolfTagJumpTime();
if (field_0x8d4 < 10.0f) {
field_0x8d4 = 10.0f;
}
onStateFlg0(FLG0_UNK_100);
offStateFlg0(FLG0_UNK_200);
pos = jump_point;
mSound.startCreatureSound(Z2SE_MIDNA_JUMP, field_0x850++, -1);
field_0x851 = field_0x850;
} else {
pos = &field_0x9a0;
}
if (!link->checkWolfTagLockJump() && !checkStateFlg1(FLG1_UNK_400)
&& (!checkStateFlg0(FLG0_UNK_200) || checkSetAnime(0, ANM_LEADED))) {
onStateFlg0(FLG0_NO_INPUT);
} else {
onStateFlg1(FLG1_UNK_400);
}
}
offStateFlg0(FLG0_UNK_20);
} else if (link->checkWolfTagLockJump() || checkStateFlg0(FLG0_UNK_100)) {
onStateFlg0(FLG0_WOLF_NO_POS);
if (!link->checkWolfTagLockJump()) {
onStateFlg1(FLG1_UNK_200);
} else {
onStateFlg0(FLG0_UNK_20);
}
offStateFlg0(FLG0_UNK_100);
} else {
if (checkStateFlg0(FLG0_WOLF_NO_POS)) {
offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_UNK_200));
onStateFlg0(FLG0_UNK_1000);
if (checkStateFlg0(FLG0_UNK_20)) {
offStateFlg0(FLG0_UNK_20);
mSound.startCreatureSound(Z2SE_MIDNA_JUMP_FINISH, field_0x851, -1);
}
} else {
offStateFlg0(FLG0_UNK_20);
}
}
if (mDemoMode == 12) {
if (daPy_py_c::checkNowWolf()) {
onStateFlg0(FLG0_WOLF_NO_POS);
Vec vec1 = {0.0f, daMidna_hio_c0::m.field_0x18, daMidna_hio_c0::m.field_0x1c};
cXyz vec2;
mDoMtx_stack_c::copy(link->getWolfMidnaMatrix());
mDoMtx_stack_c::ZXYrotM(-0x4000, -0x4000, 0);
mDoMtx_stack_c::multVec(&vec1, &vec2);
if (cLib_chasePos(&current.pos, vec2, 50.0f)) {
dComIfGp_evmng_cutEnd(mStaffID);
}
} else {
offStateFlg0(FLG0_WOLF_NO_POS);
dComIfGp_evmng_cutEnd(mStaffID);
}
offStateFlg0(FLG0_UNK_400000);
} else if (mDemoMode == 13) {
if (mpMorf->isStop()) {
dComIfGp_evmng_cutEnd(mStaffID);
}
offStateFlg0(FLG0_UNK_400000);
} else if (mDemoMode == 17 || mDemoMode == 18) {
if (mpMorf->isStop()) {
dComIfGp_evmng_cutEnd(mStaffID);
}
} else if (mDemoMode == 3 || mDemoMode == 6 || mDemoMode == 4 || mDemoMode == 19
|| mDemoMode == 20 || mDemoMode == 21 || mDemoMode == 7 || mDemoMode == 14
|| mDemoMode == 5 || mDemoMode == 16 || mDemoMode == 11 || mDemoMode == 8)
{
onStateFlg0(FLG0_WOLF_NO_POS);
offStateFlg0((daMidna_FLG0)(FLG0_UNK_400000 | FLG0_UNK_1000));
if (mDemoMode == 16) {
current.pos = mDemoPos;
shape_angle.y = mDemoAngle;
current.angle.y = shape_angle.y;
dComIfGp_evmng_cutEnd(mStaffID);
} else if (mDemoMode == 3 || mDemoMode == 6) {
if (cLib_addCalcPos(&current.pos, mDemoPos, 0.5f, mDemoSpeed, 1.0f) < 1.0f) {
dComIfGp_evmng_cutEnd(mStaffID);
} else {
cXyz vec = mDemoPos - current.pos;
cLib_addCalcAngleS(&shape_angle.y, vec.atan2sX_Z(), 2, 0x1000, 0x400);
current.angle.y = shape_angle.y;
onEndResetStateFlg0(ERFLG0_UNK_1);
}
} else if (mDemoMode == 4) {
if (cLib_addCalcAngleS(&shape_angle.y, mDemoAngle, 2, 0x1000, 0x400) == 0) {
dComIfGp_evmng_cutEnd(mStaffID);
}
current.angle.y = shape_angle.y;
} else if (mDemoMode == 8) {
if (checkSetAnime(0, ANM_S_HOLE)) {
cLib_addCalcAngleS(&shape_angle.y, mDemoAngle, 2, 0x2000, 0x800);
current.angle.y = shape_angle.y;
if (mpMorf->getFrame() >= 26.0f) {
setRightHandShape(3);
} else if (mpMorf->getFrame() >= 13.0f) {
setRightHandShape(2);
}
if (mpMorf->isStop()) {
dComIfGp_evmng_cutEnd(mStaffID);
}
}
} else if (mDemoMode == 7) {
if (checkSetAnime(2, ANM_S_TAKES) && mFaceBck.isStop()) {
dComIfGp_evmng_cutEnd(mStaffID);
}
} else if (mDemoMode == 14) {
if (checkSetAnime(2, ANM_S_PACKAWAY) && mFaceBck.isStop()) {
dComIfGp_evmng_cutEnd(mStaffID);
}
} else if (mDemoMode == 5) {
if ((checkSetAnime(0, ANM_S_RETURN) || checkSetAnime(0, ANM_RETURN)) && mpMorf->isStop())
{
offStateFlg0((daMidna_FLG0)(FLG0_WOLF_NO_POS | FLG0_TAG_WAIT));
dComIfGp_evmng_cutEnd(mStaffID);
}
} else if (mDemoMode == 19 || mDemoMode == 21 || mDemoMode == 20) {
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;
}
if (mDemoMode == 20 || (mDemoMode == 21 && mpMorf->isStop())
|| (mDemoMode == 19 && mFaceBck.isStop())) {
dComIfGp_evmng_cutEnd(mStaffID);
}
}
} else if (pos != NULL) {
if (checkEndResetStateFlg0(ERFLG0_UNK_2)) {
onStateFlg0(FLG0_UNK_200);
current.pos = *pos;
shape_angle.y = fopAcM_searchPlayerAngleY(this);
current.angle.y = shape_angle.y;
field_0x85a = shape_angle.y;
onEndResetStateFlg0(ERFLG0_UNK_100);
} else if (cLib_chasePos(&current.pos, *pos, field_0x8d4)) {
if (!checkStateFlg0(FLG0_UNK_200)) {
field_0x876 = fopAcM_searchPlayerAngleY(this);
}
onStateFlg0(FLG0_UNK_200);
} else {
cXyz start(current.pos.x, current.pos.y + 100.0f, current.pos.z);
cXyz end = current.pos * 2.0f - old.pos;
end.y += 100.0f;
mLinChk.Set(&start, &end, this);
if (dComIfG_Bgsp().LineCross(&mLinChk)) {
onStateFlg0(FLG0_UNK_400000);
}
}
s16 angle = shape_angle.y;
if (checkSetAnime(0, ANM_LEADED)) {
if (mpMorf->getFrame() >= 4.0f && mpMorf->getFrame() < 17.0f) {
if ((s16)(field_0x876 - shape_angle.y) < 0) {
angle = shape_angle.y + 0x7fff;
} else {
angle = field_0x876;
}
}
} else if (checkSetAnime(0, ANM_LEADST)) {
if (!checkStateFlg0(FLG0_UNK_200)) {
angle = cM_atan2s(pos->x - current.pos.x, pos->z - current.pos.z);
}
} else {
angle = fopAcM_searchPlayerAngleY(this);
onEndResetStateFlg0(ERFLG0_UNK_100);
}
cLib_addCalcAngleS(&shape_angle.y, angle, 2, 0x2000, 0x800);
} else {
offStateFlg0(FLG0_UNK_400000);
}
}
/* 804BFF80-804C0020 003DE0 00A0+00 3/3 0/0 0/0 .text setUpperAnime__9daMidna_cFUsUs */
BOOL daMidna_c::setUpperAnime(u16 i_resID, u16 param_1) {
J3DAnmTransform* bck;
if (param_1 == 0xffff) {
bck = (J3DAnmTransform*)mBckHeap[1].loadDataIdx(i_resID);
} else {
bck = (J3DAnmTransform*)mBckHeap[1].loadDataDemoRID(i_resID, 0);
}
if (bck == NULL) {
return FALSE;
}
mUpperBck.init(bck, TRUE, -1, 1.0f, 0, -1, true);
mSoundID = 0;
mVoiceFrame = -1.0f;
return TRUE;
}
/* 804C0020-804C0094 003E80 0074+00 1/1 0/0 0/0 .text
* setUpperAnimeAndSe__9daMidna_cFQ29daMidna_c11daMidna_ANM */
BOOL daMidna_c::setUpperAnimeAndSe(daMidna_c::daMidna_ANM i_anm) {
const daMidna_anmData_s* anm_data = &m_anmDataTable[i_anm];
if (setUpperAnime(anm_data->mResID, 0xffff)) {
mSoundID = anm_data->mSoundID;
mVoiceFrame = anm_data->mSoundFrame;
return TRUE;
}
return FALSE;
}
/* 804C0094-804C0134 003EF4 00A0+00 1/1 0/0 0/0 .text setFaceAnime__9daMidna_cFUsUs */
BOOL daMidna_c::setFaceAnime(u16 i_resID, u16 param_1) {
J3DAnmTransform* bck;
if (param_1 == 0xffff) {
bck = (J3DAnmTransform*)mBckHeap[2].loadDataIdx(i_resID);
} else {
bck = (J3DAnmTransform*)mBckHeap[2].loadDataDemoRID(i_resID, 0);
}
onStateFlg0(FLG0_UNK_800000);
if (bck == NULL) {
return FALSE;
}
mFaceBck.init(bck, TRUE, -1, 1.0f, 0, -1, true);
mFaceBckTimer = 20;
return TRUE;
}
/* 804C0134-804C0238 003F94 0104+00 2/2 0/0 0/0 .text endHighModel__9daMidna_cFv */
void daMidna_c::endHighModel() {
if (mpDemoFCTongueBtk != NULL) {
mpDemoFCTongueBmd->getModelData()->removeTexMtxAnimator(mpDemoFCTongueBtk);
}
offStateFlg0(FLG0_UNK_10);
mpDemoFCTmpCluster = NULL;
mpDemoFCTongueBtk = NULL;
if (mpModel != NULL) {
mpModel->getModelData()->getMaterialNodePointer(9)->getShape()->show();
mpModel->getModelData()->getMaterialNodePointer(1)->getShape()->show();
mpModel->getModelData()->getMaterialNodePointer(2)->getShape()->show();
mpModel->getModelData()->getMaterialNodePointer(3)->getShape()->show();
mpModel->getModelData()->getMaterialNodePointer(8)->getShape()->show();
}
}
/* 804C0238-804C0BAC 004098 0974+00 1/1 0/0 0/0 .text setDemoAnm__9daMidna_cFv */
BOOL daMidna_c::setDemoAnm() {
dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID);
if (demo_actor == NULL) {
return FALSE;
}
BOOL ret = FALSE;
BOOL bVar1 = FALSE;
int var1, var2, var3;
u16 var4;
while (demo_actor->getDemoIDData(&var1, &var2, &var3, &var4, NULL)) {
if (var1 == 0) {
if (var2 == 0) {
if (var3 == 2) {
offStateFlg1((daMidna_FLG1)(FLG1_UNK_20 | FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1));
if (var4 == 3) {
onStateFlg1(FLG1_UNK_20);
} else if (var4 == 2) {
onStateFlg1(FLG1_UNK_1);
} else if (var4 == 1) {
field_0x84e = 3;
onStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE);
} else {
field_0x84e = 0;
}
} else if (var3 == 3) {
if (var4 == 2) {
onStateFlg1(FLG1_FORCE_NORMAL_COL);
offStateFlg1(FLG1_FORCE_TIRED_COL);
} else if (var4 == 1) {
offStateFlg1(FLG1_FORCE_NORMAL_COL);
onStateFlg1(FLG1_FORCE_TIRED_COL);
} else {
offStateFlg1((daMidna_FLG1)(FLG1_FORCE_NORMAL_COL | FLG1_FORCE_TIRED_COL));
}
} else if (var3 == 4) {
if (var4 == 1) {
onEndResetStateFlg0(ERFLG0_UNK_20);
}
} else if (var3 == 5) {
if (var4 == 1) {
onStateFlg1(FLG1_NO_MASK_DRAW);
} else {
offStateFlg1(FLG1_NO_MASK_DRAW);
}
} else if (var3 == 6) {
if (var4 == 1) {
onStateFlg1(FLG1_SHADOW_NO_DRAW);
} else {
offStateFlg1(FLG1_SHADOW_NO_DRAW);
}
}
} else if (var2 == 5) {
if (var4 < 2) {
var4 += 2;
} else if (var4 == 0xfd && mpDemoHRTmpBmd == NULL) {
var4 = 0xfe;
}
setRightHandShape(var4);
} else if (var2 == 6) {
if (var4 == 0xfd && mpDemoHLTmpBmd == NULL) {
var4 = 0xfe;
}
setLeftHandShape(var4);
} else if (var2 == 9) {
if (var4 == 1 && mpDemoFCBlendBmd != NULL && mpDemoFCTongueBmd != NULL) {
onStateFlg0(FLG0_UNK_10);
bVar1 = TRUE;
if (mpModel != NULL) {
mpModel->getModelData()->getMaterialNodePointer(9)->getShape()->hide();
mpModel->getModelData()->getMaterialNodePointer(1)->getShape()->hide();
mpModel->getModelData()->getMaterialNodePointer(2)->getShape()->hide();
mpModel->getModelData()->getMaterialNodePointer(3)->getShape()->hide();
mpModel->getModelData()->getMaterialNodePointer(8)->getShape()->hide();
}
} else {
endHighModel();
}
} else if (var2 == 4) {
if (var3 == 1) {
if (var4 == 1) {
onStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000));
}
} else if (var4 == 2) {
onStateFlg1(FLG1_UNK_40);
} else if (var4 != 0 && mpDemoHDTmpBmd != NULL) {
onStateFlg1(FLG1_UNK_10);
} else {
offStateFlg1((daMidna_FLG1)(FLG1_UNK_40 | FLG1_UNK_10));
}
}
} else if (var1 == 2) {
if (var2 == 1) {
if (var3 == 2) {
J3DAnmTransform* bck = static_cast<J3DAnmTransform*>(
mBckHeap[0].loadDataDemoRID(var4, 0));
if (bck != NULL) {
f32 morf;
if (demo_actor->checkEnable(0x80)) {
morf = demo_actor->getPrm_Morf();
} else {
morf = 0.0f;
}
setBckAnime(bck, -1, morf);
setUpperAnime(var4, 0);
offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1));
demo_actor->setAnmFrameMax(mpMorf->getEndFrame());
}
ret = TRUE;
}
} else if (var2 == 6) {
if (var3 == 2) {
if (mpDemoHLTmpBck != NULL) {
J3DAnmTransform* bck = static_cast<J3DAnmTransform*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (bck != NULL && mpDemoHLTmpBck->getBckAnm() != bck) {
mpDemoHLTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true);
}
}
ret = TRUE;
}
} else if (var2 == 5) {
if (var3 == 2) {
if (mpDemoHRTmpBck != NULL) {
J3DAnmTransform* bck = static_cast<J3DAnmTransform*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (bck != NULL && mpDemoHRTmpBck->getBckAnm() != bck) {
mpDemoHRTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true);
}
}
ret = TRUE;
}
} else if (var2 == 9) {
if (var3 == 5) {
setFaceBtp(var4, TRUE);
ret = TRUE;
} else if (var3 == 3) {
if (checkStateFlg0(FLG0_UNK_10)) {
J3DAnmTextureSRTKey* btk = static_cast<J3DAnmTextureSRTKey*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (btk != NULL && mpDemoFCTongueBtk != btk) {
btk->searchUpdateMaterialID(mpDemoFCTongueBmd->getModelData());
mpDemoFCTongueBmd->getModelData()->entryTexMtxAnimator(btk);
btk->setFrame(0.0f);
mpDemoFCTongueBtk = btk;
}
} else {
setFaceBtk(var4, TRUE);
}
ret = TRUE;
} else if (var3 == 7) {
J3DAnmCluster* cluster = static_cast<J3DAnmCluster*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (mpDemoFCTmpCluster != cluster) {
mpDemoFCTmpCluster = cluster;
mpDemoFCTmpBlk->init(mpDemoFCTmpBls, mpDemoFCTmpCluster, FALSE,
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1);
mpDemoFCTmpBlk->getBlkAnm()->setFrame(0.0f);
}
ret = TRUE;
} else if (var3 == 2) {
if (mpDemoFCTmpBck != NULL) {
J3DAnmTransform* bck = static_cast<J3DAnmTransform*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (bck != NULL && mpDemoFCTmpBck->getBckAnm() != bck) {
mpDemoFCTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true);
}
}
ret = TRUE;
} else if (var3 == 4) {
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (brk != NULL && mpDemoFCBlendBrk != brk) {
brk->setFrame(0.0f);
mpDemoFCBlendBrk = brk;
if (mpDemoFCBlendBmd != NULL) {
mpDemoFCBlendBrk->searchUpdateMaterialID(mpDemoFCBlendBmd->getModelData());
}
}
}
} else if (var2 == 4) {
if (var3 == 2) {
if (mpDemoHDTmpBck != NULL) {
J3DAnmTransform* bck = static_cast<J3DAnmTransform*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (bck != NULL && mpDemoHDTmpBck->getBckAnm() != bck) {
mpDemoHDTmpBck->init(bck, TRUE, -1, 1.0f, 0, -1, true);
}
}
ret = TRUE;
} else if (var3 == 4) {
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(
dComIfG_getObjectIDRes(dStage_roomControl_c::getDemoArcName(), var4));
if (brk != NULL && field_0x668 != brk) {
brk->setFrame(0.0f);
field_0x668 = brk;
}
}
}
}
}
if (demo_actor->checkEnable(0x40)) {
mpMorf->setFrameF(demo_actor->getAnmFrame());
mUpperBck.setFrame(demo_actor->getAnmFrame());
mFaceBck.setFrame(demo_actor->getAnmFrame());
if (mpFaceBtp != NULL && !mBtpHeap.checkNoSetArcNo()) {
mpFaceBtp->setFrame(demo_actor->getAnmFrame());
}
if (mpFaceBtk != NULL && !mBtkHeap.checkNoSetArcNo()) {
mpFaceBtk->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoFCTmpBck != NULL) {
mpDemoFCTmpBck->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoHLTmpBck != NULL) {
mpDemoHLTmpBck->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoHRTmpBck != NULL) {
mpDemoHRTmpBck->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoHDTmpBck != NULL) {
mpDemoHDTmpBck->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoFCTongueBtk != NULL) {
mpDemoFCTongueBtk->setFrame(demo_actor->getAnmFrame());
}
if (mpDemoFCTmpBlk != NULL && mpDemoFCTmpBlk->getBlkAnm() != NULL) {
mpDemoFCTmpBlk->getBlkAnm()->setFrame(demo_actor->getAnmFrame());
}
}
if (!bVar1) {
endHighModel();
}
return ret;
}
/* 804C0BAC-804C0C6C 004A0C 00C0+00 2/2 0/0 0/0 .text setFaceBtp__9daMidna_cFUsi */
void daMidna_c::setFaceBtp(u16 i_index, BOOL i_isDemo) {
J3DAnmTexPattern* btp;
if (i_isDemo) {
btp = static_cast<J3DAnmTexPattern*>(mBtpHeap.loadDataDemoRID(i_index, 0));
} else {
btp = static_cast<J3DAnmTexPattern*>(mBtpHeap.loadDataIdx(i_index));
}
if (btp != NULL && mpModel != NULL) {
mpFaceBtp = btp;
mpFaceBtp->searchUpdateMaterialID(mpModel->getModelData());
mpModel->getModelData()->entryTexNoAnimator(mpFaceBtp);
field_0x84a = 0;
mpFaceBtp->setFrame(field_0x84a);
offStateFlg0(FLG0_UNK_40);
}
}
/* 804C0C6C-804C0D2C 004ACC 00C0+00 2/2 0/0 0/0 .text setFaceBtk__9daMidna_cFUsi */
void daMidna_c::setFaceBtk(u16 i_index, BOOL i_isDemo) {
J3DAnmTextureSRTKey* btk;
if (i_isDemo) {
btk = static_cast<J3DAnmTextureSRTKey*>(mBtkHeap.loadDataDemoRID(i_index, 0));
} else {
btk = static_cast<J3DAnmTextureSRTKey*>(mBtkHeap.loadDataIdx(i_index));
}
if (btk != NULL && mpModel != NULL) {
mpFaceBtk = btk;
mpFaceBtk->searchUpdateMaterialID(mpModel->getModelData());
mpModel->getModelData()->entryTexMtxAnimator(mpFaceBtk);
field_0x84a = 0;
mpFaceBtk->setFrame(field_0x84a);
offStateFlg0(FLG0_UNK_40);
}
}
/* 804C0D2C-804C0E18 004B8C 00EC+00 2/2 0/0 0/0 .text setLeftHandShape__9daMidna_cFUs */
void daMidna_c::setLeftHandShape(u16 i_idx) {
mLeftHandShapeIdx = i_idx;
if (mpLeftHandShape != NULL) {
mpLeftHandShape->hide();
}
mpShadowLeftHandShape->hide();
if (i_idx == 0xfe || i_idx == 0xfd) {
mpShadowLeftHandShape = mpShadowModel->getModelData()->getMaterialNodePointer(1)->getShape();
if (mpLeftHandShape != NULL) {
mpLeftHandShape = mpModel->getModelData()->getMaterialNodePointer(6)->getShape();
}
} else {
mpShadowLeftHandShape = mpShadowHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape();
if (mpLeftHandShape != NULL) {
mpLeftHandShape = mpHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape();
}
}
mpShadowLeftHandShape->show();
if (mpLeftHandShape != NULL) {
mpLeftHandShape->show();
}
}
/* 804C0E18-804C0F04 004C78 00EC+00 3/3 0/0 0/0 .text setRightHandShape__9daMidna_cFUs */
void daMidna_c::setRightHandShape(u16 i_idx) {
mRightHandShapeIdx = i_idx;
if (mpRightHandShape != NULL) {
mpRightHandShape->hide();
}
mpShadowRightHandShape->hide();
if (i_idx == 0xfe || i_idx == 0xfd) {
mpShadowRightHandShape = mpShadowModel->getModelData()->getMaterialNodePointer(2)->getShape();
if (mpRightHandShape != NULL) {
mpRightHandShape = mpModel->getModelData()->getMaterialNodePointer(7)->getShape();
}
} else {
mpShadowRightHandShape = mpShadowHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape();
if (mpRightHandShape != NULL) {
mpRightHandShape = mpHandsBmd->getModelData()->getMaterialNodePointer(i_idx)->getShape();
}
}
mpShadowRightHandShape->show();
if (mpRightHandShape != NULL) {
mpRightHandShape->show();
}
}
/* 804C0F04-804C0F24 004D64 0020+00 1/1 0/0 0/0 .text checkHairOnlyAnime__9daMidna_cCFi
*/
BOOL daMidna_c::checkHairOnlyAnime(int i_anm) const {
return i_anm >= ANM_HAIR && i_anm < ANM_MAX;
}
/* 804C0F24-804C103C 004D84 0118+00 2/2 0/0 0/0 .text setBckAnime__9daMidna_cFP15J3DAnmTransformif
*/
void daMidna_c::setBckAnime(J3DAnmTransform* i_bck, int i_attr, f32 i_morf) {
mpMorf->setAnm(i_bck, i_attr, i_morf, 1.0f, 0.0f, -1.0f);
void* bas;
if (!mBckHeap[0].checkNoSetArcNo()) {
bas = static_cast<mDoExt_transAnmBas*>(i_bck)->getBas();
if (bas == NULL) {
offStateFlg1(FLG1_UNK_800);
} else {
onStateFlg1(FLG1_UNK_800);
}
} else {
u8* buf = mBckHeap[0].getBuffer();
if (*(u32*)(buf + 0x1c) == 0xffffffff) {
offStateFlg1(FLG1_UNK_800);
bas = NULL;
} else {
onStateFlg1(FLG1_UNK_800);
bas = mBckHeap[0].getBuffer() + *(u32*)(buf + 0x1c);
}
}
if (bas != NULL) {
mSound.initAnime(bas, mpMorf->getPlaySpeed() >= 0.0f, mpMorf->getLoopFrame(), 0.0f);
}
}
/* 804C103C-804C287C 004E9C 1840+00 2/2 0/0 0/0 .text setAnm__9daMidna_cFv */
void daMidna_c::setAnm() {
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;
}
BOOL bVar2 = FALSE;
BOOL bVar3 = TRUE;
bool tired = checkMidnaTired();
daMidna_ANM anm;
if (link->checkMidnaWolfDeadAnime() && !checkStateFlg0(FLG0_TAG_WAIT)) {
if (tired) {
anm = ANM_CLINGD;
} else {
anm = ANM_WLDIEA;
}
offStateFlg0(FLG0_UNK_1000);
} else if (link->checkMidnaWolfSwimDeadAnime() && !checkStateFlg0(FLG0_TAG_WAIT)) {
if (tired) {
anm = ANM_CLINGD;
} else {
anm = ANM_WLSWIMDIE;
bVar2 = TRUE;
}
offStateFlg0(FLG0_UNK_1000);
} else if (link->checkMidnaGanonCatchAnm()) {
bVar2 = TRUE;
if (checkSetAnime(0, ANM_MGNCATCHED)
|| (mpMorf->isStop() && checkSetAnime(0, ANM_MGNCATCHST)))
{
anm = ANM_MGNCATCHED;
} else {
anm = ANM_MGNCATCHST;
}
} else if (link->checkMidnaGanonThrowLeftAnm()) {
if (checkSetAnime(0, ANM_MGNTHROWLED)
|| (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLST)))
{
bVar2 = TRUE;
anm = ANM_MGNTHROWLED;
if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWLED)) {
link->setEndGanonThrow();
}
} else {
anm = ANM_MGNTHROWLST;
}
} else if (link->checkMidnaGanonThrowRightAnm()) {
if (checkSetAnime(0, ANM_MGNTHROWRED)
|| (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRST)))
{
bVar2 = TRUE;
anm = ANM_MGNTHROWRED;
if (mpMorf->isStop() && checkSetAnime(0, ANM_MGNTHROWRED)) {
link->setEndGanonThrow();
}
} else {
anm = ANM_MGNTHROWRST;
}
} else if (mDemoMode == 9) {
anm = ANM_WARPIN;
offStateFlg0(FLG0_UNK_1000);
} else if (mDemoMode == 0x15) {
anm = ANM_GRABED;
offStateFlg0(FLG0_UNK_1000);
} else if (mDemoMode == 0xd || mDemoMode == 0xc) {
anm = ANM_LEADTOWAITA;
bVar2 = TRUE;
offStateFlg0(FLG0_UNK_1000);
} else if (mDemoMode == 0x11) {
anm = ANM_DOOROPC;
offStateFlg0(FLG0_UNK_1000);
} else if (mDemoMode == 0x12) {
anm = ANM_DOOROPD;
offStateFlg0(FLG0_UNK_1000);
} else if (mDemoMode == 8) {
anm = ANM_S_HOLE;
} else if (mDemoMode == 7 || mDemoMode == 6 || mDemoMode == 0x13
|| mDemoMode == 0x14 || mDemoMode == 0xe) {
anm = ANM_LEADWAIT;
bVar1 = TRUE;
offStateFlg0(FLG0_UNK_1);
} else if (mDemoMode == 5) {
if (field_0x8dc > 0.5f) {
anm = ANM_RETURN;
} else {
anm = ANM_S_RETURN;
}
} else if (mDemoMode == 0xf) {
anm = ANM_RETURN;
bVar2 = TRUE;
} else if ((checkShadowModelDrawSmode() && !checkStateFlg0(FLG0_WOLF_NO_POS))
|| mDemoMode == 6 || mDemoMode == 3 || mDemoMode == 0x10 || mDemoMode == 4)
{
if (field_0x84e == 4) {
anm = ANM_S_RETURN;
} else if (field_0x84e == 2) {
if (checkStateFlg0(FLG0_UNK_80000)) {
anm = ANM_S_APPEARBL;
} else {
anm = ANM_S_APPEAR;
}
} else {
if (checkEndResetStateFlg0(ERFLG0_UNK_1)) {
anm = ANM_S_MOVE;
} else {
anm = ANM_LEADWAIT;
}
}
offStateFlg0((daMidna_FLG0)(FLG0_UNK_1000 | FLG0_UNK_1));
bVar1 = TRUE;
bVar2 = TRUE;
} else if (checkStateFlg0(FLG0_UNK_1000)) {
bVar2 = TRUE;
anm = ANM_LEADTOWAITA;
if (mpMorf->isStop() && checkSetAnime(0, ANM_LEADTOWAITA)) {
offStateFlg0(FLG0_UNK_1000);
}
} else if (checkStateFlg0(FLG0_UNK_200)) {
if ((mpMorf->isStop() && checkSetAnime(0, ANM_LEADED)) || checkSetAnime(0, ANM_LEADSWAIT)
|| checkSetAnime(0, ANM_LEADWAIT)) {
anm = ANM_LEADWAIT;
offStateFlg0(FLG0_NO_INPUT);
} else {
anm = ANM_LEADED;
}
} else if (checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))) {
anm = ANM_LEADST;
} else if (mpKago != NULL) {
if (dComIfGp_evmng_checkStartDemo()) {
anm = ANM_CLING;
onStateFlg0(FLG0_UNK_4000000);
} else if (checkStateFlg0(FLG0_UNK_4000000)) {
if (mpMorf->isStop() || checkSetAnime(0, ANM_CLING)) {
anm = ANM_CLING;
} else {
anm = ANM_LEADTOWAITA;
}
} else {
anm = ANM_LEADTOWAITA;
onStateFlg0(FLG0_UNK_4000000);
}
} else {
bVar3 = FALSE;
offStateFlg0(FLG0_UNK_4000000);
if (!tired && mMotionNum >= 31 && mMotionNum < 40 && !checkStateFlg0(FLG0_NO_DRAW)) {
static daMidna_ANM const motionTable[9] = {
ANM_WAITA,
ANM_CLING,
ANM_CLINGB,
ANM_WAITB,
ANM_TALKA,
ANM_HIT,
ANM_LOOKABOUT,
ANM_SWAITA,
ANM_SWAITD,
};
anm = motionTable[mMotionNum - 31];
offStateFlg0(FLG0_UNK_1000);
} else if (link->checkMidnaWolfDashAnime() && !tired) {
if ((mpMorf->isStop() && checkSetAnime(0, ANM_CLINGST)) || checkSetAnime(0, ANM_CLING))
{
anm = ANM_CLING;
} else {
anm = ANM_CLINGST;
}
} else if ((link->checkMidnaDisappearMode() || (link->checkMidnaDigInAnime() && !tired))
&& checkMidnaRealBody()) {
anm = ANM_RETURN;
if (!checkSetAnime(0, ANM_RETURN)) {
offStateFlg0(FLG0_NO_DRAW);
}
bVar2 = TRUE;
} else if (dComIfGp_checkPlayerStatus1(0, 0x800000)) {
anm = ANM_WAITA;
offStateFlg0(FLG0_UNK_1);
} else if (tired) {
if (link->checkMidnaDigInAnime()) {
anm = ANM_DIGIN;
} else if (link->checkMidnaClingAnime() || link->checkMidnaLowClingAnime()) {
anm = ANM_CLINGD;
} else {
anm = ANM_WAITD;
}
} else if (link->checkMidnaLookAroundAnime()) {
if ((mpMorf->isStop() && checkSetAnime(0, ANM_ENTRANCE))
|| checkSetAnime(0, ANM_SWAITB))
{
anm = ANM_SWAITB;
bVar2 = TRUE;
} else {
anm = ANM_ENTRANCE;
}
} else if (link->checkMidnaRopeWaitStaggerAnime()) {
anm = ANM_ROPEWAIT;
} else if (link->checkMidnaRopeMoveStaggerAnime()) {
anm = ANM_ROPEFALTER;
} else if (link->checkMidnaClingAnime()) {
anm = ANM_CLING;
} else if (link->checkMidnaLowClingAnime()) {
anm = ANM_CLINGB;
} else if (link->checkMidnaPanicAnime() || checkEndResetStateFlg0(ERFLG0_FORCE_PANIC)) {
anm = ANM_PANIC;
offStateFlg0(FLG0_UNK_1);
} else if (!checkStateFlg0(FLG0_UNK_1) && checkSetAnime(0, ANM_SWAITB)
&& !mpMorf->isStop()) {
anm = ANM_SWAITB;
} else {
anm = ANM_WAITA;
}
}
if (anm != ANM_WAITA && anm != ANM_LEADWAIT && anm != ANM_PANIC) {
offStateFlg0(FLG0_UNK_1);
}
if (anm == ANM_WAITA || anm == ANM_WAITB || anm == ANM_TALKA) {
onStateFlg0(FLG0_UNK_4);
} else {
offStateFlg0(FLG0_UNK_4);
}
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)
|| ((anm != ANM_WAITA || dComIfGp_event_runCheck()) && anm != ANM_LEADWAIT))))
{
if (!mBckHeap[0].checkNoSetArcNo()) {
mBckHeap[0].resetArcNo();
mBckHeap[0].resetIdx();
mBckHeap[1].resetArcNo();
mBckHeap[1].resetIdx();
}
if (anm == ANM_S_APPEAR || anm == ANM_S_APPEARBL) {
mSound.startCreatureSound(Z2SE_MIDNA_APPEAR, 0, -1);
} else if (anm == ANM_S_RETURN || anm == ANM_RETURN) {
mSound.startCreatureSound(Z2SE_MIDNA_DISAPPEAR, 0, -1);
}
if (checkStateFlg0(FLG0_UNK_2)) {
offStateFlg0(FLG0_UNK_2);
}
f32 morf;
if (bVar2 || checkEndResetStateFlg0(ERFLG0_FORCE_MORF_CANCEL)) {
morf = 0.0f;
} else {
morf = 5.0f;
}
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
setBckAnime(bck, -1, morf);
offStateFlg0(FLG0_UNK_1);
if (checkStateFlg0(FLG0_UNK_2)) {
setUpperAnime(mBckHeap[0].getIdx(), 0xffff);
offStateFlg0(FLG0_UNK_2);
}
if (anm == ANM_WARPIN) {
if (daPy_py_c::checkNowWolf()) {
u32 sound_id;
if (checkStateFlg1(FLG1_SIDE_WARP)) {
sound_id = Z2SE_MDN_WARP_IN_YOKO;
} else {
sound_id = Z2SE_MDN_WARP_IN_TATE;
}
mSound.startCreatureSound(sound_id, 0, -1);
}
if (!checkStateFlg0(FLG0_PORTAL_OBJ_CALL)) {
cXyz pos;
mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_BACKBONE1), &pos);
f32 dist = pos.abs(current.pos);
f32 tmp = 19.0f * cM_scos(shape_angle.x);
current.pos.set(pos.x + tmp * cM_ssin(shape_angle.y),
pos.y - dist,
pos.z + tmp * cM_scos(shape_angle.y));
}
} 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 += 0x8000;
field_0x85a = shape_angle.y;
current.angle.y = shape_angle.y;
mpMorf->getOldTransInfo()[JNT_BACKBONE1].mTranslate.z += 90.0f;
mpMorf->getOldTransInfo()[JNT_WAIST].mTranslate.z += 90.0f;
Quaternion* quat_backbone_ptr = &mpMorf->getOldQuaternion()[JNT_BACKBONE1];
Quaternion quat1, quat2;
JMAEulerToQuat(0, 0x8000, 0, &quat1);
quat2 = *quat_backbone_ptr;
mDoMtx_QuatConcat(&quat1, &quat2, quat_backbone_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];
trans_backbone->mTranslate.x = trans_waist->mTranslate.x = 0.9f;
trans_backbone->mTranslate.y = trans_waist->mTranslate.y = 36.060127f;
trans_backbone->mTranslate.z = trans_waist->mTranslate.z = -14.515757f;
} else if (anm == ANM_LEADTOWAITA && mDemoMode != 0xd && mDemoMode != 0xc) {
if (link->checkMidnaRide()) {
link->onMidnaRideShock();
}
} else if (mDemoMode == 0xc) {
current.pos.y += 1000.0f;
}
setUpperAnimeAndSe(anm);
} else if (mMotionNum == 0
&& ((anm == ANM_WAITA && !dComIfGp_event_runCheck()) || anm == ANM_LEADWAIT))
{
if (dComIfGp_checkPlayerStatus1(0, 0x800000)) {
onStateFlg0(FLG0_UNK_2);
offStateFlg0(FLG0_UNK_1);
if (setUpperAnimeAndSe(ANM_WAITTP)) {
mUpperBck.setLoopFrame(15.0);
mpMorf->setMorf(5.0f);
offStateFlg0(FLG0_UNK_80);
if (mpModel != NULL) {
setFaceBtp(0x3F8, FALSE);
}
} else if (mUpperBck.checkFrame(9.0f)) {
setRightHandShape(2);
} else if (mUpperBck.checkFrame(12.0f)) {
setLeftHandShape(0);
}
} else if (mDemoMode == 0x14) {
if (setUpperAnimeAndSe(ANM_GRAB)) {
mpMorf->setMorf(5.0f);
}
} else if (checkStateFlg0(FLG0_UNK_2)) {
offStateFlg0(FLG0_UNK_2);
setUpperAnime(mBckHeap[0].getIdx(), 0xffff);
mpMorf->setMorf(5.0f);
} else if (checkStateFlg0(FLG0_UNK_1)) {
if (mUpperBck.isStop() || mUpperBck.checkFrame(0.0f)
|| mNeckAngle.x != 0 || mNeckAngle.y != 0 || bVar1
|| (checkSetAnime(0, ANM_SWAITC) && fabsf(speedF) > 0.1f))
{
offStateFlg0(FLG0_UNK_1);
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);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(m_anmDataTable[anm].mResID);
setBckAnime(bck, J3DFrameCtrl::EMode_NONE, 0.0f);
}
} else if (daPy_py_c::checkNowWolf() && !bVar1
&& ((mNeckAngle.y == 0 && mNeckAngle.x == 0 && anm != ANM_LEADWAIT && cM_rnd() < 0.01f)
|| (anm == ANM_LEADWAIT && !checkStateFlg0(FLG0_NO_HAIR_LEAD) && cM_rnd() < 0.0125f)))
{
onStateFlg0(FLG0_UNK_1);
if (anm == ANM_LEADWAIT) {
anm = ANM_LEADSWAIT;
} else {
f32 rnd;
if (fabsf(link->speedF) < 0.1f) {
rnd = cM_rndF(5.0f);
} else {
rnd = cM_rndF(4.0f);
}
if (rnd < 1.0f) {
anm = ANM_WAITB;
} else if (rnd < 2.0f) {
anm = ANM_SWAITB;
} else if (rnd < 3.0f) {
anm = ANM_SWAITD;
} else if (rnd < 4.0f) {
anm = ANM_LOOKABOUT;
} else {
anm = ANM_HIT;
}
}
res_id = m_anmDataTable[anm].mResID;
setUpperAnimeAndSe(anm);
bck = (J3DAnmTransform*)mBckHeap[0].loadDataIdx(res_id);
setBckAnime(bck, J3DFrameCtrl::EMode_NONE, 5.0f);
}
} else if (checkStateFlg0(FLG0_UNK_2)) {
offStateFlg0(FLG0_UNK_2);
setUpperAnime(mBckHeap[0].getIdx(), 0xffff);
mpMorf->setMorf(5.0f);
}
if (sVar4 != mBckHeap[1].getIdx()) {
if (checkSetAnime(1, ANM_CLINGB) || checkSetAnime(1, ANM_CLING)
|| checkSetAnime(1, ANM_GRAB) || checkSetAnime(1, ANM_GRABED)
|| checkSetAnime(1, ANM_WAITB))
{
setLeftHandShape(0);
setRightHandShape(2);
} else {
setLeftHandShape(0xFE);
setRightHandShape(0xFE);
}
}
if (checkSetAnime(1, ANM_SWAITD)) {
if (mUpperBck.checkFrame(110.0f)) {
setLeftHandShape(0xFE);
setRightHandShape(0xFE);
} else if (mUpperBck.checkFrame(15.0f)) {
setLeftHandShape(0);
setRightHandShape(2);
}
} else if (checkSetAnime(1, ANM_GRABED) && mUpperBck.checkFrame(53.0f)) {
setLeftHandShape(0xFE);
setRightHandShape(0xFE);
}
daMidna_ANM face_anm;
if (mDemoMode == 0x13) {
face_anm = ANM_GRABST;
} else if (mDemoMode == 0x14) {
face_anm = ANM_NONE;
} else if ((anm == ANM_LEADWAIT || anm == ANM_LEADSWAIT) && !checkStateFlg0(FLG0_NO_HAIR_LEAD)
&& checkStateFlg0(FLG0_UNK_200)) {
face_anm = ANM_HAIR;
} else if (mDemoMode == 6) {
face_anm = ANM_S_WAITS;
} else if (mDemoMode == 7) {
face_anm = ANM_S_TAKES;
} else if (mDemoMode == 0xe) {
face_anm = ANM_S_PACKAWAY;
} else if (bVar3 || mFaceNum == 100) {
face_anm = ANM_NONE;
} else if (mFaceNum == 0x1f) {
face_anm = ANM_FTALKA;
} else if (mFaceNum == 0x20) {
face_anm = ANM_FTALKB;
} else if (mFaceNum == 0x21) {
face_anm = ANM_FTALKC;
} else if (mFaceNum == 0x22) {
face_anm = ANM_FTALKC2;
} else {
face_anm = ANM_NONE;
}
if (checkHairOnlyAnime(face_anm)
|| (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)
&& (sVar4 != mBckHeap[1].getIdx() || face_anm != ANM_NONE
|| (face_anm == ANM_NONE && checkStateFlg0(FLG0_UNK_800000))))) {
if (face_anm == ANM_NONE) {
offStateFlg0(FLG0_UNK_800000);
mBckHeap[2].resetIdx();
field_0x87e = JNT_HEAD;
} else {
setFaceAnime(m_anmDataTable[face_anm].mResID, 0xffff);
if (checkHairOnlyAnime(face_anm)) {
field_0x87e = JNT_CHIN;
mFaceBckTimer = 20;
} else {
field_0x87e = JNT_HEAD;
}
}
} else {
offStateFlg0(FLG0_UNK_800000);
mBckHeap[2].resetIdx();
field_0x87e = JNT_HEAD;
}
if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)
&& (!checkStateFlg0(FLG0_UNK_1) || anm != ANM_WAITA)) {
if (!mBtpHeap.checkNoSetArcNo()) {
mBtpHeap.resetArcNo();
mBtpHeap.resetIdx();
}
u16 tex_id;
if (face_anm != ANM_NONE) {
tex_id = m_anmDataTable[face_anm].mTexID;
} else if (dComIfGp_checkPlayerStatus1(0, 0x800000)) {
tex_id = 0x10;
} else if (checkSetAnime(1, ANM_GRAB)) {
tex_id = 0x13;
} else {
tex_id = m_anmDataTable[anm].mTexID;
}
setFaceBtp(m_texDataTable[tex_id].mBtpID, FALSE);
if (!mBtkHeap.checkNoSetArcNo()) {
mBtkHeap.resetArcNo();
mBtkHeap.resetIdx();
}
setFaceBtk(m_texDataTable[tex_id].mBtkID, FALSE);
if (m_texDataTable[tex_id].mBtpID == 0x405) {
onStateFlg0(FLG0_UNK_40);
} else {
offStateFlg0(FLG0_UNK_40);
}
}
BOOL local_c0 = mDemoMode == 0x14 || (anm >= ANM_DOOROPC && anm < ANM_FTALKA);
if (checkStateFlg0(FLG0_UNK_2) || local_c0 || field_0x87e == JNT_CHIN) {
onStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000));
if (local_c0) {
onEndResetStateFlg0(ERFLG0_UNK_40);
}
} else if (anm == ANM_S_APPEAR || anm == ANM_S_APPEARBL || anm == ANM_RETURN
|| (anm == ANM_WARPIN && mpMorf->getFrame() > 2.0f) || anm == ANM_S_RETURN)
{
onStateFlg0(FLG0_NO_HAIR_SCALE);
}
}
/* 804C287C-804C2A68 0066DC 01EC+00 1/1 0/0 0/0 .text getNeckAimAngle__9daMidna_cFPC4cXyzPsPsPsPs
*/
s16 daMidna_c::getNeckAimAngle(cXyz const* i_atnPos, s16* o_neckX, s16* o_neckY, s16* o_eyeX,
s16* o_eyeY) {
cXyz eye_vec, atn_vec;
s16 offset_y = field_0x85a;
eye_vec = eyePos - mHeadCenterPos;
s16 eye_angle_x = eye_vec.atan2sY_XZ();
s16 eye_angle_y = eye_vec.atan2sX_Z();
s16 sVar1 = eye_angle_x - mNeckAngle.x;
s16 sVar2 = eye_angle_y - offset_y - mNeckAngle.y;
if (i_atnPos != NULL) {
atn_vec = *i_atnPos - mHeadCenterPos;
s16 atn_angle_x = atn_vec.atan2sY_XZ();
s16 atn_angle_y = atn_vec.atan2sX_Z() - offset_y;
if ((atn_angle_y > 0x7000 && mNeckAngle.y < 0) || (atn_angle_y < -0x7000 && mNeckAngle.y > 0)) {
atn_angle_y *= -1;
}
s16 sVar7 = cLib_minMaxLimit<s16>((s16)atn_angle_x, -10000, 8000);
s16 sVar8 = cLib_minMaxLimit<s16>((s16)atn_angle_y, -20000, 20000);
*o_eyeX = (s16)(sVar7 - sVar1) >> 1;
*o_eyeY = (s16)(sVar8 - sVar2) >> 1;
*o_neckX = *o_eyeX;
*o_neckY = *o_eyeY;
*o_eyeX += (s16)(atn_angle_x - sVar7);
*o_eyeY += (s16)(atn_angle_y - sVar8);
} else {
*o_neckX = daAlink_getAlinkActorClass()->getProcNeckX();
*o_neckY = daAlink_getAlinkActorClass()->getMidnaProcNeckY();
}
return sVar2;
}
/* 804C2A68-804C2AB8 0068C8 0050+00 2/2 0/0 0/0 .text clearEyeMove__9daMidna_cFv */
void daMidna_c::clearEyeMove() {
mpEyeMatAnm[0]->setNowOffsetX(0.0f);
mpEyeMatAnm[1]->setNowOffsetX(0.0f);
mpEyeMatAnm[0]->setNowOffsetY(0.0f);
mpEyeMatAnm[1]->setNowOffsetY(0.0f);
if (daMidna_matAnm_c::getEyeMoveFlg()) {
daMidna_matAnm_c::offEyeMoveFlg();
daMidna_matAnm_c::setMorfFrame(3);
}
}
/* 804C2AB8-804C2EBC 006918 0404+00 1/1 0/0 0/0 .text setEyeMove__9daMidna_cFPC4cXyzss */
void daMidna_c::setEyeMove(cXyz const* i_atnPos, s16 i_angleX, s16 i_angleY) {
daAlink_c* link = daAlink_getAlinkActorClass();
u8 timer = mEyeMoveTimer;
f32 move_x = mEyeMoveX;
f32 move_y = mEyeMoveY;
mEyeMoveTimer = cM_rndF(30.0f) + 75.0f;
mEyeMoveX = 0.0f;
mEyeMoveY = 0.0f;
f32 tmp_y, tmp_x;
if (i_atnPos != NULL) {
tmp_y = i_angleX * (1.0f / 0x2000);
tmp_x = i_angleY * (1.0f / 0x2000);
} else if (link->getEyeMoveRateY() != 0.0f || link->getMidnaEyeMoveRateX() != 0.0f) {
tmp_y = link->getEyeMoveRateY();
tmp_x = link->getMidnaEyeMoveRateX();
} else if (!dComIfGp_event_runCheck() && checkStateFlg0(FLG0_UNK_40)
&& !dComIfGp_checkPlayerStatus1(0, 0x800000) && fabsf(speedF) < 0.01f)
{
if (timer != 0) {
mEyeMoveTimer = timer - 1;
mEyeMoveX = move_x;
mEyeMoveY = move_y;
} else if (move_x != 0 || move_y != 0) {
if (cM_rnd() < 0.5f) {
mEyeMoveX = 0.0f;
mEyeMoveY = 0.0f;
} else {
s16 angle = cM_atan2s(mEyeMoveX, mEyeMoveY);
s16 angle2 = angle + (s16)((int)cM_rndF(3.0f) * 0x2000 + 0x6000);
mEyeMoveX = cM_ssin(angle2);
mEyeMoveY = cM_scos(angle2);
}
} else {
s16 angle = (s16)cM_rndF(8.0f) * 0x2000;
mEyeMoveX = cM_ssin(angle);
mEyeMoveY = cM_scos(angle);
}
tmp_x = mEyeMoveX;
tmp_y = mEyeMoveY;
} else {
clearEyeMove();
return;
}
if (daMidna_matAnm_c::getMorfFrame() == 0) {
if (tmp_x > 1.0f) {
tmp_x = 1.0f;
} else if (tmp_x < -1.0f) {
tmp_x = -1.0f;
}
if (tmp_y > 1.0f) {
tmp_y = 1.0f;
} else if (tmp_y < -1.0f) {
tmp_y = -1.0f;
}
f32 target_lx, target_rx, target_ly, target_ry;
if (tmp_x > 0.0f) {
target_lx = tmp_x * -0.2f;
target_rx = tmp_x * 0.2f;
} else {
target_lx = tmp_x * -0.2f;
target_rx = tmp_x * 0.2f;
}
if (tmp_y > 0.0f) {
target_ly = tmp_y * 0.2f;
} else {
target_ly = tmp_y * 0.2f;
}
target_ry = target_ly;
f32 fVar7 = JMAFastSqrt(tmp_x * tmp_x + tmp_y * tmp_y);
if (fVar7 > 1.0f) {
if (tmp_x * tmp_y < 0.0f) {
target_rx *= fabsf(tmp_x) / fVar7;
target_ry *= fabsf(tmp_y) / fVar7;
} else {
target_lx *= fabsf(tmp_x) / fVar7;
target_ly *= fabsf(tmp_y) / fVar7;
}
}
daMidna_matAnm_c::onEyeMoveFlg();
cLib_addCalc(mpEyeMatAnm[0]->getNowOffsetXP(), target_lx, 0.5f, 0.1f, 0.03f);
cLib_addCalc(mpEyeMatAnm[1]->getNowOffsetXP(), target_rx, 0.5f, 0.1f, 0.03f);
cLib_addCalc(mpEyeMatAnm[0]->getNowOffsetYP(), target_ly, 0.5f, 0.1f, 0.03f);
cLib_addCalc(mpEyeMatAnm[1]->getNowOffsetYP(), target_ry, 0.5f, 0.1f, 0.03f);
}
}
/* 804C2EBC-804C3168 006D1C 02AC+00 1/1 0/0 0/0 .text setNeckAngle__9daMidna_cFv */
void daMidna_c::setNeckAngle() {
daAlink_c* link = daAlink_getAlinkActorClass();
BOOL clear_eye_move = mBtkHeap.getIdx() != 0x3A4 && !mBtkHeap.checkNoSetIdx()
&& mBtkHeap.getIdx() != 0x399;
s16 neck_x = 0;
s16 neck_y = 0;
s16 eye_x = 0;
s16 eye_y = 0;
cXyz* pos;
if (field_0x84e == 2 || checkMidnaTired() || checkSetAnime(0, ANM_CLINGB)
|| (checkStateFlg0((daMidna_FLG0)(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000))
&& !checkEndResetStateFlg0(ERFLG0_UNK_100))
|| (clear_eye_move && !checkStateFlg0(FLG0_NO_DRAW))
|| (!checkStateFlg0(FLG0_UNK_1) && checkSetAnime(0, ANM_SWAITB)))
{
pos = NULL;
offStateFlg0(FLG0_FORCE_NECK_AIM);
} else if (checkStateFlg0(FLG0_FORCE_NECK_AIM)) {
pos = &mForceNeckAimPos;
offStateFlg0(FLG0_FORCE_NECK_AIM);
} else if (checkEndResetStateFlg0(ERFLG0_UNK_100)) {
pos = &link->eyePos;
} else if (checkShadowModelDrawSmode() && mDemoMode != 4 && mDemoMode != 7 && mDemoMode != 8
&& mDemoMode != 0x10 && mDemoMode != 3 && !checkStateFlg0(FLG0_WOLF_NO_POS)) {
pos = &link->eyePos;
} else if (link->checkMidnaAtnPos() && !checkSetAnime(0, ANM_LEADST)
&& !checkSetAnime(0, ANM_LEADED)) {
if (checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))) {
pos = &link->eyePos;
} else {
pos = link->getMidnaAtnPos();
}
} else {
pos = NULL;
}
getNeckAimAngle(pos, &neck_x, &neck_y, &eye_x, &eye_y);
daPy_addCalcShort(&mNeckAngle.x, neck_x, 3, 0x1000, 0x100);
daPy_addCalcShort(&mNeckAngle.y, neck_y, 3, 0x1000, 0x100);
if (clear_eye_move) {
clearEyeMove();
} else {
setEyeMove(pos, eye_x, eye_y);
}
}
/* 804C3168-804C3298 006FC8 0130+00 1/1 0/0 0/0 .text initHairAngle__9daMidna_cFv */
void daMidna_c::initHairAngle() {
static Vec const localOffset = {0.0f, 136.0f, -2.4f};
MTXMultVec(mpShadowModel->getBaseTRMtx(), &localOffset, &mHairPos[0]);
mHairDir[0] = cXyz::Zero;
mHairAngleZ[0] = 0;
mHairAngleY[0] = 0;
mHairScale[0] = l_hairScale[0];
for (int i = 1; i < 5; i++) {
mHairPos[i] = mHairPos[i - 1];
mHairPos[i].y -= 28.0f;
mHairDir[i] = cXyz::Zero;
mHairAngleZ[i] = 0;
mHairAngleY[i] = 0;
mHairScale[i] = l_hairScale[i];
}
onStateFlg0(FLG0_UNK_8);
}
/* 804C3298-804C3F04 0070F8 0C6C+00 2/2 0/0 0/0 .text setHairAngle__9daMidna_cFv */
void daMidna_c::setHairAngle() {
if (!checkStateFlg0(FLG0_UNK_8)) {
initHairAngle();
return;
}
cXyz prev_pos, head_dir;
mDoMtx_multVecSR(mpShadowModel->getAnmMtx(JNT_HEAD), &cXyz::BaseX, &head_dir);
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;
cXyz* dir = mHairDir;
cXyz* scale = mHairScale;
s16* angle_z = mHairAngleZ;
s16* angle_y = mHairAngleY;
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 target_angle_z, iVar16;
iVar16 = field_0x872;
BOOL bVar4 = false;
field_0x872 += fVar2 * 0x1000 + 0x800;
cXyz* atn_pos = NULL;
daAlink_c* link = daAlink_getAlinkActorClass();
if (link->checkMidnaHairAtnPos() && !checkMidnaTired() && !checkStateFlg0((daMidna_FLG0)
(FLG0_NO_HAIR_SCALE | FLG0_UNK_200000 | FLG0_TAG_WAIT | FLG0_UNK_100))) {
atn_pos = link->getMidnaHairAtnPos();
onStateFlg0(FLG0_UNK_10000000);
} else {
offStateFlg0(FLG0_UNK_10000000);
}
for (i = 0; i < 5; i++, pos++, dir++, angle_z++, angle_y++, scale++) {
if (checkStateFlg0(FLG0_UNK_10000000)) {
cLib_chasePos(scale, l_hairScale[4], 0.1f);
} else {
cLib_chasePos(scale, l_hairScale[i], 0.1f);
}
old_pos = *pos;
if (checkStateFlg0(FLG0_UNK_200000)) {
if (i == 4) {
mDoMtx_multVec(mpShadowModel->getAnmMtx(JNT_HAIR_5), &cXyz::BaseX, pos);
} else {
mDoMtx_multVecZero(mpShadowModel->getAnmMtx(JNT_HAIR_2 + i), pos);
}
old_pos = *pos;
vec = *pos - prev_pos;
*angle_z = cM_atan2s(-vec.y, -vec.z);
*angle_y = cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z));
prev_pos = *pos;
} else if (atn_pos != NULL) {
vec = *atn_pos - prev_pos;
mDoMtx_stack_c::YrotS(-shape_angle.y);
mDoMtx_stack_c::multVec(&vec, &vec);
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;
}
if (bVar4) {
if (vec.y < 1.0f && i < 4) {
vec.y = 1.0f;
}
target_angle_z = fVar1 * cM_atan2s(-vec.y, -vec.z) - (1.0f - fVar1) * 0x4000;
} else {
target_angle_z = fVar1 * (cM_atan2s(-vec.y, -vec.z) - 0x10000) - (1.0f - fVar1) * 0x4000;
}
cLib_addCalcAngleS(angle_z, target_angle_z, 5, 0x1800, 0x100);
cLib_addCalcAngleS(angle_y, target_angle_y, 5, 0x1800, 0x100);
fVar1 += 0.3f;
if (fVar1 > 1.0f) {
fVar1 = 1.0f;
}
} else {
vec = *pos - prev_pos + *dir;
vec += daAlink_getAlinkActorClass()->getWindSpeed();
if (checkEndResetStateFlg0(ERFLG0_UNK_20)) {
vec = cXyz::Zero;
}
vec.y -= 2.0f;
vec.y += fVar2 * (cM_rndFX(3.0f) + 3.0f) * cM_ssin(iVar16);
mDoMtx_stack_c::YrotS(-head_angle);
mDoMtx_stack_c::multVec(&vec, &vec);
if (vec.abs() < 1.0f) {
if (i == 0) {
cLib_addCalcAngleS(angle_z, 0, 5, 0x1800, 0x100);
cLib_addCalcAngleS(angle_y, 0, 5, 0x1800, 0x100);
} else {
cLib_addCalcAngleS(angle_z, 0, 5, 0x1800, 0x100);
cLib_addCalcAngleS(angle_y, 0, 5, 0x1800, 0x100);
}
} else {
if (i == 0) {
if (vec.z > 0.0f) {
vec.z *= -1.0f;
}
f32 fVar21 = vec.absXZ();
if (fVar21 < vec.y * -1.732f) {
if (fVar21 < 1.0f) {
vec.x = 0.0f;
vec.z = -1.0f;
vec.y = -0.577367f;
} else {
if (fabsf(speedF) < 0.1f) {
vec.x *= 0.5f;
fVar21 = vec.absXZ();
}
vec.y = fVar21 * -0.577367f;
}
bVar5 = true;
}
}
*angle_y = cM_atan2s(vec.x, JMAFastSqrt(vec.y * vec.y + vec.z * vec.z));
if (i == 4) {
*angle_z = cM_atan2s(-vec.y, -vec.z);
} else {
*angle_z = 0;
}
}
iVar16 -= (fVar2 * 0x1000 + 0x800);
}
static Vec const hairOffset = {0.0f, 0.0f, 28.0f};
if (!checkStateFlg0(FLG0_UNK_200000)) {
mDoMtx_stack_c::transS(prev_pos);
mDoMtx_stack_c::YrotM(inv_head_angle);
mDoMtx_stack_c::XrotM(*angle_z);
mDoMtx_stack_c::YrotM(-*angle_y);
mDoMtx_stack_c::scaleM(*scale);
mDoMtx_stack_c::multVec(&hairOffset, pos);
}
if (checkEndResetStateFlg0(ERFLG0_UNK_20)) {
*dir = cXyz::Zero;
} else {
*dir = (*pos - old_pos) * fVar4;
if (bVar5) {
*dir *= 0.5f;
}
}
prev_pos = *pos;
fVar4 -= 0.1f;
}
}
/* 804C3F04-804C4394 007D64 0490+00 1/1 0/0 0/0 .text setDemoData__9daMidna_cFv */
void daMidna_c::setDemoData() {
if (!dComIfGp_event_runCheck()) {
mStaffID = -1;
} else {
mStaffID = dComIfGp_evmng_getMyStaffId("Midna", this, 0);
}
if (dComIfGp_getEvent().isOrderOK()) {
if (mDemoType != 0) {
mDemoType = 0;
mDemoMode = 0;
field_0x8dc = 0.0f;
endHighModel();
if (mLeftHandShapeIdx == 0xfd) {
mLeftHandShapeIdx = 0xfe;
}
if (mRightHandShapeIdx == 0xfd) {
mRightHandShapeIdx = 0xfe;
}
offStateFlg1((daMidna_FLG1)(FLG1_SHADOW_NO_DRAW | FLG1_NO_MASK_DRAW | FLG1_UNK_40
| FLG1_UNK_20 | FLG1_UNK_10 | FLG1_FORCE_NORMAL_COL
| FLG1_FORCE_TIRED_COL | FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE
| FLG1_UNK_1));
}
offStateFlg0((daMidna_FLG0)(FLG0_UNK_2000000 | FLG0_UNK_1000000));
if (mpDemoFCBlendBrk != NULL) {
if (mpDemoFCBlendBmd != NULL) {
mpDemoFCBlendBmd->getModelData()->removeTevRegAnimator(mpDemoFCBlendBrk);
}
mpDemoFCBlendBrk = NULL;
}
field_0x668 = NULL;
} else {
dDemo_actor_c* demo_actor = dDemo_c::getActor(demoActorID);
if (demo_actor != NULL) {
demo_actor->setModel(mpShadowModel);
if (mDemoType != 1) {
mDemoType = 1;
onStateFlg0(FLG0_WOLF_NO_POS);
}
if (demo_actor->checkEnable(0x20)) {
mDemoMode = demo_actor->getAnmId();
}
if (demo_actor->checkEnable(2)) {
current.pos = demo_actor->getTrans();
}
if (demo_actor->checkEnable(8)) {
shape_angle.x = 0;
shape_angle.y = demo_actor->getRatate().y;
shape_angle.z = 0;
}
} else if (mStaffID != -1) {
if (mDemoType != 2) {
mDemoType = 2;
}
char* cut_name = dComIfGp_getPEvtManager()->getMyNowCutName(mStaffID);
if (cut_name != NULL) {
mDemoMode = (cut_name[0] - 0x30) * 10 + (cut_name[1] - 0x30);
cXyz* pos = dComIfGp_evmng_getMyXyzP(mStaffID, "pos");
if (pos != NULL) {
mDemoPos = *pos;
} else {
mDemoPos = current.pos;
}
f32* speed = dComIfGp_evmng_getMyFloatP(mStaffID, "speed");
if (speed != NULL) {
mDemoSpeed = *speed;
} else {
mDemoSpeed = 5.0f;
}
int* angle = dComIfGp_evmng_getMyIntegerP(mStaffID, "angle");
if (angle != NULL) {
mDemoAngle = *angle;
} else {
mDemoAngle = shape_angle.y;
}
cXyz* npos = dComIfGp_evmng_getMyXyzP(mStaffID, "npos");
if (npos != NULL) {
setForceNeckAimPos(*npos);
}
f32* fprm0 = dComIfGp_evmng_getMyFloatP(mStaffID, "fprm0");
if (fprm0 != NULL) {
field_0x8dc = *fprm0;
} else {
field_0x8dc = 0.0f;
}
} else {
mDemoMode = 1;
}
if (!checkMidnaRealBody() && !checkShadowModelDrawSmode()
&& (mDemoMode == 9 || mDemoMode == 0xb || mDemoMode == 0xd || mDemoMode == 0xc))
{
mDemoMode = 1;
} else if (mDemoMode == 0xd) {
offStateFlg0(FLG0_WOLF_NO_POS);
}
if ((mDemoMode == 1 || mDemoMode == 0xb || (mDemoMode == 2 && field_0x84e == 3))) {
dComIfGp_evmng_cutEnd(mStaffID);
if (mDemoMode == 1) {
offStateFlg0(FLG0_WOLF_NO_POS);
}
}
}
}
}
/* 804C4394-804C4444 0081F4 00B0+00 1/1 0/0 0/0 .text setSimpleBrk__9daMidna_cFP12J3DModelDataUs
*/
J3DAnmTevRegKey* daMidna_c::setSimpleBrk(J3DModelData* i_modelData, u16 i_idx) {
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_arcName, i_idx));
if (brk == NULL) {
return NULL;
}
brk->searchUpdateMaterialID(i_modelData);
i_modelData->entryTevRegAnimator(brk);
brk->setFrame(brk->getFrameMax() - 0.001f);
return brk;
}
/* 804C4444-804C44CC 0082A4 0088+00 1/1 0/0 0/0 .text setSimpleBtk__9daMidna_cFP12J3DModelDataUs
*/
J3DAnmTextureSRTKey* daMidna_c::setSimpleBtk(J3DModelData* i_modelData, u16 i_idx) {
J3DAnmTextureSRTKey* btk =
static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcName, i_idx));
if (btk == NULL) {
return NULL;
}
btk->searchUpdateMaterialID(i_modelData);
i_modelData->entryTexMtxAnimator(btk);
btk->setFrame(0.0f);
return btk;
}
/* 804C44CC-804C4750 00832C 0284+00 1/1 0/0 0/0 .text initMidnaModel__9daMidna_cFv */
void daMidna_c::initMidnaModel() {
daAlink_c* link = daAlink_getAlinkActorClass();
if (checkStateFlg1(FLG1_UNK_1)) {
if (mpDemoBDTmpBmd != NULL && mpModel != mpDemoBDTmpBmd) {
mpModel = mpDemoBDTmpBmd;
mpMaskBmd = mpDemoBDMaskBmd;
mpHandsBmd = mpDemoBDHandsBmd;
mpHairhandBmd = mpDemoBDHairhandBmd;
if (mpLeftHandShape != NULL) {
mpLeftHandShape->hide();
}
mpLeftHandShape = mpModel->getModelData()->getMaterialNodePointer(6)->getShape();
if (mpRightHandShape != NULL) {
mpRightHandShape->hide();
}
mpRightHandShape = mpModel->getModelData()->getMaterialNodePointer(7)->getShape();
mBtpHeap.initData();
mBtkHeap.initData();
}
} else {
if (mpDemoBDTmpBmd != NULL && mpModel == mpDemoBDTmpBmd) {
if (mpLeftHandShape != NULL) {
mpLeftHandShape->hide();
}
if (mpRightHandShape != NULL) {
mpRightHandShape->hide();
}
mpModel = NULL;
mpMaskBmd = NULL;
mpHandsBmd = NULL;
mpHairhandBmd = NULL;
mpLeftHandShape = NULL;
mpRightHandShape = NULL;
mBtpHeap.initData();
mBtkHeap.initData();
}
J3DModel* midna_model = link->getMidnaModel();
if (mpModel != NULL) {
if (midna_model == NULL && !checkStateFlg1(FLG1_UNK_1)) {
mpModel = NULL;
mpMaskBmd = NULL;
mpHandsBmd = NULL;
mpHairhandBmd = NULL;
mpLeftHandShape = NULL;
mpRightHandShape = NULL;
}
} else if (midna_model != NULL) {
mpModel = midna_model;
mpMaskBmd = link->getMidnaMaskModel();
mpHandsBmd = link->getMidnaHandModel();
mpHairhandBmd = link->getMidnaHairHandModel();
J3DModelData* model_data = mpModel->getModelData();
mpLeftHandShape = model_data->getMaterialNodePointer(6)->getShape();
mpRightHandShape = model_data->getMaterialNodePointer(7)->getShape();
model_data->getMaterialNodePointer(2)->setMaterialAnm(mpEyeMatAnm[0]);
model_data->getMaterialNodePointer(3)->setMaterialAnm(mpEyeMatAnm[1]);
mpEyeMatAnm[0]->init();
mpEyeMatAnm[1]->init();
J3DModelData* hand_model_data = mpHandsBmd->getModelData();
for (u16 i = 0; i < 4; i++) {
hand_model_data->getMaterialNodePointer(i)->getShape()->hide();
}
mBtpHeap.initData();
mBtkHeap.initData();
}
}
}
/* 804C4750-804C49B8 0085B0 0268+00 2/2 0/0 0/0 .text daMidna_searchNpc__FP10fopAc_ac_cPv
*/
static void* daMidna_searchNpc(fopAc_ac_c* i_actor, void* o_far) {
daAlink_c* link = daAlink_getAlinkActorClass();
cXyz link_pos = link->current.pos;
link_pos.y += 100.0f;
if (fopAcM_GetGroup(i_actor) == fopAc_NPC_e && !fopAcM_CheckStatus(i_actor, 0x8000000)
&& fabsf(link_pos.y - i_actor->eyePos.y) <= 700.0f)
{
f32 dist = i_actor->eyePos.absXZ(link_pos);
if (dist <= link->getMetamorphoseNearDis()) {
*(BOOL*)o_far = FALSE;
} else {
if (dist <= link->getMetamorphoseFarDis()
&& fopAcM_seenPlayerAngleY(i_actor) <= link->getMetamorphoseFarAngle())
{
*(BOOL*)o_far = TRUE;
} else {
return NULL;
}
}
if (!fopAcM_lc_c::lineCheck(&i_actor->eyePos, &link_pos, i_actor)) {
return i_actor;
}
}
return NULL;
}
/* 804C49B8-804C4AE8 008818 0130+00 2/2 0/0 0/0 .text setMidnaNoDrawFlg__9daMidna_cFv */
void daMidna_c::setMidnaNoDrawFlg() {
if ((!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1))
&& (!checkAppear() || !checkMidnaRealBody())) || daAlink_c::checkCloudSea())
{
onStateFlg0(FLG0_NO_DRAW);
} else if (!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1))
&& daAlink_getAlinkActorClass()->checkPlayerNoDraw()
&& !checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100)))
{
onStateFlg0((daMidna_FLG0)(FLG0_UNK_10000 | FLG0_NO_DRAW));
} else {
if (checkStateFlg0(FLG0_NO_DRAW)
&& !checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1))
&& !checkStateFlg0(FLG0_UNK_10000))
{
onStateFlg0(FLG0_UNK_1000);
}
offStateFlg0((daMidna_FLG0)(FLG0_UNK_10000 | FLG0_NO_DRAW));
}
}
/* 804C4AE8-804C4B68 008948 0080+00 1/0 0/0 0/0 .text checkMetamorphoseEnableBase__9daMidna_cFv */
BOOL daMidna_c::checkMetamorphoseEnableBase() {
BOOL tmp;
if (!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80)
/* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */
|| !dComIfGs_isEventBit(0xD04)
|| fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp))
{
return FALSE;
}
return TRUE;
}
/* 804C4B68-804C4BC0 0089C8 0058+00 1/1 0/0 0/0 .text checkNoDrawState__9daMidna_cFv */
BOOL daMidna_c::checkNoDrawState() {
return mDemoMode == 0xb || checkStateFlg0(FLG0_UNK_400000) || checkStateFlg1(FLG1_UNK_20)
|| (checkStateFlg0(FLG0_NO_DRAW) && !checkShadowModelDrawSmode());
}
/* 804C4BC0-804C4FDC 008A20 041C+00 1/1 0/0 0/0 .text setSound__9daMidna_cFv */
void daMidna_c::setSound() {
static u32 const anmSoundLabel[4][2] = {
Z2SE_MDN_HIP, Z2SE_MDN_HIP_WTR,
Z2SE_MDN_HAND, Z2SE_MDN_HAND_WTR,
Z2SE_MDN_LEG, Z2SE_MDN_LEG_WTR,
Z2SE_MDN_LAND, Z2SE_MDN_LAND_WTR,
};
int idx = 4;
if (mDemoMode == 0xb || checkStateFlg1(FLG1_UNK_20)
|| (checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg0(FLG0_UNK_10000)
&& !checkShadowModelDrawSmode()))
{
return;
}
if (mUpperBck.checkFrame(mVoiceFrame)) {
mSound.startCreatureVoice(mSoundID, -1);
}
if (checkSetAnime(1, ANM_SWAITB)) {
if (mUpperBck.checkFrame(83.0f)) {
mSound.startCreatureVoice(Z2SE_MDN_V_SWAITB_3, -1);
} else if (mUpperBck.checkFrame(24.0f) || mUpperBck.checkFrame(99.0f)) {
idx = 0;
}
} else if (checkSetAnime(1, ANM_ROPEWAIT)) {
if (mUpperBck.checkFrame(66.0f)) {
mSound.startCreatureVoice(Z2SE_MDN_V_ROPEWAIT_2, -1);
}
} else if (checkSetAnime(1, ANM_CLINGST)) {
if (mUpperBck.checkFrame(11.0f)) {
idx = 0;
}
} else if (checkSetAnime(1, ANM_LEADTOWAITA)) {
if (mUpperBck.checkFrame(2.0f)) {
idx = 0;
}
} else if (checkSetAnime(1, ANM_HIT)) {
if (mUpperBck.checkFrame(10.0f) || mUpperBck.checkFrame(11.0f)) {
idx = 1;
} else if (mUpperBck.checkFrame(28.0f) || mUpperBck.checkFrame(35.0f)) {
idx = 2;
}
} else if (checkSetAnime(1, ANM_SWAITC)) {
if (mUpperBck.checkFrame(2.0f)) {
idx = 3;
} else if (mUpperBck.checkFrame(67.0f)) {
idx = 0;
}
} else if (checkSetAnime(1, ANM_DIGIN)) {
if (mUpperBck.checkFrame(19.0f) || mUpperBck.checkFrame(24.0f)
|| mUpperBck.checkFrame(34.0f)) {
idx = 1;
}
} else if (checkSetAnime(1, ANM_WAITTP)) {
if (mUpperBck.checkFrame(9.0f) || mUpperBck.checkFrame(12.0f)) {
idx = 1;
}
}
if (idx != 4) {
u32 sound_id = anmSoundLabel[idx][dComIfGp_checkPlayerStatus0(0, 0x100000) ? 1 : 0];
mSound.startCreatureSound(sound_id, 0, -1);
}
if (checkStateFlg1(FLG1_UNK_800)) {
mSound.updateAnime(mpMorf->getFrame(), mpMorf->getPlaySpeed());
}
if (checkMidnaTired() && !dComIfGp_checkPlayerStatus0(0, 0x20000000)) {
mSound.startCreatureVoiceLevel(Z2SE_MDN_V_WAITD, -1);
}
}
/* 804C4FDC-804C59E8 008E3C 0A0C+00 1/1 0/0 0/0 .text execute__9daMidna_cFv */
int daMidna_c::execute() {
daAlink_c* link = daAlink_getAlinkActorClass();
if (!link->checkMetamorphose()) {
if (daPy_py_c::checkNowWolf()) {
onStateFlg0(FLG0_UNK_40000000);
} else {
offStateFlg0(FLG0_UNK_40000000);
}
}
initMidnaModel();
field_0x85a = shape_angle.y;
setDemoData();
offStateFlg0(FLG0_NO_INPUT);
if (checkStateFlg0(FLG0_TAG_WAIT) && (link->checkMidnaUseAbility()
|| checkSetAnime(0, ANM_LEADTOWAITA)
|| eventInfo.checkCommandTalk())) {
offStateFlg0((daMidna_FLG0)(FLG0_PORTAL_OBJ_CALL | FLG0_TAG_WAIT | FLG0_UNK_200));
}
daMidna_matAnm_c::decMorfFrame();
checkMidnaPosState();
if (daPy_py_c::checkFirstMidnaDemo() && !checkStateFlg0(FLG0_WOLF_NO_POS)) {
link->onMidnaRide();
} else {
link->offMidnaRide();
}
setMidnaNoDrawFlg();
fopAc_ac_c* talk_partner = fopAcM_getTalkEventPartner(link);
if (checkStateFlg0(FLG0_NO_DRAW)
&& (eventInfo.checkCommandTalk()
|| checkStateFlg0(FLG0_WOLF_NO_POS)
|| mDemoMode == 2
|| (dComIfGp_event_runCheck()
&& talk_partner != NULL
&& (checkStateFlg0(FLG0_UNK_2000000)
|| fopAcM_GetName(talk_partner) == PROC_Tag_Mhint
|| fopAcM_GetName(talk_partner) == PROC_Tag_Mstop
|| fopAcM_GetName(talk_partner) == PROC_Tag_Mwait)))) {
if (mDemoMode == 3 || mDemoMode == 0x10 || mDemoMode == 4 || mDemoMode == 6 ||
mDemoMode == 7 || mDemoMode == 0xe || mDemoMode == 0x13 || mDemoMode == 8)
{
field_0x84e = 3;
} else if (field_0x84e == 0) {
if (checkStateFlg0(FLG0_WOLF_NO_POS)) {
field_0x84e = 3;
} else {
field_0x84e = 1;
if (link->initShadowScaleLight()) {
onStateFlg0(FLG0_UNK_80000);
} else {
offStateFlg0(FLG0_UNK_80000);
}
}
} else if (field_0x84e == 1) {
if (link->moveShadowScaleLight()) {
field_0x84e = 2;
}
} else if (field_0x84e == 2) {
link->moveShadowScaleLight();
if (mpMorf->isStop()) {
field_0x84e = 3;
}
} else if (field_0x84e == 3 && checkStateFlg0(FLG0_UNK_1000000)) {
offStateFlg0(FLG0_UNK_1000000);
field_0x84e = 4;
} else if (field_0x84e == 4) {
if (mpMorf->isStop()) {
field_0x84e = 5;
}
} else if (field_0x84e == 5 && checkStateFlg0(FLG0_WOLF_NO_POS)) {
field_0x84e = 3;
}
} else {
field_0x84e = 0;
}
if (checkSetAnime(0, ANM_LEADTOWAITA) && mpMorf->checkFrame(2.0f) && daPy_py_c::checkNowWolf()
&& mpKago == NULL) {
dComIfGp_getVibration().StartShock(2, 0x1f, cXyz(0.0f, 1.0f, 0.0f));
}
allAnimePlay();
setAnm();
setHairAngle();
setMatrix();
mpMorf->modelCalc();
setRoomInfo();
setNeckAngle();
if (checkEndResetStateFlg0(ERFLG0_UNK_20)) {
setHairAngle();
}
setBodyPartMatrix();
setBodyPartPos();
mSound.framework(0, mReverb);
if (eventInfo.checkCommandTalk()) {
if (!checkShadowModeTalkWait() || fopAcM_getTalkEventPartner(link) == this) {
if (!checkStateFlg0(FLG0_UNK_8000)) {
offStateFlg0((daMidna_FLG0)(FLG0_NPC_NEAR | FLG0_NPC_FAR));
BOOL far;
if (fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &far)) {
if (!far) {
onStateFlg0(FLG0_NPC_NEAR);
} else {
onStateFlg0(FLG0_NPC_FAR);
}
}
onStateFlg0(FLG0_UNK_8000);
mMsgFlow.init(this, 0xbb9, 0, NULL);
} else if (mMsgFlow.doFlow(this, NULL, 0)) {
int item_id;
u16 event_id = mMsgFlow.getEventId(&item_id);
if (checkStateFlg0(FLG0_NO_DRAW)) {
if (field_0x84e == 3) {
field_0x84e = 4;
} else {
onStateFlg0(FLG0_UNK_1000000);
}
}
if (event_id == 4 || event_id == 5) {
dComIfGp_getEvent().reset(this);
offStateFlg0(FLG0_UNK_8000);
fopAcM_orderPotentialEvent(this, 0x400, 0xffff, 1);
link->changeOriginalDemo();
if (event_id == 4) {
link->changeDemoMode(0x3a, 0, 0, 0);
if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)) {
changeOriginalDemo();
changeDemoMode(0xf);
}
} else {
link->changeDemoMode(0x39, 0, 0, 0);
}
if (checkStateFlg0(FLG0_NO_DRAW)) {
onStateFlg0(FLG0_UNK_2000000);
}
} else if (!checkStateFlg0(FLG0_NO_DRAW)
|| (checkSetAnime(0, ANM_S_RETURN) && mpMorf->isStop())) {
if (event_id == 0xb) {
dMeter2Info_setPauseStatus(6);
link->onPortalWarpMidnaAtnKeep();
} else {
link->onMidnaTalkPolySpeed();
}
dComIfGp_getEvent().reset(this);
offStateFlg0(FLG0_UNK_8000);
}
}
}
} else if (eventInfo.checkCommandDemoAccrpt() && !link->checkMetamorphose()) {
dComIfGp_getEvent().reset(this);
}
if (link->checkMidnaRide()) {
eventInfo.onCondition(1);
}
if (mpModel != NULL && !checkStateFlg0(FLG0_NO_DRAW)) {
cXyz pos;
if (checkSetAnime(0, ANM_LEADST)) {
mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_BACKBONE1), &pos);
mParticleKey1 = dComIfGp_particle_set(mParticleKey1, 0x8397, &pos, &tevStr, &shape_angle,
NULL, 0xff, NULL, -1, NULL, NULL, 0);
mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_HAIR_1), &pos);
mParticleKey2 = dComIfGp_particle_set(mParticleKey2, 0x8398, &pos, &tevStr, &shape_angle,
NULL, 0xff, NULL, -1, NULL, NULL, 0);
}
if (checkStateFlg0(FLG0_UNK_400000)) {
static s16 const throughEffectJoint[6] =
{ JNT_HEAD, JNT_BACKBONE2, JNT_WAIST, JNT_HEAD, JNT_BACKBONE2, JNT_WAIST };
static u16 const throughEffectName[6] =
{ 0x84da, 0x84d9, 0x84db, 0x84dd, 0x84dc, 0x84de };
int i;
u32* particle_key = mThroughEffectKey;
for (i = 0; i < 6; i++, particle_key++) {
mDoMtx_multVecZero(mpModel->getAnmMtx(throughEffectJoint[i]), &pos);
*particle_key = dComIfGp_particle_set(*particle_key, throughEffectName[i], &pos,
&tevStr, &shape_angle, NULL, 0xff, NULL, -1,
NULL, NULL, 0);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(*particle_key);
if (emitter != NULL && emitter->isEnableDeleteEmitter()) {
offStateFlg0(FLG0_UNK_400000);
}
}
} else {
for (int i = 0; i < 6; i++) {
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mThroughEffectKey[i]);
if (emitter != NULL) {
emitter->stopDrawParticle();
}
}
}
} else {
offStateFlg0(FLG0_UNK_400000);
}
mEndResetStateFlg0 = 0;
link->clearMidnaMsgNum();
setSound();
return 1;
}
/* 804C59E8-804C5A08 009848 0020+00 1/0 0/0 0/0 .text daMidna_Execute__FP9daMidna_c */
static int daMidna_Execute(daMidna_c* i_this) {
return i_this->execute();
}
/* 804C5A08-804C6184 009868 077C+00 1/1 0/0 0/0 .text draw__9daMidna_cFv */
int daMidna_c::draw() {
daAlink_c* link = daAlink_getAlinkActorClass();
if (checkNoDrawState() ||
(!checkStateFlg1((daMidna_FLG1)(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE | FLG1_UNK_1))
&& daAlink_getAlinkActorClass()->checkPlayerNoDraw()
&& !checkStateFlg0((daMidna_FLG0)(FLG0_TAG_WAIT | FLG0_UNK_100))))
{
return 1;
}
int bvar1 = false;
dComIfGd_setListDark();
if (!checkStateFlg0(FLG0_NO_DRAW) && !checkStateFlg1(FLG1_SHADOW_MODEL_DRAW_DEMO_FORCE)
&& mpModel != NULL) {
g_env_light.settingTevStruct(3, &current.pos, &tevStr);
if (checkSetAnime(0, ANM_RETURN)) {
f32 end_frame = mpMorf->getEndFrame();
f32 frame = mpMorf->getFrame();
tevStr.TevColor.r = (frame / end_frame) * -32.0f;
tevStr.TevColor.g = tevStr.TevColor.r;
tevStr.TevColor.b = tevStr.TevColor.r;
} else if (link->getIceDamageWaitTimer() != 0 || link->checkFreezeDamage() != 0) {
tevStr.TevColor = link->tevStr.TevColor;
field_0x6e0 = link->tevStr.TevColor;
if (dKy_darkworld_check()) {
field_0x6e8 = (J3DGXColor)l_normalKColor;
field_0x6ec = (J3DGXColor)l_normalKColor2;
} else {
field_0x6e8 = (J3DGXColor)l_lNormalKColor;
field_0x6ec = (J3DGXColor)l_lNormalKColor2;
}
}
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(4);
if (field_0x668 != NULL) {
field_0x668->getTevColorReg(0, &field_0x6e0);
field_0x668->getTevKonstReg(0, &field_0x6e8);
}
material->setTevColor(1, &field_0x6e0);
material->setTevKColor(1, &field_0x6e8);
mDoExt_modelEntryDL(mpModel);
g_env_light.setLightTevColorType_MAJI(mpHandsBmd, &tevStr);
mDoExt_modelEntryDL(mpHandsBmd);
if (mpHairhandBmd != NULL && !checkStateFlg1((daMidna_FLG1)(FLG1_UNK_40 | FLG1_UNK_10))) {
for (u16 i = 0; i < 3; i++) {
J3DMaterial* material = mpHairhandBmd->getModelData()->getMaterialNodePointer(i);
material->setTevColor(1, &field_0x6e0);
material->setTevKColor(1, &field_0x6e8);
material->setTevKColor(2, &field_0x6ec);
}
g_env_light.setLightTevColorType_MAJI(mpHairhandBmd, &tevStr);
mDoExt_modelEntryDL(mpHairhandBmd);
}
if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) {
g_env_light.setLightTevColorType_MAJI(mpMaskBmd, &tevStr);
mDoExt_modelEntryDL(mpMaskBmd);
}
if (!link->checkMidnaRide()) {
bvar1 = true;
}
} else {
g_env_light.settingTevStruct(1, &current.pos, &tevStr);
if (field_0x668 != NULL) {
field_0x668->getTevColorReg(0, &tevStr.TevColor);
}
g_env_light.setLightTevColorType_MAJI(mpGokouBmd, &tevStr);
mDoExt_modelEntryDL(mpGokouBmd);
MtxP mtx = mpShadowModel->getAnmMtx(JNT_WORLD_ROOT);
cXyz vec(mtx[0][3], mtx[1][3], mtx[2][3]);
MTXMultVec(dComIfGd_getViewMtx(), &vec, &vec);
vec.z -= 200.0f;
MTXMultVec(dComIfGd_getInvViewMtx(), &vec, &vec);
g_env_light.setLightTevColorType_MAJI(mpShadowModel, &tevStr);
mInvModel.entryDL(&vec);
if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) {
g_env_light.setLightTevColorType_MAJI(mpShadowMaskBmd, &tevStr);
mMaskInvModel.entryDL(&vec);
}
g_env_light.setLightTevColorType_MAJI(mpShadowHandsBmd, &tevStr);
mHandsInvModel.entryDL(&vec);
if (!checkStateFlg1(FLG1_UNK_40)) {
g_env_light.setLightTevColorType_MAJI(mpShadowHairhandBmd, &tevStr);
mHairhandInvModel.entryDL(&vec);
}
}
if (mLeftHandShapeIdx == 0xfd) {
g_env_light.setLightTevColorType_MAJI(mpDemoHLTmpBmd, &tevStr);
mDoExt_modelEntryDL(mpDemoHLTmpBmd);
}
if (mRightHandShapeIdx == 0xfd) {
g_env_light.setLightTevColorType_MAJI(mpDemoHRTmpBmd, &tevStr);
mDoExt_modelEntryDL(mpDemoHRTmpBmd);
}
if (checkStateFlg0(FLG0_UNK_10)) {
g_env_light.setLightTevColorType_MAJI(mpDemoFCBlendBmd, &tevStr);
if (mpDemoFCBlendBrk != NULL) {
mpDemoFCBlendBmd->getModelData()->entryTevRegAnimator(mpDemoFCBlendBrk);
}
mDoExt_modelEntryDL(mpDemoFCBlendBmd);
g_env_light.setLightTevColorType_MAJI(mpDemoFCTongueBmd, &tevStr);
mDoExt_modelEntryDL(mpDemoFCTongueBmd);
}
if (!checkStateFlg1(FLG1_UNK_40) && checkStateFlg1(FLG1_UNK_10)) {
g_env_light.setLightTevColorType_MAJI(mpDemoHDTmpBmd, &tevStr);
mDoExt_modelEntryDL(mpDemoHDTmpBmd);
}
tevStr.TevColor.r = 0;
tevStr.TevColor.g = 0;
tevStr.TevColor.b = 0;
dComIfGd_setList();
if (bvar1 && !checkStateFlg1(FLG1_SHADOW_NO_DRAW)) {
cXyz vec;
mDoMtx_multVecZero(mpModel->getAnmMtx(JNT_BACKBONE1), &vec);
if (fopAcM_gc_c::gndCheck(&vec)) {
mShadowKey =
dComIfGd_setShadow(mShadowKey, 0, mpModel, &vec, 600.0f, 0.0f, vec.y - 40.0f,
fopAcM_gc_c::getGroundY(), *fopAcM_gc_c::getGroundCheck(),
&tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
if (!checkStateFlg1(FLG1_NO_MASK_DRAW)) {
dComIfGd_addRealShadow(mShadowKey, mpMaskBmd);
}
if (!checkStateFlg1(FLG1_UNK_40)) {
if (checkStateFlg1(FLG1_UNK_10)) {
dComIfGd_addRealShadow(mShadowKey, mpDemoHDTmpBmd);
} else {
dComIfGd_addRealShadow(mShadowKey, mpHairhandBmd);
}
}
}
}
return 1;
}
/* 804C6184-804C61A4 009FE4 0020+00 1/0 0/0 0/0 .text daMidna_Draw__FP9daMidna_c */
static int daMidna_Draw(daMidna_c* i_this) {
return i_this->draw();
}
/* 804C61A4-804C6324 00A004 0180+00 1/1 0/0 0/0 .text __dt__9daMidna_cFv */
daMidna_c::~daMidna_c() {
dComIfG_resDelete(&mPhase, l_arcName);
daPy_py_c::m_midnaActor = NULL;
mSound.deleteObject();
}
/* 804C6324-804C634C 00A184 0028+00 1/0 0/0 0/0 .text daMidna_Delete__FP9daMidna_c */
static int daMidna_Delete(daMidna_c* i_this) {
i_this->~daMidna_c();
return 1;
}
/* 804C6C40-804C6C60 -00001 0020+00 1/0 0/0 0/0 .data l_daMidna_Method */
static actor_method_class l_daMidna_Method = {
(process_method_func)daMidna_Create,
(process_method_func)daMidna_Delete,
(process_method_func)daMidna_Execute,
(process_method_func)NULL,
(process_method_func)daMidna_Draw,
};
/* 804C6C60-804C6C90 -00001 0030+00 0/0 0/0 1/0 .data g_profile_MIDNA */
extern actor_process_profile_definition g_profile_MIDNA = {
fpcLy_CURRENT_e,
6,
fpcPi_CURRENT_e,
PROC_MIDNA,
&g_fpcLf_Method.base,
sizeof(daMidna_c),
0,
0,
&g_fopAc_Method.base,
0x5C,
&l_daMidna_Method,
0x60000,
fopAc_ENV_e,
fopAc_CULLBOX_0_e,
};