#include "unk_020393C8.h" #include #include #include "struct_defs/struct_020E5EB4.h" #include "communication_system.h" #include "heap.h" #include "inlines.h" #include "sys_task.h" #include "sys_task_manager.h" #include "unk_02017728.h" #include "unk_02033200.h" #include "unk_020366A0.h" typedef struct UnkStruct_020393C8_t { int unk_00; int unk_04; int unk_08; u16 unk_0C; u16 unk_0E; u8 unk_10; u8 unk_11; u8 unk_12; const UnkStruct_020E5EB4 **unk_14; SysTask *unk_18; GXOamAttr *unk_1C; } UnkStruct_020393C8; static int inline inline_02039614(UnkStruct_020393C8 *param0); static int inline inline_02039614_1(int param0, int param1); static void sub_02039428(SysTask *param0, void *param1); static void sub_020394D0(int param0, BOOL param1, u32 param2, u32 param3); static void sub_02039530(int param0, BOOL param1, u32 param2); static void sub_02039614(UnkStruct_020393C8 *param0); UnkStruct_020393C8 *sub_020393C8(u32 param0, u32 param1, int param2, int param3, BOOL param4, const UnkStruct_020E5EB4 *param5[], int param6) { UnkStruct_020393C8 *v0; sub_020394D0(param6, param4, (16 * 2 * 14), param1); sub_02039530(param6, param4, param1); v0 = (UnkStruct_020393C8 *)Heap_AllocFromHeapAtEnd(param1, sizeof(UnkStruct_020393C8)); v0->unk_18 = SysTask_ExecuteAfterVBlank(sub_02039428, v0, 5); v0->unk_0C = param2; v0->unk_0E = param3; v0->unk_00 = 0; v0->unk_04 = 3; v0->unk_14 = param5; v0->unk_08 = 0; v0->unk_10 = param4; v0->unk_12 = 0; v0->unk_11 = 0; v0->unk_1C = (GXOamAttr *)HW_OAM; return v0; } static void sub_02039428(SysTask *param0, void *param1) { UnkStruct_020393C8 *v0 = (UnkStruct_020393C8 *)param1; sub_02039614(v0); } static int inline inline_02039614(UnkStruct_020393C8 *param0) { switch (param0->unk_11) { case 1: return (GX_GetDispSelect() == GX_DISP_SELECT_MAIN_SUB) ? NNS_G2D_VRAM_TYPE_2DMAIN : NNS_G2D_VRAM_TYPE_2DSUB; case 2: return (GX_GetDispSelect() == GX_DISP_SELECT_MAIN_SUB) ? NNS_G2D_VRAM_TYPE_2DSUB : NNS_G2D_VRAM_TYPE_2DMAIN; default: return NNS_G2D_VRAM_TYPE_2DMAIN; } } static int inline inline_02039614_1(int param0, int param1) { int v0, v1; if (param0 == NNS_G2D_VRAM_TYPE_2DMAIN) { v0 = GX_GetOBJVRamModeChar(); v1 = GX_GetBankForOBJ(); } else { v0 = GXS_GetOBJVRamModeChar(); v1 = GX_GetBankForSubOBJ(); } switch (v0) { case GX_OBJVRAMMODE_CHAR_1D_32K: if ((v1 == GX_VRAM_OBJ_16_G) || (v1 == GX_VRAM_OBJ_16_F)) { return 512 - 16 + 4 * param1; } else { return 1024 - 16 + 4 * param1; } case GX_OBJVRAMMODE_CHAR_1D_128K: if ((v1 == GX_VRAM_OBJ_80_EF) || (v1 == GX_VRAM_OBJ_80_EG)) { return 640 - 4 + 1 * param1; } else if (v1 == GX_VRAM_OBJ_64_E) { return 512 - 4 + 1 * param1; } else { return 1024 - 4 + 1 * param1; } default: return 1024 - 8 + 2 * param1; } } static inline void inline_02039440(GXOamAttr *param0) { G2_SetOBJAttr(param0, 0, 0, 0, GX_OAM_MODE_NORMAL, 0, GX_OAM_EFFECT_NODISPLAY, GX_OAM_SHAPE_16x16, GX_OAM_COLORMODE_16, 0, 0, 0); } void sub_02039434(UnkStruct_020393C8 *param0, int param1) { if (param1 < 4) { param0->unk_04 = param1; param0->unk_08 = 0; } } void sub_02039440(UnkStruct_020393C8 *param0) { SysTask_Done(param0->unk_18); inline_02039440((GXOamAttr *)(HW_OAM)); if (param0->unk_12) { inline_02039440((GXOamAttr *)(HW_OAM_END)); } Heap_FreeToHeap(param0); } void sub_02039474(UnkStruct_020393C8 *param0, BOOL param1, u32 param2) { sub_020394D0(NNS_G2D_VRAM_TYPE_2DSUB, param0->unk_10, (16 * 2 * 14), param2); sub_02039530(NNS_G2D_VRAM_TYPE_2DSUB, param0->unk_10, param2); param0->unk_11 = (param1) ? 1 : 2; param0->unk_12 = 1; } void *sub_020394A8(u32 param0) { void *v0 = Heap_AllocFromHeapAtEnd(param0, 600); ReadFileToBuffer("data/pl_wm.NCLR", &v0); DC_FlushRange(v0, 600); return v0; } static void sub_020394D0(int param0, BOOL param1, u32 param2, u32 param3) { void *v0 = Heap_AllocFromHeapAtEnd(param3, 600); if (v0) { NNSG2dPaletteData *v1; ReadFileToBuffer("data/pl_wm.NCLR", &v0); DC_FlushRange(v0, 600); NNS_G2dGetUnpackedPaletteData(v0, &v1); if (param0 == NNS_G2D_VRAM_TYPE_2DMAIN) { GX_LoadOBJPltt(v1->pRawData, param2, (16 * 2)); } else { GXS_LoadOBJPltt(v1->pRawData, param2, (16 * 2)); } Heap_FreeToHeap(v0); } } static void sub_02039530(int param0, BOOL param1, u32 param2) { void *v0 = Heap_AllocFromHeapAtEnd(param2, 600); if (v0) { NNSG2dCharacterData *v1; int v2, v3, v4; if (param1) { ReadFileToBuffer("data/pl_wifi.NCGR", &v0); } else { ReadFileToBuffer("data/pl_wm.NCGR", &v0); } DC_FlushRange(v0, 600); NNS_G2dGetUnpackedBGCharacterData(v0, &v1); if (param0 == NNS_G2D_VRAM_TYPE_2DMAIN) { v3 = GX_GetOBJVRamModeChar(); v4 = GX_GetBankForOBJ(); } else { v3 = GXS_GetOBJVRamModeChar(); v4 = GX_GetBankForSubOBJ(); } switch (v3) { case GX_OBJVRAMMODE_CHAR_1D_32K: if ((v4 == GX_VRAM_OBJ_16_G) || (v4 == GX_VRAM_OBJ_16_F)) { v2 = ((512 - 16) * 32); } else { v2 = ((1024 - 16) * 32); } break; case GX_OBJVRAMMODE_CHAR_1D_128K: if ((v4 == GX_VRAM_OBJ_80_EF) || (v4 == GX_VRAM_OBJ_80_EG)) { v2 = ((2560 - 16) * 32); } else if (v4 == GX_VRAM_OBJ_64_E) { v2 = 0x10000 - 16 * 32; } else { v2 = ((4096 - 16) * 32); } break; default: v2 = ((2048 - 16) * 32); break; } if (param0 == NNS_G2D_VRAM_TYPE_2DMAIN) { GX_LoadOBJ(v1->pRawData, v2, (4 * 4 * 32)); } else { GXS_LoadOBJ(v1->pRawData, v2, (4 * 4 * 32)); } Heap_FreeToHeap(v0); } } static const UnkStruct_020E5EB4 Unk_020E5EB4[] = { { 0x1F0, 0x14 }, { 0x1F4, 0x14 }, { 0x1F8, 0x14 }, { 0x1FC, 0x14 }, { 0xFFFF, 0x0 } }; static const UnkStruct_020E5EB4 Unk_020E5EAC[] = { { 0x1F0, 0x14 }, { 0xFFFF, 0x0 } }; static const UnkStruct_020E5EB4 Unk_020E5EA4[] = { { 0x1F4, 0x14 }, { 0xFFFF, 0x0 } }; static const UnkStruct_020E5EB4 Unk_020E5E9C[] = { { 0x1F8, 0x14 }, { 0xFFFF, 0x0 } }; static const UnkStruct_020E5EB4 Unk_020E5E94[] = { { 0x1FC, 0x14 }, { 0xFFFF, 0x0 } }; static const UnkStruct_020E5EB4 *Unk_02100A38[] = { Unk_020E5EAC, Unk_020E5EA4, Unk_020E5E9C, Unk_020E5E94, Unk_020E5EB4 }; static UnkStruct_020393C8 *Unk_021C07D8 = NULL; static void sub_02039614(UnkStruct_020393C8 *param0) { UnkStruct_020393C8 *v0 = param0; int v1, v2; GXOamAttr *v3; v1 = inline_02039614(v0); v2 = inline_02039614_1(v1, v0->unk_04); v3 = (v1 == NNS_G2D_VRAM_TYPE_2DMAIN) ? (GXOamAttr *)(HW_OAM) : (GXOamAttr *)(HW_OAM_END); G2_SetOBJAttr(v3, v0->unk_0C, v0->unk_0E, 0, GX_OAM_MODE_NORMAL, 0, GX_OAM_EFFECT_NONE, GX_OAM_SHAPE_16x16, GX_OAM_COLORMODE_16, v2, 14, 0); if (v3 != v0->unk_1C) { G2_SetOBJAttr(v0->unk_1C, 0, 0, 0, GX_OAM_MODE_NORMAL, 0, GX_OAM_EFFECT_NODISPLAY, GX_OAM_SHAPE_16x16, GX_OAM_COLORMODE_16, 0, 0, 0); v0->unk_1C = v3; } } void sub_02039720(void) { UnkStruct_020393C8 *v0 = Unk_021C07D8; if (v0 == NULL) { return; } sub_02039614(v0); } void sub_02039734(void) { BOOL v0 = 0; if (sub_020389B8()) { v0 = 1; } sub_02039750(240, 0, v0, NNS_G2D_VRAM_TYPE_2DMAIN); } void sub_02039750(int param0, int param1, BOOL param2, int param3) { if (!sub_020334B8()) { return; } if (Unk_021C07D8) { sub_02039794(); } Unk_021C07D8 = sub_020393C8(0, 91, param0, param1, param2, Unk_02100A38, param3); } void sub_02039794(void) { if (Unk_021C07D8) { sub_02039440(Unk_021C07D8); Unk_021C07D8 = NULL; } } void sub_020397B0(int param0) { if (Unk_021C07D8) { sub_02039434(Unk_021C07D8, param0); } } void sub_020397C8(BOOL param0, u32 param1) { if (Unk_021C07D8) { sub_02039474(Unk_021C07D8, param0, param1); } } void DrawWifiConnectionIcon(void) { if (CommSys_IsInitialized()) { if ((CommSys_ConnectedCount() > 1) || sub_020389B8()) { sub_02039734(); } } else if (sub_020389B8()) { sub_02039734(); } }