summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
authorRémi Calixte <remicalixte.rmc@gmail.com>2021-07-02 22:19:49 +0200
committerRémi Calixte <remicalixte.rmc@gmail.com>2021-07-02 22:19:49 +0200
commit41a9423550ce33ccbc0a9034ff59e473acc4702c (patch)
tree7806ae8b67525d93c14dd33be0a03b3f7a4b5a89 /arm9/src
parent067a94af916cdc506fd468aaff3de336f5a9cbcf (diff)
parent8f7c115c0e110aa50a5c81b9a8f7dec31760fa67 (diff)
Merge branch 'master' of github.com:pret/pokediamond
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/main.c4
-rw-r--r--arm9/src/palette.c5
-rw-r--r--arm9/src/scrcmd_24.c8
-rw-r--r--arm9/src/unk_020061E8.c35
-rw-r--r--arm9/src/unk_020222E8.c33
-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
8 files changed, 317 insertions, 12 deletions
diff --git a/arm9/src/main.c b/arm9/src/main.c
index 46f8add7..d1a60190 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -14,6 +14,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 +30,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 +69,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);
diff --git a/arm9/src/palette.c b/arm9/src/palette.c
index 6726a0ec..e4c42cc4 100644
--- a/arm9/src/palette.c
+++ b/arm9/src/palette.c
@@ -3,11 +3,8 @@
#include "MI_memory.h"
#include "gf_gfx_loader.h"
#include "unk_0200CA44.h"
+#include "unk_020222E8.h"
-extern void *FUN_020222E8();
-extern void *FUN_020222F8();
-extern void *FUN_02022308();
-extern void *FUN_02022310();
extern int abs(int);
THUMB_FUNC struct PaletteData *FUN_02002FD0(u32 heap_id)
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/unk_020061E8.c b/arm9/src/unk_020061E8.c
new file mode 100644
index 00000000..424fea34
--- /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, struct TextPrinter *), 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_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_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);
+}