summaryrefslogtreecommitdiff
path: root/src/d
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-11-18 19:54:18 -0800
committerJasper St. Pierre <jstpierre@mecheye.net>2023-11-18 19:54:18 -0800
commit98da19dfac54a7400512e5be869cd8093b9f0bd6 (patch)
treeda9f6d32f26699df3036a099cab82e344a6a6040 /src/d
parenta9c6b0fca242830a45892785cc202a32c4df5a75 (diff)
d_a_sea start
Diffstat (limited to 'src/d')
-rw-r--r--src/d/actor/d_a_sea.cpp339
1 files changed, 286 insertions, 53 deletions
diff --git a/src/d/actor/d_a_sea.cpp b/src/d/actor/d_a_sea.cpp
index 6956e07d..5ed8980c 100644
--- a/src/d/actor/d_a_sea.cpp
+++ b/src/d/actor/d_a_sea.cpp
@@ -4,48 +4,142 @@
//
#include "d/actor/d_a_sea.h"
-#include "dolphin/types.h"
+#include "d/d_com_inf_game.h"
+#include "d/d_procname.h"
+#include "d/d_stage.h"
+#include "m_Do/m_Do_lib.h"
+#include "JSystem/JKernel/JKRHeap.h"
+
+class sea_class : public fopAc_ac_c {
+ /* 0x290 */ u32 field_0x290;
+ /* 0x294 */ u32 field_0x294;
+};
+
+daSea_packet_c l_cloth;
f32 daSea_packet_c::BASE_HEIGHT = 1.0;
+daSea_WaveInfo__Table wi_prm_ocean[4] = {
+ {
+ 2.5f, // mHeight
+ 7.352941E-5f, // mKm
+ 0, // mPhase
+ 0.98f, // mScaleX
+ 0.2f, // mScaleZ
+ 200, // mCounterMax
+ },
+ {
+ 2.5f, // mHeight
+ 8.928571E-5f, // mKm
+ 4000, // mPhase
+ 0.2f, // mScaleX
+ 0.98f, // mScaleZ
+ 190, // mCounterMax
+ },
+ {
+ 2.5f, // mHeight
+ 1.13636364E-4f, // mKm
+ 8000, // mPhase
+ -0.98f, // mScaleX
+ 0.2f, // mScaleZ
+ 210, // mCounterMax
+ },
+ {
+ 2.5f, // mHeight
+ 1.5625E-4f, // mKm
+ 12000, // mPhase
+ 0.2f, // mScaleX
+ -0.98f, // mScaleZ
+ 180, // mCounterMax
+ },
+};
+
+u8 pos_around[16] = {
+ 0xFF, 0xFF, 0x00, 0XFF,
+ 0x01, 0xFF, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01,
+ 0xFF, 0x01, 0xFF, 0x00,
+};
+
/* 8015B0A4-8015B0FC .text Pos2Index__25daSea_WaterHeightInfo_MngFfPf */
-void daSea_WaterHeightInfo_Mng::Pos2Index(f32, f32*) {
- /* Nonmatching */
+int daSea_WaterHeightInfo_Mng::Pos2Index(f32 v, f32* dst) {
+ int idx = (v + 450000.0f) / 100000.0f;
+ if (dst != NULL)
+ *dst = (v + 450000.0f) - idx * 100000.0f;
+ return idx;
}
/* 8015B0FC-8015B164 .text GetHeight__25daSea_WaterHeightInfo_MngFff */
-void daSea_WaterHeightInfo_Mng::GetHeight(f32, f32) {
- /* Nonmatching */
+u32 daSea_WaterHeightInfo_Mng::GetHeight(f32 x, f32 z) {
+ int xi = Pos2Index(x, NULL);
+ int zi = Pos2Index(z, NULL);
+ return GetHeight(xi, zi);
}
/* 8015B164-8015B1E8 .text get_wave_max__Fi */
-void get_wave_max(int) {
- /* Nonmatching */
+int get_wave_max(int roomNo) {
+ dStage_Multi_c * multi = dComIfGp_getStage().getMulti();
+ if (multi == NULL)
+ return 10;
+
+ dStage_Mult_info* entry = multi->m_entries;
+ for (int i = 0; i < multi->num; i++, entry++)
+ if (roomNo == entry->mRoomNo)
+ return entry->mWaveMax;
+
+ return 10;
}
/* 8015B1E8-8015B288 .text GetHeight__25daSea_WaterHeightInfo_MngFii */
-void daSea_WaterHeightInfo_Mng::GetHeight(int, int) {
- /* Nonmatching */
+u32 daSea_WaterHeightInfo_Mng::GetHeight(int x, int z) {
+ if (x < 0 || 9 <= x || z < 0 || 9 <= z)
+ return 10;
+
+ if (dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) == 7) {
+ return mHeight[z][x];
+ } else {
+ return get_wave_max(dComIfGp_roomControl_getStayNo());
+ }
}
/* 8015B288-8015B2D0 .text calcMinMax__FiPfPf */
-void calcMinMax(int, f32*, f32*) {
- /* Nonmatching */
+void calcMinMax(int v, f32* min, f32* max) {
+ *min = v * 100000.0f - 450000.0f;
+ *max = *min + 100000.0f;
}
/* 8015B2D0-8015B328 .text GetArea__25daSea_WaterHeightInfo_MngFiiPfPfPfPf */
-void daSea_WaterHeightInfo_Mng::GetArea(int, int, f32*, f32*, f32*, f32*) {
- /* Nonmatching */
+void daSea_WaterHeightInfo_Mng::GetArea(int x, int z, f32* minX, f32* minZ, f32* maxX, f32* maxZ) {
+ calcMinMax(x, minX, maxX);
+ calcMinMax(z, minZ, maxZ);
}
/* 8015B328-8015B3FC .text SetInf__25daSea_WaterHeightInfo_MngFv */
void daSea_WaterHeightInfo_Mng::SetInf() {
- /* Nonmatching */
+ dStage_Multi_c * multi = dComIfGp_getStage().getMulti();
+
+ for (s32 i = 0; i < 9; i++)
+ for (s32 j = 0; j < 9; j++)
+ mHeight[i][j] = 10;
+
+ if (multi != NULL) {
+ s32 roomNo = 1;
+ for (s32 i = 1; i < 8; i++) {
+ for (s32 j = 1; j < 8; j++) {
+ mHeight[i][j] = get_wave_max(roomNo);
+ roomNo++;
+ }
+ }
+ }
}
/* 8015B3FC-8015B43C .text __ct__14daSea_WaveInfoFv */
daSea_WaveInfo::daSea_WaveInfo() {
- /* Nonmatching */
+ for (s32 i = 0; i < (s32)ARRAY_SIZE(mCounters); i++) {
+ m04[i] = 0.0f;
+ mCounters[i] = 0;
+ }
+ mCurScale = 1.0f;
}
/* 8015B43C-8015B484 .text __dt__14daSea_WaveInfoFv */
@@ -55,32 +149,77 @@ daSea_WaveInfo::~daSea_WaveInfo() {
/* 8015B484-8015B4D4 .text AddCounter__14daSea_WaveInfoFv */
void daSea_WaveInfo::AddCounter() {
- /* Nonmatching */
+ for (s32 i = 0; i < (s32)ARRAY_SIZE(mCounters); i++) {
+ mCounters[i]++;
+ if (mCounters[i] >= mWaveInfoTable[i].mCounterMax)
+ mCounters[i] = 0;
+ }
}
/* 8015B4D4-8015B530 .text GetRatio__14daSea_WaveInfoFi */
-void daSea_WaveInfo::GetRatio(int) {
- /* Nonmatching */
+f32 daSea_WaveInfo::GetRatio(int idx) {
+ return (f32)mCounters[idx] / (f32)mWaveInfoTable[idx].mCounterMax;
}
/* 8015B530-8015B54C .text GetKm__14daSea_WaveInfoFi */
-void daSea_WaveInfo::GetKm(int) {
- /* Nonmatching */
+f32 daSea_WaveInfo::GetKm(int idx) {
+ return mWaveInfoTable[idx].mKm * 6.28f;
}
/* 8015B54C-8015B56C .text GetScale__14daSea_WaveInfoFf */
-void daSea_WaveInfo::GetScale(f32) {
- /* Nonmatching */
+f32 daSea_WaveInfo::GetScale(f32 v) {
+ mCurScale += (v - mCurScale) / 100.0f;
+ return mCurScale;
}
/* 8015B56C-8015B7A0 .text create__14daSea_packet_cFR4cXyz */
-void daSea_packet_c::create(cXyz&) {
- /* Nonmatching */
+bool daSea_packet_c::create(cXyz& pos) {
+ /* Nonmatching */
+ BASE_HEIGHT = 1.0f;
+ BASE_HEIGHT = pos.y + 1.0f;
+
+ mFlatInter = 0.0f;
+ mpHeightTable = new f32[65 * 65];
+ if (mpHeightTable == NULL)
+ return true;
+
+ mWaterHeightMgr.SetInf();
+ mWaveInfo.mWaveInfoTable = wi_prm_ocean;
+ CleanUp();
+ mInitFlag = true;
+ mRoomNo = -1;
+ mFlags = 0;
+ mAnimCounter = 0;
+
+ ResTIMG* timg = (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_B_SEA_TEX0AND2);
+ GXInitTexObj(&mTexSea0, (char*)timg + timg->imageOffset, timg->width, timg->height,
+ (GXTexFmt)timg->format, (GXTexWrapMode)timg->wrapS, (GXTexWrapMode)timg->wrapT,
+ (GXBool)(timg->mipmapCount > 1));
+ GXInitTexObjLOD(&mTexSea0, (GXTexFilter)timg->minFilter, (GXTexFilter)timg->magFilter,
+ timg->minLOD * 0.125f, timg->maxLOD * 0.125f, 0.9f,
+ (GXBool)timg->biasClamp, (GXBool)timg->doEdgeLOD,
+ (GXAnisotropy)timg->maxAnisotropy);
+ GXInitTexObj(&mTexSea1, (char*)timg + timg->imageOffset, timg->width, timg->height,
+ (GXTexFmt)timg->format, (GXTexWrapMode)timg->wrapS, (GXTexWrapMode)timg->wrapT,
+ (GXBool)(timg->mipmapCount > 1));
+ GXInitTexObjLOD(&mTexSea1, (GXTexFilter)timg->minFilter, (GXTexFilter)timg->magFilter,
+ timg->minLOD * 0.125f, timg->maxLOD * 0.125f, 0.0f,
+ (GXBool)timg->biasClamp, (GXBool)timg->doEdgeLOD,
+ (GXAnisotropy)timg->maxAnisotropy);
+
+ timg = (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_B_WYURAYURA_TEX1);
+ mDoLib_setResTimgObj(timg, &mpTexWyurayura, 0, NULL);
+
+ return true;
}
/* 8015B7A0-8015B7E4 .text CleanUp__14daSea_packet_cFv */
void daSea_packet_c::CleanUp() {
- /* Nonmatching */
+ s32 idx = 0;
+ for (s32 i = 0; i < 65; i++)
+ for (s32 j = 0; j < 65; j++)
+ mpHeightTable[idx++] = BASE_HEIGHT;
+ mCurPos.zero();
}
/* 8015B7E4-8015B84C .text __ct__14daSea_packet_cFv */
@@ -90,27 +229,47 @@ daSea_packet_c::daSea_packet_c() {
/* 8015B84C-8015B86C .text SetFlat__14daSea_packet_cFv */
void daSea_packet_c::SetFlat() {
- /* Nonmatching */
+ mFlags |= 0x01;
+ mFlatTarget = 0.0f;
+ mFlatInterCounter = 150.0f;
}
/* 8015B86C-8015B884 .text ClrFlat__14daSea_packet_cFv */
void daSea_packet_c::ClrFlat() {
- /* Nonmatching */
+ mFlags &= ~0x01;
+ mFlatInterCounter = 150.0f;
}
/* 8015B884-8015BA18 .text CalcFlatInterTarget__14daSea_packet_cFR4cXyz */
-void daSea_packet_c::CalcFlatInterTarget(cXyz&) {
+f32 daSea_packet_c::CalcFlatInterTarget(cXyz&) {
/* Nonmatching */
}
/* 8015BA18-8015BAD8 .text CalcFlatInter__14daSea_packet_cFv */
void daSea_packet_c::CalcFlatInter() {
- /* Nonmatching */
+ if (mFlags & 1) {
+ if (mFlatInterCounter != 0.0f) {
+ mFlatInter += (mFlatTarget - mFlatInter) / mFlatInterCounter;
+ mFlatInterCounter--;
+ } else {
+ mFlatInter = mFlatTarget;
+ }
+ } else {
+ f32 target = CalcFlatInterTarget(mPlayerPos);
+ if (mFlatInterCounter != 0.0f) {
+ mFlatInter += (target - mFlatInter) / mFlatInterCounter;
+ mFlatInterCounter--;
+ } else {
+ mFlatInter = target;
+ }
+ }
}
/* 8015BAD8-8015BAF8 .text daSea_Init__Fv */
void daSea_Init() {
- /* Nonmatching */
+ l_cloth.mInitFlag = false;
+ l_cloth.mCullStopFlag = true;
+ l_cloth.m13A = true;
}
/* 8015BAF8-8015BB60 .text daSea_ChkAreaBeforePos__Fff */
@@ -135,17 +294,61 @@ void daSea_GetPoly(void*, void (*)(void*, cXyz&, cXyz&, cXyz&), const cXyz&, con
/* 8015C010-8015C11C .text SetCullStopFlag__14daSea_packet_cFv */
void daSea_packet_c::SetCullStopFlag() {
- /* Nonmatching */
-}
+ /* Nonmatching */
+ if (strcmp(dComIfGp_getStartStageName(), "A_umikz") == 0) {
+ mCullStopFlag = false;
+ } else {
+ s32 height = mWaterHeightMgr.GetHeight(mIdxX, mIdxZ);
+ if (height != 0) {
+ mCullStopFlag = false;
+ } else {
+ f32 minX, minZ, maxX, maxZ;
+ mWaterHeightMgr.GetArea(mIdxX, mIdxZ, &minX, &minZ, &maxX, &maxZ);
+
+ f32 gridZ1 = minZ + 25600.0f;
+ f32 gridZ0 = minZ - 25600.0f;
+ f32 gridX1 = minX + 25600.0f;
+ f32 gridX0 = minX - 25600.0f;
+
+ if ((gridX0 < mPlayerPos.x) && (mPlayerPos.x < gridX1) && (gridZ0 < mPlayerPos.z) && (mPlayerPos.z < gridZ1))
+ mCullStopFlag = true;
+ else
+ mCullStopFlag = false;
+ }
+ }
+}
+
+class daDaiocta_c : public fopAc_ac_c {
+public:
+ /* 0x298 */ u32 field_0x298[0xB9];
+ /* 0x574 */ u8 mSwitchNo;
+};
/* 8015C11C-8015C1DC .text CheckRoomChange__14daSea_packet_cFv */
void daSea_packet_c::CheckRoomChange() {
- /* Nonmatching */
+ dStage_roomDt_c * room = dComIfGp_roomControl_getStatusRoomDt(dComIfGp_roomControl_getStayNo());
+ if (room != NULL) {
+ mRoomNo = dComIfGp_roomControl_getStayNo();
+ u32 procName = PROC_DAIOCTA;
+ daDaiocta_c* octa = (daDaiocta_c *)fopAcM_SearchByName(PROC_DAIOCTA);
+ if (octa == NULL) {
+ if (mFlags & 0x01) {
+ ClrFlat();
+ }
+ } else {
+ if (!dComIfGs_isSwitch(octa->mSwitchNo, fopAcM_GetHomeRoomNo(octa))) {
+ SetFlat();
+ } else {
+ ClrFlat();
+ }
+ }
+ }
}
/* 8015C1DC-8015C214 .text daSea_execute__FR4cXyz */
-void daSea_execute(cXyz&) {
- /* Nonmatching */
+void daSea_execute(cXyz& pos) {
+ if (l_cloth.mInitFlag)
+ l_cloth.execute(pos);
}
/* 8015C214-8015C75C .text execute__14daSea_packet_cFR4cXyz */
@@ -159,36 +362,66 @@ void daSea_packet_c::draw() {
}
/* 8015D80C-8015D87C .text daSea_Draw__FP9sea_class */
-void daSea_Draw(sea_class*) {
- /* Nonmatching */
+BOOL daSea_Draw(sea_class* i_this) {
+ dComIfGd_setListSky();
+ j3dSys.getDrawBuffer(1)->entryImm(&l_cloth, 31);
+ dComIfGd_setList();
+ return TRUE;
}
/* 8015D87C-8015D8D0 .text daSea_Execute__FP9sea_class */
-void daSea_Execute(sea_class*) {
- /* Nonmatching */
+BOOL daSea_Execute(sea_class* i_this) {
+ fopAc_ac_c* player = dComIfGp_getPlayer(0);
+ cXyz pos = player->current.pos;
+ l_cloth.execute(pos);
+ return TRUE;
}
/* 8015D8D0-8015D8E8 .text daSea_IsDelete__FP9sea_class */
-void daSea_IsDelete(sea_class*) {
- /* Nonmatching */
+BOOL daSea_IsDelete(sea_class*) {
+ l_cloth.mInitFlag = false;
+ return TRUE;
}
/* 8015D8E8-8015D8F0 .text daSea_Delete__FP9sea_class */
-void daSea_Delete(sea_class*) {
- /* Nonmatching */
+BOOL daSea_Delete(sea_class*) {
+ return TRUE;
}
/* 8015D8F0-8015D924 .text CheckCreateHeap__FP10fopAc_ac_c */
-void CheckCreateHeap(fopAc_ac_c*) {
- /* Nonmatching */
+BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
+ return l_cloth.create(i_this->current.pos);
}
/* 8015D924-8015D99C .text daSea_Create__FP10fopAc_ac_c */
-void daSea_Create(fopAc_ac_c*) {
- /* Nonmatching */
-}
-
-/* 8015D9E4-8015DA70 .text __dt__14daSea_packet_cFv */
-daSea_packet_c::~daSea_packet_c() {
- /* Nonmatching */
-}
+s32 daSea_Create(fopAc_ac_c* i_this) {
+ fopAcM_SetupActor(i_this, sea_class);
+ if (!fopAcM_entrySolidHeap(i_this, (heapCallbackFunc)CheckCreateHeap, 0xA000))
+ return cPhs_ERROR_e;
+ return cPhs_COMPLEATE_e;
+}
+
+actor_method_class l_daSea_Method = {
+ (process_method_func)daSea_Create,
+ (process_method_func)daSea_Delete,
+ (process_method_func)daSea_Execute,
+ (process_method_func)daSea_IsDelete,
+ (process_method_func)daSea_Draw,
+};
+
+actor_process_profile_definition g_profile_SEA = {
+ /* LayerID */ fpcLy_CURRENT_e,
+ /* ListID */ 2,
+ /* ListPrio */ fpcPi_CURRENT_e,
+ /* ProcName */ PROC_SEA,
+ /* Proc SubMtd */ &g_fpcLf_Method.mBase,
+ /* Size */ sizeof(sea_class),
+ /* SizeOther */ 0,
+ /* Parameters */ 0,
+ /* Leaf SubMtd */ &g_fopAc_Method.base,
+ /* Priority */ 0x0077,
+ /* Actor SubMtd */ &l_daSea_Method,
+ /* Status */ fopAcStts_UNK40000_e,
+ /* Group */ fopAc_ACTOR_e,
+ /* CullType */ fopAc_CULLBOX_0_e,
+};