diff --git a/include/structs.h b/include/structs.h index b42f20c5..e78ad9e3 100644 --- a/include/structs.h +++ b/include/structs.h @@ -265,7 +265,7 @@ typedef struct LevelHeader { /* 0x9E */ u8 bgColorGreen; /* 0x9F */ u8 bgColorBlue; /* 0xA0 */ s32 unkA0; - /* 0xA4 */ s32 unkA4; + /* 0xA4 */ TextureHeader *unkA4; /* 0xA8 */ u16 unkA8; /* 0xAA */ u16 unkAA; /* 0xAC */ PulsatingLightData *pulseLightData; diff --git a/lib/src/unknown_0CE200.c b/lib/src/unknown_0CE200.c index da2a628a..25b26541 100644 --- a/lib/src/unknown_0CE200.c +++ b/lib/src/unknown_0CE200.c @@ -4,7 +4,7 @@ #include "types.h" #include "macros.h" #include "libultra_internal.h" -#include "memory.h" +#include "../src/memory.h" s32 D_800E38D0 = 0; diff --git a/src/audio.c b/src/audio.c index 4eba2df4..b3a3ffdf 100644 --- a/src/audio.c +++ b/src/audio.c @@ -683,13 +683,15 @@ u16 func_80001CB8(u16 arg0) { GLOBAL_ASM("asm/non_matchings/audio/func_80001D04.s") -void func_80001EA8(u16 arg0, unknown_struct_80001EA8 arg1, u32 *arg2) { - if(arg2 == NULL){ - arg2 = &D_80115F84; +void func_80001EA8(u16 arg0, f32 x, f32 y, f32 z, s32 **arg4) { + if (arg4 == NULL) { + arg4 = &D_80115F84; } - func_80001D04(arg0, arg2); - if(*arg2){ - func_80009B7C(*arg2, arg1.unk00, arg1.unk04, arg1.unk08); + + func_80001D04(arg0, arg4); + + if (*arg4 != NULL) { + func_80009B7C(*arg4, x, y, z); } } diff --git a/src/audio.h b/src/audio.h index dcf4e8b6..bd48a1a3 100644 --- a/src/audio.h +++ b/src/audio.h @@ -23,12 +23,6 @@ extern s32 D_800DC66C; extern u8 D_800DC670; extern u8 D_800DC65C; -typedef struct unknown_struct_80001EA8_s{ - u32 unk00; - u32 unk04; - u32 unk08; -}unknown_struct_80001EA8; - /* Size: 0x0A bytes */ typedef struct unk80115D18 { u8 pad0[6]; @@ -112,7 +106,7 @@ void play_sound(u8 arg0); u32 func_80001C08(void); void func_80001C5C(u16 arg0); u16 func_80001CB8(u16 arg0); -void func_80001EA8(u16 arg0, unknown_struct_80001EA8 arg1, u32 *arg2); +void func_80001EA8(u16 arg0, f32 x, f32 y, f32 z, s32 **arg4); void func_80001F14(u16 sndIndx, u32 *arg1); u16 ALBankFile_80115D14_GetSoundCount(void); u8 ALSeqFile_80115CF8_GetSeqCount(void); @@ -130,5 +124,6 @@ void func_8000232C(ALCSPlayer *seqp, void *ptr, u8 *arg2, ALCSeq *seq); //Non Ma f32 func_800015F8(void); //Non Matching void func_80001FB8(u16 arg0); //Non Matching void func_8000232C(ALCSPlayer *seqp, void *ptr, u8 *arg2, ALCSeq *seq); // Non Matching +void func_80009B7C(s32 *arg0, f32 x, f32 y, f32 z); // Non Matching #endif diff --git a/src/camera.c b/src/camera.c index 60166422..b0a89a50 100644 --- a/src/camera.c +++ b/src/camera.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x80065EA0 */ #include "camera.h" +#include "audio.h" extern u32 osTvType; diff --git a/src/camera.h b/src/camera.h index ad631dd6..67133aef 100644 --- a/src/camera.h +++ b/src/camera.h @@ -108,7 +108,6 @@ extern s32 D_A4000000; extern s32 SP_IMEM; //TODO: Remove from here once header files for below are created with these signatures. - void func_800014BC(f32 arg0); //audio.c s8* get_misc_asset(s32 arg0); //unknown_00BC20 void func_8006F870(Matrix, Matrix); //unknown_070110 s16 get_level_segment_index_from_position(f32 xPos, f32 yPos, f32 zPos); //unknown_0255E0 diff --git a/src/fade_transition.c b/src/fade_transition.c index 7b0ace38..0adaa99e 100644 --- a/src/fade_transition.c +++ b/src/fade_transition.c @@ -406,7 +406,7 @@ GLOBAL_ASM("asm/non_matchings/fade_transition/func_800C0B00.s") GLOBAL_ASM("asm/non_matchings/fade_transition/func_800C1130.s") void render_fade_barndoor_horizontal(Gfx **dlist, s32 arg1, s32 arg2) { - func_8007B3D0(); + func_8007B3D0(dlist); gSPDisplayList((*dlist)++, D_800E3648) // TODO: Need to clean this up. gDkrVertices((*dlist)++, (s32)D_800E31C0[D_800E31D0[0]] + 0x80000000, (((s32)D_800E31C0[D_800E31D0[0]] + 0x80000000) & 6) | 0x58, 0x70) @@ -416,7 +416,7 @@ void render_fade_barndoor_horizontal(Gfx **dlist, s32 arg1, s32 arg2) { // This is exactly the same as render_fade_barndoor_horizontal; I wonder what gets changed then? void render_fade_barndoor_vertical(Gfx **dlist, s32 arg1, s32 arg2) { - func_8007B3D0(); + func_8007B3D0(dlist); gSPDisplayList((*dlist)++, D_800E3648) // TODO: Need to clean this up. gDkrVertices((*dlist)++, (s32)D_800E31C0[D_800E31D0[0]] + 0x80000000, (((s32)D_800E31C0[D_800E31D0[0]] + 0x80000000) & 6) | 0x58, 0x70) @@ -430,7 +430,7 @@ GLOBAL_ASM("asm/non_matchings/fade_transition/func_800C1EE8.s") #ifdef NON_MATCHING void render_fade_circle(Gfx **dlist, s32 arg1, s32 arg2) { u8 *addr, *addr2; - func_8007B3D0(); + func_8007B3D0(dlist); gSPDisplayList((*dlist)++, D_800E3648) addr = (D_800E31C0[D_800E31D0[0]] + 0x80000000); addr2 = (D_800E31C8[D_800E31D0[0]] + 0x80000000); @@ -476,7 +476,7 @@ GLOBAL_ASM("asm/non_matchings/fade_transition/render_fade_waves.s") #endif void render_fade_barndoor_diagonal(Gfx **dlist, s32 arg1, s32 arg2) { - func_8007B3D0(); + func_8007B3D0(dlist); gSPDisplayList((*dlist)++, D_800E3648) // TODO: Need to clean this up. gDkrVertices((*dlist)++, (s32)D_800E31C0[D_800E31D0[0]] + 0x80000000, (((s32)D_800E31C0[D_800E31D0[0]] + 0x80000000) & 6) | 0x48, 0x5E) diff --git a/src/fade_transition.h b/src/fade_transition.h index eda3d6a9..f753dc99 100644 --- a/src/fade_transition.h +++ b/src/fade_transition.h @@ -54,4 +54,4 @@ void func_800C2640(FadeTransition *transition); //Non Matching s32 func_800C018C(void); //Non Matching s32 func_800C01D8(FadeTransition *transition); //Non Matching -#endif \ No newline at end of file +#endif diff --git a/src/font.c b/src/font.c index 98fac4c6..b1a80578 100644 --- a/src/font.c +++ b/src/font.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x800C3C00 */ #include "font.h" +#include "menu.h" /************ .data ************/ diff --git a/src/font.h b/src/font.h index 2b4323ec..d2547fb2 100644 --- a/src/font.h +++ b/src/font.h @@ -12,6 +12,7 @@ #include "asset_sections.h" #include "libultra_internal.h" #include "f3ddkr.h" +#include "textures_sprites.h" typedef struct unk8012A7E8_24 { u8 unk00; @@ -124,9 +125,6 @@ typedef struct FontData { #define unk8012A7E8_TOTAL_SIZE (sizeof(unk8012A7E8) * unk8012A7E8_COUNT) #define unk8012A7EC_TOTAL_SIZE (sizeof(unk8012A7EC) * unk8012A7EC_COUNT) -f32 func_8009E9B0(s32 arg0, Gfx **arg1, s32 *arg2, s32 *arg3); //menu.c -void func_8009E9A0(void); //menu.c -void func_8009E9A8(void); //menu.c //TextureHeader *load_texture(s32 arg0); //texture_sprites.c NON_MATCHING void load_fonts(void); diff --git a/src/game_text.c b/src/game_text.c index aa1d6368..4e84629e 100644 --- a/src/game_text.c +++ b/src/game_text.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x800C29F0 */ #include "game_text.h" +#include "menu.h" /************ .data ************/ diff --git a/src/game_text.h b/src/game_text.h index 846210f6..929f781d 100644 --- a/src/game_text.h +++ b/src/game_text.h @@ -23,8 +23,6 @@ extern u32 osTvType; void func_8005A3B0(void); //unknown_043920.c s32 func_8000C8B4(s32 arg0); //unknown_00BC20.c -void func_8009CFB0(void); //menu.c -s32 func_8009CFEC(u32 arg0); //menu.c void func_800C29F0(void); void func_800C2AB4(void); diff --git a/src/gzip.h b/src/gzip.h index b64b9006..8f5b32fe 100644 --- a/src/gzip.h +++ b/src/gzip.h @@ -23,7 +23,6 @@ s32 byteswap32(u8 *arg0); s32 get_asset_uncompressed_size(s32 assetIndex, s32 assetOffset); u8 *gzip_inflate(u8 *compressedInput, u8 *decompressedOutput); - s32 gzip_inflate_block(void); // Non Matching void gzip_huft_build(u32 *b, u32 n, u32 s, u16 *d, u16 *e, huft **t, s32 *m); // Non Matching diff --git a/src/memory.c b/src/memory.c index 4b2a51e9..32536f4f 100644 --- a/src/memory.c +++ b/src/memory.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x80070B30 */ #include "memory.h" +#include "printf.h" /************ .rodata ************/ @@ -40,7 +41,7 @@ s32 D_80123ED0[64]; s32 D_80123FD0[8]; s32 D_80123FF0[8]; -extern MemoryPoolSlot *gMainMemoryPool; +extern MemoryPoolSlot gMainMemoryPool; /******************************/ diff --git a/src/menu.c b/src/menu.c index fecd8a46..038413f7 100644 --- a/src/menu.c +++ b/src/menu.c @@ -12,6 +12,13 @@ #include "structs.h" #include "f3ddkr.h" #include "video.h" +#include "audio.h" +#include "camera.h" +#include "font.h" +#include "game_text.h" +#include "object_models.h" +#include "printf.h" +#include "textures_sprites.h" /** * @file Contains all the code used for every menu in the game. @@ -22,13 +29,6 @@ // The bss section needs to stay above the data section! // Otherwise the bss variables will get reordered, which is bad. - -typedef struct unk801263C0 { - s8 unk0; - s8 unk1; - s16 unk2; -} unk801263C0; - unk800DFC10 *D_80126390; unk800DFC10 *D_80126394; s32 D_80126398; @@ -45,12 +45,6 @@ unk801263C0 D_801263C0; s32 gIgnorePlayerInput; s32 D_801263C8; - -/* Size: 0xE bytes. */ -typedef struct unk801263CC { - u8 pad0[0xC]; - s16 unkC; -} unk801263CC; unk801263CC (*D_801263CC)[8]; s32 D_801263D0; @@ -91,15 +85,6 @@ s32 D_80126494; s32 D_80126498; s32 D_8012649C; -/* Size: 0x0C Bytes */ -typedef struct unk801264A0 { - u8 unk0; - u8 unk1; - u16 unk2; - char name[4]; - u32 pad8; -} unk801264A0; - unk801264A0 D_801264A0[4]; s32 D_801264D0; @@ -109,17 +94,6 @@ s32 D_801264DC; s8 D_801264E0; s8 D_801264E1; -#define TT_MENU_ROOT 0 -#define TT_MENU_CONT_PAK_ERROR_1 1 -#define TT_MENU_CONT_PAK_ERROR_2 2 -#define TT_MENU_CONT_PAK_ERROR_3 3 -#define TT_MENU_GAME_STATUS 4 -#define TT_MENU_INTRODUCTION 5 -#define TT_MENU_INSERT_CONT_PAK 6 -#define TT_MENU_INSERT_RUMBLE_PAK 7 -#define TT_MENU_SAVE_GHOST 8 -#define TT_MENU_EXIT 10 - s8 D_801264E2; s8 D_801264E2; @@ -1168,11 +1142,6 @@ s16 *D_800E14BC[32] = { NULL, NULL, &D_800E13A8[0], &D_800E13A8[48] }; -typedef struct unk800E153C { - TextureHeader *texture; - u32 unk4; // Flags? -} unk800E153C; - unk800E153C D_800E153C[] = { { NULL, 0x00000000 }, { NULL, 0x00400000 }, @@ -1539,59 +1508,6 @@ const char D_800E8250[] = "loadFrontEndItem() - Item no %d out of range 0-%d\n"; /*********************************/ -Settings *get_settings(void); -void func_8009C4A8(s16 *arg0); -void func_8009C674(s16 *arg0); -void func_8008E4B0(void); -s8 *get_misc_asset(s32 arg0); -void func_80001D04(s32, s32*); -void update_camera_fov(f32 arg0); -void func_8009C508(s32 arg0); -void *allocate_from_main_pool_safe(s32, u32); -void func_800C4170(s32 arg0); -void play_music(s32 arg0); -void render_textured_rectangle(Gfx **dlist, DrawTexture *arg1, s32 arg2, s32 arg3, u8 red, u8 green, u8 blue, u8 alpha); -void func_8007B3D0(Gfx **dlist); -void func_8009BD5C(void); -void load_level_for_menu(s32, s32, s32); -void func_8008CACC(void); -void reset_character_id_slots(void); -void func_80000FDC(s32, s32, f32); -void decompress_filename_string(u32 compressedFilename, char *output, s32 length); -void calculate_and_display_rom_checksum(void); -void func_800851FC(void); -void set_music_volume_slider(s32); -s32 music_is_playing(void); -void set_text_color(s32 red, s32 green, s32 blue, s32 alpha, s32 opacity); -void func_80082FAC(void); -void func_8009ABAC(void); -void func_800C31EC(s32); //game_text.h -void update_controller_sticks(void); -void func_80078D00(Gfx**, void *element, s32, s32, f32, f32, u32, s32); - -void reset_controller_sticks(void); -void menu_logos_screen_init(void); -void menu_title_screen_init(void); -void menu_options_init(void); -void menu_audio_options_init(void); -void menu_save_options_init(void); -void menu_magic_codes_init(void); -void menu_magic_codes_list_init(void); -void menu_character_select_init(void); -void menu_game_select_init(void); -void menu_file_select_init(void); -void menu_track_select_init(void); -void menu_5_init(void); -void menu_11_init(void); -void menu_trophy_race_round_init(void); -void menu_trophy_race_rankings_init(void); -void menu_23_init(void); -void menu_ghost_data_init(void); -void menu_credits_init(void); -void menu_boot_init(void); -void menu_caution_init(void); -void func_80001844(void); - #ifdef NON_MATCHING // Should be functionally equivalent @@ -2349,8 +2265,6 @@ s32 menu_logo_screen_loop(s32 arg0) { return 0; } -void set_magic_code_flags(s32 flags); - void func_80082FAC(void) { if (D_80126448 & 2) { set_magic_code_flags(2); @@ -2478,10 +2392,6 @@ void func_800841B8(s32 arg0) { } #ifdef NON_MATCHING - -void func_80084734(void); -void set_language(s32 language); - // Should be functionally equivalent s32 menu_options_loop(s32 arg0) { s32 buttonsPressed; @@ -2517,7 +2427,7 @@ s32 menu_options_loop(s32 arg0) { if ((buttonsPressed & B_BUTTON) || ((buttonsPressed & (A_BUTTON | START_BUTTON)) && D_800DF460 == 5)) { // Leave the option menu - func_80000C98(-0x80, D_800DF460, analogX); + func_80000C98(-0x80); gMenuDelay = -1; func_800C01D8(&D_800DF774); func_80001D04(0x241, 0); @@ -2538,12 +2448,12 @@ s32 menu_options_loop(s32 arg0) { // Enable/Disable subtitles. if (D_80126448 & 0x2000000) { func_80001D04(0xEB, 0); - func_8009EABC(0, 0x2000000); + func_8009EABC(0); func_800C2AF4(0); gOptionMenuStrings[1] = gMenuText[183]; } else { func_80001D04(0xEB, 0); - func_8009EA78(0, 0x2000000); + func_8009EA78(0); func_800C2AF4(1); gOptionMenuStrings[1] = gMenuText[182]; } @@ -2603,8 +2513,6 @@ void func_80084734(void) { func_800C422C(2); } -void func_8009C8A4(s16 *arg0); - void menu_audio_options_init(void) { gOptionsMenuItemIndex = 0; D_801263BC = 0; @@ -2833,15 +2741,6 @@ void menu_save_options_init(void) { GLOBAL_ASM("asm/non_matchings/menu/func_800853D0.s") GLOBAL_ASM("asm/non_matchings/menu/func_80085B9C.s") -/* Size: 0x10 Bytes */ -typedef struct unk800860A8 { - s8 unk0; - u8 pad1[0x5]; - s8 unk6; - u8 pad7[0x5]; - s32 unkC; -} unk800860A8; - s32 func_800860A8(s32 arg0, s32 *arg1, unk800860A8 *arg2, s32 *arg3, s32 arg4) { s32 temp_v1; s32 phi_t0; @@ -2871,19 +2770,6 @@ s32 func_800860A8(s32 arg0, s32 *arg1, unk800860A8 *arg2, s32 *arg3, s32 arg4) { return phi_t0; } -/* Size: 0x10 bytes */ -typedef struct unk800861C8 { - u8 unk0; - u8 unk1; - u8 unk2; - u8 pad3; - u16 pad4; - s8 unk6; - s8 pad7; - u32 pad8; - u32 unkC; -} unk800861C8; - void func_800861C8(unk800861C8 *arg0, s32 *arg1) { s32 i; for(i = 0; i < 3; i++) { @@ -3015,11 +2901,6 @@ void menu_boot_init(void) { } #ifdef NON_MATCHING -void func_800887E8(void); -void func_800887C4(void); -s32 func_800C018C(void); -s32 func_800890AC(s32); - s32 menu_boot_loop(s32 arg0) { // arg0 = sp30 s32 out; // sp2C @@ -3376,9 +3257,6 @@ void func_8008A8F8(s32 arg0, s32 arg1, s32 arg2) { } #ifdef NON_MATCHING - -void func_8008AD1C(void); - s32 menu_magic_codes_list_loop(s32 arg0) { s32 phi_a2; s32 sp48; @@ -3838,10 +3716,6 @@ void menu_caution_init(void) { gPlayerHasSeenCautionMenu = 1; } -void func_8008C4E8(void); - -void draw_menu_elements(s32, MenuElement*, f32); - s32 menu_caution_loop(s32 arg0) { if (gMenuDelay != 0) { gMenuDelay += arg0; @@ -4146,7 +4020,7 @@ void render_file_select_menu(s32 arg0) { for (i = 0; i < 3; i++) { if (D_801264A0[i].unk1 != 0) { s2 = 0xB; - func_8007BF1C(0, 0xFF); + func_8007BF1C(0); if (D_801264A0[i].unk0 != 0) { s2 = 0xC; } @@ -4366,20 +4240,8 @@ GLOBAL_ASM("asm/non_matchings/menu/menu_track_select_init.s") GLOBAL_ASM("asm/non_matchings/menu/func_8008F00C.s") #ifdef NON_MATCHING - // Close to done with this function. Just a regalloc issue remains. -void func_8008F534(void); -void func_8008FF1C(s32 arg0); -void func_800904E8(s32 arg0); -void func_80090918(s32 arg0); -void func_80090ED8(s32 arg0); -void render_track_select_setup_ui(s32 arg0); -void func_80092188(s32 arg0); -void func_8008E4EC(void); -s32 get_thread30_level_id_to_load(void); -void set_relative_volume_for_music(u8 arg0); - s32 menu_track_select_loop(s32 arg0) { s32 phi_a2; Settings *settings; @@ -4837,7 +4699,7 @@ void menu_5_init(void) { Settings *settings; s32 result; s32 s0; - s32 temp; + s16 temp; settings = get_settings(); gTrackIdForPreview = 0; @@ -4849,13 +4711,13 @@ void menu_5_init(void) { if ((result == 5) || (result == 8) || (!(result & 0x40) && (!(settings->courseFlagsPtr[s0] & 2)))) { temp = D_800E0758[s0]; if (temp != -1) { - func_80000FDC(temp & 0xFFFF, 0, 1.0f); + func_80000FDC(temp, 0, 1.0f); } D_801263E0 = -1; } else { temp = D_800E0758[s0]; if (temp != -1) { - func_80000FDC(temp & 0xFFFF, 0, 0.5f); + func_80000FDC(temp, 0, 0.5f); } func_80000BE0(0x18); play_music(0x18); @@ -4889,9 +4751,6 @@ GLOBAL_ASM("asm/non_matchings/menu/func_80092E94.s") #ifdef NON_MATCHING - -void func_80093A0C(void); - // Regalloc issues s32 menu_5_loop(s32 arg0) { s32 temp0; @@ -5052,13 +4911,13 @@ void func_80094C14(s32 arg0) { D_801263D8 += arg0; switch(D_800DF460) { case 0: - if (func_8000C8B4(0xF0, &D_80126A94) < D_801263D8) { + if (func_8000C8B4(0xF0) < D_801263D8) { func_80000C98(-0x100); D_800DF460 = 1; } break; case 1: - if (func_8000C8B4(0x12C, &D_80126A94) < D_801263D8) { + if (func_8000C8B4(0x12C) < D_801263D8) { func_80000BE0(0x18); play_music(0x18); func_80000C98(0x100); @@ -5109,7 +4968,6 @@ GLOBAL_ASM("asm/non_matchings/menu/func_80095624.s") GLOBAL_ASM("asm/non_matchings/menu/func_80095728.s") -void func_800981E8(void); void func_80096790(void) { s32 temp; @@ -5304,9 +5162,6 @@ void func_80098208(void) { set_time_trial_enabled(0); } -extern s32 D_800E0980; -s8 *get_misc_asset(s32 arg0); - #if 1 GLOBAL_ASM("asm/non_matchings/menu/menu_trophy_race_round_init.s") #else @@ -5497,7 +5352,6 @@ GLOBAL_ASM("asm/non_matchings/menu/menu_ghost_data_init.s") GLOBAL_ASM("asm/non_matchings/menu/func_80099E8C.s") #ifdef NON_MATCHING - // Regalloc issue: v0 & v1 need to swap! s32 menu_ghost_data_loop(s32 arg0) { s32 i; @@ -5754,19 +5608,6 @@ void func_8009BCF0(void) { func_8006F564(0); } -/* Unknown size */ -typedef struct unk80069D20 { - s16 unk0; - s16 unk2; - s16 unk4; - u8 pad6[6]; - f32 unkC; - f32 unk10; - f32 unk14; -} unk80069D20; - -void func_8001D5E0(f32 arg0, f32 arg1, f32 arg2); - void func_8009BD5C(void) { unk80069D20 *temp_v0; s16 sp2A; @@ -6021,11 +5862,6 @@ s32 get_number_of_active_players(void) { return gNumberOfActivePlayers; } -typedef struct unk8006BDB0 { - u8 pad[0x4C]; - s8 unk4C; -} unk8006BDB0; - s32 func_8009C3D8(void) { unk8006BDB0 *temp = (unk8006BDB0*)get_current_level_header(); if (gIsInTwoPlayerAdventure && !gIsInTracksMode) { @@ -6065,11 +5901,6 @@ void func_8009C4A8(s16 *arg0) { } } -void free_texture(u32 arg0); -void free_sprite(u32 arg0); -void gParticlePtrList_addObject(u32 arg0); -void func_8005FF40(u32 arg0); - void func_8009C508(s32 arg0) { if (D_80126750[arg0] != 0) { if (D_80126550[arg0] != 0) { @@ -6116,8 +5947,6 @@ void func_8009C674(s16 *arg0) { GLOBAL_ASM("asm/non_matchings/menu/func_8009C6D4.s") -void func_8009C904(s32 arg0); - void func_8009C8A4(s16 *arg0) { s32 index = 0; while (arg0[index] != -1) { @@ -6125,7 +5954,6 @@ void func_8009C8A4(s16 *arg0) { } } -s32 get_random_number_from_range(s32, s32); void func_8009C904(s32 arg0) { if (D_800DF75C == NULL) { D_800DF75C = allocate_from_main_pool_safe(sizeof(unk800DF510) * 18, COLOR_TAG_RED); diff --git a/src/menu.h b/src/menu.h index 14e691ba..4cf1f908 100644 --- a/src/menu.h +++ b/src/menu.h @@ -3,6 +3,18 @@ #include "types.h" #include "structs.h" +#include "PR/gbi.h" + +#define TT_MENU_ROOT 0 +#define TT_MENU_CONT_PAK_ERROR_1 1 +#define TT_MENU_CONT_PAK_ERROR_2 2 +#define TT_MENU_CONT_PAK_ERROR_3 3 +#define TT_MENU_GAME_STATUS 4 +#define TT_MENU_INTRODUCTION 5 +#define TT_MENU_INSERT_CONT_PAK 6 +#define TT_MENU_INSERT_RUMBLE_PAK 7 +#define TT_MENU_SAVE_GHOST 8 +#define TT_MENU_EXIT 10 #define CHEAT(index) 1 << index @@ -77,6 +89,140 @@ enum Language { JAPANESE }; +/* Size: 0x20 bytes */ +typedef struct unk800DF510 { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; + f32 unk8; + f32 unkC; + f32 unk10; + f32 unk14; + s16 unk18; + s8 unk1A; + s8 unk1B; + s8 unk1C; + s8 unk1D; + u8 pad1E[2]; +} unk800DF510; + +typedef struct unk80126460 { + MenuElement elem[2]; +} unk80126460; + +typedef struct unk801263C0 { + s8 unk0; + s8 unk1; + s16 unk2; +} unk801263C0; + +/* Size: 0x30 bytes */ +typedef struct unk800DF83C { + char *unk0; // Pointer to ascii text. + f32 unk4; + f32 unk8; + f32 unkC; + f32 unk10; + f32 unk14; + f32 unk18; + f32 unk1C; + f32 unk20; + f32 unk24; + f32 unk28; +} unk800DF83C; + +typedef struct unk800DFA3C { + s16 unk0; + s16 unk2; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; + u32* unkC; +} unk800DFA3C; + +typedef struct unk800DFC10 { + u32 *unk0; + s16 unk4; + s16 unk6; + u32 *unk8; + s32 unkC; +} unk800DFC10; + +typedef struct unk800E03CC { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; + s16 unk8; + s16 unkA; + s16 unkC; + s16 unkE; +} unk800E03CC; + +/* Size: 0xE bytes. */ +typedef struct unk801263CC { + u8 pad0[0xC]; + s16 unkC; +} unk801263CC; + +/* Size: 0x0C Bytes */ +typedef struct unk801264A0 { + u8 unk0; + u8 unk1; + u16 unk2; + char name[4]; + u32 pad8; +} unk801264A0; + +typedef struct unk800E153C { + TextureHeader *texture; + u32 unk4; // Flags? +} unk800E153C; + +/* Size: 0x10 Bytes */ +typedef struct unk800860A8 { + s8 unk0; + u8 pad1[0x5]; + s8 unk6; + u8 pad7[0x5]; + s32 unkC; +} unk800860A8; + +/* Size: 0x10 bytes */ +typedef struct unk800861C8 { + u8 unk0; + u8 unk1; + u8 unk2; + u8 pad3; + u16 pad4; + s8 unk6; + s8 pad7; + u32 pad8; + u32 unkC; +} unk800861C8; + +/* Unknown size */ +typedef struct unk80069D20 { + s16 unk0; + s16 unk2; + s16 unk4; + u8 pad6[6]; + f32 unkC; + f32 unk10; + f32 unk14; +} unk80069D20; + +typedef struct unk8006BDB0 { + u8 pad[0x4C]; + s8 unk4C; +} unk8006BDB0; + extern s8 D_800DF450; extern f32 D_800DF454; extern s32 D_800DF458; @@ -125,24 +271,6 @@ extern s8 D_800DF4EC; // Unused? extern s32 D_800DF4F0[]; -/* Size: 0x20 bytes */ -typedef struct unk800DF510 { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - f32 unk8; - f32 unkC; - f32 unk10; - f32 unk14; - s16 unk18; - s8 unk1A; - s8 unk1B; - s8 unk1C; - s8 unk1D; - u8 pad1E[2]; -} unk800DF510; - extern unk800DF510 D_800DF510[18]; extern s16 *D_800DF750[1]; @@ -168,21 +296,6 @@ extern s16 D_800DF7C4[12]; extern DrawTexture D_800DF7DC[12]; -/* Size: 0x30 bytes */ -typedef struct unk800DF83C { - char *unk0; // Pointer to ascii text. - f32 unk4; - f32 unk8; - f32 unkC; - f32 unk10; - f32 unk14; - f32 unk18; - f32 unk1C; - f32 unk20; - f32 unk24; - f32 unk28; -} unk800DF83C; - // Title screen cinematic text extern unk800DF83C D_800DF83C[10]; @@ -194,20 +307,6 @@ extern char *gOptionMenuStrings[7]; extern s16 D_800DFA2C[8]; -typedef struct unk800DFA3C { - s16 unk0; - s16 unk2; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u8 unk8; - u8 unk9; - u8 unkA; - u8 unkB; - u32* unkC; -} unk800DFA3C; - extern unk800DFA3C gAudioMenuStrings[8]; extern s32 D_800DFABC; @@ -242,14 +341,6 @@ extern s32* D_800DFBE0[10]; extern s32 D_800DFC08; extern s32 D_800DFC0C; -typedef struct unk800DFC10 { - u32 *unk0; - s16 unk4; - s16 unk6; - u32 *unk8; - s32 unkC; -} unk800DFC10; - extern unk800DFC10 D_800DFC10; extern unk800DFC10 D_800DFC20; extern unk800DFC10 D_800DFC30; @@ -303,17 +394,6 @@ extern s16 D_800E0398[6]; extern s16 D_800E03A4[6]; -typedef struct unk800E03CC { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; - s16 unkC; - s16 unkE; -} unk800E03CC; - extern unk800E03CC D_800E03CC[3]; extern s16 D_800E03FC[10]; @@ -565,8 +645,179 @@ extern s16 D_800E1E2C[10]; extern s16 D_800E1E40[10]; -typedef struct unk80126460 { - MenuElement elem[2]; -} unk80126460; +Settings *get_settings(void); //src/unknown_06B2B0.c +s8* get_misc_asset(s32 arg0); //unknown_00BC20 +void render_textured_rectangle(Gfx **dlist, DrawTexture *arg1, + s32 arg2, s32 arg3, u8 red, u8 green, u8 blue, u8 alpha); // Non Matching src/unknown_078050.c +void load_level_for_menu(s32 levelId, s32 numberOfPlayers, s32 cutsceneId); //src/unknown_06B2B0.c +void func_80078D00(Gfx**, void *element, s32, s32, f32, f32, u32, s32); //Non Matching src/unknown_078050.c +s32 get_thread30_level_id_to_load(void); //src/thread30.c +void func_8001D5E0(f32 arg0, f32 arg1, f32 arg2); //unknown_00BC20 +void gParticlePtrList_addObject(Object *object); //src/unknown_00BC20.c +s32 get_random_number_from_range(s32, s32); // Non Matching src/unknown_070110.c + +void func_8007FF88(void); +void func_80080E6C(void); +void func_800813C0(void); +void menu_init(u32 menuId); +s32 menu_loop(Gfx **arg0, s32 **arg1, s32 **arg2, s32 **arg3, s32 arg4); +void func_80081800(s32 arg0, s32 arg1, s32 arg2, u8 arg3, u8 arg4, u8 arg5, u8 arg6); +void func_80081E54(s32 arg0, f32 arg1, f32 arg2, f32 arg3, s32 arg4, s32 arg5); +void func_800828B8(void); +void func_800829F8(s32 arg0, s32 arg1); +void menu_logos_screen_init(void); +s32 menu_logo_screen_loop(s32 arg0); +void func_80082FAC(void); +void menu_title_screen_init(void); +void func_80084118(void); +void menu_options_init(void); +void func_800841B8(s32 arg0); +void func_80084734(void); +void menu_audio_options_init(void); +void func_800851FC(void); +void menu_save_options_init(void); +s32 func_800860A8(s32 arg0, s32 *arg1, unk800860A8 *arg2, s32 *arg3, s32 arg4); +void func_800861C8(unk800861C8 *arg0, s32 *arg1); +s32 func_800874D0(s32 arg0, s32 arg1); +s32 func_800875E4(s32 arg0, s32 arg1); +s32 func_800876CC(s32 arg0, s32 arg1); +void func_80087EB8(void); +void menu_boot_init(void); +void func_800887C4(void); +void func_800887E8(void); +void func_800895A4(void); +void func_8008A4C8(void); +void menu_magic_codes_list_init(void); +void func_8008A8F8(s32 arg0, s32 arg1, s32 arg2); +void func_8008AD1C(void); +void func_8008AEB4(s32 arg0, s32 *arg1); +void set_active_player_index(s32 controllerIndex); +void menu_character_select_init(void); +void draw_character_select_text(s32 arg0); +void func_8008BFE8(s32 arg0, s8 *arg1, s32 arg2, u16 arg3, u16 arg4); +void func_8008C128(void); +void menu_caution_init(void); +void func_8008C4E8(void); +void func_8008CACC(void); +void menu_file_select_init(void); +void func_8008CC28(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6); +void func_8008E428(void); +void func_8008E45C(void); +void func_8008E4B0(void); +void func_8008F534(void); +void func_80090ED8(s32 arg0); +s32 func_80092BE0(s32 arg0); +void menu_5_init(void); +void func_80093A0C(void); +void n_alSynRemovePlayer(void); +void n_alSeqpDelete(void); +void func_80094604(void); +void func_80094C14(s32 arg0); +void func_80096790(void); +void menu_11_init(void); +void func_800976CC(void); +void decompress_filename_string(u32 compressedFilename, char *output, s32 length); +s32 compress_filename_string(unsigned char *filename, s32 length); +void func_80097874(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 *arg4, s32 arg5, s32 arg6); +void func_800981E8(void); +void func_80098208(void); +void func_800983C0(s32 arg0); +void func_80098754(void); +void func_80099600(void); +s32 get_trophy_race_world_id(void); +void func_8009ABAC(void); +void func_8009ABD8(s8 *arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); +void menu_23_init(void); +void func_8009AF18(void); +void menu_credits_init(void); +void func_8009B1E4(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +void func_8009BCF0(void); +void func_8009BD5C(void); +void func_8009BE54(); +void reset_controller_sticks(void); +void reset_character_id_slots(void); +s32 get_save_file_index(void); +s32 get_track_id_to_load(void); +s8 get_character_id_from_slot(s32 slot); +s8 get_character_id_from_slot_unused(s32 slot); +s8 get_player_selected_vehicle(s32 playerNum); +void set_player_selected_vehicle(s32 playerNum, s32 index); +s8 *func_8009C274(void); +s8 get_player_character(s32 controllerIndex); +void enable_tracks_mode(s32 boolean); +s32 is_in_tracks_mode(void); +void set_magic_code_flags(s32 flags); +s32 get_filtered_cheats(void); +s32 get_number_of_active_players(void); +s32 func_8009C3D8(void); +s32 get_multiplayer_racer_count(void); +Settings** func_8009C490(void); +void func_8009C49C(void); +void func_8009C4A8(s16 *arg0); +void func_8009C508(s32 arg0); +void func_8009C674(s16 *arg0); +void func_8009C8A4(s16 *arg0); +void func_8009C904(s32 arg0); +void func_8009CA58(void); +void func_8009CF68(s32 arg0); +void func_8009CFB0(void); +s32 func_8009CFEC(u32 arg0); +void func_8009D118(s32 arg0); +void func_8009D1B8(s32 arg0, s32 arg1, s32 arg2); +void func_8009D26C(void); +void func_8009D324(void); +void func_8009D330(s32 arg0); +void func_8009D33C(s32 arg0, s32 arg1); +s32 taj_menu_loop(void); +s32 func_8009D9F4(void); +s32 trophy_race_cabinet_menu_loop(void); +void func_8009E9A0(void); +void func_8009E9A8(void); +f32 func_8009E9B0(s32 arg0, Gfx **arg1, s32 *arg2, s32 *arg3); +s64 *func_8009EA6C(void); +s32 func_8009EA78(s64 arg0); +s32 func_8009EABC(s64 arg0); +s64 func_8009EB08(void); +s32 get_language(void); +void set_language(s32 language); +s32 is_adventure_two_unlocked(void); +s32 is_in_adventure_two(void); +s32 is_in_two_player_adventure(void); +s32 is_tt_unlocked(void); +s32 is_drumstick_unlocked(void); + +// Non Matching functions below here +void load_menu_text(s32 language); // Non Matching +void draw_menu_elements(s32 arg0, MenuElement *elem, f32 arg2); +s32 menu_audio_options_loop(s32 arg0); +s32 menu_options_loop(s32 arg0); +s32 func_800890AC(s32); +s32 menu_boot_loop(s32 arg0); +void menu_magic_codes_init(void); +void render_magic_codes_list_menu_text(s32 arg0); +s32 menu_magic_codes_list_loop(s32 arg0); +void calculate_and_display_rom_checksum(void); +void randomize_ai_racer_slots(s32 arg0); +void menu_game_select_init(void); +void func_8008C698(s32 arg0); +s32 menu_game_select_loop(s32 arg0); +void render_file_select_menu(s32 arg0); +s32 menu_track_select_loop(s32 arg0); +void func_8008FF1C(s32 arg0); +void func_800904E8(s32 arg0); +void func_80090918(s32 arg0); +void render_track_select_setup_ui(s32 arg0); +void func_80092188(s32 arg0); +void func_8008E4EC(void); +s32 menu_5_loop(s32 arg0); +void func_80095624(s32 arg0); +s32 trim_filename_string(u8 *input, u8 *output); +void menu_trophy_race_round_init(void); +void menu_ghost_data_init(void); +s32 menu_ghost_data_loop(s32 arg0); +void update_controller_sticks(void); +s32 tt_menu_loop(void); +void menu_track_select_init(void); +void menu_trophy_race_rankings_init(void); #endif diff --git a/src/object_models.c b/src/object_models.c index d1e04ca7..408e285d 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -1,9 +1,8 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x8005F850 */ -#include "types.h" +#include "object_models.h" #include "macros.h" -#include "structs.h" #include "memory.h" #include "asset_sections.h" @@ -27,12 +26,6 @@ const char D_800E6BE0[] = "MOD Error: Tryed to deallocate non-existent model!!\n /************ .bss ************/ -/* 8 Bytes */ -typedef struct unk8011D624 { - s32 unk0; - ObjectModel *model; -} unk8011D624; - s32 *D_8011D620; unk8011D624 *D_8011D624; // Array of unk8011D624 s32 *D_8011D628; @@ -47,8 +40,6 @@ s32 D_8011D648[66]; /******************************/ -void func_80024D54(void); - void func_8005F850(void) { s32 i; s32 checksum; diff --git a/src/object_models.h b/src/object_models.h index f3f9f294..5181542c 100644 --- a/src/object_models.h +++ b/src/object_models.h @@ -2,8 +2,25 @@ #define _UNKNOWN_060450_H_ #include "types.h" +#include "PR/gbi.h" +#include "structs.h" + +/* 8 Bytes */ +typedef struct unk8011D624 { + s32 unk0; + ObjectModel *model; +} unk8011D624; extern s32 D_800DCEA0; extern s32 D_800DCEA4; -#endif \ No newline at end of file +void func_80024D54(Gfx *, s32, s32, s32, s32); //Non Matching src/unknown_0255E0.c +void func_8005C25C(void); //src/unkown_043920.c + +void func_8005F850(void); +void func_800619F4(s32 arg0); + +void free_object_model(ObjectModel *model); //Non Matching +void func_8005FF40(ObjectModel **modelPtr); //Non Matching + +#endif diff --git a/src/particles.c b/src/particles.c index d881b22e..ee50ae88 100644 --- a/src/particles.c +++ b/src/particles.c @@ -1,10 +1,11 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x800AE270 */ +#include "particles.h" #include "types.h" #include "macros.h" -#include "structs.h" #include "asset_sections.h" +#include "memory.h" /************ .rodata ************/ @@ -35,68 +36,6 @@ const char D_800E8B44[] = "\nError :: particle %x is not indexed correctly in tr /*********************************/ -/* Size: 0xA0 bytes */ -typedef struct ParticleBehavior { - s32 flags; - f32 unk4; - f32 unk8; - f32 unkC; - u8 pad10[4]; - s16 unk14; - s16 unk16; - s16 unk18; - s16 unk1A; - s16 unk1C; - s16 unk1E; - s16 unk20; - s16 unk22; - s16 unk24; - s16 unk26; - u8 pad28[0x74]; - s32 *unk9C; -} ParticleBehavior; - -typedef struct unk800AF29C_C_4000 { - f32 unkC; - f32 unk10; - f32 unk14; -} unk800AF29C_C_4000; - -typedef struct unk800AF29C_C_400 { - s32 *unkC; - s16 unk10; - s16 unk12; - s16 unk14; - s16 unk16; -} unk800AF29C_C_400; - -typedef struct unk800AF29C_C { - s16 unkC; - s16 unkE; - s16 unk10; - s16 unk12; - s16 unk14; - s16 unk16; -} unk800AF29C_C; - -typedef struct unk800AF29C { - ParticleBehavior *unk0; - s16 unk4; - u8 unk6; - u8 unk7; - s16 unk8; - s16 unkA; - union { - unk800AF29C_C_4000 unkC_4000; - unk800AF29C_C_400 unkC_400; - unk800AF29C_C unkC; - }; - s16 unk18; - s16 unk1A; - s16 unk1C; - s16 unk1E; -} unk800AF29C; - /************ .data ************/ // I woundn't be suprised if most of these zeroes are really just null pointers. @@ -121,34 +60,19 @@ s32 *D_800E2CE4 = NULL; s32 gParticlesAssetTableCount = 0; s32 *gParticlesAssets = NULL; -typedef struct unk800E2CF0 { - u8 pad0[8]; - s16 unk8; -} unk800E2CF0; - unk800E2CF0 **gParticlesAssetTable = NULL; s32 gParticleBehaviorsAssetTableCount = 0; s32 *gParticleBehaviorsAssets = NULL; ParticleBehavior **gParticleBehaviorsAssetTable = NULL; s32 D_800E2D00[2] = { 0, 0 }; -/* Size: 0x10 bytes */ -typedef struct unk800E2D08 { - s16 unk0, unk2, unk4, unk6, unk8, unkA, unkC, unkE; -} unk800E2D08; - -/* Size: 6 bytes */ -typedef struct unk800E2D58 { - s16 unk0, unk2, unk4; -} unk800E2D58; - // Are these just Triangles? unk800E2D08 D_800E2D08[5] = { { 0x4000, 0x0102, 0x0100, 0x0000, 0x0000, 0x01E0, 0x0100, 0x01E0 }, { 0x4000, 0x0203, 0x0100, 0x0000, 0x0100, 0x01E0, 0x01E0, 0x01E0 }, { 0x4001, 0x0204, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x01E0 }, { 0x4002, 0x0305, 0x0100, 0x0000, 0x01E0, 0x0000, 0x01E0, 0x01E0 }, - { 0x4000, 0x0103, 0x0100, 0x0000, 0x0000, 0x01E0, 0x01E0, 0x01E0 } + { 0x4000, 0x0103, 0x0100, 0x0000, 0x0000, 0x01E0, 0x01E0, 0x01E0 }, }; unk800E2D58 D_800E2D58[5] = { @@ -258,11 +182,6 @@ s32 D_801297E8[6]; /******************************/ -void func_800AE2D8(void); -void func_800AE374(void); -void func_800AE438(void); -void func_800AE490(void); - void func_800AE270(void) { func_800AE374(); func_800AE438(); @@ -347,15 +266,6 @@ void func_800AE490(void) { gParticleBehaviorsAssetTable = NULL; } } - -typedef struct unk800AF024 { - u8 pad0[4]; - s16 unk4; - s16 unk6; - Vertex *unk8; - Triangle *unkC; -} unk800AF024; - #ifdef NON_MATCHING void init_particle_assets(void) { s32 i; @@ -537,29 +447,6 @@ void func_800AF0F0(Object *obj) { temp_v1->unk1C = temp_t8; } -void func_800AF29C(unk800AF29C *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5); - -typedef struct unk800B2260_C { - s32 unk0; - s32 unk4; - u8 pad8[0x32]; - s16 unk3A; - u8 pad3C[0x34]; - void *unk70; // unk800B2260 * - u8 unk74; -} unk800B2260_C; - -typedef struct unk800B2260 { - ParticleBehavior *unk0; - s16 unk4; - u8 unk6; - s16 unk8; - s16 unkA; - unk800B2260_C **unkC; -} unk800B2260; - -void func_800B2260(unk800B2260 *arg0); - #ifdef NON_MATCHING void func_800AF134(unk800B2260 *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5) { if (arg2 >= gParticlesAssetTableCount) { @@ -724,4 +611,3 @@ GLOBAL_ASM("asm/non_matchings/particles/func_800B263C.s") GLOBAL_ASM("asm/non_matchings/particles/func_800B26E0.s") GLOBAL_ASM("asm/non_matchings/particles/func_800B2FBC.s") - diff --git a/src/particles.h b/src/particles.h new file mode 100644 index 00000000..3fe1092b --- /dev/null +++ b/src/particles.h @@ -0,0 +1,133 @@ +#ifndef _PARTICLES_H_ +#define _PARTICLES_H_ + +#include "types.h" +#include "structs.h" + +/* Size: 0xA0 bytes */ +typedef struct ParticleBehavior { + s32 flags; + f32 unk4; + f32 unk8; + f32 unkC; + u8 pad10[4]; + s16 unk14; + s16 unk16; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 unk1E; + s16 unk20; + s16 unk22; + s16 unk24; + s16 unk26; + u8 pad28[0x74]; + s32 *unk9C; +} ParticleBehavior; + +typedef struct unk800AF29C_C_4000 { + f32 unkC; + f32 unk10; + f32 unk14; +} unk800AF29C_C_4000; + +typedef struct unk800AF29C_C_400 { + s32 *unkC; + s16 unk10; + s16 unk12; + s16 unk14; + s16 unk16; +} unk800AF29C_C_400; + +typedef struct unk800AF29C_C { + s16 unkC; + s16 unkE; + s16 unk10; + s16 unk12; + s16 unk14; + s16 unk16; +} unk800AF29C_C; + +typedef struct unk800AF29C { + ParticleBehavior *unk0; + s16 unk4; + u8 unk6; + u8 unk7; + s16 unk8; + s16 unkA; + union { + unk800AF29C_C_4000 unkC_4000; + unk800AF29C_C_400 unkC_400; + unk800AF29C_C unkC; + }; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 unk1E; +} unk800AF29C; + +typedef struct unk800E2CF0 { + u8 pad0[8]; + s16 unk8; +} unk800E2CF0; + +/* Size: 0x10 bytes */ +typedef struct unk800E2D08 { + s16 unk0, unk2, unk4, unk6, unk8, unkA, unkC, unkE; +} unk800E2D08; + +/* Size: 6 bytes */ +typedef struct unk800E2D58 { + s16 unk0, unk2, unk4; +} unk800E2D58; + +typedef struct unk800AF024 { + u8 pad0[4]; + s16 unk4; + s16 unk6; + Vertex *unk8; + Triangle *unkC; +} unk800AF024; + +typedef struct unk800B2260_C { + s32 unk0; + s32 unk4; + u8 pad8[0x32]; + s16 unk3A; + u8 pad3C[0x34]; + void *unk70; // unk800B2260 * + u8 unk74; +} unk800B2260_C; + +//Could be the same as Object_6C +typedef struct unk800B2260 { + ParticleBehavior *unk0; + s16 unk4; + u8 unk6; + s16 unk8; + s16 unkA; + unk800B2260_C **unkC; +} unk800B2260; + +void func_800AE270(void); +void func_800AE2A0(void); +void func_800AE2D8(void); +void func_800AE374(void); +void func_800AE438(void); +void func_800AE490(void); +void func_800AEE14(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); +void func_800AEEB8(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); +void func_800AEF88(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); +void func_800AF024(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); +void func_800AF0A4(Object *obj); +void func_800AF0F0(Object *obj); +void func_800AF1E0(unk800AF29C *arg0, s32 arg1, s32 arg2); +void func_800AF29C(unk800AF29C *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5); +void func_800AF6E4(Object *obj, s32 arg1); +void func_800B2260(unk800B2260 *arg0); + +void func_800AF134(unk800B2260 *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5); // Non Matching +void func_800AF404(s32 arg0); // Non Matching +void func_800B263C(unk800B2260_C *arg0); // Non Matching + +#endif diff --git a/src/printf.c b/src/printf.c index 0fa9b2c3..f70b2b95 100644 --- a/src/printf.c +++ b/src/printf.c @@ -1,37 +1,11 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x800B3140 */ +#include "printf.h" #include "types.h" #include "macros.h" #include "f3ddkr.h" -#define RENDER_PRINTF_CMD_ARG_BYTE(val) *D_801285D8 = val; D_801285D8++; -#define RENDER_PRINTF_CMD_ARG_SHORT(val) RENDER_PRINTF_CMD_ARG_BYTE(val) RENDER_PRINTF_CMD_ARG_BYTE(val >> 8) - -#define RENDER_PRINTF_CMD_END RENDER_PRINTF_CMD_ARG_BYTE(0) - -#define RENDER_PRINTF_CMD_SET_COLOR(red, green, blue, alpha) \ - RENDER_PRINTF_CMD_ARG_BYTE(0x81) \ - RENDER_PRINTF_CMD_ARG_BYTE(red) \ - RENDER_PRINTF_CMD_ARG_BYTE(green) \ - RENDER_PRINTF_CMD_ARG_BYTE(blue) \ - RENDER_PRINTF_CMD_ARG_BYTE(alpha) \ - RENDER_PRINTF_CMD_END - -#define RENDER_PRINTF_CMD_SET_POSITION(x, y) \ - RENDER_PRINTF_CMD_ARG_BYTE(0x82) \ - RENDER_PRINTF_CMD_ARG_SHORT(x) \ - RENDER_PRINTF_CMD_ARG_SHORT(y) \ - RENDER_PRINTF_CMD_END - -#define RENDER_PRINTF_CMD_SET_BACKGROUND_COLOR(red, green, blue, alpha) \ - RENDER_PRINTF_CMD_ARG_BYTE(0x85) \ - RENDER_PRINTF_CMD_ARG_BYTE(red) \ - RENDER_PRINTF_CMD_ARG_BYTE(green) \ - RENDER_PRINTF_CMD_ARG_BYTE(blue) \ - RENDER_PRINTF_CMD_ARG_BYTE(alpha) \ - RENDER_PRINTF_CMD_END - /************ .data ************/ s32 D_800E2EF0 = 0; diff --git a/src/printf.h b/src/printf.h new file mode 100644 index 00000000..be90e947 --- /dev/null +++ b/src/printf.h @@ -0,0 +1,42 @@ +#ifndef _PRINTF_H_ +#define _PRINTF_H_ + +#include "types.h" + + +#define RENDER_PRINTF_CMD_ARG_BYTE(val) *D_801285D8 = val; D_801285D8++; +#define RENDER_PRINTF_CMD_ARG_SHORT(val) RENDER_PRINTF_CMD_ARG_BYTE(val) RENDER_PRINTF_CMD_ARG_BYTE(val >> 8) + +#define RENDER_PRINTF_CMD_END RENDER_PRINTF_CMD_ARG_BYTE(0) + +#define RENDER_PRINTF_CMD_SET_COLOR(red, green, blue, alpha) \ + RENDER_PRINTF_CMD_ARG_BYTE(0x81) \ + RENDER_PRINTF_CMD_ARG_BYTE(red) \ + RENDER_PRINTF_CMD_ARG_BYTE(green) \ + RENDER_PRINTF_CMD_ARG_BYTE(blue) \ + RENDER_PRINTF_CMD_ARG_BYTE(alpha) \ + RENDER_PRINTF_CMD_END + +#define RENDER_PRINTF_CMD_SET_POSITION(x, y) \ + RENDER_PRINTF_CMD_ARG_BYTE(0x82) \ + RENDER_PRINTF_CMD_ARG_SHORT(x) \ + RENDER_PRINTF_CMD_ARG_SHORT(y) \ + RENDER_PRINTF_CMD_END + +#define RENDER_PRINTF_CMD_SET_BACKGROUND_COLOR(red, green, blue, alpha) \ + RENDER_PRINTF_CMD_ARG_BYTE(0x85) \ + RENDER_PRINTF_CMD_ARG_BYTE(red) \ + RENDER_PRINTF_CMD_ARG_BYTE(green) \ + RENDER_PRINTF_CMD_ARG_BYTE(blue) \ + RENDER_PRINTF_CMD_ARG_BYTE(alpha) \ + RENDER_PRINTF_CMD_END + + +void func_800B4A08(s32 arg0); +void func_800B5E88(void); +void set_render_printf_color(u8 red, u8 green, u8 blue, u8 alpha); +void set_render_printf_background_color(u8 red, u8 green, u8 blue, u8 alpha); + +void set_render_printf_position(u16 xpos, u16 ypos); // Non Matching + +#endif diff --git a/src/screen_asset.h b/src/screen_asset.h index 3d1e9205..c82f1a0a 100644 --- a/src/screen_asset.h +++ b/src/screen_asset.h @@ -7,7 +7,11 @@ #include "macros.h" #include "f3ddkr.h" #include "asset_sections.h" +#include "asset_loading.h" #define SCREEN_HEIGHT_PART 6 +u8 *load_screen(s32 screenIndex); +void render_screen(Gfx **dlist, u8 *screenAddress); + #endif diff --git a/src/textures_sprites.c b/src/textures_sprites.c index c8824f49..68abf7ef 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -3,6 +3,8 @@ #include "textures_sprites.h" #include "gzip.h" +#include "asset_loading.h" +#include "memory.h" /************ .data ************/ @@ -856,41 +858,10 @@ const char D_800E7C50[] = "TEXSPR Error: Tryed to deallocate non-existent sprite /*********************************/ -/* Size: 8 bytes */ -typedef struct unk8007F1E8_18 { - s32 unk0; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; -} unk8007F1E8_18; - -/* Size: Variable. */ -typedef struct unk8007F1E8 { - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; - u8 unk10; - u8 unk11; - u8 unk12; - u8 unk13; - u8 unk14; - u8 unk15; - u8 unk16; - u8 unk17; - unk8007F1E8_18 unk18[1]; // Actual length depends on unk0 -} unk8007F1E8; - /************ .bss ************/ s32 *D_80126320[2]; -typedef struct TextureCacheEntry { - s32 id; - TextureHeader *texture; -} TextureCacheEntry; - TextureCacheEntry *gTextureCache; u8 *gCiPalettes; @@ -901,20 +872,6 @@ s32 gCiPalettesSize; s32 D_80126344; s32 *gSpriteOffsetTable; -typedef struct Sprite { - s16 baseTextureId; - s16 numberOfFrames; // 1 means static texture - s16 numberOfInstances; - s16 unk6; - TextureHeader **frames; - u8 unkC[1]; // Actual size varies. -} Sprite; - -typedef struct SpriteCacheEntry { - s32 id; - Sprite *sprite; -} SpriteCacheEntry; - SpriteCacheEntry *gSpriteCache; Sprite *gCurrentSprite; @@ -925,14 +882,6 @@ s32 D_80126360; s32 D_80126364; s32 D_80126368; -/* Size: 0x28 bytes */ -typedef struct TempTexHeader { -/* 0x00 */ TextureHeader header; -/* 0x20 */ u32 uncompressedSize; // Little endian -/* 0x24 */ u8 gzipLevel; // Always 9. -/* 0x25 */ u8 pad25[3]; // padding -} TempTexHeader; - TempTexHeader *gTempTextureHeader; s32 D_80126370; s32 D_80126374; @@ -1148,7 +1097,6 @@ void func_8007B454(void) { GLOBAL_ASM("asm/non_matchings/textures_sprites/func_8007B46C.s") -void func_8007B4E8(s32, s32, s32, s32); void func_8007B4C8(s32 arg0, s32 arg1, s32 arg2) { func_8007B4E8(arg0, arg1, arg2, 0); } diff --git a/src/textures_sprites.h b/src/textures_sprites.h index d22d7c07..5fefdd6d 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -6,9 +6,90 @@ #include "f3ddkr.h" #include "structs.h" #include "macros.h" -#include "memory.h" extern u32 gTexColorTag; extern s32 D_800DE7C4; +/* Size: 8 bytes */ +typedef struct unk8007F1E8_18 { + s32 unk0; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; +} unk8007F1E8_18; + +/* Size: Variable. */ +typedef struct unk8007F1E8 { + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC; + u8 unk10; + u8 unk11; + u8 unk12; + u8 unk13; + u8 unk14; + u8 unk15; + u8 unk16; + u8 unk17; + unk8007F1E8_18 unk18[1]; // Actual length depends on unk0 +} unk8007F1E8; + +typedef struct TextureCacheEntry { + s32 id; + TextureHeader *texture; +} TextureCacheEntry; + +typedef struct Sprite { + s16 baseTextureId; + s16 numberOfFrames; // 1 means static texture + s16 numberOfInstances; + s16 unk6; + TextureHeader **frames; + u8 unkC[1]; // Actual size varies. +} Sprite; + +typedef struct SpriteCacheEntry { + s32 id; + Sprite *sprite; +} SpriteCacheEntry; + +/* Size: 0x28 bytes */ +typedef struct TempTexHeader { +/* 0x00 */ TextureHeader header; +/* 0x20 */ u32 uncompressedSize; // Little endian +/* 0x24 */ u8 gzipLevel; // Always 9. +/* 0x25 */ u8 pad25[3]; // padding +} TempTexHeader; + +void func_8007AE0C(s32 arg0); +void func_8007AE28(s32 arg0); +s32 func_8007AE44(void); +s32 func_8007AE54(void); +s32 func_8007AE64(void); +void func_8007B374(s32 arg0); +void func_8007B3D0(Gfx **dlist); +void func_8007B43C(void); +void func_8007B454(void); +void func_8007B4C8(s32 arg0, s32 arg1, s32 arg2); +void func_8007BF1C(s32 arg0); +s32 func_8007EF64(s16 arg0); + +// There might be a file boundary here. +void func_8007F1E8(unk8007F1E8 *arg0); +void init_pulsating_light_data(PulsatingLightData *data); +void update_pulsating_light_data(PulsatingLightData *data, s32 timeDelta); + +//TextureHeader *load_texture(s32 arg0); // Non Matching +void free_texture(TextureHeader *tex); // Non Matching +TextureHeader *func_8007B380(s32 arg0); // Non Matching +void func_8007B4E8(s32, s32, s32, s32); // Non Matching +s32 get_texture_size_from_id(s32 arg0); // Non Matching +s32 func_8007C860(s32 spriteIndex); // Non Matching +s32 load_sprite_info(s32 spriteIndex, s32 *numOfInstancesOut, s32 *unkOut, + s32 *numFramesOut, s32 *formatOut, s32 *sizeOut); // Non Matching +void free_sprite(Sprite *sprite); // Non Matching +void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentColor); + #endif diff --git a/src/thread0_epc.c b/src/thread0_epc.c index 038e9776..f0b9f09f 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -6,6 +6,7 @@ #include "libultra_internal.h" #include "menu.h" #include "controller_pak.h" +#include "printf.h" /************ .rodata ************/ diff --git a/src/unknown_00BC20.c b/src/unknown_00BC20.c index 9b8b3b06..ca8a3f6c 100644 --- a/src/unknown_00BC20.c +++ b/src/unknown_00BC20.c @@ -749,7 +749,7 @@ s32 func_8000FD34(unk8000FD34 *arg0, s32 arg1) { GLOBAL_ASM("asm/non_matchings/unknown_00BC20/func_8000FD54.s") -void gParticlePtrList_addObject(Object *object){ +void gParticlePtrList_addObject(Object *object) { func_800245B4(object->unk4A | 0x8000); gParticlePtrList[gParticleCount] = object; gParticleCount++; diff --git a/src/unknown_0348C0.c b/src/unknown_0348C0.c index dde6a97d..4e215dff 100644 --- a/src/unknown_0348C0.c +++ b/src/unknown_0348C0.c @@ -876,7 +876,7 @@ void func_800389B8(Object *obj, s32 arg1) { obj->y_position += obj->y_velocity * temp_f2; obj->z_position += obj->z_velocity * temp_f2; if (obj->unk18 >= 256) { - gParticlePtrList_addObject(); + gParticlePtrList_addObject(obj); obj->unk18 = 255; } } @@ -885,16 +885,10 @@ void func_80038A6C(s32 arg0, s32 arg1) { } -// Probably just Object? -typedef struct unk80038A78 { - u8 pad0[0x18]; - s16 unk18; -} unk80038A78; - -void func_80038A78(unk80038A78 *arg0, s32 arg1) { +void func_80038A78(Object *arg0, s32 arg1) { arg0->unk18 += arg1 * 8; if (arg0->unk18 >= 256) { - gParticlePtrList_addObject(); + gParticlePtrList_addObject(arg0); arg0->unk18 = 255; } } @@ -913,7 +907,7 @@ void func_80038AD4(Object *arg0, s32 arg1) { arg0->unk18 += arg1 * 4; arg0->y_position += temp_f2 * 0.25; if (arg0->unk18 >= 256) { - gParticlePtrList_addObject(); + gParticlePtrList_addObject(arg0); arg0->unk18 = 255; } } diff --git a/src/unknown_043920.c b/src/unknown_043920.c index 392a3485..5a4ed03c 100644 --- a/src/unknown_043920.c +++ b/src/unknown_043920.c @@ -704,23 +704,13 @@ typedef struct unk800570A4 { s8 unk210; } unk800570A4; -/* Unknown Size */ -typedef struct unk800570A4_2 { - u8 unk0[0xC]; - s32 unkC; - s32 unk10; - s32 unk14; - u8 unk18[0x4C]; - unk800570A4 *unk64; -} unk800570A4_2; - /* Unknown Size */ typedef struct unk80056930 { u8 unk0[0x3]; s8 unk3; } unk80056930; -void func_80057048(unk800570A4_2 *arg0, s32 arg1); +void func_80057048(Object *arg0, s32 arg1); void play_char_horn_sound(Object *arg0, Object_64 *arg1) { if (get_filtered_cheats() & CHEAT_HORN_CHEAT) { @@ -735,16 +725,15 @@ void play_char_horn_sound(Object *arg0, Object_64 *arg1) { GLOBAL_ASM("asm/non_matchings/unknown_043920/func_8005698C.s") GLOBAL_ASM("asm/non_matchings/unknown_043920/func_80056E2C.s") - -void func_80057048(unk800570A4_2 *arg0, s32 arg1) { - unk800570A4 *temp = arg0->unk64; - u16 temp2 = arg1; - if (D_8011D55C != -1 && temp->unk108 == 0) { - func_80001EA8(temp2, arg0->unkC, arg0->unk10, arg0->unk14, 0); +void func_80001EA8(u16 arg0, f32 x, f32 y, f32 z, s32 **arg4); +void func_80057048(Object *obj, s32 arg1) { + unk800570A4 *obj64 = obj->unk64; + if (D_8011D55C != -1 && obj64->unk108 == 0) { + func_80001EA8(arg1, obj->x_position, obj->y_position, obj->z_position, NULL); } } -void func_800570A4(unk800570A4_2 *arg0, s32 arg1, s32 arg2) { +void func_800570A4(Object *arg0, s32 arg1, s32 arg2) { unk800570A4 *temp = arg0->unk64; temp->unk20E = arg1; temp->unk210 = arg2; diff --git a/src/unknown_06B2B0.c b/src/unknown_06B2B0.c index 807c5208..b5f03090 100644 --- a/src/unknown_06B2B0.c +++ b/src/unknown_06B2B0.c @@ -15,6 +15,7 @@ #include "video.h" #include "lib/src/mips1/sc/sched.h" #include "gzip.h" +#include "printf.h" /************ .rodata ************/ @@ -202,7 +203,6 @@ void func_8006ECFC(s32 arg0); void load_level_3(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); void func_800813C0(); void func_80004A60(s32, s32); -void menu_init(s32); void render(void); void func_8006C3E0(void); Settings *get_settings(void); @@ -1260,7 +1260,7 @@ void func_8006CCF0(s32 arg0) { case 2: sp40 = 3; sp3C = 1; - func_80098208(&D_800DD394); + func_80098208(); D_801234FC = 2; break; case 3: