diff --git a/src/melee/mn/forward.h b/src/melee/mn/forward.h index 202669aaf9..5bdc064d0f 100644 --- a/src/melee/mn/forward.h +++ b/src/melee/mn/forward.h @@ -5,6 +5,7 @@ typedef struct AnimLoopSettings AnimLoopSettings; typedef struct CountEntry CountEntry; typedef struct Diagram Diagram; typedef struct Diagram2 Diagram2; +typedef struct Diagram3 Diagram3; typedef struct CSSData CSSData; typedef struct CSSDoor CSSDoor; typedef struct CSSDoorsData CSSDoorsData; diff --git a/src/melee/mn/mndiagram.c b/src/melee/mn/mndiagram.c index cbbec21c2e..7131de8b3a 100644 --- a/src/melee/mn/mndiagram.c +++ b/src/melee/mn/mndiagram.c @@ -18,6 +18,7 @@ #include "lb/lb_00F9.h" #include "lb/lbarchive.h" #include "lb/lbaudio_ax.h" +#include "mn/inlines.h" #include "mn/mndiagram2.h" #include "mn/mndiagram3.h" #include "mn/mnmain.h" @@ -79,7 +80,7 @@ static u8 mnDiagram_803EE74C[0x1C] = { 0x18, 0x13, 0x14, 0x17, 0x16, 0, 0, 0, }; -static Vec3 mnDiagram_803EE728[3] = { +static Point3d mnDiagram_803EE728[3] = { { 4.0F, 1.0F, 0.0F }, { -3.0F, 0.8F, 0.0F }, { -1.0F, 0.7F, 0.0F }, @@ -745,6 +746,7 @@ void mnDiagram_8023FC28(void) /// @brief Counts the number of unlocked fighters. /// @return Number of unlocked fighters. +#pragma dont_inline on int mnDiagram_CountUnlockedFighters(void) { int i; @@ -758,16 +760,19 @@ int mnDiagram_CountUnlockedFighters(void) } return count; } +#pragma dont_inline reset void mnDiagram_PopupInputProc(HSD_GObj* gobj) { + HSD_GObjProc* proc; Diagram* data = mnDiagram_804D6C10->user_data; - u32 input = mn_80229624(4); - if (input & 0x20) { + u64 input = Menu_GetAllInputs(); + if ((u32) input & 0x20) { lbAudioAx_80024030(0); HSD_GObjProc_8038FE24(HSD_GObj_804D7838); - HSD_GObjProc_8038FD54(gobj, (void (*)(HSD_GObj*)) mnDiagram_InputProc, - 0); + proc = HSD_GObjProc_8038FD54( + gobj, (void (*)(HSD_GObj*)) mnDiagram_InputProc, 0); + proc->flags_3 = HSD_GObj_804D783C; HSD_GObjPLink_80390228(data->popup_gobj); data->popup_gobj = NULL; } @@ -775,14 +780,16 @@ void mnDiagram_PopupInputProc(HSD_GObj* gobj) void mnDiagram_InputProc(HSD_GObj* gobj) { + HSD_GObjProc* proc; Diagram* data = mnDiagram_804D6C10->user_data; - u32 input = mn_80229624(4); + u64 input = Menu_GetAllInputs(); - if (input & 0x10) { + if ((u32) input & 0x10) { lbAudioAx_80024030(1); HSD_GObjProc_8038FE24(HSD_GObj_804D7838); - HSD_GObjProc_8038FD54( + proc = HSD_GObjProc_8038FD54( gobj, (void (*)(HSD_GObj*)) mnDiagram_PopupInputProc, 0); + proc->flags_3 = HSD_GObj_804D783C; if (data->is_name_mode != 0) { u8 col_idx = (u8) data->name_cursor_pos; u8 row_idx = data->name_cursor_pos >> 8; @@ -887,59 +894,75 @@ void mnDiagram_PopupCleanup(void* arg0) typedef struct mnDiagram_PopupData { /* 0x00 */ HSD_JObj* jobjs[14]; - /* 0x38 */ HSD_Text* text[6]; + /* 0x38 */ HSD_Text* text[5]; } mnDiagram_PopupData; void mnDiagram_PopupAnimProc(void* arg0) { mnDiagram_PopupData* data = ((HSD_GObj*) arg0)->user_data; - Vec3 pos; + HSD_Text* text; + char* base = (char*) mnDiagram_803EE728; + Point3d pos; + f32 anim_frame; + PAD_STACK(24); HSD_JObjAnimAll(data->jobjs[5]); - lb_8000B1CC(data->jobjs[8], mnDiagram_803EE728, &pos); - data->text[0]->pos_x = pos.x; - data->text[0]->pos_y = -pos.y; - data->text[0]->pos_z = pos.z; + + text = data->text[0]; + lb_8000B1CC(data->jobjs[8], (Point3d*) base, &pos); + text->pos_x = pos.x; + text->pos_y = -pos.y; + text->pos_z = pos.z; + text->default_alignment = 0; HSD_JObjAnim(data->jobjs[9]); if (data->text[1] != NULL) { - lb_8000B1CC(data->jobjs[11], &mnDiagram_803EE728[1], &pos); + lb_8000B1CC(data->jobjs[11], (Point3d*) (base + 0xC), &pos); data->text[1]->pos_x = pos.x; data->text[1]->pos_y = -pos.y; data->text[1]->pos_z = pos.z; + text->default_alignment = 1; } if (data->text[2] != NULL) { - lb_8000B1CC(data->jobjs[10], &mnDiagram_803EE728[2], &pos); + lb_8000B1CC(data->jobjs[10], (Point3d*) (base + 0x18), &pos); data->text[2]->pos_x = pos.x; data->text[2]->pos_y = -pos.y; data->text[2]->pos_z = pos.z; + text->default_alignment = 1; } HSD_JObjAnim(data->jobjs[1]); - lb_8000B1CC(data->jobjs[3], &mnDiagram_803EE728[1], &pos); + lb_8000B1CC(data->jobjs[3], (Point3d*) (base + 0xC), &pos); data->text[3]->pos_x = pos.x; data->text[3]->pos_y = -pos.y; data->text[3]->pos_z = pos.z; + text->default_alignment = 1; if (data->text[4] != NULL) { - lb_8000B1CC(data->jobjs[2], &mnDiagram_803EE728[2], &pos); + lb_8000B1CC(data->jobjs[2], (Point3d*) (base + 0x18), &pos); data->text[4]->pos_x = pos.x; data->text[4]->pos_y = -pos.y; data->text[4]->pos_z = pos.z; + text->default_alignment = 1; } - mn_8022EFD8(data->jobjs[12], - (AnimLoopSettings*) (mnDiagram_803EE728 + 0x64)); - lb_8000B1CC(data->jobjs[13], &mnDiagram_803EE728[1], &pos); + anim_frame = + mn_8022EFD8(data->jobjs[12], (AnimLoopSettings*) (base + 0x64)); + lb_8000B1CC(data->jobjs[13], (Point3d*) (base + 0xC), &pos); data->text[3]->pos_x = pos.x; data->text[3]->pos_y = -pos.y; data->text[3]->pos_z = pos.z; + text->default_alignment = 1; + + if (anim_frame == *(f32*) (base + 0x68)) { + HSD_GObjProc_8038FE24(HSD_GObj_804D7838); + } } void mnDiagram_80240D94(void* arg0, s32 arg1, s32 arg2, s32 arg3) { mnDiagram_PopupData* data = ((HSD_GObj*) arg0)->user_data; - Vec3 pos; + Point3d pos; char buf[8]; u16 kos; u16 sd_count; @@ -1388,7 +1411,6 @@ void mnDiagram_OnFrame(HSD_GObj* gobj) u8 col_idx; s32 row_idx; int count; - PAD_STACK(0x28); if ((mn_804A04F0.cur_menu != 0x1E) || (mn_804A04F0.x10 != 0)) { if (mn_804A04F0.cur_menu == 0x1E) { @@ -1451,11 +1473,11 @@ void mnDiagram_OnFrame(HSD_GObj* gobj) mnDiagram_802417D0(gobj); } -void mnDiagram_80241E78(void* arg0, u8 arg1, u8 arg2, s32 arg3) +void mnDiagram_80241E78(void* arg0, u8 arg1, u8 arg2, int arg3) { - Diagram* data; HSD_JObj* jobj; HSD_JObj* jobj2; + Diagram* data; void** joint_data; s32 digit_count; s32 digit; @@ -1471,24 +1493,25 @@ void mnDiagram_80241E78(void* arg0, u8 arg1, u8 arg2, s32 arg3) u8 row = arg2; data = ((HSD_GObj*) arg0)->user_data; + jobj = data->jobjs[11]; - jobj2 = data->jobjs[12]; base = HSD_JObjGetTranslationX(jobj); + jobj2 = data->jobjs[12]; x_spacing = HSD_JObjGetTranslationX(jobj2) - base; jobj = data->jobjs[7]; - jobj2 = data->jobjs[8]; base = HSD_JObjGetTranslationX(jobj); + jobj2 = data->jobjs[8]; y_spacing = HSD_JObjGetTranslationX(jobj2) - base; jobj = data->jobjs[9]; - jobj2 = data->jobjs[10]; base = HSD_JObjGetTranslationY(jobj); + jobj2 = data->jobjs[10]; y_offset = HSD_JObjGetTranslationY(jobj2) - base; digit_count = mn_GetDigitCount(arg3); - row_offset = y_offset * (f32) row; col_offset = y_spacing * (f32) col; + row_offset = y_offset * (f32) row; row_offset_adj = row_offset - 1.0f; joint_data = mnDiagram_804A07F4; diff --git a/src/melee/mn/mndiagram.h b/src/melee/mn/mndiagram.h index a85d6b27e9..c267feb21f 100644 --- a/src/melee/mn/mndiagram.h +++ b/src/melee/mn/mndiagram.h @@ -44,7 +44,7 @@ /* 241AE8 */ void mnDiagram_ExitAnimProc(HSD_GObj* gobj); /* 241B4C */ void mnDiagram_UpdateScrollArrowVisibility(void* gobj, int count); /* 241BF8 */ void mnDiagram_OnFrame(HSD_GObj* gobj); -/* 241E78 */ void mnDiagram_80241E78(void* arg0, u8 arg1, u8 arg2, s32 arg3); +/* 241E78 */ void mnDiagram_80241E78(void* arg0, u8 arg1, u8 arg2, int arg3); /* 24227C */ void mnDiagram_8024227C(void* arg0, s32 arg1, s32 arg2, u8 arg3); /* 2427B4 */ void mnDiagram_802427B4(void* arg0, s32 arg1, s32 arg2); /* 242B38 */ HSD_JObj* mnDiagram_80242B38(int idx, int arg1); diff --git a/src/melee/mn/mndiagram.static.h b/src/melee/mn/mndiagram.static.h index 32e8249c26..3b1402a660 100644 --- a/src/melee/mn/mndiagram.static.h +++ b/src/melee/mn/mndiagram.static.h @@ -14,8 +14,8 @@ #include extern char mnDiagram_804D4FA4; -extern SDATA char mnDiagram_804D4FA8[]; -extern SDATA char mnDiagram_804D4FB0[]; +extern char mnDiagram_804D4FA8[7]; +extern char mnDiagram_804D4FB0[5]; extern f32 mnDiagram_803EE774[]; extern f32 mnDiagram_803EE758[]; extern void* mnDiagram_804A0814[4]; @@ -24,5 +24,6 @@ extern void* mnDiagram_804A07F4[4]; extern void* mnDiagram_804A0804[4]; extern void* mnDiagram_804A0824[4]; extern HSD_GObj* mnDiagram_804D6C10; +extern f64 mnDiagram_804DBF78; #endif diff --git a/src/melee/mn/mndiagram2.c b/src/melee/mn/mndiagram2.c index c0016afd7a..5d65e9b1a9 100644 --- a/src/melee/mn/mndiagram2.c +++ b/src/melee/mn/mndiagram2.c @@ -191,7 +191,11 @@ void mnDiagram2_UpdateHeader(HSD_GObj* gobj, u8 is_name_mode, u8 entity_idx) PAD_STACK(8); data = gobj->user_data; - name = mnDiagram_GetEntityByIndex(is_name_mode, entity_idx); + if (is_name_mode != 0) { + name = mnDiagram_GetNameByIndex_s(entity_idx); + } else { + name = mnDiagram_GetFighterByIndex_s(entity_idx); + } if (is_name_mode == 0) { tmp = data->x18; @@ -272,24 +276,25 @@ static inline void mnDiagram2_RefreshStatRows(void) void mnDiagram2_HandleInput(HSD_GObj* gobj) { Diagram2* data; - Diagram2* data2; int result; + Diagram2* data2; u8 x46; u8 x47; u8 x48; u8 var_r6; u8 var_r5; - u8 var_r28; + int var_r28; u8 new_val; + PAD_STACK(40); data = mnDiagram2_804D6C18->user_data; result = mn_80229624(4); - mn_804A04F0.buttons = result; - var_r28 = 0; + ((s32*) &mn_804A04F0.buttons)[1] = result; + ((s32*) &mn_804A04F0.buttons)[0] = (var_r28 = 0); if (result & 0x20) { lbAudioAx_80024030(0); - mn_804A04F0.entering_menu = 0; + mn_804A04F0.entering_menu = var_r28; data2 = mnDiagram2_804D6C18->user_data; x46 = data2->selected_fighter_idx; gmMainLib_8015CC34()->x12 = x46; @@ -624,7 +629,7 @@ void mnDiagram2_CreateStatRow(HSD_GObj* gobj, u8 is_name_mode, u8 stat_type, lb_8000B1CC(data->row0_ref, (Vec3*) (base + 0xC), &sp20); { - int r22 = (u8) row_idx; + u32 r22 = (u8) row_idx; f32 temp_f31 = -f30 * (f32) r22; text = HSD_SisLib_803A5ACC(0, 1, sp20.x, -sp20.y + temp_f31, sp20.z, mnDiagram2_804DBFD0, mnDiagram2_804DBFD4); @@ -640,9 +645,8 @@ void mnDiagram2_CreateStatRow(HSD_GObj* gobj, u8 is_name_mode, u8 stat_type, HSD_SisLib_803A6368(text, table[0x18]); { - u16 iconId = table[0x30]; - int r21 = iconId; - if (iconId != 0xFFFF) { + int r21 = table[0x30]; + if (r21 != 0xFFFF) { HSD_Text* text2; int var_r3; lb_8000B1CC(data->row0_ref, (Vec3*) (base + 0xC), @@ -654,7 +658,7 @@ void mnDiagram2_CreateStatRow(HSD_GObj* gobj, u8 is_name_mode, u8 stat_type, temp_r22->row_icons[0] = text2; text2->default_alignment = 1; - text2->text_color = mnDiagram2_804D4FB8; + text2->text_color = mnDiagram2_804D4FBC; if (r23 >= 0x12) { var_r3 = 0; @@ -716,7 +720,7 @@ void mnDiagram2_CreateStatRow(HSD_GObj* gobj, u8 is_name_mode, u8 stat_type, text3->pos_x = sp20.x; text3->pos_y = -sp20.y + temp_f31; text3->pos_z = sp20.z; - text3->text_color = mnDiagram2_804D4FB8; + text3->text_color = mnDiagram2_804D4FBC; text3->default_alignment = 2; if (r23 == 0xB) { @@ -812,12 +816,12 @@ void mnDiagram2_PopulateStatRows(HSD_GObj* gobj, u8 scroll_offset, int limit; int idx; int i; - u8 var_r28; + int var_r28; if (is_name_mode != 0) { - var_r28 = mnDiagram_GetNameByIndex(entity_idx); + var_r28 = (u8) mnDiagram_GetNameByIndex(entity_idx); } else { - var_r28 = mnDiagram_GetFighterByIndex(entity_idx); + var_r28 = (u8) mnDiagram_GetFighterByIndex(entity_idx); } if (is_name_mode != 0) { @@ -835,7 +839,7 @@ void mnDiagram2_PopulateStatRows(HSD_GObj* gobj, u8 scroll_offset, } else { val = idx; } - mnDiagram2_CreateStatRow(gobj, is_name_mode, val, i, var_r28); + mnDiagram2_CreateStatRow(gobj, is_name_mode, val, i, (u8) var_r28); i++; idx++; } while (i < 10); @@ -873,14 +877,14 @@ void mnDiagram2_OnAnimComplete(HSD_GObj* gobj) void mnDiagram2_UpdateScrollArrows(HSD_GObj* gobj) { Diagram2* data; - AnimLoopSettings* table; HSD_JObj* jobj; + u8* base; + base = (u8*) &mnDiagram2_803EEAD0; data = gobj->user_data; - table = (AnimLoopSettings*) ((u8*) &mnDiagram2_803EEAD0 + 0x9C); jobj = data->down_arrow; - mn_8022ED6C(jobj, table); + mn_8022ED6C(jobj, (AnimLoopSettings*) (base + 0x9C)); if (data->is_name_mode) { if (data->scroll_offset + 10 < 0x18) { HSD_JObjClearFlagsAll(jobj, 0x10); @@ -896,7 +900,7 @@ void mnDiagram2_UpdateScrollArrows(HSD_GObj* gobj) } jobj = data->up_arrow; - mn_8022ED6C(jobj, table); + mn_8022ED6C(jobj, (AnimLoopSettings*) (base + 0x9C)); if (data->scroll_offset) { HSD_JObjClearFlagsAll(jobj, 0x10); } else { @@ -904,7 +908,7 @@ void mnDiagram2_UpdateScrollArrows(HSD_GObj* gobj) } jobj = data->left_arrow; - mn_8022ED6C(jobj, table); + mn_8022ED6C(jobj, (AnimLoopSettings*) (base + 0x9C)); if (data->is_name_mode) { if (data->selected_name_idx) { HSD_JObjClearFlagsAll(jobj, 0x10); @@ -920,7 +924,7 @@ void mnDiagram2_UpdateScrollArrows(HSD_GObj* gobj) } jobj = data->right_arrow; - mn_8022ED6C(jobj, table); + mn_8022ED6C(jobj, (AnimLoopSettings*) (base + 0x9C)); if (data->is_name_mode != 0) { if (data->selected_name_idx != (u8) mnDiagram_GetNextNameIndex(data->selected_name_idx)) @@ -982,7 +986,7 @@ void mnDiagram2_FreeUserData(Diagram2* data) } /// @brief Initializes user data fields to default values. /// @param arg The user data struct to initialize -void mnDiagram2_InitUserData(void* arg) +void mnDiagram2_InitUserData(void* arg, int unused) { Diagram2* data = arg; u8* src = (u8*) &mn_804A04F0; @@ -1009,16 +1013,18 @@ void mnDiagram2_InitUserData(void* arg) /// @param arg0 Unused parameter void mnDiagram2_Create(int arg0) { + HSD_JObj* jobj; char* base = (char*) &mnDiagram2_803EEAD0; mnDiagram_ArchiveData* archive = &mnDiagram_804A0834; HSD_GObj* gobj; - HSD_JObj* jobj; Diagram2* data; - int i; + u32 is_name; + u8 entity_idx; + u8 scroll; + u8 entity_val; int threshold; - u32 var_r29; - int idx; - u8 x46_or_x47; + int j; + int i; int offset; Diagram2* user_data; @@ -1035,7 +1041,7 @@ void mnDiagram2_Create(int arg0) OSReport(base + 0x108); __assert(base + 0x120, 0x3E6, base + 0x130); } - mnDiagram2_InitUserData(data); + mnDiagram2_InitUserData(data, arg0); GObj_InitUserData(gobj, 0, (void (*)(void*)) mnDiagram2_FreeUserData, data); @@ -1045,28 +1051,39 @@ void mnDiagram2_Create(int arg0) HSD_GObjProc_8038FD54(gobj, mnDiagram2_Think, 0); - if (data->is_name_mode) { - x46_or_x47 = data->selected_name_idx; - var_r29 = (u8) mnDiagram_GetNameByIndex(x46_or_x47); + is_name = data->is_name_mode; + if (is_name) { + entity_idx = data->selected_name_idx; + } else { + entity_idx = data->selected_fighter_idx; + } + scroll = (u8) data->scroll_offset; + if (is_name) { + entity_val = mnDiagram_GetNameByIndex(entity_idx); + } else { + entity_val = mnDiagram_GetFighterByIndex(entity_idx); + } + if (is_name != 0) { threshold = 0x18; } else { - x46_or_x47 = data->selected_fighter_idx; - var_r29 = (u8) mnDiagram_GetFighterByIndex(x46_or_x47); threshold = 0x15; } - idx = (u8) data->scroll_offset; - for (i = 0; i < 10; i++) { - if (idx >= threshold) { - offset = idx - threshold; + j = 0; + do { + if ((s32) scroll >= threshold) { + offset = scroll - threshold; } else { - offset = idx; + offset = scroll; } - mnDiagram2_CreateStatRow(gobj, data->is_name_mode, offset, i, var_r29); - } + mnDiagram2_CreateStatRow(gobj, is_name, offset, j, entity_val); + j++; + scroll++; + } while (j < 10); + is_name = data->is_name_mode; user_data = gobj->user_data; - if (data->is_name_mode) { + if (is_name) { HSD_JObjSetFlagsAll(user_data->fighter_mode_header, 0x10); HSD_JObjClearFlagsAll(user_data->name_mode_header, 0x10); } else { @@ -1074,12 +1091,12 @@ void mnDiagram2_Create(int arg0) HSD_JObjSetFlagsAll(user_data->name_mode_header, 0x10); } - if (data->is_name_mode) { - x46_or_x47 = user_data->selected_name_idx; + if (is_name) { + entity_idx = user_data->selected_name_idx; } else { - x46_or_x47 = user_data->selected_fighter_idx; + entity_idx = user_data->selected_fighter_idx; } - mnDiagram2_UpdateHeader(gobj, data->is_name_mode, x46_or_x47); + mnDiagram2_UpdateHeader(gobj, is_name, entity_idx); } /// @brief Entry point for VS Records page 2 - initializes diagram and input @@ -1106,6 +1123,7 @@ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank) mnDiagram2_SortEntry entries[25]; f64 temp0; f64 temp8; + u64 baseVal; mnDiagram2_SortEntry* base; mnDiagram2_SortEntry* ptr; mnDiagram2_SortEntry* curr; @@ -1115,7 +1133,8 @@ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank) int maxIdx; int zero; int neg1; - u8 name; + int name; + PAD_STACK(8); base = entries; ptr = base; @@ -1124,7 +1143,7 @@ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank) neg1 = -1; for (i = 0; i < 25; i++) { - name = mnDiagram_GetFighterByIndex(i); + name = (u8) mnDiagram_GetFighterByIndex(i); ptr->name = name; if (mn_IsFighterUnlocked(name) != 0) { ptr->xC = mnDiagram2_GetStatValue(0, stat_type, name); @@ -1133,20 +1152,23 @@ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank) ptr->xC = neg1; ptr->x8 = neg1; } + ptr++; } - // Selection sort with -1 handling + // Selection sort with insertion shift i = 0; do { k = i + 1; - maxIdx = i; curr = &entries[k]; + maxIdx = i; + baseVal = base->value; while (k < 25) { // Skip entries with -1 value if (curr->value != (u64) neg1) { - // Update if curr > entries[maxIdx] OR entries[maxIdx] == -1 - u64 maxVal = entries[maxIdx].value; - if (curr->value > maxVal || maxVal == (u64) neg1) { + // Update if curr > entries[maxIdx] OR base == -1 + if (curr->value > entries[maxIdx].value || + baseVal == (u64) neg1) + { maxIdx = k; } } @@ -1188,8 +1210,10 @@ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank) u8 mnDiagram2_GetRankedName(u8 stat_type, u8 rank) { mnDiagram2_SortEntry entries[120]; + mnDiagram2_SortEntry temp; mnDiagram2_SortEntry* base; mnDiagram2_SortEntry* ptr; + mnDiagram2_SortEntry* inner; int count; int i; int j; @@ -1216,17 +1240,11 @@ u8 mnDiagram2_GetRankedName(u8 stat_type, u8 rank) i = 0; while (i < count) { - mnDiagram2_SortEntry* inner; - f64 temp0; - f64 temp8; - j = i + 1; maxIdx = i; inner = &entries[j]; while (j < count) { - u64 a = inner->value; - u64 b = entries[maxIdx].value; - if (a > b) { + if (inner->value > entries[maxIdx].value) { maxIdx = j; } inner++; @@ -1235,18 +1253,15 @@ u8 mnDiagram2_GetRankedName(u8 stat_type, u8 rank) if (maxIdx != i) { ptr = &entries[maxIdx]; - temp0 = ptr->d0; + temp = *ptr; j = maxIdx - i; - temp8 = ptr->d8; while (j > 0) { - ptr->d0 = (ptr - 1)->d0; - ptr->d8 = (ptr - 1)->d8; + *ptr = *(ptr - 1); ptr--; j--; } - base->d0 = temp0; - base->d8 = temp8; + *base = temp; } base++; i++; @@ -1364,9 +1379,9 @@ void mnDiagram2_ClearDetailView(HSD_GObj* gobj) { Diagram2DetailView* data; Diagram2DetailView* ptr; + int i; void* tmp; HSD_JObj* jobj; - int i; ptr = data = (Diagram2DetailView*) HSD_GObjGetUserData(gobj); diff --git a/src/melee/mn/mndiagram2.h b/src/melee/mn/mndiagram2.h index 8f57cf71a8..bf5cbc0a5e 100644 --- a/src/melee/mn/mndiagram2.h +++ b/src/melee/mn/mndiagram2.h @@ -25,7 +25,7 @@ /* 244D80 */ void mnDiagram2_UpdateScrollArrows(HSD_GObj* gobj); /* 244F68 */ void mnDiagram2_Think(HSD_GObj* gobj); /* 245028 */ void mnDiagram2_FreeUserData(Diagram2* data); -/* 245068 */ void mnDiagram2_InitUserData(void* arg); +/* 245068 */ void mnDiagram2_InitUserData(void* arg, int unused); /* 245178 */ void mnDiagram2_Create(int arg0); /* 2453B0 */ void mnDiagram2_Init(void); /* 24541C */ u8 mnDiagram2_GetRankedFighter(u8 stat_type, u8 rank); diff --git a/src/melee/mn/mndiagram2.static.h b/src/melee/mn/mndiagram2.static.h index c9abe7cea8..fc7b88f3bd 100644 --- a/src/melee/mn/mndiagram2.static.h +++ b/src/melee/mn/mndiagram2.static.h @@ -15,12 +15,13 @@ typedef struct { /* 0x0C */ HSD_ShapeAnimJoint* xC; } mnDiagram_ArchiveData; -/* 3EEAD0 */ extern void* mnDiagram2_803EEAD0; +/* 3EEAD0 */ extern u8 mnDiagram2_803EEAD0[0x90]; /* 3EEB60 */ extern struct AnimLoopSettings mnDiagram2_803EEB60; /* 4A0834 */ extern mnDiagram_ArchiveData mnDiagram_804A0834; /* 4D4FB8 */ extern GXColor mnDiagram2_804D4FB8; -/* 4D4FC0 */ extern char mnDiagram2_804D4FC0[]; -/* 4D4FC8 */ extern char mnDiagram2_804D4FC8[]; +/* 4D4FBC */ extern GXColor mnDiagram2_804D4FBC; +/* 4D4FC0 */ extern char mnDiagram2_804D4FC0[7]; +/* 4D4FC8 */ extern char mnDiagram2_804D4FC8[5]; /* 4D4FD0 */ extern u8 mnDiagram2_804D4FD0[3]; /* 4D6C18 */ extern HSD_GObj* mnDiagram2_804D6C18; /* 4DBFC8 */ extern f32 mnDiagram2_804DBFC8; diff --git a/src/melee/mn/mndiagram3.c b/src/melee/mn/mndiagram3.c index 4e8b536c73..eb42d44c14 100644 --- a/src/melee/mn/mndiagram3.c +++ b/src/melee/mn/mndiagram3.c @@ -1,8 +1,570 @@ #include "mndiagram3.h" -#include "baselib/memory.h" +#include "mndiagram3.static.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void mnDiagram3_80245BA4(HSD_GObj* gobj) +{ + Vec3 sp6C; + u8 sp58[0x14]; + u8 sp48[0x10]; + u8 sp38[0x10]; + u8 sp28[0x10]; + Diagram3* data; + char* base; + u16* table; + HSD_JObj* row0; + HSD_JObj* row1; + f32 neg_spacing; + f32 row_spacing; + f32 divider; + f32 icon_x_offset; + u8 stat_type; + int i; + HSD_Text* title_text; + HSD_Text* value_text; + HSD_JObj* icon; + u8 entity; + u32 max_distance; + u32 max_time; + u32 max_percentage; + PAD_STACK(8); + + data = gobj->user_data; + base = (char*) &mnDiagram3_803EEC10; + + { + u8 is_name_mode = data->is_name_mode; + u8 scroll = data->saved_selection; + u8 offset = data->scroll_offset; + u8 limit; + + if (is_name_mode != 0) { + limit = 0x18; + } else { + limit = 0x15; + } + + { + int val = offset + scroll; + if (val >= limit) { + val = val - limit; + } else { + val = (u8) val; + } + row0 = data->jobjs[6]; + stat_type = (u8) val; + } + } + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + + row1 = data->jobjs[7]; + { + f32 row0_y = row0->translate.y; + ((row1) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + + { + u16* stat_table; + stat_table = (u16*) (base + ((int) stat_type << 1)); + icon_x_offset = mnDiagram3_804DC010; + row_spacing = row1->translate.y - row0_y; + max_distance = 0x5F5E0FF; + max_percentage = 0x98967F; + divider = mnDiagram3_804DC008; + max_time = 0x5C8D7F; + neg_spacing = -row_spacing; + stat_table += 0x36; + + for (i = 0; i < 5; i++) { + if (data->is_name_mode != 0) { + if (!mnDiagram2_IsIconOnlyStat(stat_type)) { + if (i == 0) { + lb_8000B1CC(data->jobjs[6], (Vec3*) (base + 0x24), + &sp6C); + title_text = HSD_SisLib_803A6754(0, 1); + data->title_text = title_text; + title_text->font_size.x = divider; + title_text->font_size.y = divider; + { + f32 y = sp6C.y; + f32 z = sp6C.z; + title_text->pos_x = sp6C.x; + title_text->pos_y = -y; + title_text->pos_z = z; + } + } + + entity = mnDiagram2_GetRankedName(stat_type, (u8) i); + if (entity == 0x78) { + goto next; + } + { + char* name_str = GetNameText(entity); + f32 f1 = mnDiagram3_804DC00C; + f32 offset_y = neg_spacing * (f32) i / divider; + HSD_SisLib_803A6B98(title_text, f1, offset_y, + name_str); + } + } + } else { + entity = mnDiagram2_GetRankedFighter(stat_type, (u8) i); + icon = mnDiagram_80242B38(entity, 0); + if (icon == NULL) { + __assert(mnDiagram3_804D4FD8, 0x3B3, + mnDiagram3_804D4FE0); + } + icon->translate.y = row_spacing * (f32) i; + if (!(icon->flags & (1 << 25))) { + HSD_JObjSetMtxDirty(icon); + } + HSD_JObjAddChild(data->jobjs[6], icon); + } + + if (i == 0) { + lb_8000B1CC(data->jobjs[6], (Vec3*) (base + 0x30), &sp6C); + value_text = HSD_SisLib_803A6754(0, 1); + data->value_text = value_text; + value_text->font_size.x = divider; + value_text->font_size.y = divider; + { + f32 y = sp6C.y; + f32 z = sp6C.z; + value_text->pos_x = sp6C.x; + value_text->pos_y = -y; + value_text->pos_z = z; + } + value_text->default_alignment = 2; + value_text->text_color = mn_804D4B64; + } + + if (mnDiagram2_IsIconOnlyStat(stat_type)) { + mnDiagram2_GetAggregatedFighterRank(sp48, stat_type, + (u8) i); + if (sp48[0] == 0x19) { + goto next; + } + mnDiagram2_GetAggregatedFighterRank(sp38, stat_type, + (u8) i); + icon = mnDiagram_80242B38(sp38[0], 0); + if (icon == NULL) { + __assert(mnDiagram3_804D4FD8, 0x3B3, + mnDiagram3_804D4FE0); + } + icon->translate.y = row_spacing * (f32) i; + if (!(icon->flags & (1 << 25))) { + HSD_JObjSetMtxDirty(icon); + } + HSD_JObjAddChild(data->jobjs[6], icon); + + mnDiagram2_GetAggregatedFighterRank(sp28, stat_type, + (u8) i); + { + int val = *(int*) (sp28 + 0xC); + mnDiagram_FormatDecimalNumber((char*) sp58, val, 0); + } + { + f32 f1 = mnDiagram3_804DC00C; + f32 offset_y = neg_spacing * (f32) i / divider; + HSD_SisLib_803A6B98(value_text, f1, offset_y, + (char*) sp58); + } + } else { + if (mnDiagram2_IsTimeStat(stat_type)) { + int val = mnDiagram2_GetStatValue(data->is_name_mode, + stat_type, entity); + if ((u32) val > max_time) { + val = max_time; + } + mnDiagram_FormatTime((char*) sp58, val); + } else if (mnDiagram2_IsDistanceStat(stat_type)) { + u32 val = mnDiagram2_GetStatValue(data->is_name_mode, + stat_type, entity); + val = mnDiagram_ConvertDistanceForDisplay(val); + if (val > max_distance) { + val = max_distance; + } + mnDiagram_IntToStr((char*) sp58, val); + } else if (mnDiagram2_IsPercentageStat(stat_type)) { + u32 val = mnDiagram2_GetStatValue(data->is_name_mode, + stat_type, entity); + if (val > max_percentage) { + val = max_percentage; + } + mnDiagram_FormatDecimalNumber((char*) sp58, val, 2); + } else if (mnDiagram2_IsIconOnlyStat(stat_type)) { + goto next; + } else { + u32 val = mnDiagram2_GetStatValue(data->is_name_mode, + stat_type, entity); + if (val > max_distance) { + val = max_distance; + } + mnDiagram_FormatDecimalNumber((char*) sp58, val, 0); + } + + { + f32 f1 = mnDiagram3_804DC00C; + f32 offset_y = neg_spacing * (f32) i / divider; + HSD_SisLib_803A6B98(value_text, f1, offset_y, + (char*) sp58); + } + } + + { + u16 icon_id = *stat_table; + int r17 = icon_id; + if ((u32) icon_id == 0xFFFF) { + goto next; + } + + lb_8000B1CC(data->jobjs[6], (Vec3*) (base + 0x30), &sp6C); + { + HSD_Text* icon_text; + f32 negated_y = -sp6C.y; + icon_text = HSD_SisLib_803A5ACC( + 0, 1, icon_x_offset + sp6C.x, + neg_spacing * (f32) i + negated_y, sp6C.z, + mnDiagram3_804DC014, mnDiagram3_804DC014); + data->row_icons[i] = icon_text; + icon_text->default_alignment = 1; + icon_text->text_color = mn_804D4B64; + + if (mnDiagram2_IsDistanceStat(stat_type)) { + u32 stat_val = mnDiagram2_GetStatValue( + data->is_name_mode, stat_type, entity); + if (mnDiagram_IsDistanceOverflow(stat_val)) { + HSD_SisLib_803A6368(icon_text, 0x7F); + goto next; + } + } + HSD_SisLib_803A6368(icon_text, r17); + } + } + + next: + (void) 0; + } + } + } +} + +void mnDiagram3_80246D40(HSD_GObj* gobj) +{ + Diagram3* data; + HSD_JObj* jobj; + int limit; + + data = gobj->user_data; + + jobj = data->jobjs[3]; + mn_8022ED6C(jobj, &mnDiagram3_803EEC1C); + + if (data->is_name_mode != 0) { + limit = 0x18; + } else { + limit = 0x15; + } + + if (data->scroll_offset + 10 < limit) { + HSD_JObjClearFlagsAll(jobj, 0x10); + } else { + HSD_JObjSetFlagsAll(jobj, 0x10); + } + + jobj = data->jobjs[4]; + mn_8022ED6C(jobj, &mnDiagram3_803EEC1C); + + if (data->scroll_offset != 0) { + HSD_JObjClearFlagsAll(jobj, 0x10); + } else { + HSD_JObjSetFlagsAll(jobj, 0x10); + } +} + +void fn_80246E04(HSD_GObj* gobj) +{ + Diagram3* data; + HSD_JObj* jobj; + AnimLoopSettings* table; + int pad; + + data = gobj->user_data; + jobj = data->jobjs[1]; + table = &mnDiagram3_803EEC10; + pad = 0; + if (mn_8022ED6C(jobj, table) >= table->end_frame) { + HSD_GObjPLink_80390228(gobj); + } +} + +void fn_80246E64(HSD_GObj* gobj) +{ + Diagram3* data; + u8* src; + u8 mode; + PAD_STACK(8); + + src = (u8*) &mn_804A04F0; + data = gobj->user_data; + mode = src[0]; + if (mode != 0x1E || src[0x10] != 2) { + if (mode == 0x1E) { + HSD_GObjPLink_80390228(gobj); + } else { + HSD_GObjProc* proc; + + HSD_GObjProc_8038FE24(HSD_GObj_804D7838); + proc = HSD_GObjProc_8038FD54(gobj, fn_80246E04, 0); + proc->flags_3 = HSD_GObj_804D783C; + HSD_JObjSetFlagsAll(data->jobjs[2], 0x10); + } + } else { + mnDiagram3_80246D40(gobj); + } +} void fn_80246F0C(void* arg0) { HSD_Free(arg0); } + +void mnDiagram3_80246F2C(Diagram3* data, int arg1) +{ + u8* src; + int i; + PAD_STACK(8); + + src = (u8*) &mn_804A04F0; + data->saved_menu = src[0]; + data->saved_selection = (u8) * (u16*) (src + 2); + data->anim_state = 1; + data->scroll_offset = 0; + data->is_name_mode = gmMainLib_8015CC34()->xD; + + for (i = 0; i < 10; i++) { + data->row_labels[i] = NULL; + } + + data->popup_gobj = NULL; + data->title_text = NULL; + data->value_text = NULL; + data->row_icons[0] = NULL; + data->row_icons[1] = NULL; + data->row_icons[2] = NULL; + data->row_icons[3] = NULL; + data->row_icons[4] = NULL; +} + +void mnDiagram3_80247008(int arg0) +{ + char* base = (char*) &mnDiagram3_803EEC10; + mnDiagram_ArchiveData* archive = &mnDiagram_804A0844; + HSD_GObj* gobj; + HSD_JObj* jobj; + Diagram3* data; + int i; + + gobj = GObj_Create(6, 7, 0x80); + mnDiagram3_804D6C20 = gobj; + jobj = HSD_JObjLoadJoint(archive->x0); + HSD_GObjObject_80390A70(gobj, HSD_GObj_804D7849, jobj); + GObj_SetupGXLink(gobj, HSD_GObj_JObjCallback, 6, 0x80); + HSD_JObjAddAnimAll(jobj, archive->x4, archive->x8, archive->xC); + HSD_JObjReqAnimAll(jobj, mnDiagram3_804DC00C); + HSD_JObjAnimAll(jobj); + + data = (Diagram3*) HSD_MemAlloc(0x78); + if (data == NULL) { + OSReport(base + 0x9C); + __assert(base + 0xB4, 0x3FC, base + 0xC4); + } + mnDiagram3_80246F2C(data, arg0); + GObj_InitUserData(gobj, 0, (void (*)(void*)) fn_80246F0C, data); + + for (i = 0; i < 10; i++) { + lb_80011E24(jobj, (HSD_JObj**) ((u8*) data + (i << 2) + 8), i, -1); + } + + HSD_GObjProc_8038FD54(gobj, fn_80246E64, 0); +} + +void mnDiagram3_8024714C(void* arg0) +{ + Vec3 sp48; + Diagram3* data; + HSD_GObj* gobj; + HSD_JObj* row0; + HSD_JObj* row1; + mnDiagram_ArchiveData* archive; + f32 row_spacing; + f32 neg_spacing; + int i; + PAD_STACK(56); + + { + MenuFlow* flow = &mn_804A04F0; + flow->x10 = 2; + flow->hovered_selection = 0; + } + + mnDiagram3_80247008((int) arg0); + + gobj = mnDiagram3_804D6C20; + archive = &mnDiagram_804A0854; + data = gobj->user_data; + + { + HSD_GObj* popup; + HSD_JObj* popup_jobj; + + popup = GObj_Create(6, 7, 0x80); + data->popup_gobj = popup; + popup_jobj = HSD_JObjLoadJoint(archive->x0); + HSD_GObjObject_80390A70(popup, HSD_GObj_804D7849, popup_jobj); + GObj_SetupGXLink(popup, HSD_GObj_JObjCallback, 4, 0x80); + HSD_JObjAddAnimAll(popup_jobj, archive->x4, archive->x8, archive->xC); + HSD_JObjReqAnimAll(popup_jobj, mnDiagram3_804DC00C); + HSD_JObjAnimAll(popup_jobj); + + data = gobj->user_data; + row0 = data->jobjs[8]; + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + + row1 = data->jobjs[9]; + row_spacing = row0->translate.y; + ((row1) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + row_spacing = row1->translate.y - row_spacing; + + row0 = data->jobjs[8]; + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3E1, mnDiagram3_804D4FE0)); + { + f32 tx = row0->translate.x; + ((popup_jobj) + ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3A4, mnDiagram3_804D4FE0)); + popup_jobj->translate.x = tx; + } + if (!(popup_jobj->flags & 0x02000000)) { + ftCo_800C6AFC(popup_jobj); + } + + row0 = data->jobjs[8]; + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + { + f32 ty = row_spacing * mnDiagram3_804DC00C + row0->translate.y; + ((popup_jobj) + ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3B3, mnDiagram3_804D4FE0)); + popup_jobj->translate.y = ty; + } + if (!(popup_jobj->flags & 0x02000000)) { + ftCo_800C6AFC(popup_jobj); + } + + row0 = data->jobjs[8]; + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3FB, mnDiagram3_804D4FE0)); + { + f32 tz = row0->translate.z; + ((popup_jobj) + ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3C2, mnDiagram3_804D4FE0)); + popup_jobj->translate.z = tz; + } + if (!(popup_jobj->flags & 0x02000000)) { + ftCo_800C6AFC(popup_jobj); + } + } + + { + Diagram3* d; + u8 scroll; + u8 stat_idx; + u16* base; + + gobj = mnDiagram3_804D6C20; + d = gobj->user_data; + row0 = d->jobjs[8]; + scroll = d->scroll_offset; + ((row0) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + + row1 = d->jobjs[9]; + row_spacing = row0->translate.y; + ((row1) ? ((void) 0) + : __assert(mnDiagram3_804D4FD8, 0x3EE, mnDiagram3_804D4FE0)); + row_spacing = row1->translate.y - row_spacing; + + lb_8000B1CC(d->jobjs[8], (Vec3*) &mnDiagram3_803EEC28, &sp48); + + neg_spacing = -row_spacing; + base = (u16*) &mnDiagram3_803EEC4C; + row_spacing = mnDiagram3_804DBFF8; + stat_idx = scroll; + i = 0; + + do { + f32 fi = (f32) i; + HSD_Text* text = HSD_SisLib_803A5ACC( + 0, 1, sp48.x - row_spacing, neg_spacing * fi + -sp48.y, sp48.z, + mnDiagram3_804DBFFC, mnDiagram3_804DBFFC); + + d->row_labels[i] = text; + { + u8 type_idx = (u8) i; + int val; + u8 limit; + + if (d->is_name_mode != 0) { + limit = 0x18; + } else { + limit = 0x15; + } + + val = stat_idx + type_idx; + if (val >= (u8) limit) { + val = val - (u8) limit; + } else { + val = (u8) val; + } + + { + u16* entry = &base[(u8) val]; + HSD_SisLib_803A6368(text, *entry); + } + } + i++; + } while (i < 10); + } + + mnDiagram3_80245BA4(mnDiagram3_804D6C20); + + { + HSD_GObjProc* proc; + proc = HSD_GObjProc_8038FD54(GObj_Create(0, 1, 0x80), fn_802461BC, 0); + proc->flags_3 = HSD_GObj_804D783C; + } +} diff --git a/src/melee/mn/mndiagram3.h b/src/melee/mn/mndiagram3.h index 30378deee4..0c2852bf9b 100644 --- a/src/melee/mn/mndiagram3.h +++ b/src/melee/mn/mndiagram3.h @@ -1,7 +1,20 @@ #ifndef MNDIAGRAM3_H #define MNDIAGRAM3_H -void fn_80246F0C(void* arg0); -void mnDiagram3_8024714C(void* arg0); +#include + +#include + +#include +#include + +/* 245BA4 */ void mnDiagram3_80245BA4(HSD_GObj* gobj); +/* 246D40 */ void mnDiagram3_80246D40(HSD_GObj* gobj); +/* 246E04 */ void fn_80246E04(HSD_GObj* gobj); +/* 246E64 */ void fn_80246E64(HSD_GObj* gobj); +/* 246F0C */ void fn_80246F0C(void* arg0); +/* 246F2C */ void mnDiagram3_80246F2C(Diagram3* data, int arg1); +/* 247008 */ void mnDiagram3_80247008(int arg0); +/* 24714C */ void mnDiagram3_8024714C(void* arg0); #endif diff --git a/src/melee/mn/mndiagram3.static.h b/src/melee/mn/mndiagram3.static.h new file mode 100644 index 0000000000..2bf6945ca2 --- /dev/null +++ b/src/melee/mn/mndiagram3.static.h @@ -0,0 +1,34 @@ +#ifndef __GALE01_245BA4 +#define __GALE01_245BA4 + +#include "mndiagram2.static.h" // IWYU pragma: export + +#include "mndiagram3.h" // IWYU pragma: export + +#include + +#include + +/* 3EEC10 */ extern AnimLoopSettings mnDiagram3_803EEC10; +/* 3EEC1C */ extern AnimLoopSettings mnDiagram3_803EEC1C; +/* 3EEC28 */ extern u8 mnDiagram3_803EEC28[0x24]; +/* 3EEC4C */ extern u8 mnDiagram3_803EEC4C[0x94]; +/* 4A0844 */ extern mnDiagram_ArchiveData mnDiagram_804A0844; +/* 4A0854 */ extern mnDiagram_ArchiveData mnDiagram_804A0854; +/* 4D4FD8 */ extern char mnDiagram3_804D4FD8[7]; +/* 4D4FE0 */ extern char mnDiagram3_804D4FE0[5]; +/* 4D6C20 */ extern HSD_GObj* mnDiagram3_804D6C20; +/* 4D6C24 */ extern HSD_GObj* mnDiagram3_804D6C24; +/* 4D4B64 */ extern GXColor mn_804D4B64; +/* 4DBFF0 */ extern f64 mnDiagram3_804DBFF0; +/* 4DBFF8 */ extern f32 mnDiagram3_804DBFF8; +/* 4DBFFC */ extern f32 mnDiagram3_804DBFFC; +/* 4DC000 */ extern f64 mnDiagram3_804DC000; +/* 4DC008 */ extern f32 mnDiagram3_804DC008; +/* 4DC00C */ extern f32 mnDiagram3_804DC00C; +/* 4DC010 */ extern f32 mnDiagram3_804DC010; +/* 4DC014 */ extern f32 mnDiagram3_804DC014; + +/* 2461BC */ void fn_802461BC(HSD_GObj* gobj); + +#endif diff --git a/src/melee/mn/types.h b/src/melee/mn/types.h index dc4aecc6af..ce5fc0ba1e 100644 --- a/src/melee/mn/types.h +++ b/src/melee/mn/types.h @@ -475,6 +475,24 @@ struct Diagram2 { /* 0xC4 */ HSD_Text* header_text; ///< entity name header }; +/// User data for VS Records page 3 (stat rankings screen) +/// Total size: 0x78 bytes +struct Diagram3 { + /* 0x00 */ u8 saved_menu; + /* 0x01 */ u8 saved_selection; + /* 0x02 */ u8 pad_2[2]; + /* 0x04 */ u8 scroll_offset; + /* 0x05 */ u8 anim_state; + /* 0x06 */ u8 is_name_mode; + /* 0x07 */ u8 pad_7; + /* 0x08 */ HSD_JObj* jobjs[10]; + /* 0x30 */ HSD_Text* row_labels[10]; + /* 0x58 */ HSD_Text* title_text; + /* 0x5C */ HSD_Text* value_text; + /* 0x60 */ HSD_Text* row_icons[5]; + /* 0x74 */ HSD_GObj* popup_gobj; +}; + /// VS Records stat types for mnDiagram2 (page 2 of VS Records menu). /// Fighter mode shows stats 0x00-0x14 (21 types). /// Name mode shows stats 0x00-0x17 (24 types, including character icon stats).