More miscellaneous TU improvements (#2665)

This commit is contained in:
Max Roncace
2025-09-17 08:01:59 -04:00
committed by GitHub
parent 2106c56f60
commit fe5e8aff98
33 changed files with 659 additions and 596 deletions
+4 -1
View File
@@ -391,7 +391,10 @@ void daAlink_c::setCrawlMoveAngle() {
}
mLinkGndChk.SetPos(&sp20);
sp2C.set(sp20.x - sp38.x, dComIfG_Bgsp().GroundCross(&mLinkGndChk) - sp38.y,
// dBgS::GroundCross is implicitly inlined to cBgS::GroundCross, but for some
// reason here that breaks the match. This is the only place in the code so
// far (September 2025) where it causes issues.
sp2C.set(sp20.x - sp38.x, ((cBgS&)dComIfG_Bgsp()).GroundCross(&mLinkGndChk) - sp38.y,
sp20.z - sp38.z);
if (cLib_distanceAngleS(sp2C.atan2sY_XZ(), shape_angle.x) > 0x800) {
+1 -1
View File
@@ -768,7 +768,7 @@ void daE_HP_c::executeDead() {
-1, 0, 0);
}
if (fopAcM_IsExecuting(field_0x784)) {
if (fopAcM_IsExecuting(field_0x784) != FALSE) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
if (player->eventInfo.chkCondition(8)) {
field_0x778 =
+26 -21
View File
@@ -199,8 +199,8 @@ static u8 l_initHIO;
static daE_PZ_HIO_c l_HIO;
/* 80761E29 0003+00 data_80761E29 None */
static u8 data_80761E28;
static u8 data_80761E29;
static u8 lbl_222_bss_70;
static u8 lbl_222_bss_71;
/* 80758A94-80758BA0 000614 010C+00 3/3 0/0 0/0 .text mPzScaleSet__8daE_PZ_cFb */
bool daE_PZ_c::mPzScaleSet(bool param_0) {
@@ -481,6 +481,7 @@ void daE_PZ_c::executeOpeningDemo() {
cXyz sp108;
cXyz spFC;
f32 var_f31 = 0.0f;
fopAc_ac_c* parent;
int sp28 = 22;
@@ -645,11 +646,11 @@ void daE_PZ_c::executeOpeningDemo() {
if (mAnm != 0xD) {
setBck(0xD, 2, 3.0f, 1.0f);
parentActorID = fopAcM_createChild(PROC_E_PZ, fopAcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
// fakematch, fpcM_GetID should be fopAcM_GetID
parentActorID = fopAcM_createChild(PROC_E_PZ, fpcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
}
field_0x7d8 = 0;
data_80761E29 = 0;
lbl_222_bss_71 = field_0x7d8 = 0;
if (field_0x7d0 == 0) {
field_0x7d0 = 120;
@@ -743,9 +744,8 @@ void daE_PZ_c::executeOpeningDemo() {
}
break;
case 130:
field_0x7d8 = 2;
data_80761E29 = 2;
data_80761E28 = 0;
lbl_222_bss_71 = field_0x7d8 = 2;
lbl_222_bss_70 = 0;
case 30:
if (!eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 3);
@@ -764,11 +764,13 @@ void daE_PZ_c::executeOpeningDemo() {
sp120.set(mPzCenterInit_dt[7]);
sp108 = mDemoCameraCenter - sp120;
cLib_addCalcPos(&mDemoCameraCenter, sp120, 0.7f, sp108.abs() / 20.0f, 1.0f);
var_f31 = sp108.abs() / 20.0f;
cLib_addCalcPos(&mDemoCameraCenter, sp120, 0.7f, var_f31, 1.0f);
sp114.set(mPzEyeInit_dt[7]);
spFC = mDemoCameraEye - sp114;
cLib_addCalcPos(&mDemoCameraEye, sp114, 0.7f, spFC.abs() / 20.0f, 1.0f);
var_f31 = spFC.abs() / 20.0f;
cLib_addCalcPos(&mDemoCameraEye, sp114, 0.7f, var_f31, 1.0f);
if (field_0x7d0 == 0) {
if (fopAcM_SearchByID(parentActorID, &parent) && parent != NULL) {
@@ -851,7 +853,7 @@ void daE_PZ_c::executeOpeningDemo() {
if (field_0x7d7 != 0) {
if (field_0x7d7 == 1) {
data_80761E28 = 1;
lbl_222_bss_70 = 1;
mDemoCameraCenter.set(mPzCenterInit_dt[17]);
mDemoCameraEye.set(mPzEyeInit_dt[17]);
@@ -956,11 +958,13 @@ void daE_PZ_c::executeOpeningDemo() {
case 106:
sp120.set(mPzCenterInit_dt[12]);
sp108 = mDemoCameraCenter - sp120;
cLib_addCalcPos(&mDemoCameraCenter, sp120, 0.7f, sp108.abs() / 10.0f, 1.0f);
var_f31 = sp108.abs() / 10.0f;
cLib_addCalcPos(&mDemoCameraCenter, sp120, 0.7f, var_f31, 1.0f);
sp114.set(mPzEyeInit_dt[12]);
spFC = mDemoCameraEye - sp114;
cLib_addCalcPos(&mDemoCameraEye, sp114, 0.7f, spFC.abs() / 10.0f, 1.0f);
var_f31 = spFC.abs() / 10.0f;
cLib_addCalcPos(&mDemoCameraEye, sp114, 0.7f, var_f31, 1.0f);
if (field_0x7d0 != 0 || sp108.abs() > 2.0f || spFC.abs() > 2.0f) {
break;
@@ -998,10 +1002,10 @@ void daE_PZ_c::executeOpeningDemo() {
case 109:
if (mAnm == 0xB && mpModelMorf->isStop()) {
setBck(0xD, 2, 3.0f, 1.0f);
parentActorID = fopAcM_createChild(PROC_E_PZ, fopAcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
// fakematch, fpcM_GetID should be fopAcM_GetID
parentActorID = fopAcM_createChild(PROC_E_PZ, fpcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
field_0x7d8 = 2;
data_80761E29 = 2;
lbl_222_bss_71 = field_0x7d8 = 2;
}
if (mAnm != 0xB && mAnm != 0xD) {
@@ -1147,11 +1151,12 @@ void daE_PZ_c::executeOpeningDemo() {
} else {
daPy_getPlayerActorClass()->changeDemoMode(0x17, 1, 0, 0);
}
mDemoCameraCenter.set(mPzCenterInit_dt[3]);
mDemoCameraEye.set(mPzEyeInit_dt[4]);
parentActorID = fopAcM_createChild(PROC_E_PZ, fopAcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
// fakematch, fpcM_GetID should be fopAcM_GetID
parentActorID = fopAcM_createChild(PROC_E_PZ, fpcM_GetID(this), sp28 + arg0, &field_0x7a8, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL);
setBck(0xC, 0, 10.0f, 1.0f);
daPy_getPlayerActorClass()->changeDemoMode(0x10, 0, 0, 0);
@@ -1447,7 +1452,7 @@ void daE_PZ_c::executeAttack() {
}
var_r27++;
if (data_80761E29 != var_r28) {
if (lbl_222_bss_71 != var_r28) {
field_0x7d8 = var_r28;
var_r27 = 100;
}
@@ -1967,7 +1972,7 @@ void daE_PZ_c::executeSummonsBullet() {
if (((daE_PZ_c*)sp8C)->field_0x7dc[field_0x7d7] == 0) {
sp84 = BIRTH_DT[((daE_PZ_c*)sp8C)->field_0x7d8].parameters;
data_80761E29 = ((daE_PZ_c*)sp8C)->field_0x7d8;
lbl_222_bss_71 = ((daE_PZ_c*)sp8C)->field_0x7d8;
if (((daE_PZ_c*)sp8C)->field_0x7d8 == 2) {
sp84 |= field_0x7d7 << 8;
@@ -2062,7 +2067,7 @@ void daE_PZ_c::executeSummonsBullet() {
if (((daE_PZ_c*)sp88)->field_0x841 != 0) {
field_0x7d7 = 1;
if (data_80761E28 == 0) {
if (lbl_222_bss_70 == 0) {
break;
}
+144 -116
View File
@@ -179,6 +179,15 @@ static int l_bmdData[6][2] = {
{BMDR_LEAF, YKM3},
};
enum BmdIndex {
BMD_INDEX_YKM,
BMD_INDEX_YKM_TOMATO,
BMD_INDEX_YKM_LEAF,
BMD_INDEX_YKM_CHEESE,
BMD_INDEX_FISH,
BMD_INDEX_LEAF,
};
/* 80B5DB38-80B5DB88 -00001 0050+00 0/1 0/0 0/0 .data l_evtList */
static daNpcT_evtData_c l_evtList[10] = {
{"", 0},
@@ -547,21 +556,26 @@ cPhs__Step daNpc_ykM_c::create() {
/* 80B53990-80B53F00 000590 0570+00 1/1 0/0 0/0 .text CreateHeap__11daNpc_ykM_cFv */
int daNpc_ykM_c::CreateHeap() {
// NONMATCHING
J3DModelData* mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[mTwilight ? 0 : 1][1]],
l_bmdData[mTwilight ? 0 : 1][0]);
void* mdlData_p = NULL;
J3DModel* model = NULL;
int sp40 = mTwilight == 1 ? BMD_INDEX_YKM : BMD_INDEX_YKM;
int arcNameIdx = l_bmdData[sp40][1];
int resIndex = l_bmdData[sp40][0];
mdlData_p = dComIfG_getObjectRes(l_resNameList[arcNameIdx], resIndex);
if (mdlData_p == NULL) {
return 1;
}
mpMorf[0] = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, 0x11020284);
int sp34 = 0x11020284;
mpMorf[0] = new mDoExt_McaMorfSO((J3DModelData*)mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, sp34);
if (mpMorf[0] == NULL || mpMorf[0]->getModel() == NULL) {
return 0;
}
J3DModel* model = mpMorf[0]->getModel();
for (u16 i = 0; i < mdlData_p->getJointNum(); i++) {
mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack);
model = mpMorf[0]->getModel();
for (u16 i = 0; i < ((J3DModelData*)mdlData_p)->getJointNum(); i++) {
((J3DModelData*)mdlData_p)->getJointNodePointer(i)->setCallBack(ctrlJointCallBack);
}
model->setUserArea((uintptr_t)this);
@@ -570,66 +584,74 @@ int daNpc_ykM_c::CreateHeap() {
return 0;
}
static int const bmdTypeList[3] = {1, 2, 3};
static BmdIndex const bmdTypeList[3] = {BMD_INDEX_YKM_TOMATO, BMD_INDEX_YKM_LEAF, BMD_INDEX_YKM_CHEESE};
switch (mType) {
case TYPE_COOK:
for (int i = 0; i < 3; i++) {
if (l_bmdData[bmdTypeList[i]][0] >= 0) {
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[i]][1]], l_bmdData[bmdTypeList[i]][0]);
} else {
mdlData_p = NULL;
}
// field_0xe4c holds a Pumpkin, Leaf, and Cheese model (in that order)
if (mdlData_p != NULL) {
field_0xe4c[i] = mDoExt_J3DModel__create(mdlData_p, 0x80000, 0x11000084);
} else {
field_0xe4c[i] = NULL;
}
}
break;
case TYPE_2:
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[4][1]], l_bmdData[4][0]);
JUT_ASSERT(1595, 0 != mdlData_p);
mFishModelMorf = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1,
NULL, 0x80000, 0x11000084);
if (mFishModelMorf == NULL || mFishModelMorf->getModel() == NULL) {
return 0;
}
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[5][1]], l_bmdData[5][0]);
JUT_ASSERT(1622, 0 != mdlData_p);
mLeafModelMorf = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1,
NULL, 0x80000, 0x11000084);
if (mLeafModelMorf == NULL || mLeafModelMorf->getModel() == NULL) {
return 0;
}
setLeafAnm(ANM_LEAF_WAIT_A, 0.0f);
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[1]][1]], l_bmdData[bmdTypeList[1]][0]);
if (mdlData_p != NULL) {
field_0xe4c[1] = mDoExt_J3DModel__create(mdlData_p, 0x80000, 0x11000084);
case TYPE_COOK:
for (int i = 0; i < 3; i++) {
if (l_bmdData[bmdTypeList[i]][0] >= 0) {
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[i]][1]], l_bmdData[bmdTypeList[i]][0]);
} else {
field_0xe4c[1] = NULL;
mdlData_p = NULL;
}
break;
case TYPE_3:
break;
case TYPE_4:
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[1]][1]], l_bmdData[bmdTypeList[1]][0]);
// field_0xe4c holds a Pumpkin, Leaf, and Cheese model (in that order)
if (mdlData_p != NULL) {
field_0xe4c[1] = mDoExt_J3DModel__create(mdlData_p, 0x80000, 0x11000084);
field_0xe4c[i] = mDoExt_J3DModel__create((J3DModelData*)mdlData_p, 0x80000, 0x11000084);
} else {
field_0xe4c[1] = NULL;
field_0xe4c[i] = NULL;
}
break;
}
break;
case TYPE_2:
sp40 = BMD_INDEX_FISH;
arcNameIdx = l_bmdData[sp40][1];
resIndex = l_bmdData[sp40][0];
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[arcNameIdx], resIndex);
JUT_ASSERT(1595, 0 != mdlData_p);
sp34 = 0x11000084;
mFishModelMorf = new mDoExt_McaMorfSO((J3DModelData*)mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1,
NULL, 0x80000, sp34);
if (mFishModelMorf == NULL || mFishModelMorf->getModel() == NULL) {
return 0;
}
sp40 = BMD_INDEX_LEAF;
arcNameIdx = l_bmdData[BMD_INDEX_LEAF][1];
resIndex = l_bmdData[BMD_INDEX_LEAF][0];
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[arcNameIdx], resIndex);
JUT_ASSERT(1622, 0 != mdlData_p);
sp34 = 0x11000084;
mLeafModelMorf = new mDoExt_McaMorfSO((J3DModelData*)mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1,
NULL, 0x80000, sp34);
if (mLeafModelMorf == NULL || mLeafModelMorf->getModel() == NULL) {
return 0;
}
setLeafAnm(ANM_LEAF_WAIT_A, 0.0f);
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[1]][1]], l_bmdData[bmdTypeList[1]][0]);
if (mdlData_p != NULL) {
field_0xe4c[1] = mDoExt_J3DModel__create((J3DModelData*)mdlData_p, 0x80000, 0x11000084);
} else {
field_0xe4c[1] = NULL;
}
break;
case TYPE_3:
break;
case TYPE_4:
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[bmdTypeList[1]][1]], l_bmdData[bmdTypeList[1]][0]);
if (mdlData_p != NULL) {
field_0xe4c[1] = mDoExt_J3DModel__create((J3DModelData*)mdlData_p, 0x80000, 0x11000084);
} else {
field_0xe4c[1] = NULL;
}
break;
}
if (setFaceMotionAnm(1, false) && setMotionAnm(0, 0.0f, FALSE)) {
@@ -864,8 +886,8 @@ BOOL daNpc_ykM_c::isDelete() {
}
/* 80B548A8-80B54B44 0014A8 029C+00 1/1 0/0 0/0 .text reset__11daNpc_ykM_cFv */
// NONMATCHING - m_nextID load issue, regalloc
void daNpc_ykM_c::reset() {
// NONMATCHING
csXyz angle;
int iVar1 = (u8*)&field_0x1588 - (u8*)&mpNextAction;
@@ -878,7 +900,7 @@ void daNpc_ykM_c::reset() {
}
memset(&mpNextAction, 0, iVar1);
if (getPathID() != 0xFF) {
mPath.initialize();
mPath.setPathInfo(getPathID(), fopAcM_GetRoomNo(this), 0);
@@ -894,6 +916,8 @@ void daNpc_ykM_c::reset() {
angle.y = home.angle.y;
switch (mType) {
case TYPE_COOK:
break;
case TYPE_2:
field_0x1568 = -20.0f;
field_0x1579 = 1;
@@ -1277,8 +1301,9 @@ void daNpc_ykM_c::afterMoved() {
}
/* 80B55A64-80B560B4 002664 0650+00 1/0 0/0 0/0 .text setAttnPos__11daNpc_ykM_cFv */
// NONMATCHING - HIO load issue
void daNpc_ykM_c::setAttnPos() {
// NONMATCHING
fopAc_ac_c* otherYkmP = NULL;
cXyz sp104(80.0f, 30.0f, 0.0f);
cXyz sp110(80.0f, 0.0f, 0.0f);
@@ -1291,25 +1316,26 @@ void daNpc_ykM_c::setAttnPos() {
}
f32 fVar1 = cM_s2rad((s16)(mCurAngle.y - field_0xd7e.y));
f32 fVar2 = field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleY_max;
f32 fVar3 = field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleY_min;
f32 fVar4 = field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleX_max;
f32 fVar5 = field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleX_min;
f32 fVar6 = field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleY_max;
f32 fVar7 = field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleY_min;
f32 fVar8 = field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleX_max;
f32 fVar9 = field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleX_min;
J3DModel* model = mpMorf[0]->getModel();
mJntAnm.setParam(this, model, &sp104, getBackboneJointNo(), getNeckJointNo(), getHeadJointNo(), fVar9, fVar8, fVar7, fVar6, fVar5, fVar4, fVar3,
fVar2, daNpc_ykM_Param_c::m.common.neck_rotation_ratio, fVar1, &sp110);
mJntAnm.setParam(this, mpMorf[0]->getModel(), &sp104,
getBackboneJointNo(), getNeckJointNo(), getHeadJointNo(),
field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleX_min,
field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleX_max,
field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleY_min,
field_0x1575 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.body_angleY_max,
field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleX_min,
field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleX_max,
field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleY_min,
field_0x1574 != 0 ? 0.0f : daNpc_ykM_Param_c::m.common.head_angleY_max,
daNpc_ykM_Param_c::m.common.neck_rotation_ratio, fVar1, &sp110);
if (mJntAnm.getMode() == daNpcT_JntAnm_c::LOOK_MODE_8) {
mJntAnm.calcJntRad(0.1f, 1.0f, fVar1);
} else {
mJntAnm.calcJntRad(0.2f, 1.0f, fVar1);
}
model = mpMorf[0]->getModel();
J3DModel* model = mpMorf[0]->getModel();
J3DModelData* modelData = model->getModelData();
cXyz sp11c(current.pos);
sp11c.y += field_0x1568;
mDoMtx_stack_c::transS(sp11c);
@@ -1336,7 +1362,7 @@ void daNpc_ykM_c::setAttnPos() {
mDoMtx_stack_c::multVecZero(&sp128);
Mtx mtx;
MTXCopy(mDoMtx_stack_c::get(), mtx);
cMtx_copy(mDoMtx_stack_c::get(), mtx);
mFishModelMorf->getModel()->setBaseTRMtx(mtx);
mFishModelMorf->modelCalc();
@@ -1348,7 +1374,7 @@ void daNpc_ykM_c::setAttnPos() {
if (mLeafModelMorf != NULL) {
mLeafModelMorf->play(0, 0);
fopAc_ac_c* otherYkmP = getOtherYkmP(5);
otherYkmP = getOtherYkmP(5);
if (otherYkmP != NULL) {
mDoMtx_stack_c::transS(otherYkmP->current.pos);
mDoMtx_stack_c::ZXYrotM(otherYkmP->shape_angle);
@@ -2042,7 +2068,7 @@ int daNpc_ykM_c::cutGetTomatoPuree(int i_cutIndex) {
}
}
int iVar2[2] = {0, -1};
int iVar2[2] = {-1, -1};
daObj_Gadget_c* actor_p;
f32 fVar1;
int iVar1;
@@ -2260,7 +2286,7 @@ int daNpc_ykM_c::cutGetTaste(int i_cutIndex) {
break;
}
}
int iVar2[2] = {0, -1};
int iVar2[2] = {-1, -1};
daObj_Gadget_c* actor_p;
f32 fVar1;
int iVar1;
@@ -2397,8 +2423,7 @@ int daNpc_ykM_c::cutGetTaste(int i_cutIndex) {
/* 80B58A38-80B59500 005638 0AC8+00 1/0 0/0 0/0 .text cutLv5DungeonClear__11daNpc_ykM_cFi */
int daNpc_ykM_c::cutLv5DungeonClear(int i_cutIndex) {
// NONMATCHING
daPy_py_c* player = daPy_getPlayerActorClass();
daPy_py_c* player = (daPy_py_c*)daPy_getPlayerActorClass();
cXyz work;
int rv = 0;
int prm = -1;
@@ -2415,6 +2440,8 @@ int daNpc_ykM_c::cutLv5DungeonClear(int i_cutIndex) {
}
fopAc_ac_c* actor_p;
s16 sVar1;
s16 angleY;
if (dComIfGp_getEventManager().getIsAddvance(i_cutIndex)) {
switch (prm) {
case 0:
@@ -2429,7 +2456,8 @@ int daNpc_ykM_c::cutLv5DungeonClear(int i_cutIndex) {
mMotionSeqMngr.setNo(MOTION_RUN, -1.0f, FALSE, 0);
mSound.startCreatureVoice(Z2SE_YKM_V_DASH, -1);
mEventTimer = timer;
daPy_getPlayerActorClass()->setPlayerPosAndAngle(&player->current.pos, fopAcM_searchActorAngleY(player, this), 0);
angleY = fopAcM_searchActorAngleY(player, this);
((daPy_py_c*)daPy_getPlayerActorClass())->setPlayerPosAndAngle(&player->current.pos, angleY, 0);
dComIfGp_getEvent().setPt2(this);
break;
@@ -2525,7 +2553,6 @@ int daNpc_ykM_c::cutLv5DungeonClear(int i_cutIndex) {
}
int iVar2[2] = {-1, -1};
s16 sVar1;
switch (prm) {
case 0:
rv = 1;
@@ -2967,8 +2994,8 @@ static u8 const lit_7385[8] = {
/* 80B5A128-80B5A224 006D28 00FC+00 1/1 0/0 0/0 .text setDialogueMotion__11daNpc_ykM_cFv */
void daNpc_ykM_c::setDialogueMotion() {
// NONMATCHING
u32 uVar1 = field_0x154c >> 1;
int uVar1 = field_0x154c;
uVar1 >>= 1;
if (0.5f < cM_rnd()) {
if (cM_rnd() - 0.5f < 0.0f) {
@@ -3319,7 +3346,6 @@ BOOL daNpc_ykM_c::cook(void* param_1) {
/* 80B5B260-80B5BE08 007E60 0BA8+00 2/0 0/0 0/0 .text race__11daNpc_ykM_cFPv */
BOOL daNpc_ykM_c::race(void* param_1) {
// NONMATCHING
cXyz work;
fopAc_ac_c* actors[2] = {this, daPy_getPlayerActorClass()};
s16 sVar1;
@@ -3397,7 +3423,8 @@ BOOL daNpc_ykM_c::race(void* param_1) {
}
if (field_0x157e == 0) {
do {
int idx;
while (true) {
if (mPath.chkPassed1(current.pos, mPath.getNumPnts())) {
if (mPath.getArg0() == 0) {
mSound.startCreatureSound(Z2SE_YM_SNOBO_JUMP, 0, -1);
@@ -3408,46 +3435,47 @@ BOOL daNpc_ykM_c::race(void* param_1) {
if (mPath.setNextIdx(mPath.getNumPnts()) != 0) {
field_0x1585 = 1;
mMotionSeqMngr.setNo(MOTION_SB_GOAL, -1.0f, FALSE, 0);
break;
}
}
} else {
if (field_0x157e == 0) {
continue;
}
int idx;
if (field_0x157e != 0) {
if (!mStagger.checkStagger()) {
mMotionSeqMngr.setNo(MOTION_SB_JUMP_A, -1.0f, FALSE, 0);
}
if (!mStagger.checkStagger()) {
mMotionSeqMngr.setNo(MOTION_SB_JUMP_A, -1.0f, FALSE, 0);
}
field_0x1514 = current.pos;
field_0x1514 = current.pos;
idx = mPath.getIdx();
field_0x1520 = mPath.getPntPos(idx);
current.angle.y = cLib_targetAngleY(&field_0x1514, &field_0x1520);
int iVar3 = (int)((field_0x1520 - field_0x1514).absXZ() / speedF) + 1;
speed.y = (field_0x1520.y - field_0x1514.y) + fabsf(gravity) * iVar3 * iVar3 * 0.5f;
speed.y /= iVar3;
}
} else {
idx = mPath.getIdx();
field_0x1520 = mPath.getPntPos(idx);
current.angle.y = cLib_targetAngleY(&field_0x1514, &field_0x1520);
int iVar3 = (int)((field_0x1520 - field_0x1514).absXZ() / speedF) + 1;
speed.y = (field_0x1520.y - field_0x1514.y) + iVar3 * iVar3 * fabsf(gravity) * 0.5f;
speed.y /= iVar3;
work = mPath.getPntPos(idx);
}
idx = mPath.getIdx();
work = mPath.getPntPos(idx);
break;
} while (field_0x157e == 0);
}
}
if (field_0x1585 == 0 && field_0x157e == 0) {
current.angle.y = cLib_targetAngleY(&current.pos, &work);
s16 angleY = cLib_targetAngleY(&current.pos, &work);
current.angle.y = angleY;
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 8, 0x100);
mCurAngle.y = shape_angle.y;
if (!mStagger.checkStagger() && (mMotionSeqMngr.getNo() != MOTION_SB_JUMP_C || mMotionSeqMngr.checkEndSequence())) {
int sVar2 = sVar1 - mCurAngle.y;
if (0.0f < cM_sht2d(sVar2)) {
if (4.0f < cM_sht2d(sVar2)) {
angleY -= mCurAngle.y;
if (0.0f < cM_sht2d(angleY)) {
if (4.0f < cM_sht2d(angleY)) {
mMotionSeqMngr.setNo(MOTION_SB_TURNL, 24.0f, FALSE, 0);
} else {
mMotionSeqMngr.setNo(MOTION_SB_WAIT, 24.0f, FALSE, 0);
}
} else {
if (cM_sht2d(sVar2) < -4.0f) {
if (cM_sht2d(angleY) < -4.0f) {
mMotionSeqMngr.setNo(MOTION_SB_TURNR, 24.0f, FALSE, 0);
} else {
mMotionSeqMngr.setNo(MOTION_SB_WAIT, 24.0f, FALSE, 0);
@@ -3455,9 +3483,9 @@ BOOL daNpc_ykM_c::race(void* param_1) {
}
}
s16 sVar3 = -fopAcM_getPolygonAngle(mGndChk, current.angle.y + 0x4000);
angleY = -fopAcM_getPolygonAngle(mGndChk, current.angle.y + 0x4000);
cLib_addCalcAngleS2(&mCurAngle.x, mGroundAngle, 6, 0x200);
cLib_addCalcAngleS2(&mCurAngle.z, sVar3, 6, 0x200);
cLib_addCalcAngleS2(&mCurAngle.z, angleY, 6, 0x200);
int iVar1 = field_0x1560 - field_0x1558.field_0x0;
f32 fVar2 = daNpc_ykM_Param_c::m.slide_speed * cM_scos(mGroundAngle);
@@ -3472,9 +3500,10 @@ BOOL daNpc_ykM_c::race(void* param_1) {
field_0x1540 = 8;
}
int iVar2 = cLib_minMaxLimit<int>(iVar1 + daNpc_ykM_Param_c::m.competition_prm_a, 0, daNpc_ykM_Param_c::m.competition_prm_b);
iVar1 += daNpc_ykM_Param_c::m.competition_prm_a;
int iVar2 = cLib_minMaxLimit<int>(iVar1, 0, daNpc_ykM_Param_c::m.competition_prm_b);
if (iVar2 > 0) {
fVar2 *= daNpc_ykM_Param_c::m.competition_prm_c * 0.1f * abs(iVar2) + 1.0f;
fVar2 *= abs(iVar2) * 0.1f * daNpc_ykM_Param_c::m.competition_prm_c + 1.0f;
}
}
@@ -3561,7 +3590,6 @@ BOOL daNpc_ykM_c::talk(void* param_1) {
#ifdef DEBUG
BOOL daNpc_ykM_c::test(void* param_1) {
// NONMATCHING
switch (mMode) {
case 1:
speedF = 0.0f;
+24 -21
View File
@@ -408,21 +408,20 @@ f32 dummy_1f() {
}
/* 80B5F34C-80B5F5C8 00052C 027C+00 1/1 0/0 0/0 .text CreateHeap__11daNpc_ykW_cFv */
// NONMATCHING - regalloc
int daNpc_ykW_c::CreateHeap() {
J3DModelData* modelData = NULL;
void* mdlData_p = NULL;
J3DModel* model = NULL;
int bmdDataIdx = 0;
int arcNameIdx = l_bmdData[bmdDataIdx][1];
int resIndex = l_bmdData[bmdDataIdx][0];
modelData = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[arcNameIdx], resIndex);
if (modelData == NULL) {
mdlData_p = dComIfG_getObjectRes(l_resNameList[arcNameIdx], resIndex);
if (mdlData_p == NULL) {
return 0;
}
int temp1 = 0x11020284;
mpMorf[0] = new mDoExt_McaMorfSO(modelData, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound,
mpMorf[0] = new mDoExt_McaMorfSO((J3DModelData*)mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound,
0x80000, temp1);
if (mpMorf[0] == NULL || mpMorf[0]->getModel() == NULL) {
@@ -434,8 +433,8 @@ int daNpc_ykW_c::CreateHeap() {
}
model = mpMorf[0]->getModel();
for (u16 i = 0; i < modelData->getJointNum(); i++) {
modelData->getJointNodePointer(i)->setCallBack(ctrlJointCallBack);
for (u16 i = 0; i < ((J3DModelData*)mdlData_p)->getJointNum(); i++) {
((J3DModelData*)mdlData_p)->getJointNodePointer(i)->setCallBack(ctrlJointCallBack);
}
model->setUserArea((uintptr_t)this);
@@ -992,7 +991,7 @@ void daNpc_ykW_c::afterMoved() {
}
/* 80B60F08-80B614D0 0020E8 05C8+00 1/0 0/0 0/0 .text setAttnPos__11daNpc_ykW_cFv */
// NONMATCHING - HIO load issue
// NONMATCHING - HIO load issue, regalloc
void daNpc_ykW_c::setAttnPos() {
cXyz unkXyz1(0.0f, 50.0f, 0.0f);
if (field_0x106a != 0) {
@@ -2790,7 +2789,6 @@ int daNpc_ykW_c::walk(void* param_0) {
}
/* 80B6591C-80B6640C 006AFC 0AF0+00 2/0 0/0 0/0 .text race__11daNpc_ykW_cFPv */
// NONMATCHING - multiple issues
int daNpc_ykW_c::race(void* param_0) {
int unkInt1;
s16 targetAngleY;
@@ -2878,8 +2876,8 @@ int daNpc_ykW_c::race(void* param_0) {
field_0x106e = 0;
}
do {
if (field_0x106e == 0) {
if (field_0x106e == 0) {
while (true) {
if (mPath.chkPassed1(current.pos, mPath.getNumPnts())) {
if (mPath.getArg0() == 0) {
mSound.startCreatureSound(Z2SE_YW_SNOBO_JUMP, 0, -1);
@@ -2890,7 +2888,11 @@ int daNpc_ykW_c::race(void* param_0) {
field_0x1064 = 1;
field_0x1065 = 1;
mMotionSeqMngr.setNo(32, -1.0f, 0, 0);
} else if (field_0x106e != 0) {
} else {
if (field_0x106e == 0) {
continue;
}
if (!mStagger.checkStagger()) {
mMotionSeqMngr.setNo(25, -1.0f, 0, 0);
}
@@ -2908,10 +2910,11 @@ int daNpc_ykW_c::race(void* param_0) {
idx = mPath.getIdx();
unkXyz1 = mPath.getPntPos(idx);
}
break;
}
} while (field_0x1064 == 0);
}
if (field_0x106e == 0) {
if (field_0x1064 == 0 && field_0x106e == 0) {
targetAngleY = cLib_targetAngleY(&current.pos, &unkXyz1);
current.angle.y = targetAngleY;
cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 4, 0x200);
@@ -2935,20 +2938,20 @@ int daNpc_ykW_c::race(void* param_0) {
targetAngleY = -fopAcM_getPolygonAngle(mGndChk, (s16)(current.angle.y + 0x4000));
cLib_addCalcAngleS2(&mCurAngle.x, mGroundAngle, 6, 0x200);
cLib_addCalcAngleS2(&mCurAngle.z, targetAngleY, 6, 0x200);
unkInt1 = field_0x104c - field_0x1044.field_0x0;
int unkInt2 = field_0x104c - field_0x1044.field_0x0;
unkFloat1 = HIO_PARAM(this)->mSlidingSpeed * cM_scos(mGroundAngle);
if (mStagger.checkStagger()) {
unkFloat1 *= 0.0f;
} else {
unkInt1 += HIO_PARAM(this)->mCompetParamA;
unkInt1 = cLib_minMaxLimit<int>(unkInt1, 0, HIO_PARAM(this)->mCompetParamB);
if (unkInt1 > 0) {
unkFloat1 *= (f32)abs(unkInt1) * 0.1f * HIO_PARAM(this)->mCompetParamC + 1.0f;
unkInt2 += HIO_PARAM(this)->mCompetParamA;
unkInt2 = cLib_minMaxLimit<int>(unkInt2, 0, HIO_PARAM(this)->mCompetParamB);
if (unkInt2 > 0) {
unkFloat1 *= (f32)abs(unkInt2) * 0.1f * HIO_PARAM(this)->mCompetParamC + 1.0f;
}
}
cLib_chaseF(&speedF, unkFloat1, HIO_PARAM(this)->mSlidingAccel);
mSound.startCreatureSound(Z2SE_YW_SNOBO_RIDE, speedF, -1);
mSound.startCreatureVoice(Z2SE_YW_V_SNOBO_RIDING, -1);
mSound.startCreatureSoundLevel(Z2SE_YW_SNOBO_RIDE, speedF, -1);
mSound.startCreatureVoiceLevel(Z2SE_YW_V_SNOBO_RIDING, -1);
}
}
attention_info.flags = 0;
+2 -171
View File
@@ -9,6 +9,7 @@
#include "SSystem/SComponent/c_math.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "Z2AudioLib/Z2Instances.h"
#include "f_op/f_op_actor_mng.h"
#include "f_op/f_op_kankyo_mng.h"
#include "d/d_com_inf_game.h"
@@ -2402,177 +2403,7 @@ static int daNpc_zrA_IsDelete(void* i_this) {
#include "d/actor/d_a_npc_zra.inc"
/* ############################################################################################## */
/* 80B8DAB4-80B8DAB8 000074 0004+00 0/0 0/0 0/0 .bss
* sInstance__40JASGlobalInstance<19JASDefaultBankTable> */
#pragma push
#pragma force_active on
static u8 data_80B8DAB4[4];
#pragma pop
/* 80B8DAB8-80B8DABC 000078 0004+00 0/0 0/0 0/0 .bss
* sInstance__35JASGlobalInstance<14JASAudioThread> */
#pragma push
#pragma force_active on
static u8 data_80B8DAB8[4];
#pragma pop
/* 80B8DABC-80B8DAC0 00007C 0004+00 0/0 0/0 0/0 .bss sInstance__27JASGlobalInstance<7Z2SeMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DABC[4];
#pragma pop
/* 80B8DAC0-80B8DAC4 000080 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8Z2SeqMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DAC0[4];
#pragma pop
/* 80B8DAC4-80B8DAC8 000084 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SceneMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DAC4[4];
#pragma pop
/* 80B8DAC8-80B8DACC 000088 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2StatusMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DAC8[4];
#pragma pop
/* 80B8DACC-80B8DAD0 00008C 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2DebugSys>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DACC[4];
#pragma pop
/* 80B8DAD0-80B8DAD4 000090 0004+00 0/0 0/0 0/0 .bss
* sInstance__36JASGlobalInstance<15JAISoundStarter> */
#pragma push
#pragma force_active on
static u8 data_80B8DAD0[4];
#pragma pop
/* 80B8DAD4-80B8DAD8 000094 0004+00 0/0 0/0 0/0 .bss
* sInstance__35JASGlobalInstance<14Z2SoundStarter> */
#pragma push
#pragma force_active on
static u8 data_80B8DAD4[4];
#pragma pop
/* 80B8DAD8-80B8DADC 000098 0004+00 0/0 0/0 0/0 .bss
* sInstance__33JASGlobalInstance<12Z2SpeechMgr2> */
#pragma push
#pragma force_active on
static u8 data_80B8DAD8[4];
#pragma pop
/* 80B8DADC-80B8DAE0 00009C 0004+00 0/0 0/0 0/0 .bss sInstance__28JASGlobalInstance<8JAISeMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DADC[4];
#pragma pop
/* 80B8DAE0-80B8DAE4 0000A0 0004+00 0/0 0/0 0/0 .bss sInstance__29JASGlobalInstance<9JAISeqMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DAE0[4];
#pragma pop
/* 80B8DAE4-80B8DAE8 0000A4 0004+00 0/0 0/0 0/0 .bss
* sInstance__33JASGlobalInstance<12JAIStreamMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DAE4[4];
#pragma pop
/* 80B8DAE8-80B8DAEC 0000A8 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2SoundMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DAE8[4];
#pragma pop
/* 80B8DAEC-80B8DAF0 0000AC 0004+00 0/0 0/0 0/0 .bss
* sInstance__33JASGlobalInstance<12JAISoundInfo> */
#pragma push
#pragma force_active on
static u8 data_80B8DAEC[4];
#pragma pop
/* 80B8DAF0-80B8DAF4 0000B0 0004+00 0/0 0/0 0/0 .bss
* sInstance__34JASGlobalInstance<13JAUSoundTable> */
#pragma push
#pragma force_active on
static u8 data_80B8DAF0[4];
#pragma pop
/* 80B8DAF4-80B8DAF8 0000B4 0004+00 0/0 0/0 0/0 .bss
* sInstance__38JASGlobalInstance<17JAUSoundNameTable> */
#pragma push
#pragma force_active on
static u8 data_80B8DAF4[4];
#pragma pop
/* 80B8DAF8-80B8DAFC 0000B8 0004+00 0/0 0/0 0/0 .bss
* sInstance__33JASGlobalInstance<12JAUSoundInfo> */
#pragma push
#pragma force_active on
static u8 data_80B8DAF8[4];
#pragma pop
/* 80B8DAFC-80B8DB00 0000BC 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SoundInfo>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DAFC[4];
#pragma pop
/* 80B8DB00-80B8DB04 0000C0 0004+00 0/0 0/0 0/0 .bss
* sInstance__34JASGlobalInstance<13Z2SoundObjMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DB00[4];
#pragma pop
/* 80B8DB04-80B8DB08 0000C4 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2Audience>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DB04[4];
#pragma pop
/* 80B8DB08-80B8DB0C 0000C8 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2FxLineMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DB08[4];
#pragma pop
/* 80B8DB0C-80B8DB10 0000CC 0004+00 0/0 0/0 0/0 .bss sInstance__31JASGlobalInstance<10Z2EnvSeMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DB0C[4];
#pragma pop
/* 80B8DB10-80B8DB14 0000D0 0004+00 0/0 0/0 0/0 .bss sInstance__32JASGlobalInstance<11Z2SpeechMgr>
*/
#pragma push
#pragma force_active on
static u8 data_80B8DB10[4];
#pragma pop
/* 80B8DB14-80B8DB18 0000D4 0004+00 0/0 0/0 0/0 .bss
* sInstance__34JASGlobalInstance<13Z2WolfHowlMgr> */
#pragma push
#pragma force_active on
static u8 data_80B8DB14[4];
#pragma pop
AUDIO_INSTANCES
/* 80B8D8DC-80B8D8FC -00001 0020+00 1/0 0/0 0/0 .data daNpc_zrA_MethodTable */
static actor_method_class daNpc_zrA_MethodTable = {
+20 -9
View File
@@ -50,6 +50,17 @@ static s8 r11yuka_image[192] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
class daObj_Toby_HIO_c : public JORReflexible{
public:
/* 80D1378C */ daObj_Toby_HIO_c();
/* 80D15534 */ virtual ~daObj_Toby_HIO_c() {}
void genMessage(JORMContext*);
/* 0x4 */ s8 field_0x4;
/* 0x8 */ f32 field_0x8;
};
/* 80D1378C-80D137B0 0000EC 0024+00 1/1 0/0 0/0 .text __ct__16daObj_Toby_HIO_cFv */
daObj_Toby_HIO_c::daObj_Toby_HIO_c() {
field_0x4 = -1;
@@ -435,24 +446,24 @@ static int daObj_Toby_Delete(obj_toby_class* i_this) {
// nonmatching - regalloc
static int useHeapInit(fopAc_ac_c* a_this) {
obj_toby_class* i_this = (obj_toby_class*)a_this;
J3DModelData* modelData;
J3DModelData* modelData2;
void* modelData;
void* modelData2;
yuka_s* pYuka;
if (i_this->field_0x577 == 0) {
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 4);
modelData = dComIfG_getObjectRes(i_this->mArcName, 4);
JUT_ASSERT(868, modelData != 0);
modelData2 = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 5);
modelData2 = dComIfG_getObjectRes(i_this->mArcName, 5);
// !@bug assert on wrong variable. not really meaningful.
JUT_ASSERT(872, modelData != 0);
pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++) {
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create(modelData, 0x20000, 0x11000084);
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create((J3DModelData*)modelData, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel1 == NULL) {
return 0;
}
i_this->mYukas[i].mModel2 = mDoExt_J3DModel__create(modelData2, 0x20000, 0x11000084);
i_this->mYukas[i].mModel2 = mDoExt_J3DModel__create((J3DModelData*)modelData2, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel2 == NULL) {
return 0;
}
@@ -467,11 +478,11 @@ static int useHeapInit(fopAc_ac_c* a_this) {
}
} else if (i_this->field_0x577 == 1) {
a_this->field_0x567 = 1;
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 6);
modelData = dComIfG_getObjectRes(i_this->mArcName, 6);
JUT_ASSERT(907, modelData != 0);
for (int i = 0; i < i_this->mYukaNum; i++) {
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create(modelData, 0x20000, 0x11000084);
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create((J3DModelData*)modelData, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel1 == NULL) {
return 0;
}