diff --git a/configure.py b/configure.py index b071ac48d..e8b15c738 100644 --- a/configure.py +++ b/configure.py @@ -1511,10 +1511,10 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_buoyflag"), ActorRel(NonMatching, "d_a_obj_buoyrace"), ActorRel(NonMatching, "d_a_obj_correct"), - ActorRel(NonMatching, "d_a_obj_dmgroom"), - ActorRel(NonMatching, "d_a_obj_dragonhead"), + ActorRel(Matching, "d_a_obj_dmgroom", extra_cflags=['-pragma "nosyminline on"']), + ActorRel(NonMatching, "d_a_obj_dragonhead", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_drift"), - ActorRel(NonMatching, "d_a_obj_eayogn"), + ActorRel(Matching, "d_a_obj_eayogn"), ActorRel(NonMatching, "d_a_obj_ebomzo"), ActorRel(NonMatching, "d_a_obj_ekskz"), ActorRel(NonMatching, "d_a_obj_eskban"), diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index 755634155..2281eb99e 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -14,6 +14,7 @@ class JUTNameTab; enum J3DMaterialCopyFlag { J3DMatCopyFlag_Material = 0x01, J3DMatCopyFlag_Texture = 0x02, + J3DMatCopyFlag_All = 0x03, }; class J3DModelData { diff --git a/include/JSystem/J3DGraphBase/J3DSys.h b/include/JSystem/J3DGraphBase/J3DSys.h index d954077b4..b415b8e1e 100644 --- a/include/JSystem/J3DGraphBase/J3DSys.h +++ b/include/JSystem/J3DGraphBase/J3DSys.h @@ -6,8 +6,8 @@ // Perhaps move to a new J3DEnum.h? enum J3DError { - kJ3DError_Success = 0, - kJ3DError_Alloc = 4, + J3DErrType_Success = 0, + J3DErrType_OutOfMemory = 4, }; enum J3DSysDrawBuffer { diff --git a/include/SSystem/SComponent/c_bg_s.h b/include/SSystem/SComponent/c_bg_s.h index 49c69062f..60088474e 100644 --- a/include/SSystem/SComponent/c_bg_s.h +++ b/include/SSystem/SComponent/c_bg_s.h @@ -45,7 +45,7 @@ public: return GetTriPla(polyInfo.GetBgIndex(), polyInfo.GetPolyIndex()); } bool Regist(cBgW*, unsigned int, void*); - int Release(cBgW*); + bool Release(cBgW*); bool LineCross(cBgS_LinChk*); f32 GroundCross(cBgS_GndChk*); static void* ConvDzb(void*); diff --git a/src/JSystem/J3DGraphAnimator/J3DModel.cpp b/src/JSystem/J3DGraphAnimator/J3DModel.cpp index fff7defe7..929240912 100644 --- a/src/JSystem/J3DGraphAnimator/J3DModel.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DModel.cpp @@ -73,7 +73,7 @@ static inline u32 getMdlDataFlag_MtxLoadType(u32 flag) { /* 802ED6C4-802ED8D8 .text entryModelData__8J3DModelFP12J3DModelDataUlUl */ s32 J3DModel::entryModelData(J3DModelData* pModelData, u32 modelFlag, u32 mtxBufferFlag) { - s32 ret = kJ3DError_Success; + s32 ret = J3DErrType_Success; mModelData = pModelData; mMtxBufferFlag = mtxBufferFlag; @@ -90,16 +90,16 @@ s32 J3DModel::entryModelData(J3DModelData* pModelData, u32 modelFlag, u32 mtxBuf } if (mpScaleFlagArr == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (pModelData->getWEvlpMtxNum() != 0 && mpEvlpScaleFlagArr == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (mpNodeMtx == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (pModelData->getWEvlpMtxNum() != 0 && mpWeightEnvMtx == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (pModelData->checkFlag(J3DMdlDataFlag_NoAnimation)) { setNoUseDrawMtx(); @@ -118,28 +118,28 @@ s32 J3DModel::entryModelData(J3DModelData* pModelData, u32 modelFlag, u32 mtxBuf } } - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; ret = createShapePacket(pModelData); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; ret = createMatPacket(pModelData, modelFlag); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; if (pModelData->checkFlag(J3DMdlDataFlag_ConcatView)) { mModelData->setBumpFlag(0); } else { ret = createBumpMtxArray(pModelData, mtxBufferFlag); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; } mVertexBuffer.setVertexData(&pModelData->getVertexData()); prepareShapePackets(); - ret = kJ3DError_Success; + ret = J3DErrType_Success; return ret; } @@ -152,7 +152,7 @@ s32 J3DModel::setNoUseDrawMtx() { mpNrmMtxBuf[0] = &sNoUseNrmMtxPtr; mpBumpMtxArr[1] = NULL; mpBumpMtxArr[0] = NULL; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802ED904-802EDA14 .text createSingleDrawMtx__8J3DModelFP12J3DModelData */ @@ -165,9 +165,9 @@ s32 J3DModel::createSingleDrawMtx(J3DModelData* pModelData) { mpBumpMtxArr[1] = NULL; if (mpDrawMtxBuf[0] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (mpNrmMtxBuf[0] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (pModelData->getDrawMtxNum() != 0) { mpDrawMtxBuf[0][0] = new (0x20) Mtx[pModelData->getDrawMtxNum()]; @@ -177,9 +177,9 @@ s32 J3DModel::createSingleDrawMtx(J3DModelData* pModelData) { } if (pModelData->getDrawMtxNum() != 0 && mpDrawMtxBuf[0][0] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EDA14-802EDBC0 .text createDoubleDrawMtx__8J3DModelFP12J3DModelDataUl */ @@ -195,9 +195,9 @@ s32 J3DModel::createDoubleDrawMtx(J3DModelData* pModelData, u32 num) { if (num != 0) { for (u32 i = 0; i < 2; i++) { if (mpDrawMtxBuf[i] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (mpNrmMtxBuf[i] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } } @@ -214,14 +214,14 @@ s32 J3DModel::createDoubleDrawMtx(J3DModelData* pModelData, u32 num) { for (u32 j = 0; j < num; j++) { if (pModelData->getDrawMtxNum() != 0) { if (mpDrawMtxBuf[i][j] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; if (mpNrmMtxBuf[i][j] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EDBC0-802EDC8C .text createShapePacket__8J3DModelFP12J3DModelData */ @@ -231,7 +231,7 @@ s32 J3DModel::createShapePacket(J3DModelData* pModelData) { mpShapePacket = new J3DShapePacket[shapeNum]; if (mpShapePacket == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; for (int i = 0; i < pModelData->getShapeNum(); i++) { J3DShape* shapeNode = pModelData->getShapeNodePointer(i); @@ -240,7 +240,7 @@ s32 J3DModel::createShapePacket(J3DModelData* pModelData) { } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EDC8C-802EDF60 .text createMatPacket__8J3DModelFP12J3DModelDataUl */ @@ -249,7 +249,7 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 flag) { mpMatPacket = new J3DMatPacket[pModelData->getMaterialNum()]; if (mpMatPacket == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } s32 ret; @@ -275,7 +275,7 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 flag) { } else { J3DDisplayListObj* sharedDL = pModelData->getMaterialNodePointer(i)->getSharedDisplayListObj(); ret = sharedDL->single_To_Double(); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; mpMatPacket[i].mpDisplayListObj = sharedDL; @@ -283,18 +283,18 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 flag) { } else if (!!(flag & 0x20000)) { if (!!(flag & 0x40000)) { ret = pModelData->getMaterialNodePointer(i)->newSingleSharedDisplayList(pModelData->getMaterialNodePointer(i)->countDLSize()); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; mpMatPacket[i].mpDisplayListObj = pModelData->getMaterialNodePointer(i)->getSharedDisplayListObj(); } else { ret = pModelData->getMaterialNodePointer(i)->newSharedDisplayList(pModelData->getMaterialNodePointer(i)->countDLSize()); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; J3DDisplayListObj* sharedDL = pModelData->getMaterialNodePointer(i)->getSharedDisplayListObj(); ret = sharedDL->single_To_Double(); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; mpMatPacket[i].mpDisplayListObj = sharedDL; @@ -303,19 +303,19 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 flag) { if (!!(flag & 0x40000)) { u32 size = pModelData->getMaterialNodePointer(i)->countDLSize(); ret = mpMatPacket[i].newSingleDisplayList(size); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; } else { u32 size = pModelData->getMaterialNodePointer(i)->countDLSize(); ret = mpMatPacket[i].newDisplayList(size); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; } } } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EDF60-802EE1D4 .text createBumpMtxArray__8J3DModelFP12J3DModelDataUl */ @@ -333,7 +333,7 @@ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { for (s32 i = 0; i < 2; i++) { mpBumpMtxArr[i] = new Mtx33**[bumpMtxNum]; if (mpBumpMtxArr[i] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } } @@ -344,7 +344,7 @@ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { if (pMaterial->getNBTScale()->mbHasScale == 1) { mpBumpMtxArr[i][bumpMtxOffset] = new Mtx33*[bufferNum]; if (mpBumpMtxArr[i][bumpMtxOffset] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; pMaterial->getShape()->setBumpMtxOffset(bumpMtxOffset); bumpMtxOffset++; } @@ -359,7 +359,7 @@ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { for (u32 j = 0; j < bufferNum; j++) { mpBumpMtxArr[i][bumpMtxOffset][j] = new(0x20) Mtx33[modelData->getDrawMtxNum()]; if (mpBumpMtxArr[i][bumpMtxOffset][j] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } bumpMtxOffset++; } @@ -370,7 +370,7 @@ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { getModelData()->setBumpFlag(1); } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EE1D4-802EE254 .text newDifferedDisplayList__8J3DModelFUl */ @@ -378,10 +378,10 @@ s32 J3DModel::newDifferedDisplayList(u32 flag) { mDiffFlag = flag; for (u16 i = 0; i < getModelData()->getShapeNum(); i++) { s32 ret = getShapePacket(i)->newDifferedDisplayList(flag); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EE254-802EE28C .text lock__8J3DModelFv */ @@ -443,7 +443,7 @@ void J3DModel::diff() { s32 J3DModel::setSkinDeform(J3DSkinDeform* pSkinDeform, u32 flags) { mpSkinDeform = pSkinDeform; - s32 ret = kJ3DError_Success; + s32 ret = J3DErrType_Success; if (pSkinDeform == NULL) { offFlag(J3DMdlFlag_SkinPosCpu); @@ -453,7 +453,7 @@ s32 J3DModel::setSkinDeform(J3DSkinDeform* pSkinDeform, u32 flags) { mpSkinDeform->initMtxIndexArray(mModelData); ret = mModelData->checkFlag(0x100); - if (ret != kJ3DError_Success) { + if (ret != J3DErrType_Success) { mpSkinDeform->changeFastSkinDL(mModelData); flags &= ~2; flags &= ~4; @@ -462,7 +462,7 @@ s32 J3DModel::setSkinDeform(J3DSkinDeform* pSkinDeform, u32 flags) { ret = 0; if ((~flags & 2)) { ret = mVertexBuffer.allocTransformedVtxPosArray(); - if (ret != kJ3DError_Success) { + if (ret != J3DErrType_Success) { offFlag(J3DMdlFlag_SkinPosCpu); return ret; } @@ -473,7 +473,7 @@ s32 J3DModel::setSkinDeform(J3DSkinDeform* pSkinDeform, u32 flags) { if ((~flags & 4)) { ret = mVertexBuffer.allocTransformedVtxNrmArray(); - if (ret != kJ3DError_Success) { + if (ret != J3DErrType_Success) { offFlag(J3DMdlFlag_SkinNrmCpu); return ret; } diff --git a/src/JSystem/J3DGraphBase/J3DDrawBuffer.cpp b/src/JSystem/J3DGraphBase/J3DDrawBuffer.cpp index dff95bd6e..2c9f7f9b7 100644 --- a/src/JSystem/J3DGraphBase/J3DDrawBuffer.cpp +++ b/src/JSystem/J3DGraphBase/J3DDrawBuffer.cpp @@ -32,12 +32,12 @@ void J3DDrawBuffer::initialize() { J3DError J3DDrawBuffer::allocBuffer(u32 bufSize) { mpBuf = new (0x20) J3DPacket*[bufSize]; if (mpBuf == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; mBufSize = bufSize; frameInit(); calcZRatio(); - return kJ3DError_Success; + return J3DErrType_Success; } /* 802EC84C-802EC8AC .text __dt__13J3DDrawBufferFv */ diff --git a/src/JSystem/J3DGraphBase/J3DMaterial.cpp b/src/JSystem/J3DGraphBase/J3DMaterial.cpp index 38828c507..939e5c1de 100644 --- a/src/JSystem/J3DGraphBase/J3DMaterial.cpp +++ b/src/JSystem/J3DGraphBase/J3DMaterial.cpp @@ -315,17 +315,17 @@ s32 J3DMaterial::newSharedDisplayList(u32 param_0) { if (mSharedDLObj == NULL) { mSharedDLObj = new J3DDisplayListObj(); if (mSharedDLObj == NULL) { - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } s32 res = mSharedDLObj->newDisplayList(param_0); switch (res) { - case kJ3DError_Success: + case J3DErrType_Success: break; default: return res; } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DF1AC-802DF240 .text newSingleSharedDisplayList__11J3DMaterialFUl */ @@ -333,17 +333,17 @@ s32 J3DMaterial::newSingleSharedDisplayList(u32 param_0) { if (mSharedDLObj == NULL) { mSharedDLObj = new J3DDisplayListObj(); if (mSharedDLObj == NULL) { - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } s32 res = mSharedDLObj->newSingleDisplayList(param_0); switch (res) { - case kJ3DError_Success: + case J3DErrType_Success: break; default: return res; } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DF240-802DF260 .text initialize__18J3DPatchedMaterialFv */ diff --git a/src/JSystem/J3DGraphBase/J3DPacket.cpp b/src/JSystem/J3DGraphBase/J3DPacket.cpp index 82db2c6fd..ce86b8c04 100644 --- a/src/JSystem/J3DGraphBase/J3DPacket.cpp +++ b/src/JSystem/J3DGraphBase/J3DPacket.cpp @@ -20,9 +20,9 @@ J3DError J3DDisplayListObj::newDisplayList(u32 capacity) { mSize = 0; if (mpData[0] == NULL || mpData[1] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DAE9C-802DAF00 .text newSingleDisplayList__17J3DDisplayListObjFUl */ @@ -33,9 +33,9 @@ J3DError J3DDisplayListObj::newSingleDisplayList(u32 capacity) { mSize = 0; if (mpData[0] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DAF00-802DAF78 .text single_To_Double__17J3DDisplayListObjFv */ @@ -44,13 +44,13 @@ J3DError J3DDisplayListObj::single_To_Double() { mpData[1] = new (0x20) char[mCapacity]; if (mpData[1] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; memcpy(mpData[1], mpData[0], mCapacity); DCStoreRange(mpData[1], mCapacity); } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DAF78-802DAF98 .text setSingleDisplayList__17J3DDisplayListObjFPvUl */ @@ -153,13 +153,13 @@ J3DError J3DDrawPacket::newDisplayList(u32 size) { mpDisplayListObj = new J3DDisplayListObj(); if (mpDisplayListObj == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; J3DError ret = mpDisplayListObj->newDisplayList(size); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DB2BC-802DB348 .text newSingleDisplayList__13J3DDrawPacketFUl */ @@ -167,13 +167,13 @@ J3DError J3DDrawPacket::newSingleDisplayList(u32 size) { mpDisplayListObj = new J3DDisplayListObj(); if (mpDisplayListObj == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; J3DError ret = mpDisplayListObj->newSingleDisplayList(size); - if (ret != kJ3DError_Success) + if (ret != J3DErrType_Success) return ret; - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DB348-802DB36C .text draw__13J3DDrawPacketFv */ @@ -326,12 +326,12 @@ J3DError J3DShapePacket::newDifferedDisplayList(u32 flag) { u32 bufSize = calcDifferedBufferSize(flag); J3DError error = newDisplayList(bufSize); - if (error != kJ3DError_Success) { + if (error != J3DErrType_Success) { return error; } setDisplayListObj(getDisplayListObj()); - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DB818-802DB890 .text prepareDraw__14J3DShapePacketCFv */ diff --git a/src/JSystem/J3DGraphBase/J3DVertex.cpp b/src/JSystem/J3DGraphBase/J3DVertex.cpp index 306f895a2..f888881a3 100644 --- a/src/JSystem/J3DGraphBase/J3DVertex.cpp +++ b/src/JSystem/J3DGraphBase/J3DVertex.cpp @@ -94,33 +94,33 @@ void J3DVertexBuffer::setArray() const { /* 802D9EF0-802D9FA4 .text allocTransformedVtxPosArray__15J3DVertexBufferFv */ s32 J3DVertexBuffer::allocTransformedVtxPosArray() { if (mTransformedVtxPosArray[0] != NULL && mTransformedVtxPosArray[1] != NULL) - return kJ3DError_Success; + return J3DErrType_Success; for (int i = 0; i < 2; i++) { if (i == 0 || mTransformedVtxPosArray[i] == NULL) { mTransformedVtxPosArray[i] = new (0x20) Vec[mVtxData->getVtxNum()]; if (mTransformedVtxPosArray[i] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802D9FA4-802DA058 .text allocTransformedVtxNrmArray__15J3DVertexBufferFv */ s32 J3DVertexBuffer::allocTransformedVtxNrmArray() { if (mTransformedVtxNrmArray[0] != NULL && mTransformedVtxNrmArray[1] != NULL) - return kJ3DError_Success; + return J3DErrType_Success; for (int i = 0; i < 2; i++) { if (i == 0 || mTransformedVtxNrmArray[i] == NULL) { mTransformedVtxNrmArray[i] = new (0x20) VertexNormal[mVtxData->getNrmNum()]; if (mTransformedVtxNrmArray[i] == NULL) - return kJ3DError_Alloc; + return J3DErrType_OutOfMemory; } } - return kJ3DError_Success; + return J3DErrType_Success; } /* 802DA058-802DA06C .text __ct__14J3DDrawMtxDataFv */ diff --git a/src/d/actor/d_a_obj_adnno.cpp b/src/d/actor/d_a_obj_adnno.cpp index 87fb632fc..f7153d543 100644 --- a/src/d/actor/d_a_obj_adnno.cpp +++ b/src/d/actor/d_a_obj_adnno.cpp @@ -3,51 +3,165 @@ // Translation Unit: d_a_obj_adnno.cpp // -#include "d_a_obj_adnno.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +class daObjAdnno_c : public fopAc_ac_c { +public: + inline s32 _create(); + inline bool _execute(); + inline bool _draw(); + inline bool _delete(); + BOOL CreateHeap(); + void CreateInit(); + void set_mtx(); + +public: + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModel[16]; +}; + +static const u32 daObjAdnno_bmt_table[16] = { + 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, +}; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -void CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daObjAdnno_c*)i_this)->CreateHeap(); } /* 00000098-00000178 .text CreateHeap__12daObjAdnno_cFv */ -void daObjAdnno_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjAdnno_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)(dComIfG_getObjectRes("Adnno", 0x04)); + JUT_ASSERT(0x5c, modelData != 0); + for (s32 i = 0; i < 16; i++) { + mpModel[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x37441422); + if (!mpModel[i]) + return FALSE; + } + return TRUE; } /* 00000178-000001E8 .text CreateInit__12daObjAdnno_cFv */ void daObjAdnno_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel[0]->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -600.0f, -0.0f, -600.0f, 600.0f, 900.0f, 600.0f); + fopAcM_setCullSizeFar(this, 1.0f); + set_mtx(); } /* 000001E8-00000330 .text set_mtx__12daObjAdnno_cFv */ void daObjAdnno_c::set_mtx() { - /* Nonmatching */ + for (s32 i = 0; i < 16; i++) { + J3DModel * model = mpModel[i]; + model->setBaseScale(mScale); + + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(current.angle.y); + /* Nonmatching - this translation code is wrong */ + mDoMtx_stack_c::transM(40.0f + i * 60.0f, 60.0f - 40.0f * i, 0.0f); + mpModel[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + } +} + +s32 daObjAdnno_c::_create() { + fopAcM_SetupActor(this, daObjAdnno_c); + + s32 ret = dComIfG_resLoad(&mPhs, "Adnno"); + + if (ret == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckCreateHeap, 0x9C00) == 0) { + ret = cPhs_ERROR_e; + } else { + CreateInit(); + } + } + + return ret; +} + +bool daObjAdnno_c::_delete() { + dComIfG_resDelete(&mPhs, "Adnno"); + return true; +} + +bool daObjAdnno_c::_execute() { + set_mtx(); + return true; +} + +static const u16 daObjAdnno_event_bit_table[16] = { + 0x3508, 0x3504, 0x3502, 0x3501, + 0x3680, 0x3640, 0x3620, 0x3610, + 0x3608, 0x3604, 0x3602, 0x3601, + 0x3780, 0x3740, 0x3720, 0x3710, +}; + +bool daObjAdnno_c::_draw() { + dComIfGd_setListBG(); + for (s32 i = 0; i < 16; i++) { + if (dComIfGs_isEventBit(daObjAdnno_event_bit_table[i])) { + J3DMaterialTable* pBmt = (J3DMaterialTable*)dComIfG_getObjectRes("Adnno", daObjAdnno_bmt_table[i]); + mpModel[i]->getModelData()->setMaterialTable(pBmt, J3DMatCopyFlag_All); + mDoExt_modelUpdateDL(mpModel[i]); + } + } + dComIfGd_setList(); + return true; } /* 00000330-000003D4 .text daObjAdnno_Create__FPv */ -void daObjAdnno_Create(void*) { - /* Nonmatching */ +s32 daObjAdnno_Create(void* i_this) { + return ((daObjAdnno_c*)i_this)->_create(); } /* 000003D4-00000404 .text daObjAdnno_Delete__FPv */ -void daObjAdnno_Delete(void*) { - /* Nonmatching */ +BOOL daObjAdnno_Delete(void* i_this) { + return ((daObjAdnno_c*)i_this)->_delete(); } /* 00000404-000004F8 .text daObjAdnno_Draw__FPv */ -void daObjAdnno_Draw(void*) { - /* Nonmatching */ +BOOL daObjAdnno_Draw(void* i_this) { + return ((daObjAdnno_c*)i_this)->_draw(); } /* 000004F8-0000051C .text daObjAdnno_Execute__FPv */ -void daObjAdnno_Execute(void*) { - /* Nonmatching */ +BOOL daObjAdnno_Execute(void* i_this) { + return ((daObjAdnno_c*)i_this)->_execute(); } /* 0000051C-00000524 .text daObjAdnno_IsDelete__FPv */ -void daObjAdnno_IsDelete(void*) { - /* Nonmatching */ +BOOL daObjAdnno_IsDelete(void* i_this) { + return TRUE; } +static actor_method_class daObj_AdnnoMethodTable = { + (process_method_func)daObjAdnno_Create, + (process_method_func)daObjAdnno_Delete, + (process_method_func)daObjAdnno_Execute, + (process_method_func)daObjAdnno_IsDelete, + (process_method_func)daObjAdnno_Draw, +}; + +actor_process_profile_definition g_profile_Obj_Adnno = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Adnno, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjAdnno_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x007E, + /* Actor SubMtd */ &daObj_AdnnoMethodTable, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_dmgroom.cpp b/src/d/actor/d_a_obj_dmgroom.cpp index 4a19391c6..90e4e08e5 100644 --- a/src/d/actor/d_a_obj_dmgroom.cpp +++ b/src/d/actor/d_a_obj_dmgroom.cpp @@ -3,61 +3,156 @@ // Translation Unit: d_a_obj_dmgroom.cpp // -#include "d_a_obj_dmgroom.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +class daObjDmgroom_c : public fopAc_ac_c { +public: + inline s32 _create(); + inline bool _execute(); + inline bool _draw(); + inline bool _delete(); + BOOL CreateHeap(); + void CreateInit(); + void set_mtx(); + +public: + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModel; + /* 0x29C */ mDoExt_brkAnm mBrkAnm; +}; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -void CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daObjDmgroom_c*)i_this)->CreateHeap(); } /* 00000098-000001FC .text CreateHeap__14daObjDmgroom_cFv */ -void daObjDmgroom_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjDmgroom_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)(dComIfG_getObjectRes("Dmgroom", 0x04)); + JUT_ASSERT(0x52, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0x00, 0x11020203); + if (!mpModel) + return FALSE; + + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)(dComIfG_getObjectRes("Dmgroom", 0x07)); + JUT_ASSERT(0x5c, brk != 0); + if (!mBrkAnm.init(modelData, brk, true, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0)) + return FALSE; + + return TRUE; } /* 000001FC-0000026C .text CreateInit__14daObjDmgroom_cFv */ void daObjDmgroom_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -600.0f, -0.0f, -600.0f, 600.0f, 900.0f, 600.0f); + fopAcM_setCullSizeFar(this, 1.0f); + set_mtx(); } /* 0000026C-000002EC .text set_mtx__14daObjDmgroom_cFv */ void daObjDmgroom_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); +} + +s32 daObjDmgroom_c::_create() { + fopAcM_SetupActor(this, daObjDmgroom_c); + + s32 ret = dComIfG_resLoad(&mPhs, "Dmgroom"); + + if (ret == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckCreateHeap, 0x1460) == 0) { + ret = cPhs_ERROR_e; + } else { + CreateInit(); + } + } + + return ret; +} + +bool daObjDmgroom_c::_delete() { + dComIfG_resDelete(&mPhs, "Dmgroom"); + return true; +} + +bool daObjDmgroom_c::_execute() { + if (mDemoActorId != 0) { + dDemo_actor_c * demoAc = dComIfGp_demo_getActor(mDemoActorId); + if (demoAc != NULL && demoAc->checkEnable(0x40)) + mBrkAnm.setFrame(demoAc->mAnimationFrame); + } + set_mtx(); + return true; +} + +bool daObjDmgroom_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + dComIfGd_setListBG(); + mBrkAnm.entry(mpModel->getModelData()); + mDoExt_modelUpdateDL(mpModel); + mBrkAnm.remove(mpModel->getModelData()); + dComIfGd_setList(); + return true; } /* 000002EC-000003B4 .text daObjDmgroom_Create__FPv */ -void daObjDmgroom_Create(void*) { - /* Nonmatching */ -} - -/* 000003B4-00000410 .text __dt__13mDoExt_brkAnmFv */ -mDoExt_brkAnm::~mDoExt_brkAnm() { - /* Nonmatching */ -} - -/* 00000410-00000458 .text __dt__14mDoExt_baseAnmFv */ -mDoExt_baseAnm::~mDoExt_baseAnm() { - /* Nonmatching */ +s32 daObjDmgroom_Create(void* i_this) { + return ((daObjDmgroom_c*)i_this)->_create(); } /* 00000458-00000488 .text daObjDmgroom_Delete__FPv */ -void daObjDmgroom_Delete(void*) { - /* Nonmatching */ +BOOL daObjDmgroom_Delete(void* i_this) { + return ((daObjDmgroom_c*)i_this)->_delete(); } /* 00000488-00000558 .text daObjDmgroom_Draw__FPv */ -void daObjDmgroom_Draw(void*) { - /* Nonmatching */ +BOOL daObjDmgroom_Draw(void* i_this) { + return ((daObjDmgroom_c*)i_this)->_draw(); } /* 00000558-000005CC .text daObjDmgroom_Execute__FPv */ -void daObjDmgroom_Execute(void*) { - /* Nonmatching */ +BOOL daObjDmgroom_Execute(void* i_this) { + return ((daObjDmgroom_c*)i_this)->_execute(); } /* 000005CC-000005D4 .text daObjDmgroom_IsDelete__FPv */ -void daObjDmgroom_IsDelete(void*) { - /* Nonmatching */ +BOOL daObjDmgroom_IsDelete(void* i_this) { + return TRUE; } +static actor_method_class daObj_DmgroomMethodTable = { + (process_method_func)daObjDmgroom_Create, + (process_method_func)daObjDmgroom_Delete, + (process_method_func)daObjDmgroom_Execute, + (process_method_func)daObjDmgroom_IsDelete, + (process_method_func)daObjDmgroom_Draw, +}; + +actor_process_profile_definition g_profile_Obj_Dmgroom = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Dmgroom, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjDmgroom_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x001D, + /* Actor SubMtd */ &daObj_DmgroomMethodTable, + /* Status */ fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_dragonhead.cpp b/src/d/actor/d_a_obj_dragonhead.cpp index df8771f86..ed889011d 100644 --- a/src/d/actor/d_a_obj_dragonhead.cpp +++ b/src/d/actor/d_a_obj_dragonhead.cpp @@ -3,161 +3,266 @@ // Translation Unit: d_a_obj_dragonhead.cpp // -#include "d_a_obj_dragonhead.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_cc_d.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +class daObjDragonhead_c : public fopAc_ac_c { +public: + inline s32 _create(); + inline bool _execute(); + inline bool _draw(); + inline bool _delete(); + BOOL CreateHeap(); + void CreateInit(); + void set_mtx(); + +public: + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModel; + /* 0x29C */ dCcD_Stts mStts; + /* 0x2D8 */ dCcD_Sph mSph; + /* 0x404 */ u8 mAlpha; + /* 0x405 */ bool mSwitchOn; + /* 0x408 */ dBgW * mpBgW; + /* 0x40C */ u8 field_0x40c; + /* 0x410 */ cXyz mSphCenter; + /* 0x41C */ Mtx mtx; +}; + +dCcD_SrcSph sph_check_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_FIRE_ARROW, + /* SrcObjTg SPrm */ 0x09, + /* 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 */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 1000.0f, + }, +}; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -void CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daObjDragonhead_c*)i_this)->CreateHeap(); } +namespace daObjDragonhead_prm { + inline u8 getSwitchNo(daObjDragonhead_c* ac) { return (fopAcM_GetParam(ac) >> 8) & 0xFF; } +}; + /* 00000098-00000228 .text CreateHeap__17daObjDragonhead_cFv */ -void daObjDragonhead_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjDragonhead_c::CreateHeap() { + J3DModelData* model_data = (J3DModelData*)(dComIfG_getObjectRes("Qdghd", 0x04)); + JUT_ASSERT(0xA0, model_data != 0); + mpModel = mDoExt_J3DModel__create(model_data, 0x00, 0x11020203); + if (!mpModel) + return FALSE; + + s32 ret = 1; + + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::scaleM(mScale); + mDoMtx_copy(mDoMtx_stack_c::get(), mtx); + + mpBgW = new dBgW(); + if (!mpBgW || mpBgW->Set((cBgD_t*)dComIfG_getObjectRes("Qdghd", 0x07), cBgW::MOVE_BG_e, &mtx)) + ret = 0; + + if (ret != 1) + return false; + + return mpModel != NULL; } /* 00000228-0000034C .text CreateInit__17daObjDragonhead_cFv */ void daObjDragonhead_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeFar(this, 1.0f); + set_mtx(); + + field_0x40c = 0; + /* Nonmatching -- swapped switchNo and g_dComIfG_gameInfo load */ + if (dComIfGs_isSwitch(daObjDragonhead_prm::getSwitchNo(this), fopAcM_GetHomeRoomNo(this))) { + mSwitchOn = true; + mAlpha = 0; + } else { + mSwitchOn = false; + mAlpha = 0xFF; + if (field_0x40c == 0 && !dComIfG_Bgsp()->Regist(mpBgW, this)) + field_0x40c = 1; + } + + mStts.Init(0xFF, 0xFF, this); + mSph.Set(sph_check_src); + mSphCenter.set(79338.0f, 950.0f, 220000.0f); + mSph.SetC(mSphCenter); + mSph.SetStts(&mStts); } /* 0000034C-000003CC .text set_mtx__17daObjDragonhead_cFv */ void daObjDragonhead_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); +} + +s32 daObjDragonhead_c::_create() { + fopAcM_SetupActor(this, daObjDragonhead_c); + + s32 ret = dComIfG_resLoad(&mPhs, "Qdghd"); + + if (ret == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckCreateHeap, 0x10500) == 0) { + ret = cPhs_ERROR_e; + } else { + CreateInit(); + } + } + + return ret; +} + +bool daObjDragonhead_c::_delete() { + if (heap != NULL && field_0x40c == 1) + dComIfG_Bgsp()->Release(mpBgW); + + mDoAud_seDeleteObject(&mSphCenter); + dComIfG_resDelete(&mPhs, "Qdghd"); + return true; +} + +bool daObjDragonhead_c::_execute() { + dComIfG_Ccsp()->Set(&mSph); + if (!mSwitchOn) { + mDoAud_seStart(JA_SE_OBJ_ICEBERG_BREATH, &mSphCenter, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (mSph.ChkTgHit()) { + cCcD_Obj* at = mSph.GetTgHitObj(); + if (at != NULL && at->ChkAtType(AT_TYPE_FIRE_ARROW)) { + dComIfGs_onSwitch(daObjDragonhead_prm::getSwitchNo(this), fopAcM_GetHomeRoomNo(this)); + mSwitchOn = true; + } + } + } + + /* Nonmatching -- swapped switchNo and g_dComIfG_gameInfo load */ + if (dComIfGs_isSwitch(daObjDragonhead_prm::getSwitchNo(this), fopAcM_GetHomeRoomNo(this))) { + if (field_0x40c == 1) { + if (!dComIfG_Bgsp()->Release(mpBgW)) + field_0x40c = 0; + + mDoAud_seStart(JA_SE_OBJ_ICEVERG_MELT, &mEyePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + + if (mAlpha != 0) { + if (mAlpha >= 2) + mAlpha -= 2; + else + mAlpha = 0; + } + } else { + mSwitchOn = false; + if (field_0x40c == 0 && !dComIfG_Bgsp()->Regist(mpBgW, this)) + field_0x40c = 1; + + if (mAlpha < 0xFF) { + if (mAlpha <= 0xFD) + mAlpha += 2; + else + mAlpha = 0xFF; + } + } + + set_mtx(); + return true; +} + +bool daObjDragonhead_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + dComIfGd_setListBG(); + J3DModelData* modelData = mpModel->getModelData(); + u16 materialNum = modelData->getMaterialNum(); + for (u16 i = 0; i < materialNum; i++) { + J3DMaterial* mat = modelData->getMaterialNodePointer(i); + mat->getTevKColor(3)->mColor.a = mAlpha; + } + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + return true; } /* 000003CC-000004FC .text daObjDragonhead_Create__FPv */ -void daObjDragonhead_Create(void*) { - /* Nonmatching */ -} - -/* 000004FC-000005C8 .text __dt__8dCcD_SphFv */ -dCcD_Sph::~dCcD_Sph() { - /* Nonmatching */ -} - -/* 000005C8-00000610 .text __dt__8cM3dGSphFv */ -cM3dGSph::~cM3dGSph() { - /* Nonmatching */ -} - -/* 00000610-0000066C .text __dt__14cCcD_ShapeAttrFv */ -cCcD_ShapeAttr::~cCcD_ShapeAttr() { - /* Nonmatching */ -} - -/* 0000066C-000006B4 .text __dt__8cM3dGAabFv */ -cM3dGAab::~cM3dGAab() { - /* Nonmatching */ +s32 daObjDragonhead_Create(void* i_this) { + return ((daObjDragonhead_c*)i_this)->_create(); } /* 000006B4-00000730 .text daObjDragonhead_Delete__FPv */ -void daObjDragonhead_Delete(void*) { - /* Nonmatching */ +BOOL daObjDragonhead_Delete(void* i_this) { + return ((daObjDragonhead_c*)i_this)->_delete(); } /* 00000730-00000824 .text daObjDragonhead_Draw__FPv */ -void daObjDragonhead_Draw(void*) { - /* Nonmatching */ +BOOL daObjDragonhead_Draw(void* i_this) { + return ((daObjDragonhead_c*)i_this)->_draw(); } /* 00000824-00000A48 .text daObjDragonhead_Execute__FPv */ -void daObjDragonhead_Execute(void*) { - /* Nonmatching */ +BOOL daObjDragonhead_Execute(void* i_this) { + return ((daObjDragonhead_c*)i_this)->_execute(); } /* 00000A48-00000A50 .text daObjDragonhead_IsDelete__FPv */ -void daObjDragonhead_IsDelete(void*) { - /* Nonmatching */ +BOOL daObjDragonhead_IsDelete(void* i_this) { + return TRUE; } -/* 00000A50-00000A60 .text GetShapeAttr__8dCcD_SphFv */ -void dCcD_Sph::GetShapeAttr() { - /* Nonmatching */ -} - -/* 00000A60-00000A68 .text GetCoCP__12cCcD_SphAttrFv */ -void cCcD_SphAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00000A68-00000A70 .text GetCoCP__12cCcD_SphAttrCFv */ -void cCcD_SphAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00000A70-00000A78 .text CrossAtTg__12cCcD_SphAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000A78-00000A80 .text CrossAtTg__12cCcD_SphAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000A80-00000AB8 .text CrossAtTg__12cCcD_SphAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000AB8-00000AC0 .text CrossCo__12cCcD_SphAttrCFRC12cCcD_AabAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000AC0-00000AC8 .text CrossCo__12cCcD_SphAttrCFRC12cCcD_TriAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000AC8-00000AD0 .text CrossCo__12cCcD_SphAttrCFRC12cCcD_PntAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000AD0-00000B08 .text CrossCo__12cCcD_SphAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000B08-00000B0C .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} - -/* 00000B0C-00000B14 .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} - -/* 00000B14-00000B1C .text CrossAtTg__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_ShapeAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000B1C-00000B24 .text CrossCo__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_ShapeAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000B24-00000B30 .text GetCoCP__14cCcD_ShapeAttrFv */ -void cCcD_ShapeAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00000B30-00000B3C .text GetCoCP__14cCcD_ShapeAttrCFv */ -void cCcD_ShapeAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00000B3C-00000B44 .text @280@__dt__8dCcD_SphFv */ -void @280@__dt__8dCcD_SphFv { - /* Nonmatching */ -} - -/* 00000B44-00000B4C .text @248@__dt__8dCcD_SphFv */ -void @248@__dt__8dCcD_SphFv { - /* Nonmatching */ -} +static actor_method_class daObj_DragonheadMethodTable = { + (process_method_func)daObjDragonhead_Create, + (process_method_func)daObjDragonhead_Delete, + (process_method_func)daObjDragonhead_Execute, + (process_method_func)daObjDragonhead_IsDelete, + (process_method_func)daObjDragonhead_Draw, +}; +actor_process_profile_definition g_profile_Obj_Dragonhead = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 3, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Dragonhead, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjDragonhead_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x0025, + /* Actor SubMtd */ &daObj_DragonheadMethodTable, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_UNK4000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_eayogn.cpp b/src/d/actor/d_a_obj_eayogn.cpp index 60994b8d7..22a0e2ba9 100644 --- a/src/d/actor/d_a_obj_eayogn.cpp +++ b/src/d/actor/d_a_obj_eayogn.cpp @@ -3,71 +3,174 @@ // Translation Unit: d_a_obj_eayogn.cpp // -#include "d_a_obj_eayogn.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +class daObjEayogn_c : public fopAc_ac_c { +public: + s32 _create(); + bool _execute(); + bool _draw(); + bool _delete(); + bool create_heap(); + static bool solidHeapCB(fopAc_ac_c *i_this); + void init_mtx(); + BOOL check_ev_bit() const; + static const char M_arcname[7]; + +public: + /* 0x290 */ J3DModel * mpModel; + /* 0x294 */ request_of_phase_process_class mPhs; + /* 0x2A0 */ dBgW * mpBgW; +}; + +const char daObjEayogn_c::M_arcname[7] = "Eayogn"; /* 00000078-00000098 .text solidHeapCB__13daObjEayogn_cFP10fopAc_ac_c */ -void daObjEayogn_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +bool daObjEayogn_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((daObjEayogn_c*)i_this)->create_heap(); } /* 00000098-00000198 .text create_heap__13daObjEayogn_cFv */ -void daObjEayogn_c::create_heap() { - /* Nonmatching */ +bool daObjEayogn_c::create_heap() { + bool ret = false; + + J3DModelData* mdl_data = static_cast(dComIfG_getObjectRes(M_arcname, 0x04)); + JUT_ASSERT(0x5c, mdl_data != 0); + + if (mdl_data != NULL) { + mpModel = mDoExt_J3DModel__create(mdl_data, 0x00, 0x11020203); + if (mpModel != NULL) { + mpBgW = dBgW_NewSet((cBgD_t*)dComIfG_getObjectRes(M_arcname, 0x07), cBgW::MOVE_BG_e, &mpModel->getBaseTRMtx()); + if (mpBgW != NULL) + ret = true; + } + } + + return ret; } /* 00000198-0000029C .text _create__13daObjEayogn_cFv */ -void daObjEayogn_c::_create() { - /* Nonmatching */ +s32 daObjEayogn_c::_create() { + s32 ret = cPhs_ERROR_e; + + fopAcM_SetupActor(this, daObjEayogn_c); + + if (check_ev_bit()) { + ret = dComIfG_resLoad(&mPhs, M_arcname); + + if (ret == cPhs_COMPLEATE_e) { + ret = cPhs_ERROR_e; + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)solidHeapCB, 0x0)) { + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + dComIfG_Bgsp()->Regist(mpBgW, this); + mpBgW->Move(); + fopAcM_setCullSizeBox(this, -550.0f, -50.0f, -600.0f, 550.0f, 50.0f, 600.0f); + ret = cPhs_COMPLEATE_e; + } + } + } + + return ret; } /* 0000029C-00000330 .text _delete__13daObjEayogn_cFv */ -void daObjEayogn_c::_delete() { - /* Nonmatching */ +bool daObjEayogn_c::_delete() { + if (heap != NULL && mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + mpBgW = NULL; + } + } + + dComIfG_resDelete(&mPhs, M_arcname); + + return true; } /* 00000330-00000360 .text check_ev_bit__13daObjEayogn_cCFv */ -void daObjEayogn_c::check_ev_bit() const { - /* Nonmatching */ +BOOL daObjEayogn_c::check_ev_bit() const { + return dComIfGs_isSymbol(1); } /* 00000360-000003E8 .text init_mtx__13daObjEayogn_cFv */ void daObjEayogn_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000003E8-000003F0 .text _execute__13daObjEayogn_cFv */ -void daObjEayogn_c::_execute() { - /* Nonmatching */ +bool daObjEayogn_c::_execute() { + return true; } /* 000003F0-00000490 .text _draw__13daObjEayogn_cFv */ -void daObjEayogn_c::_draw() { - /* Nonmatching */ +bool daObjEayogn_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + return true; } -/* 00000490-000004B0 .text Mthd_Create__28@unnamed@d_a_obj_eayogn_cpp@FPv */ -void @unnamed@d_a_obj_eayogn_cpp@::Mthd_Create(void*) { - /* Nonmatching */ -} - -/* 000004B0-000004D4 .text Mthd_Delete__28@unnamed@d_a_obj_eayogn_cpp@FPv */ -void @unnamed@d_a_obj_eayogn_cpp@::Mthd_Delete(void*) { - /* Nonmatching */ -} - -/* 000004D4-000004F8 .text Mthd_Execute__28@unnamed@d_a_obj_eayogn_cpp@FPv */ -void @unnamed@d_a_obj_eayogn_cpp@::Mthd_Execute(void*) { - /* Nonmatching */ -} - -/* 000004F8-0000051C .text Mthd_Draw__28@unnamed@d_a_obj_eayogn_cpp@FPv */ -void @unnamed@d_a_obj_eayogn_cpp@::Mthd_Draw(void*) { - /* Nonmatching */ -} - -/* 0000051C-00000524 .text Mthd_IsDelete__28@unnamed@d_a_obj_eayogn_cpp@FPv */ -void @unnamed@d_a_obj_eayogn_cpp@::Mthd_IsDelete(void*) { - /* Nonmatching */ +namespace { + /* 00000490-000004B0 .text Mthd_Create__28@unnamed@d_a_obj_eayogn_cpp@FPv */ + s32 Mthd_Create(void* i_this) { + return ((daObjEayogn_c*)i_this)->_create(); + } + + /* 000004B0-000004D4 .text Mthd_Delete__28@unnamed@d_a_obj_eayogn_cpp@FPv */ + BOOL Mthd_Delete(void* i_this) { + return ((daObjEayogn_c*)i_this)->_delete(); + } + + /* 000004D4-000004F8 .text Mthd_Execute__28@unnamed@d_a_obj_eayogn_cpp@FPv */ + BOOL Mthd_Execute(void* i_this) { + return ((daObjEayogn_c*)i_this)->_execute(); + } + + /* 000004F8-0000051C .text Mthd_Draw__28@unnamed@d_a_obj_eayogn_cpp@FPv */ + BOOL Mthd_Draw(void* i_this) { + return ((daObjEayogn_c*)i_this)->_draw(); + } + + /* 0000051C-00000524 .text Mthd_IsDelete__28@unnamed@d_a_obj_eayogn_cpp@FPv */ + BOOL Mthd_IsDelete(void* i_this) { + return TRUE; + } + + static actor_method_class Eayogn_Mthd_Table = { + (process_method_func)Mthd_Create, + (process_method_func)Mthd_Delete, + (process_method_func)Mthd_Execute, + (process_method_func)Mthd_IsDelete, + (process_method_func)Mthd_Draw, + }; } +actor_process_profile_definition g_profile_Obj_Eayogn = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 3, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Eayogn, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjEayogn_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x004C, + /* Actor SubMtd */ &Eayogn_Mthd_Table, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_gong.cpp b/src/d/actor/d_a_obj_gong.cpp index 616fcd7a4..fab86fecc 100644 --- a/src/d/actor/d_a_obj_gong.cpp +++ b/src/d/actor/d_a_obj_gong.cpp @@ -3,76 +3,194 @@ // Translation Unit: d_a_obj_gong.cpp // -#include "d_a_obj_gong.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_a_obj.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/d_drawlist.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" + +namespace daObjGong { + namespace { + struct L_attr_entry { + /* 0x00 */ f32 spec; + /* 0x04 */ f32 offsetY; + }; + + static const L_attr_entry L_attr = { + 0.75f, 125.0f, + }; + + inline const L_attr_entry & attr() { return L_attr; } + } + + class Act_c : fopAc_ac_c { + public: + s32 _create(); + bool _execute(); + bool _draw(); + bool _delete(); + bool create_heap(); + void init_mtx(); + void set_mtx(); + bool demo_move(); + static BOOL solidHeapCB(fopAc_ac_c *i_this); + static const char M_arcname[6]; + + public: + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ mDoExt_McaMorf * mpMorf; + }; +} + +const char daObjGong::Act_c::M_arcname[6] = "Vdora"; /* 00000078-0000009C .text solidHeapCB__Q29daObjGong5Act_cFP10fopAc_ac_c */ -void daObjGong::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjGong::Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((Act_c*)i_this)->create_heap(); } /* 0000009C-0000028C .text create_heap__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::create_heap() { - /* Nonmatching */ +bool daObjGong::Act_c::create_heap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(M_arcname, 0x04)); + J3DAnmTransformKey* bck = static_cast(dComIfG_getObjectRes(M_arcname, 0x07)); + JUT_ASSERT(0xbd, (modelData != 0) && (bck != 0)); + + mpMorf = new mDoExt_McaMorf(modelData, NULL, NULL, bck, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 0, NULL, 0, 0x11020203); + J3DModel * model = mpMorf != NULL ? mpMorf->getModel() : NULL; + + bool ret = false; + if (model != NULL) { + J3DSkinDeform * deform = new J3DSkinDeform(); + if (deform != NULL) { + s32 err = model->setSkinDeform(deform, 1); + JUT_ASSERT(0xd7, (err == J3DErrType_Success) || (err == J3DErrType_OutOfMemory)); + if (err == J3DErrType_Success) + ret = true; + } + } + + return model != NULL && ret; } /* 0000028C-00000374 .text _create__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::_create() { - /* Nonmatching */ +s32 daObjGong::Act_c::_create() { + fopAcM_SetupActor(this, Act_c); + + s32 ret = dComIfG_resLoad(&mPhs, M_arcname); + + if (ret == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)solidHeapCB, 0x0)) { + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + init_mtx(); + fopAcM_setCullSizeBox(this, -100.0f, -1.0f, -50.0f, 100.0f, 230.0f, 50.0f); + mEyePos.y += attr().offsetY; + } else { + ret = cPhs_ERROR_e; + } + } + + return ret; } /* 00000374-000003A4 .text _delete__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::_delete() { - /* Nonmatching */ +bool daObjGong::Act_c::_delete() { + dComIfG_resDelete(&mPhs, M_arcname); + return true; } /* 000003A4-00000414 .text set_mtx__Q29daObjGong5Act_cFv */ void daObjGong::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000414-00000454 .text init_mtx__Q29daObjGong5Act_cFv */ void daObjGong::Act_c::init_mtx() { - /* Nonmatching */ + mpMorf->getModel()->setBaseScale(mScale); + set_mtx(); } /* 00000454-000004A4 .text demo_move__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::demo_move() { - /* Nonmatching */ +bool daObjGong::Act_c::demo_move() { + return dDemo_setDemoData(this, 0x6A, mpMorf, "Vdora", 0, NULL, 0, 0); } /* 000004A4-000004F0 .text _execute__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::_execute() { - /* Nonmatching */ +bool daObjGong::Act_c::_execute() { + demo_move(); + mpMorf->play(NULL, 0, 0); + set_mtx(); + return true; } /* 000004F0-00000580 .text _draw__Q29daObjGong5Act_cFv */ -void daObjGong::Act_c::_draw() { - /* Nonmatching */ +bool daObjGong::Act_c::_draw() { + /* Nonmatching - just some tiny regalloc */ + J3DModel* model = mpMorf->getModel(); + J3DModelData* modelData = model->getModelData(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(model, &mTevStr); + dDlst_texSpecmapST(&mEyePos, &mTevStr, modelData, attr().spec); + mpMorf->updateDL(); + return true; } -/* 00000580-000005A0 .text Mthd_Create__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ -void daObjGong::@unnamed@d_a_obj_gong_cpp@::Mthd_Create(void*) { - /* Nonmatching */ -} - -/* 000005A0-000005C4 .text Mthd_Delete__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ -void daObjGong::@unnamed@d_a_obj_gong_cpp@::Mthd_Delete(void*) { - /* Nonmatching */ -} - -/* 000005C4-000005E8 .text Mthd_Execute__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ -void daObjGong::@unnamed@d_a_obj_gong_cpp@::Mthd_Execute(void*) { - /* Nonmatching */ -} - -/* 000005E8-0000060C .text Mthd_Draw__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ -void daObjGong::@unnamed@d_a_obj_gong_cpp@::Mthd_Draw(void*) { - /* Nonmatching */ -} - -/* 0000060C-00000614 .text Mthd_IsDelete__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ -void daObjGong::@unnamed@d_a_obj_gong_cpp@::Mthd_IsDelete(void*) { - /* Nonmatching */ +namespace daObjGong { + namespace { + /* 00000580-000005A0 .text Mthd_Create__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ + s32 Mthd_Create(void* i_this) { + return ((Act_c*)i_this)->_create(); + } + + /* 000005A0-000005C4 .text Mthd_Delete__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ + BOOL Mthd_Delete(void* i_this) { + return ((Act_c*)i_this)->_delete(); + } + + /* 000005C4-000005E8 .text Mthd_Execute__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ + BOOL Mthd_Execute(void* i_this) { + return ((Act_c*)i_this)->_execute(); + } + + /* 000005E8-0000060C .text Mthd_Draw__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ + BOOL Mthd_Draw(void* i_this) { + return ((Act_c*)i_this)->_draw(); + } + + /* 0000060C-00000614 .text Mthd_IsDelete__Q29daObjGong26@unnamed@d_a_obj_gong_cpp@FPv */ + BOOL Mthd_IsDelete(void* i_this) { + return TRUE; + } + + static actor_method_class Mthd_Table = { + (process_method_func)Mthd_Create, + (process_method_func)Mthd_Delete, + (process_method_func)Mthd_Execute, + (process_method_func)Mthd_IsDelete, + (process_method_func)Mthd_Draw, + }; + } } +actor_process_profile_definition g_profile_Obj_Gong = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 3, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Gong, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daObjGong::Act_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x004C, + /* Actor SubMtd */ &daObjGong::Mthd_Table, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 1cef9e1e2..c63b3b5c6 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -1650,14 +1650,14 @@ J3DModel* mDoExt_J3DModel__create(J3DModelData* i_modelData, u32 i_modelFlag, u3 } int ret = model->entryModelData(i_modelData, i_modelFlag, 1); - if (ret == kJ3DError_Success) { + if (ret == J3DErrType_Success) { if (i_modelFlag == 0x80000) { if (i_differedDlistFlag & 0x2) { i_differedDlistFlag |= 0x20; } ret = model->newDifferedDisplayList(i_differedDlistFlag); - if (ret != kJ3DError_Success) { + if (ret != J3DErrType_Success) { return NULL; } }