summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_lamp.cpp
diff options
context:
space:
mode:
authorJake Merdich <jake@merdich.com>2023-11-28 21:22:59 -0500
committerJake Merdich <jake@merdich.com>2023-11-28 21:25:29 -0500
commit5e430c0966a5bc0fb4e3826bb2c6fc50e2d794ad (patch)
treedae3c9a4c2f59ff7e68032bc3fc373b95da7dc3f /src/d/actor/d_a_lamp.cpp
parenta6a18011897a93d34953c8959206e5b578c8243a (diff)
Match d_a_lamp
Matched everything in lamp_class. Some member names might be off, but I gave my best guess.
Diffstat (limited to 'src/d/actor/d_a_lamp.cpp')
-rw-r--r--src/d/actor/d_a_lamp.cpp221
1 files changed, 206 insertions, 15 deletions
diff --git a/src/d/actor/d_a_lamp.cpp b/src/d/actor/d_a_lamp.cpp
index ba158657..e1b2d19a 100644
--- a/src/d/actor/d_a_lamp.cpp
+++ b/src/d/actor/d_a_lamp.cpp
@@ -4,39 +4,230 @@
//
#include "d/actor/d_a_lamp.h"
-#include "dolphin/types.h"
+#include "JSystem/JKernel/JKRHeap.h"
+#include "d/d_com_inf_game.h"
+#include "d/d_procname.h"
+#include "m_Do/m_Do_mtx.h"
+
+// RW data
+static dCcD_SrcSph sph_src = {
+ // dCcD_SrcGObjInf
+ {
+ /* Flags */ 0,
+ /* SrcObjAt Type */ 0,
+ /* SrcObjAt Atp */ 0,
+ /* SrcObjAt SPrm */ 0x0,
+ /* SrcObjTg Type */ AT_TYPE_FIRE | AT_TYPE_UNK20000 | AT_TYPE_FIRE_ARROW | AT_TYPE_LEAF_WIND | AT_TYPE_UNK400000,
+ /* SrcObjTg SPrm */ 0x9,
+ /* SrcObjCo SPrm */ 0,
+ /* SrcGObjAt Se */ 0,
+ /* SrcGObjAt HitMark */ 0,
+ /* SrcGObjAt Spl */ 0,
+ /* SrcGObjAt Mtrl */ 0,
+ /* SrcGObjAt GFlag */ 0,
+ /* SrcGObjTg Se */ 0,
+ /* SrcGObjTg HitMark */ 0,
+ /* SrcGObjTg Spl */ 0,
+ /* SrcGObjTg Mtrl */ 0,
+ /* SrcGObjTg GFlag */ 0x00,
+ /* SrcGObjCo GFlag */ 0,
+ },
+ // cM3dGSphS
+ {
+ /* Center */ 0.0f, 0.0f, 0.0f,
+ /* Radius */ 30.0f,
+ },
+};
+static u8 padding[76];
+
+// Need to break these out to get the rodata ordered right
+static const float partHeightOffset = 20.0;
+static const float partMaxFlickerPerTick = 0.02;
/* 000000EC-00000158 .text daLamp_Draw__FP10lamp_class */
-void daLamp_Draw(lamp_class*) {
- /* Nonmatching */
+static BOOL daLamp_Draw(lamp_class* i_lamp) {
+ g_env_light.settingTevStruct(TEV_TYPE_BG0, &i_lamp->current.pos, &i_lamp->mTevStr);
+ J3DModel* pModel = i_lamp->mModel;
+ g_env_light.setLightTevColorType(pModel, &i_lamp->mTevStr);
+ mDoExt_modelUpdateDL(pModel);
+ return TRUE;
}
/* 00000158-000005C8 .text daLamp_Execute__FP10lamp_class */
-void daLamp_Execute(lamp_class*) {
- /* Nonmatching */
+static BOOL daLamp_Execute(lamp_class* i_lamp) {
+ i_lamp->mCycleCtr += 1;
+ MtxTrans(i_lamp->current.pos.x, i_lamp->current.pos.y, i_lamp->current.pos.z, 0);
+ mDoMtx_YrotM(*calc_mtx, i_lamp->current.angle.GetY());
+ if (i_lamp->mParameters == 0) {
+ i_lamp->mLength = 0.1;
+ } else {
+ if (dComIfGp_getVibration().CheckQuake() || fopAcM_otoCheck(i_lamp, 1000.0) > 400) {
+ i_lamp->mOto = 0x14;
+ }
+ if (i_lamp->mOto) {
+ i_lamp->mOto--;
+ cLib_addCalc2(&i_lamp->mLength, 0.15, 1.0, 0.015);
+ } else {
+ cLib_addCalc2(&i_lamp->mLength, 0.01, 1.0, 0.0005);
+ }
+ }
+ f32 oppDist = cM_ssin(i_lamp->mCycleCtr * 0x320) * i_lamp->mLength;
+ MtxRotX(oppDist, 1);
+ f32 adjDist = cM_scos(i_lamp->mCycleCtr * 0x2bc) * i_lamp->mLength;
+ MtxRotZ(adjDist, 1);
+ MtxScale(0.4, 0.4, 0.4, 1);
+ i_lamp->mModel->setBaseTRMtx(*calc_mtx);
+ MtxTrans(10.0, -140.0, -15.0, 1);
+
+ cXyz pos;
+ pos.z = 0.0f;
+ pos.y = 0.0f;
+ pos.x = 0.0f;
+ MtxPosition(&pos, &i_lamp->mPos);
+
+ if (!i_lamp->mParticleInit) {
+ static cXyz fire_scale(0.5f, 0.5f, 0.5f);
+
+ dComIfGp_particle_set(0x1ea, &i_lamp->mPos, NULL, &fire_scale, 0xFF, &i_lamp->mPa);
+ i_lamp->mParticleInit = 1;
+ i_lamp->mParticlePower = 1.0f;
+ }
+
+ if (i_lamp->mPa.getEmitter()) {
+ cXyz whitePartPos = i_lamp->mPos;
+ whitePartPos.y += partHeightOffset;
+ dComIfGp_particle_setSimple(0x4004, &whitePartPos, 0xFF, g_whiteColor, g_whiteColor, 0);
+ cLib_addCalc2(&i_lamp->mParticlePower, cM_rndF(0.2) + 1.0f, 0.5f, partMaxFlickerPerTick);
+ } else {
+ i_lamp->mParticlePower = 0.0;
+ }
+ i_lamp->mInf.mPos = i_lamp->mPos;
+ i_lamp->mInf.mColor.r = 600;
+ i_lamp->mInf.mColor.g = 400;
+ i_lamp->mInf.mColor.b = 120;
+
+ s16 power = i_lamp->mParticlePower * 150.0f;
+ i_lamp->mInf.mPower = power;
+ i_lamp->mInf.mFluctuation = 250.0f;
+
+ i_lamp->mSph.SetC(i_lamp->mPos);
+ dComIfG_Ccsp()->Set(&i_lamp->mSph);
+ if (!i_lamp->mHitTimeoutLeft) {
+ if (i_lamp->mSph.ChkTgHit()) {
+ cCcD_Obj* pHitObj = i_lamp->mSph.GetTgHitObj();
+ if (pHitObj && pHitObj->ChkAtType(AT_TYPE_LEAF_WIND | AT_TYPE_UNK400000)) {
+ i_lamp->mHitAngle = dComIfGp_getPlayer(0)->shape_angle.y;
+ i_lamp->mHitTimeoutLeft = 0x28;
+ }
+ }
+ } else {
+ i_lamp->mHitTimeoutLeft--;
+ if (i_lamp->mPa.mpEmitter) {
+ float tgtZ;
+ if (i_lamp->mHitTimeoutLeft > 10) {
+ tgtZ = 4.0;
+ } else {
+ tgtZ = 0.0;
+ }
+ cLib_addCalc2(&i_lamp->mHitReactCurZ, tgtZ, 1.0, 0.5);
+ cMtx_YrotS(*calc_mtx, i_lamp->mHitAngle);
+ cXyz localPos;
+ localPos.set(0.0f, 1.0f, i_lamp->mHitReactCurZ);
+ cXyz globalPos;
+ MtxPosition(&localPos, &globalPos);
+ float y = globalPos.y;
+ float z = globalPos.z;
+ float x = globalPos.x;
+ i_lamp->mPa.mpEmitter->mEmitterDir.set(x, y, z);
+ }
+ }
+
+ return TRUE;
}
/* 00000604-00000634 .text daLamp_IsDelete__FP10lamp_class */
-void daLamp_IsDelete(lamp_class*) {
- /* Nonmatching */
+static BOOL daLamp_IsDelete(lamp_class* i_lamp) {
+ i_lamp->mPa.end();
+ return TRUE;
}
/* 00000634-00000678 .text daLamp_Delete__FP10lamp_class */
-void daLamp_Delete(lamp_class*) {
- /* Nonmatching */
+static BOOL daLamp_Delete(lamp_class* i_lamp) {
+ dComIfG_resDelete(&i_lamp->mPhs, "Lamp");
+ dKy_plight_cut(&i_lamp->mInf);
+ return TRUE;
}
/* 00000678-0000073C .text useHeapInit__FP10lamp_class */
-void useHeapInit(lamp_class*) {
- /* Nonmatching */
+static BOOL useHeapInit(lamp_class* i_lamp) {
+ J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("Lamp", 3));
+ JUT_ASSERT(0x170, modelData != 0);
+
+ i_lamp->mModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
+ if (i_lamp->mModel == 0) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
}
/* 0000073C-0000075C .text daLamp_solidHeapCB__FP10fopAc_ac_c */
-void daLamp_solidHeapCB(fopAc_ac_c*) {
- /* Nonmatching */
+static BOOL daLamp_solidHeapCB(fopAc_ac_c* i_ac) {
+ return useHeapInit((lamp_class*)i_ac);
}
/* 0000075C-00000914 .text daLamp_Create__FP10fopAc_ac_c */
-void daLamp_Create(fopAc_ac_c*) {
- /* Nonmatching */
+static int daLamp_Create(fopAc_ac_c* i_ac) {
+ fopAcM_SetupActor(i_ac, lamp_class);
+ lamp_class* i_lamp = (lamp_class*)i_ac;
+
+ s32 phase_state = dComIfG_resLoad(&i_lamp->mPhs, "Lamp");
+ if (phase_state == cPhs_COMPLEATE_e) {
+ if (fopAcM_entrySolidHeap(i_lamp, (heapCallbackFunc)&daLamp_solidHeapCB, 0x6040)) {
+ i_lamp->mParameters = fopAcM_GetParam(i_lamp);
+ if (i_lamp->mParameters == 0xFF) {
+ i_lamp->mParameters = 0;
+ }
+ i_lamp->mStts.Init(0xff, 0xff, i_lamp);
+ i_lamp->mSph.Set(sph_src);
+ i_lamp->mSph.SetStts(&i_lamp->mStts);
+
+ i_lamp->mCycleCtr = cM_rndFX(32768.0f);
+
+ for (int i = 0; i < 2; i++) {
+ daLamp_Execute(i_lamp);
+ }
+
+ dKy_plight_set(&i_lamp->mInf);
+ } else {
+ phase_state = cPhs_ERROR_e;
+ }
+ }
+
+ return phase_state;
}
+
+static actor_method_class l_daLamp_Method = {
+ (process_method_func)daLamp_Create,
+ (process_method_func)daLamp_Delete,
+ (process_method_func)daLamp_Execute,
+ (process_method_func)daLamp_IsDelete,
+ (process_method_func)daLamp_Draw,
+};
+
+actor_process_profile_definition g_profile_LAMP = {
+ /* LayerID */ fpcLy_CURRENT_e,
+ /* ListID */ 7,
+ /* ListPrio */ fpcLy_CURRENT_e,
+ /* ProcName */ PROC_LAMP,
+ /* Proc SubMtd */ &g_fpcLf_Method.mBase,
+ /* Size */ sizeof(lamp_class),
+ /* SizeOther */ 0,
+ /* Parameters */ 0,
+ /* Leaf SubMtd */ &g_fopAc_Method.base,
+ /* Priority */ 0x00AE,
+ /* Actor SubMtd */ &l_daLamp_Method,
+ /* Status */ fopAcStts_UNK4000_e | fopAcStts_UNK40000_e,
+ /* Group */ fopAc_ACTOR_e,
+ /* CullType */ 0,
+};