diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2025-10-19 10:30:49 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-19 20:30:49 +0300 |
| commit | 850fae1aa304f7703ef973cf2126f246048ca25d (patch) | |
| tree | f00b1bc2a000fd33dcc10ea08e2d57b8887fac70 /src/f_ap | |
| parent | 31c0f94a1052de4cd5cc9c829d41c4389b3fc7b7 (diff) | |
m_Do_main / f_ap_game / f_op_actor debug work and misc (#2744)
* m_Do_main / f_ap_game debug stuff
* revolution sdk compatibility
* f_op_actor debug work
* rename fopAcM_SetupActor to fopAcM_ct
* fix build
* fix jp/pal splits
Diffstat (limited to 'src/f_ap')
| -rw-r--r-- | src/f_ap/f_ap_game.cpp | 711 |
1 files changed, 702 insertions, 9 deletions
diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 198253afa5..b92d220f01 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -5,10 +5,21 @@ #include "f_op/f_op_overlap_mng.h" #include "f_op/f_op_scene_mng.h" #include "m_Do/m_Do_main.h" +#include "m_Do/m_Do_graphic.h" +#include "DynamicLink.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JKernel/JKRAram.h" +#include "JSystem/JKernel/JKRAramArchive.h" +#include "JSystem/JUtility/JUTDbPrint.h" +#include "JSystem/JHostIO/JORFile.h" +#include "JSystem/J3DGraphLoader/J3DModelLoader.h" +#include "JSystem/J3DGraphLoader/J3DModelSaver.h" +#include "d/actor/d_a_alink.h" +#include "d/actor/d_a_midna.h" +#include "d/d_model.h" +#include "d/actor/d_a_grass.h" -fapGm_HIO_c::fapGm_HIO_c() - : mColor(-1), mLetterTopColor(-1), mLetterBottomColor(-1), mLetterTopShadowColor(-1), - mLetterBottomShadowColor(-1) { +fapGm_HIO_c::fapGm_HIO_c() { mUsingHostIO = true; if (mDoMain::developmentMode) { @@ -24,21 +35,689 @@ fapGm_HIO_c::fapGm_HIO_c() mDisplayParticle = true; mDisplayProcessID = false; mMemBlockOff = false; - mColor.set(255, 255, 255, 255); + + mColor = JUtility::TColor(255, 255, 255, 255); + mLROnValue = 0.9f; mLROffValue = 0.6f; - mLetterTopColor.set(255, 150, 0, 255); - mLetterBottomColor.set(255, 120, 0, 255); - mLetterTopShadowColor.set(0, 0, 0, 255); - mLetterBottomShadowColor.set(0, 0, 0, 255); + + mLetterTopColor = JUtility::TColor(255, 150, 0, 255); + mLetterBottomColor = JUtility::TColor(255, 120, 0, 255); + mLetterTopShadowColor = JUtility::TColor(0, 0, 0, 255); + mLetterBottomShadowColor = JUtility::TColor(0, 0, 0, 255); + mLetterPositionX = 0; mLetterPositionY = 10; mLetterFontSize = 27; mLineSpacing = 0; mLetterSpacing = 0; mBackgroundAlpha = 130; + +#if DEBUG + mTrapFilter = 0; + mGammaCorrection = 10; +#endif +} + +#if DEBUG +static u8 data_8073f6e8 = 1; +static u8 data_8073f6e9 = 1; +static u8 data_8073f6ea = 1; +static u8 data_8073f6eb = 1; + +CaptureScreen* fapGm_HIO_c::mCaptureScreen; +void* fapGm_HIO_c::mCaptureScreenBuffer; +s16 fapGm_HIO_c::mCaptureScreenFlag; +u16 fapGm_HIO_c::mCaptureScreenWidth; +u16 fapGm_HIO_c::mCaptureScreenHeight; +u16 fapGm_HIO_c::mCaptureScreenLinePf; +u16 fapGm_HIO_c::mCaptureScreenLineNum; +u8 fapGm_HIO_c::mCaptureScreenNumH; +u8 fapGm_HIO_c::mCaptureScreenNumV; + +u8 fapGm_HIO_c::mParticle254Fix; +#endif + +#if DEBUG +void fapGm_HIO_c::genMessage(JORMContext* mctx) { + mctx->genButton("警告消去", 0x4000020, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("BMPキャプチャー", 0x4000003, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("BMPキャプチャー倍率", &data_8073f6e8, 1, 8, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("スナップショット", 0x4000002, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("CPU時間", 0x4000007, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("ホストIO使用", &mUsingHostIO, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("メーター表示(JUTProcBar)", &mDisplayMeter, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("プリント表示(JUTDbPrint)", &mDisplayPrint, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("2D表示", &mDisplay2D, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("パーティクル表示", &mDisplayParticle, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("パーティクル254固定", &mParticle254Fix, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("パックアーカイブモード", &data_8073f6eb, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("−−−−−−−【プリント】−−−−−−−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" 色 R", &mColor.r, 0, 0xFF, 0x4000010, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" G", &mColor.g, 0, 0xFF, 0x4000011, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" B", &mColor.b, 0, 0xFF, 0x4000012, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" A", &mColor.a, 0, 0xFF, 0x4000013, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("−−−−−−−【情報関係】−−−−−−−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("空きメモリ", 0x4000005, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("プロセスID表示", &mDisplayProcessID, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("トラップフィルター", &mTrapFilter, 1, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + + mctx->startComboBox("ガンマ補正係数", &mGammaCorrection, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0x1a); + mctx->genComboBoxItem("0.1", 1); + mctx->genComboBoxItem("0.2", 2); + mctx->genComboBoxItem("0.3", 3); + mctx->genComboBoxItem("0.4", 4); + mctx->genComboBoxItem("0.5", 5); + mctx->genComboBoxItem("0.6", 6); + mctx->genComboBoxItem("0.7", 7); + mctx->genComboBoxItem("0.8", 8); + mctx->genComboBoxItem("0.9", 9); + mctx->genComboBoxItem("1.0", 10); + mctx->genComboBoxItem("1.1", 11); + mctx->genComboBoxItem("1.2", 12); + mctx->genComboBoxItem("1.3", 13); + mctx->genComboBoxItem("1.4", 14); + mctx->genComboBoxItem("1.5", 15); + mctx->genComboBoxItem("1.6", 16); + mctx->genComboBoxItem("1.7", 17); + mctx->genComboBoxItem("1.8", 18); + mctx->genComboBoxItem("1.9", 19); + mctx->genComboBoxItem("2.0", 20); + mctx->genComboBoxItem("2.1", 21); + mctx->genComboBoxItem("2.2", 22); + mctx->genComboBoxItem("2.3", 23); + mctx->genComboBoxItem("2.4", 24); + mctx->genComboBoxItem("2.5", 25); + mctx->genComboBoxItem("2.6", 26); + mctx->genComboBoxItem("2.7", 27); + mctx->genComboBoxItem("2.8", 28); + mctx->genComboBoxItem("2.9", 29); + mctx->genComboBoxItem("3.0", 30); + mctx->endComboBox(); + + mctx->genLabel("−−−−−−−【肩ボタン】−−−−−−−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider(" しきい値 オン", &g_HIO.mLROnValue, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + mctx->genSlider(" オフ", &g_HIO.mLROffValue, 0.0f, 1.0f, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + + mctx->genLabel("−−−−−−−【デバッグ用】−−−−−−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genCheckBox("メモリーブロックOFF", &mMemBlockOff, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("−−−−−−−【システムレジスタ】−−−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("レジスタ0", &mRegister0, -0x8000, 0x7fff, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + mctx->genSlider("レジスタ1", &mRegister1, -0x8000, 0x7fff, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + mctx->genSlider("レジスタ2", &mRegister2, -0x8000, 0x7fff, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + mctx->genSlider("レジスタ3", &mRegister3, -0x8000, 0x7fff, 0, NULL, 0xFFFF, 0xFFFF, + 0x200, 0x18); + + mctx->genLabel("−−−−−−−【BDLファイルへの変換】", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("変換", 0x4000014, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("−−−−−−−【メモリファイル】−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genButton("出力", 0x4000016, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genLabel("−−−−−−−【エラーメッセージ】−", 0x4000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色上r", &mLetterTopColor.r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色上g", &mLetterTopColor.g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色上b", &mLetterTopColor.b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色上α", &mLetterTopColor.a, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genSlider("文字色下r", &mLetterBottomColor.r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色下g", &mLetterBottomColor.g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色下b", &mLetterBottomColor.b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色下α", &mLetterBottomColor.a, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genSlider("文字位置X", &mLetterPositionX, -300, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字位置Y", &mLetterPositionY, -300, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字行間", &mLineSpacing, -10, 10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字字間", &mLetterSpacing, -10, 10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字フォントサイズ", &mLetterFontSize, 0, 0x32, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genSlider("文字色影上r", &mLetterTopShadowColor.r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影上g", &mLetterTopShadowColor.g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影上b", &mLetterTopShadowColor.b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影上α", &mLetterTopShadowColor.a, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genSlider("文字色影下r", &mLetterBottomShadowColor.r, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影下g", &mLetterBottomShadowColor.g, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影下b", &mLetterBottomShadowColor.b, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + mctx->genSlider("文字色影下α", &mLetterBottomShadowColor.a, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); + + mctx->genSlider("背景α", &mBackgroundAlpha, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); +} + +char fapGm_dataMem::mCsv[0x8000]; + +int dumpTagObject(void* i_object, void*) { + char profname_str[64]; + s16 profname = fopAcM_GetProfName(i_object); + sprintf(profname_str, "%d", profname); + + if (fopAcM_IsActor(i_object)) { + fopAc_ac_c* a_actor = (fopAc_ac_c*)i_object; + + const char* actorname = dStage_getName(profname, -1); + fapGm_dataMem::printfTag(fapGm_dataMem::TagAtt_Fixed_e, fapGm_dataMem::TagType_Object_e, 0, profname_str, a_actor, NULL, *actorname == 0 ? NULL : actorname, NULL); + + if (a_actor->heap != NULL) { + fapGm_dataMem::printfTag(fapGm_dataMem::TagAtt_Fixed_e, fapGm_dataMem::TagType_Object_e, 0, profname_str, a_actor->heap, NULL, actorname, NULL); + } + + u32 other_heap_size = 0; + if (profname == PROC_ALINK) { + fopAc_ac_c* spC = a_actor; + other_heap_size = daAlink_c::getOtherHeapSize(); + } else if (profname == PROC_MIDNA) { + fopAc_ac_c* sp8 = a_actor; + other_heap_size = daMidna_c::getOtherHeapSize(); + } + + if (other_heap_size != 0) { + fapGm_dataMem::printfTag(fapGm_dataMem::TagAtt_Fixed_e, fapGm_dataMem::TagType_Object_e, 6, profname_str, NULL, other_heap_size, NULL, NULL); + } + } else { + fapGm_dataMem::printfTag(fapGm_dataMem::TagAtt_Fixed_e, fapGm_dataMem::TagType_Object_e, 0, profname_str, i_object, NULL, NULL, NULL); + } + + return 1; +} + +int dumpObject(void* i_object, void* i_data) { + char* csv = (char*)i_data; + csv += strlen(csv); + + if (fopAcM_IsActor(i_object)) { + fopAc_ac_c* a_actor = (fopAc_ac_c*)i_object; + + s16 profname = fopAcM_GetProfName(a_actor); + const char* actor_name = dStage_getName(profname, -1); + u32 actor_size = a_actor->base.base.profile->process_size + (a_actor->heap == NULL ? 0 : a_actor->heap->getHeapSize()); + + u32 other_heap_size = 0; + if (profname == PROC_ALINK) { + fopAc_ac_c* sp24 = a_actor; + other_heap_size = daAlink_c::getOtherHeapSize(); + } else if (profname == PROC_MIDNA) { + fopAc_ac_c* sp20 = a_actor; + other_heap_size = daMidna_c::getOtherHeapSize(); + } + + sprintf(csv, ",%s(%d),%d,\n", actor_name != NULL ? actor_name : "???", profname, actor_size); + + if (other_heap_size != 0) { + csv += strlen(csv); + sprintf(csv, ",%s-Buffer(%d),%d,\n", actor_name != NULL ? actor_name : "???", profname, other_heap_size); + } + } else { + s16 profname = fpcM_GetProfName(i_object); + u32 process_size = ((base_process_class*)i_object)->profile->process_size; + sprintf(csv, ",no actor(%d),%d,\n", profname, process_size); + } + + return 1; } +void fapGm_dataMem::printfTag(int i_att, int i_type, int i_heapType, const char* i_label, void* i_object, u32 i_otherHeapSize, const char* i_actorName, const char* param_7) { + static const char* l_heapString[] = { + "error", + "aram", + "root_heap", + "system_heap", + "zelda_heap", + "archive_heap", + "game_heap", + "command_heap", + "stage_heap", + "j2d_heap", + "dynamic_heap", + }; + + static const char* l_attString[] = { + "fixed", + "variable", + }; + + static const char* l_typeString[] = { + "audio", + "particle", + "system", + "unknown", + "message", + "2d", + "player", + "archive", + "archive-sub", + "archive-stage", + "archive-stage-sub", + "program", + "object", + "stage", + NULL, + }; + + if (i_type < TagType_Heap_e) { + if (i_object != NULL) { + i_heapType = fapGm_dataMem::findParentHeap(i_object); + if (i_otherHeapSize == 0) { + i_otherHeapSize = JKRGetMemBlockSize(NULL, i_object); + } + } + + sprintf(fapGm_dataMem::getCsvEnd(), "%s\t%d\t%s\t%s", l_heapString[i_heapType], i_otherHeapSize, l_attString[i_att], l_typeString[i_type]); + + if (i_label != NULL) { + sprintf(fapGm_dataMem::getCsvEnd(), "\t%s", i_label); + if (i_actorName != NULL) { + sprintf(fapGm_dataMem::getCsvEnd(), "\t%s", i_actorName); + if (param_7 != NULL) { + sprintf(fapGm_dataMem::getCsvEnd(), "\t%s", param_7); + } + } + } + + sprintf(fapGm_dataMem::getCsvEnd(), "\n"); + } else if (i_type == TagType_Heap_e) { + u32 heap_size; + int is_product = 0; + u32 total_free_size; + if (i_heapType == HeapType_ARAM_e) { + heap_size = 0x1000000; + total_free_size = JKRGetAramTotalFreeSize(); + is_product = 1; + } else if (i_heapType == HeapType_Stage_e) { + heap_size = i_otherHeapSize; + total_free_size = 0; + } else { + JKRHeap* heap = (JKRHeap*)i_object; + heap_size = heap->getHeapSize(); + total_free_size = heap->getTotalFreeSize(); + + if (i_heapType == HeapType_Archive_e) { + u32 temp_r24 = heap_size - mDoMain::archiveHeapSize; + heap_size -= temp_r24; + total_free_size -= temp_r24; + is_product = 1; + } else if (i_heapType == HeapType_Game_e) { + u32 temp_r23 = heap_size - mDoMain::gameHeapSize; + heap_size -= temp_r23; + total_free_size -= temp_r23; + is_product = 1; + } else if (i_heapType == HeapType_Command_e) { + is_product = 1; + } else if (i_heapType == HeapType_J2D_e) { + is_product = 1; + } else if (i_heapType == HeapType_Dynamic_e) { + is_product = 1; + } + } + + static const char* l_heapAllString[] = { + "all", + "product-all", + }; + + static const char* l_heapRestString[] = { + "rest", + "product-rest", + }; + + sprintf(fapGm_dataMem::getCsvEnd(), "%s\t%d\t%s\n", l_heapString[i_heapType], heap_size, l_heapAllString[is_product]); + sprintf(fapGm_dataMem::getCsvEnd(), "%s\t%d\t%s\n", l_heapString[i_heapType], total_free_size, l_heapRestString[is_product]); + } +} + +int fapGm_dataMem::findParentHeap(void* i_object) { + JKRHeap* heap = JKRHeap::findFromRoot(i_object); + if (heap == NULL) { + return NULL; + } + + if (heap == heap->getRootHeap()) { + return HeapType_Root_e; + } else if (heap == JKRGetSystemHeap()) { + return HeapType_System_e; + } else if (heap == mDoExt_getGameHeap()) { + return HeapType_Game_e; + } else if (heap == mDoExt_getArchiveHeap()) { + return HeapType_Archive_e; + } else if (heap == mDoExt_getJ2dHeap()) { + return HeapType_J2D_e; + #if PLATFORM_WII || PLATFORM_SHIELD + } else if (heap == DynamicModuleControlBase::getHeap()) { + return HeapType_Dynamic_e; + #endif + } else if (heap == mDoExt_getZeldaHeap()) { + return HeapType_Zelda_e; + } + + for (int i = 0; i < 19; i++) { + if (heap == dStage_roomControl_c::getMemoryBlockHeap(i)) { + return HeapType_Stage_e; + } + } + + return findParentHeap(heap); +} + +void fapGm_dataMem::dumpTag() { + *mCsv = 0; + + printfTag(TagAtt_Fixed_e, TagType_Heap_e, HeapType_Root_e, NULL, JKRHeap::getRootHeap(), 0, NULL, NULL); + printfTag(TagAtt_Fixed_e, TagType_Heap_e, HeapType_System_e, NULL, JKRGetSystemHeap(), 0, NULL, NULL); + printfTag(TagAtt_Fixed_e, TagType_Heap_e, HeapType_Zelda_e, NULL, mDoExt_getZeldaHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_Archive_e, NULL, mDoExt_getArchiveHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_J2D_e, NULL, mDoExt_getJ2dHeap(), 0, NULL, NULL); + #if PLATFORM_WII || PLATFORM_SHIELD + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_Dynamic_e, NULL, DynamicModuleControlBase::getHeap(), 0, NULL, NULL); + #endif + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_Game_e, NULL, mDoExt_getGameHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_Command_e, NULL, mDoExt_getCommandHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Heap_e, HeapType_ARAM_e, NULL, NULL, 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Audio_e, 0, "オーディオ", g_mDoAud_audioHeap, 0x169000, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Particle_e, 0, "パーティクルアーカイブ", g_dComIfG_gameInfo.play.getParticle()->getResHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_Particle_e, 0, "パーティクル(常駐)", g_dComIfG_gameInfo.play.getParticle()->getHeap(), 0, NULL, NULL); + printfTag(TagAtt_Fixed_e, TagType_Particle_e, 0, "パーティクル(ステージ)", g_dComIfG_gameInfo.play.getParticle()->getSceneHeap(), 0, NULL, NULL); + printfTag(TagAtt_Variable_e, TagType_System_e, HeapType_System_e, "グラフィックFIFO", NULL, 0xA0000, 0, NULL); + #if PLATFORM_WII || PLATFORM_SHIELD + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "グラフィック関係バッファ", mDoGph_gInf_c::getHeap(), 0, NULL, NULL); + #endif + + if (mDoGph_gInf_c::getBloom()->getBuffer() != NULL) { + printfTag(TagAtt_Fixed_e, TagType_System_e, 0, "飽和加算用バッファ", mDoGph_gInf_c::getBloom()->getBuffer(), NULL, 0, NULL); + } + + if (dComIfGp_getSimpleModel() != NULL) { + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "シンプルモデルバッファ", dComIfGp_getSimpleModel(), NULL, 0, NULL); + } + + if (dMdl_mng_c::m_myObj != NULL) { + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "節約モデルバッファ", dMdl_mng_c::m_myObj, NULL, 0, NULL); + } + + if (daGrass_c::getGrass() != NULL) { + printfTag(TagAtt_Fixed_e, TagType_System_e, 0, "草バッファ", daGrass_c::getGrass(), NULL, 0, NULL); + } + + if (daGrass_c::getFlower() != NULL) { + printfTag(TagAtt_Fixed_e, TagType_System_e, 0, "花バッファ", daGrass_c::getFlower(), NULL, 0, NULL); + } + + if (dTres_c::getTypeGroupData() != NULL) { + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "常駐宝箱バッファ", (char*)dTres_c::getTypeGroupData() - 16, NULL, 0, NULL); + } + + if (dComIfGp_getAttention()->getHeap() != NULL) { + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "注目処理用バッファ", dComIfGp_getAttention()->getHeap(), NULL, 0, NULL); + } + + printfTag(TagAtt_Variable_e, TagType_2D_e, 0, "2D転送用", dComIfGp_getExpHeap2D(), JKRGetMemBlockSize(NULL, dComIfGp_getExpHeap2D()) + JKRGetMemBlockSize(NULL, dComIfGp_getMsgExpHeap()), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Message_e, 0, "メッセージデータ(常駐)", ((JKRAramArchive*)dComIfGp_getMsgDtArchive())->mBlock, NULL, 0, NULL); + printfTag(TagAtt_Fixed_e, TagType_Message_e, 0, "メッセージデータ(ステージ)", ((JKRAramArchive*)dComIfGp_getMsgDtArchive(1))->mBlock, NULL, 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, 0, "メーター関係", ((JKRAramArchive*)dComIfGp_getMain2DArchive())->mBlock, NULL, 0, NULL); + printfTag(TagAtt_Variable_e, TagType_System_e, 0, "アイテム出現テーブル", dComIfGp_getItemTable(), NULL, 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Message_e, HeapType_Zelda_e, "キャッシュフォントバッファ", NULL, JKRGetMemBlockSize(NULL, ((JKRAramArchive*)dComIfGp_getRubyArchive())->mBlock) + 0x1C328, 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Audio_e, HeapType_ARAM_e, "オーディオ", NULL, 0xB00000, 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Player_e, HeapType_ARAM_e, "リンクアニメーション", NULL, ((JKRAramArchive*)dComIfGp_getAnmArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "フィールドマップレイアウト", NULL, ((JKRAramArchive*)dComIfGp_getFmapResArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "フィールドマップデータ", NULL, ((JKRAramArchive*)dComIfGp_getFieldMapArchive2())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "ダンジョンマップレイアウト", NULL, ((JKRAramArchive*)dComIfGp_getDmapResArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "コレクト&セーブ&オプション", NULL, ((JKRAramArchive*)dComIfGp_getCollectResArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "リングアイテム選択", NULL, ((JKRAramArchive*)dComIfGp_getRingResArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "アイテムアイコン", NULL, ((JKRAramArchive*)dComIfGp_getItemIconArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "アイテム説明画面", NULL, ((JKRAramArchive*)dComIfGp_getDemoMsgArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_2D_e, HeapType_ARAM_e, "強調ボタン表示", NULL, ((JKRAramArchive*)dComIfGp_getMeterButtonArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Message_e, HeapType_ARAM_e, "フキダシ共通2Dデータ", NULL, ((JKRAramArchive*)dComIfGp_getMsgCommonArchive())->mBlock->getSize(), 0, NULL); + printfTag(TagAtt_Variable_e, TagType_Message_e, HeapType_ARAM_e, "キャッシュフォント", NULL, mDoExt_getAraCacheSize(), 0, NULL); + + for (int i = 0; i < 6; i++) { + char label[64]; + sprintf(label, "メッセージ(%d)枠ほか", i); + printfTag(TagAtt_Variable_e, TagType_Message_e, HeapType_ARAM_e, label, NULL, ((JKRAramArchive*)dComIfGp_getMsgArchive(i))->mBlock->getSize(), 0, NULL); + } + + g_dComIfG_gameInfo.mResControl.dumpTag(); + u32 var_r28 = 0; + + for (int i = 0; i < 19; i++) { + JKRExpHeap* memblock = dStage_roomControl_c::getMemoryBlockHeap(i); + if (memblock != NULL) { + var_r28 += memblock->getHeapSize(); + } + } + + if (var_r28 != NULL) { + printfTag(TagAtt_Fixed_e, TagType_Stage_e, 0, "ステージメモリーブロック", dStage_roomControl_c::getMemoryBlockHeap(0), var_r28, 0, NULL); + printfTag(TagAtt_Fixed_e, TagType_Heap_e, HeapType_Stage_e, NULL, NULL, var_r28, 0, NULL); + } + + DynamicModuleControlBase::dumpTag(); + fpcLyIt_All(dumpTagObject, mCsv); +} + +void fapGm_dataMem::dumpCsv() { + sprintf(mCsv, "メインメモリ,,,\n"); + sprintf(getCsvEnd(), ",,,最大サイズ,空きサイズ\n"); + sprintf(getCsvEnd(), ",システムヒープ,%d,%d,%d,\n\n", ((JKRExpHeap*)JKRGetSystemHeap())->getTotalUsedSize(), JKRGetSystemHeap()->getHeapSize(), JKRGetSystemHeap()->getFreeSize()); + sprintf(getCsvEnd(), ",ゼルダヒープ,%d,%d,%d,\n", mDoExt_getZeldaHeap()->getTotalUsedSize(), mDoExt_getZeldaHeap()->getHeapSize(), mDoExt_getZeldaHeap()->getFreeSize()); + sprintf(getCsvEnd(), ",オーディオメモリ,%d,\n", 0x169000); + sprintf(getCsvEnd(), ",パーティクルメモリ(常駐),%d,\n", g_dComIfG_gameInfo.play.getParticle()->getHeap()->getHeapSize()); + sprintf(getCsvEnd(), ",パーティクルメモリ(シーン依存),%d,\n", g_dComIfG_gameInfo.play.getParticle()->getSceneHeap()->getHeapSize()); + sprintf(getCsvEnd(), ",グラフィックFIFO,%d,\n", 0xA0000); + sprintf(getCsvEnd(), ",フレームバッファ,%d,\n", mDoGph_gInf_c::getFrameBufferSize() * 2); + sprintf(getCsvEnd(), ",フレームバッファテクスチャー,%d,\n", 0x70820); + sprintf(getCsvEnd(), ",2D転送用ヒープ,%d,\n", dComIfGp_getExpHeap2D()->getHeapSize() + dComIfGp_getMsgExpHeap()->getHeapSize()); + sprintf(getCsvEnd(), ",アーカイブヒープ,%d,%d,%d,\n\n", mDoExt_getArchiveHeap()->getTotalUsedSize(), mDoExt_getArchiveHeap()->getHeapSize(), mDoExt_getArchiveHeap()->getFreeSize()); + sprintf(getCsvEnd(), ",メッセージデータ(常駐),%d,\n", JKRGetMemBlockSize(NULL, ((JKRAramArchive*)dComIfGp_getMsgDtArchive())->mBlock)); + sprintf(getCsvEnd(), ",メッセージデータ(ステージ読み),%d,\n", JKRGetMemBlockSize(NULL, ((JKRAramArchive*)dComIfGp_getMsgDtArchive(1))->mBlock)); + sprintf(getCsvEnd(), ",メーター関係,%d,\n", JKRGetMemBlockSize(NULL, ((JKRAramArchive*)dComIfGp_getMain2DArchive())->mBlock)); + sprintf(getCsvEnd(), ",アイテム出現テーブル,%d,\n", JKRGetMemBlockSize(NULL, dComIfGp_getItemTable())); + sprintf(getCsvEnd(), ",キャッシュフォントバッファ,%d,\n", JKRGetMemBlockSize(NULL, ((JKRAramArchive*)dComIfGp_getRubyArchive())->mBlock) + 0x1C328); + sprintf(getCsvEnd(), ",ゲームヒープ,%d,%d,%d,\n", mDoExt_getGameHeap()->getTotalUsedSize(), mDoExt_getGameHeap()->getHeapSize(), mDoExt_getGameHeap()->getFreeSize()); + sprintf(getCsvEnd(), ",コマンドヒープ,%d,%d,%d,\n\n", mDoExt_getCommandHeap()->getTotalUsedSize(), mDoExt_getCommandHeap()->getHeapSize(), mDoExt_getCommandHeap()->getFreeSize()); + sprintf(getCsvEnd(), ",ARAMメモリ,%d,%d,%d,\n\n", JKRGetAramUsedSize(0) + 0xB00000, (JKRGetAramUsedSize(0) + 0xB00000 + JKRGetAramTotalFreeSize()), JKRGetAramFreeSize()); + sprintf(getCsvEnd(), ",オーディオARAMメモリ,%d,\n", 0xB00000); + sprintf(getCsvEnd(), ",リンクアニメーション,%d,\n", ((JKRAramArchive*)dComIfGp_getAnmArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",フィールドマップレイアウト,%d,\n", ((JKRAramArchive*)dComIfGp_getFmapResArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",フィールドマップデータ,%d,\n", ((JKRAramArchive*)dComIfGp_getFieldMapArchive2())->mBlock->getSize()); + sprintf(getCsvEnd(), ",ダンジョンマップレイアウト,%d,\n", ((JKRAramArchive*)dComIfGp_getDmapResArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",コレクト&セーブ&オプション,%d,\n", ((JKRAramArchive*)dComIfGp_getCollectResArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",リングアイテム選択,%d,\n", ((JKRAramArchive*)dComIfGp_getRingResArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",アイテムアイコン,%d,\n", ((JKRAramArchive*)dComIfGp_getItemIconArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",アイテム説明画面,%d,\n", ((JKRAramArchive*)dComIfGp_getDemoMsgArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",強調ボタン表示,%d,\n", ((JKRAramArchive*)dComIfGp_getMeterButtonArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",フキダシ共通2Dデータ,%d,\n", ((JKRAramArchive*)dComIfGp_getMsgCommonArchive())->mBlock->getSize()); + sprintf(getCsvEnd(), ",キャッシュフォント,%d,\n\n", mDoExt_getAraCacheSize()); + + for (int i = 0; i < 6; i++) { + sprintf(getCsvEnd(), ",メッセージ(%d)枠ほか,%d,\n", i, ((JKRAramArchive*)dComIfGp_getMsgArchive(i))->mBlock->getSize()); + } + + g_dComIfG_gameInfo.mResControl.dump(mCsv); + + u32 memblock_total_size = 0; + for (int i = 0; i < 19; i++) { + JKRExpHeap* memblock = dStage_roomControl_c::getMemoryBlockHeap(i); + if (memblock != NULL) { + memblock_total_size += memblock->getHeapSize(); + } + } + + if (memblock_total_size != NULL) { + sprintf(getCsvEnd(), ",ステージメモリーブロック,%d\n\n", memblock_total_size); + } + + DynamicModuleControlBase::dump(mCsv); + + sprintf(getCsvEnd(), ",オブジェクト名(ID),サイズ,\n"); + fpcLyIt_All(dumpObject, mCsv); + sprintf(getCsvEnd(), ",2Dメモリ,%d,\n", dComIfGp_getExpHeap2D()->getHeapSize() + dComIfGp_getMsgExpHeap()->getHeapSize()); +} + +void fapGm_HIO_c::listenPropertyEvent(const JORPropertyEvent* property) { + JORReflexible::listenPropertyEvent(property); + JORFile file; + + switch ((u32)property->id) { + case 0x4000020: + JUTAssertion::setMessageCount(0); + break; + case 0x4000003: + mCaptureScreenFlag = -1; + break; + case 0x4000002: + if (file.open(6, "ゲームキューブイメージファイル(*.gfb)", "gfb", NULL, NULL)) { + file.writeData(mDoGph_gInf_c::getFrameBufferMemory(), mDoGph_gInf_c::getFrameBufferSize()); + file.close(); + } + break; + case 0x4000005: + OSReport("\x1b[43;30m連続空き=%fK 残り空き=%fK\n\x1b[m", JKRGetSystemHeap()->getFreeSize() * 0.0009765625f, JKRGetSystemHeap()->getTotalFreeSize() * 0.0009765625f); + break; + case 0x4000007: + onCpuTimer(); + break; + case 0x4000014: { + u8* bdlData; + void* model_buffer = mDoExt_getArchiveHeap()->alloc(0x96000, 0x20); + + if (model_buffer == NULL) { + OSReport("BMDファイル読み込みメモリがありません!!\n"); + } else if (!file.open(1, "BMDファイル(*.bmd)", NULL, NULL, NULL)) { + OSReport("BMDファイルオープン失敗!!\n"); + } else { + file.readData(model_buffer, 0); + file.close(); + + J3DModelData* modelData = J3DModelLoaderDataBase::load(model_buffer, 0x10000); + if (modelData == NULL) { + OSReport("BMDデータロード失敗!!\n"); + } + + JKRSolidHeap* heap = mDoExt_createSolidHeapFromGameToCurrent(0x4B000, 0x20); + if (heap == NULL) { + OSReport("J3DModel用メモリがありません!!\n"); + JKRFree(model_buffer); + break; + } + + J3DModel* model = mDoExt_J3DModel__create(modelData, 0x10000, 0x11020203); + mDoExt_restoreCurrentHeap(); + mDoExt_adjustSolidHeap(heap); + + if (model == NULL) { + OSReport("J3DModel生成失敗!!\n"); + mDoExt_destroySolidHeap(heap); + JKRFree(model_buffer); + break; + } + + j3dSys.setViewMtx(cMtx_getIdentity()); + + model->calc(); + model->calcMaterial(); + model->makeDL(); + model->calcMaterial(); + model->makeDL(); + model->lock(); + + JORFile out_file; + int temp_r24 = strlen(file.getFilename()); + char* filename_and_ext = file.getFilename() + temp_r24; + + int sp10 = 0; + while (*filename_and_ext != '\\') { + filename_and_ext--; + sp10++; + } + + filename_and_ext++; + + char new_filename[32]; + for (int i = 0; i < sp10; i++) { + new_filename[i] = filename_and_ext[i]; + } + + new_filename[sp10 - 3] = 'd'; + new_filename[sp10 - 2] = 'l'; + + if (!out_file.open(NULL, 6, "BDLファイル(*.bdl)", "bdl", NULL, new_filename)) { + OSReport("BDLファイルオープン失敗!!\n"); + } else { + bdlData = (u8*)J3DModelSaverDataBase::saveBinaryDisplayList(model, J3DBinaryDisplayListSaverFlag_UNK_1, 0xC8000); + if (bdlData == NULL) { + OSReport("BDLファイル生成失敗!!\n"); + } else { + OSReport("############ bdlData=%x size=%d\n", bdlData, *(int*)((char*)bdlData + 8)); + out_file.writeData(bdlData, *(int*)((char*)bdlData + 8)); + out_file.close(); + } + + mDoExt_destroySolidHeap(heap); + JKRFree(model_buffer); + delete[] bdlData; + } + } + break; + } + case 0x4000016: + if (!file.open(NULL, 6, "メモリファイル(*.csv)", "csv", NULL, NULL)) { + OSReport("メモリファイルオープン失敗!!\n"); + } else { + fapGm_dataMem::dumpCsv(); + file.writeData(fapGm_dataMem::getCsv(), fapGm_dataMem::getCsvSize()); + file.close(); + OSReport("csv file size=%d\n", fapGm_dataMem::getCsvSize()); + } + + if (!file.open(NULL, 6, "新メモリファイル(*.tag)", "tag", NULL, NULL)) { + OSReport("新メモリファイルオープン失敗!!\n"); + } else { + fapGm_dataMem::dumpTag(); + file.writeData(fapGm_dataMem::getCsv(), fapGm_dataMem::getCsvSize()); + file.close(); + OSReport("tag file size=%d\n", fapGm_dataMem::getCsvSize()); + } + break; + } +} + +void fapGm_HIO_c::startCpuTimer() { + if (m_CpuTimerOn) { + m_CpuTimerOff = TRUE; + m_CpuTimerOn = FALSE; + } + + if (m_CpuTimerOff) { + JUT_ASSERT(1302, !m_CpuTimerStart) + m_CpuTimerStart = TRUE; + m_CpuTimerTick = OSGetTick(); + } +} + +void fapGm_HIO_c::stopCpuTimer(const char* message) { + if (m_CpuTimerOff) { + JUT_ASSERT(1311, m_CpuTimerStart) + m_CpuTimerStart = FALSE; + + u32 var_r29 = OSGetTick() - m_CpuTimerTick; + OSReport("%fms : <%s>\n", OSTicksToMicroseconds(var_r29) / 1000.0f, message); + } +} + +void fapGm_HIO_c::printCpuTimer(const char* message) { + if (m_CpuTimerOff) { + OSReport("%s\n", message); + } +} +#endif + void fapGm_After() { fopScnM_Management(); fopOvlpM_Management(); @@ -46,6 +725,10 @@ void fapGm_After() { } void fapGm_Execute() { + #if DEBUG + JUTDbPrint::getManager()->setCharColor(g_HIO.mColor); + #endif + fpcM_Management(NULL, fapGm_After); cCt_Counter(0); } @@ -53,12 +736,22 @@ void fapGm_Execute() { fapGm_HIO_c g_HIO; void fapGm_Create() { + // unused, unknown purpose + u16 var_r30 = 184; + u16 var_r29 = 432; + u16 var_r28 = 1392; + u16 var_r27 = 456; + fpcM_Init(); fopScnM_Init(); fopOvlpM_Init(); fopCamM_Init(); fopDwTg_CreateQueue(); - g_HIO.field_0x04 = -1; + + #if DEBUG + fapGm_HIO_c::createCaptureScreen(); + #endif + g_HIO.field_0x04 = mDoHIO_CREATE_CHILD("ゲームシステム", &g_HIO); } fapGm_HIO_c::~fapGm_HIO_c() {} |
