import os, sys, click from setup_profile import * # dictionary of known weakly linked functions to be replaced to avoid symbol oollision weak_funcs = { "asm J3DFrameCtrl::~J3DFrameCtrl()": "__dt__12J3DFrameCtrlFv", "asm dBgS_ObjAcch::~dBgS_ObjAcch()": "__dt__12dBgS_ObjAcchFv", "asm dBgS_AcchCir::~dBgS_AcchCir()": "__dt__12dBgS_AcchCirFv", "asm cM3dGSph::~cM3dGSph()": "__dt__8cM3dGSphFv", "asm cM3dGAab::~cM3dGAab()": "__dt__8cM3dGAabFv", "asm dBgS_ObjGndChk::~dBgS_ObjGndChk()": "__dt__14dBgS_ObjGndChkFv", "asm cXyz::~cXyz()": "__dt__4cXyzFv", "csXyz::csXyz()": "__ct__5csXyzFv", "asm csXyz::~csXyz()": "__dt__5csXyzFv", "asm dCcD_GStts::~dCcD_GStts()": "__dt__10dCcD_GSttsFv", "asm cCcD_GStts::~cCcD_GStts()": "__dt__10cCcD_GSttsFv", "asm cM3dGPla::~cM3dGPla()": "__dt__8cM3dGPlaFv", "asm dCcD_Sph::~dCcD_Sph()": "__dt__8dCcD_SphFv", "asm dCcD_Sph::dCcD_Sph()": "__ct__8dCcD_SphFv", "asm dKy_tevstr_c::~dKy_tevstr_c()": "__dt__12dKy_tevstr_cFv", "asm dKy_tevstr_c::dKy_tevstr_c()": "__ct__12dKy_tevstr_cFv", "asm J3DLightObj::J3DLightObj()": "__ct__11J3DLightObjFv", "asm void daPy_py_c::changeDemoPos0(cXyz const* param_0)": "changeDemoPos0__9daPy_py_cFPC4cXyz", "asm void daPy_py_c::changeDemoMode(u32 param_0, int param_1, int param_2, s16 param_3)": "changeDemoMode__9daPy_py_cFUliis", "asm void daPy_py_c::changeOriginalDemo()": "changeOriginalDemo__9daPy_py_cFv", "asm void obj_ystone_class::setCurrentPos(cXyz param_0)": "setCurrentPos__16obj_ystone_classF4cXyz", "asm dPa_followEcallBack::~dPa_followEcallBack()": "__dt__19dPa_followEcallBackFv", "void dPa_levelEcallBack::cleanup()": "cleanup__18dPa_levelEcallBackFv", "asm void dPa_followEcallBack::__defctor()": "__defctor__19dPa_followEcallBackFv", "asm dPa_levelEcallBack::~dPa_levelEcallBack()": "__dt__18dPa_levelEcallBackFv", "asm void daKey_c::setPos(cXyz param_0)": "setPos__7daKey_cF4cXyz", "asm void daPy_py_c::checkNowWolf()": "checkNowWolf__9daPy_py_cFv", "asm cM3dGCyl::~cM3dGCyl()": "__dt__8cM3dGCylFv", "cXyz::cXyz()": "__ct__4cXyzFv", "asm fOpAcm_HIO_entry_c::~fOpAcm_HIO_entry_c()": "__dt__18fOpAcm_HIO_entry_cFv", "asm mDoHIO_entry_c::~mDoHIO_entry_c()": "__dt__14mDoHIO_entry_cFv", "static asm void fopAcM_isSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_isSwitch__FPC10fopAc_ac_ci", "static asm void fopAcM_GetID(void const* param_0)": "fopAcM_GetID__FPCv", "void fopAcM_SetGroup(fopAc_ac_c* param_0, u8 param_1)": "fopAcM_SetGroup__FP10fopAc_ac_cUc", "asm void daPy_py_c::cancelOriginalDemo()": "cancelOriginalDemo__9daPy_py_cFv", "asm void mDoExt_morf_c::getFrame()": "getFrame__13mDoExt_morf_cFv", "asm void mDoExt_morf_c::isStop()": "isStop__13mDoExt_morf_cFv", "static asm void cM_scos(s16 param_0)": "cM_scos__Fs", "static asm void cM_ssin(s16 param_0)": "cM_ssin__Fs", "asm void dCamera_c::Fovy()": "Fovy__9dCamera_cFv", "static asm void fopAcM_searchPlayerAngleY(fopAc_ac_c const* param_0)": "fopAcM_searchPlayerAngleY__FPC10fopAc_ac_c", "asm void dEvt_info_c::checkCommandDemoAccrpt()": "checkCommandDemoAccrpt__11dEvt_info_cFv", "static asm void dComIfGp_getPlayer(int param_0) ": "dComIfGp_getPlayer__Fi", "static asm void fopAcM_onSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_onSwitch__FPC10fopAc_ac_ci", "static asm void fopAcM_offSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_offSwitch__FPC10fopAc_ac_ci", "void JPAEmitterCallBack::execute(JPABaseEmitter* param_0)": "execute__18JPAEmitterCallBackFP14JPABaseEmitter", "void JPAEmitterCallBack::executeAfter(JPABaseEmitter* param_0)": "executeAfter__18JPAEmitterCallBackFP14JPABaseEmitter", "void JPAEmitterCallBack::draw(JPABaseEmitter* param_0)": "draw__18JPAEmitterCallBackFP14JPABaseEmitter", "void JPAEmitterCallBack::drawAfter(JPABaseEmitter* param_0)": "drawAfter__18JPAEmitterCallBackFP14JPABaseEmitter", "asm void dEvt_control_c::checkSkipEdge()": "checkSkipEdge__14dEvt_control_cFv", "void daPy_py_c::changeDemoMoveAngle(s16 param_0)": "changeDemoMoveAngle__9daPy_py_cFs", "asm void cXyz::zero()": "zero__4cXyzFv", "asm void cXyz::abs() const": "abs__4cXyzCFv", "asm void mDoExt_morf_c::setFrame(f32 param_0)": "setFrame__13mDoExt_morf_cFf", "asm void cXyz::set(Vec const& param_0)": "set__4cXyzFRC3Vec", "asm void cXyz::set(f32 param_0, f32 param_1, f32 param_2)": "set__4cXyzFfff", "asm void cXyz::operator=(cXyz const& param_0)": "__as__4cXyzFRC4cXyz", "asm cXyz::cXyz(cXyz const& param_0)": "__ct__4cXyzFRC4cXyz", "asm cXyz::cXyz(f32 param_0, f32 param_1, f32 param_2)": "__ct__4cXyzFfff", "asm void daPy_py_c::getHeadTopPos() const": "getHeadTopPos__9daPy_py_cCFv", "asm void dCcD_Cyl::operator=(dCcD_Cyl const& param_0)": "__as__8dCcD_CylFRC8dCcD_Cyl", "asm void dCcD_GObjInf::operator=(dCcD_GObjInf const& param_0)": "__as__12dCcD_GObjInfFRC12dCcD_GObjInf", "asm dCcD_Cyl::~dCcD_Cyl()": "__dt__8dCcD_CylFv", "asm dCcD_Cyl::dCcD_Cyl()": "__ct__8dCcD_CylFv", "asm dBgS_ObjAcch::dBgS_ObjAcch()": "__ct__12dBgS_ObjAcchFv", "asm void daTag_FWall_c::getPos(u8 param_0)": "getPos__13daTag_FWall_cFUc", "asm void daB_DS_c::getHandPosR()": "getHandPosR__8daB_DS_cFv", "asm void daB_DS_c::getHandPosL()": "getHandPosL__8daB_DS_cFv", "asm dEvLib_callback_c::~dEvLib_callback_c()": "__dt__17dEvLib_callback_cFv", "bool dEvLib_callback_c::eventStart()": "eventStart__17dEvLib_callback_cFv", "asm void dInsect_c::Insect_Release()": "Insect_Release__9dInsect_cFv", "asm dBgS_WtrChk::~dBgS_WtrChk()": "__dt__11dBgS_WtrChkFv", "asm dBgS_ObjGndChk::dBgS_ObjGndChk()": "__ct__14dBgS_ObjGndChkFv", "asm void daObjLife_c::setPos(cXyz param_0)": "setPos__11daObjLife_cF4cXyz", "asm void daPy_py_c::getRightHandPos() const": "getRightHandPos__9daPy_py_cCFv", "asm daBaseNpc_path_c::~daBaseNpc_path_c()": "__dt__16daBaseNpc_path_cFv", "asm daBaseNpc_acMngr_c::~daBaseNpc_acMngr_c()": "__dt__18daBaseNpc_acMngr_cFv", "asm daBaseNpc_moveBgActor_c::~daBaseNpc_moveBgActor_c()": "__dt__23daBaseNpc_moveBgActor_cFv", "asm void dAttention_c::getDistTable(int param_0)": "getDistTable__12dAttention_cFi", "asm dMdl_obj_c::dMdl_obj_c()": "__ct__10dMdl_obj_cFv", "asm cM3dGLin::~cM3dGLin()": "__dt__8cM3dGLinFv", "asm dCcD_Cps::~dCcD_Cps()": "__dt__8dCcD_CpsFv", "asm dCcD_Cps::dCcD_Cps()": "__ct__8dCcD_CpsFv", "asm daNpcT_Path_c::~daNpcT_Path_c()" : "__dt__13daNpcT_Path_cFv", "asm daNpcT_ActorMngr_c::daNpcT_ActorMngr_c()": "__ct__18daNpcT_ActorMngr_cFv", "asm void daNpcT_JntAnm_c::setEyeAngleY(cXyz param_0, s16 param_1, int param_2, f32 param_3, s16 param_4)": "setEyeAngleY__15daNpcT_JntAnm_cF4cXyzsifs", "asm void daNpcT_JntAnm_c::setEyeAngleX(cXyz param_0, f32 param_1, s16 param_2)": "setEyeAngleX__15daNpcT_JntAnm_cF4cXyzfs", "asm void daNpcT_c::getFaceMotionAnm(daNpcT_faceMotionAnmData_c param_0)": "getFaceMotionAnm__8daNpcT_cF26daNpcT_faceMotionAnmData_c", "asm void daNpcT_c::getMotionAnm(daNpcT_motionAnmData_c param_0)": "getMotionAnm__8daNpcT_cF22daNpcT_motionAnmData_c", "asm void daTag_EvtArea_c::chkPointInArea(cXyz param_0)": "chkPointInArea__15daTag_EvtArea_cF4cXyz", "asm void daPy_py_c::getLeftHandPos() const" : "getLeftHandPos__9daPy_py_cCFv", "asm mDoExt_bckAnm::~mDoExt_bckAnm()": "__dt__13mDoExt_bckAnmFv", "asm mDoExt_bckAnm::mDoExt_bckAnm()": "__ct__13mDoExt_bckAnmFv", "asm cM3dGTri::~cM3dGTri()": "__dt__8cM3dGTriFv", "asm J3DTevKColorAnm::~J3DTevKColorAnm()": "__dt__15J3DTevKColorAnmFv", "asm J3DTevKColorAnm::J3DTevKColorAnm()": "__ct__15J3DTevKColorAnmFv", "asm J3DTevColorAnm::~J3DTevColorAnm()": "__dt__14J3DTevColorAnmFv", "asm J3DTevColorAnm::J3DTevColorAnm()": "__ct__14J3DTevColorAnmFv", "asm J3DTexNoAnm::~J3DTexNoAnm()": "__dt__11J3DTexNoAnmFv", "asm J3DTexNoAnm::J3DTexNoAnm()": "__ct__11J3DTexNoAnmFv", "asm J3DTexMtxAnm::~J3DTexMtxAnm()": "__dt__12J3DTexMtxAnmFv", "asm J3DTexMtxAnm::J3DTexMtxAnm()": "__ct__12J3DTexMtxAnmFv", "asm J3DMatColorAnm::~J3DMatColorAnm()": "__dt__14J3DMatColorAnmFv", "asm J3DMatColorAnm::J3DMatColorAnm()": "__ct__14J3DMatColorAnmFv", "asm void J3DTexNoAnm::calc(u16* param_0) const": "calc__11J3DTexNoAnmCFPUs", "asm daNpcF_Lookat_c::~daNpcF_Lookat_c()": "__dt__15daNpcF_Lookat_cFv", "asm daNpcF_c::~daNpcF_c()": "__dt__8daNpcF_cFv", "asm daNpcF_ActorMngr_c::~daNpcF_ActorMngr_c()": "__dt__18daNpcF_ActorMngr_cFv", "asm daNpcF_c::daNpcF_c()": "__ct__8daNpcF_cFv", "asm daNpcF_ActorMngr_c::daNpcF_ActorMngr_c()": "__ct__18daNpcF_ActorMngr_cFv", "void daNpcF_c::adjustShapeAngle()": "adjustShapeAngle__8daNpcF_cFv", "void daNpcF_c::setCollisions()": "setCollisions__8daNpcF_cFv", "asm daNpcT_c::~daNpcT_c()": "__dt__8daNpcT_cFv", "asm daNpcT_ActorMngr_c::~daNpcT_ActorMngr_c()": "__dt__18daNpcT_ActorMngr_cFv", "asm daNpcT_JntAnm_c::~daNpcT_JntAnm_c()": "__dt__15daNpcT_JntAnm_cFv", "asm daNpcT_MotionSeqMngr_c::~daNpcT_MotionSeqMngr_c()": "__dt__22daNpcT_MotionSeqMngr_cFv", "void daNpcT_c::ctrlSubFaceMotion(int param_0)": "ctrlSubFaceMotion__8daNpcT_cFi", "asm void daNpcT_c::decTmr()": "decTmr__8daNpcT_cFv", "void daNpcT_c::changeAnm(int* param_0, int* param_1)": "changeAnm__8daNpcT_cFPiPi", "void daNpcT_c::changeBck(int* param_0, int* param_1)": "changeBck__8daNpcT_cFPiPi", "void daNpcT_c::changeBtp(int* param_0, int* param_1)": "changeBtp__8daNpcT_cFPiPi", "void daNpcT_c::changeBtk(int* param_0, int* param_1)": "changeBtk__8daNpcT_cFPiPi", "void daNpcT_c::drawOtherMdl()": "drawOtherMdl__8daNpcT_cFv", "void daNpcT_c::drawGhost()": "drawGhost__8daNpcT_cFv", "void daNpcF_c::drawOtherMdls()": "drawOtherMdls__8daNpcF_cFv", "void daNpcF_c::setExpression(int param_0, f32 param_1)": "setExpression__8daNpcF_cFif", "void daNpcF_c::drawOtherMdls()": "drawOtherMdls__8daNpcF_cFv", "asm daNpcCd2_c::~daNpcCd2_c()": "__dt__10daNpcCd2_cFv", "asm dNpcLib_lookat_c::~dNpcLib_lookat_c()": "__dt__16dNpcLib_lookat_cFv", "asm daNpcF_Path_c::~daNpcF_Path_c()": "__dt__13daNpcF_Path_cFv", "asm daNpcF_SPCurve_c::~daNpcF_SPCurve_c()": "__dt__16daNpcF_SPCurve_cFv", "asm void daTagGra_c::getGraAngle()": "getGraAngle__10daTagGra_cFv", "asm void daTagGra_c::getGraPos()": "getGraPos__10daTagGra_cFv", "asm void daNpcT_JntAnm_c::lookActor(fopAc_ac_c* param_0, f32 param_1, u8 param_2)" : "lookActor__15daNpcT_JntAnm_cFP10fopAc_ac_cfUc", "asm daNpcCd_c::~daNpcCd_c()": "__dt__9daNpcCd_cFv", "asm void daNpcT_Path_c::getDstPos(cXyz param_0, cXyz* param_1)": "getDstPos__13daNpcT_Path_cF4cXyzP4cXyz", "asm void daDitem_c::setOffsetPos(cXyz param_0)": "setOffsetPos__9daDitem_cF4cXyz", "asm void mDoMtx_stack_c::multVecZero(Vec* param_0)": "multVecZero__14mDoMtx_stack_cFP3Vec", "asm void csXyz::operator=(csXyz const& param_0": "__as__5csXyzFRC5csXyz", "asm void fopEn_enemy_c::setDownPos(cXyz const* param_0)": "setDownPos__13fopEn_enemy_cFPC4cXyz", "asm mDoExt_3DlineMat1_c::mDoExt_3DlineMat1_c()": "__ct__19mDoExt_3DlineMat1_cFv", "asm Z2SoundObjSimple::~Z2SoundObjSimple()": "__dt__16Z2SoundObjSimpleFv", "asm void mDoCPd_c::getTrigA(u32 param_0)": "getTrigA__8mDoCPd_cFUl", "asm void J3DModel::getAnmMtx(int param_0)": "getAnmMtx__8J3DModelFi", "asm void daHorse_c::changeDemoMode(u32 param_0, int param_1)": "changeDemoMode__9daHorse_cFUli", "asm void daHorse_c::changeOriginalDemo()": "changeOriginalDemo__9daHorse_cFv", "asm void dCcD_Sph::operator=(dCcD_Sph const& param_0)": "__as__8dCcD_SphFRC8dCcD_Sph", "asm dCcD_Stts::dCcD_Stts()": "__ct__9dCcD_SttsFv", "asm dCcD_Stts::~dCcD_Stts()": "__dt__9dCcD_SttsFv", "asm void cXyz::abs(Vec const& param_0) const": "abs__4cXyzCFRC3Vec" } # list of known external references to be replaced to avoid symbol collision external_refs = [ "extern \"C\" void PSMTXCopy();", "extern \"C\" void PSMTXMultVec();", "extern \"C\" extern void* g_fopAc_Method[8];", "extern \"C\" extern void* g_fpcLf_Method[5 + 1 /* padding */];", "extern \"C\" extern u8 g_env_light[4880];" "extern \"C\" void PSMTXTrans();", "extern \"C\" void PSVECSquareMag();", "extern \"C\" void PSVECSquareDistance();", "extern \"C\" void abs();", "extern \"C\" extern u8 j3dSys[284];", "extern \"C\" void PSMTXTrans();", "extern \"C\" extern u8 g_env_light[4880];", "extern \"C\" extern u32 __float_nan;", "extern \"C\" void PSVECAdd();", "extern \"C\" void strcmp();", "extern \"C\" void PSVECSubtract();", "extern \"C\" extern u8 const j3dDefaultLightInfo[52];", "extern \"C\" extern void* calc_mtx[1 + 1 /* padding */];", "extern \"C\" void PSVECScale();", "extern \"C\" extern u8 g_dComIfG_gameInfo[122384];", "extern \"C\" void PSMTXScale();", "extern \"C\" void PSMTXInverse();", "SECTION_INIT void memset();", "extern \"C\" void OSReport();" # "extern \"C\" extern u8 mStayNo__20dStage_roomControl_c[4];" "extern \"C\" void GXLoadLightObjImm();", "extern \"C\" void GXSetChanAmbColor();", "extern \"C\" void GXSetChanMatColor();", "extern \"C\" void GXLoadPosMtxImm();", "extern \"C\" void GXLoadNrmMtxImm();", "extern \"C\" void GXLoadLightObjImm();", "extern \"C\" void PSMTXConcat();", "extern \"C\" void GXSetVtxDesc();", "extern \"C\" void GXSetVtxAttrFmt();", "extern \"C\" void GXSetArray();", "extern \"C\" void GXSetTexCoordGen2();", "extern \"C\" void GXSetNumTexGens();", "extern \"C\" void GXSetCullMode();", "extern \"C\" void GXSetNumChans();", "extern \"C\" void GXSetChanCtrl();", "extern \"C\" void GXInitTexObj();", "extern \"C\" void GXInitTexObjLOD();", "extern \"C\" void GXLoadTexObj();", "extern \"C\" void GXSetNumIndStages();", "extern \"C\" void GXSetTevColorIn();", "extern \"C\" void GXSetTevAlphaIn();", "extern \"C\" void GXSetTevColorOp();", "extern \"C\" void GXSetTevAlphaOp();", "extern \"C\" void GXSetTevColor();", "extern \"C\" void GXSetTevKColor();", "extern \"C\" void GXSetTevKColorSel();", "extern \"C\" void GXSetTevKAlphaSel();", "extern \"C\" void GXSetTevSwapMode();", "extern \"C\" void GXSetAlphaCompare();", "extern \"C\" void GXSetTevOrder();", "extern \"C\" void GXSetNumTevStages();", "extern \"C\" void GXClearVtxDesc();", "extern \"C\" void GXSetZMode();", "extern \"C\" void GXSetZCompLoc();", "extern \"C\" void GXCallDisplayList();", "extern \"C\" void GXSetClipMode();", "extern \"C\" void DCStoreRangeNoSync();", "extern \"C\" void PSVECDotProduct();", "extern \"C\" void GXBegin();", "extern \"C\" void C_VECReflect();", "extern \"C\" void strcpy();", "extern \"C\" extern u32 __float_max;", "extern \"C\" extern f32 G_CM3D_F_ABS_MIN[1 + 1 /* padding */];", "extern \"C\" void C_MTXLightPerspective();", "extern \"C\" extern u8 const j3dDefaultMtx[48];", "extern \"C\" void PSMTXIdentity();", "extern \"C\" void PSMTXRotAxisRad();", "extern \"C\" void C_MTXLightOrtho();", "extern \"C\" void strcat();", "extern \"C\" void pow();", # "extern \"C\" extern u8 mStayNo__20dStage_roomControl_c[4];", "extern \"C\" void OSReport_Error();", # "extern \"C\" extern u32 g_blackColor;", "extern \"C\" void PSMTXMultVecSR();", "extern \"C\" void strlen();", # "extern \"C\" extern u32 g_saftyWhiteColor;", "extern \"C\" void PSMTXQuat();", "extern \"C\" void GXInitTexObjCI();", "extern \"C\" void GXInitTlutObj();", "extern \"C\" void GXLoadTlut();", ] types = [ "struct request_of_phase_process_class", "struct mDoMtx_stack_c", "struct J3DAnmTevRegKey", "struct J3DMaterialTable", "struct mDoExt_brkAnm", "struct mDoExt_baseAnm", "struct mDoExt_McaMorfCallBack2_c", "struct mDoExt_McaMorfCallBack1_c", "struct J3DAnmTransform", "struct J3DModelData", "struct Z2Creature", "struct mDoExt_McaMorfSO", "struct fopEn_enemy_c", "struct fopAc_ac_c", "struct daPy_py_c", "struct dVibration_c", "struct dSv_info_c", "struct dKy_tevstr_c", "struct dScnKy_env_light_c", "struct dRes_info_c", "struct dRes_control_c", "struct dPa_levelEcallBack", "struct csXyz", "struct _GXColor", "struct dPa_control_c", "struct dDlst_shadowControl_c", "struct dBgS_PolyPassChk", "struct dBgS_ObjAcch", "struct dBgS_LinChk", "struct dBgS_AcchCir", "struct dBgS", "struct dBgS_Acch", "struct cM3dGCir", "struct cCcS", "struct cBgS_PolyInfo", "struct cBgS_LinChk", "struct cBgS", "struct _GXTexObj", "struct Z2CreatureEnemy", "struct JMath", "struct J3DModel", "struct J3DFrameCtrl", "struct Vec", "struct JGeometry", "struct J3DSys", "struct dCcU_AtInfo", "struct dCcD_Stts", "struct dCcD_SrcSph", "struct dCcD_Sph", "struct dCcD_GStts", "struct dCcD_GObjInf", "struct dAttention_c", "struct cM3dGSph", "struct cM3dGAab", "struct cCcD_Obj", "struct TVec3__template0", "struct J3DJoint", "struct cXyz", "struct fopAcM_gc_c", "struct dSv_memBit_c", "struct mDoExt_McaMorf", "struct Z2SoundObjSimple", "struct JAISoundID", "struct dComIfG_play_c", "struct Z2SoundObjBeeGroup", "struct Z2SoundObjBase", "struct mDoExt_3DlineMat_c", "struct mDoExt_3DlineMatSortPacket", "struct ResTIMG", "struct JPABaseEmitter", "struct mDoExt_3DlineMat1_c", "struct dEvt_control_c", "struct dCamera_c", "struct J3DAnmTextureSRTKey", "struct mDoExt_btkAnm", "struct cM3dGPla", "struct cBgD_Vtx_t", "struct cCcD_GStts", "struct dJntColData_c", "struct dJntCol_c", "struct dBomb_c", "struct Z2SeqMgr", "struct Z2SeMgr", "struct Z2AudioMgr", "struct mDoGph_gInf_c", "struct camera_class", "struct cCcD_Stts", "struct cSAngle", "struct mDoExt_invisibleModel", "struct dCcD_GAtTgCoCommonBase", # "struct daObjHHASHI_c", "struct dSv_event_flag_c", "struct dSv_event_c", "struct LIGHT_INFLUENCE", "struct J3DLightObj", "struct J3DLightInfo", "struct obj_ystone_class", "struct daItemBase_c", "struct dTres_c", "struct dPa_followEcallBack", "struct dItem_data", "struct dEvent_manager_c", "struct JPAEmitterCallBack", "struct daKey_c", "struct mDoCPd_c", "struct dMsgObject_c", "struct dMsgFlow_c", "struct dCcD_SrcCyl", "struct dCcD_Cyl", "struct cM3dGCyl", "struct dBgW_Base", "struct dBgW", "struct cBgD_t", "struct cBgW", "struct daObjCarry_c", "struct dSv_danBit_c", "struct J3DAnmTexPattern", "struct mDoExt_btpAnm", "struct fOpAcm_HIO_entry_c", "struct mDoHIO_entry_c", "struct dAttLook_c", "struct dPath", "struct mDoExt_morf_c", "struct dPa_hermiteEcallBack_c", "struct dEvt_info_c", "struct dAttList_c", "struct dSv_event_tmp_flag_c", # "struct daObjH_Saku_c", "struct Z2StatusMgr", "struct mDoExt_3DlineMat0_c", "struct dSv_player_get_item_c", "struct dAttCatch_c", "struct fopAcM_wt_c", # "struct daObjCRVSTEEL_c", # "struct daObjCRVGATE_c", "struct daTag_FWall_c", "struct fopAcM_rc_c", "struct daB_DS_c", "struct dEvLib_callback_c", "struct daPy_boomerangMove_c", "struct dMenu_Insect_c", "struct dInsect_c", "struct dDlst_peekZ_c", "struct mDoExt_bckAnm", "struct fopAcM_lc_c", "struct JUTNameTab", "struct dMdl_obj_c", "struct dMdl_mng_c", "struct dMdl_c", # "struct daObjLife_c", # "struct daObjCRVLH_UP_c", # "struct daObjCRVHAHEN_c", "struct dDlst_peekZ_c", "struct dSv_light_drop_c", "struct TSinCosTable__template0", "struct J3DShape", "struct J3DPacket", "struct J3DDrawBuffer", "struct J3DPacket", "struct daSetBgObj_c", "struct WIND_INFLUENCE", "struct dPa_modelEcallBack", "struct daTagGra_c", "struct daBaseNpc_path_c", "struct daBaseNpc_moveBgActor_c", "struct daBaseNpc_acMngr_c", "struct dPaPo_c", "struct cSGlobe", "struct J3DTexMtxInfo", "struct daNpcT_c", "struct daNPC_TK_c", "struct dCcD_SrcCps", "struct dCcD_Cps", "struct cM3dGCpsS", "struct cM3dGCps", "struct cM3dGLin", "struct daNpc_Jagar_Param_c", "struct daMidna_c", "struct dAttHint_c", "struct daTag_EvtArea_c", "struct daNpcT_faceMotionAnmData_c", "struct daNpcT_MotionSeqMngr_c", "struct sequenceStepData_c", "struct daNpcT_evtData_c", "struct daNpcT_motionAnmData_c", "struct daNpcT_Path_c", "struct daNpcT_MatAnm_c", "struct daNpcT_JntAnm_c", "struct daNpcT_DmgStagger_c", "struct daNpcT_ActorMngr_c", "struct Z2WolfHowlMgr", "struct daObj_SSBase_c", "struct daMyna_c", "struct DALKMIST_INFLUENCE", "struct cM3dGTri", "struct J3DAnmColor", "struct mDoExt_bpkAnm", # "struct daWtPillar_c", "struct create_tag_class", "struct daNpcF_c", "struct daNpcF_anmPlayData", "struct daNpcF_MatAnm_c", "struct daNpcF_Lookat_c", "struct daNpcF_ActorMngr_c", "struct J3DTexNoAnm", "struct J3DTexMtxAnm", "struct J3DTevKColorAnm", "struct J3DTevColorAnm", "struct J3DMaterialAnm", "struct J3DMatColorAnm", "struct daE_HZ_c", "struct JPAEmitterManager", "struct dPa_simpleEcallBack", "struct daTwGate_c", "struct daCow_c", "struct dSv_player_collect_c", "struct daNpcCd2_c", "struct dNpcLib_lookat_c", "struct PathTrace_c", "struct daTagSchedule_c", "struct daGlwSph_c", "struct _GlSph_Mng_c", "struct dShopSystem_c", "struct dShopItemCtrl_c", "struct ShopCam_action_c", "struct dMeter2Info_c", "struct Z2SoundObjCoach", "struct daNpcTheB_c", "struct SVec", "struct dSv_player_item_c", "struct daNpcF_SPCurve_c", "struct daNpcF_Path_c", "struct daTag_ShopItem_c", "struct dTimer_c", "struct daNpc_Len_c", "struct dSv_player_status_b_c", "struct daNpc_Maro_c", "struct dSv_restart_c", "struct J3DSkinDeform", "struct J3DDeformData", "struct J3DAnmCluster", "struct mDoExt_blkAnm", "struct daMP_c", "struct dDemo_actor_c", "struct dStage_roomControl_c", "struct dDemo_object_c", "struct dDemo_c", "struct J3DMaterial", "struct leafdraw_class", "struct mDoExt_MtxCalcOldFrame", "struct mDoExt_AnmRatioPack", "struct daPy_frameCtrl_c", "struct daPy_actorKeep_c", "struct Quaternion", "struct J3DTransformInfo", "struct J3DMtxCalcNoAnmBase", "struct J3DMtxCalcNoAnm", "struct J3DMtxCalcNoAnm__template0", "struct J3DMtxCalcJ3DSysInitMaya", "struct J3DMtxCalcCalcTransformMaya", "struct J3DMtxCalc", "struct daTagWaterFall_c", "struct daObj_Balloon_c", "struct daE_YM_c", "struct daBalloon2D_c", "struct daObjLife_c", "struct daAlink_c", "struct dSv_player_item_record_c", "struct dSv_player_item_max_c", "struct dSv_fishing_info_c", ] class ActorSetupManager: def __init__(self,filename) -> None: self.filename = filename self.actor_name = None self.actor_class_type = None self.include_headers = [] with open(filename, "r") as f: self.lines = f.readlines() def remove_types(self): new_lines = [] removed_types = 0 skip_until_closing_bracket = False skip_next_line = False for line in self.lines: if any(type in line for type in types): if "dCamera_c" in line: self.include_headers.append("d/d_camera.h") if "daKey_c" in line: self.include_headers.append("rel/d/a/obj/d_a_obj_smallkey/d_a_obj_smallkey.h") if "obj_ystone_class" in line: self.include_headers.append("rel/d/a/obj/d_a_obj_ystone/d_a_obj_ystone.h") if "daB_DS_c" in line: self.include_headers.append("rel/d/a/b/d_a_b_ds/d_a_b_ds.h") # if "JPAEmitterCallBack" in line: # self.include_headers.append("JSystem/JPArticle/JPAEmitter.h") if "daObjCarry_c" in line: self.include_headers.append("rel/d/a/obj/d_a_obj_carry/d_a_obj_carry.h") removed_types += 1 skip_until_closing_bracket = True if skip_until_closing_bracket: if line.startswith("};") or "{};" in line: skip_until_closing_bracket = False skip_next_line = True continue if skip_next_line: skip_next_line = False continue else: new_lines.append(line) print(f"Removed {removed_types} type definitions." if removed_types > 0 else "No type definitions to remove!") self.lines = new_lines def remove_external_refs(self): new_lines = [] removed_external_refs = 0 for line in self.lines: if any(ref in line for ref in external_refs): # leave calc_mtx in unless d_camera was included if "extern \"C\" extern void* calc_mtx[1 + 1 /* padding */];" in line and not any("d/d_camera.h" in header for header in self.include_headers): new_lines.append(line) continue # leave g_dComIfG_gameInfo in unless npc actor if "extern \"C\" extern u8 g_dComIfG_gameInfo[122384];" in line and "npc" not in self.filename and not any("d/a/obj/d_a_obj_carry/d_a_obj_carry.h" in header for header in self.include_headers): new_lines.append(line) continue removed_external_refs += 1 else: new_lines.append(line) print(f"Removed {removed_external_refs} external references." if removed_external_refs > 0 else "No external references to remove!") self.lines = new_lines def replace_weak_function_defs(self): new_lines = [] updated_funcs = 0 for line in self.lines: for old_symbol, new_symbol in weak_funcs.items(): if line.startswith(old_symbol): updated_funcs += 1 new_lines.append("// " + line) new_line = "extern \"C\" asm void " + new_symbol + "() {\n" new_lines.append(new_line) break else: new_lines.append(line) print(f"Replaced {updated_funcs} weak function definitions." if updated_funcs > 0 else "No weak function definitions to replace!") self.lines = new_lines def move_remaining_types(self): self.header_path = "include/"+self.filename.replace(".cpp", ".h") if not os.path.exists(self.header_path): print("No header file found to move remaining types to!") sys.exit(1) inside_struct_or_class = False migrated_types = 0 struct_or_class_lines = [] new_lines = [] with open(self.header_path, "r") as f: header_lines = f.readlines() for line in self.lines: stripped_line = line.lstrip() # Remove leading whitespace if stripped_line.startswith("struct ") or stripped_line.startswith("class "): if stripped_line.startswith("struct ") and ("class" in stripped_line or "_c" in stripped_line): stripped_line = stripped_line.replace("struct ","class ") if "param_c" not in stripped_line.lower() and "hio" not in stripped_line.lower() and "_s {" not in stripped_line.lower() and "d_a_e" not in stripped_line.lower() and "obj_ystone_class" not in stripped_line.lower(): # might fail if a tu has more than 1 actor self.actor_name = stripped_line.split(" ")[1] if "d_a_e" in self.filename or "d_a_b" in self.filename: self.actor_class_type = "enemy" stripped_line = stripped_line.replace(" {"," : public fopEn_enemy_c {") else: self.actor_class_type = "actor" stripped_line = stripped_line.replace(" {", " : public fopAc_ac_c {") migrated_types += 1 inside_struct_or_class = True if "{};" not in stripped_line: line = stripped_line+"public:\n" else: line = stripped_line if inside_struct_or_class: struct_or_class_lines.append(line) else: new_lines.append(line) if "};" in line and inside_struct_or_class: if "npc" in self.filename: include_line = "#include \"d/a/d_a_npc.h\"\n\n" else: include_line = "#include \"f_op/f_op_actor_mng.h\"\n\n" if include_line not in header_lines: struct_or_class_lines.insert(0, include_line) struct_or_class_lines.append("\n") struct_or_class_string = "".join(struct_or_class_lines) header_string = "".join(header_lines) if struct_or_class_string not in header_string: end_guard_index = next(i for i, line in reversed(list(enumerate(header_lines))) if "#endif" in line) for i, line in enumerate(reversed(struct_or_class_lines)): header_lines.insert(end_guard_index-1, line) with open(self.header_path, "w") as f: f.writelines(header_lines) inside_struct_or_class = False struct_or_class_lines = [] print(f"Migrated {migrated_types} types." if migrated_types > 0 else "No types to migrate!") self.lines = new_lines def comment_cleanup(self): header_update = 0 types_removal = 0 for i, line in enumerate(self.lines): if "// Generated By: dol2asm" in line: header_update = 1 self.lines[i-1] = "/**\n" self.lines[i] = f" * @file {self.filename.split("/")[-1]}\n" self.lines[i+1] = " * \n" self.lines[i+2] = "*/\n" if "// Types:" in line: types_removal = 1 self.lines.pop(i-1) self.lines.pop(i-1) self.lines.pop(i-1) self.lines.pop(i-1) print(f"Removed types comment." if types_removal == 1 else "No types comment found! Nothing to remove!") print(f"Updated TU header comment." if header_update == 1 else "No default header comment not found, nothing to update!") def setup_class_size(self): final_class_size = hex(int(self.class_size, 16)) header_path = "include/"+self.filename.replace(".cpp", ".h") if not os.path.exists(header_path): print("No header file found to move remaining types to!") sys.exit(1) with open(header_path, "r") as f: header_lines = f.readlines() in_class = False new_lines = [] for i, line in enumerate(header_lines): if self.actor_name in line: if "{};" in line: if self.actor_class_type == "enemy": new_lines.append("class " + self.actor_name + " : public fopEn_enemy_c {\n") elif self.actor_class_type == "actor": new_lines.append("class " + self.actor_name + " : public fopAc_ac_c {\n") new_lines.append("private:\n") if self.actor_class_type == "enemy": new_lines.append(f" /* 0x5ac */ u8 field_0x5ac[{final_class_size} - 0x5ac];\n") elif self.actor_class_type == "actor": new_lines.append(f" /* 0x568 */ u8 field_0x568[{final_class_size} - 0x568];\n") new_lines.append("};\n\n") new_lines.append(f"STATIC_ASSERT(sizeof({self.actor_name}) == {final_class_size});\n") else: in_class = True new_lines.append(line) elif in_class and "};" in line: new_lines.append("\n") new_lines.append("private:\n") if self.actor_class_type == "enemy": new_lines.append(f" /* 0x5ac */ u8 field_0x5ac[{final_class_size} - 0x5ac];\n") elif self.actor_class_type == "actor": new_lines.append(f" /* 0x568 */ u8 field_0x568[{final_class_size} - 0x568];\n") new_lines.append("};\n") new_lines.append(f"STATIC_ASSERT(sizeof({self.actor_name}) == {final_class_size});\n") in_class = False else: new_lines.append(line) with open(header_path, "w") as f: f.writelines(new_lines) def write_tu_lines(self): with open(self.filename, "w") as f: f.writelines(self.lines) def set_class_size(self, class_size): self.class_size = class_size def check_and_add_missing_tu_headers(self): if len(self.include_headers) != 0: # find end of tu includes, accounting for multiple includes end_of_includes = 0 for i, line in enumerate(self.lines): if "#include" in line: end_of_includes = i + 1 if end_of_includes > 0 and "#include" not in line: break print("end of includes", end_of_includes) for header in self.include_headers: self.lines.insert(end_of_includes, f"#include \"{header}\"\n") @click.command() @click.option('--actor-tu', required=True, help='Path to the actor translation unit.') def setup_actor(actor_tu): manager = ActorSetupManager(actor_tu) manager.remove_types() manager.remove_external_refs() manager.check_and_add_missing_tu_headers() manager.replace_weak_function_defs() manager.move_remaining_types() manager.comment_cleanup() manager.write_tu_lines() manager.set_class_size(setup_profile(actor_tu,manager.actor_name)) if manager.class_size is not None: manager.setup_class_size() sys.exit(0) if __name__ == "__main__": setup_actor()