From e9672fd355d76745b400d902c8d186dd810d15c5 Mon Sep 17 00:00:00 2001 From: hatal175 Date: Mon, 30 Jun 2025 06:38:04 +0300 Subject: [PATCH] d_a_bg_obj equivalent + misc (#2509) * d_a_bg_obj equivalent + misc * More Z2LinkMgr Matches --- configure.py | 2 +- include/Z2AudioCSD/Z2AudioCS.h | 11 ++ include/Z2AudioLib/Z2LinkMgr.h | 2 +- include/Z2AudioLib/Z2SceneMgr.h | 2 +- include/Z2AudioLib/Z2StatusMgr.h | 4 +- include/d/d_kankyo.h | 21 ++- src/JSystem/JMessage/resource.cpp | 14 +- src/Z2AudioLib/Z2AudioArcLoader.cpp | 1 - src/Z2AudioLib/Z2LinkMgr.cpp | 35 +++- src/d/actor/d_a_alink_whistle.inc | 2 + src/d/actor/d_a_bg_obj.cpp | 197 ++++++++++++++--------- src/d/actor/d_a_e_bee.cpp | 83 ++++++---- src/d/actor/d_a_kytag03.cpp | 4 +- src/d/actor/d_a_kytag10.cpp | 2 +- src/d/d_kankyo_rain.cpp | 239 +++++++++++++++------------- src/d/d_kankyo_wether.cpp | 48 +++--- 16 files changed, 399 insertions(+), 268 deletions(-) create mode 100644 include/Z2AudioCSD/Z2AudioCS.h diff --git a/configure.py b/configure.py index 4c21fe0688..68cb465f34 100755 --- a/configure.py +++ b/configure.py @@ -1476,7 +1476,7 @@ config.libs = [ Rel("f_pc_profile_lst", [Object(Matching, "f_pc/f_pc_profile_lst.cpp")]), ActorRel(MatchingFor("GZ2E01"), "d_a_andsw"), ActorRel(NonMatching, "d_a_bg"), - ActorRel(NonMatching, "d_a_bg_obj"), + ActorRel(Equivalent, "d_a_bg_obj"), ActorRel(MatchingFor("GZ2E01"), "d_a_dmidna"), ActorRel(MatchingFor("GZ2E01"), "d_a_door_dbdoor00"), ActorRel(MatchingFor("GZ2E01"), "d_a_door_knob00"), diff --git a/include/Z2AudioCSD/Z2AudioCS.h b/include/Z2AudioCSD/Z2AudioCS.h new file mode 100644 index 0000000000..b5b7dac444 --- /dev/null +++ b/include/Z2AudioCSD/Z2AudioCS.h @@ -0,0 +1,11 @@ +#ifndef Z2AUDIOCS_H +#define Z2AUDIOCS_H + +#include "global.h" + +class Z2AudioCS { +public: + static int startLevel(s32 param_1, s32 param_2); +}; + +#endif diff --git a/include/Z2AudioLib/Z2LinkMgr.h b/include/Z2AudioLib/Z2LinkMgr.h index d86f81cf8d..66eeef2ca0 100644 --- a/include/Z2AudioLib/Z2LinkMgr.h +++ b/include/Z2AudioLib/Z2LinkMgr.h @@ -44,7 +44,7 @@ public: void setInWater(bool status) { mInWater = status; } bool isInWater() { return mInWater; } - u8 getLinkState() const { return mLinkState; } + u8 getLinkState() { return mLinkState; } u8 getMoveSpeed() const { return mMoveSpeed; } bool isRiding() const { return mRiding; } void setLinkState(u8 i_state) { mLinkState = i_state; } diff --git a/include/Z2AudioLib/Z2SceneMgr.h b/include/Z2AudioLib/Z2SceneMgr.h index 27b2b65d74..553ec2d5e8 100644 --- a/include/Z2AudioLib/Z2SceneMgr.h +++ b/include/Z2AudioLib/Z2SceneMgr.h @@ -33,7 +33,7 @@ public: bool isSceneExist() { return sceneExist; } int getCurrentSceneNum() { return sceneNum; } s8 getCurrentRoomNum() { return roomNum; } - bool isInGame() const { return inGame; } + bool isInGame() { return inGame; } void setInGame(bool i_inGame) { inGame = i_inGame; } bool isInDarkness() const { return inDarkness; } s8 getRoomReverb() { return dComIfGp_getReverb(roomNum); } diff --git a/include/Z2AudioLib/Z2StatusMgr.h b/include/Z2AudioLib/Z2StatusMgr.h index ea732811f5..f3b35f612f 100644 --- a/include/Z2AudioLib/Z2StatusMgr.h +++ b/include/Z2AudioLib/Z2StatusMgr.h @@ -21,12 +21,12 @@ struct Z2StatusMgr : public JASGlobalInstance { void setCameraGroupInfo(u8); void setCameraInWaterDepth(float); - u8 getDemoStatus() const { return mDemoStatus; } + u8 getDemoStatus() { return mDemoStatus; } void setHour(s32 hour) { mHour = hour; } void setMinute(s32 min) { mMinute = min; } void setWeekday(s32 day) { mWeekday = day; } f32 getCameraInWaterDepth() { return mUnderwaterDepth; } - f32 getCameraInWaterDepthRatio() const { return mCameraInWaterDepthRatio; } + f32 getCameraInWaterDepthRatio() { return mCameraInWaterDepthRatio; } u8 getHour() { return mHour; } bool isPaused() { return mPauseFlag; } bool isHeartGuageOn() { return mHeartGaugeOn; } diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index ee0ec54459..6adeba32c9 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -216,6 +216,13 @@ enum dKy_LIGHT_SIZE { LIGHT_SIZE_LL, }; +struct dKy_Odour_Data { + /* 0x0 */ u8 mOdourPacketStatus; + /* 0x1 */ u8 field_0xf21; + /* 0x4 */ int field_0xf24; + /* 0x8 */ dKankyo_odour_Packet* mpOdourPacket; +}; + class dScnKy_env_light_c { public: /* 8019F2E8 */ dScnKy_env_light_c(); @@ -325,10 +332,7 @@ public: /* 0x0ED4 */ EF_THUNDER mThunderEff; /* 0x0F18 */ u8 field_0xf18[4]; /* 0x0F1C */ dKankyo_shstar_Packet* mpShstarPacket; - /* 0x0F20 */ u8 mOdourPacketStatus; - /* 0x0F21 */ u8 field_0xf21; - /* 0x0F24 */ int field_0xf24; - /* 0x0F28 */ dKankyo_odour_Packet* mpOdourPacket; + /* 0x0F20 */ dKy_Odour_Data mOdourData; /* 0x0F2C */ u8 field_0xf2c; /* 0x0F30 */ J3DModel* undwater_ef_model; /* 0x0F34 */ f32 field_0xf34; @@ -503,9 +507,12 @@ inline dScnKy_env_light_c* dKy_getEnvlight() { class dKankyo_HIO_c { public: - u8 pad[0xB4]; - /* 0xB4 */ u8 field_0xB4; - /* 0xB8 */ f32 field_0xB8; + /* 0x000 */ u8 pad[0xB4]; + /* 0x0B4 */ u8 field_0xB4; + /* 0x0B8 */ f32 field_0xB8; + /* 0x0BC */ u8 field_0xBC[0x3F4 - 0xbc]; + /* 0x3F4 */ f32 field_0x3f4; + /* 0x3F8 */ f32 field_0x3f8; }; extern dKankyo_HIO_c g_kankyoHIO; diff --git a/src/JSystem/JMessage/resource.cpp b/src/JSystem/JMessage/resource.cpp index eca131efd8..1b0a813f84 100644 --- a/src/JSystem/JMessage/resource.cpp +++ b/src/JSystem/JMessage/resource.cpp @@ -186,26 +186,26 @@ bool JMessage::TParse::parseHeader_next(const void** ppData_inout, u32* puBlock_ if (memcmp(oHeader.get_signature(), &data::ga4cSignature, sizeof(data::ga4cSignature)) != 0) { JGADGET_WARNMSG(355, "unknown signature"); - return 0; + return false; } if (oHeader.get_type() != 'bmg1') { JGADGET_WARNMSG(360, "unknown type"); - return 0; + return false; } u8 uEncoding = oHeader.get_encoding(); if (uEncoding != 0) { if (!pContainer_->isEncodingSettable(uEncoding)) { JGADGET_WARNMSG(369, "encoding not acceptable"); - return 0; + return false; } pContainer_->setEncoding(uEncoding); } if (param_2 & 0x10) { - return 1; + return true; } TResourceContainer::TCResource* pResContainer = &pContainer_->resContainer_; @@ -214,14 +214,14 @@ bool JMessage::TParse::parseHeader_next(const void** ppData_inout, u32* puBlock_ if (pResource_ == NULL) { JGADGET_WARNMSG(384, "can't create resource"); if (param_2 & 0x20) { - return 1; + return true; } else { - return 0; + return false; } } else { pResContainer->Push_back(pResource_); pResource_->setData_header(oHeader.getRaw()); - return 1; + return true; } } diff --git a/src/Z2AudioLib/Z2AudioArcLoader.cpp b/src/Z2AudioLib/Z2AudioArcLoader.cpp index 4d50aa7d02..6e1a38d8b9 100644 --- a/src/Z2AudioLib/Z2AudioArcLoader.cpp +++ b/src/Z2AudioLib/Z2AudioArcLoader.cpp @@ -27,7 +27,6 @@ bool Z2AudioArcLoader::readCommandMore(u32 param_0) { } /* 802A9AC8-802A9B54 2A4408 008C+00 1/1 0/0 0/0 .text readBFCA__16Z2AudioArcLoaderFPCv */ -// NONMATCHING regalloc void Z2AudioArcLoader::readBFCA(void const* param_0) { JKRHeap* heap = JAUSectionHeap::getInstance()->getHeap(); JKRArchive* archive = JKRMountArchive((void*)param_0, JKRGetCurrentHeap(), JKRArchive::MOUNT_DIRECTION_TAIL); diff --git a/src/Z2AudioLib/Z2LinkMgr.cpp b/src/Z2AudioLib/Z2LinkMgr.cpp index 378b1c5a6c..116c987ffb 100644 --- a/src/Z2AudioLib/Z2LinkMgr.cpp +++ b/src/Z2AudioLib/Z2LinkMgr.cpp @@ -4,6 +4,7 @@ // #include "Z2AudioLib/Z2LinkMgr.h" +#include "Z2AudioCSD\Z2AudioCS.h" #include "d/d_com_inf_game.h" /* 802C321C-802C3220 2BDB5C 0004+00 0/0 1/1 0/0 .text setLinkGroupInfo__14Z2CreatureLinkFUc */ @@ -272,13 +273,34 @@ Z2SoundHandlePool* Z2CreatureLink::startLinkSound(JAISoundID i_soundID, u32 para /* 802C3E68-802C4320 2BE7A8 04B8+00 1/1 3/3 0/0 .text * startLinkSoundLevel__14Z2CreatureLinkF10JAISoundIDUlSc */ -// NONMATCHING - small issue with i_soundID in startCreatureSoundLevel call JAISoundHandle* Z2CreatureLink::startLinkSoundLevel(JAISoundID i_soundID, u32 param_1, s8 param_2) { + #if VERSION == VERSION_SHIELD_DEBUG + if (Z2GetSceneMgr()->isSceneExist()) { + int iVar3 = -1; + switch((u32)i_soundID) { + case Z2SE_AL_REEL_SLOW_LOOP: + iVar3 = 0x16; + break; + case Z2SE_AL_REEL_FAST_LOOP: + iVar3 = 0x17; + break; + case Z2SE_LK_HS_WIND_UP: + iVar3 = 0x19; + break; + } + + if (iVar3 >= 0 && Z2AudioCS::startLevel(iVar3, 0) != 0) + { + return NULL; + } + } + #endif + if (i_soundID == Z2SE_AL_LIGHTNING_SW_GLOW && (Z2GetStatusMgr()->getDemoStatus() == 2 || !Z2GetSceneMgr()->isInGame())) { return NULL; } - Z2SoundHandlePool* temp_r3 = startCreatureSoundLevel(i_soundID, param_1, param_2); + Z2SoundHandlePool* temp_r3 = startCreatureSoundLevel((u32)i_soundID, param_1, param_2); if (temp_r3 != NULL && *temp_r3) { f32 var_f31 = 1.0f; f32 var_f30 = 1.0f; @@ -311,7 +333,7 @@ JAISoundHandle* Z2CreatureLink::startLinkSoundLevel(JAISoundID i_soundID, u32 pa break; case Z2SE_AL_SNOBO_RIDE: case Z2SE_AL_SNOBO_BREAK: - if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[266]) && Z2GetSeqMgr()->getSubBgmID() != Z2BGM_SNOW_BOARD) { + if (dComIfGs_isEventBit((u16)dSv_event_flag_c::saveBitLabels[266]) && Z2GetSeqMgr()->getSubBgmID() != Z2BGM_SNOW_BOARD) { var_f31 = 0.0f; var_r30 = 0; } else if (mMoveSpeed == 0) { @@ -558,6 +580,7 @@ bool Z2LinkSoundStarter::startSound(JAISoundID i_soundID, JAISoundHandle* param_ if (param_3 == 44) { param_3 = 23; } else { + JUT_WARN_DEVICE(929, 1, "%s", "mapinfo > 26\n"); param_3 = 0; } } @@ -664,9 +687,9 @@ bool Z2LinkSoundStarter::startSound(JAISoundID i_soundID, JAISoundHandle* param_ } if (bVar3) { - if (Z2GetLink()->mLinkState == 4) { + if (Z2GetLink()->getLinkState() == 4) { Z2GetLink()->startLinkSound(Z2SE_FN_ARMER_LIGHT_ADD, 0, param_4 * 127.0f); - } else if (Z2GetLink()->mLinkState == 5) { + } else if (Z2GetLink()->getLinkState() == 5) { Z2GetLink()->startLinkSound(Z2SE_FN_ARMER_HEAVY_ADD, 0, param_4 * 127.0f); } } @@ -735,7 +758,7 @@ bool Z2RideSoundStarter::startSound(JAISoundID i_soundID, JAISoundHandle* param_ break; } - bool ret = Z2SoundStarter::startSound(i_soundID, param_1, param_2, param_3, param_4, param_5, + bool ret = Z2SoundStarter::startSound((u32)i_soundID, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9); if (mRide->isLinkRiding() && uVar3 != 0) { diff --git a/src/d/actor/d_a_alink_whistle.inc b/src/d/actor/d_a_alink_whistle.inc index 450bbe04bc..92685a89a8 100644 --- a/src/d/actor/d_a_alink_whistle.inc +++ b/src/d/actor/d_a_alink_whistle.inc @@ -271,7 +271,9 @@ int daAlink_c::procGrassWhistleWait() { procWaitInit(); } } else { + #if VERSION != VERSION_SHIELD_DEBUG setGrassCancelStatus(0); + #endif } return 1; diff --git a/src/d/actor/d_a_bg_obj.cpp b/src/d/actor/d_a_bg_obj.cpp index 193d3c3ca3..46c0bbce74 100644 --- a/src/d/actor/d_a_bg_obj.cpp +++ b/src/d/actor/d_a_bg_obj.cpp @@ -9,6 +9,7 @@ #include "dol2asm.h" #include "dolphin/os.h" #include "d/actor/d_a_set_bgobj.h" +#include "d/d_s_play.h" #include "SSystem/SComponent/c_math.h" SECTION_DATA extern void* __vt__10cCcD_GStts[3]; @@ -319,102 +320,116 @@ SECTION_DEAD static char const* const stringBase_8045CA7D = "spec.dat"; */ // NONMATCHING - close-ish bool daBgObj_c::spec_data_c::Set(void* i_ptr) { - spec_dat* data = (spec_dat*)i_ptr; + JUT_ASSERT(496, i_ptr != 0); - mSpecType = data->field_0x0; + u8* data = (u8*)i_ptr; + + mSpecType = *(u16*)i_ptr; + + u8 block_type; + u16 temp_r3; switch (mSpecType) { case 0: { - u8 block_type = data->field_0x4; - u8* block_p = (u8*)data + 4; + block_type = data[4]; + data += 4; do { switch (block_type) { case 0: break; case 3: - block_p = initTexShareBlock(block_p); + data = initTexShareBlock(data); break; case 4: - block_p = initFarInfoBlock(block_p); + data = initFarInfoBlock(data); break; + default: + // Invalid data block type + OS_REPORT_ERROR("データブロックタイプが不正です<%d>\n", block_type); + JUT_PANIC(527, "0"); } if (block_type == 0) { break; } - block_type = *block_p; + block_type = *data; } while (1); break; } case 1: { - u16 temp_r3 = data->field_0x2; + temp_r3 = *(u16*)(data + 2); field_0x02 = temp_r3 & 0xF; field_0x03 = (temp_r3 >> 0xE) & 3; field_0x15 = (temp_r3 >> 0xC) & 3; field_0x14 = (temp_r3 >> 9) & 7; field_0x16 = (temp_r3 >> 8) & 1; - u8 block_type = data->field_0x4; - u8* block_p = (u8*)i_ptr + 4; + block_type = data[4]; + data += 4; do { switch (block_type) { case 0: break; case 3: - block_p = initTexShareBlock(block_p); + data = initTexShareBlock(data); break; case 1: - block_p = initParticleBlock(block_p); + data = initParticleBlock(data); break; case 2: - block_p = initSoundBlock(block_p); + data = initSoundBlock(data); break; case 4: - block_p = initFarInfoBlock(block_p); + data = initFarInfoBlock(data); break; + default: + // Invalid data block type + OS_REPORT_ERROR("データブロックタイプが不正です<%d>\n", block_type); + JUT_PANIC(570, "0"); } if (block_type == 0) { break; } - block_type = *block_p; + block_type = *data; } while (1); break; } case 2: { - u16 temp_r3_2 = data->field_0x2; - field_0x02 = temp_r3_2 & 0xF; - field_0x03 = (temp_r3_2 >> 0xE) & 3; - field_0x15 = (temp_r3_2 >> 0xC) & 3; - field_0x14 = (temp_r3_2 >> 9) & 7; - field_0x16 = (temp_r3_2 >> 8) & 1; + temp_r3 = *(u16*)(data + 2); + field_0x02 = temp_r3 & 0xF; + field_0x03 = (temp_r3 >> 0xE) & 3; + field_0x15 = (temp_r3 >> 0xC) & 3; + field_0x14 = (temp_r3 >> 9) & 7; + field_0x16 = (temp_r3 >> 8) & 1; - u8 block_type = data->field_0x4; - u8* block_p = (u8*)i_ptr + 4; + block_type = data[4]; + data += 4; do { switch (block_type) { case 0: break; case 3: - block_p = initTexShareBlock(block_p); + data = initTexShareBlock(data); break; case 1: - block_p = initParticleBlock(block_p); + data = initParticleBlock(data); break; case 2: - block_p = initSoundBlock(block_p); + data = initSoundBlock(data); break; case 4: - block_p = initFarInfoBlock(block_p); + data = initFarInfoBlock(data); break; default: // "Data Block type invalid<%d>\n" OSReport_Error("データブロックタイプが不正です<%d>\n", block_type); + JUT_PANIC(619, "0"); break; } @@ -422,11 +437,13 @@ bool daBgObj_c::spec_data_c::Set(void* i_ptr) { break; } - block_type = *block_p; + block_type = *data; } while (1); break; } default: + // Terrain unit MoveBG: performance undefined error<%d>!!! + OS_REPORT_ERROR("地形ユニットMoveBG : 性能未定義エラー!!!<%d>\n\n", mSpecType); return 0; } @@ -464,17 +481,44 @@ static const dCcD_SrcCyl l_cyl_src = { }; /* 80459BEC-80459D0C 00060C 0120+00 1/1 0/0 0/1 .text initAtt__9daBgObj_cFv */ -// NONMATCHING - missing nop instruction void daBgObj_c::initAtt() { - u32 cd3_val = mSpecData.field_0x03 == 0 ? 3 : mSpecData.field_0x03 - 1; - u32 ce5_val = mSpecData.field_0x15 == 0 ? 3 : mSpecData.field_0x15 - 1; - u32 ce4_val = mSpecData.field_0x14 == 0 ? 7 : mSpecData.field_0x14 - 1; + u32 actor_params = 0; + u32 cd3_val; + if (mSpecData.field_0x03 == 0) { + cd3_val = 3; + } else { + cd3_val = mSpecData.field_0x03 - 1; + } - u32 arg0 = (daBgObj_prm::getObjArg0(this) != 0) ? 1 : 0; + u32 ce5_val; + if (mSpecData.field_0x15 == 0) { + ce5_val = 3; + } else { + ce5_val = mSpecData.field_0x15 - 1; + } - u32 actor_params = - (daBgObj_prm::getSwBit2(this) << 24) | - (daBgObj_prm::getSwBit(this) << 16) | + u32 ce4_val; + if (mSpecData.field_0x14 == 0) { + ce4_val = 7; + } else { + ce4_val = mSpecData.field_0x14 - 1; + } + + u32 arg0; + if (daBgObj_prm::getObjArg0(this) == 0) { + arg0 = 0; + } else { + arg0 = 1; + } + + u32 temp = 0; + u32 swbit = daBgObj_prm::getSwBit(this); + u32 swbit2 = daBgObj_prm::getSwBit2(this); + + actor_params = + (swbit2 << 24) | + (swbit << 16) | + (temp << 8) | (arg0 << 7) | (ce4_val << 4) | (ce5_val << 2) | @@ -485,9 +529,14 @@ void daBgObj_c::initAtt() { if (actor != NULL) { setAttentionInfo(actor); + } else { + // Failed to generate focus actor + OS_REPORT_ERROR("「注目点」生成失敗!!!\n"); } + mAttnActorID = fopAcM_GetID(actor); - eyePos.y += 0.5f * fopAcM_getCullSizeBoxMax(this)->y; + const Vec* box = fopAcM_getCullSizeBoxMax(this); + eyePos.y += 0.5f * box->y; } /* 80459D0C-80459D3C 00072C 0030+00 2/2 0/0 0/0 .text setAttentionInfo__9daBgObj_cFP10fopAc_ac_c @@ -1078,13 +1127,14 @@ struct blockItem { }; /* 8045B17C-8045B3A0 001B9C 0224+00 3/3 0/0 0/0 .text setParticle__9daBgObj_cFv */ -// NONMATCHING - out-of-place addi insn void daBgObj_c::setParticle() { u32 partNum = mSpecData.mParticleNum; - u8* partBlockItems = mSpecData.mpParticleBlock + 4; + u32* partBlockItems = (u32*)mSpecData.mpParticleBlock; + partBlockItems++; for (; partNum != 0; partNum--) { - u32 flags = *(u32*)partBlockItems; - u16 res_id = *(u32*)(partBlockItems + 4); + u32 flags = *partBlockItems++; + u16 res_id = *partBlockItems; + *partBlockItems++; GXColor prmColor = { 0xFF, 0xFF, 0xFF, 0xFF }; GXColor envColor = { 0xFF, 0xFF, 0xFF, 0xFF }; @@ -1095,20 +1145,22 @@ void daBgObj_c::setParticle() { u8 hasColor = 0; + u8* pColors = (u8*)partBlockItems; if ((flags & 0x80000000) != 0) { - prmColor.r = partBlockItems[9]; - prmColor.g = partBlockItems[10]; - prmColor.b = partBlockItems[11]; + prmColor.r = pColors[1]; + prmColor.g = pColors[2]; + prmColor.b = pColors[3]; hasColor = 1; } if ((flags & 0x40000000) != 0) { - alpha = partBlockItems[8]; + alpha = pColors[0]; } + pColors += 4; if ((flags & 0x20000000) != 0) { - envColor.a = partBlockItems[12]; - envColor.r = partBlockItems[13]; - envColor.g = partBlockItems[14]; - envColor.b = partBlockItems[15]; + envColor.a = pColors[0]; + envColor.r = pColors[1]; + envColor.g = pColors[2]; + envColor.b = pColors[3]; hasColor = 1; } f32 fVar2 = 0.0f; @@ -1119,40 +1171,43 @@ void daBgObj_c::setParticle() { } dKy_tevstr_c* status; - s32 someFlag = (flags >> 0x14 & 0xf); - if (someFlag != 0) { - J3DModelData* res_ptr = NULL; + u8 modelNumber = (flags & 0xf00000) >> 20; + u8 unusedFlag = (flags & 0xf0000) >> 16; + if (modelNumber != 0) { + J3DModelData* bmd = NULL; + int unused_sp28 = 0; cXyz scale(1.0f, 1.0f, 1.0f); - switch (someFlag) { + switch (modelNumber) { case 1: - res_ptr = (J3DModelData*)dComIfG_getObjectRes("Always", "BreakWoodBox.bmd"); - scale.x = 0.9f; - scale.y = 0.9f; - scale.z = 0.9f; + bmd = (J3DModelData*)dComIfG_getObjectRes("Always", "BreakWoodBox.bmd"); + JUT_ASSERT(1683, bmd != 0); + scale.setall(KREG_F(29) + 0.9f); + break; + default: + // Multi MoveBG: Particle model number is invalid <%d> + OS_REPORT_ERROR("マルチMoveBG:パーティクルモデル番号が不正<%d>\n", modelNumber); + JUT_PANIC(1689, "0"); break; } - status = NULL; - JPABaseEmitter* emitter = dComIfGp_particle_setColor( + JPABaseEmitter* emitter = dComIfGp_particle_set( res_id, ¤t.pos, - status, - NULL, - NULL, - 1.0f, - 0xff, &mRotation, NULL, + 0xff, &dPa_modelEcallBack::getEcallback(), fopAcM_GetRoomNo(this), + NULL, + NULL, &scale ); - dPa_modelEcallBack::setModel(emitter, res_ptr, tevStr, 3, NULL, 0, 0); + dPa_modelEcallBack::setModel(emitter, bmd, tevStr, 3, NULL, 0, 0); } else { - status = dComIfGp_roomControl_getTevStr(fopAcM_GetRoomNo(this)); + fopAc_ac_c* unused_player = dComIfGp_getPlayer(0); dComIfGp_particle_setColor( res_id, ¤t.pos, - status, + dComIfGp_roomControl_getTevStr(fopAcM_GetRoomNo(this)), prmColorPtr, envColorPtr, fVar2, @@ -1164,7 +1219,7 @@ void daBgObj_c::setParticle() { NULL ); } - partBlockItems += 0x10; + partBlockItems += 2; } } @@ -1276,10 +1331,10 @@ void daBgObj_c::orderWait_tri() { /* 8045B7FC-8045B9C4 00221C 01C8+00 1/1 0/0 0/0 .text orderWait_cyl__9daBgObj_cFv */ -// NONMATCHING - r30/r31 swap void daBgObj_c::orderWait_cyl() { if (mCyl.ChkTgHit()) { - if (checkHitAt(mCyl.GetTgHitObj())) { + cCcD_Obj* hitObj = mCyl.GetTgHitObj(); + if (checkHitAt(hitObj)) { setSe(); fopAc_ac_c* hit_ac = mCyl.GetTgHitAc(); @@ -1289,10 +1344,10 @@ void daBgObj_c::orderWait_cyl() { mDoMtx_stack_c::YrotS(-shape_angle.y); mDoMtx_stack_c::multVec(&sp1C, &sp1C); + cXyz sp28; mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); - cXyz sp28; if (sp1C.z > 0.0f) { sp28 = cXyz(0.0f, 0.0f, 1.0f); } else { diff --git a/src/d/actor/d_a_e_bee.cpp b/src/d/actor/d_a_e_bee.cpp index d20f176f20..d6e7e4ffe2 100644 --- a/src/d/actor/d_a_e_bee.cpp +++ b/src/d/actor/d_a_e_bee.cpp @@ -8,6 +8,7 @@ #include "d/d_com_inf_game.h" #include "d/actor/d_a_player.h" #include "d/d_procname.h" +#include "d/d_s_play.h" #include "SSystem/SComponent/c_math.h" /* 80685638-8068563C 000008 0001+03 1/1 0/0 0/0 .bss @1109 */ @@ -543,38 +544,53 @@ static void bee_start(e_bee_class* i_this, bee_s* i_bee) { /* 80684248-80684A94 001AC8 084C+00 1/1 0/0 0/0 .text bee_control__FP11e_bee_class */ // NONMATCHING regalloc static void bee_control(e_bee_class* i_this) { - s8 nest_health = 0; + fopAc_ac_c* parent; + s8 bees_in_nest; + camera_class* camera; + e_nest_class* nest; + int i; + fopAc_ac_c* a_this; + cXyz* hit_pos_p; + bee_s* bee; + s8 nest_health; + s8 active_bees; + s8 bees_flying; + + a_this = (fopAc_ac_c*)i_this; + + nest_health = 0; static cXyz non(-20000.0f, 30000.0f, -15000.0f); - i_this->mCcSph.SetC(i_this->current.pos + non); + i_this->mCcSph.SetC(a_this->current.pos + non); - fopAc_ac_c* parent = fopAcM_SearchByID(i_this->parentActorID); - e_nest_class* nest = NULL; + parent = fopAcM_SearchByID(a_this->parentActorID); + nest = NULL; if (parent != NULL) { if (parent != NULL && parent->health != 0) { nest_health = parent->health; } - nest = static_cast(parent); - i_this->home.pos = nest->mCenterPos; + nest = (e_nest_class*)parent; + a_this->home.pos = nest->mCenterPos; } dComIfG_Ccsp()->Set(&i_this->mCcCyl); + hit_pos_p = NULL; cXyz hit_pos; - cXyz* hit_pos_p = NULL; f32 hit_radius = 120.0f; - + if (i_this->mCcCyl.ChkTgHit()) { + cXyz vec1, vec2; hit_pos_p = &hit_pos; cCcD_Obj* hit_obj = i_this->mCcCyl.GetTgHitObj(); if (hit_obj->ChkAtType(AT_TYPE_BOMB) || hit_obj->ChkAtType(AT_TYPE_BOOMERANG) || hit_obj->ChkAtType(AT_TYPE_IRON_BALL)) { fopAc_ac_c* hit_actor = dCc_GetAc(hit_obj->GetAc()); if (hit_obj->ChkAtType(AT_TYPE_BOMB)) { - hit_radius = 300.0f; + hit_radius = 300.0f + TREG_F(19); hit_pos = hit_actor->current.pos; } else if (hit_obj->ChkAtType(AT_TYPE_IRON_BALL)) { - hit_radius = 100.0f; + hit_radius = 100.0f+ TREG_F(19); daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); cXyz* center = player->getIronBallCenterPos(); if (center != NULL) { @@ -582,18 +598,17 @@ static void bee_control(e_bee_class* i_this) { } } else { hit_pos = hit_actor->current.pos; - hit_radius = 150.0f; + hit_radius = 150.0f + TREG_F(19); } } else { - cXyz vec1, vec2; daPy_py_c* player = daPy_getPlayerActorClass(); if (cc_pl_cut_bit_get() == 0x80) { - i_this->mBoomerangAngle += 0x1400; - vec1.z = 150.0f; + i_this->mBoomerangAngle += (s16)0x1400; + vec1.z = 150.0f + TREG_F(15); } else { - vec1.z = 100.0f; + vec1.z = 100.0f + TREG_F(12); } - mDoMtx_YrotS(*calc_mtx, player->shape_angle.y + i_this->mBoomerangAngle); + cMtx_YrotS(*calc_mtx, player->shape_angle.y + i_this->mBoomerangAngle); vec1.x = 0.0f; vec1.y = 100.0f; MtxPosition(&vec1, &vec2); @@ -603,12 +618,13 @@ static void bee_control(e_bee_class* i_this) { i_this->mBoomerangAngle = 0; } - bee_s* bee = i_this->mBees; - s8 active_bees = 0; + bee = i_this->mBees; + active_bees = 0; + cXyz vec3; ccCylSet = 0; - s8 bees_in_nest = 0; - s8 bees_flying = 0; - camera_class* camera = dComIfGp_getCamera(0); + bees_in_nest = 0; + bees_flying = 0; + camera = dComIfGp_getCamera(0); if ((nest != NULL && nest->mDemoStage == 0 && dComIfGp_event_runCheck()) || !daPy_getPlayerActorClass()->checkSwimUp() @@ -622,16 +638,15 @@ static void bee_control(e_bee_class* i_this) { i_this->mHomeTimer = 10; } - for (int i = 0; i < i_this->mNumBees; i++, bee++) { + for (i = 0; i < i_this->mNumBees; i++, bee++) { if (bee->mAction != bee_s::ACT_DEAD) { - bee->mNoDraw = false; active_bees++; - cXyz vec3; + bee->mNoDraw = false; if (dComIfGp_checkPlayerStatus0(0, 0x200000)) { vec3.x = bee->mPos.x - camera->lookat.eye.x; vec3.z = bee->mPos.z - camera->lookat.eye.z; - if (JMAFastSqrt(vec3.x * vec3.x + vec3.z * vec3.z) > 2500.0f) { + if (JMAFastSqrt(vec3.x * vec3.x + vec3.z * vec3.z) > NREG_F(0) + 2500.0f) { bee->mNoDraw = true; } } @@ -646,7 +661,7 @@ static void bee_control(e_bee_class* i_this) { } else if (bee->mAction <= bee_s::ACT_FLY_HOME_B) { bee->mCounter++; if (bee_fly_action(i_this, bee)) { - i_this->current.pos = bee->mPos; + a_this->current.pos = bee->mPos; bees_flying++; } if (hit_pos_p != NULL) { @@ -654,7 +669,7 @@ static void bee_control(e_bee_class* i_this) { if (vec3.abs() < hit_radius) { bee->mAction = bee_s::ACT_FAIL; bee->mMode = 0; - mDoMtx_YrotS(*calc_mtx, cM_atan2s(vec3.x, vec3.z)); + cMtx_YrotS(*calc_mtx, cM_atan2s(vec3.x, vec3.z)); vec3.x = 0.0f; vec3.y = cM_rndF(10.0f) + 20.0f; vec3.z = cM_rndF(10.0f) + 20.0f; @@ -664,7 +679,7 @@ static void bee_control(e_bee_class* i_this) { bee->mTimer = 0; bee->mSound.startSound(Z2SE_EN_BE_DEATH, 0, -1); cXyz hit_mark_scale(0.35f, 0.35f, 0.35f); - dComIfGp_setHitMark(1, i_this, &bee->mPos, NULL, &hit_mark_scale, 0); + dComIfGp_setHitMark(1, a_this, &bee->mPos, NULL, &hit_mark_scale, 0); } } } else if (bee->mAction == bee_s::ACT_FAIL) { @@ -673,12 +688,13 @@ static void bee_control(e_bee_class* i_this) { bees_flying++; bee_start(i_this, bee); } - bee->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + bee->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this))); } } if (active_bees == 0) { - fopAcM_delete(i_this); + fopAcM_delete(a_this); + OS_REPORT("E_BEE DELETED \n"); } else { if (bees_flying != 0) { if (dComIfGp_event_runCheck()) { @@ -687,19 +703,20 @@ static void bee_control(e_bee_class* i_this) { i_this->mSound.playBeeGroupSound(Z2SE_EN_BE_FLY, bees_flying); } } - i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this))); if (nest != NULL) { if (bees_in_nest != 0) { nest->mBeeSound.playBeeGroupSound(Z2SE_EN_BE_STAY, bees_in_nest); } - nest->mBeeSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + nest->mBeeSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this))); } } if (!dComIfGp_event_runCheck()) { dComIfG_Ccsp()->Set(&i_this->mCcSph); if (i_this->mCcSph.ChkAtHit()) { - fopAc_ac_c* hit_actor = dCc_GetAc(i_this->mCcSph.GetAtHitObj()->GetAc()); + cCcD_Obj* hitObj = i_this->mCcSph.GetAtHitObj(); + fopAc_ac_c* hit_actor = dCc_GetAc(hitObj->GetAc()); if (hit_actor != NULL && fopAcM_GetName(hit_actor) == PROC_ALINK) { dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); } diff --git a/src/d/actor/d_a_kytag03.cpp b/src/d/actor/d_a_kytag03.cpp index 1499dcb8a6..bc614b57ae 100644 --- a/src/d/actor/d_a_kytag03.cpp +++ b/src/d/actor/d_a_kytag03.cpp @@ -150,7 +150,7 @@ static void odour_move(kytag03_class* i_this) { dScnKy_env_light_c* kankyo = dKy_getEnvlight(); dPath* var_r27; - dKankyo_odour_Packet* packet = kankyo->mpOdourPacket; + dKankyo_odour_Packet* packet = kankyo->mOdourData.mpOdourPacket; dPath* var_r25; cXyz sp94; @@ -449,7 +449,7 @@ static int daKytag03_Create(fopAc_ac_c* i_this) { a_this->mpPath = set_path_info(i_this); a_this->field_0x570 = 0.0f; a_this->field_0x580 = 0; - g_env_light.field_0xf21 = 1; + g_env_light.mOdourData.field_0xf21 = 1; } else { if (a_this->field_0x585 == 0xFF) { return cPhs_UNK3_e; diff --git a/src/d/actor/d_a_kytag10.cpp b/src/d/actor/d_a_kytag10.cpp index 22548c8ecc..1a071f12e8 100644 --- a/src/d/actor/d_a_kytag10.cpp +++ b/src/d/actor/d_a_kytag10.cpp @@ -153,7 +153,7 @@ static int daKytag10_IsDelete(kytag10_class* i_this) { /* 8052917C-80529248 0005FC 00CC+00 1/0 0/0 0/0 .text daKytag10_Delete__FP13kytag10_class */ static int daKytag10_Delete(kytag10_class* i_this) { - g_env_light.field_0xf21 = 0; + g_env_light.mOdourData.field_0xf21 = 0; if (i_this->mpEmitter1 != NULL) { i_this->mpEmitter1->deleteAllParticle(); diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index b87f2c7fb3..ac04aeb957 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -1273,12 +1273,8 @@ void dKyr_snow_init() { } /* 8005FD48-80061324 05A688 15DC+00 0/0 1/1 0/0 .text dKyr_snow_move__Fv */ -// NONMATCHING mostly matches, 1 out of order instruction void dKyr_snow_move() { - f32* temp_r26; - cXyz* temp_r25; dKankyo_snow_Packet* snow_packet = g_env_light.mpSnowPacket; - SNOW_EFF* effect; camera_class* camera = (camera_class*)dComIfGp_getCamera(0); fopAc_ac_c* player = dComIfGp_getPlayer(0); @@ -1315,9 +1311,7 @@ void dKyr_snow_move() { } snow_packet->field_0x6d74 = camera->lookat.eye; - spA0.z = 0.0f; - spA0.y = 0.0f; - spA0.x = 0.0f; + spA0.x = spA0.y = spA0.z = 0.0f; cXyz* temp_r21 = dKyw_get_wind_vec(); f32 var_f20 = dKyw_get_wind_pow(); @@ -1349,37 +1343,31 @@ void dKyr_snow_move() { f32 gravity = -(2.0f + cM_rndF(6.5f)); f32 speed = 2.0f * (5.0f + (f32)(i & 15)); - effect = &snow_packet->mSnowEff[i]; switch (snow_packet->mSnowEff[i].mStatus) { case 0: - effect->mWindSpeed = speed; - effect->mGravity = gravity; - effect->mTimer = 0; - effect->mBasePos.x = spAC.x + cM_rndFX(1100.0f); - effect->mBasePos.y = spAC.y + 1100.0f; - effect->mBasePos.z = spAC.z + cM_rndFX(1100.0f); - effect->mPosition.x = spB8.x + cM_rndFX(550.0f); - effect->mPosition.y = spB8.y + 550.0f; - effect->mPosition.z = spB8.z + cM_rndFX(550.0f); - effect->mScale = 0.0f; - effect->mPosWaveX = cM_rndF(65536.0f); - effect->mPosWaveZ = cM_rndF(65536.0f); - effect->mStatus++; + snow_packet->mSnowEff[i].mWindSpeed = speed; + snow_packet->mSnowEff[i].mGravity = gravity; + snow_packet->mSnowEff[i].mTimer = 0; + snow_packet->mSnowEff[i].mBasePos.x = spAC.x + cM_rndFX(1100.0f); + snow_packet->mSnowEff[i].mBasePos.y = spAC.y + 1100.0f; + snow_packet->mSnowEff[i].mBasePos.z = spAC.z + cM_rndFX(1100.0f); + snow_packet->mSnowEff[i].mPosition.x = spB8.x + cM_rndFX(550.0f); + snow_packet->mSnowEff[i].mPosition.y = spB8.y + 550.0f; + snow_packet->mSnowEff[i].mPosition.z = spB8.z + cM_rndFX(550.0f); + snow_packet->mSnowEff[i].mScale = 0.0f; + snow_packet->mSnowEff[i].mPosWaveX = cM_rndF(65536.0f); + snow_packet->mSnowEff[i].mPosWaveZ = cM_rndF(65536.0f); + snow_packet->mSnowEff[i].mStatus++; break; case 1: - f32 target = cM_rndFX(0.08f); - temp_r26 = &effect->mWindSpeed; - target = effect->mWindSpeed - target; - - cLib_addCalc(temp_r26, target, 0.5f, 0.1f, 0.01f); + cLib_addCalc(&snow_packet->mSnowEff[i].mWindSpeed, snow_packet->mSnowEff[i].mWindSpeed - cM_rndFX(0.08f), 0.5f, 0.1f, 0.01f); cXyz sp4C; sp88 = sp94; - temp_r25 = &effect->mPosition; - if (camera->lookat.eye.abs(*temp_r25) < 500.0f && - effect->mPosition.y < temp_f19 + 250.0f) + if (camera->lookat.eye.abs(snow_packet->mSnowEff[i].mPosition) < 500.0f && + snow_packet->mSnowEff[i].mPosition.y < temp_f19 + 250.0f) { - f32 var_f1_3 = ((temp_f19 + 250.0f) - effect->mPosition.y) / 250.0f; + f32 var_f1_3 = ((temp_f19 + 250.0f) - snow_packet->mSnowEff[i].mPosition.y) / 250.0f; if (var_f1_3 > 1.0f) { var_f1_3 = 1.0f; } @@ -1387,26 +1375,26 @@ void dKyr_snow_move() { sp88.y = var_f1_3 * 0.45f; } - s16 wave_x = effect->mPosWaveX; - s16 wave_z = effect->mPosWaveZ; + s16 wave_x = snow_packet->mSnowEff[i].mPosWaveX; + s16 wave_z = snow_packet->mSnowEff[i].mPosWaveZ; sp4C.x = cM_scos(wave_x) * cM_ssin(wave_z); sp4C.y = cM_ssin(wave_x); sp4C.z = cM_scos(wave_x) * cM_scos(wave_z); - effect->mPosition.x += sp88.x * *temp_r26; - effect->mPosition.z += sp88.z * *temp_r26; - effect->mPosition.y += effect->mGravity + (sp88.y * *temp_r26); + snow_packet->mSnowEff[i].mPosition.x += sp88.x * snow_packet->mSnowEff[i].mWindSpeed; + snow_packet->mSnowEff[i].mPosition.z += sp88.z * snow_packet->mSnowEff[i].mWindSpeed; + snow_packet->mSnowEff[i].mPosition.y += snow_packet->mSnowEff[i].mGravity + (sp88.y * snow_packet->mSnowEff[i].mWindSpeed); - effect->mPosition.x += sp4C.x * 5.3f; - effect->mPosition.y += sp4C.y * 5.3f; - effect->mPosition.z += sp4C.z * 5.3f; + snow_packet->mSnowEff[i].mPosition.x += sp4C.x * 5.3f; + snow_packet->mSnowEff[i].mPosition.y += sp4C.y * 5.3f; + snow_packet->mSnowEff[i].mPosition.z += sp4C.z * 5.3f; sp88 = sp94; - if (camera->lookat.eye.abs(*temp_r25) < 500.0f && - effect->mBasePos.y < temp_f19 + 250.0f) + if (camera->lookat.eye.abs(snow_packet->mSnowEff[i].mPosition) < 500.0f && + snow_packet->mSnowEff[i].mBasePos.y < temp_f19 + 250.0f) { - f32 var_f1_5 = ((temp_f19 + 250.0f) - effect->mBasePos.y) / 250.0f; + f32 var_f1_5 = ((temp_f19 + 250.0f) - snow_packet->mSnowEff[i].mBasePos.y) / 250.0f; if (var_f1_5 > 1.0f) { var_f1_5 = 1.0f; } @@ -1414,73 +1402,74 @@ void dKyr_snow_move() { sp88.y = var_f1_5 * 0.35f; } - effect->mBasePos.x += sp88.x * *temp_r26; - effect->mBasePos.z += sp88.z * *temp_r26; - effect->mBasePos.y += effect->mGravity + (sp88.y * *temp_r26); + snow_packet->mSnowEff[i].mBasePos.x += sp88.x * snow_packet->mSnowEff[i].mWindSpeed; + snow_packet->mSnowEff[i].mBasePos.z += sp88.z * snow_packet->mSnowEff[i].mWindSpeed; + snow_packet->mSnowEff[i].mBasePos.y += snow_packet->mSnowEff[i].mGravity + (sp88.y * snow_packet->mSnowEff[i].mWindSpeed); - effect->mBasePos.x += sp4C.x * 5.3f; - effect->mBasePos.y += sp4C.y * 5.3f; - effect->mBasePos.z += sp4C.z * 5.3f; + snow_packet->mSnowEff[i].mBasePos.x += sp4C.x * 5.3f; + snow_packet->mSnowEff[i].mBasePos.y += sp4C.y * 5.3f; + snow_packet->mSnowEff[i].mBasePos.z += sp4C.z * 5.3f; - cLib_addCalc(&effect->mPosWaveX, effect->mPosWaveX + cM_rndF(3000.0f), 0.25f, + cLib_addCalc(&snow_packet->mSnowEff[i].mPosWaveX, snow_packet->mSnowEff[i].mPosWaveX + cM_rndF(3000.0f), 0.25f, 1500.0f, 0.001f); - cLib_addCalc(&effect->mPosWaveZ, effect->mPosWaveZ + cM_rndF(3000.0f), 0.25f, + cLib_addCalc(&snow_packet->mSnowEff[i].mPosWaveZ, snow_packet->mSnowEff[i].mPosWaveZ + cM_rndF(3000.0f), 0.25f, 1500.0f, 0.001f); - sp7C = effect->mPosition; + sp7C = snow_packet->mSnowEff[i].mPosition; f32 var_f1_6 = sp7C.abs(spB8); - if (effect->mTimer == 0) { + if (snow_packet->mSnowEff[i].mTimer == 0) { if (var_f1_6 > 550.0f) { - effect->mTimer = 10; - *temp_r26 = speed; - effect->mGravity = gravity; + snow_packet->mSnowEff[i].mTimer = 10; + snow_packet->mSnowEff[i].mWindSpeed = speed; + snow_packet->mSnowEff[i].mGravity = gravity; if (sp7C.abs(spB8) > 600.0f) { - effect->mPosition.x = spB8.x + cM_rndFX(550.0f); - effect->mPosition.y = spB8.y + cM_rndFX(550.0f); - effect->mPosition.z = spB8.z + cM_rndFX(550.0f); + snow_packet->mSnowEff[i].mPosition.x = spB8.x + cM_rndFX(550.0f); + snow_packet->mSnowEff[i].mPosition.y = spB8.y + cM_rndFX(550.0f); + snow_packet->mSnowEff[i].mPosition.z = spB8.z + cM_rndFX(550.0f); } else { f32 temp_f26_2 = cM_rndFX(27.5f); get_vectle_calc(&sp7C, &spB8, &sp70); - effect->mPosition.x = spB8.x + sp70.x * (temp_f26_2 + 550.0f); - effect->mPosition.y = spB8.y + sp70.y * (temp_f26_2 + 550.0f); - effect->mPosition.z = spB8.z + sp70.z * (temp_f26_2 + 550.0f); + snow_packet->mSnowEff[i].mPosition.x = spB8.x + sp70.x * (temp_f26_2 + 550.0f); + snow_packet->mSnowEff[i].mPosition.y = spB8.y + sp70.y * (temp_f26_2 + 550.0f); + snow_packet->mSnowEff[i].mPosition.z = spB8.z + sp70.z * (temp_f26_2 + 550.0f); } } } else { - effect->mTimer--; + snow_packet->mSnowEff[i].mTimer--; } - sp7C = effect->mBasePos; - if (sp7C.abs(spAC) > 1100.0f) { + sp7C = snow_packet->mSnowEff[i].mBasePos; + f32 sp18 = sp7C.abs(spAC); + if (sp18 > 1100.0f) { if (sp7C.abs(spAC) > 1150.0f) { - effect->mBasePos.x = spAC.x + cM_rndFX(1100.0f); - effect->mBasePos.y = spAC.y + cM_rndFX(1100.0f); - effect->mBasePos.z = spAC.z + cM_rndFX(1100.0f); + snow_packet->mSnowEff[i].mBasePos.x = spAC.x + cM_rndFX(1100.0f); + snow_packet->mSnowEff[i].mBasePos.y = spAC.y + cM_rndFX(1100.0f); + snow_packet->mSnowEff[i].mBasePos.z = spAC.z + cM_rndFX(1100.0f); } else { f32 temp_f26_3 = cM_rndFX(55.0f); get_vectle_calc(&sp7C, &spAC, &sp70); - effect->mBasePos.x = spAC.x + sp70.x * (temp_f26_3 + 1100.0f); - effect->mBasePos.y = spAC.y + sp70.y * (temp_f26_3 + 1100.0f); - effect->mBasePos.z = spAC.z + sp70.z * (temp_f26_3 + 1100.0f); + snow_packet->mSnowEff[i].mBasePos.x = spAC.x + sp70.x * (temp_f26_3 + 1100.0f); + snow_packet->mSnowEff[i].mBasePos.y = spAC.y + sp70.y * (temp_f26_3 + 1100.0f); + snow_packet->mSnowEff[i].mBasePos.z = spAC.z + sp70.z * (temp_f26_3 + 1100.0f); } } - break; } - sp7C = effect->mPosition; + sp7C = snow_packet->mSnowEff[i].mPosition; - f32 var_f26 = sp7C.abs(camera->lookat.eye) / 100.0f; + f32 var_f1_11 = sp7C.abs(camera->lookat.eye); + f32 var_f26 = var_f1_11 / 100.0f; if (var_f26 > 1.0) { var_f26 = 1.0; } var_f26 *= 0.4f; - f32 var_f1_11 = sp7C.abs(spB8); + var_f1_11 = sp7C.abs(spB8); if (var_f1_11 > 300.0f) { f32 var_f1_12 = (550.0f - var_f1_11) / 250.0f; if (var_f1_12 < 0.0f) { @@ -1491,12 +1480,13 @@ void dKyr_snow_move() { } if (i > g_env_light.mSnowCount - 1) { - cLib_addCalc(&effect->mScale, 0.0f, 0.2f, 0.1f, 0.01f); + var_f26 = 0.0f; + cLib_addCalc(&snow_packet->mSnowEff[i].mScale, var_f26, 0.2f, 0.1f, 0.01f); } else { - effect->mScale = var_f26; + snow_packet->mSnowEff[i].mScale = var_f26; } - if (i > g_env_light.mSnowCount - 1 && effect->mScale < 0.01f) { + if (i > g_env_light.mSnowCount - 1 && snow_packet->mSnowEff[i].mScale < 0.01f) { if (i == snow_packet->field_0x6d88 - 1) { snow_packet->field_0x6d88--; } @@ -1504,46 +1494,48 @@ void dKyr_snow_move() { if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) { if (sp7C.z > -340.0f) { - effect->mScale = 0.0f; + snow_packet->mSnowEff[i].mScale = 0.0f; } } else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) { if (sp7C.z > 9800.0f) { - effect->mScale = 0.0f; + snow_packet->mSnowEff[i].mScale = 0.0f; } } - sp7C = effect->mBasePos; + sp7C = snow_packet->mSnowEff[i].mBasePos; - f32 var_f26_3 = sp7C.abs(camera->lookat.eye) / 100.0f; - if (var_f26_3 > 1.0) { - var_f26_3 = 1.0; + var_f1_11 = sp7C.abs(camera->lookat.eye); + f32 temp_f29 = var_f1_11 / 100.0f; + if (temp_f29 > 1.0) { + temp_f29 = 1.0; } - var_f26_3 *= 0.38f; + temp_f29 *= 0.38f; - f32 var_f1_14 = sp7C.abs(spAC); - if (var_f1_14 > 850.0f) { - f32 var_f1_15 = (1100.0f - var_f1_14) / 250.0f; + var_f1_11 = sp7C.abs(spAC); + if (var_f1_11 > 850.0f) { + f32 var_f1_15 = (1100.0f - var_f1_11) / 250.0f; if (var_f1_15 < 0.0f) { var_f1_15 = 0.0f; } - var_f26_3 *= var_f1_15; + temp_f29 *= var_f1_15; } if (i > g_env_light.mSnowCount - 1) { - cLib_addCalc(&effect->field_0x30, 0.0f, 0.2f, 0.1f, 0.01f); + temp_f29 = 0.0f; + cLib_addCalc(&snow_packet->mSnowEff[i].field_0x30, temp_f29, 0.2f, 0.1f, 0.01f); } else { - effect->field_0x30 = var_f26_3; + snow_packet->mSnowEff[i].field_0x30 = temp_f29; } if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) { if (sp7C.z > -340.0f) { - effect->field_0x30 = 0.0f; + snow_packet->mSnowEff[i].field_0x30 = 0.0f; } } else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) { if (sp7C.z > 9800.0f) { - effect->field_0x30 = 0.0f; + snow_packet->mSnowEff[i].field_0x30 = 0.0f; } } } @@ -1836,7 +1828,6 @@ void cloud_shadow_move() { } /* 800620AC-80062ADC 05C9EC 0A30+00 0/0 1/1 0/0 .text vrkumo_move__Fv */ -// NONMATCHING - switch case issue, fsubs instead of fsub void vrkumo_move() { cXyz wind_vecpow = dKyw_get_wind_vecpow(); dKankyo_vrkumo_Packet* vrkumo_packet = g_env_light.mpVrkumoPacket; @@ -1896,6 +1887,13 @@ void vrkumo_move() { if (filelist != NULL) { sp2C = dStage_FileList_dt_SeaLevel(filelist); + #ifdef DEBUG + if (g_kankyoHIO.field_0xB4) { + sp2C = g_kankyoHIO.field_0xB8; + } else { + g_kankyoHIO.field_0xB8 = sp2C; + } + #endif } sp6C -= 0.09f * (camera->lookat.eye.y - sp2C); @@ -1911,7 +1909,8 @@ void vrkumo_move() { } f32 var_f31 = sp34 * cM_ssin(sp8); - if (fabsf(var_f31 < 5000.0f)) { + // @bug - parenthesis should not be on the condition + if ((f32)fabs(var_f31 < 5000.0f)) { if (var_f31 > 0.0f) { var_f31 += 5000.0f; } else { @@ -1923,7 +1922,8 @@ void vrkumo_move() { vrkumo_packet->mVrkumoEff[i].mPosition.y = 0.0f; var_f31 = sp34 * cM_scos(sp8); - if (fabsf(var_f31 < 5000.0f)) { + // @bug - parenthesis should not be on the condition + if ((f32)fabs(var_f31 < 5000.0f)) { if (var_f31 > 0.0f) { var_f31 += 5000.0f; } else { @@ -1951,7 +1951,8 @@ void vrkumo_move() { } var_f31 = sp34 * cM_ssin(sp8); - if (fabsf(var_f31 < 5000.0f)) { + // @bug - parenthesis should not be on the condition + if ((f32)fabs(var_f31 < 5000.0f)) { if (var_f31 > 0.0f) { var_f31 += 5000.0f; } else { @@ -1963,7 +1964,9 @@ void vrkumo_move() { vrkumo_packet->mVrkumoEff[i].mPosition.y = 0.0f; var_f31 = sp34 * cM_scos(sp8); - if (fabsf(var_f31 < 5000.0f)) { + + // @bug - parenthesis should not be on the condition + if ((f32)fabs(var_f31 < 5000.0f)) { if (var_f31 > 0.0f) { var_f31 += 5000.0f; } else { @@ -1994,7 +1997,7 @@ void vrkumo_move() { vrkumo_packet->mVrkumoEff[i].mPosition.z += wind_vecpow.z * (sp70 * vrkumo_packet->mVrkumoEff[i].mSpeed) * vrkumo_packet->mVrkumoEff[i].mDistFalloff; } break; - case 2: + case 3: break; } @@ -2693,7 +2696,6 @@ void dKyr_drawSun(Mtx drawMtx, cXyz* ppos, GXColor& unused, u8** tex) { /* 8006444C-8006562C 05ED8C 11E0+00 0/0 1/1 0/0 .text * dKyr_drawLenzflare__FPA4_fP4cXyzR8_GXColorPPUc */ -// NONMATCHING - some issue with sp5C and float to int conversions void dKyr_drawLenzflare(Mtx drawMtx, cXyz* ppos, GXColor& param_2, u8** tex) { dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket; dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket; @@ -2983,8 +2985,8 @@ void dKyr_drawLenzflare(Mtx drawMtx, cXyz* ppos, GXColor& param_2, u8** tex) { GXColor sp60; sp60.r = 0xFF; + sp60.g = 0xFF; sp60.b = 0xFF; - sp60.a = 0xFF; f32 sp5C = 0.12f; color_reg0.r = ((f32)spD0.r * (1.0f - sp5C)) + ((f32)sp60.r * sp5C); @@ -3750,7 +3752,6 @@ void dKyr_drawHousi(Mtx drawMtx, u8** tex) { } /* 80067488-800685DC 061DC8 1154+00 0/0 1/1 0/0 .text dKyr_drawSnow__FPA4_fPPUc */ -// NONMATCHING - small branching issue void dKyr_drawSnow(Mtx drawMtx, u8** tex) { camera_class* camera = (camera_class*)dComIfGp_getCamera(0); dKankyo_snow_Packet* snow_packet = g_env_light.mpSnowPacket; @@ -3900,7 +3901,7 @@ void dKyr_drawSnow(Mtx drawMtx, u8** tex) { if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0) { if (dComIfGp_roomControl_getStayNo() == 4) { if ((sp7C.x > 2079.0f && sp7C.x < 3013.0f && sp7C.y < 864.0f && sp7C.z > -6000.0f && sp7C.z < -4145.0f) || - (sp7C.x > -2960.0f && sp7C.z > -880.0f && sp7C.z < -6000.0f) || + sp7C.x < -2960.0f || sp7C.z > -880.0f || sp7C.z < -6000.0f || (sp7C.z < -4920.0f && sp7C.y < 864.0f && sp7C.x < -2000.0f)) { continue; @@ -4610,6 +4611,14 @@ void drawVrkumo(Mtx drawMtx, GXColor& color, u8** tex) { if (filelist != NULL) { sp70 = dStage_FileList_dt_SeaLevel(filelist); + + #ifdef DEBUG + if (g_kankyoHIO.field_0xB4) { + sp70 = g_kankyoHIO.field_0xB8; + } else { + g_kankyoHIO.field_0xB8 = sp70; + } + #endif } unused = 1.0f - (0.09f * (camera->lookat.eye.y - sp70)); @@ -4710,8 +4719,14 @@ void drawVrkumo(Mtx drawMtx, GXColor& color, u8** tex) { static f32 howa_loop_cnt = 0.0f; + #ifdef DEBUG + spAC = g_kankyoHIO.field_0x3f4; + spA8 = g_kankyoHIO.field_0x3f8; + #else spAC = 0.6f; spA8 = 0.84f; + #endif + if (dKy_darkworld_check()) { spAC = 0.8f; spA8 = 0.8f; @@ -5187,7 +5202,7 @@ void dKyr_shstar_move() {} /* 8006B8E4-8006B924 066224 0040+00 0/0 1/1 0/0 .text dKyr_odour_init__Fv */ void dKyr_odour_init() { dScnKy_env_light_c* envlight = dKy_getEnvlight(); - dKankyo_odour_Packet* odour_packet = envlight->mpOdourPacket; + dKankyo_odour_Packet* odour_packet = envlight->mOdourData.mpOdourPacket; for (int i = 0; i < 2000; i++) { odour_packet->mOdourEff[i].mStatus = 0; @@ -5198,10 +5213,10 @@ void dKyr_odour_init() { } /* 8006B924-8006BE0C 066264 04E8+00 0/0 1/1 0/0 .text dKyr_odour_move__Fv */ -// NONMATCHING - some small regalloc void dKyr_odour_move() { dScnKy_env_light_c* envlight = dKy_getEnvlight(); - dKankyo_odour_Packet* odour_packet = envlight->mpOdourPacket; + dKy_Odour_Data* pOdourData = &envlight->mOdourData; + dKankyo_odour_Packet* odour_packet = pOdourData->mpOdourPacket; Mtx camMtx; cXyz sp20(0.0f, 1.0f, 0.0f); @@ -5213,8 +5228,8 @@ void dKyr_odour_move() { return; } - odour_packet->field_0x17724 -= (int)cM_rndF(150.0f) + 430; - odour_packet->field_0x17726 -= (int)cM_rndF(50.0f) + 200; + odour_packet->field_0x17724 -= ((int)cM_rndF(150.0f) + 430); + odour_packet->field_0x17726 -= ((int)cM_rndF(50.0f) + 200); for (int i = 0; i < 2000; i++) { EF_ODOUR_EFF* effect = &odour_packet->mOdourEff[i]; @@ -5241,13 +5256,15 @@ void dKyr_odour_move() { } temp_f31 = 0.3f; - f32 temp_f30 = cM_scos(odour_packet->field_0x17724 + ((s16)(int)temp_f29 * 38)); + f32 temp_f30 = cM_scos(odour_packet->field_0x17724 + 38 * (s16)temp_f29); effect->mPosition.x = 60.0f * (temp_f30 * temp_f31); effect->mPosition.z = 60.0f * (temp_f30 * temp_f31); if (effect->mStatus < 10) { - effect->mPosition.y = 90.0f * ((0.8f + cM_scos(odour_packet->field_0x17724 + ((int)temp_f29 * 160))) * temp_f31); - effect->mPosition.y += 110.0f * ((0.8f + cM_ssin(odour_packet->field_0x17726 + ((int)temp_f29 * 45))) * temp_f31); + temp_f30 = cM_scos(odour_packet->field_0x17724 + ((s16)temp_f29 * 160)); + effect->mPosition.y = 90.0f * ((0.8f + temp_f30) * temp_f31); + temp_f30 = cM_ssin(odour_packet->field_0x17726 + ((s16)temp_f29 * 45)); + effect->mPosition.y += 110.0f * ((0.8f + temp_f30) * temp_f31); } else { temp_f30 = cM_scos((int)(78.0f * temp_f29) + (int)(f32)odour_packet->field_0x17724); @@ -5255,7 +5272,7 @@ void dKyr_odour_move() { effect->mPosition.x = 150.0f * (temp_f30 * temp_f31); effect->mPosition.z = 140.0f * (temp_f30 * temp_f31); - temp_f30 = cM_ssin(((int)temp_f29 * 45) + (int)(f32)odour_packet->field_0x17726); + temp_f30 = cM_ssin(((s16)temp_f29 * 45) + (int)(f32)odour_packet->field_0x17726); effect->mPosition.x += 100.0f * (temp_f30 * temp_f31); effect->mPosition.z += 100.0f * (temp_f30 * temp_f31); } @@ -5288,7 +5305,7 @@ void dKyr_odour_move() { // NONMATCHING - regalloc void dKyr_odour_draw(Mtx drawMtx, u8** tex) { dScnKy_env_light_c* envlight = dKy_getEnvlight(); - dKankyo_odour_Packet* odour_packet = envlight->mpOdourPacket; + dKankyo_odour_Packet* odour_packet = envlight->mOdourData.mpOdourPacket; camera_class* camera = (camera_class*)dComIfGp_getCamera(0); static f32 rot = 0.0f; diff --git a/src/d/d_kankyo_wether.cpp b/src/d/d_kankyo_wether.cpp index bad0c4fef7..11ea9423dc 100644 --- a/src/d/d_kankyo_wether.cpp +++ b/src/d/d_kankyo_wether.cpp @@ -266,7 +266,7 @@ static void dKyw_shstar_Draw() { /* 800573E4-80057414 051D24 0030+00 1/1 0/0 0/0 .text dKyw_odour_packet__Fi */ static void dKyw_odour_packet(int i_type) { - dKyw_setDrawPacketListIndScreen(g_env_light.mpOdourPacket, i_type); + dKyw_setDrawPacketListIndScreen(g_env_light.mOdourData.mpOdourPacket, i_type); } /* 80057414-80057438 051D54 0024+00 1/1 0/0 0/0 .text dKyw_Odour_Draw__Fv */ @@ -315,10 +315,10 @@ void dKyw_wether_init() { g_env_light.mMoyaMode = 0; g_env_light.mHousiInitialized = false; g_env_light.mHousiCount = 0; - g_env_light.mOdourPacketStatus = 0; - g_env_light.field_0xf24 = 0; - g_env_light.field_0xf21 = 0; - g_env_light.mpOdourPacket = NULL; + g_env_light.mOdourData.mOdourPacketStatus = 0; + g_env_light.mOdourData.field_0xf24 = 0; + g_env_light.mOdourData.field_0xf21 = 0; + g_env_light.mOdourData.mpOdourPacket = NULL; g_env_light.field_0x1038 = 0; g_env_light.field_0x103c = 0; g_env_light.mMudInitialized = 0; @@ -407,9 +407,9 @@ void dKyw_wether_delete() { g_env_light.mpCloudPacket = NULL; } - if (g_env_light.mOdourPacketStatus) { - delete g_env_light.mpOdourPacket; - g_env_light.mpOdourPacket = NULL; + if (g_env_light.mOdourData.mOdourPacketStatus) { + delete g_env_light.mOdourData.mpOdourPacket; + g_env_light.mOdourData.mpOdourPacket = NULL; } if (g_env_light.mMudInitialized) { @@ -840,35 +840,35 @@ static void wether_move_housi() { /* 800593DC-80059580 053D1C 01A4+00 1/1 0/0 0/0 .text wether_move_odour__Fv */ static void wether_move_odour() { - switch (g_env_light.mOdourPacketStatus) { + switch (g_env_light.mOdourData.mOdourPacketStatus) { case 0: - if (g_env_light.field_0xf21 != 0) { - g_env_light.mpOdourPacket = new (32) dKankyo_odour_Packet(); + if (g_env_light.mOdourData.field_0xf21 != 0) { + g_env_light.mOdourData.mpOdourPacket = new (32) dKankyo_odour_Packet(); - if (g_env_light.mpOdourPacket != NULL) { - g_env_light.mpOdourPacket->mpResTex = (u8*)dComIfG_getObjectRes("Always", 0x53); + if (g_env_light.mOdourData.mpOdourPacket != NULL) { + g_env_light.mOdourData.mpOdourPacket->mpResTex = (u8*)dComIfG_getObjectRes("Always", 0x53); dKyr_odour_init(); dKyr_odour_move(); - g_env_light.mOdourPacketStatus = 1; + g_env_light.mOdourData.mOdourPacketStatus = 1; } } break; case 1: - if (g_env_light.field_0xf21 == 0) { - g_env_light.mOdourPacketStatus = 0; - if (g_env_light.mpOdourPacket != NULL) { - delete g_env_light.mpOdourPacket; - g_env_light.mpOdourPacket = NULL; + if (g_env_light.mOdourData.field_0xf21 == 0) { + g_env_light.mOdourData.mOdourPacketStatus = 0; + if (g_env_light.mOdourData.mpOdourPacket != NULL) { + delete g_env_light.mOdourData.mpOdourPacket; + g_env_light.mOdourData.mpOdourPacket = NULL; } } else { dKyr_odour_move(); } break; case 2: - g_env_light.field_0xf21 = 0; - g_env_light.mOdourPacketStatus = 0; - delete g_env_light.mpOdourPacket; - g_env_light.mpOdourPacket = NULL; + g_env_light.mOdourData.field_0xf21 = 0; + g_env_light.mOdourData.mOdourPacketStatus = 0; + delete g_env_light.mOdourData.mpOdourPacket; + g_env_light.mOdourData.mpOdourPacket = NULL; break; } } @@ -1153,7 +1153,7 @@ void dKyw_wether_draw() { dKyw_Housi_Draw(); } - if (g_env_light.mOdourPacketStatus != 0) { + if (g_env_light.mOdourData.mOdourPacketStatus != 0) { dKyw_Odour_Draw(); }