#include "d/dolzel.h" #include "d/d_attention.h" #include "JSystem/JKernel/JKRSolidHeap.h" #include "d/actor/d_a_player.h" #include "d/d_com_inf_game.h" #include "d/d_s_play.h" #include "d/d_debug_viewer.h" #include "d/d_stage.h" #include "f_op/f_op_actor_mng.h" #include "m_Do/m_Do_controller_pad.h" #include "SSystem/SComponent/c_counter.h" #define DRAW_TYPE_YELLOW 0 #define DRAW_TYPE_RED 1 class dAttDrawParam_c : public JORReflexible { public: /* 80070158 */ dAttDrawParam_c(); /* 80073FC4 */ virtual ~dAttDrawParam_c() {} void genMessage(JORMContext*); /* 0x4 */ s8 field_0x4; /* 0x8 */ f32 mCursorDistance; /* 0xC */ f32 field_0xc; }; /* 80070018-80070038 06A958 0020+00 2/2 0/0 0/0 .text padLockButton__25@unnamed@d_attention_cpp@Fl */ namespace { static bool padLockTrigger(s32 i_padNo) { return mDoCPd_c::getTrigL(i_padNo) != 0; } static bool padLockButton(s32 i_padNo) { return mDoCPd_c::getHoldLockL(i_padNo) != 0; } } // namespace /* 803A9BF8-803A9C04 006D18 000C+00 2/2 0/0 0/0 .data loc_type_tbl__12dAttention_c */ type_tbl_entry dAttention_c::loc_type_tbl[3] = { {fopAc_attn_LOCK_e, fopAc_AttnFlag_LOCK_e}, {fopAc_attn_TALK_e, fopAc_AttnFlag_TALK_e}, {fopAc_attn_BATTLE_e, fopAc_AttnFlag_BATTLE_e}, }; /* 803A9C04-803A9C18 006D24 0014+00 1/1 0/0 0/0 .data act_type_tbl__12dAttention_c */ type_tbl_entry dAttention_c::act_type_tbl[5] = { {fopAc_attn_SPEAK_e, fopAc_AttnFlag_SPEAK_e}, {fopAc_attn_CARRY_e, fopAc_AttnFlag_CARRY_e}, {fopAc_attn_DOOR_e, fopAc_AttnFlag_DOOR_e}, {fopAc_attn_JUEL_e, fopAc_AttnFlag_JUEL_e}, {fopAc_attn_ETC_e, fopAc_AttnFlag_ETC_e}, }; /* 80450F58-80450F60 000458 0008+00 0/0 2/2 0/0 .sbss None */ static bool l_isFinalBossStg; /* 80070038-80070110 06A978 00D8+00 1/1 0/0 0/0 .text __ct__11dAttParam_cFl */ dAttParam_c::dAttParam_c(s32) { field_0x4 = 45.0f; field_0x8 = 30.0f; field_0xc = 90.0f; mFlags = 1; mSWModeDisable = -0.9f; mDangerBGMDistance = 3000.0f; mBGMDistMargin = 1000.0f; mSelCursorScaleX = 6.0f; mSelCursorScaleY = 4.5f; mAttnCursorScaleX = 14.0f; mAttnCursorScaleY = 14.0f; mSelCursorOffsetY = 10.0f; mAttnCursorOffsetY = 0.0f; mAttnCursorAppearFrames = 1; mAttnCursorDisappearFrames = 1; field_0x38 = 1.7f; field_0x3c = 1.0f; if (strcmp(dComIfGp_getStartStageName(), "D_MN09B") == 0) { l_isFinalBossStg = 1; } else { l_isFinalBossStg = 0; } #if DEBUG // "Attention System" connectHIO("注目システム"); #endif } /* 80070110-80070158 06AA50 0048+00 2/1 0/0 0/0 .text __dt__11dAttParam_cFv */ dAttParam_c::~dAttParam_c() { #if DEBUG releaseHIO(); #endif } #if DEBUG void dAttParam_c::genMessage(JORMContext* mctx) { mctx->genCheckBox(" リスト表示", &mFlags, 0x4000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" 有効", &mFlags, 4, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" ホールドモード", &mFlags, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" 矢印表示OFF", &mFlags, 0x10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("カーソル", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("選択時", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("スケールX", &mSelCursorScaleX, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("スケールY", &mSelCursorScaleY, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("Y Pos Offset", &mSelCursorOffsetY, -100.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("注目時", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("スケールX", &mAttnCursorScaleX, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("スケールY", &mAttnCursorScaleY, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("Y Pos Offset", &mAttnCursorOffsetY, -100.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("出現フレーム", &mAttnCursorAppearFrames, 0, 0xff, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("消去フレーム", &mAttnCursorDisappearFrames, 0, 0xff, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("アニメーションスピード", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("選択時", &field_0x38, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("注目時", &field_0x3c, 1.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider(" SW Mode 解除", &mSWModeDisable, -1.0f, 0.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" 表示デバック", &mFlags, 2, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider(" 警告BGM距離", &mDangerBGMDistance, 0.0f, 8000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider(" + マージン", &mBGMDistMargin, 0.0f, 8000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" デバッグ表示", &mFlags, 0x8000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider(" 表示位置 X", &mDebugDispPosX, 0, 0x280, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider(" Y", &mDebugDispPosY, 0, 0x1e0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genCheckBox(" KEEP挙動", &mFlags, 8, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genLabel("-", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); } #endif /* 80070158-80070178 06AA98 0020+00 1/1 0/0 0/0 .text __ct__15dAttDrawParam_cFv */ dAttDrawParam_c::dAttDrawParam_c() { mCursorDistance = 250.0f; field_0xc = 2.0f; } #if DEBUG void dAttDrawParam_c::genMessage(JORMContext* mctx) { mctx->genLabel("カーソル", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); mctx->genSlider("距離", &mCursorDistance, 0.0f, 500000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); } #endif /* 80070178-80070198 06AAB8 0020+00 1/0 0/0 0/0 .text * execute__19dAttDraw_CallBack_cFUsP16J3DTransformInfo */ int dAttDraw_CallBack_c::execute(u16 param_0, J3DTransformInfo* transform) { if (param_0 == 0) { transform->mTranslate.y *= YREG_F(17) + 0.6f; } return 1; } /* 80424B0C-80424B20 05182C 0010+04 3/3 0/0 0/0 .bss g_AttDwHIO */ dAttDrawParam_c g_AttDwHIO; /* 80070198-80070774 06AAD8 05DC+00 0/0 1/1 0/0 .text __ct__12dAttention_cFP10fopAc_ac_cUl */ dAttention_c::dAttention_c(fopAc_ac_c* i_player, u32 i_padNo) { mpPlayer = i_player; mPadNo = i_padNo; mLockTargetID = fpcM_ERROR_PROCESS_ID_e; field_0x32e = 0; field_0x32f = 0; mLockOnOffset = mActionOffset = mCheckObjectOffset = 0; initList(0xFFFFFFFF); mPlayerAttentionFlags = 0; mAttnStatus = field_0x32a = EState_NONE; field_0x32b = 4; field_0x32c = 0; mAttnBlockTimer = 0; heap = mDoExt_createSolidHeapFromGameToCurrent(0x9000, 0); JUT_ASSERT(0x198, heap != 0); J3DModelData* modelDataR = (J3DModelData*)dComIfG_getObjectRes("Always", 0x25); JUT_ASSERT(0x1BB, modelDataR); J3DModelData* modelDataY = (J3DModelData*)dComIfG_getObjectRes("Always", 0x26); JUT_ASSERT(0x1BF, modelDataY); for (int i = 0; i < 2; i++) { draw[i].mModel[DRAW_TYPE_YELLOW] = mDoExt_J3DModel__create(modelDataY, 0x80000, 0x11000285); JUT_ASSERT(0x1CA, draw[i].mModel[0] != 0); draw[i].mModel[DRAW_TYPE_RED] = mDoExt_J3DModel__create(modelDataR, 0x80000, 0x11000285); JUT_ASSERT(0x1D4, draw[i].mModel[1] != 0); int res; res = draw[i].mNoticeCursorBck[DRAW_TYPE_YELLOW].init((J3DAnmTransform*)dComIfG_getObjectRes("Always", 0x11), TRUE, 2, 1.0f, 0, -1, false); JUT_ASSERT(0x1DC, res == 1); res = draw[i].mNoticeCursorBpk[DRAW_TYPE_YELLOW].init(modelDataY, (J3DAnmColor*)dComIfG_getObjectRes("Always", 0x2B), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x1E4, res == 1); res = draw[i].mNoticeCursorBrk[DRAW_TYPE_YELLOW].init(modelDataY, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x37), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x1EC, res == 1); res = draw[i].mNoticeCursorBtk[DRAW_TYPE_YELLOW].init(modelDataY, (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", 0x3F), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x1F4, res == 1); res = draw[i].mNoticeCursor02Brk[DRAW_TYPE_YELLOW].init(modelDataY, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x38), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x1FC, res == 1); res = draw[i].mNoticeCursorBck[DRAW_TYPE_RED].init((J3DAnmTransform*)dComIfG_getObjectRes("Always", 0x10), TRUE, 2, 1.0f, 0, -1, false); JUT_ASSERT(0x204, res == 1); res = draw[i].mNoticeCursorBpk[DRAW_TYPE_RED].init(modelDataR, (J3DAnmColor*)dComIfG_getObjectRes("Always", 0x2A), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x20B, res == 1); res = draw[i].mNoticeCursorBrk[DRAW_TYPE_RED].init(modelDataR, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x35), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x212, res == 1); res = draw[i].mNoticeCursorBtk[DRAW_TYPE_RED].init(modelDataR, (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", 0x3E), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x219, res == 1); res = draw[i].mNoticeCursor02Brk[DRAW_TYPE_RED].init(modelDataR, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x36), TRUE, 2, 1.0f, 0, -1); JUT_ASSERT(0x220, res == 1); res = draw[i].mImpactBck.init((J3DAnmTransform*)dComIfG_getObjectRes("Always", 0xC), TRUE, 0, 1.0f, 0, -1, false); JUT_ASSERT(0x228, res == 1); res = draw[i].mImpactBpk.init(modelDataR, (J3DAnmColor*)dComIfG_getObjectRes("Always", 0x29), TRUE, 0, 1.0f, 0, -1); JUT_ASSERT(0x22F, res == 1); res = draw[i].mImpactBrk.init(modelDataR, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x32), TRUE, 0, 1.0f, 0, -1); JUT_ASSERT(0x236, res == 1); res = draw[i].mImpactBtk.init(modelDataR, (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", 0x3D), TRUE, 0, 1.0f, 0, -1); JUT_ASSERT(0x23D, res == 1); draw[i].mDrawType = DRAW_TYPE_YELLOW; draw[i].mAlphaAnmFrameMax = 1; draw[i].mAlphaAnmFrame = 0; draw[i].mAlphaAnmPlayDirection = 1; draw[i].field_0x173 = 2; draw[i].field_0x175 = 0; } mDoExt_restoreCurrentHeap(); if ((int)mDoExt_adjustSolidHeap(heap) >= 0) { DCStoreRangeNoSync(heap->getStartAddr(), heap->getHeapSize()); } field_0x328 = -1; mFlags = 0; mZHintTarget.init(); mCatghTarget.init(); mLookTarget.init(); new (&mAttParam) dAttParam_c(0); g_AttDwHIO.field_0x4 = mDoHIO_CREATE_CHILD("注目カーソル", &g_AttDwHIO); } /* 80070774-80070844 06B0B4 00D0+00 0/0 2/2 0/0 .text __dt__12dAttention_cFv */ dAttention_c::~dAttention_c() { if (heap != NULL) { mDoExt_destroySolidHeap(heap); heap = NULL; } mDoHIO_DELETE_CHILD(g_AttDwHIO.field_0x4); } /* 80070844-80070880 06B184 003C+00 2/2 2/2 8/8 .text GetLockonList__12dAttention_cFl */ dAttList_c* dAttention_c::GetLockonList(s32 i_no) { if (mLockonCount != 0) { return &mLockOnList[(mLockOnOffset + i_no) % mLockonCount]; } return NULL; } /* 80070880-80070974 06B1C0 00F4+00 0/0 5/5 2/2 .text getActionBtnB__12dAttention_cFv */ dAttList_c* dAttention_c::getActionBtnB() { int i; dAttList_c* list = GetLockonList(0); fopAc_ac_c* actor; if (list != NULL && list->getActor() != NULL && list->mType == fopAc_attn_TALK_e && LockonTruth()) { actor = list->getActor(); if (!(actor->attention_info.flags & fopAc_AttnFlag_NOTALK_e)) { return list; } } if (mActionCount == 0) { return NULL; } for (i = 0; i < mActionCount; i++) { if (mActionList[i].mType == fopAc_attn_SPEAK_e) { actor = mActionList[i].getActor(); if (!(actor->attention_info.flags & fopAc_AttnFlag_NOTALK_e)) { return &mActionList[i]; } continue; } return &mActionList[i]; } return NULL; } /* 80070974-80070A70 06B2B4 00FC+00 0/0 1/1 0/0 .text getActionBtnXY__12dAttention_cFv */ dAttList_c* dAttention_c::getActionBtnXY() { int i; dAttList_c* list = GetLockonList(0); fopAc_ac_c* actor; if (list != NULL && list->getActor() != NULL && list->mType == fopAc_attn_TALK_e && LockonTruth()) { actor = list->getActor(); if (actor->eventInfo.chkCondition(dEvtCnd_CANTALKITEM_e)) { return list; } return NULL; } if (mActionCount == 0) { return NULL; } for (i = 0; i < mActionCount; i++) { if (mActionList[i].mType == fopAc_attn_SPEAK_e) { actor = mActionList[i].getActor(); if (actor->eventInfo.chkCondition(dEvtCnd_CANTALKITEM_e)) { return &mActionList[i]; } } } return NULL; } /* 80450660-80450664 0000E0 0004+00 2/2 0/0 0/0 .sdata loc_type_num__12dAttention_c */ int dAttention_c::loc_type_num = 3; /* 80070A70-80070AC0 06B3B0 0050+00 1/1 0/0 0/0 .text chkAttMask__12dAttention_cFUlUl */ int dAttention_c::chkAttMask(u32 i_type, u32 i_mask) { int i; for (i = 0; i < loc_type_num; i++) { if (i_type == loc_type_tbl[i].type) { return i_mask & loc_type_tbl[i].mask; } } return 1; } /* 80070AC0-80070B2C 06B400 006C+00 2/2 0/0 0/0 .text check_event_condition__FUlUs */ static int check_event_condition(u32 i_attnType, u16 i_condition) { switch (i_attnType) { case fopAc_attn_TALK_e: case fopAc_attn_SPEAK_e: if (!(i_condition & dEvtCnd_CANTALK_e)) { return true; } break; case fopAc_attn_DOOR_e: if (!(i_condition & dEvtCnd_CANDOOR_e)) { return true; } break; case fopAc_attn_JUEL_e: if (!(i_condition & dEvtCnd_CANDOOR_e)) { return true; } break; } return false; } /* 80450664-80450668 0000E4 0004+00 1/1 0/0 0/0 .sdata act_type_num__12dAttention_c */ int dAttention_c::act_type_num = 5; /* 80450668-8045066C 0000E8 0004+00 1/1 0/0 0/0 .sdata chk_type_tbl__12dAttention_c */ type_tbl_entry dAttention_c::chk_type_tbl[1] = { {fopAc_attn_CHECK_e, fopAc_AttnFlag_CHECK_e}, }; /* 8045066C-80450670 0000EC 0004+00 1/1 0/0 0/0 .sdata chk_type_num__12dAttention_c */ int dAttention_c::chk_type_num = 1; /* 80450670-80450674 0000F0 0004+00 2/2 0/0 0/0 .sdata None */ static bool attn_opt_hold = true; /* 80070B2C-80070BF4 06B46C 00C8+00 2/2 0/0 0/0 .text check_flontofplayer__FUlss */ static int check_flontofplayer(u32 i_checkMask, s16 i_ang1, s16 i_ang2) { static int ftp_table[9] = { 0x4, 0x1, 0x2, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, }; static s16 ang_table[3] = { 0x4000, 0x2000, 0x0AAA, }; static s16 ang_table2[6] = { 0x0AAA, 0x2000, 0x2AAA, 0x4000, 0x4E38, 0x6000, }; if (i_ang1 < 0) { i_ang1 = -i_ang1; } if (i_ang2 < 0) { i_ang2 = -i_ang2; } int i; for (i = 0; i < 3; i++) { if (i_checkMask & ftp_table[i]) { if (i_ang1 > ang_table[i]) { return true; } } } for (i = 8; i >= 3; i--) { if (i_checkMask & ftp_table[i]) { if (i_ang2 > ang_table2[i - 3]) { return true; } } } return false; } /* 80070BF4-80070C40 06B534 004C+00 2/2 0/0 0/0 .text distace_weight__Ffsf */ static f32 distace_weight(f32 i_distance, s16 i_angle, f32 i_ratio) { f32 var_f31 = i_angle / (f32)0x8000; f32 var_f30 = SQUARE(var_f31); return i_distance * ((1.0f - i_ratio) + (i_ratio * var_f30)); } /* 80070C40-80070CA0 06B580 0060+00 2/2 0/0 0/0 .text distace_angle_adjust__Ffsf */ static f32 distace_angle_adjust(f32 i_distAdjust, s16 i_angle, f32 i_ratio) { f32 var_f31 = i_angle / (f32)0x8000; if (var_f31 < 0.0f) { var_f31 = -var_f31; } f32 var_f30 = SQUARE(1.0f - var_f31); return i_distAdjust * ((1.0f - i_ratio) + (i_ratio * var_f30)); } /* 80070CA0-80070E90 06B5E0 01F0+00 3/3 0/0 0/0 .text check_distace__FP4cXyzsP4cXyzffff */ static BOOL check_distace(cXyz* i_pos, s16 i_angle, cXyz* i_attnPos, f32 i_distMax, f32 i_distAdjust, f32 i_max_y, f32 i_min_y) { cXyz dist = *i_attnPos - *i_pos; if (dist.y <= i_min_y || dist.y >= i_max_y) { return false; } f32 adjust = i_distMax + distace_angle_adjust(i_distAdjust, i_angle, 1.0f); if (adjust < dist.absXZ()) { return false; } return true; } /* 80070E90-800710C0 06B7D0 0230+00 2/2 0/0 0/0 .text * calcWeight__12dAttention_cFiP10fopAc_ac_cfssPUl */ f32 dAttention_c::calcWeight(int i_listType, fopAc_ac_c* i_actor, f32 i_distance, s16 i_angle, s16 i_invAngle, u32* i_attnType) { int i; int num; type_tbl_entry* table; switch (i_listType) { case 'L': if (chkFlag(0x4000)) { return 0.0f; } num = loc_type_num; table = loc_type_tbl; break; default: OS_REPORT("attention: %d: illegal type\n", 1049); case 'A': num = act_type_num; table = act_type_tbl; break; case 'C': num = chk_type_num; table = chk_type_tbl; break; } f32 weight = 0.0f; f32 max_weight = -1.0f; int dist_index; daPy_py_c* player = daPy_getPlayerActorClass(); if (player != NULL) { fpc_ProcID grab_actor_id = player->getGrabActorID(); if (i_actor == fopAcM_SearchByID(grab_actor_id)) { return 0.0f; } } for (i = 0; i < num; i++) { f32 dist_weight; type_tbl_entry* type_tbl_entry = &table[i]; if (mPlayerAttentionFlags & type_tbl_entry->mask & i_actor->attention_info.flags) { dist_index = i_actor->attention_info.distances[type_tbl_entry->type]; dist_entry* dist_tbl_entry = &dist_table[dist_index]; if (fopAcM_CheckStatus(i_actor, 0x20000000) || check_event_condition(type_tbl_entry->type, i_actor->eventInfo.getCondition())) { dist_weight = 0.0f; } else if (check_flontofplayer(dist_tbl_entry->mAngleSelect, i_angle, i_invAngle)) { dist_weight = 0.0f; } else if (!check_distace(&mOwnerAttnPos, i_angle, &i_actor->attention_info.position, dist_tbl_entry->mDistMax, dist_tbl_entry->mDistanceAdjust, dist_tbl_entry->mUpperY, dist_tbl_entry->mLowerY)) { dist_weight = 0.0f; } else { dist_weight = distace_weight(i_distance, i_angle, 0.5f); } f32 dist_tbl_weight = dist_tbl_entry->mWeight; if (dist_weight > 0.0f && dist_tbl_weight > max_weight) { max_weight = dist_tbl_weight; weight = dist_weight / dist_tbl_weight; *i_attnType = type_tbl_entry->type; } } } return weight; } /* 800710C0-80071240 06BA00 0180+00 1/1 0/0 0/0 .text * setList__12dAttention_cFiP10fopAc_ac_cff7cSAngleUl */ void dAttention_c::setList(int i_listType, fopAc_ac_c* i_actor, f32 i_weight, f32 i_distance, cSAngle i_angle, u32 i_attnType) { int max; int* list_count; int maxIndex; dAttList_c* list; switch (i_listType) { case 'L': if (chkFlag(0x4000)) return; if (mLockonCount >= 1 && i_actor == mLockOnList[0].getActor() && i_attnType == mLockOnList[0].mType) { return; } max = 8; list_count = &mLockonCount; list = mLockOnList; break; default: OS_REPORT("attention: %d: illegal type\n", 1169); case 'A': max = 4; list_count = &mActionCount; list = mActionList; break; case 'C': max = 4; list_count = &mCheckObjectCount; list = mCheckObjectList; break; } if (i_weight > 0.0f) { if (*list_count < max) { maxIndex = *list_count; (*list_count)++; } else { f32 maxWeight = 0.0f; int i = 0; maxIndex = i; for (; i < max; i++) { if (list[i].mWeight > maxWeight) { maxWeight = list[i].mWeight; maxIndex = i; } } } if (list[maxIndex].mWeight > i_weight) { list[maxIndex].setActor(i_actor); list[maxIndex].mWeight = i_weight; list[maxIndex].mDistance = i_distance; list[maxIndex].mAngle = i_angle; list[maxIndex].mType = i_attnType; } } } /* 80071240-8007138C 06BB80 014C+00 6/6 0/0 0/0 .text initList__12dAttention_cFUl */ void dAttention_c::initList(u32 flags) { mPlayerAttentionFlags = flags; if (!chkFlag(0x4000)) { int lockonIndex; mLockonCount = lockonIndex = mLockTargetID != fpcM_ERROR_PROCESS_ID_e ? 1 : 0; if (mLockOnOffset != 0) { memcpy(mLockOnList, mLockOnList + mLockOnOffset, sizeof(dAttList_c)); mLockOnList[0].mWeight = 0.0f; } mLockOnOffset = 0; for (; lockonIndex < 8; lockonIndex++) { mLockOnList[lockonIndex].setActor(NULL); mLockOnList[lockonIndex].mWeight = FLT_MAX; } } int i; mActionCount = mActionOffset = i = 0; for (; i < 4; i++) { mActionList[i].setActor(NULL); mActionList[i].mWeight = FLT_MAX; } mCheckObjectCount = mCheckObjectOffset = i = 0; for (; i < 4; i++) { mCheckObjectList[i].setActor(NULL); mCheckObjectList[i].mWeight = FLT_MAX; } setFlag(0x1000); } /* 8007138C-800713CC 06BCCC 0040+00 1/1 0/0 0/0 .text select_attention__FP10fopAc_ac_cPv */ static int select_attention(fopAc_ac_c* i_actor, void* i_attention) { if (i_actor->attention_info.flags == 0) { return 0; } dAttention_c* attention = (dAttention_c*)i_attention; int rt = attention->SelectAttention(i_actor); return rt; } /* 800713CC-80071424 06BD0C 0058+00 4/4 0/0 0/0 .text makeList__12dAttention_cFv */ int dAttention_c::makeList() { fopAcIt_Executor((fopAcIt_ExecutorFunc)select_attention, this); setFlag(0x2000); return mLockonCount + mActionCount + mCheckObjectCount; } /* 80071424-80071488 06BD64 0064+00 1/1 0/0 0/0 .text setOwnerAttentionPos__12dAttention_cFv */ void dAttention_c::setOwnerAttentionPos() { mOwnerAttnPos = mpPlayer->attention_info.position; if (fopAcM_GetName(mpPlayer) == PROC_ALINK) { mOwnerAttnPos.y -= ((daPy_py_c*)mpPlayer)->getAttentionOffsetY(); } } /* 80071488-8007167C 06BDC8 01F4+00 1/1 0/0 0/0 .text * SelectAttention__12dAttention_cFP10fopAc_ac_c */ int dAttention_c::SelectAttention(fopAc_ac_c* i_actor) { cSAngle angle; cSAngle inv_angle; if (i_actor == mpPlayer || mpPlayer == NULL) { return 0; } mPlayerAttentionFlags = mpPlayer->attention_info.flags; cSGlobe globe(i_actor->attention_info.position - mOwnerAttnPos); angle = globe.U() - fopAcM_GetShapeAngle_p(mpPlayer)->y; inv_angle = cSAngle(globe.U().Inv()) - fopAcM_GetShapeAngle_p(i_actor)->y; u32 attn_type; if ((i_actor->attention_info.flags & fopAc_AttnFlags_LOCK) && !chkFlag(0x4000)) { f32 weight = calcWeight('L', i_actor, globe.R(), angle.Val(), inv_angle.Val(), &attn_type); setList('L', i_actor, weight, globe.R(), angle, attn_type); } if (i_actor->attention_info.flags & fopAc_AttnFlags_ACTION) { f32 weight = calcWeight('A', i_actor, globe.R(), angle.Val(), inv_angle.Val(), &attn_type); setList('A', i_actor, weight, globe.R(), angle, attn_type); } if (i_actor->attention_info.flags & fopAc_AttnFlag_CHECK_e) { f32 weight = calcWeight('C', i_actor, globe.R(), angle.Val(), inv_angle.Val(), &attn_type); setList('C', i_actor, weight, globe.R(), angle, attn_type); } return 0; } /* 800716B8-800718A4 06BFF8 01EC+00 4/4 0/0 0/0 .text sortList__12dAttention_cFv */ void dAttention_c::sortList() { int i; int j; int count; dAttList_c swap; dAttList_c* list; if (!chkFlag(0x4000)) { list = mLockOnList; for (i = (mLockTargetID != fpcM_ERROR_PROCESS_ID_e) ? 1 : 0, count = mLockonCount; i < count - 1; i++) { for (j = i + 1; j < count; j++) { if (list[i].mWeight > list[j].mWeight) { memcpy(&swap, &list[j], sizeof(dAttList_c)); memcpy(&list[j], &list[i], sizeof(dAttList_c)); memcpy(&list[i], &swap, sizeof(dAttList_c)); } } } } list = mActionList; count = mActionCount; for (i = 0; i < count - 1; i++) { for (j = i + 1; j < count; j++) { if (list[i].mWeight > list[j].mWeight) { memcpy(&swap, &list[j], sizeof(dAttList_c)); memcpy(&list[j], &list[i], sizeof(dAttList_c)); memcpy(&list[i], &swap, sizeof(dAttList_c)); } } } list = mCheckObjectList; count = mCheckObjectCount; for (i = 0; i < count - 1; i++) { for (j = i + 1; j < count; j++) { if (list[i].mWeight > list[j].mWeight) { memcpy(&swap, &list[j], sizeof(dAttList_c)); memcpy(&list[j], &list[i], sizeof(dAttList_c)); memcpy(&list[i], &swap, sizeof(dAttList_c)); } } } } /* 800718A4-80071960 06C1E4 00BC+00 2/2 0/0 0/0 .text stockAttention__12dAttention_cFv */ void dAttention_c::stockAttention() { fopAc_ac_c* lockon_actor = LockonTarget(0); initList(0xFFFFFFFF); if (makeList()) { sortList(); } if (lockon_actor != mLockOnList[0].getActor()) { if (lockon_actor != NULL) { if (mLockOnList[0].getActor() != NULL) { setFlag(2); } } else { setFlag(1); } setFlag(4); } LockonTarget(0); } /* 80071960-80071A68 06C2A0 0108+00 2/2 0/0 0/0 .text nextAttention__12dAttention_cFv */ fopAc_ac_c* dAttention_c::nextAttention() { if (!attn_opt_hold && mLockonCount == 1) { field_0x32e = 0; return NULL; } if (field_0x32e != 0) { mLockOnOffset++; if (mLockOnOffset >= mLockonCount) { mLockOnOffset = 0; } return LockonTarget(0); } fopAc_ac_c* actor = fopAcM_SearchByID(mLockTargetID); initList(0xFFFFFFFF); if (makeList()) { sortList(); } if (actor == mLockOnList[0].getActor() && mLockonCount > 1) { mLockOnOffset = 1; } return LockonTarget(0); } /* 80071A68-80071A98 06C3A8 0030+00 3/3 0/0 0/0 .text freeAttention__12dAttention_cFv */ int dAttention_c::freeAttention() { mLockTargetID = fpcM_ERROR_PROCESS_ID_e; initList(0xFFFFFFFF); return 0; } /* 80071A98-80071CC0 06C3D8 0228+00 2/2 0/0 0/0 .text chaseAttention__12dAttention_cFv */ bool dAttention_c::chaseAttention() { cSAngle a1; cSAngle a2; int offset = mLockOnOffset; fopAc_ac_c* actor = mLockOnList[offset].getActor(); if (actor == NULL) { return false; } if (!chkFlag(0x4000)) { cSGlobe g1 = actor->attention_info.position - mOwnerAttnPos; a1 = g1.U() - fopAcM_GetShapeAngle_p(mpPlayer)->y; cSGlobe g2(mOwnerAttnPos - actor->attention_info.position); a2 = g2.U() - fopAcM_GetShapeAngle_p(actor)->y; u32 type; f32 weight = calcWeight('L', actor, g1.R(), a1.Val(), a2.Val(), &type); if (weight <= 0.0f) { type = mLockOnList[offset].mType; int tbl_idx = actor->attention_info.distances[type]; if (!chkAttMask(type, actor->attention_info.flags)) { return false; } else if (check_event_condition(type, actor->eventInfo.getCondition())) { return false; } else if (check_flontofplayer(dist_table[tbl_idx].mAngleSelect, a1.Val(), a2.Val())) { return false; } else if (check_distace(&mOwnerAttnPos, a1.Val(), &actor->attention_info.position, dist_table[tbl_idx].mDistMaxRelease, dist_table[tbl_idx].mDistanceAdjust, dist_table[tbl_idx].mUpperY, dist_table[tbl_idx].mLowerY)) { f32 weight = distace_weight(g1.R(), a1.Val(), 0.5f); mLockOnList[offset].mWeight = weight; return true; } return false; } mLockOnList[offset].setActor(actor); mLockOnList[offset].mWeight = weight; mLockOnList[offset].mDistance = g1.R(); mLockOnList[offset].mType = type; return true; } return (actor->attention_info.flags & fopAc_AttnFlags_LOCK) != false; } /* 80071CC0-80071D6C 06C600 00AC+00 1/1 0/0 0/0 .text EnemyDistance__12dAttention_cFP10fopAc_ac_c */ f32 dAttention_c::EnemyDistance(fopAc_ac_c* i_actor) { if (i_actor == mpPlayer || mpPlayer == NULL) { return -1.0f; } else if (fopAcM_GetProfName(i_actor) == PROC_ALINK) { return -1.0f; } else if (!(i_actor->attention_info.flags & fopAc_AttnFlag_BATTLE_e) && !(i_actor->attention_info.flags & fopAc_AttnFlag_ENEMY_NOLOCK_e)) { return -1.0f; } else { f32 distance = fopAcM_searchActorDistance(mpPlayer, i_actor); int tmp = i_actor->attention_info.distances[fopAc_attn_BATTLE_e]; if (distance < dist_table[tmp].mDistMax + dist_table[tmp].mDistanceAdjust) { return distance; } } return -1.0f; } /* 80071D6C-80071DEC 06C6AC 0080+00 1/1 0/0 0/0 .text sound_attention__FP10fopAc_ac_cPv */ static int sound_attention(fopAc_ac_c* i_actor, void* i_attention) { dAttention_c* attention = (dAttention_c*)i_attention; f32 dist = attention->EnemyDistance(i_actor); if (dist < 0.0f) { return 0; } if (dist < attention->mEnemyDist) { attention->mEnemyActorID = fopAcM_GetID(i_actor); attention->mEnemyDist = dist; } return 0; } /* 80071DEC-80071E84 06C72C 0098+00 1/1 0/0 0/0 .text runSoundProc__12dAttention_cFv */ void dAttention_c::runSoundProc() { mEnemyActorID = fpcM_ERROR_PROCESS_ID_e; mEnemyDist = 10000.0f; fopAc_ac_c* enemy_p; if (!chkFlag(0x80000000)) { fopAcIt_Executor((fopAcIt_ExecutorFunc)sound_attention, this); enemy_p = fopAcM_SearchByID(mEnemyActorID); if (enemy_p != NULL) { mDoAud_bgmNowBattle(mEnemyDist * 0.1f); setFlag(0x100); } } } /* 80071E84-800720F4 06C7C4 0270+00 1/1 0/0 0/0 .text runDrawProc__12dAttention_cFv */ void dAttention_c::runDrawProc() { int lockon_cnt = GetLockonCount(); if (chkFlag(8)) { draw[0].setAlphaAnm(mAttParam.mAttnCursorAppearFrames, 0); draw[0].setAnm(DRAW_TYPE_RED, mAttParam.field_0x3c); draw[0].mCursorSizeX = mAttParam.mAttnCursorScaleX; draw[0].mCursorSizeY = mAttParam.mAttnCursorScaleY; draw[0].mCursorOffsetY = mAttParam.mAttnCursorOffsetY; draw[0].field_0x175 = 1; if (!dComIfGp_checkPlayerStatus0(0, 0x36a02311) || dComIfGp_checkPlayerStatus1(0, 0x11)) { lockSoundStart(Z2SE_SY_L_FOCUS_SET); } } else if (chkFlag(0x10)) { draw[0].setAlphaAnm(mAttParam.mAttnCursorDisappearFrames, 1); if (field_0x328 >= 0) { field_0x328 = 1; setFlag(0x40000000); } if (!dComIfGp_checkPlayerStatus0(0, 0x36a02311) || dComIfGp_checkPlayerStatus1(0, 0x11)) { lockSoundStart(Z2SE_SY_L_FOCUS_RESET); } } else if (chkFlag(0x1)) { draw[0].setAnm(DRAW_TYPE_YELLOW, mAttParam.field_0x38); draw[0].setAlphaAnm(mAttParam.mAttnCursorAppearFrames, 0); draw[0].mCursorSizeX = mAttParam.mSelCursorScaleX; draw[0].mCursorSizeY = mAttParam.mSelCursorScaleY; draw[0].mCursorOffsetY = mAttParam.mSelCursorOffsetY; draw[0].field_0x175 = 0; setFlag(0x40000000); } else if (chkFlag(0x2)) { draw[0].setAlphaAnm(mAttParam.mAttnCursorAppearFrames, 0); draw[1].setAnm(DRAW_TYPE_YELLOW, mAttParam.field_0x38); draw[1].setAlphaAnm(mAttParam.mAttnCursorDisappearFrames, 1); draw[1].mCursorSizeX = mAttParam.mSelCursorScaleX; draw[1].mCursorSizeY = mAttParam.mSelCursorScaleY; draw[1].mCursorOffsetY = mAttParam.mSelCursorOffsetY; draw[1].field_0x175 = 0; setFlag(0x40000000); } else if (mLockonCount <= 0 && field_0x328 == 0) { draw[0].setAlphaAnm(mAttParam.mAttnCursorDisappearFrames, 1); field_0x328 = 1; setFlag(0x40000000); } if (mAttnStatus == EState_LOCK) { if (draw[0].field_0x173 == 3) { draw[0].field_0x173 = 4; clrFlag(0x40000000); } } else if (draw[0].field_0x173 == 3) { draw[0].field_0x173 = 4; clrFlag(0x40000000); field_0x328 = -1; } } #if DEBUG void dAttention_c::runDebugDisp0() { f32 analog_l = mDoCPd_c::getAnalogL(mPadNo); if (mAttParam.CheckFlag(0x8000)) { dDbVw_Report(mAttParam.mDebugDispPosX, mAttParam.mDebugDispPosY, "attention %d/%d", mLockOnOffset, mLockonCount); dDbVw_Report(mAttParam.mDebugDispPosX, mAttParam.mDebugDispPosY + 20, "L %f (%d:%d)", analog_l, padLockTrigger(mPadNo), mDoCPd_c::getHoldL(mPadNo)); dDbVw_Report(mAttParam.mDebugDispPosX, mAttParam.mDebugDispPosY + 40, "LS %d stick.y = %f", mAttnStatus, mDoCPd_c::getStickY(mPadNo)); if (LockonTarget(0)) { dDbVw_Report(mAttParam.mDebugDispPosX, mAttParam.mDebugDispPosY + 60, "LTN %s", dStage_getName(fopAcM_GetProfName(LockonTarget(0)), -1)); } } } #endif /* 800720F4-800720F8 06CA34 0004+00 1/1 0/0 0/0 .text runDebugDisp__12dAttention_cFv */ void dAttention_c::runDebugDisp() { #if DEBUG if (mAttParam.CheckFlag(0x4000)) { int i; int print_y = 100; int no = 0; char* type_str[] = { "LOCK", "TALK", "BATL", "SPEK", "CARY", "DOOR", "JUEL", "ETC?", "CHEK", "????", }; dDbVw_Report(10, print_y, " **** attention **** %03d", field_0x32e); dDbVw_Report(10, print_y += 15, " No TYPE WEIGHT PID NAME"); if (mLockonCount != 0) { for (i = 0; i < mLockonCount; i++) { char name[16]; fopAcM_getNameString(mLockOnList[i].getActor(), name); char sp9; if (i == mLockOnOffset) { sp9 = '*'; } else { sp9 = ' '; } dDbVw_Report(10, print_y += 15, "%c%02d %s %06.1f %3d %s", sp9, no, type_str[mLockOnList[i].mType], mLockOnList[i].mWeight, mLockOnList[i].getPid(), name); no++; } print_y += 15; } if (mActionCount != 0) { for (i = 0; i < mActionCount; i++) { char name[16]; fopAcM_getNameString(mActionList[i].getActor(), name); dDbVw_Report(10, print_y += 15, " %02d %s %06.1f %3d %s", no, type_str[mActionList[i].mType], mActionList[i].mWeight, mActionList[i].getPid(), name); no++; } } if (mCheckObjectCount != 0) { for (i = 0; i < mCheckObjectCount; i++) { char name[16]; fopAcM_getNameString(mCheckObjectList[i].getActor(), name); char sp8; if (i == mCheckObjectOffset) { sp8 = '+'; } else { sp8 = ' '; } dDbVw_Report(10, print_y += 15, "%c%02d %s %06.1f %3d %s", sp8, no, type_str[mCheckObjectList[i].mType], mCheckObjectList[i].mAngle.Degree(), mCheckObjectList[i].getPid(), name); no++; } } if (no == 0) { dDbVw_Report(10, print_y += 15, " (EMPTY)"); } } #endif } /* 800720F8-800722A0 06CA38 01A8+00 1/1 0/0 0/0 .text checkButton__12dAttention_cFv */ void dAttention_c::checkButton() { if (l_isFinalBossStg && dComIfGp_roomControl_getStayNo() == 0 && !dComIfGs_isSaveDunSwitch(1)) { if (field_0x32b == 1 && LockonTarget(0) != NULL && chkFlag(0x20000000)) { setFlag(0x1000000); } } if (dComIfGp_checkPlayerStatus0(0, 0x36a02311) || dComIfGp_checkPlayerStatus1(0, 0x11)) { switch (field_0x32b) { case 0: case 1: clrFlag(0x1000000); field_0x32b = 4; break; } return; } switch (field_0x32b) { case 4: if (padLockButton(mPadNo) || chkFlag(0x1000000)) { field_0x32b = 0; setFlag(0x200); clrFlag(0x1000000); } return; case 0: field_0x32b = 1; case 1: if (chkFlag(0x1000000)) { field_0x32b = 0; field_0x32e = 0x3C; setFlag(0x200); clrFlag(0x1000000); return; } if (!padLockButton(mPadNo)) { field_0x32b = 4; } } } /* 800722A0-800722EC 06CBE0 004C+00 2/2 0/0 0/0 .text triggerProc__12dAttention_cFv */ bool dAttention_c::triggerProc() { if (chaseAttention()) { setFlag(0x8); return true; } return false; } /* 800722EC-80072344 06CC2C 0058+00 2/2 0/0 0/0 .text lostCheck__12dAttention_cFv */ int dAttention_c::lostCheck() { if (chaseAttention()) { return false; } setFlag(0x10); setFlag(0x40); return true; } /* 80072344-800725F0 06CC84 02AC+00 1/1 0/0 0/0 .text judgementStatus4Hold__12dAttention_cFv */ void dAttention_c::judgementStatus4Hold() { int var_r29 = mAttnStatus; int var_r30 = -1; switch (mAttnStatus) { case EState_NONE: var_r30 = 10; field_0x32f = 0; field_0x32e = 0; mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); if (field_0x32b == 0 && triggerProc()) { mAttnStatus = EState_LOCK; field_0x32e = 15; var_r30 = 11; } break; case EState_LOCK: mLockTargetID = LockonTargetPId(0); field_0x32f = 0; var_r30 = 20; if (lostCheck()) { mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); if (triggerProc()) { mAttnStatus = EState_LOCK; } else { mAttnStatus = EState_NONE; freeAttention(); setFlag(0x800000); } var_r30 = 21; } else if (field_0x32b == 4) { mAttnStatus = EState_RELEASE; setFlag(0x10); field_0x32f = 10; var_r30 = 22; } else if (field_0x32e == 0) { initList(0xFFFFFFFF); if (makeList()) { sortList(); } var_r30 = 23; } if (field_0x32e != 0) { field_0x32e--; } break; case EState_RELEASE: setFlag(0x40); var_r30 = 30; if (lostCheck()) { mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); if (triggerProc()) { mAttnStatus = EState_LOCK; } else { mAttnStatus = EState_NONE; freeAttention(); setFlag(0x800000); } var_r30 = 31; } else if (field_0x32b == 0) { if (nextAttention()) { setFlag(0x8); mAttnStatus = EState_LOCK; field_0x32e = 15; } else { mAttnStatus = EState_NONE; freeAttention(); } var_r30 = 32; } else if (LockonTarget(0) == NULL || field_0x32f == 0) { mAttnStatus = EState_NONE; freeAttention(); var_r30 = 33; } if (field_0x32f != 0) { field_0x32f--; } break; } if (!chkFlag(0x1000)) { setFlag(0x4000); initList(0xFFFFFFFF); if (makeList()) { sortList(); } } #if DEBUG if (var_r29 != mAttnStatus) { OS_REPORT("%06d: attention: status %d, %d -> %d (%d)\n", g_Counter.mCounter0, mLockonCount, var_r29, mAttnStatus, var_r30); } #endif } /* 800725F0-80072924 06CF30 0334+00 1/1 0/0 0/0 .text judgementStatus4Switch__12dAttention_cFv */ void dAttention_c::judgementStatus4Switch() { int var_r29 = mAttnStatus; int var_r30 = -1; switch (mAttnStatus) { case EState_NONE: mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); field_0x32f = 0; field_0x32e = 0; var_r30 = 10; if (field_0x32b == 0 && triggerProc()) { mAttnStatus = EState_LOCK; field_0x32e = 15; field_0x32f = 15; var_r30 = 11; } break; case EState_LOCK: mLockTargetID = LockonTargetPId(0); var_r30 = 20; if (field_0x32f == 0) { mAttnStatus = EState_NONE; freeAttention(); var_r30 = 29; } else if (lostCheck()) { mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); if (triggerProc()) { mAttnStatus = EState_LOCK; } else { mAttnStatus = EState_NONE; freeAttention(); setFlag(0x800000); } var_r30 = 21; } else if (field_0x32b == 0) { if (mDoCPd_c::getStickY(mPadNo) < mAttParam.FreeStick()) { mAttnStatus = EState_NONE; freeAttention(); } else if (nextAttention()) { setFlag(0x8); mAttnStatus = EState_LOCK; field_0x32e = 15; } else { mAttnStatus = EState_NONE; freeAttention(); } var_r30 = 22; } else if (field_0x32e == 0) { initList(0xFFFFFFFF); if (makeList()) { sortList(); } var_r30 = 23; } if (!chkFlag(0x8) && field_0x32e != 0) { field_0x32e--; } if (field_0x32b == 1) { if (field_0x32f != 0) { field_0x32f--; } } else { field_0x32f = 15; } break; case EState_RELEASE: setFlag(0x40); var_r30 = 30; if (lostCheck()) { mLockTargetID = fpcM_ERROR_PROCESS_ID_e; stockAttention(); if (triggerProc()) { mAttnStatus = EState_LOCK; } else { mAttnStatus = EState_NONE; freeAttention(); setFlag(0x800000); } var_r30 = 31; } else if (field_0x32b == 0) { mAttnStatus = EState_NONE; if (triggerProc()) { mAttnStatus = EState_LOCK; field_0x32e = 15; field_0x32f = 15; } var_r30 = 32; } else if (LockonTarget(0) == NULL || field_0x32f == 0) { mAttnStatus = EState_NONE; freeAttention(); var_r30 = 33; } break; } if (!chkFlag(0x1000)) { setFlag(0x4000); initList(0xFFFFFFFF); if (makeList()) { sortList(); } } #if DEBUG if (var_r29 != mAttnStatus) { OS_REPORT("%06d: attention: status %d, %d -> %d (%d)\n", g_Counter.mCounter0, mLockonCount, var_r29, mAttnStatus, var_r30); } #endif } /* 80072924-80072BD4 06D264 02B0+00 0/0 1/1 0/0 .text Run__12dAttention_cFv */ int dAttention_c::Run() { clrFlag(0x3FFFFF); bool usingHold = dComIfGs_getOptAttentionType() == 0; if (attn_opt_hold != usingHold) { setFlag(0x10000); } attn_opt_hold = usingHold; #if DEBUG if (mAttParam.CheckFlag(4)) { attn_opt_hold = mAttParam.CheckFlag(1); } #endif if (mAttnBlockTimer != 0) { mAttnBlockTimer--; return 1; } if (chkFlag(0x80)) { mpPlayer = (fopAc_ac_c*) dComIfGp_getPlayer(0); mPadNo = PAD_1; } #if DEBUG runDebugDisp0(); #endif setOwnerAttentionPos(); if (dComIfGp_event_runCheck() || chkFlag(0x10000)) { mAttnStatus = EState_NONE; field_0x32b = 4; field_0x32c = 0; clrFlag(0x20000000); clrFlag(0x10000000); mLockTargetID = fpcM_ERROR_PROCESS_ID_e; freeAttention(); } else { checkButton(); if (attn_opt_hold) { judgementStatus4Hold(); } else { judgementStatus4Switch(); } if (chkFlag(0x800000)) { freeAttention(); if (LockonTarget(0) == NULL) { setFlag(0x20000020); } setFlag(0x10000000); clrFlag(0x800000); } else if (chkFlag(0x10000000)) { if (!padLockButton(mPadNo)) { if (chkFlag(0x20000000)) { lockSoundStart(Z2SE_SY_CAMERA_L_CANCEL); clrFlag(0x20000000); } clrFlag(0x10000000); } } else { if (padLockButton(mPadNo)) { if (LockonTarget(0) == NULL) { lockSoundStart(Z2SE_SY_CAMERA_L_MOVE); setFlag(0x20000020); } setFlag(0x10000000); } } } field_0x32a = mAttnStatus; runSoundProc(); runDrawProc(); runDebugDisp(); if (mAttnStatus == EState_LOCK) { dComIfGp_onCameraAttentionStatus(mPadNo, 1); } else { dComIfGp_offCameraAttentionStatus(mPadNo, 1); } mZHintTarget.proc(); mCatghTarget.proc(); mLookTarget.proc(); return 1; } /* 80072BD4-80072D80 06D514 01AC+00 0/0 1/1 0/0 .text Draw__12dAttention_cFv */ void dAttention_c::Draw() { if (mAttParam.CheckFlag(dAttParam_c::EFlag_ARROW_OFF)) { draw[0].field_0x173 = 3; draw[1].field_0x173 = 3; return; } Mtx inv_m; cMtx_inverse(dComIfGd_getViewRotMtx(), inv_m); fopAc_ac_c* lockon_actor = LockonTarget(0); if (!dComIfGp_event_runCheck()) { #if DEBUG if (mAttParam.CheckFlag(4) && mAttParam.CheckFlag(0x10)) { return; } #endif if (lockon_actor != NULL) { #if DEBUG if (mAttParam.CheckFlag(8)) { dDbVw_Report(300, 40, "000"); } #endif draw[0].draw(lockon_actor->attention_info.position, inv_m); if (mLockonCount >= 2 && draw[1].field_0x173 == 2) { int listIdx = mLockOnOffset; if (mLockOnOffset == 0) { listIdx = mLockonCount - 1; } else { listIdx--; } if (mLockOnList[listIdx].getActor() != NULL) { draw[1].draw(mLockOnList[listIdx].getActor()->attention_info.position, inv_m); #if DEBUG if (mAttParam.CheckFlag(8)) { dDbVw_Report(300, 40, "111"); } #endif } } mTargetActorID = fopAcM_GetID(lockon_actor); mDrawAttnPos = lockon_actor->attention_info.position; field_0x328 = 0; } else if (field_0x328 > 0) { fopAc_ac_c* actor = fopAcM_SearchByID(mTargetActorID); if (actor != NULL) { draw[0].draw(actor->attention_info.position, inv_m); mDrawAttnPos = actor->attention_info.position; } else { draw[0].draw(mDrawAttnPos, inv_m); } #if DEBUG if (mAttParam.CheckFlag(8)) { dDbVw_Report(300, 40, "222"); } #endif } } } /* 80072D80-80072DD8 06D6C0 0058+00 2/2 0/0 0/0 .text lockSoundStart__12dAttention_cFUl */ void dAttention_c::lockSoundStart(u32 i_sfxID) { if (!chkFlag(0x400000)) { mDoAud_seStart(i_sfxID, NULL, 0, 0); } } /* 80072DD8-80072FE8 06D718 0210+00 1/1 0/0 0/0 .text setAnm__10dAttDraw_cFUcf */ void dAttDraw_c::setAnm(u8 i_drawType, f32 i_anmSpeed) { mDrawType = i_drawType; mNoticeCursorBck[mDrawType].reset(); mNoticeCursorBck[mDrawType].setPlaySpeed(i_anmSpeed); mNoticeCursorBpk[mDrawType].reset(); mNoticeCursorBpk[mDrawType].setPlaySpeed(i_anmSpeed); mNoticeCursorBrk[mDrawType].reset(); mNoticeCursorBrk[mDrawType].setPlaySpeed(i_anmSpeed); mNoticeCursor02Brk[mDrawType].reset(); mNoticeCursor02Brk[mDrawType].setPlaySpeed(i_anmSpeed); mNoticeCursorBtk[mDrawType].reset(); mNoticeCursorBtk[mDrawType].setPlaySpeed(i_anmSpeed); if (mDrawType == DRAW_TYPE_RED) { mImpactBck.reset(); mImpactBpk.reset(); mImpactBrk.reset(); mImpactBtk.reset(); } } /* 80072FE8-80073004 06D928 001C+00 1/1 0/0 0/0 .text setAlphaAnm__10dAttDraw_cFUcUc */ void dAttDraw_c::setAlphaAnm(u8 i_frameMax, u8 i_playDirection) { mAlphaAnmFrameMax = i_frameMax; mAlphaAnmFrame = 0; field_0x173 = 2; mAlphaAnmPlayDirection = i_playDirection; } /* 80073004-800732AC 06D944 02A8+00 1/1 0/0 0/0 .text alphaAnm__10dAttDraw_cFv */ void dAttDraw_c::alphaAnm() { f32 anm_ratio = (f32)mAlphaAnmFrame / (f32)mAlphaAnmFrameMax; f32 alpha_ratio; if (mAlphaAnmPlayDirection == 1) { alpha_ratio = 1.0f - anm_ratio; } else { alpha_ratio = anm_ratio; } if (anm_ratio == 1.0f) { if (mDrawType == DRAW_TYPE_RED && mAlphaAnmPlayDirection == 0) { if (mImpactBck.isStop() && mImpactBpk.isStop() && mImpactBrk.isStop() && mImpactBtk.isStop()) { field_0x175 = 0; field_0x173 = 3; } } else { field_0x173 = 3; } } if (mAlphaAnmFrame < mAlphaAnmFrameMax) { mAlphaAnmFrame++; } J3DModelData* modelData = mModel[mDrawType]->getModelData(); for (int i = 0; i < modelData->getMaterialNum(); i++) { J3DMaterial* material = modelData->getMaterialNodePointer(i); J3DGXColor* color = (J3DGXColor*)material->getTevKColor(0); color->a = 255.0f * alpha_ratio; material->setTevKColor(0, color); } if (field_0x175 == 0) { mNoticeCursorBck[mDrawType].play(); mNoticeCursorBpk[mDrawType].play(); mNoticeCursorBrk[mDrawType].play(); mNoticeCursorBtk[mDrawType].play(); mNoticeCursor02Brk[mDrawType].play(); } else { mImpactBck.play(); mImpactBpk.play(); mImpactBrk.play(); mImpactBtk.play(); } } /* 800732B0-8007353C 06DBF0 028C+00 1/1 0/0 0/0 .text draw__10dAttDraw_cFR4cXyzPA4_f */ void dAttDraw_c::draw(cXyz& i_pos, Mtx i_mtx) { J3DModelData* modelData = mModel[mDrawType]->getModelData(); mDoMtx_stack_c::transS(i_pos.x, i_pos.y + mCursorOffsetY, i_pos.z); mDoMtx_stack_c::concat(i_mtx); mModel[mDrawType]->setBaseTRMtx(mDoMtx_stack_c::get()); view_class* view = dComIfGd_getView(); f32 fovy = view->fovy; f32 temp_f31 = std::tan(DEG_TO_RAD(0.5f * fovy)); f32 temp_f30 = (-100.0f + -g_AttDwHIO.mCursorDistance) / temp_f31; cXyz view_pos; cMtx_multVec(dComIfGd_getViewMtx(), &i_pos, &view_pos); f32 size = 1.0f; if (view_pos.z < temp_f30) { size = (view_pos.z * temp_f31) / (-100.0f + -g_AttDwHIO.mCursorDistance); } cXyz scale(mCursorSizeX * size, mCursorSizeY * size, mCursorSizeX * size); mModel[mDrawType]->setBaseScale(scale); alphaAnm(); if (field_0x175 != 0) { mImpactBck.entry(modelData); mImpactBpk.entry(modelData); mImpactBrk.entry(modelData); mImpactBtk.entry(modelData); } else { mNoticeCursorBck[mDrawType].entry(modelData); mNoticeCursorBpk[mDrawType].entry(modelData); mNoticeCursorBrk[mDrawType].entry(modelData); mNoticeCursorBtk[mDrawType].entry(modelData); mNoticeCursor02Brk[mDrawType].entry(modelData); } dComIfGd_setList3Dlast(); mDoExt_modelUpdateDL(mModel[mDrawType]); dComIfGd_setList(); } /* 8007353C-800735DC 06DE7C 00A0+00 8/8 13/13 21/21 .text LockonTarget__12dAttention_cFl */ fopAc_ac_c* dAttention_c::LockonTarget(s32 i_no) { if (dComIfGp_checkPlayerStatus0(0, 0x36A02311) || dComIfGp_checkPlayerStatus1(0, 0x11)) { return NULL; } if (i_no >= mLockonCount) { return NULL; } int listIdx = mLockOnOffset + i_no; if (listIdx >= mLockonCount) { listIdx -= mLockonCount; } fopAc_ac_c* actor = mLockOnList[listIdx].getActor(); if (actor == NULL || !(actor->attention_info.flags & fopAc_AttnFlags_LOCK)) { return NULL; } return actor; } /* 800735DC-800736CC 06DF1C 00F0+00 0/0 1/1 0/0 .text LockonReleaseDistanse__12dAttention_cFv */ f32 dAttention_c::LockonReleaseDistanse() { if (!LockonTruth()) { return 0.0f; } fopAc_ac_c* actor = mLockOnList[mLockOnOffset].getActor(); if (actor == NULL) { return 0.0f; } int idx = actor->attention_info.distances[mLockOnList[mLockOnOffset].mType]; cSGlobe globe(actor->attention_info.position - mOwnerAttnPos); cSAngle angle(globe.U() - fopAcM_GetShapeAngle_p(mpPlayer)->y); return distace_angle_adjust(dist_table[idx].mDistanceAdjust, angle, 1.0f) + dist_table[idx].mDistMaxRelease; } /* 800736CC-80073734 06E00C 0068+00 2/2 0/0 0/0 .text LockonTargetPId__12dAttention_cFl */ fpc_ProcID dAttention_c::LockonTargetPId(s32 i_no) { if (dComIfGp_checkPlayerStatus0(0, 0x36A02311) || dComIfGp_checkPlayerStatus1(0, 0x11)) { return fpcM_ERROR_PROCESS_ID_e; } if (i_no >= mLockonCount) { return fpcM_ERROR_PROCESS_ID_e; } int listIdx = mLockOnOffset + i_no; if (listIdx >= mLockonCount) { listIdx -= mLockonCount; } return mLockOnList[listIdx].getPid(); } /* 80073734-8007378C 06E074 0058+00 0/0 3/3 2/2 .text ActionTarget__12dAttention_cFl */ fopAc_ac_c* dAttention_c::ActionTarget(s32 i_no) { if (i_no >= mActionCount) { return NULL; } int listIdx = mActionOffset + i_no; if (listIdx >= mActionCount) { listIdx -= mActionCount; } return mActionList[listIdx].getActor(); } /* 8007378C-800737E4 06E0CC 0058+00 0/0 3/3 0/0 .text CheckObjectTarget__12dAttention_cFl */ fopAc_ac_c* dAttention_c::CheckObjectTarget(s32 i_no) { if (i_no >= mCheckObjectCount) { return NULL; } int listIdx = mCheckObjectOffset + i_no; if (listIdx >= mCheckObjectCount) { listIdx -= mCheckObjectCount; } return mCheckObjectList[listIdx].getActor(); } /* 800737E4-80073838 06E124 0054+00 3/3 53/53 37/37 .text LockonTruth__12dAttention_cFv */ bool dAttention_c::LockonTruth() { return (mAttnStatus == EState_LOCK || mAttnStatus == EState_RELEASE) && LockonTarget(0) != NULL; } /* 80073838-80073864 06E178 002C+00 0/0 1/1 0/0 .text * checkDistance__12dAttention_cFP4cXyzsP4cXyzffff */ int dAttention_c::checkDistance(cXyz* i_pos, s16 i_angle, cXyz* i_attnPos, f32 i_distMax, f32 i_distAdjust, f32 i_max_y, f32 i_min_y) { return check_distace(i_pos, i_angle, i_attnPos, i_distMax, i_distAdjust, i_max_y, i_min_y); } /* 80073864-80073898 06E1A4 0034+00 11/11 3/3 8/8 .text getActor__10dAttList_cFv */ fopAc_ac_c* dAttList_c::getActor() { return fopAcM_SearchByID(mActorID); } /* 80073898-800738B4 06E1D8 001C+00 3/3 0/0 0/0 .text setActor__10dAttList_cFP10fopAc_ac_c */ void dAttList_c::setActor(fopAc_ac_c* i_actor) { mActorID = fopAcM_GetID(i_actor); } /* 800738B4-800738CC 06E1F4 0018+00 1/1 0/0 0/0 .text getPId__10dAttHint_cFPv */ fpc_ProcID dAttHint_c::getPId(void* i_actor) { return fopAcM_GetID(i_actor); } /* 800738CC-800738FC 06E20C 0030+00 0/0 1/1 0/0 .text convPId__10dAttHint_cFUi */ fopAc_ac_c* dAttHint_c::convPId(fpc_ProcID i_id) { return fopAcM_SearchByID(i_id); } /* 800738FC-80073958 06E23C 005C+00 0/0 0/0 6/6 .text request__10dAttHint_cFP10fopAc_ac_ci */ int dAttHint_c::request(fopAc_ac_c* i_actor, int i_priority) { if (i_priority < 0) { i_priority = 0x1FF; } if (i_priority <= mPriority) { mHintActorID = getPId(i_actor); mPriority = i_priority; } return 1; } /* 80073958-80073970 06E298 0018+00 1/1 0/0 0/0 .text init__10dAttHint_cFv */ void dAttHint_c::init() { mHintActorID = fpcM_ERROR_PROCESS_ID_e; field_0x8 = fpcM_ERROR_PROCESS_ID_e; mPriority = 0x200; } /* 80073970-8007398C 06E2B0 001C+00 1/1 0/0 0/0 .text proc__10dAttHint_cFv */ void dAttHint_c::proc() { field_0x8 = mHintActorID; mHintActorID = fpcM_ERROR_PROCESS_ID_e; mPriority = 0x200; } /* 8007398C-800739BC 06E2CC 0030+00 0/0 4/4 0/0 .text convPId__11dAttCatch_cFUi */ fopAc_ac_c* dAttCatch_c::convPId(fpc_ProcID i_id) { return fopAcM_SearchByID(i_id); } /* 800739BC-800739DC 06E2FC 0020+00 1/1 0/0 0/0 .text init__11dAttCatch_cFv */ void dAttCatch_c::init() { mCatchItemNo = fpcNm_ITEM_WATER_BOTTLE; mRequestActorID = fpcM_ERROR_PROCESS_ID_e; mCatghTargetID = fpcM_ERROR_PROCESS_ID_e; field_0x4 = 3; } /* 800739DC-80073A08 06E31C 002C+00 1/1 0/0 0/0 .text proc__11dAttCatch_cFv */ void dAttCatch_c::proc() { mCatghTargetID = mRequestActorID; mChangeItem = mCatchItemNo; mRequestActorID = fpcM_ERROR_PROCESS_ID_e; field_0x4 = 3; mCatchItemNo = fpcNm_ITEM_WATER_BOTTLE; } // FAKEMATCH: this fixes regalloc in `dAttCatch_c::request` but breaks most other calls // some more accurate fix should be found eventually inline fopAc_ac_c* dComIfGp_getPlayer_fakematch(int idx) { daAlink_c* const link = (daAlink_c* const)g_dComIfG_gameInfo.play.getPlayer(idx); fopAc_ac_c* player = (fopAc_ac_c*)link; return player; } /* 80073A08-80073CA4 06E348 029C+00 0/0 0/0 10/10 .text * request__11dAttCatch_cFP10fopAc_ac_cUcfffsi */ int dAttCatch_c::request(fopAc_ac_c* i_reqActor, u8 i_itemNo, f32 i_horizontalDist, f32 i_upDist, f32 i_downDist, s16 i_angle, int param_7) { fopAc_ac_c* player = (fopAc_ac_c*)dComIfGp_getPlayer_fakematch(0); if (param_7 > field_0x4) { return 0; } cXyz vec_to_player = i_reqActor->attention_info.position - player->attention_info.position; if (vec_to_player.y < i_downDist || vec_to_player.y > i_upDist) { return 0; } f32 player_xz_dist = vec_to_player.absXZ(); if (player_xz_dist > i_horizontalDist) { return 0; } if (i_angle != 0) { cSGlobe globe(vec_to_player); csXyz* player_angle_p = fopAcM_GetShapeAngle_p(player); s16 angle = globe.U() - player_angle_p->y; if (angle < 0) { angle = -angle; } if (angle == -0x8000) { angle = 0x7fff; } if (angle > i_angle) { return 0; } } if (param_7 < field_0x4 || player_xz_dist < mDistance) { field_0x4 = param_7; mCatchItemNo = i_itemNo; mRequestActorID = fopAcM_GetID(i_reqActor); mDistance = player_xz_dist; return 1; } return 0; } /* 80073CA4-80073CD4 06E5E4 0030+00 0/0 1/1 0/0 .text convPId__10dAttLook_cFUi */ fopAc_ac_c* dAttLook_c::convPId(fpc_ProcID i_id) { return fopAcM_SearchByID(i_id); } /* 80073CD4-80073CEC 06E614 0018+00 1/1 0/0 0/0 .text init__10dAttLook_cFv */ void dAttLook_c::init() { mRequestActorID = fpcM_ERROR_PROCESS_ID_e; mLookTargetID = fpcM_ERROR_PROCESS_ID_e; field_0x4 = 3; } /* 80073CEC-80073D08 06E62C 001C+00 1/1 0/0 0/0 .text proc__10dAttLook_cFv */ void dAttLook_c::proc() { mLookTargetID = mRequestActorID; mRequestActorID = fpcM_ERROR_PROCESS_ID_e; field_0x4 = 3; } /* 80073D08-80073FC4 06E648 02BC+00 0/0 0/0 7/7 .text request__10dAttLook_cFP10fopAc_ac_cfffsi */ int dAttLook_c::request(fopAc_ac_c* i_reqActor, f32 i_horizontalDist, f32 i_upDist, f32 i_downDist, s16 i_angle, int param_6) { fopAc_ac_c* player = (fopAc_ac_c*)dComIfGp_getPlayer(0); if (param_6 > field_0x4) { return 0; } cXyz vec_to_player = i_reqActor->eyePos - player->eyePos; if (vec_to_player.y < i_downDist || vec_to_player.y > i_upDist) { return 0; } f32 player_xz_dist = vec_to_player.absXZ(); if (player_xz_dist > i_horizontalDist) { return 0; } if (i_angle != 0) { vec_to_player = i_reqActor->current.pos - player->current.pos; cSGlobe globe(vec_to_player); s16 angle = globe.U() - fopAcM_GetShapeAngle_p(player)->y; if (angle < 0) { angle = -angle; } if (angle == -0x8000) { angle = 0x7fff; } if (angle > i_angle) { return 0; } } if (param_6 < field_0x4 || player_xz_dist < mDistance) { field_0x4 = param_6; mRequestActorID = fopAcM_GetID(i_reqActor); mDistance = player_xz_dist; return 1; } return 0; }