diff --git a/configure.py b/configure.py index c7caf6cb4..900efc0d1 100644 --- a/configure.py +++ b/configure.py @@ -440,7 +440,7 @@ config.libs = [ Object(NonMatching, "d/actor/d_a_obj_search.cpp"), Object(Matching, "d/actor/d_a_player.cpp"), Object(NonMatching, "d/actor/d_a_player_main.cpp"), - Object(NonMatching, "d/actor/d_a_player_npc.cpp"), + Object(Matching, "d/actor/d_a_player_npc.cpp"), Object(NonMatching, "d/actor/d_a_sea.cpp"), Object(Matching, "d/actor/d_a_spc_item01.cpp"), Object(Matching, "d/actor/d_a_vrbox.cpp", extra_cflags=['-pragma "nosyminline on"']), diff --git a/include/d/actor/d_a_npc_os.h b/include/d/actor/d_a_npc_os.h index 82c253d6e..0c8f8c604 100644 --- a/include/d/actor/d_a_npc_os.h +++ b/include/d/actor/d_a_npc_os.h @@ -45,7 +45,7 @@ public: f32 getBaseAnimeFrame() { return 0.0f; } f32 getBaseAnimeFrameRate() { return 1.0f; } s8 getCattleRoomNo() { return m_cattleRoomNo; } - cXyz& getEyePos() { return eyePos; } + cXyz& getEyePos() { return field_0x748; } f32 getGroundY() { return mAcch.GetGroundH(); } s16 getHead_x() { return mJntCtrl.getHead_x(); } s16 getHead_y() { return mJntCtrl.getHead_y(); } @@ -57,20 +57,20 @@ public: } } BOOL isFinish() { return cLib_checkBit(field_0x784, 0x1UL); } - BOOL isGravity() { return cLib_checkBit(field_0x784, 0x8UL); } - BOOL isPlayerRoom_Goat() {} + void onFinish() { cLib_onBit(field_0x784, 0x1UL); } BOOL isSetHomePos() { return cLib_checkBit(field_0x784, 0x2UL); } + void onSetHomePos() { cLib_onBit(field_0x784, 0x2UL); } BOOL isWaterHit() { return cLib_checkBit(field_0x784, 0x4UL); } - void offGravity() { field_0x784 &= ~0x8; } + void onWaterHit() { cLib_onBit(field_0x784, 0x4UL); } + BOOL isGravity() { return cLib_checkBit(field_0x784, 0x8UL); } + void onGravity() { cLib_onBit(field_0x784, 0x8UL); } + void offGravity() { cLib_offBit(field_0x784, 0x8UL); } void offPlayerRoom(int idx) { m_playerRoom[idx] = false; } - void onFinish() { field_0x784 |= 0x1; } - void onGravity() { field_0x784 |= 0x8; } void onPlayerRoom(int idx) { m_playerRoom[idx] = true; } - void onSetHomePos() { field_0x784 |= 0x2; } - void onWaterHit() { field_0x784 |= 0x4; } void setCattleRoomNo(s8 roomNo) { m_cattleRoomNo = roomNo; } static bool isPlayerRoom(int idx) { return m_playerRoom[idx]; } + static bool isPlayerRoom_Goat() { return isPlayerRoom(1); } s32 create(); BOOL createHeap(); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index f1a78eef4..f6ba5add6 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1036,6 +1036,7 @@ inline void dComIfGs_setRestartOption(s8 i_option) { inline void dComIfGs_setRestartOption(cXyz* i_pos, s16 i_angle, s8 i_roomNo, s8 i_option) { g_dComIfG_gameInfo.save.getRestart().setRestartOption(i_option, i_pos, i_angle, i_roomNo); + g_dComIfG_gameInfo.save.getPlayer().getPriest().set(i_option, *i_pos, i_angle, i_roomNo); } inline u32 dComIfGs_getRestartRoomParam() { diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 5d5236e1b..eb028c1bd 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -75,6 +75,11 @@ public: virtual void end(); void setTevStr(dKy_tevstr_c* tevStr) { mTevstr = tevStr; } + void remove() { end(); } + + void offWindOff() {} + void onWindOff() {} + void setColor(const GXColor&) {} /* 0x14 */ s8 field_0x14; /* 0x15 */ u8 field_0x15; diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index e9c38edd7..6acfbee65 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -454,7 +454,6 @@ s32 daNpc_Md_c::create() { s16 angle = dComIfGs_getPlayerPriestRotate(); cXyz& pos = dComIfGs_getPlayerPriestPos(); dComIfGs_setRestartOption(&pos, angle, roomNo, 2); - dComIfGs_setPlayerPriest(2, pos, angle, roomNo); } checkRestart(2); } diff --git a/src/d/actor/d_a_npc_os.cpp b/src/d/actor/d_a_npc_os.cpp index b0136d3db..aec132af9 100644 --- a/src/d/actor/d_a_npc_os.cpp +++ b/src/d/actor/d_a_npc_os.cpp @@ -17,6 +17,8 @@ static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; static f64 dummy4[2] = {3.0, 0.5}; +static u8 temp[0x4C]; // TODO + static daNpc_Os_HIO_c l_HIO; static s32 l_hio_counter = 0; static cXyz l_smoke_scale(0.5f, 0.5f, 0.5f); @@ -144,8 +146,6 @@ static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { /* 00000374-00000538 .text create__10daNpc_Os_cFv */ s32 daNpc_Os_c::create() { - /* Nonmatching */ - fopAcM_SetupActor(this, daNpc_Os_c) static u32 l_heap_size = 0xFA0; @@ -190,8 +190,6 @@ s32 daNpc_Os_c::create() { /* 00000748-000008CC .text nodeCallBack__FP7J3DNodei */ static BOOL nodeCallBack(J3DNode* node, int param_1) { - /* Nonmatching */ - if (!param_1) { J3DModel* model = j3dSys.getModel(); J3DJoint* joint = (J3DJoint*)node; @@ -618,21 +616,24 @@ s16 daNpc_Os_c::getStickAngY() { /* 0000180C-00001964 .text calcStickPos__10daNpc_Os_cFsP4cXyz */ int daNpc_Os_c::calcStickPos(s16 param_1, cXyz* param_2) { - /* Nonmatching */ - int ret; - dAttList_c* attList = dComIfGp_getAttention().GetLockonList(0); - bool lockon = dComIfGp_getAttention().Lockon(); + // This temp variable for attention is probably a fakematch, but it fixes a regswap in dAttention_c::Lockon. + dAttention_c& attention = dComIfGp_getAttention(); + dAttList_c* attList = attention.GetLockonList(0); + bool lockon = attention.Lockon(); if(!lockon) { ret = 0; - } - else { - ret = dComIfGp_getAttention().LockonTruth() ? 1 : -1; + } else { + BOOL lockon = attention.LockonTruth(); + ret = -1; + if (lockon) { + ret = 1; + } } if(attList == NULL) { - attList = dComIfGp_getAttention().GetActionList(0); + attList = attention.GetActionList(0); } if(attList) { @@ -1054,8 +1055,6 @@ BOOL daNpc_Os_c::routeCheck(f32 param_1, s16* param_2) { /* 0000375C-000039EC .text searchNpcAction__10daNpc_Os_cFPv */ BOOL daNpc_Os_c::searchNpcAction(void*) { - /* Nonmatching */ - if(field_0x7A9 == 0) { attention_info.flags |= fopAc_Attn_ACTION_CARRY_e; setAnm(1); @@ -1068,10 +1067,15 @@ BOOL daNpc_Os_c::searchNpcAction(void*) { BOOL door = player->eventInfo.checkCommandDoor(); f32 dist = fopAcM_searchPlayerDistanceXZ2(this); - f32 temp = dist < l_HIO.field_0x60 * l_HIO.field_0x60 ? 0.0f : l_HIO.field_0xA8; - s16 angle = fopAcM_searchPlayerAngleY(this); - s16 temp2 = angle; - BOOL temp3 = routeCheck(dist, &temp2) && cLib_distanceAngleS(angle, temp2) <= 0x2000; + f32 temp; + if (dist < l_HIO.field_0x60 * l_HIO.field_0x60) { + temp = 0.0f; + } else { + temp = l_HIO.field_0xA8; + } + s16 angle, adjustedAngle; + angle = adjustedAngle = fopAcM_searchPlayerAngleY(this); + BOOL temp3 = routeCheck(dist, &adjustedAngle) && cLib_distanceAngleS(angle, adjustedAngle) <= 0x2000; if(door || !temp3 || (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK1_e) || player->checkAttentionLock())) { temp = 0.0f; offNpcCallCommand(); @@ -1091,7 +1095,7 @@ BOOL daNpc_Os_c::searchNpcAction(void*) { } } - walkProc(temp, temp2); + walkProc(temp, adjustedAngle); cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24 * 2, l_HIO.mOs2.field_0x26 * 2); s16 temp4 = shape_angle.y; lookBack(1, 0, 0); @@ -1551,15 +1555,8 @@ void daNpc_Os_c::initialNextEvent(int staffIdx) { /* 00004A60-00004AF8 .text initialSaveEvent__10daNpc_Os_cFi */ void daNpc_Os_c::initialSaveEvent(int) { - /* Nonmatching */ - home.pos = current.pos; - - s8 restartNum = getRestartNumber(); - s8 roomNo = fopAcM_GetRoomNo(this); - s16 angleY = home.angle.y; - dComIfGs_setRestartOption(¤t.pos, angleY, roomNo, restartNum); - dComIfGs_setPlayerPriest(restartNum, current.pos, angleY, roomNo); + dComIfGs_setRestartOption(¤t.pos, home.angle.y, fopAcM_GetRoomNo(this), getRestartNumber()); } /* 00004AF8-00004B64 .text talk_init__10daNpc_Os_cFv */ @@ -1597,8 +1594,6 @@ BOOL daNpc_Os_c::talk() { /* 00004C04-00004D20 .text setAnm__10daNpc_Os_cFi */ void daNpc_Os_c::setAnm(int param_1) { - /* Nonmatching */ - struct anmPrm_c { /* 0x00 */ s8 mAnmTblIdx; /* 0x04 */ int mLoopMode; @@ -1654,12 +1649,13 @@ void daNpc_Os_c::setAnm(int param_1) { field_0x78C = param_1; anmPrm_c& prm = l_anmPrm[param_1]; - f32 temp = prm.mPlaySpeed; - if(prm.mAnmTblIdx != field_0x7A0 || temp != mpMorf->getPlaySpeed()) { + f32 playSpeed = prm.mPlaySpeed; + if(prm.mAnmTblIdx != field_0x7A0 || prm.mPlaySpeed != mpMorf->getPlaySpeed()) { field_0x7A0 = prm.mAnmTblIdx; + s8* temp2 = &l_anmTbl[field_0x7A0]; // fakematch mPrevMorfFrame = 0.0f; mReachedAnimEnd = false; - dNpc_Os_setAnm(mpMorf, prm.mLoopMode, prm.mMorf, temp, l_anmTbl[field_0x7A0], "Os"); + dNpc_Os_setAnm(mpMorf, prm.mLoopMode, prm.mMorf, playSpeed, *temp2, "Os"); if(prm.m10 < 0) { mpMorf->setFrame(mpMorf->getEndFrame()); @@ -1770,8 +1766,6 @@ void daNpc_Os_c::setAnm_brkAnm(int param_1) { /* 000050B0-00005204 .text chkAttention__10daNpc_Os_cF4cXyzs */ BOOL daNpc_Os_c::chkAttention(cXyz param_1, s16 param_2) { - /* Nonmatching */ - fopAc_ac_c* player = dComIfGp_getPlayer(0); f32 maxDist = l_HIO.mNpc.mMaxAttnDistXZ; s32 maxAngle = l_HIO.mNpc.mMaxAttnAngleY; @@ -1787,9 +1781,9 @@ BOOL daNpc_Os_c::chkAttention(cXyz param_1, s16 param_2) { maxAngle += 0x71C; } - s16 temp = angle - param_2; + angle -= param_2; BOOL ret = false; - if(maxAngle > abs(temp) && maxDist > dist) { + if(maxAngle > abs(angle) && maxDist > dist) { ret = true; } @@ -1845,9 +1839,7 @@ void daNpc_Os_c::checkOrder() { /* 00005454-00005468 .text checkCommandTalk__10daNpc_Os_cFv */ BOOL daNpc_Os_c::checkCommandTalk() { - /* Nonmatching */ - - return eventInfo.checkCommandTalk(); + return eventInfo.checkCommandTalk() ? TRUE : FALSE; } /* 00005468-000054BC .text next_msgStatus__10daNpc_Os_cFPUl */ @@ -1966,12 +1958,13 @@ static const char* event_name_tbl[] = { /* 00005824-00005B58 .text init__10daNpc_Os_cFv */ BOOL daNpc_Os_c::init() { - /* Nonmatching */ - cXyz dummy(0.0f, 0.0f, 0.0f); field_0x794 = fopAcM_GetParam(this) >> 0x10 & 0xFF; attention_info.distances[4] = 0x27; + // Fakematch, the next two lines get optimized out, but they affect the regalloc when copying the tevstr. + speedF = speedF; + speedF = speedF; m_smoke_tevstr = tevStr; m_smoke.setTevStr(&m_smoke_tevstr); m_playerRoom[subtype] = false; @@ -2080,8 +2073,6 @@ void daNpc_Os_c::smokeSet(u16 particle) { /* 00005E5C-00006AF8 .text execute__10daNpc_Os_cFv */ BOOL daNpc_Os_c::execute() { - /* Nonmatching */ - static JGeometry::TVec3 splash_scale(0.6f, 0.6f, 0.6f); static JGeometry::TVec3 ripple_scale(1.0f, 1.0f, 1.0f); @@ -2352,8 +2343,6 @@ BOOL daNpc_Os_c::execute() { /* 00006AF8-00006E1C .text __dt__10daNpc_Os_cFv */ daNpc_Os_c::~daNpc_Os_c() { - /* Nonmatching */ - dComIfG_resDelete(&mPhs, "Os"); if (heap) { @@ -2361,7 +2350,7 @@ daNpc_Os_c::~daNpc_Os_c() { } endBeam(); - m_smoke.end(); + m_smoke.remove(); if(l_hio_counter != 0) { l_hio_counter -= 1; } diff --git a/src/d/actor/d_a_player_npc.cpp b/src/d/actor/d_a_player_npc.cpp index 990e98d10..c7c9399fb 100644 --- a/src/d/actor/d_a_player_npc.cpp +++ b/src/d/actor/d_a_player_npc.cpp @@ -77,25 +77,17 @@ void daPy_npc_c::setOffsetHomePos() { /* 8015A6A4-8015AA0C .text setPointRestart__10daPy_npc_cFsSc */ void daPy_npc_c::setPointRestart(s16 i_point, s8 option) { - /* Nonmatching (regswaps) */ - stage_scls_info_dummy_class* sclsinfo; - stage_scls_info_class* scls_data; - stage_actor_data_class* player_data; - int scls_start_code; - int i; - s16 rotY; - s8 roomNo; - JUT_ASSERT(157, dComIfGp_getStagePlayer() != 0); - sclsinfo = dComIfGp_getStageSclsInfo(); + stage_scls_info_dummy_class* sclsinfo = dComIfGp_getStageSclsInfo(); JUT_ASSERT(159, sclsinfo != 0); JUT_ASSERT(161, 0 <= i_point && i_point < sclsinfo->num); - scls_data = sclsinfo->m_entries; + stage_scls_info_class* scls_data = sclsinfo->m_entries; JUT_ASSERT(163, scls_data != 0); - player_data = dComIfGp_getStagePlayer()->m_entries; - scls_start_code = scls_data[i_point].mStart; + stage_actor_data_class* player_data = dComIfGp_getStagePlayer()->m_entries; + int scls_start_code = scls_data[i_point].mStart; + int i; for (i = 0; i < dComIfGp_getStagePlayerNum(); i++) { u8 plyr_start_code = player_data->mAngle.z & 0xFF; if (plyr_start_code == scls_start_code) { @@ -113,10 +105,7 @@ void daPy_npc_c::setPointRestart(s16 i_point, s8 option) { old = home; shape_angle = home.angle; - rotY = home.angle.y; - roomNo = -1; - dComIfGs_setRestartOption(&home.pos, rotY, roomNo, option); - dComIfGs_setPlayerPriest(option, home.pos, rotY, roomNo); + dComIfGs_setRestartOption(&home.pos, home.angle.y, -1, option); dComIfGs_setPlayerPriest(option, dComIfGs_getRestartOptionPos(), dComIfGs_getRestartOptionAngleY(), dComIfGs_getRestartOptionRoomNo()); fopAcM_setStageLayer(this); } @@ -150,7 +139,6 @@ BOOL daPy_npc_c::initialRestartOption(s8 option, int save) { s8 roomNo = current.roomNo; rotY = home.angle.y; dComIfGs_setRestartOption(&home.pos, rotY, roomNo, option); - dComIfGs_setPlayerPriest(option, home.pos, rotY, roomNo); } return TRUE; }