tp/src/d/d_attention.cpp

1969 lines
62 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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(" 表示位置 ", &mDebugDispPosX, 0, 0x280, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genSlider(" ", &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;
}