summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/bag_view.c5
-rw-r--r--arm9/src/communication_error.c159
-rw-r--r--arm9/src/font.c66
-rw-r--r--arm9/src/game_init.c15
-rw-r--r--arm9/src/main.c13
-rw-r--r--arm9/src/map_header.c100
-rw-r--r--arm9/src/map_matrix.c231
-rw-r--r--arm9/src/palette.c692
-rw-r--r--arm9/src/save.c1
-rw-r--r--arm9/src/save_arrays.c5
-rw-r--r--arm9/src/scrcmd.c98
-rw-r--r--arm9/src/scrcmd_24.c8
-rw-r--r--arm9/src/scrcmd_sound.c7
-rw-r--r--arm9/src/sound.c16
-rw-r--r--arm9/src/text.c4
-rw-r--r--arm9/src/timer3.c6
-rw-r--r--arm9/src/unk_02002F08.c139
-rw-r--r--arm9/src/unk_020040F4.c1365
-rw-r--r--arm9/src/unk_020051F4.c716
-rw-r--r--arm9/src/unk_020061E8.c35
-rw-r--r--arm9/src/unk_0200CA44.c10
-rw-r--r--arm9/src/unk_0201C6B4.c80
-rw-r--r--arm9/src/unk_0201E7D8.c2
-rw-r--r--arm9/src/unk_020222E8.c33
-rw-r--r--arm9/src/unk_02022450.c45
-rw-r--r--arm9/src/unk_0202A1E0.c536
-rw-r--r--arm9/src/unk_02031734.c6
-rw-r--r--arm9/src/unk_0204AEA8.c2
-rw-r--r--arm9/src/unk_0204AF24.c135
-rw-r--r--arm9/src/unk_0205FA2C.c97
-rw-r--r--arm9/src/unk_0206015C.c49
-rw-r--r--arm9/src/unk_02064E20.c17
-rw-r--r--arm9/src/unk_02088DD8.c76
-rw-r--r--arm9/src/wfc_user_info_warning.c151
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], &param2);
+
+ 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);
+}