diff options
Diffstat (limited to 'arm9/src')
34 files changed, 4590 insertions, 330 deletions
diff --git a/arm9/src/bag_view.c b/arm9/src/bag_view.c index 91bbafd2..31d53861 100644 --- a/arm9/src/bag_view.c +++ b/arm9/src/bag_view.c @@ -7,14 +7,13 @@ #include "player_data.h" #include "script_buffers.h" #include "seal.h" +#include "unk_0202A1E0.h" extern u32 *FUN_0202708C(u32 *); extern u32 FUN_02027168(u32 *); extern u16 FUN_02027184(u32 *); extern u32 *FUN_02027E24(struct SaveBlock2 *sav2); extern u8 FUN_02029E2C(struct SealCase *, u32); -extern u32 FUN_0202A8D8(struct SaveBlock2 *); -extern u16 FUN_0202A3B4(u32, u32, u32); THUMB_FUNC struct BagView *BagView_New(u8 heap_id) { @@ -122,7 +121,7 @@ THUMB_FUNC u32 FUN_0206E3D8(struct SaveBlock2 *sav2) THUMB_FUNC u32 FUN_0206E3E8(struct SaveBlock2 *sav2) { - return FUN_0202A3B4(FUN_0202A8D8(sav2), 0, 0); + return SaveStruct23_Substruct2_SetField_0x0(SaveStruct23_GetSubstruct2(sav2), 0, DATA_GET); } THUMB_FUNC BOOL FUN_0206E3F8(struct SaveBlock2 *sav2, struct String *dest, u32 item_id, u32 heap_id) diff --git a/arm9/src/communication_error.c b/arm9/src/communication_error.c new file mode 100644 index 00000000..0ea26458 --- /dev/null +++ b/arm9/src/communication_error.c @@ -0,0 +1,159 @@ +#include "global.h" +#include "bg_window.h" +#include "communication_error.h" +#include "game_init.h" +#include "MI_dma.h" +#include "msgdata.h" +#include "msgdata/msg.naix" +#include "text.h" + +extern void FUN_02002ED0(enum GFBgLayer layer, u32 base_addr, u32 heap_id); +extern void FUN_0200A274(fx32 brightness, fx32, u32); +extern void FUN_0200CB00(struct BgConfig* bg_config, enum GFBgLayer layer, u32 num_tiles, u32, u8, u32 heap_id); +extern void FUN_0200CCA4(struct Window* window, BOOL copy_to_vram, u16 fill_value, u32 palette_num); +extern void FUN_0200E394(BOOL set_brightness_on_bottom_screen); +extern void FUN_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); + +static const struct WindowTemplate sCommunicationErrorWindowTemplate = { + .bgId = GF_BG_LYR_MAIN_0, + .tilemapLeft = 3, + .tilemapTop = 3, + .width = 26, + .height = 18, + .paletteNum = 0x01, + .baseTile = 0x23, +}; + +static const struct GraphicsModes sCommunicationErrorGraphicsModes = { + .dispMode = GX_DISPMODE_GRAPHICS, + .bgMode = GX_BGMODE_0, + .subMode = GX_BGMODE_0, + ._2d3dMode = GX_BG0_AS_2D, +}; + +static const struct BgTemplate sCommunicationErrorBgTemplate = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x18000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE, +}; + +static const struct GraphicsBanks sCommunicationErrorGraphicsBanks = { + .bg = 3, + .bgextpltt = 0, + .subbg = 0, + .subbgextpltt = 0, + .obj = 0, + .objextpltt = 0, + .subobj = 0, + .subobjextpltt = 0, + .tex = 0, + .texpltt = 0, +}; + +THUMB_FUNC void FUN_02033F50(void) +{ + DTCM.intr_check |= 1; + MI_WaitDma(3); +} + +THUMB_FUNC void ShowCommunicationError(u32 heap_id, u32 error, u32 error_code) +{ + struct Window window; + + u32 error_message_no; + switch (error) + { + default: + case 0: + error_message_no = 1; + break; + case 1: + error_message_no = 2; + break; + case 2: + error_message_no = 3; + break; + case 3: + error_message_no = 4; + break; + case 4: + error_message_no = 5; + break; + } + + FUN_0200E3A0(PM_LCD_TOP, 0); + FUN_0200E3A0(PM_LCD_BOTTOM, 0); + + OS_DisableIrqMask(OS_IE_V_BLANK); + OS_SetIrqFunction(OS_IE_V_BLANK, FUN_02033F50); + OS_EnableIrqMask(OS_IE_V_BLANK); + + Main_SetVBlankIntrCB(NULL, NULL); + FUN_02015F34(NULL, NULL); + + GX_DisableEngineALayers(); + GX_DisableEngineBLayers(); + reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK; + reg_GXS_DB_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK; + + SetKeyRepeatTimers(4, 8); + + gMain.unk65 = 0; + + GX_SwapDisplay(); + reg_G2_BLDCNT = 0; + reg_G2S_DB_BLDCNT = 0; + reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK); + reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK); + GX_SetBanks(&sCommunicationErrorGraphicsBanks); + + struct BgConfig* bg_config = BgConfig_Alloc(heap_id); + + SetBothScreensModesAndDisable(&sCommunicationErrorGraphicsModes); + + InitBgFromTemplate(bg_config, 0, &sCommunicationErrorBgTemplate, 0); + BgClearTilemapBufferAndCommit(bg_config, 0); + FUN_0200CB00(bg_config, GF_BG_LYR_MAIN_0, 0x01F7, 2, 0, heap_id); + FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, heap_id); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, heap_id); + BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0x6C21); + BG_SetMaskColor(GF_BG_LYR_SUB_0, 0x6C21); + + struct MsgData* error_message_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0200_bin, heap_id); + struct String* error_message_str = String_ctor(384, heap_id); + struct String* tmp_str = String_ctor(384, heap_id); + FUN_0201BD5C(); + struct ScrStrBufs* mgr = ScrStrBufs_new(heap_id); + + AddWindow(bg_config, &window, &sCommunicationErrorWindowTemplate); + FillWindowPixelRect(&window, 0xF, 0, 0, 208, 144); + FUN_0200CCA4(&window, FALSE, 0x01F7, 2); + + BufferIntegerAsString(mgr, 0, (s32)error_code, 5, 2, 1); + ReadMsgDataIntoString(error_message_data, error_message_no, tmp_str); + StringExpandPlaceholders(mgr, error_message_str, tmp_str); + + AddTextPrinterParameterized(&window, 0, error_message_str, 0, 0, 0, NULL); + String_dtor(error_message_str); + // BUG: tmp_str is never destroyed. + + GX_BothDispOn(); + FUN_0200E394(PM_LCD_TOP); + FUN_0200E394(PM_LCD_BOTTOM); + FUN_0200A274(0, 0x3F, 3); + + RemoveWindow(&window); + DestroyMsgData(error_message_data); + ScrStrBufs_delete(mgr); + FreeToHeap(bg_config); +} diff --git a/arm9/src/font.c b/arm9/src/font.c index e09b0341..6c838892 100644 --- a/arm9/src/font.c +++ b/arm9/src/font.c @@ -1,16 +1,17 @@ #include "global.h" #include "font.h" #include "gf_gfx_loader.h" +#include "graphic/font.naix" #include "render_text.h" #include "string16.h" #include "text.h" -#include "graphic/font.naix" +#include "unk_0201B8B8.h" struct UnkStruct_02002C14 *UNK_02106FC8; struct UnkStruct_02002C14 UNK_02106FCC; -const u16 UNK_020ECB54[4][2] = { {0, 0}, {1, 0}, {2, 0}, {3, 0} }; +const u16 UNK_020ECB54[4][2] = { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 } }; const struct FontInfo gFontInfos[5] = { { 0x0B, 0x10, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x02 }, @@ -164,10 +165,67 @@ THUMB_FUNC s32 GetFontAttribute(u8 fontId, s32 attr) THUMB_FUNC void FUN_02002ED0(u32 layer, u32 baseAddr, u32 heap_id) { - GfGfxLoader_GXLoadPal(NARC_GRAPHIC_FONT, NARC_font_narc_0006_NCLR, layer, baseAddr, 0x20, heap_id); + GfGfxLoader_GXLoadPal( + NARC_GRAPHIC_FONT, NARC_font_narc_0006_NCLR, layer, baseAddr, 0x20, heap_id); } THUMB_FUNC void FUN_02002EEC(u32 layer, u32 baseAddr, u32 heap_id) { - GfGfxLoader_GXLoadPal(NARC_GRAPHIC_FONT, NARC_font_narc_0007_NCLR, layer, baseAddr, 0x20, heap_id); + GfGfxLoader_GXLoadPal( + NARC_GRAPHIC_FONT, NARC_font_narc_0007_NCLR, layer, baseAddr, 0x20, heap_id); +} + +THUMB_FUNC s32 FUN_02002F08(u32 param0, struct String *str, u32 param2) +{ + GF_ASSERT(UNK_02106FC8->unk94[param0] != NULL); + + return StringGetWidth(UNK_02106FC8->unk94[param0], String_c_str(str), param2); +} + +THUMB_FUNC u32 FUN_02002F40(u32 param0, struct String *str, u32 param2, u32 param3) +{ + u32 r0 = FUN_02002E14(param0, str, param2); + if (r0 < param3) + { + return (param3 - r0) / 2; + } + + return 0; +} + +THUMB_FUNC u32 FUN_02002F58(const u16 *str) +{ + u32 r5 = 1; + while (*str != EOS) + { + if (*str == 0xFFFE) + { + str = MsgArray_SkipControlCode(str); + continue; + } + + if (*str == 0xE000) + { + r5++; + str++; + continue; + } + + str++; + } + + return r5; +} + +THUMB_FUNC u32 FUN_02002F90(struct String *str) +{ + return FUN_02002F58(String_c_str(str)); +} + +THUMB_FUNC s32 FUN_02002F9C(u32 param0, struct String *str) +{ + GF_ASSERT(UNK_02106FC8->unk94[param0] != NULL); + + return StringGetWidth_SingleLine_HandleClearToControlCode( + UNK_02106FC8->unk94[param0], String_c_str(str)); } diff --git a/arm9/src/game_init.c b/arm9/src/game_init.c index 1c6098ea..44dcc111 100644 --- a/arm9/src/game_init.c +++ b/arm9/src/game_init.c @@ -7,6 +7,7 @@ #include "MWC_string.h" #include "tp.h" #include "unk_0201B4E8.h" +#include "unk_02022450.h" #include "game_init.h" #include "registers.h" #include "heap.h" @@ -14,20 +15,6 @@ #pragma thumb on -extern void FUN_02022450(void); - -typedef volatile struct -{ - u8 sys_and_irq_stack[0x3F80]; - u8 svc_stack[0x40]; - u8 reserved[0x38]; - u32 intr_check; - void * intr_vector; -} -OS_DTCM; - -#define DTCM (*(OS_DTCM *)HW_DTCM) - static struct { void * contents; u32 name_hash; diff --git a/arm9/src/main.c b/arm9/src/main.c index 46f8add7..fb4f8707 100644 --- a/arm9/src/main.c +++ b/arm9/src/main.c @@ -5,6 +5,7 @@ #include "CARD_backup.h" #include "CARD_pullOut.h" #include "CTRDG_common.h" +#include "communication_error.h" #include "PAD_pad.h" #include "main.h" #include "game_init.h" @@ -14,6 +15,7 @@ #include "timer3.h" #include "unk_02031734.h" #include "unk_0202F150.h" +#include "wfc_user_info_warning.h" #include "module_52.h" #include "font.h" @@ -29,7 +31,6 @@ struct UnkStruct_02016FA8 UNK_02016FA8; extern void FUN_02022294(void); extern void GF_InitRTCWork(void); extern int FUN_020337E8(int); -extern void FUN_02034188(int, int); extern void FUN_02089D90(int); extern void FUN_0200A2AC(void); extern void FUN_02015E30(void); @@ -69,7 +70,7 @@ THUMB_FUNC void NitroMain(void) InitSoundData(Sav2_Chatot_get(UNK_02016FA8.unk18), Sav2_PlayerData_GetOptionsAddr(UNK_02016FA8.unk18)); Init_Timer3(); if (FUN_020337E8(3) == 3) - FUN_02034188(3, 0); + ShowWFCUserInfoWarning(3, 0); if (FUN_020227FC(UNK_02016FA8.unk18) == 0) { FUN_02089D90(0); @@ -226,21 +227,19 @@ THUMB_FUNC void DoSoftReset(u32 parameter) } while (1); } -extern void FUN_02033F70(int, int, int); - THUMB_FUNC void FUN_02000F4C(u32 arg0, u32 arg1) { if (arg1 == 3) { - FUN_02033F70(0, 3, 0); + ShowCommunicationError(0, 3, 0); } else if (arg0 == 0) { - FUN_02033F70(0, 2, 0); + ShowCommunicationError(0, 2, 0); } else { - FUN_02033F70(0, 0, 0); + ShowCommunicationError(0, 0, 0); } FUN_02032DAC(); while (1) diff --git a/arm9/src/map_header.c b/arm9/src/map_header.c index 644a590b..49f8e986 100644 --- a/arm9/src/map_header.c +++ b/arm9/src/map_header.c @@ -1,39 +1,55 @@ #include "global.h" #include "map_header.h" #include "constants/map_sections.h" +#include "pokemon.h" #pragma thumb on // Static decls u32 MapNumberBoundsCheck(u32 mapno); -const u16 UNK_020EED54[] = { - 0x01A5, 0x01AD, 0x01B4, 0x01BC, 0x01C5, 0x01CC, 0x0007, 0x0025, - 0x0031, 0x01EF, 0x0046, 0x0066, 0x007C, 0x0087, 0x0098, 0x00A9, - 0x00AE, 0x00BE +static const u16 sPokemonCenterSecondFloorMaps[] = { + 421, + 429, + 436, + 444, + 453, + 460, + 7, + 37, + 49, + 495, + 70, + 102, + 124, + 135, + 152, + 169, + 174, + 190 }; -const u16 UNK_020EED78[] = { - 0x0181, 0x001A, - 0x00CB, 0x0019, - 0x00CF, 0x0018, - 0x00D0, 0x0018, - 0x00D1, 0x0018, - 0x00D2, 0x0018, - 0x00D3, 0x0018, - 0x00D4, 0x0018, - 0x00D5, 0x0018, - 0x00D6, 0x0018, - 0x00D7, 0x0018, - 0x00D8, 0x0018, - 0x00D9, 0x0018, - 0x00DA, 0x0018, - 0x00DB, 0x0018, - 0x00DC, 0x0018, - 0x00DD, 0x0018, +static const u16 sMapEvolutionMethods[] = { + 385, EVO_ROUTE217, + 203, EVO_ETERNA, + 207, EVO_CORONET, + 208, EVO_CORONET, + 209, EVO_CORONET, + 210, EVO_CORONET, + 211, EVO_CORONET, + 212, EVO_CORONET, + 213, EVO_CORONET, + 214, EVO_CORONET, + 215, EVO_CORONET, + 216, EVO_CORONET, + 217, EVO_CORONET, + 218, EVO_CORONET, + 219, EVO_CORONET, + 220, EVO_CORONET, + 221, EVO_CORONET, }; -const struct MapHeader sMapHeaders[] = { +static const struct MapHeader sMapHeaders[] = { { 0x0, 0x0, 0x0, 0x170, 0x33b, 0x12, 0x3e8, 0x3e8, 0xffff, 0x0, MAPSEC_MYSTERY_ZONE, 0x0, 0x0, 0x2, 3, TRUE, TRUE, TRUE, FALSE }, { 0x0, 0x0, 0x0, 0x170, 0x33b, 0x12, 0x3e8, 0x3e8, 0xffff, 0x0, MAPSEC_MYSTERY_ZONE, 0x0, 0x0, 0x0, 3, FALSE, FALSE, FALSE, FALSE }, { 0x2, 0x2, 0x2, 0x413, 0x3ca, 0x236, 0x424, 0x424, 0xffff, 0x1, MAPSEC_MYSTERY_ZONE, 0x0, 0x0, 0x6, 3, FALSE, FALSE, FALSE, FALSE }, @@ -694,16 +710,16 @@ u8 MapHeader_GetCameraType(u32 mapno) return sMapHeaders[mapno].camera_type; } -u8 MapHeader_GetField17_0(u32 mapno) +u8 MapHeader_GetBattleBg(u32 mapno) { mapno = MapNumberBoundsCheck(mapno); - return sMapHeaders[mapno].unk17_0; + return sMapHeaders[mapno].battle_bg; } -u8 MapHeader_GetField17_6(u32 mapno) +u8 MapHeader_IsEscapeRopeAllowed(u32 mapno) { mapno = MapNumberBoundsCheck(mapno); - return sMapHeaders[mapno].unk17_6; + return sMapHeaders[mapno].is_escape_rope_allowed; } u8 MapHeader_IsFlyAllowed(u32 mapno) @@ -733,7 +749,7 @@ BOOL FUN_020348E4(u32 mapno) return FALSE; } -BOOL MapHeader_MapIsOnOverworldMatrix(u32 mapno) +BOOL MapHeader_MapIsOnMainMatrix(u32 mapno) { return MapHeader_GetMatrixId(mapno) == 0; } @@ -760,56 +776,56 @@ BOOL FUN_02034964(u32 mapno) BOOL FUN_02034984(u32 mapno) { - return !!FUN_0203491C(mapno); + return FUN_0203491C(mapno) != FALSE; } -BOOL FUN_02034998(u32 mapno) +BOOL MapHeader_MapIsUnionRoom(u32 mapno) { return mapno == 466; } -BOOL FUN_020349AC(u32 mapno) +BOOL MapHeader_MapIsMtCoronetFeebasRoom(u32 mapno) { return mapno == 219; } -BOOL FUN_020349B8(u32 mapno) +BOOL MapHeader_MapIsTrophyGarden(u32 mapno) { return mapno == 287; } -BOOL FUN_020349CC(u32 mapno) +BOOL MapHeader_MapIsAmitySquare(u32 mapno) { return mapno == 253; } -BOOL FUN_020349D8(u32 mapno) +BOOL MapHeader_MapIsSpearPillar(u32 mapno) { return mapno == 220; } -BOOL FUN_020349E4(u16 a0) +BOOL MapHeader_MapIsPokemonCenterSecondFloor(u32 mapno) { int i; - for (i = 0; i < NELEMS(UNK_020EED54); i++) + for (i = 0; i < NELEMS(sPokemonCenterSecondFloorMaps); i++) { - if (a0 == UNK_020EED54[i]) + if (mapno == sPokemonCenterSecondFloorMaps[i]) return TRUE; } return FALSE; } -u16 FUN_02034A04(u16 a0) +u16 MapHeader_GetMapEvolutionMethod(u32 mapno) { int i; - for (i = 0; i < NELEMS(UNK_020EED78); i += 2) + for (i = 0; i < NELEMS(sMapEvolutionMethods); i += 2) { - if (a0 == UNK_020EED78[i + 0]) - return UNK_020EED78[i + 1]; + if (mapno == sMapEvolutionMethods[i + 0]) + return sMapEvolutionMethods[i + 1]; } - return 0; + return EVO_NONE; } diff --git a/arm9/src/map_matrix.c b/arm9/src/map_matrix.c new file mode 100644 index 00000000..1808d82c --- /dev/null +++ b/arm9/src/map_matrix.c @@ -0,0 +1,231 @@ +#include "global.h" +#include "map_matrix.h" +#include "MI_memory.h" +#include "filesystem.h" +#include "heap.h" +#include "map_header.h" + +THUMB_FUNC static void MapMatrix_MapMatrixData_Load( + struct MapMatrixData *map_matrix, u16 file_id, u32 map_id) +{ + map_matrix->width = 0; + map_matrix->height = 0; + + s32 i; + for (i = 0; i < MAP_MATRIX_MAX_SIZE; i++) + { + map_matrix->headers[i] = 0; + map_matrix->altitudes[i] = 0; + map_matrix->maps.data[i] = 0; + } + + for (i = 0; i < MAP_MATRIX_MAX_NAME_LENGTH; i++) + { + map_matrix->name[i] = 0; + } + + void *buffer = + AllocAtEndAndReadWholeNarcMemberByIdPair(NARC_FIELDDATA_MAPMATRIX_MAP_MATRIX, file_id, 11); + u8 *cursor = (u8 *)buffer; + + map_matrix->width = *(cursor++); + map_matrix->height = *(cursor++); + u8 has_headers_section = *(cursor++); + u8 has_altitudes_section = *(cursor++); + u8 name_length = *(cursor++); + + GF_ASSERT(name_length <= MAP_MATRIX_MAX_NAME_LENGTH); + + MI_CpuCopy8(cursor, &map_matrix->name, name_length); + cursor += name_length; + + if (has_headers_section != 0) + { + MI_CpuCopy8( + cursor, &map_matrix->headers, map_matrix->width * map_matrix->height * sizeof(u16)); + cursor += map_matrix->width * map_matrix->height * sizeof(u16); + } + else + { + MIi_CpuClear16((u16)map_id, + &map_matrix->headers, + map_matrix->width * map_matrix->height * sizeof(u16)); + } + + if (has_altitudes_section != 0) + { + MI_CpuCopy8( + cursor, &map_matrix->altitudes, map_matrix->width * map_matrix->height * sizeof(u8)); + cursor += map_matrix->width * map_matrix->height * sizeof(u8); + } + + MI_CpuCopy8( + cursor, map_matrix->maps.data, map_matrix->width * map_matrix->height * sizeof(u16)); + FreeToHeap(buffer); +} + +THUMB_FUNC struct MapMatrix *MapMatrix_New(void) +{ + struct MapMatrix *map_matrix = AllocFromHeap(11, sizeof(struct MapMatrix)); + + map_matrix->width = 0; + map_matrix->height = 0; + map_matrix->matrix_id = 0; + + return map_matrix; +} + +THUMB_FUNC void MapMatrix_Load(u16 map_id, struct MapMatrix *map_matrix) +{ + u16 matrix_id = MapHeader_GetMatrixId(map_id); + + MapMatrix_MapMatrixData_Load(&map_matrix->data, matrix_id, map_id); + + map_matrix->matrix_id = (u8)matrix_id; + map_matrix->height = map_matrix->data.height; + map_matrix->width = map_matrix->data.width; +} + +THUMB_FUNC void MapMatrix_Free(struct MapMatrix *map_matrix) +{ + FreeToHeap(map_matrix); +} + +THUMB_FUNC u16 MapMatrix_GetMapData(s32 map_id, struct MapMatrix *map_matrix) +{ + GF_ASSERT(map_id < map_matrix->width * map_matrix->height); + + return map_matrix->data.maps.data[map_id]; +} + +THUMB_FUNC u8 MapMatrix_GetWidth(struct MapMatrix *map_matrix) +{ + GF_ASSERT(map_matrix != NULL); + + return map_matrix->width; +} + +THUMB_FUNC u8 MapMatrix_GetHeight(struct MapMatrix *map_matrix) +{ + GF_ASSERT(map_matrix != NULL); + + return map_matrix->height; +} + +THUMB_FUNC u16 MapMatrix_GetMapHeader(struct MapMatrix *map_matrix, s32 x, s32 y) +{ + s32 width = map_matrix->width; + s32 height = map_matrix->height; + + GF_ASSERT(x >= 0 && x < width); + GF_ASSERT(y >= 0 && y < height); + + return map_matrix->data.headers[y * width + x]; +} + +THUMB_FUNC u16 MapMatrix_GetMapHeaderFromID(struct MapMatrix *map_matrix, s32 map_id) +{ + s32 max_map_id = map_matrix->width * map_matrix->height; + + GF_ASSERT(0 <= map_id && map_id < max_map_id); + + return map_matrix->data.headers[map_id]; +} + +THUMB_FUNC u8 MapMatrix_GetMatrixID(struct MapMatrix *map_matrix) +{ + return map_matrix->matrix_id; +} + +THUMB_FUNC u32 MapMatrix_GetMapAltitude( + struct MapMatrix *map_matrix, u8 param1, s16 x, s16 y, int matrix_width) +{ +#pragma unused(param1) + GF_ASSERT(x < matrix_width); + GF_ASSERT(y * matrix_width + x < MAP_MATRIX_MAX_SIZE); + + return map_matrix->data.altitudes[y * matrix_width + x]; +} + +THUMB_FUNC struct MapData *MapMatrix_MapData_New(u32 heap_id) +{ + struct MapData *map_data = AllocFromHeap(heap_id, sizeof(struct MapData)); + void *buffer = + AllocAtEndAndReadWholeNarcMemberByIdPair(NARC_FIELDDATA_MAPMATRIX_MAP_MATRIX, 0, heap_id); + u8 *cursor = (u8 *)buffer; + + cursor += 4; + u8 name_length = *cursor; + cursor++; + cursor += name_length; + + MI_CpuCopy8(cursor, map_data, sizeof(struct MapData)); + FreeToHeap(buffer); + + return map_data; +} + +THUMB_FUNC void MapMatrix_MapData_Free(struct MapData *map_data) +{ + GF_ASSERT(map_data != NULL); + FreeToHeap(map_data); +} + +THUMB_FUNC u16 MapMatrix_MapData_GetData(struct MapData *map_data, s32 x, s32 y) +{ + return map_data->data[MAP_MATRIX_MAX_WIDTH * y + x]; +} + +THUMB_FUNC u16 GetMapHeader(u32 file_id, u16 x, u16 y) +{ + struct MapMatrixData map_matrix; + + MapMatrix_MapMatrixData_Load(&map_matrix, (u16)file_id, 0); + GF_ASSERT(x < map_matrix.width); + GF_ASSERT(y < map_matrix.height); + + return map_matrix.headers[y * map_matrix.width + x]; +} + +THUMB_FUNC u16 GetMapData(s32 map_id, struct MapMatrix *map_matrix) +{ + GF_ASSERT(map_matrix != NULL); + return MapMatrix_GetMapData(map_id, map_matrix); +} + +THUMB_FUNC void FUN_02034678(struct MapMatrix *map_matrix) +{ + u16 *maps = map_matrix->data.maps.data; + u8 *altitudes = map_matrix->data.altitudes; + u8 width = map_matrix->width; + + if (map_matrix->matrix_id != 0) + { + return; + } + + maps[width * 0x15 + 0x17] = 0xB0; + maps[width * 0x15 + 0x18] = 0xB0; + maps[width * 0x16 + 0x17] = 0xB0; + maps[width * 0x16 + 0x18] = 0xB0; + altitudes[width * 0x15 + 0x17] = 2; + altitudes[width * 0x15 + 0x18] = 2; + altitudes[width * 0x16 + 0x17] = 2; + altitudes[width * 0x16 + 0x18] = 2; +} + +THUMB_FUNC void FUN_020346CC(struct MapMatrix *map_matrix) +{ + u16 *maps = map_matrix->data.maps.data; + u8 width = map_matrix->width; + + if (map_matrix->matrix_id != 0) + { + return; + } + + maps[width * 0x0F + 0x1C] = 0x77; + maps[width * 0x10 + 0x1B] = 0x78; + maps[width * 0x10 + 0x1C] = 0x79; + maps[width * 0x11 + 0x1B] = 0x7A; +} diff --git a/arm9/src/palette.c b/arm9/src/palette.c new file mode 100644 index 00000000..902bb386 --- /dev/null +++ b/arm9/src/palette.c @@ -0,0 +1,692 @@ +#include "global.h" +#include "MSL.h" +#include "palette.h" +#include "MI_memory.h" +#include "gf_gfx_loader.h" +#include "unk_0200CA44.h" +#include "unk_020222E8.h" + +THUMB_FUNC struct PaletteData *FUN_02002FD0(u32 heap_id) +{ + struct PaletteData *ptr = AllocFromHeap(heap_id, sizeof(struct PaletteData)); + MI_CpuFill8(ptr, 0, sizeof(struct PaletteData)); + + return ptr; +} + +THUMB_FUNC void FUN_02002FEC(struct PaletteData *ptr) +{ + FreeToHeap(ptr); +} + +THUMB_FUNC void PaletteData_SetBuffers( + struct PaletteData *paletteData, u32 index, void *unfadedBuf, void *fadedBuf, u32 size) +{ + paletteData->pltt[index].unfadedBuf = unfadedBuf; + paletteData->pltt[index].fadedBuf = fadedBuf; + paletteData->pltt[index].bufSize = size; +} + +THUMB_FUNC void PaletteData_AllocBuffers( + struct PaletteData *paletteData, u32 index, u32 size, u32 heap_id) +{ + void *ptr = AllocFromHeap(heap_id, size); + void *ptr2 = AllocFromHeap(heap_id, size); + + PaletteData_SetBuffers(paletteData, index, ptr, ptr2, size); +} + +THUMB_FUNC void PaletteData_FreeBuffers(struct PaletteData *paletteData, u32 index) +{ + FreeToHeap(paletteData->pltt[index].unfadedBuf); + FreeToHeap(paletteData->pltt[index].fadedBuf); +} + +THUMB_FUNC void PaletteData_LoadPalette( + struct PaletteData *paletteData, const void *src, u32 index, u32 offset, u16 size) +{ + MIi_CpuCopy16(src, paletteData->pltt[index].unfadedBuf + offset, size); + MIi_CpuCopy16(src, paletteData->pltt[index].fadedBuf + offset, size); +} + +THUMB_FUNC void PaletteData_LoadFromNarc(struct PaletteData *paletteData, + NarcId narcId, + s32 memberId, + u32 heap_id, + u32 index, + u32 size, + u16 offset, + u16 param7) +{ + NNSG2dPaletteData *pltData; + void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id); + + GF_ASSERT(ptr != NULL); + + if (size == 0) + { + size = pltData->szByte; + } + + GF_ASSERT(size + offset * 2 <= paletteData->pltt[index].bufSize); + + PaletteData_LoadPalette(paletteData, pltData->pRawData + param7 * 2, index, offset, (u16)size); + FreeToHeap(ptr); +} + +THUMB_FUNC void PaletteData_LoadNarc(struct PaletteData *paletteData, + NarcId narcId, + s32 memberId, + u32 heap_id, + u32 index, + u32 size, + u16 offset) +{ + PaletteData_LoadFromNarc(paletteData, narcId, memberId, heap_id, index, size, offset, 0); +} + +THUMB_FUNC void FUN_02003108(struct PaletteData *paletteData, u32 index, u16 offset, u32 size) +{ + GF_ASSERT(offset * 2 + size <= paletteData->pltt[index].bufSize); + + u16 *ptr; + switch (index) + { + case 0: + ptr = FUN_020222E8(); + break; + case 1: + ptr = FUN_020222F8(); + break; + case 2: + ptr = FUN_02022308(); + break; + case 3: + ptr = FUN_02022310(); + break; + default: + GF_ASSERT(FALSE); + return; + } + + PaletteData_LoadPalette(paletteData, ptr + offset, index, offset, (u16)size); +} + +THUMB_FUNC void CopyPaletteFromNarc( + NarcId narcId, s32 memberId, u32 heap_id, u32 size, u16 offset, void *dest) +{ + NNSG2dPaletteData *pltData; + + void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id); + GF_ASSERT(ptr != NULL); + + if (size == 0) + { + size = pltData->szByte; + } + + MI_CpuCopy16(pltData->pRawData + offset * 2, dest, size); + + FreeToHeap(ptr); +} + +THUMB_FUNC void PaletteData_CopyPalette(struct PaletteData *paletteData, + u32 srcIdx, + u16 srcOffset, + u32 destIdx, + u16 destOffset, + u16 size) +{ + + MI_CpuCopy16(paletteData->pltt[srcIdx].unfadedBuf + srcOffset, + paletteData->pltt[destIdx].unfadedBuf + destOffset, + size); + MI_CpuCopy16(paletteData->pltt[srcIdx].unfadedBuf + srcOffset, + paletteData->pltt[destIdx].fadedBuf + destOffset, + size); +} + +THUMB_FUNC u16 *PaletteData_GetUnfadedBuf(struct PaletteData *paletteData, u32 index) +{ + return paletteData->pltt[index].unfadedBuf; +} + +THUMB_FUNC u16 *PaletteData_GetFadedBuf(struct PaletteData *paletteData, u32 index) +{ + return paletteData->pltt[index].fadedBuf; +} + +THUMB_FUNC u32 FUN_02003210(struct PaletteData *paletteData, + u16 param1, + u16 param2, + s16 delay, + u8 startY, + u8 targetY, + u16 color) +{ + + u16 stc = param2; + u32 r6 = 0; + + for (u8 i = 0; i < 14; i++) + { + if (IsPaletteSelected(param1, i) != 1) + { + continue; + } + + if (IsPaletteSelected(paletteData->activeFadePalettes, i) != 0) + { + continue; + } + + FUN_02003368(i, &paletteData->pltt[i], ¶m2); + + FUN_020033A4(&paletteData->pltt[i].fadeCtrl, param2, delay, startY, targetY, color); + + FUN_02003328(paletteData, i); + + if (i >= 4) + { + FUN_0200359C(paletteData, i, 0x100); + } + else + { + FUN_0200359C(paletteData, i, 0x10); + } + + param2 = stc; + r6 = 1; + } + + if (r6 == 1) + { + paletteData->activeFadePalettes |= param1; + if (paletteData->unk11a_e == 0) + { + paletteData->unk11a_e = 1; + + paletteData->unk118_0 = 1; + paletteData->unk11c = 0; + + FUN_0200CA44((void (*)(u32, void *))FUN_02003464, + (void *)paletteData, + (u32)(-2)); + } + } + + return r6; +} + +THUMB_FUNC u8 IsPaletteSelected(u16 selectedPalettes, u16 index) +{ + u32 r3 = 1; + if ((selectedPalettes & (1 << index)) == 0) + { + r3 = 0; + } + + return (u8)r3; +} + +THUMB_FUNC void FUN_02003328(struct PaletteData *param0, u16 param1) +{ + if (IsPaletteSelected(param0->unk11a_0, param1) != 1) + { + param0->unk11a_0 |= 1 << param1; + } +} + +THUMB_FUNC void FUN_02003368(s32 param0, struct Palette *param1, u16 *param2) +{ + u8 r0; + if (param0 < 4) + { + r0 = (u8)(param1->bufSize >> 5); + } + else + { + r0 = (u8)(param1->bufSize >> 9); + } + + u16 r4 = 0; + for (u8 i = 0; i < r0; i++) + { + r4 += 1 << i; + } + + *param2 &= r4; +} + +THUMB_FUNC void FUN_020033A4(struct PaletteFadeControl *paletteFade, + u16 selectedPalettes, + s16 delay, + u8 startY, + u8 targetY, + u16 color) +{ + if (delay < 0) + { + paletteFade->deltaY = abs(delay) + 2; + paletteFade->delay = 0; + } + else + { + paletteFade->deltaY = 2; + paletteFade->delay = delay; + } + + paletteFade->selectedPalettes = selectedPalettes; + paletteFade->y = startY; + paletteFade->targetY = targetY; + paletteFade->blendColor = color; + + paletteFade->delayCounter = paletteFade->delay; + + if (startY < targetY) + { + paletteFade->yDec = 0; + return; + } + paletteFade->yDec = 1; +} + +THUMB_FUNC void FUN_02003464(u32 param0, struct PaletteData *param1) +{ + if (param1->unk11c == 1) + { + param1->unk11c = 0; + param1->unk11a_0 = 0; + param1->activeFadePalettes = 0; + param1->unk11a_e = 0; + FUN_0200CAB4((s32)param0); + return; + } + + if (param1->unk118_0 == 1) + { + param1->unk11a_0 = param1->activeFadePalettes; + FUN_02003500(param1); + FUN_02003520(param1); + + if (param1->activeFadePalettes == 0) + { + param1->unk11a_e = 0; + FUN_0200CAB4((s32)param0); + } + } +} + +THUMB_FUNC void FUN_02003500(struct PaletteData *param0) +{ + for (u8 i = 0; i < 4; i++) + { + FUN_02003540(param0, i, 0x10); + } +} + +THUMB_FUNC void FUN_02003520(struct PaletteData *param0) +{ + for (u8 i = 4; i < 14; i++) + { + FUN_02003540(param0, i, 0x100); + } +} + +THUMB_FUNC void FUN_02003540(struct PaletteData *paletteData, u8 index, u32 param2) +{ + if (IsPaletteSelected(paletteData->activeFadePalettes, index) != 0) + { + if (paletteData->pltt[index].fadeCtrl.delayCounter < + paletteData->pltt[index].fadeCtrl.delay) + { + paletteData->pltt[index].fadeCtrl.delayCounter++; + return; + } + + paletteData->pltt[index].fadeCtrl.delayCounter = 0; + FUN_0200359C(paletteData, index, param2); + } +} + +THUMB_FUNC void FUN_0200359C(struct PaletteData *paletteData, u32 index, u32 param2) +{ + + for (u32 i = 0; i < 0x10; i++) + { + if (IsPaletteSelected(paletteData->pltt[index].fadeCtrl.selectedPalettes, (u16)i) != 0) + { + FUN_020035F8(paletteData->pltt[index].unfadedBuf + param2 * i, + paletteData->pltt[index].fadedBuf + param2 * i, + &paletteData->pltt[index].fadeCtrl, + param2); + } + } + + FUN_02003684(paletteData, (u8)index, &paletteData->pltt[index].fadeCtrl); +} + +THUMB_FUNC void FUN_020035F8( + u16 *src, u16 *dest, struct PaletteFadeControl *fadeCtrl, u32 numEntries) +{ + for (u32 i = 0; i < numEntries; i++) + { + u8 lo = (u8)((src[i] & 0x1f) + + ((((fadeCtrl->blendColor & 0x1f) - (src[i] & 0x1f)) * fadeCtrl->y) >> 4)); + + u8 hi = (u8)(((src[i] >> 10) & 0x1f) + + (((((fadeCtrl->blendColor >> 10) & 0x1f) - ((src[i] >> 10) & 0x1f)) * + fadeCtrl->y) >> + 4)); + u8 mid = + (u8)(((src[i] >> 5) & 0x1f) + + (((((fadeCtrl->blendColor >> 5) & 0x1f) - ((src[i] >> 5) & 0x1f)) * fadeCtrl->y) >> + 4)); + + dest[i] = (u16)((hi << 10) | (mid << 5) | lo); + } +} + +THUMB_FUNC void FUN_02003684( + struct PaletteData *paletteData, u8 index, struct PaletteFadeControl *fadeCtrl) +{ + if (fadeCtrl->y == fadeCtrl->targetY) + { + if ((paletteData->activeFadePalettes & (1 << index)) == 0) + { + return; + } + + paletteData->activeFadePalettes ^= (1 << index); + + return; + } + + s16 val; + if (fadeCtrl->yDec == 0) + { + val = (s16)fadeCtrl->y; + val += fadeCtrl->deltaY; + if (val > fadeCtrl->targetY) + { + val = (s16)fadeCtrl->targetY; + } + + fadeCtrl->y = val; + return; + } + + val = (s16)fadeCtrl->y; + val -= fadeCtrl->deltaY; + if (val < fadeCtrl->targetY) + { + val = (s16)fadeCtrl->targetY; + } + + fadeCtrl->y = val; +} + +THUMB_FUNC void FUN_0200372C(struct PaletteData *paletteData) +{ + if (paletteData->unk11a_f == 0 && paletteData->unk118_0 != 1) + { + return; + } + + for (s32 i = 0; i < 14; i++) + { + if (paletteData->unk11a_f != 0 || + (paletteData->pltt[i].fadedBuf != 0 && + IsPaletteSelected(paletteData->unk11a_0, (u16)i) != 0)) + { + DC_FlushRange(paletteData->pltt[i].fadedBuf, paletteData->pltt[i].bufSize); + + switch (i) + { + case 0: + GX_LoadBGPltt(paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + break; + case 1: + GXS_LoadBGPltt(paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + break; + case 2: + GX_LoadOBJPltt(paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + break; + case 3: + GXS_LoadOBJPltt(paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + break; + case 4: + GX_BeginLoadBGExtPltt(); + GX_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + GX_EndLoadBGExtPltt(); + break; + case 5: + GX_BeginLoadBGExtPltt(); + GX_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x2000, paletteData->pltt[i].bufSize); + GX_EndLoadBGExtPltt(); + break; + case 6: + GX_BeginLoadBGExtPltt(); + GX_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x4000, paletteData->pltt[i].bufSize); + GX_EndLoadBGExtPltt(); + break; + case 7: + GX_BeginLoadBGExtPltt(); + GX_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x6000, paletteData->pltt[i].bufSize); + GX_EndLoadBGExtPltt(); + break; + case 8: + GXS_BeginLoadBGExtPltt(); + GXS_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + GXS_EndLoadBGExtPltt(); + break; + case 9: + GXS_BeginLoadBGExtPltt(); + GXS_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x2000, paletteData->pltt[i].bufSize); + GXS_EndLoadBGExtPltt(); + break; + case 10: + GXS_BeginLoadBGExtPltt(); + GXS_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x4000, paletteData->pltt[i].bufSize); + GXS_EndLoadBGExtPltt(); + break; + case 11: + GXS_BeginLoadBGExtPltt(); + GXS_LoadBGExtPltt( + paletteData->pltt[i].fadedBuf, 0x6000, paletteData->pltt[i].bufSize); + GXS_EndLoadBGExtPltt(); + break; + case 12: + GX_BeginLoadOBJExtPltt(); + GX_LoadOBJExtPltt( + paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + GX_EndLoadOBJExtPltt(); + break; + case 13: + GXS_BeginLoadOBJExtPltt(); + GXS_LoadOBJExtPltt( + paletteData->pltt[i].fadedBuf, 0, paletteData->pltt[i].bufSize); + GXS_EndLoadOBJExtPltt(); + break; + } + } + } + + paletteData->unk11a_0 = paletteData->activeFadePalettes; + if (paletteData->unk11a_0 == 0) + { + paletteData->unk118_0 = 0; + } +} + +THUMB_FUNC u16 FUN_020038E4(struct PaletteData *paletteData) +{ + return paletteData->activeFadePalettes; +} + +THUMB_FUNC void FUN_020038F0(struct PaletteData *paletteData, u32 param1) +{ + paletteData->unk11a_f = param1; +} + +THUMB_FUNC void PaletteData_FillPalette(struct PaletteData *paletteData, + u32 index, + u32 selection, + u16 value, + u16 startOffset, + u16 endOffset) +{ + GF_ASSERT(endOffset * 2 <= paletteData->pltt[index].bufSize); + if (selection == 1 || selection == 2) + { + MI_CpuFill16(&paletteData->pltt[index].unfadedBuf[startOffset], + value, + (u32)((endOffset - startOffset) * 2)); + } + + if (selection == 0 || selection == 2) + { + MI_CpuFill16(&paletteData->pltt[index].fadedBuf[startOffset], + value, + (u32)((endOffset - startOffset) * 2)); + } +} + +THUMB_FUNC void BlendPalette(u16 *src, u16 *dest, u16 numEntries, u8 coeff, u16 blendColor) +{ + s32 r2 = ((struct PlttData *)&blendColor)->r; + s32 g2 = ((struct PlttData *)&blendColor)->g; + s32 b2 = ((struct PlttData *)&blendColor)->b; + for (u16 i = 0; i < numEntries; i++) + { + s32 r = ((struct PlttData *)&src[i])->r; + s32 g = ((struct PlttData *)&src[i])->g; + s32 b = ((struct PlttData *)&src[i])->b; + + dest[i] = + (u16)(((r + (((r2 - r) * coeff) >> 4)) << 0) | ((g + (((g2 - g) * coeff) >> 4)) << 5) | + ((b + (((b2 - b) * coeff) >> 4)) << 10)); + } +} + +THUMB_FUNC void BlendPaletteUnfaded(struct PaletteData *paletteData, + u32 index, + u16 offset, + u16 numEntries, + u8 coeff, + u16 blendColor) +{ + BOOL r0 = FALSE; + if (paletteData->pltt[index].unfadedBuf != 0 && paletteData->pltt[index].fadedBuf != 0) + { + r0 = TRUE; + } + + GF_ASSERT(r0); + + BlendPalette(paletteData->pltt[index].unfadedBuf + offset, + paletteData->pltt[index].fadedBuf + offset, + numEntries, + coeff, + blendColor); +} + +THUMB_FUNC void BlendPalettes(u16 *src, u16 *dest, u16 selectedPalettes, u8 coeff, u16 blendColor) +{ + while (selectedPalettes != 0) + { + if ((selectedPalettes & 1) != 0) + { + BlendPalette(src, dest, 0x10, coeff, blendColor); + } + + selectedPalettes >>= 1; + dest += 0x10; + src += 0x10; + } +} + +THUMB_FUNC void BlendPalettesUnfaded( + struct PaletteData *paletteData, u32 index, u16 selectedPalettes, u8 coeff, u16 blendColor) +{ + u32 r4 = 0; + BOOL r0 = FALSE; + if (paletteData->pltt[index].unfadedBuf != 0 && paletteData->pltt[index].fadedBuf != 0) + { + r0 = TRUE; + } + + GF_ASSERT(r0); + + while (selectedPalettes != 0) + { + if ((selectedPalettes & 1) != 0) + { + BlendPaletteUnfaded(paletteData, index, (u16)r4, 0x10, coeff, blendColor); + } + + selectedPalettes >>= 1; + r4 += 0x10; + } +} + +THUMB_FUNC void TintPalette_CustomTone(u16 *palette, s32 count, s32 rTone, s32 gTone, s32 bTone) +{ + s32 r, g, b, i; + u32 gray; + + for (i = 0; i < count; i++) + { + r = (*palette >> 0) & 0x1F; + g = (*palette >> 5) & 0x1F; + b = (*palette >> 10) & 0x1F; + + gray = (u32)((r * 76 + g * 151 + b * 29) >> 8); + + r = (u16)((rTone * gray)) >> 8; + g = (u16)((gTone * gray)) >> 8; + b = (u16)((bTone * gray)) >> 8; + + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + + *palette++ = (u16)((b << 10) | (g << 5) | (r << 0)); + } +} + +THUMB_FUNC void FUN_02003B40(struct PaletteData *paletteData, + NarcId narcId, + s32 memberId, + u32 heap_id, + u32 index, + u32 size, + u16 offset, + s32 rTone, + s32 gTone, + s32 bTone) +{ + NNSG2dPaletteData *pltData; + void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id); + GF_ASSERT(ptr != NULL); + + if (size == 0) + { + size = pltData->szByte; + } + + TintPalette_CustomTone(pltData->pRawData, 0x10, rTone, gTone, bTone); + PaletteData_LoadPalette(paletteData, pltData->pRawData, index, offset, (u16)size); + + FreeToHeap(ptr); +} diff --git a/arm9/src/save.c b/arm9/src/save.c index 89bd8374..7eb523f6 100644 --- a/arm9/src/save.c +++ b/arm9/src/save.c @@ -3,6 +3,7 @@ #include "save_block_2.h" #include "heap.h" #include "CARD_backup.h" +#include "OS_spinLock.h" #pragma thumb on diff --git a/arm9/src/save_arrays.c b/arm9/src/save_arrays.c index f4b18b86..1969e3f1 100644 --- a/arm9/src/save_arrays.c +++ b/arm9/src/save_arrays.c @@ -16,6 +16,7 @@ #include "unk_020139D8.h" #include "unk_02024E64.h" #include "sav_chatot.h" +#include "unk_0202A1E0.h" extern u32 FUN_0202AC20(void); extern u32 FUN_02034D7C(void); @@ -28,7 +29,6 @@ extern u32 FUN_02028980(void); extern u32 FUN_02029A84(void); extern u32 FUN_02029FB0(void); extern u32 Sav2_Chatot_sizeof(void); -extern u32 FUN_0202A89C(void); extern u32 FUN_0202A8F4(void); extern u32 FUN_0202A924(void); extern u32 FUN_0202ABC8(void); @@ -48,7 +48,6 @@ extern void FUN_0202805C(void *); extern void FUN_02028994(void *); extern void FUN_02029A8C(void *); extern void FUN_02029FB8(void *); -extern void FUN_0202A8A4(void *); extern void FUN_0202A8F8(void *); extern void FUN_0202A92C(void *); extern void FUN_0202ABCC(void *); @@ -88,7 +87,7 @@ const struct SaveChunkHeader UNK_020EE700[] = { { 20, 0, (SAVSIZEFN)FUN_02029FB0, (SAVINITFN)FUN_02029FB8 }, { 21, 0, (SAVSIZEFN)Sav2_SealCase_sizeof, (SAVINITFN)Sav2_SealCase_init }, { 22, 0, (SAVSIZEFN)Sav2_Chatot_sizeof, (SAVINITFN)Sav2_Chatot_init }, - { 23, 0, (SAVSIZEFN)FUN_0202A89C, (SAVINITFN)FUN_0202A8A4 }, + { 23, 0, (SAVSIZEFN)SaveStruct23_sizeof, (SAVINITFN)SaveStruct23_Init }, { 24, 0, (SAVSIZEFN)FUN_0202A8F4, (SAVINITFN)FUN_0202A8F8 }, { 25, 0, (SAVSIZEFN)FUN_0202A924, (SAVINITFN)FUN_0202A92C }, { 26, 0, (SAVSIZEFN)FUN_0202ABC8, (SAVINITFN)FUN_0202ABCC }, diff --git a/arm9/src/scrcmd.c b/arm9/src/scrcmd.c index 6287579c..c79684a0 100644 --- a/arm9/src/scrcmd.c +++ b/arm9/src/scrcmd.c @@ -53,10 +53,12 @@ extern void MOD05_021E1F60(u32 param0); extern void MOD05_021E26CC(u32 param0, u8 param1); extern void MOD05_021E2B80(u32 param0, u8 param1); extern void MOD05_021E2B9C(u32 param0, u8 param1); - -extern u32 FUN_0203B120(struct UnkSavStruct80 *arg, u16 param1); -extern u32 FUN_0205AEA4(u32 param0, const u8 *ptr); -extern void FUN_0203B174(struct UnkSavStruct80 *arg, u32 param1, u32 param2); +extern u32 FUN_0205AEA4(u32 param0, const void *ptr); +extern void FUN_0203B174(struct UnkSavStruct80 *arg, u32 param1, void *param2); +extern u32 FUN_02058B2C(u32 param0); +extern u32 FUN_02058B4C(u32 param0); +extern u32 FUN_020580B4(u32 param0, u32 param1); +extern u32 FUN_02058060(u32 param0, u32 param1); extern u8 *UNK_020F34E0; @@ -75,6 +77,8 @@ static BOOL FUN_0203AA0C(struct ScriptContext *ctx); static BOOL FUN_0203AB00(struct ScriptContext *ctx); static BOOL FUN_0203AD2C(struct ScriptContext *ctx); static BOOL FUN_0203AD78(struct ScriptContext *ctx); +static u32 FUN_0203B120(struct UnkSavStruct80 *arg, u16 param1); +static BOOL FUN_0203B158(struct ScriptContext *ctx); extern u8 sScriptConditionTable[6][3]; @@ -1314,6 +1318,90 @@ THUMB_FUNC BOOL ScrCmd_Unk005E(struct ScriptContext *ctx) //ApplyMovement? u8 *unk5 = FUN_02039438(ctx->unk80, 4); (*unk5)++; - FUN_0203B174(ctx->unk80, unk4, 0); + FUN_0203B174(ctx->unk80, unk4, NULL); return FALSE; } + +THUMB_FUNC BOOL ScrCmd_Unk02A1(struct ScriptContext *ctx) +{ + u32 unk3; //has to be defined first to match + u16 unk0 = VarGet(ctx->unk80, ScriptReadHalfword(ctx)); + u16 unk1 = VarGet(ctx->unk80, ScriptReadHalfword(ctx)); + u16 unk2 = VarGet(ctx->unk80, ScriptReadHalfword(ctx)); + + unk3 = FUN_0203B120(ctx->unk80, unk0); + + GF_ASSERT(unk3 != 0); + + u16 *unk4 = AllocFromHeap(4, 0x100); + u16 unk5 = (u16)FUN_02058B2C(unk3); + u16 unk6 = (u16)FUN_02058B4C(unk3); + + u32 pos = 0; + + if (unk5 < unk1) + { + unk4[0] = 15; + pos++; + unk4[1] = unk1 - unk5; + } + else if (unk5 > unk1) + { + unk4[0] = 14; + pos++; + unk4[1] = unk5 - unk1; + } + + if (unk6 < unk2) + { + unk4[pos * 2] = 12; + unk4[pos * 2 + 1] = unk2 - unk6; + pos++; + } + else if (unk6 > unk2) + { + unk4[pos * 2] = 13; + unk4[pos * 2 + 1] = unk6 - unk2; + pos++; + } + + unk4[pos * 2] = 254; + unk4[pos * 2 + 1] = 0; + + u32 unk7 = FUN_0205AEA4(unk3, unk4); + u8 *unk8 = FUN_02039438(ctx->unk80, 4); + + (*unk8)++; + + FUN_0203B174(ctx->unk80, unk7, unk4); + return FALSE; +} + +THUMB_FUNC static u32 FUN_0203B120(struct UnkSavStruct80 *arg, u16 param1) +{ + if (param1 == 242) + { + return FUN_020580B4(arg->unk34, 48); + } + else if (param1 == 241) + { + u32 *res = FUN_02039438(arg, 11); + return *res; + } + else + { + return FUN_02058060(arg->unk34, param1); + } +} + +THUMB_FUNC BOOL ScrCmd_WaitForMovement(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, FUN_0203B158); + return TRUE; +} + +THUMB_FUNC static BOOL FUN_0203B158(struct ScriptContext *ctx) +{ + u8 *unk = FUN_02039438(ctx->unk80, 4); + return *unk == 0 ? TRUE : FALSE; +} diff --git a/arm9/src/scrcmd_24.c b/arm9/src/scrcmd_24.c index b38ed05a..bfa737be 100644 --- a/arm9/src/scrcmd_24.c +++ b/arm9/src/scrcmd_24.c @@ -10,10 +10,6 @@ extern struct UnkStruct_02037CF0* FUN_02037CF0(u32 heap_id, struct UnkSavStruct8 extern u8 FUN_02037D5C(struct UnkStruct_02037CF0*); extern void FUN_02038864(struct UnkSavStruct80*, struct UnkStruct_02088DD8*); extern BOOL FUN_0203BC04(struct ScriptContext* ctx); -extern struct UnkStruct_02088DD8* FUN_02088DD8(u32 heap_id); -extern void FUN_02088DF0(struct UnkStruct_02037CF0*); -extern void* FUN_02088DF8(struct Pokemon* pokemon, u32 heap_id); -extern BOOL FUN_02088EF8(void*); THUMB_FUNC BOOL ScrCmd_Unk01C6(struct ScriptContext* ctx) { @@ -57,7 +53,7 @@ THUMB_FUNC BOOL ScrCmd_Unk021F(struct ScriptContext* ctx) u16 mon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx)); struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2); struct Pokemon* pokemon = GetPartyMonByIndex(party, mon_idx); - void* unk_ptr = FUN_02088DF8(pokemon, 32); + void* unk_ptr = GetEligibleLevelUpMoves(pokemon, 32); *ret_ptr = (u16)FUN_02088EF8(unk_ptr); FreeToHeap(unk_ptr); @@ -96,7 +92,7 @@ THUMB_FUNC BOOL ScrCmd_Unk0221(struct ScriptContext* ctx) u16 mon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx)); struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2); struct Pokemon* pokemon = GetPartyMonByIndex(party, mon_idx); - void* unk_ptr = FUN_02088DF8(pokemon, 32); + void* unk_ptr = GetEligibleLevelUpMoves(pokemon, 32); FUN_02045E74(ctx, 1, pokemon, unk_ptr); return TRUE; diff --git a/arm9/src/scrcmd_sound.c b/arm9/src/scrcmd_sound.c index 1251c612..ae20b5a4 100644 --- a/arm9/src/scrcmd_sound.c +++ b/arm9/src/scrcmd_sound.c @@ -1,14 +1,13 @@ #include "scrcmd.h" +#include "unk_020040F4.h" extern void* Sav2_Chatot_get(struct SaveBlock2* sav2); extern u32 FUN_02005D20(void *); extern void FUN_02005E6C(void *); -extern void FUN_0200433C(u32, u32, u32); extern u32 FUN_02005E28(void); extern void FUN_02005E64(void); extern BOOL FUN_02005CBC(void); extern void PlaySound(u16); -extern u32 FUN_02004124(u16); extern void FUN_0204AB20(struct UnkSavStruct80 *ctx, u16); extern u16 FUN_0204ABA8(struct UnkSavStruct80 *ctx, u32); extern void FUN_0200521C(u16); @@ -20,13 +19,9 @@ extern BOOL FUN_02005404(void); extern u16 FUN_02005410(u16); extern void PlaySE(u16); extern void FUN_020054F0(u16, u32); -extern void FUN_020047C8(u8, u8); -extern void FUN_020040F4(u8); extern BOOL FUN_02005508(u16); extern void FUN_02005578(u16); extern BOOL FUN_02005670(void); -extern void FUN_0200488C(u16, u16); - THUMB_FUNC BOOL ScrCmd_Unk02AE(struct ScriptContext *ctx) { diff --git a/arm9/src/sound.c b/arm9/src/sound.c index a5228dab..ec65dd06 100644 --- a/arm9/src/sound.c +++ b/arm9/src/sound.c @@ -2,6 +2,7 @@ #include "sound.h" #include "SPI_mic.h" #include "SPI_pm.h" +#include "unk_020040F4.h" #pragma thumb on @@ -15,12 +16,8 @@ void GF_InitMic(void); void GF_SoundDataInit(struct SoundData *); void FUN_02004088(struct SoundData *); void FUN_020040A4(struct SoundData *); -void FUN_02003CE8(int); void FUN_020040DC(void); -extern BOOL FUN_020048BC(int); -extern void FUN_02004D60(u32); -extern BOOL FUN_02004D94(void); extern void FUN_0200521C(int); extern void FUN_0200538C(int, int, int); extern BOOL FUN_02005404(void); @@ -39,7 +36,7 @@ void InitSoundData(struct SaveChatotSoundClip * chatot, struct Options * options FUN_020040A4(sdat); UNK_02107074 = 0; sdat->chatot = chatot; - FUN_02004D60(options->soundMethod); + GF_SndSetMonoFlag(options->soundMethod); } void DoSoundUpdateFrame(void) @@ -99,7 +96,7 @@ void FUN_02003CE8(int a0) BOOL FUN_02003D04(void) { struct SoundData * sdat = GetSoundDataPointer(); - if (FUN_020048BC(2)) + if (GF_SndPlayerCountPlayingSeqByPlayerNo(2)) return TRUE; return sdat->unk_BCD12 != 0; } @@ -246,7 +243,7 @@ BOOL GF_Snd_LoadBank(int bankNo) return NNS_SndArcLoadBank(bankNo, sdat->heap); } -u32 * FUN_02003FF4(int playerNo) +u32 * GetSoundPlayer(int playerNo) { struct SoundData * sdat = GetSoundDataPointer(); if (playerNo >= (s32)NELEMS(sdat->players)) @@ -257,7 +254,7 @@ u32 * FUN_02003FF4(int playerNo) return &sdat->players[playerNo]; } -u32 FUN_02004018(u32 a0) +int FUN_02004018(u32 a0) { switch (a0) { @@ -317,6 +314,5 @@ void GF_InitMic(void) void FUN_020040DC(void) { NNS_SndPlayerStopSeqByPlayerNo(7, 0); - FUN_02003FF4(7); - NNS_SndHandleReleaseSeq(); + NNS_SndHandleReleaseSeq(GetSoundPlayer(7)); } diff --git a/arm9/src/text.c b/arm9/src/text.c index 8ca16d55..e8c76722 100644 --- a/arm9/src/text.c +++ b/arm9/src/text.c @@ -29,7 +29,7 @@ THUMB_FUNC void SetFontsPointer(const struct FontInfo *fonts) gFonts = fonts; } -THUMB_FUNC u8 FUN_0201BCC8(void (*func)(u32, struct TextPrinter *), struct TextPrinter *printer, u32 param2) +THUMB_FUNC u8 FUN_0201BCC8(void (*func)(u32, void *), void *printer, u32 param2) { u32 *r4 = UNK_021C5714; s32 i; @@ -192,7 +192,7 @@ THUMB_FUNC u16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u32 s { printer->textSpeedBottom--; printer->textSpeedTop = 1; - printer->minLetterSpacing = FUN_0201BCC8(RunTextPrinter, printer, 1); + printer->minLetterSpacing = FUN_0201BCC8((void (*)(u32, void *))RunTextPrinter, printer, 1); return printer->minLetterSpacing; } else diff --git a/arm9/src/timer3.c b/arm9/src/timer3.c index d4e8f8a1..4e7b03c7 100644 --- a/arm9/src/timer3.c +++ b/arm9/src/timer3.c @@ -1,5 +1,11 @@ #include "timer3.h" +#include "OS_interrupt.h" +#include "OS_irqTable.h" +#include "OS_timer.h" +#include "OS_system.h" +#include "registers.h" + static BOOL timer3_needReset; static vu64 timer3_counter; diff --git a/arm9/src/unk_02002F08.c b/arm9/src/unk_02002F08.c deleted file mode 100644 index b81da622..00000000 --- a/arm9/src/unk_02002F08.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "global.h" -#include "unk_02002F08.h" -#include "font.h" -#include "gf_gfx_loader.h" -#include "string16.h" -#include "unk_0201B8B8.h" - -THUMB_FUNC s32 FUN_02002F08(u32 param0, struct String *str, u32 param2) -{ - GF_ASSERT(UNK_02106FC8->unk94[param0] != NULL); - - return StringGetWidth(UNK_02106FC8->unk94[param0], String_c_str(str), param2); -} - -THUMB_FUNC u32 FUN_02002F40(u32 param0, struct String *str, u32 param2, u32 param3) -{ - u32 r0 = FUN_02002E14(param0, str, param2); - if (r0 < param3) - { - return (param3 - r0) / 2; - } - - return 0; -} - -THUMB_FUNC u32 FUN_02002F58(const u16 *str) -{ - u32 r5 = 1; - while (*str != EOS) - { - if (*str == 0xFFFE) - { - str = MsgArray_SkipControlCode(str); - continue; - } - - if (*str == 0xE000) - { - r5++; - str++; - continue; - } - - str++; - } - - return r5; -} - -THUMB_FUNC u32 FUN_02002F90(struct String *str) -{ - return FUN_02002F58(String_c_str(str)); -} - -THUMB_FUNC s32 FUN_02002F9C(u32 param0, struct String *str) -{ - GF_ASSERT(UNK_02106FC8->unk94[param0] != NULL); - - return StringGetWidth_SingleLine_HandleClearToControlCode( - UNK_02106FC8->unk94[param0], String_c_str(str)); -} - -THUMB_FUNC struct UnkStruct_02002F08 *FUN_02002FD0(u32 heap_id) -{ - struct UnkStruct_02002F08 *ptr = AllocFromHeap(heap_id, sizeof(struct UnkStruct_02002F08)); - MI_CpuFill8(ptr, 0, sizeof(struct UnkStruct_02002F08)); - - return ptr; -} - -THUMB_FUNC void FUN_02002FEC(struct UnkStruct_02002F08 *ptr) -{ - FreeToHeap(ptr); -} - -THUMB_FUNC void FUN_02002FF4( - struct UnkStruct_02002F08 *param0, u32 param1, void *param2, void *param3, u32 size) -{ - param0->unk000[param1].unk00 = param2; - param0->unk000[param1].unk04 = param3; - param0->unk000[param1].unk08 = size; -} - -THUMB_FUNC void FUN_02003008(struct UnkStruct_02002F08 *param0, u32 param1, u32 size, u32 heap_id) -{ - void *ptr = AllocFromHeap(heap_id, size); - void *ptr2 = AllocFromHeap(heap_id, size); - - FUN_02002FF4(param0, param1, ptr, ptr2, size); -} - -THUMB_FUNC void FUN_02003038(struct UnkStruct_02002F08 *param0, u32 param1) -{ - FreeToHeap(param0->unk000[param1].unk00); - FreeToHeap(param0->unk000[param1].unk04); -} - -THUMB_FUNC void FUN_02003054( - struct UnkStruct_02002F08 *param0, const void *param1, u32 param2, u32 offset, u16 size) -{ - MIi_CpuCopy16(param1, param0->unk000[param2].unk00 + offset, size); - MIi_CpuCopy16(param1, param0->unk000[param2].unk04 + offset, size); -} - -THUMB_FUNC void FUN_02003084(struct UnkStruct_02002F08 *param0, - NarcId narcId, - s32 memberId, - u32 heap_id, - u32 param4, - u32 size, - u16 offset, - u16 param7) -{ - NNSG2dPaletteData *pltData; - void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id); - - GF_ASSERT(ptr != NULL); - - if (size == 0) - { - size = pltData->szByte; - } - - GF_ASSERT(size + offset * 2 <= param0->unk000[param4].unk08); - - FUN_02003054(param0, pltData->pRawData + param7 * 2, param4, offset, (u16)size); - FreeToHeap(ptr); -} - -THUMB_FUNC void FUN_020030E8(struct UnkStruct_02002F08 *param0, - NarcId narcId, - s32 memberId, - u32 heap_id, - u32 param4, - u32 size, - u16 offset) -{ - FUN_02003084(param0, narcId, memberId, heap_id, param4, size, offset, 0); -} diff --git a/arm9/src/unk_020040F4.c b/arm9/src/unk_020040F4.c new file mode 100644 index 00000000..5713ddf0 --- /dev/null +++ b/arm9/src/unk_020040F4.c @@ -0,0 +1,1365 @@ +#include "global.h" +#include "unk_020040F4.h" +#include "OS_cache.h" +#include "sound.h" +#include "unk_0202F150.h" + +u32 UNK_021C3DD8[2]; + +u8 UNK_021C3DE0[0x7d0]; + +const u8 UNK_020ECB8C[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + +extern void FUN_02005454(); +extern void FUN_0200541C(); +extern void FUN_0200521C(int); +extern void FUN_0200538C(u32, u16, u32); +extern void NNS_SndPlayerPause(u32 *, u8); +extern void NNS_SndPlayerMoveVolume(u32 *, s32, s32); +extern void NNS_SndPlayerSetInitialVolume(u32 *, s32); +extern void *NNS_SndArcGetSeqParam(u32); +extern void NNS_SndArcPlayerStartSeqEx(u32 *, u32, s32, s32, u32); +extern u16 NNS_SndPlayerCountPlayingSeqByPlayerNo(int); +extern u32 NNS_SndPlayerGetSeqNo(u32 *); +extern u32 NNS_SndArcGetBankInfo(u32); +extern u32 MIC_StartAutoSampling(u32); +extern u32 MIC_StopAutoSampling(); +extern u32 MIC_DoSamplingAsync(u32 param0, u32 param1, u32 param2, u32 param3); +extern u32 NNS_SndWaveOutAllocChannel(u32); +extern void NNS_SndWaveOutFreeChannel(u32); +extern u32 NNS_SndWaveOutStart(u32, u32, void *, u32, u32, u32, u32, s32, u32, s32); +extern void NNS_SndWaveOutStop(u32); +extern BOOL NNS_SndWaveOutIsPlaying(u32); +extern void NNS_SndWaveOutSetPan(u32, u32); +extern void NNS_SndWaveOutSetSpeed(u32, u32); +extern void NNS_SndWaveOutSetVolume(u32, s32); +extern struct WaveArcInfo *NNS_SndArcGetWaveArcInfo(u32); +extern u32 NNS_SndArcGetFileSize(u32); +extern s32 NNS_SndArcReadFile(u32, void *, u32, u32); +extern BOOL NNS_SndCaptureIsActive(); +extern u32 NNS_SndCaptureStartReverb(void *, u32, u32, u32, u32); +extern void NNS_SndCaptureStopReverb(u32); +extern void NNS_SndCaptureSetReverbVolume(u32, u32); +extern u32 NNS_SndCaptureStartEffect(void *, u32, u32, u32, u32, void (*)(), void *); +extern void NNS_SndCaptureStopEffect(); +extern void NNS_SndPlayerSetTrackPitch(u32 *, u32, s32); +extern void NNS_SndPlayerSetTrackPan(u32 *, u32, s32); +extern void NNS_SndSetMonoFlag(u32 param0); +extern void FUN_020053CC(u32, u32); +extern u32 NNS_SndArcGetFileAddress(u32); +extern u32 SND_GetWaveDataAddress(u32, u32); +extern u32 NNS_SndPlayerGetTick(u32 *); +extern void NNS_SndPlayerSetAllocatableChannel(u32, u32); +extern BOOL FUN_02005404(void); +extern void NNS_SndPlayerSetPlayerVolume(u32, u8); + +THUMB_FUNC void FUN_020040F4(u8 param0) +{ + u8 *ptr = FUN_02003D38(5); + *ptr = param0; +} + +THUMB_FUNC u8 FUN_02004104() +{ + u8 *ptr = FUN_02003D38(5); + + return *ptr; +} + +THUMB_FUNC void FUN_02004110(u16 param0) +{ + u16 *ptr = FUN_02003D38(9); + *ptr = param0; + + FUN_02004130(0); +} + +THUMB_FUNC u16 FUN_02004124() +{ + u16 *ptr = FUN_02003D38(9); + + return *ptr; +} + +THUMB_FUNC void FUN_02004130(u16 param0) +{ + u16 *ptr = FUN_02003D38(10); + *ptr = param0; +} + +THUMB_FUNC u16 FUN_02004140() +{ + u16 *ptr = FUN_02003D38(10); + + return *ptr; +} + +THUMB_FUNC void FUN_0200414C(u16 param0) +{ + u16 *ptr = FUN_02003D38(31); + *ptr = param0; +} + +THUMB_FUNC void FUN_0200415C(u8 param0) +{ + u8 *ptr = FUN_02003D38(20); + u8 *ptr2 = FUN_02003D38(21); + + if (param0 < 51) + { + *ptr = param0; + *ptr2 = 0; + } + else + { + *ptr2 = param0; + } +} + +THUMB_FUNC BOOL FUN_02004180(s32 param0) +{ + BOOL res; + switch (param0) + { + case 1: + case 9: + case 10: + case 14: + res = GF_Snd_LoadGroup(1); + break; + case 2: + case 13: + res = GF_Snd_LoadGroup(2); + break; + case 3: + res = GF_Snd_LoadGroup(13); + break; + case 4: + res = GF_Snd_LoadGroup(1); + break; + case 5: + res = GF_Snd_LoadGroup(2); + break; + case 11: + res = GF_Snd_LoadGroup(1); + break; + case 6: + res = GF_Snd_LoadGroup(11); + break; + case 8: + res = GF_Snd_LoadGroup(1); + break; + case 12: + res = GF_Snd_LoadGroup(14); + break; + case 51: + res = GF_Snd_LoadGroup(3); + break; + case 66: + res = GF_Snd_LoadGroup(6); + break; + case 52: + res = GF_Snd_LoadGroup(5); + break; + case 7: + case 53: + res = GF_Snd_LoadGroup(9); + break; + case 54: + res = GF_Snd_LoadGroup(10); + break; + case 55: + case 67: + res = GF_Snd_LoadBank(0x5e5); + res = GF_Snd_LoadWaveArc(0x5e5); + break; + case 56: + res = GF_Snd_LoadGroup(12); + break; + case 57: + res = GF_Snd_LoadGroup(7); + break; + case 58: + res = GF_Snd_LoadGroup(8); + break; + case 59: + res = GF_Snd_LoadGroup(15); + break; + case 60: + res = GF_Snd_LoadGroup(3); + break; + case 61: + res = GF_Snd_LoadGroup(5); + break; + case 62: + res = GF_Snd_LoadGroup(15); + break; + case 63: + res = GF_Snd_LoadGroup(4); + break; + case 64: + res = GF_Snd_LoadBank(0x5ed); + res = GF_Snd_LoadWaveArc(0x5ed); + break; + case 65: + res = GF_Snd_LoadBank(0x5ec); + res = GF_Snd_LoadWaveArc(0x5ec); + break; + } + + return res; +} + +THUMB_FUNC BOOL FUN_0200433C(u8 param0, int param1, u32 param2) +{ + u8 *st0 = FUN_02003D38(20); + u8 *st4 = FUN_02003D38(21); + u16 *r7 = FUN_02003D38(13); + + if (param0 < 51) + { + if (*st0 == param0) + { + return FALSE; + } + } + else + { + if (*st4 == param0) + { + return FALSE; + } + } + + FUN_0200415C(param0); + + switch (param0) + { + case 4: + FUN_0200516C(0); + FUN_020044D4(param1, param2); + *r7 = 0; + break; + case 5: + FUN_02004648(param1, param2); + break; + case 11: + FUN_02004680(param1, param2); + break; + case 6: + FUN_020046A0(param1, param2); + break; + case 7: + FUN_020046C4(param1, param2); + break; + case 57: + case 53: + case 51: + case 52: + case 54: + case 55: + case 56: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 65: + case 66: + case 67: + FUN_020046E8(param0); + break; + case 1: + FUN_0200516C(1); + FUN_02004704(param0, param1, param2); + break; + case 14: + FUN_0200516C(2); + FUN_02004704(param0, param1, param2); + break; + case 2: + FUN_0200516C(0); + FUN_02004704(param0, param1, param2); + break; + case 3: + case 8: + case 9: + case 10: + case 12: + case 13: + FUN_02004704(param0, param1, param2); + break; + } + + return TRUE; +} + +THUMB_FUNC void FUN_020044A8(s32 param0) +{ + int *ptr = FUN_02003D38(23); + GF_Snd_RestoreState(*ptr); + + int *ptr2 = FUN_02003D38(24); + GF_Snd_SaveState(ptr2); + + FUN_02004180(param0); + + int *ptr3 = FUN_02003D38(25); + GF_Snd_SaveState(ptr3); +} + +THUMB_FUNC void FUN_020044D4(int seqNo, u32 param1) +{ +#pragma unused(param1) + + u8 *ptr = FUN_02003D38(11); + + FUN_02003D38(23); + FUN_02003D38(31); + u32 r4 = GF_SndPlayerGetSeqNo(GetSoundPlayer(0)); + + if (*ptr == 0 && r4 == seqNo && FUN_02004140() != 1152) + { + return; + } + + FUN_02004DBC(1); + FUN_02005454(); + + if (r4 != seqNo) + { + FUN_020047C8(1, 0); + FUN_0200541C(); + } + + if (*ptr == 1) + { + GF_Snd_RestoreState(FUN_02004748(2)); + FUN_02004180(4); + GF_Snd_SaveState((int *)FUN_02003D38(25)); + + if (r4 != seqNo) + { + FUN_020047C8(1, 0); + } + FUN_02004568(seqNo, (u16)r4); + return; + } + + FUN_0200521C(seqNo); +} + +THUMB_FUNC void FUN_02004568(int seqNo, u16 param1) +{ +#pragma unused(param1) + + u16 *ptr = FUN_02003D38(31); + + u32 r0 = FUN_02004900(*ptr); + if (r0 != 1001 && r0 != 1003) + { + GF_Snd_LoadSeqEx(seqNo, 4); + GF_ASSERT(FALSE); + } + else + { + GF_Snd_LoadSeqEx(*ptr, 6); + } + + GF_Snd_SaveState((int *)FUN_02003D38(26)); + FUN_020047C8(1, 0); + FUN_0200538C(0x7f, 0x28, 0); + FUN_02004DBC(0); +} + +THUMB_FUNC void FUN_020045C4(int seqNo, u32 param1) +{ + u8 *ptr = FUN_02003D38(18); + u16 *ptr2 = FUN_02003D38(31); + + if (*ptr != 1 && param1 != 0) + { + return; + } + + GF_Snd_RestoreState(FUN_02004748(1)); + GF_Snd_LoadSeqEx(*ptr2, 2); + GF_Snd_SaveState((int *)FUN_02003D38(24)); + + FUN_02004180(4); + GF_Snd_SaveState((int *)FUN_02003D38(25)); + + u32 r0 = FUN_02004900(*ptr2); + if (r0 != 1001 && r0 != 1003) + { + GF_Snd_LoadSeqEx(seqNo, 4); + GF_ASSERT(FALSE); + } + else + { + GF_Snd_LoadSeqEx(*ptr2, 4); + } + + GF_Snd_SaveState((int *)FUN_02003D38(26)); +} + +THUMB_FUNC void FUN_02004648(int param0, u32 param1) +{ +#pragma unused(param1) + FUN_02003D38(23); + FUN_020051AC(); + + GF_Snd_RestoreState(FUN_02004748(2)); + FUN_02004180(5); + GF_Snd_SaveState((int *)FUN_02003D38(25)); + FUN_02004DBC(1); + FUN_0200521C(param0); +} + +THUMB_FUNC void FUN_02004680(int param0, u32 param1) +{ +#pragma unused(param1) + FUN_02003D38(23); + FUN_0200541C(); + FUN_02004810(); + FUN_020044A8(4); + FUN_0200521C(param0); +} + +THUMB_FUNC void FUN_020046A0(int param0, u32 param1) +{ +#pragma unused(param1) + FUN_02003D38(23); + FUN_0200541C(); + FUN_020044A8(6); + FUN_02004DBC(1); + FUN_0200521C(param0); +} + +THUMB_FUNC void FUN_020046C4(int param0, u32 param1) +{ +#pragma unused(param1) + FUN_02003D38(23); + FUN_0200541C(); + FUN_020044A8(7); + FUN_02004DBC(1); + FUN_0200521C(param0); +} + +THUMB_FUNC void FUN_020046E8(s32 param0) +{ + FUN_02004738(); + FUN_02004180(param0); + GF_Snd_SaveState((int *)FUN_02003D38(27)); +} + +THUMB_FUNC void FUN_02004704(s32 param0, int param1, u32 param2) +{ +#pragma unused(param2) + FUN_02003D38(23); + FUN_0200541C(); + FUN_020044A8(param0); + FUN_0200521C(param1); +} + +THUMB_FUNC void FUN_02004724(int param0) +{ + GetSoundDataPointer(); + FUN_020051AC(); + FUN_0200521C(param0); +} + +THUMB_FUNC void FUN_02004738() +{ + GF_Snd_RestoreState(FUN_02004748(4)); +} + +THUMB_FUNC int FUN_02004748(s32 param0) +{ + GetSoundDataPointer(); + + if (param0 >= 7) + { + GF_AssertFail(); + return *(int *)FUN_02003D38(26); + } + + int *r5; + switch (param0) + { + case 0: + r5 = FUN_02003D38(22); + break; + case 1: + r5 = FUN_02003D38(23); + break; + case 2: + r5 = FUN_02003D38(24); + break; + case 3: + r5 = FUN_02003D38(25); + break; + case 4: + r5 = FUN_02003D38(26); + break; + case 5: + r5 = FUN_02003D38(27); + break; + case 6: + r5 = FUN_02003D38(28); + break; + } + + return *r5; +} + +THUMB_FUNC void FUN_020047C8(u8 param0, u8 param1) +{ + u8 *ptr; + int r4; + if (param0 == 1) + { + ptr = FUN_02003D38(11); + r4 = 0; + } + else + { + if (param0 != 7) + { + return; + } + + ptr = FUN_02003D38(12); + r4 = 7; + } + + if (param1 == 0) + { + FUN_02004110((u16)GF_SndPlayerGetSeqNo(GetSoundPlayer(r4))); + } + + NNS_SndPlayerPause(GetSoundPlayer(r4), param1); + *ptr = param1; +} + +THUMB_FUNC void FUN_02004810() +{ + u8 *ptr = FUN_02003D38(11); + u8 *ptr2 = FUN_02003D38(12); + *ptr = 0; + *ptr2 = 0; +} + +THUMB_FUNC void GF_SndPlayerMoveVolume(int playerNo, s32 param1, s32 param2) +{ + NNS_SndPlayerMoveVolume(GetSoundPlayer(playerNo), param1, param2); +} + +THUMB_FUNC void GF_SndPlayerSetInitialVolume(int playerNo, s32 param1) +{ + if (param1 < 0) + { + param1 = 0; + } + + if (param1 > 127) + { + param1 = 127; + } + + NNS_SndPlayerSetInitialVolume(GetSoundPlayer(playerNo), param1); +} + +THUMB_FUNC void FUN_02004858(u32 param0, int playerNo) +{ + u8 *ret = NNS_SndArcGetSeqParam(param0); + u8 r4; + if (playerNo == 1 || playerNo == 8) + { + r4 = 127; + } + else + { + if (ret == NULL) + { + return; + } + + r4 = ret[2]; + } + + if (FUN_020313EC() == 1) + { + GF_SndPlayerSetInitialVolume(playerNo, r4 / 5); + } +} + +THUMB_FUNC void FUN_0200488C(u16 param0, u16 param1) +{ + GF_SndPlayerSetInitialVolume(FUN_02004018(FUN_020048D0(param0)), param1); +} + +THUMB_FUNC void GF_SndArcPlayerStartSeqEx(int playerNo, u32 param1, u32 param2) +{ + NNS_SndArcPlayerStartSeqEx(GetSoundPlayer(playerNo), param1, -1, -1, param2); +} + +THUMB_FUNC u16 GF_SndPlayerCountPlayingSeqByPlayerNo(int playerNo) +{ + GF_ASSERT(playerNo >= 0); + + return NNS_SndPlayerCountPlayingSeqByPlayerNo(playerNo); +} + +THUMB_FUNC u8 FUN_020048D0(u16 param0) +{ + if (param0 == 0) + { + return 0xff; + } + + u8 *ptr = NNS_SndArcGetSeqParam(param0); + if (ptr == NULL) + { + return 0xff; + } + + return ptr[5]; +} + +THUMB_FUNC u32 GF_SndPlayerGetSeqNo(u32 *param0) +{ + return NNS_SndPlayerGetSeqNo(param0); +} + +THUMB_FUNC u32 FUN_020048F4(u16 param0) +{ + return NNS_SndArcGetBankInfo(FUN_02004900(param0)); +} + +THUMB_FUNC u16 FUN_02004900(u32 param0) +{ + u16 *ptr = NNS_SndArcGetSeqParam(param0); + if (ptr == NULL) + { + return 0; + } + + return *ptr; +} + +THUMB_FUNC u32 GF_MIC_StartAutoSampling(u32 param0) +{ + return MIC_StartAutoSampling(param0); +} + +THUMB_FUNC u32 GF_MIC_StopAutoSampling(u32 param0) +{ +#pragma unused(param0) + GetSoundDataPointer(); + return MIC_StopAutoSampling(); +} + +THUMB_FUNC u32 GF_MIC_DoSamplingAsync(u32 param0, u32 param1, u32 param2, u32 param3) +{ + return MIC_DoSamplingAsync(param0, param1, param2, param3); +} + +THUMB_FUNC void *FUN_02004930(u32 param0) +{ + GetSoundDataPointer(); + u8 *ptr = FUN_02003D38(15); + u8 *ptr2 = FUN_02003D38(16); + GF_ASSERT(param0 == 14 || param0 == 15); + GF_ASSERT(param0 != 14 || *ptr != 0); + GF_ASSERT(param0 != 15 || *ptr2 != 0); + + if (param0 == 14) + { + return FUN_02003D38(0); + } + + return FUN_02003D38(1); +} + +THUMB_FUNC BOOL FUN_02004984(u32 param0) +{ + GetSoundDataPointer(); + u8 *ptr = FUN_02003D38(15); + u8 *ptr2 = FUN_02003D38(16); + GF_ASSERT(param0 == 14 || param0 == 15); + + if (param0 == 14) + { + if (*ptr == 0) + { + u32 *r4 = FUN_02003D38(0); + *r4 = NNS_SndWaveOutAllocChannel(param0); + if (*r4 == 0) + { + return FALSE; + } + *ptr = 1; + } + else + { + GF_AssertFail(); + } + } + else + { + if (*ptr2 == 0) + { + u32 *r6 = FUN_02003D38(1); + *r6 = NNS_SndWaveOutAllocChannel(param0); + if (*r6 == 0) + { + return FALSE; + } + + *ptr2 = 1; + } + else + { + GF_AssertFail(); + } + } + + return TRUE; +} + +THUMB_FUNC void FUN_02004A04(u32 param0) +{ + GetSoundDataPointer(); + u8 *ptr = FUN_02003D38(15); + u8 *ptr2 = FUN_02003D38(16); + if (param0 != 14 && param0 != 15) + { + GF_AssertFail(); + return; + } + + if (param0 == 14) + { + if (*ptr == 1) + { + NNS_SndWaveOutFreeChannel(*(u32 *)FUN_02004930(param0)); + *ptr = 0; + return; + } + else + { + GF_AssertFail(); + return; + } + } + + if (*ptr2 == 1) + { + NNS_SndWaveOutFreeChannel(*(u32 *)FUN_02004930(param0)); + *ptr2 = 0; + return; + } + else + { + GF_AssertFail(); + } +} + +THUMB_FUNC u32 FUN_02004A6C(struct UnkStruct_020040F4_1 *param0, u32 param1) +{ + u32 res = NNS_SndWaveOutStart(*(u32 *)param0->unk00, + param0->unk04, + param0->unk08, + param0->unk0c, + param0->unk10, + param0->unk14, + param0->unk18, + param0->unk1c, + param0->unk20, + param0->unk24); + if (res == 0) + { + FUN_02004A04(param1); + } + + return res; +} + +THUMB_FUNC void FUN_02004AAC(u32 param0) +{ + NNS_SndWaveOutStop(*(u32 *)FUN_02004930(param0)); +} + +THUMB_FUNC BOOL FUN_02004ABC(u32 param0) +{ + return NNS_SndWaveOutIsPlaying(*(u32 *)FUN_02004930(param0)); +} + +THUMB_FUNC void FUN_02004ACC(u32 param0, u32 param1) +{ + if (param1 > 127) + { + param1 = 127; + } + + NNS_SndWaveOutSetPan(*(u32 *)FUN_02004930(param0), param1); +} + +THUMB_FUNC void FUN_02004AE4(u32 param0, u32 param1) +{ + NNS_SndWaveOutSetSpeed(*(u32 *)FUN_02004930(param0), param1); +} + +THUMB_FUNC void FUN_02004AF8(u32 param0, s32 param1) +{ + if (FUN_020313EC() == 1) + { + NNS_SndWaveOutSetVolume(*(u32 *)FUN_02004930(param0), param1 / 5); + return; + } + + NNS_SndWaveOutSetVolume(*(u32 *)FUN_02004930(param0), param1); +} + +THUMB_FUNC u32 FUN_02004B30(u32 param0, s32 param1, s32 param2, u32 param3, u32 param4) +{ + GetSoundDataPointer(); + + void **r4 = FUN_02003D38(33); + GF_ASSERT(param3 == 14 || param3 == 15); + + struct WaveArcInfo *r7 = NNS_SndArcGetWaveArcInfo(param0); + if (r7 == 0) + { + GF_AssertFail(); + return 0; + } + + u32 r6 = NNS_SndArcGetFileSize(r7->unk00); + if (r6 == 0) + { + GF_AssertFail(); + return 0; + } + + if (param3 == 14) + { + void *ptr = AllocFromHeap(param4, r6); + *r4 = ptr; + if (ptr == NULL) + { + GF_AssertFail(); + return 0; + } + + memset(ptr, 0, r6); + if (NNS_SndArcReadFile(r7->unk00, *r4, r6, 0) == -1) + { + GF_AssertFail(); + return 0; + } + + FUN_02004C1C(*r4, r6); + } + + void *res = FUN_02004930(param3); + + struct UnkStruct_020040F4_1 st8; + st8.unk04 = 0; + st8.unk00 = res; + st8.unk08 = *r4; + st8.unk0c = 0; + st8.unk18 = 0x3443; + st8.unk10 = 0; + st8.unk1c = param1; + st8.unk20 = 0x6000; + st8.unk24 = param2; + st8.unk14 = r6; + + u32 ret = FUN_02004A6C(&st8, param3); + FUN_02004AF8(param3, param1); + u8 *r0 = FUN_02003D38(14); + *r0 = 1; + + return ret; +} + +THUMB_FUNC void FUN_02004C1C(u8 *param0, u32 param1) +{ + for (u32 r5 = 0; r5 < param1 / 2; r5++) + { + u8 r4 = param0[r5]; + param0[r5] = param0[param1 - 1 - r5]; + param0[param1 - 1 - r5] = r4; + } +} + +THUMB_FUNC void FUN_02004C3C(u32 param0) +{ + GetSoundDataPointer(); + u8 *ptr = FUN_02003D38(14); + void **ptr2 = FUN_02003D38(33); + + GF_ASSERT(param0 == 14 || param0 == 15); + + FUN_02004AAC(param0); + + if (*ptr == 1) + { + *ptr = 0; + FreeToHeap(*ptr2); + } +} + +THUMB_FUNC BOOL GF_SndCaptureIsActive() +{ + return NNS_SndCaptureIsActive(); +} + +THUMB_FUNC u32 GF_SndCaptureStartReverb(u32 param0) +{ + GetSoundDataPointer(); + + return NNS_SndCaptureStartReverb(FUN_02003D38(3), 0x1000, 0, 0x3E80, param0); +} + +THUMB_FUNC void GF_SndCaptureStopReverb(u32 param0) +{ + NNS_SndCaptureStopReverb(param0); +} + +THUMB_FUNC void GF_SndCaptureSetReverbVolume(u32 param0, u32 param1) +{ + NNS_SndCaptureSetReverbVolume(param0, param1); +} + +THUMB_FUNC void FUN_02004CB4() +{ + GetSoundDataPointer(); + + MI_CpuFill8(FUN_02003D38(4), 0, 0x1c); + + void *r4 = FUN_02003D38(3); + void *st8 = FUN_02003D38(4); + + NNS_SndCaptureStartEffect(r4, 0x1000, 0, 0x55F0, 2, FUN_02005068, st8); +} + +THUMB_FUNC void GF_SndCaptureStopEffect() +{ + NNS_SndCaptureStopEffect(); +} + +THUMB_FUNC void FUN_02004D04(s32 param0) +{ + u8 *ptr = FUN_02003D38(19); + + if (param0 > 8) + { + param0 = 8; + } + else if (param0 < 0) + { + param0 = 0; + } + + *ptr = (u8)param0; +} + +THUMB_FUNC void GF_SndPlayerSetTrackPitch(int playerNo, u32 param1, s32 param2) +{ + NNS_SndPlayerSetTrackPitch(GetSoundPlayer(playerNo), param1, param2); +} + +THUMB_FUNC void FUN_02004D34(u16 param0, u32 param1, s32 param2) +{ + GF_SndPlayerSetTrackPitch(FUN_02004018(FUN_020048D0(param0)), param1, param2); +} + +THUMB_FUNC void GF_SndPlayerSetTrackPan(int playerNo, u32 param1, s32 param2) +{ + NNS_SndPlayerSetTrackPan(GetSoundPlayer(playerNo), param1, param2); +} + +THUMB_FUNC void GF_SndSetMonoFlag(u32 param0) +{ + NNS_SndSetMonoFlag(param0); + UNK_021C3DD8[0] = param0; +} + +THUMB_FUNC void FUN_02004D74(s32 param0) +{ + *(s32 *)FUN_02003D38(6) = param0; +} + +THUMB_FUNC void FUN_02004D84(u32 param0) +{ + *(u32 *)FUN_02003D38(7) = param0; +} + +THUMB_FUNC u16 FUN_02004D94() +{ + u16 *ptr = FUN_02003D38(7); + + if (*ptr == 0) + { + *ptr = 0; + return 0; + } + + return --(*ptr); +} + +THUMB_FUNC u8 *FUN_02004DB4() +{ + return UNK_021C3DE0; +} + +THUMB_FUNC void FUN_02004DBC(u8 param0) +{ + *(u8 *)FUN_02003D38(18) = param0; +} + +THUMB_FUNC u32 FUN_02004DCC(u32 param0, u16 param1, u32 param2, u32 param3, u8 param4, u32 param5) +{ + u8 *ptr = FUN_02003D38(21); + + FUN_02004E44(param0, param1, param2, param3, param4, param5); + + *ptr = 0; + FUN_02003CE8(5); + return 1; +} + +THUMB_FUNC u32 FUN_02004E08( + u32 param0, u16 param1, u32 param2, u32 param3, u32 param35, u8 param4, u32 param5) +{ + u32 *ptr = FUN_02003D38(8); + + FUN_02004E44(param0, param1, param2, param3, param4, param5); + + *ptr = param35; + FUN_02003CE8(6); + return 1; +} + +THUMB_FUNC void FUN_02004E44(u32 param0, u16 param1, u32 param2, u32 param3, u8 param4, u32 param5) +{ +#pragma unused(param0) +#pragma unused(param5) + u32 *ptr = FUN_02003D38(2); + + FUN_020053CC(0, param2); + FUN_02004110(0); + FUN_02004130(param1); + FUN_02004D84(param3); + *ptr = FUN_020048F4(param1); + + FUN_02004DBC(param4); +} + +THUMB_FUNC u32 FUN_02004E80(u32 param0) +{ + if (param0 == 0) + { + return 0; + } + + return param0 + 12; +} + +THUMB_FUNC u32 FUN_02004E8C(u32 *param0) +{ + if (param0 == NULL) + { + return 0; + } + + return param0[2]; +} + +THUMB_FUNC u32 FUN_02004E98(s32 param0) +{ + GF_Snd_RestoreState(FUN_02004748(5)); + + u16 r4 = (u16)param0; + + if (r4 != 0x1B9 && (param0 > 0x1ef || param0 == 0)) + { + r4 = 1; + } + + GF_Snd_LoadWaveArc(r4); + return FUN_02004ED0(r4); +} + +THUMB_FUNC u32 FUN_02004ED0(s32 param0) +{ + u32 *ptr = FUN_02003D38(32); + + u16 r4 = (u16)param0; + + if (r4 != 0x1B9 && (param0 > 0x1ef || param0 == 0)) + { + r4 = 1; + } + + struct WaveArcInfo *info = NNS_SndArcGetWaveArcInfo(r4); + if (info == NULL) + { + GF_AssertFail(); + return 0; + } + + u32 address = NNS_SndArcGetFileAddress(info->unk00); + if (address == 0) + { + GF_AssertFail(); + return 0; + } + + *ptr = SND_GetWaveDataAddress(address, 0); + return *ptr; +} + +THUMB_FUNC u32 FUN_02004F28(u32 param0, struct UnkStruct_020040F4_2 *param1, s32 param2) +{ +#pragma unused(param0) + u32 r4 = GF_SndPlayerGetTick(1); + u32 r5 = param1->unk08; + + s32 r1 = (param2 / (3 * 0x100)) << 1; + if (r1 < 0) + { + r1 = 32 / r1; + r1 = -r1; + } + else if (r1 == 0) + { + r1 = 32; + } + else + { + r1 = 32 * r1; + } + + u32 r0 = r4 * r1; + if (r0 >= r5) + { + r0 = 0; + } + + return r0; +} + +THUMB_FUNC u32 GF_SndPlayerGetTick(int playerNo) +{ + return NNS_SndPlayerGetTick(GetSoundPlayer(playerNo)); +} + +THUMB_FUNC void FUN_02004F70( + struct UnkStruct_020040F4_2 *param0, u8 *param1, int param2, s32 param3) +{ + int r0; + s32 r1; + int i, j; + u32 r12 = FUN_02004F28(1, param0, param3); + r1 = (s32)r12 - 100; + if (r1 < 0) + { + r1 = 0; + } + + int r3 = 0; + int r7 = 0; + s8 r5; + if (param0->unk0c[r1] < 0x80) + { + r5 = 1; + } + else + { + r5 = -1; + } + r5 = (s8)(s32)r5; + + for (i = r1; i < r12; i += 2) + { + r0 = 0; + if (r5 > 0) + { + if (param0->unk0c[i] > 0x80) + { + r0 = 1; + } + else + { + r3++; + } + } + else + { + if (param0->unk0c[i] < 0x80) + { + r0 = 1; + } + else + { + r3++; + } + } + + if (r0 == 1) + { + for (j = 0; j < 9; j++) + { + if (r3 < UNK_020ECB8C[j]) + { + r7 = j; + break; + } + } + + if (r7 >= param2) + { + r7 = param2 - 1; + } + + if (r3 != 0) + { + param1[param2 - 1 - r7]++; + } + + r3 = 0; + r0 = 0; + if (param0->unk0c[i] < 0x80) + { + r5 = 1; + } + else + { + r5 = -1; + } + r5 = (s8)(s32)r5; + } + } + + for (i = 0; i < param2; i++) + { + if (param1[i] >= 10) + { + param1[i] = 9; + } + } + + for (i = 0; i < param2 - 1; i++) + { + if (param1[i] == 0 && param1[i + 1] != 0) + { + param1[i] = (u8)(param1[i + 1] / 2); + return; + } + } +} + +THUMB_FUNC void FUN_02005068(s16 *param0, s16 *param1, u32 param2, u32 param3, void *param4) +{ + s16 st10[8][2]; + s16(*st0)[2] = param4; + u8 *r7 = FUN_02003D38(19); + + int r0; + int i, j; + + if (param3 != 1) + { + param2 /= 2; + } + + if (*r7 == 0) + { + return; + } + + for (i = 0; i < *r7; i++) + { + st10[i][0] = param0[param2 - (*r7) + i]; + st10[i][1] = param1[param2 - (*r7) + i]; + } + + for (i = (int)param2 - 1; i >= *r7 - 1; i--) + { + r0 = 0; + for (j = 0; j < *r7; j++) + { + r0 += param0[i - j]; + } + + param0[i] = (s16)(r0 / (*r7)); + + r0 = 0; + for (j = 0; j < *r7; j++) + { + r0 += param1[i - j]; + } + + param1[i] = (s16)(r0 / (*r7)); + } + + for (i = 0; i < *r7; i++) + { + st0[i][0] = st10[i][0]; + st0[i][1] = st10[i][1]; + } + + DC_FlushRange(param0, param2); + DC_FlushRange(param1, param2); +} + +THUMB_FUNC void FUN_02005160(u32 param0) +{ + NNS_SndPlayerSetAllocatableChannel(7, param0); +} + +THUMB_FUNC void FUN_0200516C(u32 param0) +{ + if (param0 == 0) + { + FUN_02005160(0x7ff); + GF_SndCaptureStopReverb(0); + } + else if (param0 == 1) + { + FUN_02005160(0x7fff); + GF_SndCaptureStartReverb(30); + } + else + { + FUN_02005160(0x7fff); + GF_SndCaptureStartReverb(15); + } + + GF_SndCaptureIsActive(); +} + +THUMB_FUNC void FUN_020051AC() +{ + if (FUN_02005404() == FALSE && GF_SndPlayerGetSeqNo(GetSoundPlayer(0)) != -1 && + FUN_02004124() != 0x47e) + { + + FUN_02005454(); + FUN_020047C8(1, 1); + return; + } + + FUN_0200541C(); +} + +THUMB_FUNC void GF_SndPlayerSetPlayerVolume(u32 param0, u8 param1) +{ + NNS_SndPlayerSetPlayerVolume(param0, param1); +} diff --git a/arm9/src/unk_020051F4.c b/arm9/src/unk_020051F4.c new file mode 100644 index 00000000..6da250d5 --- /dev/null +++ b/arm9/src/unk_020051F4.c @@ -0,0 +1,716 @@ +#include "global.h" +#include "unk_020051F4.h" +#include "NNS_SND_arc.h" +#include "constants/species.h" +#include "heap.h" +#include "sound.h" +#include "unk_020040F4.h" +#include "unk_0200CA44.h" + +extern u32 NNS_SndArcPlayerStartSeq(u32 *, u32); +extern u32 NNS_SndArcPlayerStartSeqEx(u32 *, s32, s32, s32, u32); +extern void NNS_SndPlayerStopSeqBySeqNo(u32, u32); +extern void NNS_SndPlayerStopSeqAll(u32); +extern void NNS_SndPlayerStopSeq(u32 *, u32); +extern void NNS_SndPlayerSetTrackPan(u32 *, u32, u32); +extern u32 FUN_02005D48(u32, u32, u32, u32); +extern void FUN_02005E80(u32); +extern void FUN_02005DFC(); +extern void *FUN_0201B6C8(u32 *); + +THUMB_FUNC u32 FUN_020051F4(u16 param0) +{ + int playerNo = FUN_02004018(FUN_020048D0(param0)); + + u32 ret = NNS_SndArcPlayerStartSeq(GetSoundPlayer(playerNo), param0); + + FUN_0200526C(param0, playerNo); + + return ret; +} + +THUMB_FUNC u32 FUN_0200521C(u16 param0) +{ + u8 r4 = FUN_020048D0(param0); + int playerNo = FUN_02004018(r4); + + u32 ret; + if (r4 == 7) + { + ret = FUN_02005288(param0, r4, playerNo); + } + else if (r4 == 1) + { + ret = FUN_020052B8(param0, r4, playerNo); + } + else + { + GF_AssertFail(); + return 0; + } + + FUN_02004DBC(0); + FUN_0200526C(param0, playerNo); + + return ret; +} + +THUMB_FUNC void FUN_0200526C(u16 param0, int playerNo) +{ + FUN_02004110(param0); + FUN_02004858(param0, playerNo); + + FUN_02003CE8(1); +} + +THUMB_FUNC u32 FUN_02005288(u16 param0, u32 param1, int playerNo) +{ +#pragma unused(param1) + GF_Snd_RestoreState(FUN_02004748(3)); + GF_Snd_LoadSeq(param0); + GF_Snd_SaveState(FUN_02003D38(26)); + return NNS_SndArcPlayerStartSeq(GetSoundPlayer(playerNo), param0); +} + +THUMB_FUNC u32 FUN_020052B8(u16 param0, u32 param1, int playerNo) +{ +#pragma unused(param1) + FUN_02003D38(18); + u16 *r4 = FUN_02003D38(31); + + FUN_020045C4(param0, FUN_02004900(GF_SndPlayerGetSeqNo(GetSoundPlayer(0)))); + + return NNS_SndArcPlayerStartSeqEx(GetSoundPlayer(playerNo), -1, FUN_02004900(*r4), -1, param0); +} + +THUMB_FUNC u32 FUN_02005308(u32 param0, u16 param1) +{ + if (param0 != 4) + { + GF_AssertFail(); + return 0; + } + + if (FUN_020048D0(param1) != 7) + { + GF_AssertFail(); + return 0; + } + + GF_Snd_LoadSeqEx(param1, 1); + + u32 r4 = NNS_SndArcPlayerStartSeq(GetSoundPlayer(7), param1); + FUN_02004110(param1); + FUN_02003CE8(1); + + return r4; +} + +THUMB_FUNC void FUN_02005350(u16 param0, u32 param1) +{ + NNS_SndPlayerStopSeqBySeqNo(param0, param1); + + u8 r0 = FUN_020048D0(param0); + if (r0 != 0xff) + { + NNS_SndHandleReleaseSeq(GetSoundPlayer(FUN_02004018(r0))); + } + + FUN_02005374(); +} + +THUMB_FUNC void FUN_02005374() +{ + FUN_02004110(0); + FUN_02004130(0); + FUN_02003CE8(0); +} + +THUMB_FUNC void FUN_0200538C(s32 param0, u16 param1, u32 param2) +{ + u8 r0 = FUN_020048D0(FUN_02004124()); + if (r0 == 0xff) + { + return; + } + + int playerNo = FUN_02004018(r0); + if (param2 == 0) + { + GF_SndPlayerMoveVolume(playerNo, 0, 0); + } + + GF_SndPlayerMoveVolume(playerNo, param0, param1); + FUN_02004D74(param1); + FUN_02003CE8(3); +} + +THUMB_FUNC void FUN_020053CC(s32 param0, s32 param1) +{ + u8 r6 = FUN_020048D0(FUN_02004124()); + if (r6 == 0xff) + { + return; + } + + if (!FUN_02005404()) + { + GF_SndPlayerMoveVolume(FUN_02004018(r6), param0, param1); + FUN_02004D74(param1); + } + + FUN_02003CE8(4); +} + +THUMB_FUNC u16 FUN_02005404() +{ + return *(u16 *)FUN_02003D38(6); +} + +THUMB_FUNC u16 FUN_02005410(u16 param0) +{ + return GF_SndPlayerCountPlayingSeqByPlayerNo(FUN_020048D0(param0)); +} + +THUMB_FUNC void FUN_0200541C() +{ + u8 *r5 = FUN_02003D38(15); + u8 *r4 = FUN_02003D38(16); + NNS_SndPlayerStopSeqAll(0); + + if (*r5 == 1) + { + FUN_02004AAC(14); + } + + if (*r4 == 1) + { + FUN_02004AAC(15); + } + + FUN_02003CE8(0); +} + +THUMB_FUNC void FUN_02005454() +{ + u8 *r5 = FUN_02003D38(15); + u8 *r4 = FUN_02003D38(16); + + NNS_SndPlayerStopSeq(GetSoundPlayer(7), 0); + FUN_02005374(); + + for (s32 i = 0; i < 4; i++) + { + FUN_020054F8(i + 3, 0); + } + + FUN_02005614(0); + + if (*r5 == 1) + { + FUN_02004AAC(14); + } + + if (*r4 == 1) + { + FUN_02004AAC(15); + } +} + +THUMB_FUNC u32 FUN_020054A8(u16 param0, u32 param1) +{ + u32 r6 = PlaySE(param0); + FUN_02005530(param0, 0xFFFF, param1); + + return r6; +} + +THUMB_FUNC u32 PlaySE(u16 param0) +{ + int playerNo = FUN_02004018(FUN_020048D0(param0)); + + u32 r6 = NNS_SndArcPlayerStartSeq(GetSoundPlayer(playerNo), param0); + FUN_02004858(param0, playerNo); + + return r6; +} + +THUMB_FUNC void FUN_020054F0(u32 param0, u32 param1) +{ + NNS_SndPlayerStopSeqBySeqNo(param0, param1); +} + +THUMB_FUNC void FUN_020054F8(s32 param0, u32 param1) +{ + NNS_SndPlayerStopSeq(GetSoundPlayer(param0), param1); +} + +THUMB_FUNC u16 FUN_02005508(u16 param0) +{ + return GF_SndPlayerCountPlayingSeqByPlayerNo(FUN_020048D0(param0)); +} + +THUMB_FUNC BOOL FUN_02005514() +{ + for (s32 i = 0; i < 4; i++) + { + if (GF_SndPlayerCountPlayingSeqByPlayerNo(i + 3) == 1) + { + return TRUE; + } + } + + return FALSE; +} + +THUMB_FUNC void FUN_02005530(u16 param0, u32 param1, u32 param2) +{ + NNS_SndPlayerSetTrackPan(GetSoundPlayer(FUN_02004018(FUN_020048D0(param0))), param1, param2); +} + +THUMB_FUNC void FUN_0200554C(u32 param0) +{ + int playerNo = FUN_02004018(3); + + for (int i = 0; i < 4; i++) + { + NNS_SndPlayerSetTrackPan(GetSoundPlayer(playerNo + i), 0xFFFF, param0); + } +} + +THUMB_FUNC u32 FUN_02005578(u16 species) +{ + u8 *r4 = FUN_02003D38(17); + u32 *r0 = FUN_02003D38(35); + + if (species != SPECIES_CHATOT) + { + if (species > SPECIES_MANAPHY_EGG || species == SPECIES_NONE) + { + species = SPECIES_BULBASAUR; + } + } + + if (species == SPECIES_CHATOT) + { + if (FUN_02005D48(*r0, 0, 127, 0) == 1) + { + FUN_02005E80(0); + + return 1; + } + } + + u32 res; + if (*r4 == 0) + { + FUN_02005614(0); + res = NNS_SndArcPlayerStartSeqEx(GetSoundPlayer(1), -1, species, -1, 2); + FUN_02004858(species, 1); + } + else + { + res = NNS_SndArcPlayerStartSeqEx(GetSoundPlayer(8), -1, species, -1, 2); + FUN_02004858(species, 8); + } + + FUN_02005E80(0); + + return res; +} + +THUMB_FUNC void FUN_02005614(u32 param0) +{ + u8 *r6 = FUN_02003D38(15); + u8 *r4 = FUN_02003D38(16); + FUN_02003D38(14); + + NNS_SndPlayerStopSeq(GetSoundPlayer(1), param0); + NNS_SndPlayerStopSeq(GetSoundPlayer(8), param0); + + if (*r6 == 1) + { + FUN_02004C3C(14); + FUN_02004A04(14); + } + + if (*r4 == 1) + { + FUN_02004C3C(15); + FUN_02004A04(15); + } + + FUN_02005DFC(); +} + +THUMB_FUNC BOOL FUN_02005670() +{ + u8 *r5 = FUN_02003D38(15); + u8 *r4 = FUN_02003D38(16); + FUN_02003D38(14); + + if (*r5 == 1) + { + return FUN_02004ABC(14); + } + + if (*r4 == 1) + { + return FUN_02004ABC(15); + } + + return GF_SndPlayerCountPlayingSeqByPlayerNo(0); +} + +THUMB_FUNC u32 FUN_020056AC(u32 param0, u16 param1, s32 param2, s32 param3, u32 param4) +{ + s32 st1c, st18; + u8 *st14 = FUN_02003D38(15); + u8 *st10 = FUN_02003D38(16); + u8 *r4 = FUN_02003D38(17); + u8 *stc = FUN_02003D38(29); + FUN_02003D38(35); + + st1c = 64 + (param2 / 2); + st18 = param3 - 30; + + if (st18 <= 0) + { + st18 = 1; + } + + *r4 = 0; + if (*st14 == 1) + { + FUN_02004C3C(14); + FUN_02004A04(14); + } + + if (*st10 == 1) + { + FUN_02004C3C(15); + FUN_02004A04(15); + } + + u16 species = param1; + if (species != SPECIES_CHATOT) + { + if (species > SPECIES_MANAPHY_EGG || species == SPECIES_NONE) + { + species = SPECIES_BULBASAUR; + } + } + + if (param1 == SPECIES_CHATOT) + { + switch (param0) + { + case 0: + case 1: + case 2: + case 5: + case 11: + case 12: + FUN_02005578(SPECIES_CHATOT); + if (*stc == 0) + { + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + } + else + { + FUN_02004ACC(14, (u8)st1c); + FUN_02004AF8(14, param3); + } + + return 1; + + default: + FUN_02005E80(1); + } + } + + switch (param0) + { + case 0: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + break; + case 1: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(20, param4); + break; + case 2: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, 64); + FUN_02005BC8(species, 20); + GF_SndPlayerSetTrackPan(8, 0xFFFF, param2); + FUN_02005AC8(species, 8, st18); + break; + case 3: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(30, param4); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, 192); + FUN_02005BC8(species, 16); + GF_SndPlayerSetTrackPan(8, 0xFFFF, param2); + FUN_02005AC8(species, 8, st18); + break; + case 4: + FUN_02004984(14); + FUN_02004B30(species, param3, st1c, 14, param4); + FUN_02004ACC(14, (u8)st1c); + FUN_02005AE0(15, param4); + FUN_02004AE4(14, 34304); + FUN_02005BF8(species, -64, st18, st1c, param4); + FUN_02004AE4(15, 34304); + break; + case 5: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, -224); + break; + case 6: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, 44); + FUN_02005BC8(species, -64); + GF_SndPlayerSetTrackPan(8, 0xFFFF, param2); + FUN_02005AC8(species, 8, st18); + break; + case 7: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(11, param4); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, -128); + break; + case 8: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(60, param4); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, 60); + break; + case 9: + FUN_02004984(14); + FUN_02004B30(species, param3, st1c, 14, param4); + FUN_02004ACC(14, (u8)st1c); + FUN_02005AE0(13, param4); + FUN_02004AE4(14, 26624); + break; + case 10: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(100, param4); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, -44); + break; + case 11: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, -96); + break; + case 12: + FUN_02005578(species); + GF_SndPlayerSetTrackPan(1, 0xFFFF, param2); + FUN_02005AC8(species, 1, param3); + FUN_02005AE0(20, param4); + GF_SndPlayerSetTrackPitch(1, 0xFFFF, -96); + break; + case 13: + FUN_02005578(species); + FUN_02005AC8(species, 1, 127); + FUN_02005BC8(species, 20); + GF_SndPlayerSetTrackPan(8, 0xFFFF, param2); + GF_SndPlayerMoveVolume(8, param3, 0); + break; + case 14: + FUN_02005578(species); + break; + } + + return 1; +} + +THUMB_FUNC void FUN_02005AC8(u32 param0, int playerNo, s32 param2) +{ + GF_SndPlayerSetInitialVolume(playerNo, param2); + FUN_02004858(param0, playerNo); +} + +THUMB_FUNC void FUN_02005AE0(u32 param0, u32 param1) +{ + u32 *r6 = FUN_02003D38(34); + FUN_02005BA0(); + + u32 *ptr = AllocFromHeap(param1, 2 * sizeof(u32)); + if (ptr == NULL) + { + GF_AssertFail(); + return; + } + + ((u8 *)ptr)[0] = 0; + ((u8 *)ptr)[1] = 0; + ((u8 *)ptr)[2] = 0; + ((u8 *)ptr)[3] = 0; + ((u8 *)ptr)[4] = 0; + ((u8 *)ptr)[5] = 0; + ((u8 *)ptr)[6] = 0; + ((u8 *)ptr)[7] = 0; + + ptr[0] = param0; + u32 r0 = (u32)FUN_0200CA44((void (*)(u32, void *))FUN_02005B2C, (void *)ptr, 0); + ptr[1] = r0; + *r6 = r0; +} + +THUMB_FUNC void FUN_02005B2C(u32 param0, s32 *param1) +{ +#pragma unused(param0) + u8 *r6 = FUN_02003D38(15); + u8 *r4 = FUN_02003D38(16); + + if (*param1 == 10) + { + GF_SndPlayerMoveVolume(1, 0, *param1); + GF_SndPlayerMoveVolume(8, 0, *param1); + } + + (*param1)--; + + if (!FUN_02005670()) + { + *param1 = 0; + } + + if (*param1 <= 0) + { + FUN_02005614(0); + if (*r6 == 1) + { + FUN_02004C3C(14); + FUN_02004A04(14); + } + if (*r4 == 1) + { + FUN_02004C3C(15); + FUN_02004A04(15); + } + + FUN_02005BA0(); + } +} + +THUMB_FUNC void FUN_02005BA0() +{ + u32 **r4 = FUN_02003D38(34); + if (*r4 != NULL) + { + void *r5 = FUN_0201B6C8(*r4); + FUN_0200CAB4((s32)(*r4)); + FreeToHeap(r5); + } + + *r4 = 0; +} + +THUMB_FUNC u32 FUN_02005BC8(u16 param0, s32 param1) +{ + *(u8 *)FUN_02003D38(17) = 1; + + FUN_02005E80(1); + u32 res = FUN_02005578(param0); + + GF_SndPlayerSetTrackPitch(8, 0xFFFF, param1); + + return res; +} + +THUMB_FUNC void FUN_02005BF8(u32 param0, s32 param1, s32 param2, s32 param3, u32 param4) +{ +#pragma unused(param1) + *(u8 *)FUN_02003D38(17) = 1; + + FUN_02004984(15); + FUN_02004B30(param0, param2, param3, 15, param4); +} + +THUMB_FUNC u32 PlaySound(u16 param0) +{ + FUN_020048F4(param0); + FUN_02005CEC(param0); + + u8 r0 = FUN_020048D0(FUN_02004124()); + if (r0 != 0xff) + { + FUN_020047C8(r0, 1); + } + + GF_Snd_SaveState((int *)FUN_02003D38(28)); + GF_Snd_LoadSeqEx(param0, 3); + u32 res = NNS_SndArcPlayerStartSeq(GetSoundPlayer(2), param0); + FUN_02004858(param0, 2); + + return res; +} + +THUMB_FUNC BOOL FUN_02005C74() +{ + u16 *r4 = FUN_02003D38(13); + + if (GF_SndPlayerCountPlayingSeqByPlayerNo(2) != 0) + { + return TRUE; + } + + if (*r4 != 0) + { + (*r4)--; + return TRUE; + } + + return FALSE; +} + +THUMB_FUNC void FUN_02005CA0(u32 param0) +{ + NNS_SndPlayerStopSeq(GetSoundPlayer(2), param0); + GF_Snd_RestoreState(FUN_02004748(6)); +} + +THUMB_FUNC BOOL FUN_02005CBC() +{ + FUN_02003D38(13); + + if (FUN_02005C74() == TRUE) + { + return TRUE; + } + + FUN_02005CA0(0); + u8 r0 = FUN_020048D0(FUN_02004124()); + + if (r0 != 0xff) + { + FUN_020047C8(r0, 0); + } + + return FALSE; +} + +THUMB_FUNC void FUN_02005CEC(u16 param0) +{ +#pragma unused(param0) + *(u16 *)FUN_02003D38(13) = 15; +} diff --git a/arm9/src/unk_020061E8.c b/arm9/src/unk_020061E8.c new file mode 100644 index 00000000..6b9f8ead --- /dev/null +++ b/arm9/src/unk_020061E8.c @@ -0,0 +1,35 @@ +#include "global.h"
+#include "heap.h"
+#include "unk_0200CA44.h"
+#include "unk_020061E8.h"
+
+extern struct TextPrinter *FUN_0201B6C8(void);
+
+THUMB_FUNC BOOL FUN_020061E8(void (*r0)(u32, void *), u32 r1, u32 r2, u32 r3)
+{
+ void * r4;
+ if(r1 != 0)
+ {
+ r4 = AllocFromHeap(r3, r1);
+ if(r4 == 0)
+ {
+ return FALSE;
+ }
+ memset(r4, 0, r1);
+ }
+ else
+ {
+ r4 = NULL;
+ }
+ return FUN_0200CA44(r0, r4, r2);
+}
+
+THUMB_FUNC void FUN_0200621C(s32 r4)
+{
+ struct TextPrinter * r0 = FUN_0201B6C8();
+ if(r0 != NULL)
+ {
+ FreeToHeap(r0);
+ }
+ FUN_0200CAB4(r4);
+}
diff --git a/arm9/src/unk_0200CA44.c b/arm9/src/unk_0200CA44.c index 6ffed8be..a9a9f7c6 100644 --- a/arm9/src/unk_0200CA44.c +++ b/arm9/src/unk_0200CA44.c @@ -2,25 +2,25 @@ #include "main.h" #include "unk_0200CA44.h" -extern BOOL FUN_0201B60C(void *, void (*)(u32, struct TextPrinter *), struct TextPrinter *, u32); +extern BOOL FUN_0201B60C(void *, void (*)(u32, void *), void *, u32); extern void FUN_0201B6A0(s32); -THUMB_FUNC BOOL FUN_0200CA44(void (*r0)(u32, struct TextPrinter *), struct TextPrinter * r1, u32 r2) +THUMB_FUNC BOOL FUN_0200CA44(void (*r0)(u32, void *), void * r1, u32 r2) { return FUN_0201B60C(gMain.unk18, r0, r1, r2); } -THUMB_FUNC BOOL FUN_0200CA60(void (*r0)(u32, struct TextPrinter *), struct TextPrinter * r1, u32 r2) +THUMB_FUNC BOOL FUN_0200CA60(void (*r0)(u32, void *), void * r1, u32 r2) { return FUN_0201B60C(gMain.unk1C, r0, r1, r2); } -THUMB_FUNC BOOL FUN_0200CA7C(void (*r0)(u32, struct TextPrinter *), struct TextPrinter * r1, u32 r2) +THUMB_FUNC BOOL FUN_0200CA7C(void (*r0)(u32, void *), void * r1, u32 r2) { return FUN_0201B60C(gMain.unk24, r0, r1, r2); } -THUMB_FUNC BOOL FUN_0200CA98(void (*r0)(u32, struct TextPrinter *), struct TextPrinter * r1, u32 r2) +THUMB_FUNC BOOL FUN_0200CA98(void (*r0)(u32, void *), void * r1, u32 r2) { return FUN_0201B60C(gMain.unk20, r0, r1, r2); } diff --git a/arm9/src/unk_0201C6B4.c b/arm9/src/unk_0201C6B4.c new file mode 100644 index 00000000..151a9cd6 --- /dev/null +++ b/arm9/src/unk_0201C6B4.c @@ -0,0 +1,80 @@ +#include "global.h"
+#include "unk_0201C6B4.h"
+
+THUMB_FUNC s32 FUN_0201C6B4(s8 * r0)
+{
+ s32 r2 = 0;
+ while(r0[r2] != 0)
+ {
+ r2++;
+ }
+ return r2;
+}
+
+THUMB_FUNC s8 * FUN_0201C6C8(s8 * r0, s8 * r1, s8 r2)
+{
+ for(int r3 = 0; r3 < 0x100; r3++)
+ {
+ r1[r3] = r0[r3];
+ if(r2 == r0[r3] || r0[r3] == 0)
+ {
+ r1[r3] = 0;
+ if(r2 == 0xd && r0[r3 + 1] == 0xa)
+ {
+ return &r0[r3 + 2];
+ }
+ return &r0[r3 + 1];
+ }
+ }
+ return NULL;
+}
+
+THUMB_FUNC s32 FUN_0201C70C(s8 * r4)
+{
+ s32 unk0 = FUN_0201C6B4(r4);
+ s32 r3;
+ s32 r5 = 1;
+ s32 r6 = 0;
+ for(r3 = unk0 - 1; r3 >= 0; r3--)
+ {
+ if(r4[r3] >= 0x30 && r4[r3] <= 0x39)
+ {
+ r6 += (r4[r3] - 0x30) * r5;
+ }
+ else
+ {
+ if(r3 == 0)
+ {
+ if(r4[r3] == 0x2d)
+ {
+ r6 *= -1;
+ }
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ r5 *= 0xa;
+ }
+ return r6;
+}
+
+THUMB_FUNC void FUN_0201C750(s8 * r5, s8 * r4)
+{
+ for(u8 r2 = 0; r2 < 4; r2++)
+ {
+ s32 * unk5 = (s32 *)r5;
+ unk5[r2] = 0;
+ }
+ u8 r0 = (u8)(FUN_0201C6B4(r4));
+ for(u8 r2 = 0; r2 < r0; r2++)
+ {
+ r5[r2] = r4[r2];
+ }
+}
+
+THUMB_FUNC BOOL FUN_0201C78C(u32 r0)
+{
+ return r0 < 0x121;
+}
diff --git a/arm9/src/unk_0201E7D8.c b/arm9/src/unk_0201E7D8.c index 9a4d8cab..2bfd6485 100644 --- a/arm9/src/unk_0201E7D8.c +++ b/arm9/src/unk_0201E7D8.c @@ -1,7 +1,7 @@ #include "global.h"
#include "fx.h"
#include "heap.h"
-#include "NNS_g3d.h"
+#include "nitro/NNS_g3d.h"
#include "unk_0201E7D8.h"
#include "GX_g3.h"
diff --git a/arm9/src/unk_020222E8.c b/arm9/src/unk_020222E8.c new file mode 100644 index 00000000..30a2a2c4 --- /dev/null +++ b/arm9/src/unk_020222E8.c @@ -0,0 +1,33 @@ +#include "global.h"
+#include "unk_020222E8.h"
+
+THUMB_FUNC void * FUN_020222E8()
+{
+ return 0x5 << 0x18;
+}
+
+THUMB_FUNC void * FUN_020222F0()
+{
+ return 0x2 << 0x8;
+}
+
+THUMB_FUNC void * FUN_020222F8()
+{
+ return 0x05000400;
+}
+
+THUMB_FUNC void * FUN_02022300()
+{
+ return 0x2 << 0x8;
+}
+
+THUMB_FUNC void * FUN_02022308()
+{
+ return 0x05000200;
+}
+
+THUMB_FUNC void * FUN_02022310()
+{
+ return 0x05000600;
+}
+
diff --git a/arm9/src/unk_02022450.c b/arm9/src/unk_02022450.c new file mode 100644 index 00000000..7984fcc2 --- /dev/null +++ b/arm9/src/unk_02022450.c @@ -0,0 +1,45 @@ +#include "global.h" +#include "FS_file.h" +#include "OS_terminate_proc.h" +#include "CARD_rom.h" +#include "MI_memory.h" + +#include "unk_02022450.h" + +static const char string_saying_rom[] = "rom"; + +/*Replacing (HW_MAIN_MEM_SHARED + 0xC) or (HW_MAIN_MEM_SHARED + 0x10) or defining ADAJ or 01 constants causes match failure*/ +THUMB_FUNC void FUN_02022450 () { + if (!FS_IsAvailable()) { + OS_Terminate(); + } + else { + struct CARD_Header* card_header_buffer = (struct CARD_Header*)HW_MAIN_MEM_SHARED; + + if (!*(u32*)(HW_MAIN_MEM_SHARED + 0xC)) { + CARD_Init(); + MI_CpuCopy8((u8*)HW_ROM_HEADER_BUF, (u8*)card_header_buffer, HW_CARD_ROM_HEADER_SIZE); + MI_CpuCopy8((u8*)HW_ROM_HEADER_BUF, (u8*)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE); + *(u32*)(HW_MAIN_MEM_SHARED + 0xC) = 0x4A414441 /*"ADAJ" LE*/; + } + FSArchive * const r0 = FS_FindArchive(string_saying_rom, 3); + r0->fat = card_header_buffer->header_48; + r0->fat_size = card_header_buffer->header_4C; + r0->fnt = card_header_buffer->header_40; + r0->fnt_size = card_header_buffer->header_44; + if (*(u32*)(HW_MAIN_MEM_SHARED + 0xC) != 0x4A414441 /*"ADAJ" LE*/ || *(u16*)(HW_MAIN_MEM_SHARED + 0x10) != 0x3130 /*"01" LE*/) { + OS_Terminate(); + } + } + return; +} + +THUMB_FUNC void Reset_To_File (const char* path) { + FSFile file; + FS_InitFile(&file); + if (FS_OpenFile(&file, path)) { + *(u32*)HW_ROM_BASE_OFFSET_BUF = file.prop.file.top; + OS_ResetSystem(0); + } + return; +} diff --git a/arm9/src/unk_0202A1E0.c b/arm9/src/unk_0202A1E0.c new file mode 100644 index 00000000..4f32d430 --- /dev/null +++ b/arm9/src/unk_0202A1E0.c @@ -0,0 +1,536 @@ +#include "global.h" +#include "MI_memory.h" +#include "msgdata.h" +#include "heap.h" +#include "unk_0202A1E0.h" + +THUMB_FUNC s32 SaveStruct23_Substruct4_Substruct1_sizeof() +{ + return sizeof(struct SaveStruct23_Substruct4_Substruct1); // 228 +} + +THUMB_FUNC void SaveStruct23_Substruct1_Init(struct SaveStruct23_Substruct1 *substruct1) +{ + MI_CpuFill8(substruct1, 0, sizeof(struct SaveStruct23_Substruct1)); +} + +THUMB_FUNC void SaveStruct23_Substruct2_Init(struct SaveStruct23_Substruct2 *substruct2) +{ + MI_CpuFill8(substruct2, 0, sizeof(struct SaveStruct23_Substruct2)); + substruct2->u_3 = 1; +} + +THUMB_FUNC void SaveStruct23_Messages_Init(struct SaveStruct23_Messages *messages) +{ + MailMsg_init_fromTemplate(&messages->messages[0], 0); + MailMsg_init_fromTemplate(&messages->messages[1], 1); + MailMsg_init_fromTemplate(&messages->messages[2], 2); + MailMsg_init_fromTemplate(&messages->messages[3], 3); +} + +THUMB_FUNC void SaveStruct23_Substruct4_Init(struct SaveStruct23_Substruct4 *substruct4) +{ + MI_CpuFill8(substruct4, 0, sizeof(struct SaveStruct23_Substruct4)); +} + +THUMB_FUNC u32 SaveStruct23_Substruct1_GetField(struct SaveStruct23_Substruct1 *substruct1, SaveStruct23_Substruct1_Field field, void *dst) +{ + switch (field) + { + case FIELD_0x0_2: + return substruct1->u_0_2; + case FIELD_0x2: + return substruct1->u_2; + case FIELD_0x3: + return substruct1->u_3; + case FIELD_0x4: + return substruct1->u_4; + case FIELD_0x6: + return substruct1->u_6; + case FIELD_0x8: + MI_CpuCopy8(&substruct1->u_8, dst, 4); + return 0; + case FIELD_0x2C: + MI_CpuCopy8(&substruct1->u_2C, dst, 16); + return 0; + case FIELD_flag0: + return substruct1->flag0; + case FIELD_0xC: + MI_CpuCopy8(&substruct1->u_C, dst, 28); + return 0; + case FIELD_0x0_5: + return substruct1->u_0_5; + case FIELD_0x28: + return substruct1->u_28; + default: + return 0; + }; +} + +THUMB_FUNC void SaveStruct23_Substruct1_SetField(struct SaveStruct23_Substruct1 *substruct1, SaveStruct23_Substruct1_Field field, void *value) +{ + switch (field) + { + case FIELD_0x0_2: + substruct1->u_0_2 = *(u8 *)value; + break; + case FIELD_0x2: + substruct1->u_2 = *(u8 *)value; + break; + case FIELD_0x3: + substruct1->u_3 = *(u8 *)value; + break; + case FIELD_0x4: + substruct1->u_4 = *(u16 *)value; + break; + case FIELD_0x6: + substruct1->u_6 = *(u16 *)value; + break; + case FIELD_0x8: + MI_CpuCopy8(value, &substruct1->u_8, 4); + break; + case FIELD_0x2C: + MI_CpuCopy8(value, &substruct1->u_2C, 16); + break; + case FIELD_flag0: + substruct1->flag0 = *(u8 *)value; + break; + case FIELD_0xC: + MI_CpuCopy8(value, &substruct1->u_C, 28); + break; + case FIELD_0x28: + substruct1->u_28 = *(u32 *)value; + break; + case FIELD_0x0_5: + substruct1->u_0_5 = *(u8 *)value; + break; + } +} + +THUMB_FUNC void FUN_0202A36C(struct SaveStruct23_Substruct1 *substruct1, s32 arg1, s32 arg2, s32 arg3) +{ + if (substruct1->u_3 + arg1 < 0xff) + { + substruct1->u_3 += arg1; + } + + if (substruct1->u_4 + arg2 < 0xffff) + { + substruct1->u_4 += arg2; + } + + if (substruct1->u_6 + arg3 < 0xffff) + { + substruct1->u_6 += arg3; + } +} + +THUMB_FUNC BOOL SaveStruct23_Substruct1_GetFlag1(struct SaveStruct23_Substruct1 *substruct1) +{ + return substruct1->flag1; +} + +THUMB_FUNC void SaveStruct23_Substruct1_SetFlag1(struct SaveStruct23_Substruct1 *substruct1, BOOL flag) +{ + substruct1->flag1 = flag; +} + +THUMB_FUNC u16 SaveStruct23_Substruct2_SetField_0x0(struct SaveStruct23_Substruct2 *substruct2, u16 value, DataSetMode mode) +{ + switch (mode) + { + case DATA_SET: + if (value > 9999) + { + substruct2->u_0 = 9999; + } + else + { + substruct2->u_0 = value; + } + break; + case DATA_ADD: + if (substruct2->u_0 + value > 9999) + { + substruct2->u_0 = 9999; + } + else + { + substruct2->u_0 += value; + } + break; + case DATA_SUBSTRACT: + if (substruct2->u_0 < value) + { + substruct2->u_0 = 0; + } + else + { + substruct2->u_0 -= value; + } + break; + case DATA_GET: + default: + break; + } + return substruct2->u_0; +} + +THUMB_FUNC u8 SaveStruct23_Substruct2_SetField_0x2(struct SaveStruct23_Substruct2 *substruct2, DataSetMode mode) +{ + switch (mode) + { + case DATA_RESET: + substruct2->u_2 = 0; + substruct2->flag4 = 0; + break; + case DATA_INCREMENT: + if (substruct2->flag4) + { + substruct2->u_2++; + } + else + { + substruct2->u_2 = 1; + substruct2->flag4 = 1; + } + break; + } + return substruct2->u_2; +} + +THUMB_FUNC u8 SaveStruct23_Substruct2_SetField_0x3(struct SaveStruct23_Substruct2 *substruct2, DataSetMode mode) +{ + switch (mode) + { + case DATA_RESET: + substruct2->u_3 = 1; + break; + case DATA_INCREMENT: + if (substruct2->u_3 < 10) + { + substruct2->u_3++; + } + break; + case DATA_DECREMENT: + if (substruct2->u_3 > 1) + { + substruct2->u_3--; + } + break; + } + return substruct2->u_3; +} + +THUMB_FUNC void SaveStruct23_Substruct2_SetArray(struct SaveStruct23_Substruct2 *substruct2, s32 mode, void *src) +{ + if (mode == 0) + { + MI_CpuCopy8(src, substruct2->u_C0, 168); + } + else + { + MI_CpuCopy8(src, substruct2->u_18, 168); + } +} + +THUMB_FUNC void SaveStruct23_Substruct2_GetArray(struct SaveStruct23_Substruct2 *substruct2, s32 mode, void *dst) +{ + if (mode == 0) + { + MI_CpuCopy8(substruct2->u_C0, dst, 168); + } + else + { + MI_CpuCopy8(substruct2->u_18, dst, 168); + } +} + +THUMB_FUNC u16 SaveStruct23_Substruct2_SetField_0x16(struct SaveStruct23_Substruct2 *substruct2, struct Unk0202A4B8 *arg1) +{ + u16 var1, var2, var3, var4, var5, total; + + var1 = (u16) ((arg1->u_2 - 1) * 1000); + var2 = (u16) (arg1->u_4 * 10); + var3 = (u16) (arg1->u_3 * 20); + + if (var2 + var3 > 950) + { + var4 = 0; + } + else + { + var4 = (u16) (950 - (var2 + var3)); + } + + if (arg1->u_6 > 970) + { + var5 = 0; + } + else + { + var5 = (u16) ((1000 - arg1->u_6) / 30); + } + + total = (u16) (var1 + var4 + var5); + substruct2->u_16 = total; + return total; +} + +THUMB_FUNC u16 SaveStruct23_Substruct2_GetField_0x16(struct SaveStruct23_Substruct2 *substruct2) +{ + return substruct2->u_16; +} + +THUMB_FUNC u8 FUN_0202A524(struct SaveStruct23_Substruct2 *substruct2) +{ + return (u8)(substruct2->u_16 / 1000); +} + +THUMB_FUNC u16 SaveStruct23_Substruct2_SetField_0xC(struct SaveStruct23_Substruct2 *substruct2, u16 arg1, DataSetMode mode) +{ + if (arg1 == 5) + { + return 0; + } + + switch(mode) { + case DATA_RESET: + substruct2->u_C[arg1] = 0; + break; + case DATA_INCREMENT: + if (substruct2->u_C[arg1] < 0xfffe) { + substruct2->u_C[arg1]++; + } + break; + } + return substruct2->u_C[arg1]; +} + +THUMB_FUNC BOOL SaveStruct23_Substruct2_SetFlag(struct SaveStruct23_Substruct2 *substruct2, u16 flagNumber, DataSetMode mode) +{ + u16 i; + u16 flag = 1; + + for (i = 0; i < flagNumber ; i++) + { + flag <<= 1; + } + + switch (mode) + { + case DATA_RESET: + flag = (u16) (flag ^ 0xffff); + substruct2->flags &= flag; + break; + case DATA_SET: + substruct2->flags |= flag; + break; + case DATA_GET: + return (BOOL) ((substruct2->flags >> flagNumber) & 1); + } + + return FALSE; +} + + +THUMB_FUNC void SaveStruct23_Substruct2_SetField_0x4(struct SaveStruct23_Substruct2 *substruct2, u32 value) +{ + substruct2->u_4 = value; +} + +THUMB_FUNC u32 SaveStruct23_Substruct2_GetField_0x4(struct SaveStruct23_Substruct2 *substruct2) +{ + return substruct2->u_4; +} + + +THUMB_FUNC void SaveStruct23_SetMessage(struct SaveBlock2 *sav2, u32 index, struct MailMessage *message) +{ + struct SaveStruct23 *data = SavArray_get(sav2, 23); + MailMsg_copy(&data->messages.messages[index], message); +} + +THUMB_FUNC struct MailMessage *SaveStruct23_GetMessage(struct SaveBlock2 *sav2, u32 index) +{ + struct SaveStruct23 *data = SavArray_get(sav2, 23); + return &data->messages.messages[index]; +} + +THUMB_FUNC void SaveStruct23_Substruct4_SetArrayFlag(struct SaveStruct23_Substruct4 *substruct4, u8 arg1, u8 arg2, struct Unk0202A68C *arg3) { + + u8 flag = 1; + + if (arg2 == 0 || arg2 > 200) + { + return; + } + + if (arg1 == 0 || arg1 > 10) + { + return; + } + + u16 var1 = (u16) ((arg1 - 1) * 200 + (arg2 - 1)); + u8 index = (u8) (var1 / 8); + u8 remainder = (u8) (var1 % 8); + flag <<= remainder; + + substruct4->flags[index] |= flag; + substruct4->u_0 = (arg3->u_0 << 24) | ((arg3->u_4 & 0xff) << 16) | ((arg3->u_8 & 0xff) << 8) | arg3->u_C; +} + +THUMB_FUNC void SaveStruct23_Substruct4_ClearArrayFlags(struct SaveStruct23_Substruct4 *substruct4) +{ + + MI_CpuFill8(substruct4->flags, 0, 250); + MI_CpuFill8(&substruct4->u_0, 0, 4); +} + +THUMB_FUNC BOOL StructUnk0202A68C_Compare(struct Unk0202A68C *struct1, struct Unk0202A68C *struct2) +{ + if (struct1->u_0 > struct2->u_0) { + return TRUE; + } else if (struct1->u_4 > struct2->u_4) { + return TRUE; + } else if (struct1->u_8 > struct2->u_8) { + return TRUE; + } + return FALSE; +} + +THUMB_FUNC BOOL SaveStruct23_Substruct4_GetArrayFlag(struct SaveStruct23_Substruct4 *substruct4, u8 arg1, u8 arg2, struct Unk0202A68C *arg3) +{ + u8 flag = 1; + + if (arg2 > 200 || arg1 > 10) + { + return FALSE; + } + + u32 var0 = substruct4->u_0; + + Unk0202A68C var1; + var1.u_0 = var0 >> 24 & 0xff; + var1.u_4 = var0 >> 16 & 0xff; + var1.u_8 = var0 >> 8 & 0xff; + var1.u_C = var0 & 0xff; + + if (StructUnk0202A68C_Compare(arg3, &var1)) + { + SaveStruct23_Substruct4_ClearArrayFlags(substruct4); + return FALSE; + } + + u16 var2 = (u16) ((arg1 - 1) * 200 + (arg2 - 1)); + u8 index = (u8) (var2 / 8); + u8 remainder = (u8) (var2 % 8); + flag <<= remainder; + + if (substruct4->flags[index] & flag) + { + return TRUE; + } + return FALSE; +} + + +THUMB_FUNC u8 SaveStruct23_Substruct4_GetField_0xFE(struct SaveStruct23_Substruct4 *substruct4) +{ + return substruct4->u_FE; +} + +THUMB_FUNC u8 SaveStruct23_Substruct4_GetField_0xFF(struct SaveStruct23_Substruct4 *substruct4) +{ + return substruct4->u_FF; +} + +THUMB_FUNC void SaveStruct23_Substruct4_SetSubstruct1(struct SaveStruct23_Substruct4 *substruct4, struct SaveStruct23_Substruct4_Substruct1 *substruct1, u8 arg2, u8 arg3) +{ + MI_CpuCopy8(substruct1, &substruct4->substruct1, sizeof(struct SaveStruct23_Substruct4_Substruct1)*7); + substruct4->u_101 = arg2; + substruct4->u_100 = arg3; + substruct4->u_FE = 1; +} + +THUMB_FUNC void FUN_0202A784(struct SaveStruct23_Substruct4 *substruct4, struct Unk0202A784 *dst) +{ + dst->u_0 = substruct4->u_101; + dst->u_1 = substruct4->u_100; +} + +THUMB_FUNC void FUN_0202A798(struct SaveStruct23_Substruct4 *substruct4, struct Unk0202A798 *arg1, u32 arg2) +{ + struct Unk0202A798_substruct *unk_substruct = &arg1->u_0; + u8 *var1 = arg1->u_30; + struct SaveStruct23_Substruct4_Substruct1 *substruct4_substruct1 = &substruct4->substruct1[arg2]; + struct MsgData *message; + + unk_substruct->u_0 = 10000; + unk_substruct->u_4 = substruct4_substruct1->u_C9; + + if(substruct4_substruct1->u_C8_0) + { + message = NewMsgDataFromNarc(0, NARC_MSGDATA_MSG, 17, 11); + ReadMsgDataIntoU16Array(message, (u32) (22 + substruct4_substruct1->u_C8_1), unk_substruct->u_8); + DestroyMsgData(message); + } + else + { + MI_CpuCopy8(substruct4_substruct1->u_A8, unk_substruct->u_8, 16); + } + + MI_CpuCopy8(substruct4_substruct1->u_CA, unk_substruct->u_18, 8); + MI_CpuCopy8(substruct4_substruct1->u_D2, unk_substruct->u_20, 8); + MI_CpuCopy8(substruct4_substruct1->u_DA, unk_substruct->u_28, 8); + MI_CpuCopy8(substruct4_substruct1->u_0, var1, 168); +} + +THUMB_FUNC void FUN_0202A838(struct SaveStruct23_Substruct4 *substruct4, struct SaveStruct23_Substruct4_Substruct2 *substruct4_substruct2, u8 arg2, u8 arg3) +{ + MI_CpuCopy8(substruct4_substruct2, &substruct4->substruct2, sizeof(struct SaveStruct23_Substruct4_Substruct2)); + substruct4->u_103 = arg2; + substruct4->u_102 = arg3; + substruct4->u_FF = 1; +} + +THUMB_FUNC void FUN_0202A864(struct SaveStruct23_Substruct4 *substruct4, struct Unk0202A784 *dst) +{ + dst->u_0 = substruct4->u_103; + dst->u_1 = substruct4->u_102; +} + +THUMB_FUNC struct SaveStruct23_Substruct4_Substruct2 *FUN_0202A878(struct SaveStruct23_Substruct4 *substruct4, u32 heap_id) +{ + struct SaveStruct23_Substruct4_Substruct2 *substruct4_substruct2 = AllocFromHeap(heap_id, sizeof(struct SaveStruct23_Substruct4_Substruct2) /* 1020 */); + MI_CpuCopy8(&substruct4->substruct2, substruct4_substruct2, sizeof(struct SaveStruct23_Substruct4_Substruct2)); + return substruct4_substruct2; +} + +THUMB_FUNC s32 SaveStruct23_sizeof() +{ + return sizeof(struct SaveStruct23); // 0xD00 (3328) +} + +THUMB_FUNC void SaveStruct23_Init(struct SaveStruct23 *saveStruct23) +{ + SaveStruct23_Substruct1_Init(&saveStruct23->substruct1); + SaveStruct23_Substruct2_Init(&saveStruct23->substruct2); + SaveStruct23_Messages_Init(&saveStruct23->messages); + SaveStruct23_Substruct4_Init(&saveStruct23->substruct4); +} + +THUMB_FUNC struct SaveStruct23_Substruct1 *SaveStruct23_GetSubstruct1(struct SaveBlock2* sav2) +{ + return &((struct SaveStruct23 *)SavArray_get(sav2, 23))->substruct1; +} + +THUMB_FUNC struct SaveStruct23_Substruct2 *SaveStruct23_GetSubstruct2(struct SaveBlock2* sav2) +{ + return &((struct SaveStruct23 *)SavArray_get(sav2, 23))->substruct2; +} + +THUMB_FUNC struct SaveStruct23_Substruct4 *SaveStruct23_GetSubstruct4(struct SaveBlock2* sav2) +{ + return &((struct SaveStruct23 *)SavArray_get(sav2, 23))->substruct4; +}
\ No newline at end of file diff --git a/arm9/src/unk_02031734.c b/arm9/src/unk_02031734.c index 7d3b4c03..e6a1514b 100644 --- a/arm9/src/unk_02031734.c +++ b/arm9/src/unk_02031734.c @@ -1,6 +1,7 @@ #include "global.h" #include "unk_02031734.h" #include "MI_memory.h" +#include "communication_error.h" #include "game_init.h" #include "heap.h" #include "player_data.h" @@ -52,7 +53,6 @@ extern void MOD04_021DD6F0(); extern s32 MOD04_021D76AC(); extern MOD05_021D74E0(struct SaveBlock2 *sav2, u32 param1); extern void MOD04_021D83A8(void (*param0)(s32)); -extern void FUN_02033F70(int, int, int); extern void FUN_0200541C(); THUMB_FUNC void FUN_02031734(struct SaveBlock2 *sav2, u8 param1) @@ -2090,7 +2090,7 @@ THUMB_FUNC u8 FUN_020335B8() THUMB_FUNC void FUN_020335D0(s32 param0) { - FUN_02033F70(0, 1, param0); + ShowCommunicationError(0, 1, param0); while (TRUE) { } @@ -2098,7 +2098,7 @@ THUMB_FUNC void FUN_020335D0(s32 param0) THUMB_FUNC void FUN_020335E0() { - FUN_02033F70(0, 4, 0); + ShowCommunicationError(0, 4, 0); while (TRUE) { } diff --git a/arm9/src/unk_0204AEA8.c b/arm9/src/unk_0204AEA8.c index a2b2dd71..54deef4d 100644 --- a/arm9/src/unk_0204AEA8.c +++ b/arm9/src/unk_0204AEA8.c @@ -2,9 +2,9 @@ #include "heap.h" #include "unk_0204639C.h" #include "unk_0204AEA8.h" +#include "unk_020040F4.h" extern void MOD05_021E3444(u32, struct UnkSavStruct80 *, u32); -extern void FUN_0200433C(u32, u16, u32); THUMB_FUNC BOOL FUN_0204AEA8(struct UnkStruct_0204639C *a0) { diff --git a/arm9/src/unk_0204AF24.c b/arm9/src/unk_0204AF24.c new file mode 100644 index 00000000..31b3ffb0 --- /dev/null +++ b/arm9/src/unk_0204AF24.c @@ -0,0 +1,135 @@ +#include "global.h"
+#include "unk_0204AF24.h"
+
+extern void FUN_02037394(struct UnkSavStruct80 *);
+extern u32 FUN_0200E308(void);
+extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id);
+extern void MOD05_021E331C(struct UnkSavStruct80 *);
+
+THUMB_FUNC BOOL FUN_0204AF24(struct UnkStruct_0204639C * arg0)
+{
+ if(!FUN_0203739C(FUN_02046528(arg0)))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0204AF3C(struct UnkStruct_0204639C * r5)
+{
+ struct UnkSavStruct80 * r4 = FUN_02046528(r5);
+ if(!FUN_0203739C(r4))
+ {
+ GF_ASSERT(0);
+ return;
+ }
+ FUN_02037394(r4);
+ FUN_0204640C(r5, &FUN_0204AF24, NULL);
+}
+
+THUMB_FUNC BOOL FUN_0204AF6C(struct UnkStruct_0204639C * arg0)
+{
+ if(FUN_020464A4(FUN_02046528(arg0)))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0204AF84(struct UnkStruct_0204639C * r5)
+{
+ struct UnkSavStruct80 * r4 = FUN_02046528(r5);
+ if(FUN_0203739C(r4))
+ {
+ GF_ASSERT(0);
+ return;
+ }
+ FUN_0204649C(r4);
+ FUN_0204640C(r5, &FUN_0204AF6C, NULL);
+}
+
+THUMB_FUNC BOOL FUN_0204AFB4(struct UnkStruct_0204639C * arg0)
+{
+#pragma unused(arg0)
+ if(FUN_0200E308())
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0204AFC8(struct UnkStruct_0204639C * r4)
+{
+ if(!FUN_0203739C(FUN_02046528(r4)))
+ {
+ GF_ASSERT(0);
+ return;
+ }
+ FUN_0200E1D0(0, 0, 0, 0, 6, 1, 4);
+ FUN_0204640C(r4, &FUN_0204AFB4, 0);
+}
+
+THUMB_FUNC void FUN_0204B00C(struct UnkStruct_0204639C * r4)
+{
+ if(!FUN_0203739C(FUN_02046528(r4)))
+ {
+ GF_ASSERT(0);
+ return;
+ }
+ FUN_0200E1D0(0, 1, 1, 0, 6, 1, 4);
+ FUN_0204640C(r4, FUN_0204AFB4, 0);
+}
+
+THUMB_FUNC BOOL FUN_0204B050(struct UnkStruct_0204639C * r5)
+{
+ u32 * r4 = FUN_02046530(r5);
+ switch(r4[0])
+ {
+ case 0:
+ FUN_0204AFC8(r5);
+ r4[0]++;
+ break;
+ case 1:
+ FUN_0204AF3C(r5);
+ r4[0]++;
+ break;
+ case 2:
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0204B090(struct UnkStruct_0204639C * r0)
+{
+ FUN_0204640C(r0, &FUN_0204B050, 0);
+}
+
+THUMB_FUNC BOOL FUN_0204B0A0(struct UnkStruct_0204639C * r5)
+{
+ u32 * r4 = FUN_02046530(r5);
+ struct UnkSavStruct80 * r0 = FUN_02046528(r5);
+ switch(r4[0])
+ {
+ case 0:
+ FUN_0204AF84(r5);
+ r4[0]++;
+ break;
+ case 1:
+ MOD05_021E331C(r0);
+ FUN_0204B00C(r5);
+ r4[0]++;
+ break;
+ case 2:
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0204B0E8(struct UnkStruct_0204639C * r0)
+{
+ FUN_0204640C(r0, &FUN_0204B0A0, 0);
+}
diff --git a/arm9/src/unk_0205FA2C.c b/arm9/src/unk_0205FA2C.c index cabd756e..a023ad83 100644 --- a/arm9/src/unk_0205FA2C.c +++ b/arm9/src/unk_0205FA2C.c @@ -1,5 +1,6 @@ #include "unk_0205FA2C.h" #include "unk_020337E8.h" +#include "unk_0202A1E0.h" extern void *UNK_020F96DC; extern void *UNK_020FA6E8; @@ -11,17 +12,9 @@ extern u16 *GetVarPointer(struct UnkSavStruct80 *arg, u16); extern u16 MOD06_02244660(struct UnkSavStruct80 *param0, u8 *param1); extern u16 MOD06_022446BC(struct UnkSavStruct80 *param0, u8 *param1); extern u16 MOD06_022446E0(struct UnkSavStruct80 *param0, u8 *param1); -extern void FUN_0202A5CC(u32 param0, u32 param1); -extern u32 FUN_0202A5D0(u32 param0); extern u32 FUN_0202A150(struct UnkStruct_02029FB0 *param0, u32 param1); -extern u32 FUN_0202A8D8(struct SaveBlock2 *sav2); -extern u32 FUN_0202A578(u32 param0, u32 param1, u32 param2); extern u32 FUN_02026CC4(struct SaveBlock2 *sav2); extern u32 FUN_02025D94(u32 param0, u32 param1); -extern u32 FUN_0202A8CC(struct SaveBlock2 *sav2); -extern void FUN_0202A2C4(u32 param0, u32 param1, u32 *param2); -extern u32 FUN_0202A240(u32 param0, u32 param1, u32 param2); -extern int FUN_0202A538(u32 param0, u16 param1, u32 param2); const u8 UNK_020F7454[] = { 0x00, @@ -327,33 +320,33 @@ THUMB_FUNC u32 FUN_0205FE10(struct SaveBlock2 *sav2) return 0; } - u32 res2 = FUN_0202A8D8(sav2); + struct SaveStruct23_Substruct2 *saveStruct23_substruct2 = SaveStruct23_GetSubstruct2(sav2); - u8 res3 = (u8)FUN_0202A578(res2, 0xd, 0); - u8 res4 = (u8)FUN_0202A578(res2, 0, 0); - u8 res5 = (u8)FUN_0202A578(res2, 1, 0); + BOOL flagD = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xd, DATA_GET); + BOOL flag0 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0, DATA_GET); + BOOL flag1 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 1, DATA_GET); - u8 res6 = (u8)FUN_0202A578(res2, 0xe, 0); - u8 res7 = (u8)FUN_0202A578(res2, 2, 0); - u8 res8 = (u8)FUN_0202A578(res2, 3, 0); + BOOL flagE = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xe, DATA_GET); + BOOL flag2 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 2, DATA_GET); + BOOL flag3 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 3, DATA_GET); - if (res3 != 0 && res4 != 0 && res5 != 0) + if (flagD && flag0 && flag1) { return 0; } u32 res9 = FUN_02026CC4(sav2); - if (res3 == 0) + if (!flagD) { if (FUN_02025D94(res9, 0x55) != 0) { - FUN_0202A578(res2, 0xd, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xd, DATA_SET); return 1; } - if (res6 == 0) + if (!flagE) { - FUN_0202A578(res2, 0xe, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xe, DATA_SET); } return 4; @@ -364,36 +357,36 @@ THUMB_FUNC u32 FUN_0205FE10(struct SaveBlock2 *sav2) return 0; } - if (res4 == 0) + if (!flag0) { if (FUN_02025D94(res9, 0x56) != 0) { - FUN_0202A578(res2, 0, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0, DATA_SET); return 2; } - if (res7 == 0) + if (!flag2) { - FUN_0202A578(res2, 2, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 2, DATA_SET); } return 4; } - if (res < 100 || res5 != 0) + if (res < 100 || flag1) { return 0; } if (FUN_02025D94(res9, 0x57) != 0) { - FUN_0202A578(res2, 1, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 1, DATA_SET); return 3; } - if (res8 == 0) + if (!flag3) { - FUN_0202A578(res2, 3, 1); + SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 3, DATA_SET); } return 4; @@ -407,24 +400,24 @@ THUMB_FUNC u32 FUN_0205FF5C(struct SaveBlock2 *sav2) return 0; } - u32 res2 = FUN_0202A8D8(sav2); + struct SaveStruct23_Substruct2 *saveStruct23_substruct2 = SaveStruct23_GetSubstruct2(sav2); - u8 res3 = (u8)FUN_0202A578(res2, 0xd, 0); - u8 res4 = (u8)FUN_0202A578(res2, 0, 0); - u8 res5 = (u8)FUN_0202A578(res2, 1, 0); + BOOL flagD = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xd, DATA_GET); + BOOL flag0 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0, DATA_GET); + BOOL flag1 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 1, DATA_GET); - u8 res6 = (u8)FUN_0202A578(res2, 0xe, 0); - u8 res7 = (u8)FUN_0202A578(res2, 2, 0); - u8 res8 = (u8)FUN_0202A578(res2, 3, 0); + BOOL flagE = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 0xe, DATA_GET); + BOOL flag2 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 2, DATA_GET); + BOOL flag3 = (u8)SaveStruct23_Substruct2_SetFlag(saveStruct23_substruct2, 3, DATA_GET); - if (res3 != 0 && res4 != 0 && res5 != 0) + if (flagD && flag0 && flag1) { return 0; } - if (res3 == 0) + if (!flagD) { - if (res6 != 0) + if (flagE) { return 4; } @@ -437,9 +430,9 @@ THUMB_FUNC u32 FUN_0205FF5C(struct SaveBlock2 *sav2) return 0; } - if (res4 == 0) + if (!flag0) { - if (res7 != 0) + if (flag2) { return 5; } @@ -452,12 +445,12 @@ THUMB_FUNC u32 FUN_0205FF5C(struct SaveBlock2 *sav2) return 0; } - if (res5 != 0) + if (flag1) { return 0; } - if (res8 != 0) + if (flag3) { return 6; } @@ -488,42 +481,42 @@ THUMB_FUNC u32 FUN_0206007C(struct SaveBlock2 *sav2) { u32 res = FUN_02060070(FUN_020287A4(FUN_0202881C(sav2))); - FUN_0202A5CC(FUN_0202A8D8(sav2), res); + SaveStruct23_Substruct2_SetField_0x4(SaveStruct23_GetSubstruct2(sav2), res); return res; } THUMB_FUNC u32 FUN_020600A0(struct SaveBlock2 *sav2) { - u32 res = FUN_0202A8D8(sav2); + struct SaveStruct23_Substruct2 *saveStruct23_substruct2 = SaveStruct23_GetSubstruct2(sav2); - u32 res2 = FUN_02060070(FUN_0202A5D0(res)); + u32 res2 = FUN_02060070(SaveStruct23_Substruct2_GetField_0x4(saveStruct23_substruct2)); - FUN_0202A5CC(res, res2); + SaveStruct23_Substruct2_SetField_0x4(saveStruct23_substruct2, res2); u32 res3 = FUN_02060064(res2); - FUN_0202A2C4(FUN_0202A8CC(sav2), 0xa, &res3); + SaveStruct23_Substruct1_SetField(SaveStruct23_GetSubstruct1(sav2), FIELD_0x28, &res3); return res3; } THUMB_FUNC u32 FUN_020600DC(struct SaveBlock2 *sav2) { - u32 res = FUN_0202A8D8(sav2); + struct SaveStruct23_Substruct2 *saveStruct23_substruct2 = SaveStruct23_GetSubstruct2(sav2); - u32 res2 = FUN_0202A8CC(sav2); + struct SaveStruct23_Substruct1 *saveStruct23_substruct1 = SaveStruct23_GetSubstruct1(sav2); - u32 res3 = FUN_02060064(FUN_0202A5D0(res)); + u32 res3 = FUN_02060064(SaveStruct23_Substruct2_GetField_0x4(saveStruct23_substruct2)); int i = 0; - int res4 = FUN_0202A538(res, (u16)FUN_0202A240(res2, 0, 0), 0) * 0x18; + int res4 = SaveStruct23_Substruct2_SetField_0xC(saveStruct23_substruct2, (u16)SaveStruct23_Substruct1_GetField(saveStruct23_substruct1, FIELD_0x0_2, 0), DATA_GET) * 0x18; for (i = 0; i < res4; i++) { res3 = FUN_02060064(res3); } - FUN_0202A2C4(FUN_0202A8CC(sav2), 0xa, &res3); + SaveStruct23_Substruct1_SetField(SaveStruct23_GetSubstruct1(sav2), FIELD_0x28, &res3); return res3; } diff --git a/arm9/src/unk_0206015C.c b/arm9/src/unk_0206015C.c index 0bf3a15a..752a9970 100644 --- a/arm9/src/unk_0206015C.c +++ b/arm9/src/unk_0206015C.c @@ -3,38 +3,33 @@ #include "heap.h" #include "event_data.h" #include "main.h" +#include "unk_0204AF24.h" /* Note to future reader, there might be some errors in the return type / parameters. They are right for this code but they might not be for every code, please do not blindly trust these prototypes if you are decompiling these functions. */ -extern THUMB_FUNC u32 MOD06_02244DB0(u32); -extern THUMB_FUNC void MOD06_02244DBC(void*); -extern THUMB_FUNC void MOD06_02244DC4(void*, void*); -extern THUMB_FUNC void MOD06_02244EF8(void*); -extern THUMB_FUNC void MOD06_02244F18(void*); -extern THUMB_FUNC BOOL MOD06_02244F24(void*); -extern THUMB_FUNC void MOD06_02244F2C(void*); -extern THUMB_FUNC void* MOD06_02245088(struct UnkSavStruct80 * savStruct); -extern THUMB_FUNC u32 MOD06_02245114(u32, struct UnkSavStruct80*); -extern THUMB_FUNC void MOD06_02245190(u32); -extern THUMB_FUNC void MOD06_02245198(u8, u32); -extern THUMB_FUNC u32 MOD06_022451F0(u32); - -extern THUMB_FUNC void PlaySE(u32); -extern THUMB_FUNC void FUN_02049160(struct UnkStruct_0204639C*, u32); -extern THUMB_FUNC void FUN_0204AF84(struct UnkStruct_0204639C*); -extern THUMB_FUNC void FUN_0204AF3C(struct UnkStruct_0204639C *); -extern THUMB_FUNC void FUN_0204AFC8(struct UnkStruct_0204639C *); -extern THUMB_FUNC void FUN_0204B00C(struct UnkStruct_0204639C *); -extern THUMB_FUNC void FUN_0204C1B4(struct UnkStruct_0204639C*, u32,u32,u32,u32,u32,u32,u32); -extern THUMB_FUNC u32 FUN_020553A0(u32); -extern THUMB_FUNC void FUN_0205889C(u32, u32); -extern THUMB_FUNC void FUN_0205F1C4(struct ScriptState *); -extern THUMB_FUNC void FUN_0205F1D4(struct ScriptState *); -extern THUMB_FUNC void FUN_0206367C(struct UnkSavStruct80 *, u32); - - +extern u32 MOD06_02244DB0(u32); +extern void MOD06_02244DBC(void*); +extern void MOD06_02244DC4(void*, void*); +extern void MOD06_02244EF8(void*); +extern void MOD06_02244F18(void*); +extern BOOL MOD06_02244F24(void*); +extern void MOD06_02244F2C(void*); +extern void * MOD06_02245088(struct UnkSavStruct80 * savStruct); +extern u32 MOD06_02245114(u32, struct UnkSavStruct80*); +extern void MOD06_02245190(u32); +extern void MOD06_02245198(u8, u32); +extern u32 MOD06_022451F0(u32); + +extern void PlaySE(u32); +extern void FUN_02049160(struct UnkStruct_0204639C*, u32); +extern void FUN_0204C1B4(struct UnkStruct_0204639C*, u32,u32,u32,u32,u32,u32,u32); +extern u32 FUN_020553A0(u32); +extern void FUN_0205889C(u32, u32); +extern void FUN_0205F1C4(struct ScriptState *); +extern void FUN_0205F1D4(struct ScriptState *); +extern void FUN_0206367C(struct UnkSavStruct80 *, u32); THUMB_FUNC void FUN_0206015C(struct UnkSavStruct80 *savStruct) { diff --git a/arm9/src/unk_02064E20.c b/arm9/src/unk_02064E20.c new file mode 100644 index 00000000..8586981b --- /dev/null +++ b/arm9/src/unk_02064E20.c @@ -0,0 +1,17 @@ +#include "global.h"
+#include "scrcmd.h"
+#include "unk_02025484.h"
+#include "unk_02024E64.h"
+#include "unk_02064E20.h"
+
+THUMB_FUNC void FUN_02064E20(struct UnkSavStruct80* unk0)
+{
+ struct unk_2025484 * r4 = (struct unk_2025484 *)FUN_02024ED8(ScriptEnvironment_GetSav2Ptr(unk0));
+ if((u32)FUN_020254B4(r4) == 6)
+ {
+ return;
+ }
+ FUN_02025490(r4, 6);
+ u16 * ptr0 = (u16 *)FUN_020254A0(r4 , 6);
+ ptr0[0] = 2;
+}
diff --git a/arm9/src/unk_02088DD8.c b/arm9/src/unk_02088DD8.c new file mode 100644 index 00000000..b4633d25 --- /dev/null +++ b/arm9/src/unk_02088DD8.c @@ -0,0 +1,76 @@ +#include "global.h" +#include "heap.h" +#include "pokemon.h" +#include "unk_02088DD8.h" + +extern void LoadWotbl_HandleAlternateForme(int species, int forme, u16 * wotbl); + +THUMB_FUNC struct UnkStruct_02088DD8* FUN_02088DD8(u32 heap_id) { + struct UnkStruct_02088DD8 *returnPointer = AllocFromHeap(heap_id, sizeof(struct UnkStruct_02088DD8)); + __builtin__clear(returnPointer, sizeof(struct UnkStruct_02088DD8)); + return returnPointer; +} + +THUMB_FUNC void FUN_02088DF0(struct UnkStruct_02037CF0 *r0) { + FreeToHeap(r0); +} + +#define WOTBL_END 0xFFFF +#define WOTBL_MOVE_MASK 0x01FF +#define WOTBL_MOVE_SHIFT 0 +#define WOTBL_LVL_MASK 0xFE00 +#define WOTBL_LVL_SHIFT 9 +#define WOTBL_MOVE(x) ((u16)(((x) & WOTBL_MOVE_MASK) >> WOTBL_MOVE_SHIFT)) +#define WOTBL_LVL(x) (/*(u8)*/(((x) & WOTBL_LVL_MASK) >> WOTBL_LVL_SHIFT)) +// i don't know why either. + +THUMB_FUNC u16* GetEligibleLevelUpMoves(struct Pokemon* pokemon, u32 heap_id) { + u16 species = (u16)GetMonData(pokemon, MON_DATA_SPECIES, 0); + u8 forme = (u8)GetMonData(pokemon, MON_DATA_FORME, 0); + u8 level = (u8)GetMonData(pokemon, MON_DATA_LEVEL, 0); + u16 moves[4]; + + for (u8 i = 0; i < 4; ++i) { + moves[i] = (u16)GetMonData(pokemon, MON_DATA_MOVE1 + i, 0); + } + + u16 *tableFromFile = AllocFromHeap(heap_id, 44); + u16 *returnTable = AllocFromHeap(heap_id, 44); + + LoadWotbl_HandleAlternateForme(species, forme, tableFromFile); + + for (u8 i = 0, j, k = 0; i < 22; i++) { + if (tableFromFile[i] == WOTBL_END) { + returnTable[k] = WOTBL_END; + break; + } + else { + if (WOTBL_LVL(tableFromFile[i]) > level) continue; + + tableFromFile[i] = WOTBL_MOVE(tableFromFile[i]); + + for (j = 0; j < 4; j++) { + if (tableFromFile[i] == moves[j]) break; + } + if (j != 4) continue; + + if (k >= 0) { + // don't know when that would be false + for (j = 0; j < k; j++) { + if (returnTable[j] == tableFromFile[i]) break; + } + } + if (j != k) continue; + + returnTable[k] = tableFromFile[i]; + k++; + } + } + + FreeToHeap(tableFromFile); + return returnTable; +} + +THUMB_FUNC BOOL FUN_02088EF8(u16 *r0) { + return *r0 != 0xFFFF; +} diff --git a/arm9/src/wfc_user_info_warning.c b/arm9/src/wfc_user_info_warning.c new file mode 100644 index 00000000..d9edd94c --- /dev/null +++ b/arm9/src/wfc_user_info_warning.c @@ -0,0 +1,151 @@ +#include "global.h" +#include "bg_window.h" +#include "filesystem.h" +#include "game_init.h" +#include "GX_layers.h" +#include "main.h" +#include "msgdata.h" +#include "msgdata/msg.naix" +#include "PAD_pad.h" +#include "string16.h" +#include "text.h" +#include "wfc_user_info_warning.h" + +extern void FUN_02002ED0(enum GFBgLayer layer, u32 base_addr, u32 heap_id); +extern void FUN_0200A274(fx32 brightness, fx32, u32); +extern void FUN_0200CB00(struct BgConfig* bg_config, enum GFBgLayer layer, u32 num_tiles, u32, u8, u32 heap_id); +extern void FUN_0200CCA4(struct Window* window, BOOL copy_to_vram, u16 fill_value, u32 palette_num); +extern void FUN_0200E394(BOOL set_brightness_on_bottom_screen); +extern void FUN_0200E3A0(BOOL set_brightness_on_bottom_screen, s32); + +static const struct WindowTemplate sWFCWarningMsgWindowTemplate = { + .bgId = GF_BG_LYR_MAIN_0, + .tilemapLeft = 3, + .tilemapTop = 3, + .width = 26, + .height = 18, + .paletteNum = 0x01, + .baseTile = 0x23, +}; + +static const struct GraphicsModes sWFCWarningMsgGraphicsModes = { + .dispMode = GX_DISPMODE_GRAPHICS, + .bgMode = GX_BGMODE_0, + .subMode = GX_BGMODE_0, + ._2d3dMode = GX_BG0_AS_2D, +}; + +static const struct BgTemplate sWFCWarningMsgBgTemplate = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x18000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = GX_BG_AREAOVER_XLU, + .unk17 = 0, + .mosaic = FALSE, +}; + +static const struct GraphicsBanks sWFCWarningMsgGraphicsBanks = { + .bg = 3, + .bgextpltt = 0, + .subbg = 0, + .subbgextpltt = 0, + .obj = 0, + .objextpltt = 0, + .subobj = 0, + .subobjextpltt = 0, + .tex = 0, + .texpltt = 0, +}; + +THUMB_FUNC void ShowWFCUserInfoWarning(u32 heap_id, u32 a1) +{ +#pragma unused(a1) + struct Window window; + + FUN_0200E3A0(PM_LCD_TOP, 0); + FUN_0200E3A0(PM_LCD_BOTTOM, 0); + + FUN_02015EF4(); + Main_SetVBlankIntrCB(NULL, NULL); + FUN_02015F34(NULL, NULL); + + GX_DisableEngineALayers(); + GX_DisableEngineBLayers(); + reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK; + reg_GXS_DB_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK; + + SetKeyRepeatTimers(4, 8); + + gMain.unk65 = 0; + + GX_SwapDisplay(); + reg_G2_BLDCNT = 0; + reg_G2S_DB_BLDCNT = 0; + reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK); + reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK); + GX_SetBanks(&sWFCWarningMsgGraphicsBanks); + + struct BgConfig* bg_config = BgConfig_Alloc(heap_id); + + SetBothScreensModesAndDisable(&sWFCWarningMsgGraphicsModes); + + InitBgFromTemplate(bg_config, 0, &sWFCWarningMsgBgTemplate, 0); + BgClearTilemapBufferAndCommit(bg_config, 0); + FUN_0200CB00(bg_config, GF_BG_LYR_MAIN_0, 0x01F7, 2, 0, heap_id); + FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, heap_id); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, heap_id); + BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0x6C21); + BG_SetMaskColor(GF_BG_LYR_SUB_0, 0x6C21); + + struct MsgData* warning_messages_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0613_bin, heap_id); + struct String* warning_message = String_ctor(384, heap_id); + FUN_0201BD5C(); + AddWindow(bg_config, &window, &sWFCWarningMsgWindowTemplate); + FillWindowPixelRect(&window, 0xF, 0, 0, 208, 144); + FUN_0200CCA4(&window, FALSE, 0x01F7, 2); + + ReadMsgDataIntoString(warning_messages_data, 15, warning_message); + AddTextPrinterParameterized(&window, 0, warning_message, 0, 0, 0, 0); + String_dtor(warning_message); + + GX_BothDispOn(); + FUN_0200E394(0); + FUN_0200E394(1); + FUN_0200A274(0, 0x3F, 3); + + while (TRUE) + { + u16 pressed_buttons = PAD_Read(); + + HandleDSLidAction(); + + if (pressed_buttons & PAD_BUTTON_A) + { + break; + } + + OS_WaitIrq(TRUE, OS_IE_V_BLANK); + } + + RemoveWindow(&window); + DestroyMsgData(warning_messages_data); + + ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GX_LAYER_TOGGLE_OFF); + + FreeBgTilemapBuffer(bg_config, 0); + FreeToHeap(bg_config); +} |