#ifndef GUARD_struct_sub80095e4_H #define GUARD_struct_sub80095e4_H #include "structs/menu.h" #include "structs/str_text.h" s32 sub_80095E4(s32 a0, s32 a1); s32 sub_8009614(s32 a0, s32 a1); // Struct related with sub_80095E4 typedef struct struct_Sub80095E4 { /* 0x0 */ MenuInputStruct input; u32 unk34; UnkTextStruct2 *unk38; UnkTextStruct2 unk3C[4]; // size: 0x9C } struct_Sub80095E4; // Has 1 additional array. // size: 0xA0 typedef struct struct_Sub80095E4_2 { /* 0x0 */ struct_Sub80095E4 s0; // s as in 'struct' ; decided to go against unk as to not have `->unk0->unk3C` UnkTextStruct2_sub2 unk9C; } struct_Sub80095E4_2; // Note: In order to get matching ASM, this macro had to be created. // It's probable the code below is not exactly how it was originally written, but it generates the same asm. #define SUB_8009_MATCH(ptr, _a0) \ { \ s16 a0 = (_a0); \ UNUSED s32 a0_ = a0; \ UNUSED s16 oldE = (ptr).unk3C[(ptr).unk34].unkE; \ UNUSED s32 new10 = a0 + 2; \ s16 newE = a0; \ \ (ptr).unk3C[(ptr).unk34].unkE = newE; \ (ptr).unk3C[(ptr).unk34].unk10 = a0 + 2; \ \ ResetUnusedInputStruct(); \ xxx_call_save_unk_text_struct_800641C((ptr).unk3C, TRUE, TRUE); \ } #define SUB_80095E4_CALL(ptr) \ { \ SUB_8009_MATCH(ptr, sub_80095E4((ptr).input.unk1A, 12) + 2) \ } // For sub_801C440 and sub_8023420 where unkE and unk10 are the same. #define SUB_80095E4_CALL_2(ptr) \ { \ s32 a0 = sub_80095E4((ptr).input.unk1A, 12) + 2; \ UNUSED s16 oldE = (ptr).unk3C[(ptr).unk34].unkE; \ s16 newE = a0; \ \ (ptr).unk3C[(ptr).unk34].unkE = newE; \ (ptr).unk3C[(ptr).unk34].unk10 = newE; \ \ ResetUnusedInputStruct(); \ xxx_call_save_unk_text_struct_800641C((ptr).unk3C, TRUE, TRUE); \ } // sub_802BF30 and sub_802C328 use a different function call, and 24 instead of 12 #define SUB_8009614_CALL(ptr) \ { \ SUB_8009_MATCH(ptr, sub_8009614((ptr).input.unk1A, 24) + 2) \ } #endif // GUARD_struct_sub80095e4_H