d_a_obj_catdoor first pass

This commit is contained in:
theo3 2023-01-01 22:48:53 -08:00
parent e5ff41975d
commit 78e8b01174
2 changed files with 182 additions and 165 deletions

View File

@ -4,105 +4,151 @@
//
#include "rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.h"
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "SSystem/SComponent/c_phase.h"
#include "d/bg/d_bg_w.h"
#include "d/com/d_com_inf_game.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "f_op/f_op_actor.h"
#include "f_op/f_op_actor_mng.h"
//
// Types:
//
extern const char* l_arcName;
static int createSolidHeap(fopAc_ac_c* i_this);
struct request_of_phase_process_class {};
struct cXyz {};
struct mDoMtx_stack_c {
/* 8000CCC8 */ void push();
/* 8000CD14 */ void pop();
/* 8000CD64 */ void transS(cXyz const&);
/* 8000CD9C */ void transM(f32, f32, f32);
static u8 now[48];
struct daObjCatDoor_Door_c {
/* 0x00 */ J3DModel* pmodel;
/* 0x04 */ dBgW bgw;
/* 0xe0 */ Mtx mtx;
/* 0xf4 */ s16 angle;
};
struct fopAc_ac_c {
/* 80018B64 */ fopAc_ac_c();
/* 80018C8C */ ~fopAc_ac_c();
};
class daObjCatDoor_c : public fopAc_ac_c {
public:
daObjCatDoor_c() {}
~daObjCatDoor_c() {
if (mDoor1.bgw.ChkUsed()) {
dComIfG_Bgsp().Release(&mDoor1.bgw);
}
if (mDoor2.bgw.ChkUsed()) {
dComIfG_Bgsp().Release(&mDoor2.bgw);
}
dComIfG_resDelete(&mPhaseReq, l_arcName);
}
struct daObjCatDoor_c {
/* 80BC42B8 */ void attr() const;
/* 80BC42B8 */ const s16* attr() const;
/* 80BC43F4 */ void initBaseMtx();
/* 80BC4454 */ void setBaseMtx();
/* 80BC4560 */ void calcOpen();
u8 getSwitchNo() { return fopAcM_GetParam(this); }
int createHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4);
ASSERT(modelData != NULL);
mDoor1.pmodel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
mDoor2.pmodel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mDoor1.pmodel == NULL || mDoor2.pmodel == NULL) {
return 0;
}
cBgD_t* cbgd = (cBgD_t*)dComIfG_getObjectRes(l_arcName, 7);
if (mDoor1.bgw.Set(cbgd, 1, &mDoor1.mtx)) {
return 0;
}
cBgD_t* cbgd2 = (cBgD_t*)dComIfG_getObjectRes(l_arcName, 7);
if (mDoor2.bgw.Set(cbgd2, 1, &mDoor2.mtx)) {
return 0;
}
return 1;
}
int draw() {
g_env_light.settingTevStruct(0x10, &current.pos, &mTevStr);
fopAc_ac_c* p1 = static_cast<fopAc_ac_c*>(this);
g_env_light.setLightTevColorType_MAJI(mDoor1.pmodel, &p1->mTevStr);
g_env_light.setLightTevColorType_MAJI(mDoor2.pmodel, &p1->mTevStr);
dComIfGd_setListBG();
mDoExt_modelUpdateDL(mDoor1.pmodel);
mDoExt_modelUpdateDL(mDoor2.pmodel);
dComIfGd_setList();
return 1;
}
int execute() {
if (dComIfGs_isSwitch(fopAcM_GetParam(this) & 0xFF, fopAcM_GetHomeRoomNo(this)) ||
mRotSpeed == 0) {
return 1;
}
calcOpen();
setBaseMtx();
return 1;
}
int create() {
if (!fopAcM_CheckCondition(this, 8)) {
new (this) daObjCatDoor_c();
fopAcM_OnCondition(this, 8);
}
int phase_state = dComIfG_resLoad(&mPhaseReq, l_arcName);
if (phase_state != cPhs_COMPLEATE_e) {
return phase_state;
}
if (!fopAcM_entrySolidHeap(this, createSolidHeap, 0x2520)) {
return cPhs_ERROR_e;
}
create_init();
return phase_state;
}
void create_init() {
ASSERT(getSwitchNo() != 0xff);
fopAcM_setCullSizeBox(this, -200.0f, 0.0f, -20.0f, 200.0f, 260.0f, 100.0f);
if (i_fopAcM_isSwitch(this, getSwitchNo())) {
mDoor1.angle = 0x8800;
mDoor2.angle = 0x7800;
} else {
mDoor1.bgw.SetCrrFunc(NULL);
mDoor1.bgw.SetRoomId(fopAcM_GetRoomNo(this));
dComIfG_Bgsp().Regist(&mDoor1.bgw, this);
mDoor2.bgw.SetCrrFunc(NULL);
mDoor2.bgw.SetRoomId(fopAcM_GetRoomNo(this));
dComIfG_Bgsp().Regist(&mDoor2.bgw, this);
}
initBaseMtx();
}
private:
/* 0x568 */ request_of_phase_process_class mPhaseReq;
/* 0x570 */ daObjCatDoor_Door_c mDoor1;
/* 0x660 */ daObjCatDoor_Door_c mDoor2;
/* 0x760 */ Mtx mMtx;
/* 0x790 */ s16 mRotSpeed;
public:
static u32 const M_attr;
};
struct dSv_info_c {
/* 80035200 */ void onSwitch(int, int);
/* 80035360 */ void isSwitch(int, int) const;
};
struct dKy_tevstr_c {};
struct J3DModelData {};
struct dScnKy_env_light_c {
/* 801A37C4 */ void settingTevStruct(int, cXyz*, dKy_tevstr_c*);
/* 801A4DA0 */ void setLightTevColorType_MAJI(J3DModelData*, dKy_tevstr_c*);
};
struct dRes_info_c {};
struct dRes_control_c {
/* 8003C2EC */ void getRes(char const*, s32, dRes_info_c*, int);
};
struct dBgW_Base {};
struct dBgW {
/* 8007B970 */ dBgW();
/* 8007B9C0 */ void Move();
};
struct dBgS {
/* 80074A08 */ void Regist(dBgW_Base*, fopAc_ac_c*);
};
struct cBgW_BgId {
/* 802681D4 */ void ChkUsed() const;
};
struct cBgD_t {};
struct cBgW {
/* 8007933C */ ~cBgW();
/* 80079F38 */ void Set(cBgD_t*, u32, f32 (*)[3][4]);
};
struct cBgS {
/* 80074250 */ void Release(dBgW_Base*);
};
struct J3DModel {};
//
// Forward References:
//
extern "C" void attr__14daObjCatDoor_cCFv();
extern "C" static void createSolidHeap__FP10fopAc_ac_c();
extern "C" void initBaseMtx__14daObjCatDoor_cFv();
extern "C" void setBaseMtx__14daObjCatDoor_cFv();
extern "C" void calcOpen__14daObjCatDoor_cFv();
extern "C" static void daObjCatDoor_Draw__FP14daObjCatDoor_c();
extern "C" static void daObjCatDoor_Execute__FP14daObjCatDoor_c();
extern "C" static int daObjCatDoor_Execute__FP14daObjCatDoor_c();
extern "C" static bool daObjCatDoor_IsDelete__FP14daObjCatDoor_c();
extern "C" static void daObjCatDoor_Delete__FP14daObjCatDoor_c();
extern "C" static void daObjCatDoor_Create__FP10fopAc_ac_c();
extern "C" u32 const M_attr__14daObjCatDoor_c;
extern "C" extern char const* const d_a_obj_catdoor__stringBase0;
extern "C" extern void* g_profile_Obj_CatDoor[12];
//
// External References:
@ -134,18 +180,13 @@ extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c();
extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c();
extern "C" void ChkUsed__9cBgW_BgIdCFv();
extern "C" void cLib_chaseS__FPsss();
extern "C" void PSMTXCopy();
extern "C" void _savegpr_25();
extern "C" void _savegpr_29();
extern "C" void _restgpr_25();
extern "C" void _restgpr_29();
extern "C" extern void* g_fopAc_Method[8];
extern "C" extern void* g_fpcLf_Method[5 + 1 /* padding */];
extern "C" extern void* __vt__4dBgW[65];
extern "C" u8 now__14mDoMtx_stack_c[48];
extern "C" extern u8 g_dComIfG_gameInfo[122384];
extern "C" extern u8 g_env_light[4880];
extern "C" extern u8 j3dSys[284];
//
// Declarations:
@ -157,118 +198,86 @@ SECTION_RODATA u32 const daObjCatDoor_c::M_attr = 0x001E0578;
COMPILER_STRIP_GATE(0x80BC49B4, &daObjCatDoor_c::M_attr);
/* 80BC42B8-80BC42C4 000078 000C+00 1/1 0/0 1/1 .text attr__14daObjCatDoor_cCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void daObjCatDoor_c::attr() const {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/attr__14daObjCatDoor_cCFv.s"
const s16* daObjCatDoor_c::attr() const {
return (const s16*)&daObjCatDoor_c::M_attr;
}
#pragma pop
/* ############################################################################################## */
/* 80BC49D8-80BC49D8 000024 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_80BC49D8 = "CatDoor";
#pragma pop
/* 80BC49E0-80BC49E4 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */
SECTION_DATA static void* l_arcName = (void*)&d_a_obj_catdoor__stringBase0;
static const char* l_arcName = "CatDoor";
/* 80BC42C4-80BC43F4 000084 0130+00 1/1 0/0 0/0 .text createSolidHeap__FP10fopAc_ac_c */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void createSolidHeap(fopAc_ac_c* param_0) {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/createSolidHeap__FP10fopAc_ac_c.s"
static int createSolidHeap(fopAc_ac_c* i_this) {
return static_cast<daObjCatDoor_c*>(i_this)->createHeap();
}
#pragma pop
/* 80BC43F4-80BC4454 0001B4 0060+00 1/1 0/0 0/0 .text initBaseMtx__14daObjCatDoor_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void daObjCatDoor_c::initBaseMtx() {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/initBaseMtx__14daObjCatDoor_cFv.s"
void daObjCatDoor_c::initBaseMtx() {
mCullMtx = mMtx;
mDoMtx_stack_c::transS(current.pos);
mDoMtx_YrotM(mDoMtx_stack_c::get(), shape_angle.y);
PSMTXCopy(mDoMtx_stack_c::get(), mMtx);
setBaseMtx();
}
#pragma pop
/* ############################################################################################## */
/* 80BC49B8-80BC49BC 000004 0004+00 0/1 0/0 0/0 .rodata @3712 */
#pragma push
#pragma force_active on
SECTION_RODATA static f32 const lit_3712 = -97.0f;
COMPILER_STRIP_GATE(0x80BC49B8, &lit_3712);
#pragma pop
/* 80BC49BC-80BC49C0 000008 0004+00 0/1 0/0 0/0 .rodata @3713 */
#pragma push
#pragma force_active on
SECTION_RODATA static f32 const lit_3713 = 97.0f;
COMPILER_STRIP_GATE(0x80BC49BC, &lit_3713);
#pragma pop
/* 80BC49C0-80BC49C4 00000C 0004+00 0/2 0/0 0/0 .rodata @3714 */
#pragma push
#pragma force_active on
SECTION_RODATA static u8 const lit_3714[4] = {
0x00,
0x00,
0x00,
0x00,
};
COMPILER_STRIP_GATE(0x80BC49C0, &lit_3714);
#pragma pop
/* 80BC4454-80BC4560 000214 010C+00 2/2 0/0 1/1 .text setBaseMtx__14daObjCatDoor_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void daObjCatDoor_c::setBaseMtx() {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/setBaseMtx__14daObjCatDoor_cFv.s"
void daObjCatDoor_c::setBaseMtx() {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_YrotM(mDoMtx_stack_c::get(), shape_angle.y);
for (int i = 0; i < 2; i++) {
daObjCatDoor_Door_c* door = i == 0 ? &mDoor1 : &mDoor2;
f32 xOff = i == 0 ? -97.0f : 97.0f;
s16 rot = i == 0 ? door->angle : s16(door->angle + 0x8000);
mDoMtx_stack_c::push();
mDoMtx_stack_c::transM(xOff, 0.0, 0.0);
mDoMtx_YrotM(mDoMtx_stack_c::get(), (s16)rot);
mDoMtx_copy(mDoMtx_stack_c::get(), door->pmodel->mBaseTransformMtx);
mDoMtx_copy(mDoMtx_stack_c::get(), door->mtx);
door->bgw.Move();
mDoMtx_stack_c::pop();
}
}
#pragma pop
/* 80BC4560-80BC4628 000320 00C8+00 1/1 0/0 0/0 .text calcOpen__14daObjCatDoor_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void daObjCatDoor_c::calcOpen() {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/calcOpen__14daObjCatDoor_cFv.s"
void daObjCatDoor_c::calcOpen() {
s16 prev = mRotSpeed;
int res = cLib_chaseS(&mRotSpeed, 0, *attr());
for (int i = 0; i < 2; i++) {
daObjCatDoor_Door_c* door = i == 0 ? &mDoor1 : &mDoor2;
if (i == 0) {
door->angle -= mRotSpeed;
} else {
door->angle += mRotSpeed;
}
}
if (prev != 0 && res != 0) {
i_fopAcM_onSwitch(this, getSwitchNo());
}
}
#pragma pop
/* 80BC4628-80BC46EC 0003E8 00C4+00 1/0 0/0 0/0 .text daObjCatDoor_Draw__FP14daObjCatDoor_c */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void daObjCatDoor_Draw(daObjCatDoor_c* param_0) {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Draw__FP14daObjCatDoor_c.s"
static int daObjCatDoor_Draw(daObjCatDoor_c* i_this) {
return static_cast<daObjCatDoor_c*>(i_this)->draw();
}
#pragma pop
/* 80BC46EC-80BC4760 0004AC 0074+00 1/0 0/0 0/0 .text daObjCatDoor_Execute__FP14daObjCatDoor_c */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void daObjCatDoor_Execute(daObjCatDoor_c* param_0) {
nofralloc
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Execute__FP14daObjCatDoor_c.s"
static int daObjCatDoor_Execute(daObjCatDoor_c* i_this) {
return static_cast<daObjCatDoor_c*>(i_this)->execute();
}
#pragma pop
/* 80BC4760-80BC4768 000520 0008+00 1/0 0/0 0/0 .text daObjCatDoor_IsDelete__FP14daObjCatDoor_c */
static bool daObjCatDoor_IsDelete(daObjCatDoor_c* param_0) {
static bool daObjCatDoor_IsDelete(daObjCatDoor_c* i_this) {
return true;
}
/* 80BC4768-80BC4848 000528 00E0+00 1/0 0/0 0/0 .text daObjCatDoor_Delete__FP14daObjCatDoor_c */
#ifdef NONMATCHING // ~dBgW is not inlined
static int daObjCatDoor_Delete(daObjCatDoor_c* i_this) {
fopAcM_GetID(i_this);
i_this->~daObjCatDoor_c();
return 1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@ -277,6 +286,7 @@ static asm void daObjCatDoor_Delete(daObjCatDoor_c* param_0) {
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Delete__FP14daObjCatDoor_c.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80BC49C4-80BC49C8 000010 0004+00 0/1 0/0 0/0 .rodata @3860 */
@ -316,6 +326,12 @@ COMPILER_STRIP_GATE(0x80BC49D4, &lit_3864);
/* 80BC4848-80BC49AC 000608 0164+00 1/0 0/0 0/0 .text daObjCatDoor_Create__FP10fopAc_ac_c
*/
#ifdef NONMATCHING // inverted conditional branch
static void daObjCatDoor_Create(fopAc_ac_c* i_this) {
fopAcM_GetID(i_this);
static_cast<daObjCatDoor_c*>(i_this)->create();
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@ -324,6 +340,7 @@ static asm void daObjCatDoor_Create(fopAc_ac_c* param_0) {
#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Create__FP10fopAc_ac_c.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80BC49E4-80BC4A04 -00001 0020+00 1/0 0/0 0/0 .data l_daObjCatDoor_Method */

View File

@ -39,7 +39,7 @@ def import_c_file(in_file) -> str:
defines.add(guard_match[1])
print("Processing file", in_file)
include_match = include_pattern.match(line.strip())
if include_match:
if include_match and not include_match[1].endswith(".s"):
out_text += f"/* \"{in_file}\" line {idx} \"{include_match[1]}\" */\n"
out_text += import_h_file(include_match[1], os.path.dirname(in_file))
out_text += f"/* end \"{include_match[1]}\" */\n"