tp/src/d/d_attention.cpp

1734 lines
52 KiB
C++

//
// Generated By: dol2asm
// Translation Unit: d/d_attention
//
#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 "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_controller_pad.h"
#define DRAW_TYPE_YELLOW 0
#define DRAW_TYPE_RED 1
class dAttDrawParam_c {
public:
/* 80070158 */ dAttDrawParam_c();
/* 80073FC4 */ virtual ~dAttDrawParam_c() {}
/* 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 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, 0x1},
{fopAc_attn_TALK_e, 0x2},
{fopAc_attn_BATTLE_e, 0x4},
};
/* 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, 0x8},
{fopAc_attn_CARRY_e, 0x10},
{fopAc_attn_DOOR_e, 0x20},
{fopAc_attn_JUEL_e, 0x40},
{fopAc_attn_ETC_e, 0x80},
};
/* 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;
l_isFinalBossStg = strcmp(dComIfGp_getStartStageName(), "D_MN09B") == 0;
}
/* 80070110-80070158 06AA50 0048+00 2/1 0/0 0/0 .text __dt__11dAttParam_cFv */
dAttParam_c::~dAttParam_c() {}
/* 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;
}
/* 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 *= 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;
mCheckObjectOffset = 0;
mActionOffset = 0;
mLockOnOffset = 0;
initList(0xFFFFFFFF);
mPlayerAttentionFlags = 0;
field_0x32a = 0;
mAttnStatus = 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[DRAW_TYPE_YELLOW] != 0);
draw[i].mModel[DRAW_TYPE_RED] = mDoExt_J3DModel__create(modelDataR, 0x80000, 0x11000285);
JUT_ASSERT(0x1D4, draw[i].mModel[DRAW_TYPE_RED] != 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 = -1;
}
/* 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;
}
}
/* 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);
if (list != NULL && list->getActor() != NULL &&
list->mType == fopAc_attn_TALK_e && LockonTruth() &&
!(list->getActor()->attention_info.flags & 0x2000000))
{
return list;
}
if (mActionCount == 0) {
return NULL;
}
for (i = 0; i < mActionCount; i++) {
if (mActionList[i].mType == fopAc_attn_SPEAK_e) {
if (!(mActionList[i].getActor()->attention_info.flags & 0x2000000)) {
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);
if (list != NULL && list->getActor() != NULL && list->mType == fopAc_attn_TALK_e && LockonTruth()) {
if (list->getActor()->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) {
if (mActionList[i].getActor()->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) {
for (int 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_SPEAK_e:
case fopAc_attn_TALK_e:
if (!(i_condition & dEvtCnd_CANTALK_e)) {
return true;
}
break;
case fopAc_attn_CARRY_e:
case fopAc_attn_BATTLE_e:
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, 0x100},
};
/* 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;
}
for (int i = 0; i < 3; i++) {
if (i_checkMask & ftp_table[i]) {
if (i_ang1 > ang_table[i]) {
return true;
}
}
}
for (int i = 8; i > 2; 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 tmp = i_angle / (f32)0x8000;
return i_distance * ((1.0f - i_ratio) + (i_ratio * (tmp * tmp)));
}
/* 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 tmp = i_angle / (f32)0x8000;
if (tmp < 0.0f) {
tmp = -tmp;
}
return i_distAdjust * ((1.0f - i_ratio) + (i_ratio * ((1.0f - tmp) * (1.0f - tmp))));
}
/* 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", 0x419);
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;
daPy_py_c* player = daPy_getPlayerActorClass();
if (player != NULL) {
if (i_actor == fopAcM_SearchByID(player->getGrabActorID())) {
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) {
u8 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;
s32 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:
case 'A':
max = 4;
list_count = &mActionCount;
list = mActionList;
break;
case 'C':
max = 4;
list_count = &mCheckObjectCount;
list = mCheckObjectList;
break;
}
f32 weight = 0.0f;
if (i_weight > weight) {
if (*list_count < max) {
maxIndex = *list_count;
(*list_count)++;
} else {
f32 maxWeight = weight;
s32 i = 0;
maxIndex = 0;
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;
}
return ((dAttention_c*)i_attention)->SelectAttention(i_actor);
}
/* 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 & 7) && !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 & 0xF8) {
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 & 0x100) {
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() {
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;
cSAngle a1;
a1 = g1.U() - fopAcM_GetShapeAngle_p(mpPlayer)->y;
cSGlobe g2(mOwnerAttnPos - actor->attention_info.position);
cSAngle a2;
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)) {
mLockOnList[offset].mWeight = distace_weight(g1.R(), a1.Val(), 0.5f);
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 & 7) != 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) {
f32 distance;
if (i_actor == mpPlayer || mpPlayer == NULL) {
distance = -1.0f;
} else if (fopAcM_GetProfName(i_actor) == PROC_ALINK) {
distance = -1.0f;
} else if (!(i_actor->attention_info.flags & 4) &&
!(i_actor->attention_info.flags & 0x4000000)) {
distance = -1.0f;
} else {
distance = fopAcM_searchActorDistance(mpPlayer, i_actor);
u8 tmp = i_actor->attention_info.distances[fopAc_attn_BATTLE_e];
if (distance < dist_table[tmp].mDistMax + dist_table[tmp].mDistanceAdjust) {
return distance;
}
distance = -1.0f;
}
return distance;
}
/* 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) {
f32 dist = ((dAttention_c*)i_attention)->EnemyDistance(i_actor);
if (dist < 0.0f) {
return 0;
}
if (dist < ((dAttention_c*)i_attention)->mEnemyDist) {
((dAttention_c*)i_attention)->mEnemyActorID = fopAcM_GetID(i_actor);
((dAttention_c*)i_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;
if (!chkFlag(0x80000000)) {
fopAcIt_Executor((fopAcIt_ExecutorFunc)sound_attention, this);
if (fopAcM_SearchByID(mEnemyActorID) != 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() {
if ((mFlags >> 3) & 1) {
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;
}
}
/* 800720F4-800720F8 06CA34 0004+00 1/1 0/0 0/0 .text runDebugDisp__12dAttention_cFv */
void dAttention_c::runDebugDisp() {}
/* 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() {
switch (mAttnStatus) {
case EState_NONE:
field_0x32f = 0;
field_0x32e = 0;
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
if (field_0x32b == 0 && triggerProc()) {
mAttnStatus = EState_LOCK;
field_0x32e = 15;
}
break;
case EState_LOCK:
mLockTargetID = LockonTargetPId(0);
field_0x32f = 0;
if (lostCheck()) {
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
if (triggerProc()) {
mAttnStatus = EState_LOCK;
} else {
mAttnStatus = EState_NONE;
freeAttention();
setFlag(0x800000);
}
} else if (field_0x32b == 4) {
mAttnStatus = EState_RELEASE;
setFlag(0x10);
field_0x32f = 10;
} else if (field_0x32e == 0) {
initList(0xFFFFFFFF);
if (makeList()) {
sortList();
}
}
if (field_0x32e != 0) {
field_0x32e--;
}
break;
case EState_RELEASE:
setFlag(0x40);
if (lostCheck()) {
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
if (triggerProc()) {
mAttnStatus = EState_LOCK;
} else {
mAttnStatus = EState_NONE;
freeAttention();
setFlag(0x800000);
}
} else if (field_0x32b == 0) {
if (nextAttention()) {
setFlag(0x8);
mAttnStatus = EState_LOCK;
field_0x32e = 15;
} else {
mAttnStatus = EState_NONE;
freeAttention();
}
} else if (LockonTarget(0) == NULL || field_0x32f == 0) {
mAttnStatus = EState_NONE;
freeAttention();
}
if (field_0x32f != 0) {
field_0x32f--;
}
break;
}
if (!chkFlag(0x1000)) {
setFlag(0x4000);
initList(0xFFFFFFFF);
if (makeList()) {
sortList();
}
}
}
/* 800725F0-80072924 06CF30 0334+00 1/1 0/0 0/0 .text judgementStatus4Switch__12dAttention_cFv */
void dAttention_c::judgementStatus4Switch() {
switch (mAttnStatus) {
case EState_NONE:
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
field_0x32f = 0;
field_0x32e = 0;
if (field_0x32b == 0 && triggerProc()) {
mAttnStatus = EState_LOCK;
field_0x32e = 15;
field_0x32f = 15;
}
break;
case EState_LOCK:
mLockTargetID = LockonTargetPId(0);
if (field_0x32f == 0) {
mAttnStatus = EState_NONE;
freeAttention();
} else if (lostCheck()) {
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
if (triggerProc()) {
mAttnStatus = EState_LOCK;
} else {
mAttnStatus = EState_NONE;
freeAttention();
setFlag(0x800000);
}
} else if (field_0x32b == 0) {
if (mDoCPd_c::getStickY(mPadNo) < -0.9f) {
mAttnStatus = EState_NONE;
freeAttention();
} else if (nextAttention()) {
setFlag(0x8);
mAttnStatus = EState_LOCK;
field_0x32e = 15;
} else {
mAttnStatus = EState_NONE;
freeAttention();
}
} else if (field_0x32e == 0) {
initList(0xFFFFFFFF);
if (makeList()) {
sortList();
}
}
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);
if (lostCheck()) {
mLockTargetID = fpcM_ERROR_PROCESS_ID_e;
stockAttention();
if (triggerProc()) {
mAttnStatus = EState_LOCK;
} else {
mAttnStatus = EState_NONE;
freeAttention();
setFlag(0x800000);
}
} else if (field_0x32b == 0) {
mAttnStatus = EState_NONE;
if (triggerProc()) {
mAttnStatus = EState_LOCK;
field_0x32e = 15;
field_0x32f = 15;
}
} else if (LockonTarget(0) == NULL || field_0x32f == 0) {
mAttnStatus = EState_NONE;
freeAttention();
}
break;
}
if (!chkFlag(0x1000)) {
setFlag(0x4000);
initList(0xFFFFFFFF);
if (makeList()) {
sortList();
}
}
}
/* 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 (mAttnBlockTimer != 0) {
mAttnBlockTimer--;
return 1;
}
if (chkFlag(0x80)) {
mpPlayer = (fopAc_ac_c*) dComIfGp_getPlayer(0);
mPadNo = PAD_1;
}
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 ((mFlags >> 0x17) & 1) {
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;
MTXInverse(dComIfGd_getViewRotMtx(), inv_m);
fopAc_ac_c* lockon_actor = LockonTarget(0);
if (!dComIfGp_event_runCheck()) {
if (lockon_actor != NULL) {
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) {
fopAc_ac_c* actor = mLockOnList[listIdx].getActor();
draw[1].draw(actor->attention_info.position, inv_m);
}
}
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);
}
}
}
}
/* 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 temp_f31 = tan(DEG_TO_RAD(0.5f * view->fovy));
f32 temp_f30 = (-100.0f - g_AttDwHIO.mCursorDistance) / temp_f31;
cXyz view_pos;
MTXMultVec(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);
}
mModel[mDrawType]->setBaseScale(cXyz(mCursorSizeX * size, mCursorSizeY * size, mCursorSizeX * size));
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 & 7)) {
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;
}