summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/cable_club.c475
-rw-r--r--src/engine/clock.c3
-rw-r--r--src/engine/link.c198
-rw-r--r--src/engine/mystery_event_menu.c460
-rw-r--r--src/engine/naming_screen.c2
-rw-r--r--src/engine/option_menu.c170
-rw-r--r--src/engine/reset_rtc_screen.c323
-rw-r--r--src/engine/rtc.c29
-rw-r--r--src/engine/save.c41
-rw-r--r--src/engine/save_failed_screen.c192
-rw-r--r--src/engine/sprite.c14
-rw-r--r--src/engine/task.c10
-rw-r--r--src/engine/trade.c2
-rw-r--r--src/engine/trainer_card.c97
14 files changed, 1899 insertions, 117 deletions
diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c
index e7c504c7b..ff73e638e 100644
--- a/src/engine/cable_club.c
+++ b/src/engine/cable_club.c
@@ -23,6 +23,7 @@
#include "text.h"
#include "trainer_card.h"
+extern u8 unk_2030220;
extern u16 gSpecialVar_Result;
extern struct TrainerCard gTrainerCards[4];
extern u8 gUnknown_03004860;
@@ -41,7 +42,7 @@ extern struct
u8 field1;
} gUnknown_020297D8;
-static void sub_8082F20(u8 taskId);
+/*static*/ void sub_8082F20(u8 taskId);
static void sub_8082F68(u8 taskId);
static void sub_8082FEC(u8 taskId);
static void sub_808303C(u8 taskId);
@@ -95,6 +96,382 @@ const u8 *const gTrainerCardColorNames[] =
TrainerCardColorName_Gold,
};
+#if DEBUG
+
+__attribute__((naked))
+int debug_sub_808A4D0()
+{
+ asm("\
+ push {lr}\n\
+ add r1, r0, #0\n\
+ ldr r0, ._3 @ sub_8082F68\n\
+ cmp r1, r0\n\
+ bne ._1 @cond_branch\n\
+ mov r0, #0x1\n\
+ b ._30\n\
+._4:\n\
+ .align 2, 0\n\
+._3:\n\
+ .word sub_8082F68+1\n\
+._1:\n\
+ ldr r0, ._7 @ sub_8082FEC\n\
+ cmp r1, r0\n\
+ bne ._5 @cond_branch\n\
+ mov r0, #0x11\n\
+ b ._30\n\
+._8:\n\
+ .align 2, 0\n\
+._7:\n\
+ .word sub_8082FEC+1\n\
+._5:\n\
+ ldr r0, ._11 @ sub_808303C\n\
+ cmp r1, r0\n\
+ bne ._9 @cond_branch\n\
+ mov r0, #0x12\n\
+ b ._30\n\
+._12:\n\
+ .align 2, 0\n\
+._11:\n\
+ .word sub_808303C+1\n\
+._9:\n\
+ ldr r0, ._15 @ sub_8083188\n\
+ cmp r1, r0\n\
+ bne ._13 @cond_branch\n\
+ mov r0, #0x13\n\
+ b ._30\n\
+._16:\n\
+ .align 2, 0\n\
+._15:\n\
+ .word sub_8083188+1\n\
+._13:\n\
+ ldr r0, ._19 @ sub_80830E4\n\
+ cmp r1, r0\n\
+ bne ._17 @cond_branch\n\
+ mov r0, #0x14\n\
+ b ._30\n\
+._20:\n\
+ .align 2, 0\n\
+._19:\n\
+ .word sub_80830E4+1\n\
+._17:\n\
+ ldr r0, ._23 @ sub_80831F8\n\
+ cmp r1, r0\n\
+ bne ._21 @cond_branch\n\
+ mov r0, #0x21\n\
+ b ._30\n\
+._24:\n\
+ .align 2, 0\n\
+._23:\n\
+ .word sub_80831F8+1\n\
+._21:\n\
+ ldr r0, ._27 @ sub_8083314\n\
+ cmp r1, r0\n\
+ bne ._25 @cond_branch\n\
+ mov r0, #0x2\n\
+ b ._30\n\
+._28:\n\
+ .align 2, 0\n\
+._27:\n\
+ .word sub_8083314+1\n\
+._25:\n\
+ ldr r0, ._31 @ sub_80833C4\n\
+ cmp r1, r0\n\
+ beq ._29 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._30\n\
+._32:\n\
+ .align 2, 0\n\
+._31:\n\
+ .word sub_80833C4+1\n\
+._29:\n\
+ mov r0, #0x3\n\
+._30:\n\
+ pop {r1}\n\
+ bx r1");
+}
+
+__attribute__((naked))
+void debug_sub_808A55C()
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ ldr r2, ._37 @ gTasks\n\
+ lsl r0, r7, #0x2\n\
+ add r0, r0, r7\n\
+ lsl r0, r0, #0x3\n\
+ add r4, r0, r2\n\
+ mov r0, #0x8\n\
+ ldsh r1, [r4, r0]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ ldrb r0, [r0, #0x4]\n\
+ cmp r0, #0\n\
+ bne ._33 @cond_branch\n\
+ mov r1, #0xa\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0x5\n\
+ bne ._34 @cond_branch\n\
+ add r0, r7, #0\n\
+ bl DestroyTask\n\
+._34:\n\
+ ldrh r0, [r4, #0xa]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0xa]\n\
+._33:\n\
+ ldr r0, ._37 + 4 @ gShouldAdvanceLinkState\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0x0\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 8 @ gBlockSendBuffer\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x16\n\
+ mov r2, #0x5\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r4, #0x0\n\
+ lsl r3, r7, #0x2\n\
+ mov r8, r3\n\
+ mov r6, #0xc0\n\
+ lsl r6, r6, #0x13\n\
+ mov r5, #0xa0\n\
+ lsl r5, r5, #0x13\n\
+._35:\n\
+ ldr r0, ._37 + 12 @ gLinkPlayerPending\n\
+ add r0, r4, r0\n\
+ ldrb r0, [r0]\n\
+ lsr r1, r5, #0x18\n\
+ mov r2, #0x0\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r1, ._37 + 16 @ gBlockRecvBuffer\n\
+ lsl r0, r4, #0x8\n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ lsr r2, r6, #0x18\n\
+ mov r1, #0x16\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x11\n\
+ add r6, r6, r0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x12\n\
+ add r5, r5, r1\n\
+ add r4, r4, #0x1\n\
+ cmp r4, #0x3\n\
+ ble ._35 @cond_branch\n\
+ ldr r4, ._37 + 20 @ gLinkStatus\n\
+ ldr r0, [r4]\n\
+ mov r1, #0xf\n\
+ mov r2, #0x0\n\
+ mov r3, #0x8\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 24 @ gLink\n\
+ ldrb r0, [r0, #0x1]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl GetMultiplayerId\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x7\n\
+ mov r2, #0xc\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl GetBlockReceivedStatus\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x7\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 28 @ gReceivedRemoteLinkPlayers\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xc\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 32 @ gSpecialVar_Result\n\
+ ldrh r0, [r0]\n\
+ mov r1, #0xb\n\
+ mov r2, #0x8\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, [r4]\n\
+ mov r1, #0x1c\n\
+ and r0, r0, r1\n\
+ lsr r0, r0, #0x2\n\
+ mov r1, #0xb\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl IsLinkConnectionEstablished\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xb\n\
+ mov r2, #0xc\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ bl IsLinkTaskFinished\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xf\n\
+ mov r2, #0xa\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r2, ._37 @ gTasks\n\
+ mov r3, r8\n\
+ add r0, r3, r7\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ mov r3, #0x8\n\
+ ldsh r1, [r0, r3]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ ldr r0, [r0]\n\
+ bl debug_sub_808A4D0\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xf\n\
+ mov r2, #0xc\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 36 @ gLinkCallback\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xd\n\
+ mov r3, #0x8\n\
+ bl PrintHex\n\
+ bl HasLinkErrorOccurred\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x2\n\
+ mov r2, #0x2\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 40 @ gLinkPlayers\n\
+ mov r6, #0x80\n\
+ lsl r6, r6, #0x12\n\
+ add r5, r0, #0\n\
+ add r5, r5, #0x14\n\
+ mov r4, #0x3\n\
+._36:\n\
+ ldr r0, [r5]\n\
+ lsr r1, r6, #0x18\n\
+ mov r2, #0x3\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x13\n\
+ add r6, r6, r0\n\
+ add r5, r5, #0x1c\n\
+ sub r4, r4, #0x1\n\
+ cmp r4, #0\n\
+ bge ._36 @cond_branch\n\
+ ldr r0, ._37 + 44 @ 0x4000128\n\
+ ldrh r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0x6\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ bl debug_sub_808B850\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x19\n\
+ mov r2, #0x3\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._38:\n\
+ .align 2, 0\n\
+._37:\n\
+ .word gTasks\n\
+ .word gShouldAdvanceLinkState\n\
+ .word gBlockSendBuffer\n\
+ .word gLinkPlayerPending\n\
+ .word gBlockRecvBuffer\n\
+ .word gLinkStatus\n\
+ .word gLink\n\
+ .word gReceivedRemoteLinkPlayers\n\
+ .word gSpecialVar_Result\n\
+ .word gLinkCallback\n\
+ .word gLinkPlayers\n\
+ .word 0x4000128");
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static void sub_8082CD4(u8 arg0, u8 arg1)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ lsl r1, r1, #0x18\n\
+ lsr r6, r1, #0x18\n\
+ mov r0, #0xc\n\
+ mov r1, #0x0\n\
+ mov r2, #0x1f\n\
+ mov r3, #0x2\n\
+ bl InitLinkTestBG_Unused\n\
+ ldr r4, ._40 @ sub_8082F20\n\
+ add r0, r4, #0\n\
+ bl FindTaskIdByFunc\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0xff\n\
+ bne ._39 @cond_branch\n\
+ add r0, r4, #0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ add r4, r0, #0\n\
+ lsl r4, r4, #0x18\n\
+ lsr r4, r4, #0x18\n\
+ ldr r5, ._40 + 4 @ gTasks\n\
+ lsl r0, r4, #0x2\n\
+ add r0, r0, r4\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r5\n\
+ strh r7, [r0, #0xa]\n\
+ strh r6, [r0, #0xc]\n\
+ ldr r0, ._40 + 8 @ debug_sub_808A55C\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r5\n\
+ strh r4, [r1, #0x8]\n\
+._39:\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._41:\n\
+ .align 2, 0\n\
+._40:\n\
+ .word sub_8082F20+1\n\
+ .word gTasks\n\
+ .word debug_sub_808A55C+1");
+}
+#else
static void sub_8082CD4(u8 arg0, u8 arg1)
{
if (FindTaskIdByFunc(sub_8082F20) == 0xFF)
@@ -105,6 +482,7 @@ static void sub_8082CD4(u8 arg0, u8 arg1)
gTasks[taskId].data[2] = arg1;
}
}
+#endif
static void sub_8082D18(u32 value)
{
@@ -207,7 +585,7 @@ void unref_sub_8082EEC(u8 taskId)
}
}
-static void sub_8082F20(u8 taskId)
+/*static*/ void sub_8082F20(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -360,6 +738,10 @@ void sub_80831F8(u8 taskId)
|| sub_8082DF4(taskId) == TRUE)
return;
+#if DEBUG
+ sub_8082D60(taskId, GetLinkPlayerCount_2());
+#endif
+
gSpecialVar_Result = sub_8082D9C(local1, local2);
if (gSpecialVar_Result == 0)
return;
@@ -908,6 +1290,74 @@ void sub_8083C50(u8 taskId)
DestroyTask(taskId);
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_808B778()
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._390 @ debug_sub_808B7A8\n\
+ add r0, r4, #0\n\
+ bl FuncIsActiveTask\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._389 @cond_branch\n\
+ add r0, r4, #0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+._389:\n\
+ ldr r1, ._390 + 4 @ unk_3004E98\n\
+ ldr r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ str r0, [r1]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._391:\n\
+ .align 2, 0\n\
+._390:\n\
+ .word debug_sub_808B7A8+1\n\
+ .word unk_3004E98");
+}
+
+__attribute__((naked))
+void debug_sub_808B7A8()
+{
+ asm("\
+ push {lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r2, ._393 @ gTasks\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ ldrh r0, [r1, #0x8]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r1, #0x8]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x1e\n\
+ bne ._392 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r1, #0x8]\n\
+ ldr r2, ._393 + 4 @ unk_3004E94\n\
+ ldrh r0, [r2]\n\
+ mov r1, #0x1\n\
+ orr r0, r0, r1\n\
+ strh r0, [r2]\n\
+._392:\n\
+ pop {r0}\n\
+ bx r0\n\
+._394:\n\
+ .align 2, 0\n\
+._393:\n\
+ .word gTasks\n\
+ .word unk_3004E94");
+}
+#endif
+
static void sub_8083CA4(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
@@ -921,4 +1371,23 @@ void unref_sub_8083CC8(u8 taskId)
{
sub_800832C();
gTasks[taskId].func = sub_8083CA4;
-} \ No newline at end of file
+}
+
+#if DEBUG
+
+void debug_sub_808B82C(void)
+{
+ unk_2030220 = 0;
+}
+
+void debug_sub_808B838(u8 a)
+{
+ unk_2030220 |= 1 << a;
+}
+
+int debug_sub_808B850(void)
+{
+ return unk_2030220;
+}
+
+#endif \ No newline at end of file
diff --git a/src/engine/clock.c b/src/engine/clock.c
index 416aaa6bb..fceccdfcb 100644
--- a/src/engine/clock.c
+++ b/src/engine/clock.c
@@ -13,12 +13,11 @@
#include "tv.h"
#include "wallclock.h"
-static void InitTimeBasedEvents(void);
static void UpdatePerDay(struct Time *time);
static void UpdatePerMinute(struct Time *time);
static void ReturnFromStartWallClock(void);
-static void InitTimeBasedEvents(void)
+void InitTimeBasedEvents(void)
{
FlagSet(FLAG_SYS_CLOCK_SET);
RtcCalcLocalTime();
diff --git a/src/engine/link.c b/src/engine/link.c
index 33037b817..00c084069 100644
--- a/src/engine/link.c
+++ b/src/engine/link.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "cable_club.h"
#include "link.h"
#include "battle.h"
#include "berry.h"
@@ -12,6 +13,7 @@
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
+#include "string_util.h"
#include "strings2.h"
#include "task.h"
#include "text.h"
@@ -66,7 +68,7 @@ u32 sub_8007E40(void);
static void SetBlockReceivedFlag(u8);
static u16 LinkTestCalcBlockChecksum(void *, u16);
static void PrintHexDigit(u8, u8, u8);
-static void PrintHex(u32, u8, u8, u8);
+void PrintHex(u32, u8, u8, u8);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8);
bool8 sub_8008224(void);
@@ -79,7 +81,7 @@ static void sub_80084C8(void);
static void sub_80084F4(void);
static void CheckErrorStatus(void);
-static void CB2_PrintErrorMessage(void);
+void CB2_PrintErrorMessage(void);
static u8 IsSioMultiMaster(void);
static void DisableSerial(void);
static void EnableSerial(void);
@@ -145,6 +147,9 @@ void (*gLinkCallback)(void);
struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS];
u8 gShouldAdvanceLinkState;
u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
+#if DEBUG
+u8 gUnknown_Debug_30030E0;
+#endif
u8 gBlockRequestType;
u8 gLastSendQueueCount;
struct Link gLink;
@@ -156,11 +161,11 @@ u8 deUnkValue1;
u8 deUnkValue2;
#endif
-EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0};
-EWRAM_DATA bool8 gLinkTestDummyBool = {0};
-EWRAM_DATA u32 gFiller_20238B8 = {0};
-EWRAM_DATA u32 dword_20238BC = {0};
-EWRAM_DATA bool8 gLinkOpen = {0};
+EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0;
+EWRAM_DATA bool8 gLinkTestDummyBool = 0;
+EWRAM_DATA u32 gFiller_20238B8 = 0;
+EWRAM_DATA u32 dword_20238BC = 0;
+EWRAM_DATA bool8 gLinkOpen = 0;
static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp");
@@ -189,9 +194,19 @@ const struct BlockRequest sBlockRequestLookupTable[5] =
static const u8 sTestString[] = _("テストな");
-ALIGNED(4) static const u8 sMagic[] = "GameFreak inc.";
+// TODO: fix the alignment here
+
+ALIGNED(4) const u8 sMagic[] = "GameFreak inc.";
-ALIGNED(4) static const u8 sEmptyString[] = _("");
+#if DEBUG
+const u8 sEmptyString[] = _(" ");
+#else
+ALIGNED(4) const u8 sEmptyString[] = _("");
+#endif
+
+#if DEBUG
+const u8 linkDebugFillerPleaseRemove[2] = {0};
+#endif
void Task_DestroySelf(u8 taskId)
{
@@ -543,6 +558,9 @@ static void ProcessRecvCmds(u8 unusedParam)
else
{
SetBlockReceivedFlag(i);
+#if DEBUG
+ debug_sub_808B838(i);
+#endif
}
}
break;
@@ -952,7 +970,7 @@ static void PrintHexDigit(u8 tileNum, u8 x, u8 y)
tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1);
}
-static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
+void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
{
u8 buffer[16];
s32 i;
@@ -970,6 +988,143 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
}
}
+#if DEBUG
+
+EWRAM_DATA u16 *debugCharacterBase = NULL;
+EWRAM_DATA void *unk_20238C8 = NULL;
+EWRAM_DATA u16 (*debugTileMap)[] = NULL;
+EWRAM_DATA u32 unk_20238D0 = 0;
+
+void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3)
+{
+ CpuSet(sLinkTestDigitTiles, buffer, 272);
+ debugCharacterBase = buffer;
+ unk_20238C8 = arg1;
+ debugTileMap = arg2;
+ unk_20238D0 = arg3;
+}
+
+#ifdef NONMATCHING
+void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0)
+{
+ u32 buffer[8];
+ u32 *ptr;
+
+ u16 *dest;
+
+ int i;
+
+ if (unk_20238D0 != sp0)
+ return;
+
+ r3 = max(r3, 8);
+
+ ptr = &buffer[0];
+ dest = &(*debugTileMap)[left + top * 32];
+
+ for (i = r3; i != 0; i--)
+ {
+ *(ptr++) = value & 0xF;
+ value = value >> 4;
+ }
+
+ ptr = &buffer[8 - r3];
+ for (i = r3; i != 0; i--)
+ {
+ int charOffset = (((uintptr_t) debugCharacterBase) - ((uintptr_t) unk_20238C8)) / 32;
+ *dest = *ptr + charOffset + 1;
+ ptr--;
+ dest++;
+ }
+}
+#else
+__attribute__((naked))
+void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " add sp, sp, #0xffffffe0\n"
+ " add r5, r0, #0\n"
+ " add r6, r1, #0\n"
+ " add r4, r3, #0\n"
+ " ldr r0, [sp, #0x38]\n"
+ " ldr r1, ._347 @ unk_20238D0\n"
+ " ldr r1, [r1]\n"
+ " cmp r1, r0\n"
+ " bne ._345 @cond_branch\n"
+ " cmp r4, #0x8\n"
+ " ble ._342 @cond_branch\n"
+ " mov r4, #0x8\n"
+ "._342:\n"
+ " mov r3, sp\n"
+ " ldr r0, ._347 + 4 @ debugTileMap\n"
+ " mov r8, r0\n"
+ " lsl r2, r2, #0x6\n"
+ " mov ip, r2\n"
+ " lsl r6, r6, #0x1\n"
+ " lsl r7, r4, #0x2\n"
+ " cmp r4, #0\n"
+ " ble ._343 @cond_branch\n"
+ " mov r1, #0xf\n"
+ " add r2, r4, #0\n"
+ "._344:\n"
+ " add r0, r5, #0\n"
+ " and r0, r0, r1\n"
+ " stmia r3!, {r0}\n"
+ " lsr r5, r5, #0x4\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bne ._344 @cond_branch\n"
+ "._343:\n"
+ " mov r1, r8\n"
+ " ldr r0, [r1]\n"
+ " add r0, r0, ip\n"
+ " add r5, r0, r6\n"
+ " mov r1, sp\n"
+ " add r0, r1, r7\n"
+ " sub r3, r0, #4\n"
+ " cmp r4, #0\n"
+ " ble ._345 @cond_branch\n"
+ " ldr r7, ._347 + 8 @ debugCharacterBase\n"
+ " ldr r6, ._347 + 12 @ unk_20238C8\n"
+ " add r2, r4, #0\n"
+ "._346:\n"
+ " ldr r1, [r7]\n"
+ " ldr r0, [r6]\n"
+ " sub r1, r1, r0\n"
+ " lsr r1, r1, #0x5\n"
+ " ldr r0, [r3]\n"
+ " add r0, r0, r1\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5]\n"
+ " sub r3, r3, #0x4\n"
+ " add r5, r5, #0x2\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bne ._346 @cond_branch\n"
+ "._345:\n"
+ " add sp, sp, #0x20\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._348:\n"
+ " .align 2, 0\n"
+ "._347:\n"
+ " .word unk_20238D0\n"
+ " .word debugTileMap\n"
+ " .word debugCharacterBase\n"
+ " .word unk_20238C8\n"
+ "\n"
+ );
+}
+#endif
+
+#endif
+
static void LinkCB_RequestPlayerDataExchange(void)
{
// Only one request needs to be sent, so only the master sends it.
@@ -1248,14 +1403,33 @@ void CB2_LinkError(void)
SetMainCallback2(CB2_PrintErrorMessage);
}
-static void CB2_PrintErrorMessage(void)
+void CB2_PrintErrorMessage(void)
{
- u8 array[64] __attribute__((unused)); // unused
+ u8 array[32] __attribute__((unused)); // unused
+ u8 array2[32] __attribute__((unused)); // unused
switch (gMain.state)
{
case 0:
Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1);
+#if DEBUG
+ StringCopy(array, sColorCodes);
+
+ ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8);
+ StringAppend(array, array2);
+
+ StringAppend(array, sEmptyString);
+
+ ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(array, array2);
+
+ StringAppend(array, sEmptyString);
+
+ ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(array, array2);
+
+ Menu_PrintText(array, 2, 15);
+#endif
break;
case 30:
case 60:
diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c
index 8fad563e6..bc14c760d 100644
--- a/src/engine/mystery_event_menu.c
+++ b/src/engine/mystery_event_menu.c
@@ -338,3 +338,463 @@ static void CB2_MysteryEventMenu(void)
BuildOamBuffer();
UpdatePaletteFade();
}
+
+#if DEBUG
+
+void debug_sub_815D1D8();
+
+__attribute__((naked))
+void debug_sub_815D04C()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " ldr r1, ._125 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x8\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0\n"
+ " bne ._121 @cond_branch\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xd\n"
+ " mov r3, #0x7\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r1, ._125 + 4 @ gUnknown_Debug_842E2D0\n"
+ " mov r2, #0xa\n"
+ " ldsh r0, [r4, r2]\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov r1, #0x5\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldrh r0, [r4, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x8]\n"
+ "._121:\n"
+ " ldr r2, ._125 + 8 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " add r6, r2, #0\n"
+ " cmp r0, #0\n"
+ " beq ._122 @cond_branch\n"
+ " ldrh r1, [r4, #0xa]\n"
+ " mov r2, #0xa\n"
+ " ldsh r0, [r4, r2]\n"
+ " cmp r0, #0\n"
+ " bne ._123 @cond_branch\n"
+ " ldr r0, ._125 + 12 @ gUnknown_Debug_842E350\n"
+ " ldrb r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " b ._124\n"
+ "._126:\n"
+ " .align 2, 0\n"
+ "._125:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E2D0\n"
+ " .word gMain\n"
+ " .word gUnknown_Debug_842E350\n"
+ "._123:\n"
+ " sub r0, r1, #1\n"
+ "._124:\n"
+ " strh r0, [r4, #0xa]\n"
+ " ldr r0, ._130 @ gTasks\n"
+ " lsl r1, r5, #0x2\n"
+ " add r1, r1, r5\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r0\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r1, #0x8]\n"
+ "._122:\n"
+ " ldrh r1, [r6, #0x2e]\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._127 @cond_branch\n"
+ " ldr r1, ._130 @ gTasks\n"
+ " lsl r2, r5, #0x2\n"
+ " add r0, r2, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r0, #0xa\n"
+ " ldsh r3, [r4, r0]\n"
+ " ldr r0, ._130 + 4 @ gUnknown_Debug_842E350\n"
+ " ldrb r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " cmp r3, r0\n"
+ " bne ._128 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._129\n"
+ "._131:\n"
+ " .align 2, 0\n"
+ "._130:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E350\n"
+ "._128:\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " add r0, r0, #0x1\n"
+ "._129:\n"
+ " strh r0, [r4, #0xa]\n"
+ " add r0, r2, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x0\n"
+ " strh r1, [r0, #0x8]\n"
+ "._127:\n"
+ " ldrh r1, [r6, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._132 @cond_branch\n"
+ " ldr r1, ._133 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " mov r2, #0xa\n"
+ " ldsh r1, [r0, r2]\n"
+ " lsl r1, r1, #0x3\n"
+ " ldr r0, ._133 + 4 @ gUnknown_Debug_842E2D0\n"
+ " add r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " ldr r0, ._133 + 8 @ \n"
+ " ldr r1, [r1]\n"
+ " bl _call_via_r1\n"
+ " ldr r0, ._133 + 12 @ \n"
+ " add r1, r6, r0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._132:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._134:\n"
+ " .align 2, 0\n"
+ "._133:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E2D0\n"
+ " .word +0x2004000\n"
+ " .word 0x43c\n"
+ "\n"
+ );
+}
+
+void debug_sub_815D15C(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
+ Menu_EraseScreen();
+ REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0;
+ REG_BLDCNT = 0;
+
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ FillPalette(0, 0, 2);
+ SetMainCallback2(debug_sub_815D1D8);
+}
+
+__attribute__((naked))
+void debug_sub_815D1D8()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r1, ._139 @ gMain\n"
+ " ldr r2, ._139 + 4 @ 0x43c\n"
+ " add r0, r1, r2\n"
+ " ldrb r0, [r0]\n"
+ " add r4, r1, #0\n"
+ " cmp r0, #0xb\n"
+ " bls ._137 @cond_branch\n"
+ " b ._196\n"
+ "._137:\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._139 + 8 @ \n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ "._140:\n"
+ " .align 2, 0\n"
+ "._139:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ " .word ._141\n"
+ "._141:\n"
+ " .word ._142\n"
+ " .word ._143\n"
+ " .word ._144\n"
+ " .word ._145\n"
+ " .word ._146\n"
+ " .word ._196\n"
+ " .word ._148\n"
+ " .word ._149\n"
+ " .word ._150\n"
+ " .word ._151\n"
+ " .word ._152\n"
+ " .word ._153\n"
+ "._142:\n"
+ " mov r0, #0x3\n"
+ " mov r1, #0xe\n"
+ " mov r2, #0x1b\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " mov r1, #0x0\n"
+ " str r1, [sp]\n"
+ " mov r2, #0x10\n"
+ " mov r3, #0x0\n"
+ " bl BeginNormalPaletteFade\n"
+ " ldr r1, ._155 @ gMain\n"
+ " ldr r0, ._155 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._156:\n"
+ " .align 2, 0\n"
+ "._155:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._143:\n"
+ " ldr r0, ._161 @ gPaletteFade\n"
+ " ldrb r1, [r0, #0x7]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._157 @cond_branch\n"
+ " b ._196\n"
+ "._157:\n"
+ " ldrh r1, [r4, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._159 @cond_branch\n"
+ " ldr r1, ._161 + 4 @ gUnknown_Debug_30030E0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ "._159:\n"
+ " ldr r0, ._161 + 8 @ Str_843DA70\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " ldr r2, ._161 + 12 @ 0x43c\n"
+ " add r1, r4, r2\n"
+ " b ._189\n"
+ "._162:\n"
+ " .align 2, 0\n"
+ "._161:\n"
+ " .word gPaletteFade\n"
+ " .word gUnknown_Debug_30030E0\n"
+ " .word Str_843DA70\n"
+ " .word 0x43c\n"
+ "._144:\n"
+ " bl Menu_UpdateWindowText\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._163 @cond_branch\n"
+ " b ._196\n"
+ "._163:\n"
+ " ldr r1, ._166 @ gMain\n"
+ " ldr r0, ._166 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r1, ._166 + 8 @ gLinkType\n"
+ " ldr r2, ._166 + 12 @ 0x5501\n"
+ " add r0, r2, #0\n"
+ " strh r0, [r1]\n"
+ " bl OpenLink\n"
+ " b ._196\n"
+ "._167:\n"
+ " .align 2, 0\n"
+ "._166:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ " .word gLinkType\n"
+ " .word 0x5501\n"
+ "._145:\n"
+ " ldr r0, ._171 @ gReceivedRemoteLinkPlayers\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._168 @cond_branch\n"
+ " b ._196\n"
+ "._168:\n"
+ " ldr r1, ._171 + 4 @ 0x43c\n"
+ " add r0, r4, r1\n"
+ " ldrb r1, [r0]\n"
+ " add r1, r1, #0x1\n"
+ " strb r1, [r0]\n"
+ " ldr r0, ._171 + 8 @ Str_843DA84\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " b ._196\n"
+ "._172:\n"
+ " .align 2, 0\n"
+ "._171:\n"
+ " .word gReceivedRemoteLinkPlayers\n"
+ " .word 0x43c\n"
+ " .word Str_843DA84\n"
+ "._146:\n"
+ " bl Menu_UpdateWindowText\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._173 @cond_branch\n"
+ " b ._196\n"
+ "._173:\n"
+ " ldr r0, ._176 @ debug_sub_815D04C\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " ldr r1, ._176 + 4 @ gMain\n"
+ " ldr r2, ._176 + 8 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._177:\n"
+ " .align 2, 0\n"
+ "._176:\n"
+ " .word debug_sub_815D04C+1\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._148:\n"
+ " ldr r0, ._179 @ Str_843DA98\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " ldr r1, ._179 + 4 @ 0x2004000\n"
+ " ldr r2, ._179 + 8 @ 0x2004\n"
+ " mov r0, #0x0\n"
+ " bl SendBlock\n"
+ " ldr r1, ._179 + 12 @ gMain\n"
+ " ldr r0, ._179 + 16 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._180:\n"
+ " .align 2, 0\n"
+ "._179:\n"
+ " .word Str_843DA98\n"
+ " .word 0x2004000\n"
+ " .word 0x2004\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._149:\n"
+ " bl Menu_UpdateWindowText\n"
+ " bl IsLinkTaskFinished\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " beq ._196 @cond_branch\n"
+ " ldr r1, ._183 @ gMain\n"
+ " ldr r2, ._183 + 4 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._184:\n"
+ " .align 2, 0\n"
+ "._183:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._150:\n"
+ " bl sub_800832C\n"
+ " ldr r1, ._186 @ gMain\n"
+ " ldr r0, ._186 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._187:\n"
+ " .align 2, 0\n"
+ "._186:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._151:\n"
+ " ldr r0, ._190 @ gReceivedRemoteLinkPlayers\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._196 @cond_branch\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x1a\n"
+ " mov r3, #0x12\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r0, ._190 + 4 @ Str_843DAA3\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, ._190 + 8 @ gMain\n"
+ " ldr r2, ._190 + 12 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._191:\n"
+ " .align 2, 0\n"
+ "._190:\n"
+ " .word gReceivedRemoteLinkPlayers\n"
+ " .word Str_843DAA3\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._152:\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._196 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " mov r1, #0x0\n"
+ " str r1, [sp]\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x10\n"
+ " bl BeginNormalPaletteFade\n"
+ " ldr r0, ._194 @ 0x43c\n"
+ " add r1, r4, r0\n"
+ "._189:\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " b ._196\n"
+ "._195:\n"
+ " .align 2, 0\n"
+ "._194:\n"
+ " .word 0x43c\n"
+ "._153:\n"
+ " ldr r0, ._197 @ gPaletteFade\n"
+ " ldrb r1, [r0, #0x7]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._196 @cond_branch\n"
+ " ldr r0, ._197 + 4 @ CB2_InitTitleScreen\n"
+ " bl SetMainCallback2\n"
+ "._196:\n"
+ " bl RunTasks\n"
+ " bl AnimateSprites\n"
+ " bl BuildOamBuffer\n"
+ " bl UpdatePaletteFade\n"
+ " add sp, sp, #0x4\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._198:\n"
+ " .align 2, 0\n"
+ "._197:\n"
+ " .word gPaletteFade\n"
+ " .word CB2_InitTitleScreen+1\n"
+ "\n"
+ );
+}
+
+#endif
diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c
index 55e377c21..5cb06d56f 100644
--- a/src/engine/naming_screen.c
+++ b/src/engine/naming_screen.c
@@ -26,8 +26,6 @@
#define COLUMN_COUNT 10
#endif
-extern u16 gKeyRepeatStartDelay;
-
extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality);
const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp");
diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c
index d4e921a0e..a2d32ffb6 100644
--- a/src/engine/option_menu.c
+++ b/src/engine/option_menu.c
@@ -10,19 +10,9 @@
extern void SetPokemonCryStereo(u32 val);
-//Task data
-enum {
- TD_MENUSELECTION,
- TD_TEXTSPEED,
- TD_BATTLESCENE,
- TD_BATTLESTYLE,
- TD_SOUND,
- TD_BUTTONMODE,
- TD_FRAMETYPE,
-};
-
-//Menu items
-enum {
+// Menu items
+enum
+{
MENUITEM_TEXTSPEED,
MENUITEM_BATTLESCENE,
MENUITEM_BATTLESTYLE,
@@ -32,6 +22,15 @@ enum {
MENUITEM_CANCEL,
};
+// Task data
+#define tMenuSelection data[0]
+#define tOptTextSpeed data[1]
+#define tOptBattleScene data[2]
+#define tOptBattleStyle data[3]
+#define tOptSound data[4]
+#define tOptButtonMode data[5]
+#define tOptFrameType data[6]
+
const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
// note: this is only used in the Japanese release
const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
@@ -75,7 +74,6 @@ void CB2_InitOptionMenu(void)
{
default:
case 0:
- {
SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG2CNT = 0;
@@ -92,7 +90,6 @@ void CB2_InitOptionMenu(void)
DmaClear16(3, PLTT, PLTT_SIZE);
gMain.state++;
break;
- }
case 1:
ResetPaletteFade();
ScanlineEffect_Stop();
@@ -150,37 +147,38 @@ void CB2_InitOptionMenu(void)
{
u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed;
- gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff;
- gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle;
- gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound;
- gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode;
- gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType;
-
- Menu_DrawStdWindowFrame(2, 0, 27, 3);
- Menu_DrawStdWindowFrame(2, 4, 27, 19);
-
- Menu_PrintText(gSystemText_OptionMenu, 4, 1);
- Menu_PrintText(gSystemText_TextSpeed, 4, 5);
- Menu_PrintText(gSystemText_BattleScene, 4, 7);
- Menu_PrintText(gSystemText_BattleStyle, 4, 9);
- Menu_PrintText(gSystemText_Sound, 4, 11);
- Menu_PrintText(gSystemText_ButtonMode, 4, 13);
- Menu_PrintText(gSystemText_Frame, 4, 15);
- Menu_PrintText(gSystemText_Cancel, 4, 17);
-
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ gTasks[taskId].tMenuSelection = 0;
+ gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed;
+ gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff;
+ gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle;
+ gTasks[taskId].tOptSound = gSaveBlock2.optionsSound;
+ gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode;
+ gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType;
+
+ Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box
+ Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box
+
+ Menu_PrintText(gSystemText_OptionMenu, 4, 1);
+
+ Menu_PrintText(gSystemText_TextSpeed, 4, 5);
+ Menu_PrintText(gSystemText_BattleScene, 4, 7);
+ Menu_PrintText(gSystemText_BattleStyle, 4, 9);
+ Menu_PrintText(gSystemText_Sound, 4, 11);
+ Menu_PrintText(gSystemText_ButtonMode, 4, 13);
+ Menu_PrintText(gSystemText_Frame, 4, 15);
+ Menu_PrintText(gSystemText_Cancel, 4, 17);
+
+ TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed);
+ BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene);
+ BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle);
+ Sound_DrawChoices(gTasks[taskId].tOptSound);
+ ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode);
+ FrameType_DrawChoices(gTasks[taskId].tOptFrameType);
REG_WIN0H = WIN_RANGE(17, 223);
REG_WIN0V = WIN_RANGE(1, 31);
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
gMain.state++;
break;
}
@@ -193,16 +191,14 @@ void CB2_InitOptionMenu(void)
static void Task_OptionMenuFadeIn(u8 taskId)
{
if (!gPaletteFade.active)
- {
gTasks[taskId].func = Task_OptionMenuProcessInput;
- }
}
static void Task_OptionMenuProcessInput(u8 taskId)
{
if (gMain.newKeys & A_BUTTON)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
+ if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL)
gTasks[taskId].func = Task_OptionMenuSave;
}
else if (gMain.newKeys & B_BUTTON)
@@ -211,47 +207,47 @@ static void Task_OptionMenuProcessInput(u8 taskId)
}
else if (gMain.newKeys & DPAD_UP)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
- gTasks[taskId].data[TD_MENUSELECTION]--;
+ if (gTasks[taskId].tMenuSelection > 0)
+ gTasks[taskId].tMenuSelection--;
else
- gTasks[taskId].data[TD_MENUSELECTION] = 6;
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ gTasks[taskId].tMenuSelection = 6;
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] <= 5)
- gTasks[taskId].data[TD_MENUSELECTION]++;
+ if (gTasks[taskId].tMenuSelection < 6)
+ gTasks[taskId].tMenuSelection++;
else
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ gTasks[taskId].tMenuSelection = 0;
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
}
else
{
- switch (gTasks[taskId].data[TD_MENUSELECTION])
+ switch (gTasks[taskId].tMenuSelection)
{
case MENUITEM_TEXTSPEED:
- gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
+ gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed);
+ TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed);
break;
case MENUITEM_BATTLESCENE:
- gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
+ gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene);
+ BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene);
break;
case MENUITEM_BATTLESTYLE:
- gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
+ gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle);
+ BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle);
break;
case MENUITEM_SOUND:
- gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
+ gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound);
+ Sound_DrawChoices(gTasks[taskId].tOptSound);
break;
case MENUITEM_BUTTONMODE:
- gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
+ gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode);
+ ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode);
break;
case MENUITEM_FRAMETYPE:
- gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType);
+ FrameType_DrawChoices(gTasks[taskId].tOptFrameType);
break;
}
}
@@ -259,12 +255,12 @@ static void Task_OptionMenuProcessInput(u8 taskId)
static void Task_OptionMenuSave(u8 taskId)
{
- gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED];
- gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE];
- gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE];
- gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND];
- gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
- gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
+ gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed;
+ gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene;
+ gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle;
+ gSaveBlock2.optionsSound = gTasks[taskId].tOptSound;
+ gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode;
+ gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType;
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_OptionMenuFadeOut;
@@ -290,10 +286,10 @@ static void HighlightOptionMenuItem(u8 index)
static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
{
- u8 dst[16];
+ u8 dst[15];
u16 i;
- for (i = 0; *text != EOS && i <= 14; i++)
+ for (i = 0; *text != EOS && i < 15; i++)
dst[i] = *(text++);
dst[2] = style;
@@ -305,14 +301,14 @@ static u8 TextSpeed_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
- if (selection <= 1)
+ if (selection < 2)
selection++;
else
selection = 0;
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 2;
@@ -341,7 +337,7 @@ static void TextSpeed_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]);
- DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]);
+ DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]);
DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]);
}
@@ -360,7 +356,7 @@ static void BattleScene_DrawChoices(u8 selection)
styles[1] = 0xF;
styles[selection] = 0x8;
- DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]);
+ DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]);
DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]);
}
@@ -388,7 +384,7 @@ static void BattleStyle_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]);
- DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]);
+ DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]);
}
static u8 Sound_ProcessInput(u8 selection)
@@ -409,7 +405,7 @@ static void Sound_DrawChoices(u8 selection)
styles[1] = 0xF;
styles[selection] = 0x8;
- DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]);
+ DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]);
DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]);
}
@@ -425,7 +421,7 @@ static u8 FrameType_ProcessInput(u8 selection)
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 19;
@@ -439,11 +435,11 @@ static u8 FrameType_ProcessInput(u8 selection)
#if ENGLISH
static void FrameType_DrawChoices(u8 selection)
{
- u8 text[8];
+ u8 text[6];
u8 n = selection + 1;
u16 i;
- for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++)
+ for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++)
text[i] = gSystemText_Terminator[i];
//Convert number to decimal string
@@ -534,14 +530,14 @@ static u8 ButtonMode_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
- if (selection <= 1)
+ if (selection < 2)
selection++;
else
selection = 0;
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 2;
@@ -559,6 +555,6 @@ static void ButtonMode_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]);
- DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]);
- DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]);
+ DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]);
+ DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]);
}
diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c
index ce4afe922..8b67f39a5 100644
--- a/src/engine/reset_rtc_screen.c
+++ b/src/engine/reset_rtc_screen.c
@@ -147,6 +147,13 @@ const struct SpriteTemplate gSpriteTemplate_83764E8 =
const u8 gUnknown_08376500[] = _(" : ");
+#if DEBUG
+const u8 gUnknown_Debug_0839AE94[] = _("にっすう");
+const u8 gUnknown_Debug_0839AE99[] = _("じかん");
+const u8 gUnknown_Debug_0839AE9D[] = _("ゲームない じかん");
+const u8 gUnknown_Debug_0839AEA7[] = _("RTC じかん");
+#endif
+
void SpriteCB_ResetRtcCusor0(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
@@ -587,3 +594,319 @@ void Task_ResetRtcScreen(u8 taskId)
}
}
}
+
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_806F8F8(void)
+{
+ asm("\
+ push {lr}\n\
+ ldr r0, ._131 @ CB2_InitResetRtcScreen\n\
+ bl SetMainCallback2\n\
+ pop {r0}\n\
+ bx r0\n\
+._132:\n\
+ .align 2, 0\n\
+._131:\n\
+ .word CB2_InitResetRtcScreen+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F908(u8 a)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r5, r0, #0x18\n\
+ lsl r0, r5, #0x2\n\
+ add r0, r0, r5\n\
+ lsl r0, r0, #0x3\n\
+ ldr r2, ._136 @ gTasks\n\
+ add r4, r0, r2\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0\n\
+ beq ._133 @cond_branch\n\
+ cmp r0, #0x1\n\
+ beq ._134 @cond_branch\n\
+ b ._141\n\
+._137:\n\
+ .align 2, 0\n\
+._136:\n\
+ .word gTasks+0x8\n\
+._133:\n\
+ ldr r0, ._139 @ Task_ResetRtc_0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ strh r0, [r4, #0x2]\n\
+ ldrh r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4]\n\
+ b ._141\n\
+._140:\n\
+ .align 2, 0\n\
+._139:\n\
+ .word Task_ResetRtc_0+1\n\
+._134:\n\
+ sub r2, r2, #0x8\n\
+ mov r0, #0x2\n\
+ ldsh r1, [r4, r0]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r2, r0, r2\n\
+ mov r1, #0x8\n\
+ ldsh r0, [r2, r1]\n\
+ cmp r0, #0\n\
+ beq ._141 @cond_branch\n\
+ mov r1, #0xa\n\
+ ldsh r0, [r2, r1]\n\
+ cmp r0, #0x1\n\
+ bne ._142 @cond_branch\n\
+ ldr r3, ._143 @ gLocalTime\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r3, r1]\n\
+ mov r1, #0x2\n\
+ ldsb r1, [r3, r1]\n\
+ mov r2, #0x3\n\
+ ldsb r2, [r3, r2]\n\
+ ldrb r3, [r3, #0x4]\n\
+ lsl r3, r3, #0x18\n\
+ asr r3, r3, #0x18\n\
+ bl RtcCalcLocalTimeOffset\n\
+._142:\n\
+ ldrb r0, [r4, #0x2]\n\
+ bl DestroyTask\n\
+ bl Menu_EraseScreen\n\
+ bl ScriptContext2_Disable\n\
+ add r0, r5, #0\n\
+ bl DestroyTask\n\
+._141:\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._144:\n\
+ .align 2, 0\n\
+._143:\n\
+ .word gLocalTime");
+}
+
+__attribute__((naked))
+void debug_sub_806F99C()
+{
+ asm("\
+ push {lr}\n\
+ bl RtcCalcLocalTime\n\
+ ldr r0, ._145 @ debug_sub_806F908\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ bl ScriptContext2_Enable\n\
+ pop {r0}\n\
+ bx r0\n\
+._146:\n\
+ .align 2, 0\n\
+._145:\n\
+ .word debug_sub_806F908+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F9B8()
+{
+ asm("\
+ push {lr}\n\
+ ldr r2, ._147 @ gLocalTime\n\
+ ldr r0, ._147 + 4 @ gSaveBlock2\n\
+ add r0, r0, #0xa0\n\
+ ldr r1, [r0, #0x4]\n\
+ ldr r0, [r0]\n\
+ str r0, [r2]\n\
+ str r1, [r2, #0x4]\n\
+ ldr r0, ._147 + 8 @ debug_sub_806F908\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ bl ScriptContext2_Enable\n\
+ pop {r0}\n\
+ bx r0\n\
+._148:\n\
+ .align 2, 0\n\
+._147:\n\
+ .word gLocalTime\n\
+ .word gSaveBlock2\n\
+ .word debug_sub_806F908+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F9E4()
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, sl\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5, r6, r7}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ lsl r0, r7, #0x2\n\
+ add r0, r0, r7\n\
+ lsl r0, r0, #0x3\n\
+ ldr r1, ._153 @ gTasks\n\
+ add r5, r0, r1\n\
+ ldr r6, ._153 + 4 @ gStringVar4\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r5, r1]\n\
+ cmp r0, #0x1\n\
+ beq ._149 @cond_branch\n\
+ cmp r0, #0x1\n\
+ bgt ._150 @cond_branch\n\
+ cmp r0, #0\n\
+ beq ._151 @cond_branch\n\
+ b ._165\n\
+._154:\n\
+ .align 2, 0\n\
+._153:\n\
+ .word gTasks+0x8\n\
+ .word gStringVar4\n\
+._150:\n\
+ cmp r0, #0x2\n\
+ beq ._155 @cond_branch\n\
+ b ._165\n\
+._149:\n\
+ mov r0, #0x0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ add r4, r6, #0\n\
+ add r4, r4, #0x50\n\
+ bl RtcGetErrorStatus\n\
+ add r1, r0, #0\n\
+ lsl r1, r1, #0x10\n\
+ lsr r1, r1, #0x10\n\
+ add r0, r4, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToHexStringN\n\
+ add r0, r4, #0\n\
+ mov r1, #0x2\n\
+ mov r2, #0xa\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 @ gUnknown_Debug_0839AE94\n\
+ mov r1, #0xc\n\
+ mov r2, #0xc\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 4 @ gUnknown_Debug_0839AE99\n\
+ mov r1, #0x14\n\
+ mov r2, #0xc\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 8 @ gUnknown_Debug_0839AEA7\n\
+ mov r1, #0x1\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 12 @ gUnknown_Debug_0839AE9D\n\
+ mov r1, #0x1\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+._151:\n\
+ ldrh r0, [r5]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r5]\n\
+ b ._165\n\
+._159:\n\
+ .align 2, 0\n\
+._158:\n\
+ .word gUnknown_Debug_0839AE94\n\
+ .word gUnknown_Debug_0839AE99\n\
+ .word gUnknown_Debug_0839AEA7\n\
+ .word gUnknown_Debug_0839AE9D\n\
+._155:\n\
+ bl RtcCalcLocalTime\n\
+ add r0, r6, #0\n\
+ bl FormatHexRtcTime\n\
+ mov r2, #0x14\n\
+ add r2, r2, r6\n\
+ mov r9, r2\n\
+ mov r0, r9\n\
+ bl debug_sub_8009894\n\
+ mov r0, #0x28\n\
+ add r0, r0, r6\n\
+ mov sl, r0\n\
+ ldr r4, ._163 @ gLocalTime\n\
+ mov r1, #0x2\n\
+ ldsb r1, [r4, r1]\n\
+ mov r2, #0x3\n\
+ ldsb r2, [r4, r2]\n\
+ mov r3, #0x4\n\
+ ldsb r3, [r4, r3]\n\
+ bl FormatDecimalTime\n\
+ mov r1, #0x3c\n\
+ add r1, r1, r6\n\
+ mov r8, r1\n\
+ mov r2, #0x0\n\
+ ldsh r1, [r4, r2]\n\
+ mov r0, r8\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r0, ._163 + 4 @ gSaveBlock2\n\
+ ldrb r0, [r0, #0x12]\n\
+ cmp r0, #0\n\
+ bne ._160 @cond_branch\n\
+ add r0, r6, #0\n\
+ mov r1, #0x14\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ mov r0, r9\n\
+ mov r1, #0xc\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ mov r0, sl\n\
+ mov r1, #0x14\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+ mov r0, r8\n\
+ mov r1, #0xc\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+._160:\n\
+ ldrh r1, [r5, #0x2]\n\
+ mov r2, #0x2\n\
+ ldsh r0, [r5, r2]\n\
+ cmp r0, #0x13\n\
+ ble ._161 @cond_branch\n\
+ add r0, r1, #1\n\
+ strh r0, [r5, #0x2]\n\
+ b ._165\n\
+._164:\n\
+ .align 2, 0\n\
+._163:\n\
+ .word gLocalTime\n\
+ .word gSaveBlock2\n\
+._161:\n\
+ ldr r0, ._166 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._165 @cond_branch\n\
+ bl Menu_EraseScreen\n\
+ add r0, r7, #0\n\
+ bl DestroyTask\n\
+ bl ScriptContext2_Disable\n\
+._165:\n\
+ pop {r3, r4, r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov sl, r5\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._167:\n\
+ .align 2, 0\n\
+._166:\n\
+ .word gMain");
+}
+
+#endif \ No newline at end of file
diff --git a/src/engine/rtc.c b/src/engine/rtc.c
index d73f943d2..5462298ed 100644
--- a/src/engine/rtc.c
+++ b/src/engine/rtc.c
@@ -268,6 +268,28 @@ void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day)
*dest = EOS;
}
+#if DEBUG
+
+void debug_sub_800987C(u8 *dest)
+{
+ FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day);
+}
+
+void debug_sub_8009894(u8 *dest)
+{
+ u16 dayCount;
+
+ dayCount = RtcGetDayCount(&sRtc);
+ ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4);
+}
+
+void debug_sub_80098B8(u8 *dest)
+{
+ ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2);
+}
+
+#endif
+
void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t)
{
u16 days = RtcGetDayCount(rtc);
@@ -347,3 +369,10 @@ u32 RtcGetMinuteCount()
RtcGetInfo(&sRtc);
return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute;
}
+
+#if DEBUG
+void debug_sub_8009A60()
+{
+ RtcGetRawInfo(&sRtc);
+}
+#endif
diff --git a/src/engine/save.c b/src/engine/save.c
index 250b29a87..0b7a3dd79 100644
--- a/src/engine/save.c
+++ b/src/engine/save.c
@@ -663,6 +663,35 @@ static u16 CalculateChecksum(void *data, u16 size)
return ((checksum >> 16) + checksum);
}
+#if DEBUG
+void sub_813B79C(void)
+{
+ struct SaveSector *sbSector;
+ struct SaveSector *hofSector;
+ const struct SaveBlockChunk *sbChunks;
+ const struct SaveBlockChunk *hofChunks;
+ u16 i;
+
+ sbSector = eSaveSection;
+ sbChunks = sSaveBlockChunks;
+ for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++)
+ {
+ DoReadFlashWholeSection(i, sbSector);
+ sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size);
+ ProgramFlashSectorAndVerify(i, sbSector->data);
+ }
+
+ hofSector = eSaveSection;
+ hofChunks = sHallOfFameChunks;
+ for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++)
+ {
+ DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector);
+ hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id?
+ ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data);
+ }
+}
+#endif
+
u8 Save_WriteDataInternal(u8 saveType)
{
u8 i;
@@ -706,13 +735,21 @@ u8 Save_WriteDataInternal(u8 saveType)
return 0;
}
+#if DEBUG
+extern u32 gUnknown_Debug_03004BD0;
+#endif
+
u8 Save_WriteData(u8 saveType) // TrySave
{
if (gFlashMemoryPresent != TRUE)
return SAVE_STATUS_ERROR;
Save_WriteDataInternal(saveType);
- if (!gDamagedSaveSectors)
+ if (!gDamagedSaveSectors
+#if DEBUG
+ && gUnknown_Debug_03004BD0 == 0
+#endif
+ )
return SAVE_STATUS_OK;
DoSaveFailedScreen(saveType);
@@ -815,7 +852,7 @@ u8 Save_LoadGameData(u8 saveType)
return result;
}
-static const u8 sUnusedFlashSectors[] = { 30, 31 };
+const u8 sUnusedFlashSectors[] = { 30, 31 };
bool8 unref_sub_8125F4C(struct UnkSaveSection *a1)
{
diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c
index 74a1e9612..49cf166d4 100644
--- a/src/engine/save_failed_screen.c
+++ b/src/engine/save_failed_screen.c
@@ -61,16 +61,18 @@ static const u8 sClockFrames[8][3] =
static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal");
static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz");
+#define static
+
static void VBlankCB(void);
static void CB2_SaveFailedScreen(void);
static void CB2_WipeSave(void);
-static void CB2_GameplayCannotBeContinued(void);
+/*static*/ void CB2_GameplayCannotBeContinued(void);
static void CB2_FadeAndReturnToTitleScreen(void);
static void CB2_ReturnToTitleScreen(void);
static void VBlankCB_UpdateClockGraphics(void);
static bool8 VerifySectorWipe(u16 sector);
static bool8 WipeSector(u16 sector);
-static bool8 WipeSectors(u32 sectorBits);
+/*static*/ bool8 WipeSectors(u32 sectorBits);
void DoSaveFailedScreen(u8 saveType)
{
@@ -148,6 +150,151 @@ static void CB2_SaveFailedScreen(void)
}
}
+#if DEBUG
+__attribute__((naked))
+void CB2_WipeSave()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r4, #0x0\n"
+ " ldr r0, ._20 @ gSaveFailedClockInfo\n"
+ " mov r2, #0x1\n"
+ " strh r2, [r0]\n"
+ " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n"
+ " ldr r0, [r0]\n"
+ " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n"
+ " cmp r0, #0\n"
+ " beq ._12 @cond_branch\n"
+ " str r2, [r1]\n"
+ "._12:\n"
+ " ldr r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq ._16 @cond_branch\n"
+ " add r5, r1, #0\n"
+ "._17:\n"
+ " ldr r0, [r5]\n"
+ " bl WipeSectors\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._14 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._20 + 16 @ gSaveFailedType\n"
+ " ldrb r0, [r0]\n"
+ " bl Save_WriteDataInternal\n"
+ " ldr r0, [r5]\n"
+ " cmp r0, #0\n"
+ " beq ._15 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ "._15:\n"
+ " add r0, r4, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " ldr r0, [r5]\n"
+ " cmp r0, #0\n"
+ " beq ._16 @cond_branch\n"
+ " cmp r4, #0x2\n"
+ " bls ._17 @cond_branch\n"
+ "._16:\n"
+ " cmp r4, #0x3\n"
+ " bne ._18 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n"
+ " bl SetMainCallback2\n"
+ " b ._23\n"
+ "._21:\n"
+ " .align 2, 0\n"
+ "._20:\n"
+ " .word gSaveFailedClockInfo\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ " .word gDamagedSaveSectors\n"
+ " .word gSystemText_CheckCompleteSaveAttempt\n"
+ " .word gSaveFailedType\n"
+ " .word gSystemText_SaveFailedBackupCheck\n"
+ " .word gSystemText_BackupDamagedGameContinue\n"
+ " .word CB2_FadeAndReturnToTitleScreen+1\n"
+ "._18:\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._24 @ gGameContinueCallback\n"
+ " ldr r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._22 @cond_branch\n"
+ " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " b ._23\n"
+ "._25:\n"
+ " .align 2, 0\n"
+ "._24:\n"
+ " .word gGameContinueCallback\n"
+ " .word gSystemText_SaveCompletedGameEnd\n"
+ "._14:\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n"
+ " bl SetMainCallback2\n"
+ " b ._26\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word gSystemText_BackupDamagedGameContinue\n"
+ " .word CB2_GameplayCannotBeContinued+1\n"
+ "._22:\n"
+ " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ "._23:\n"
+ " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n"
+ " bl SetMainCallback2\n"
+ "._26:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._30:\n"
+ " .align 2, 0\n"
+ "._29:\n"
+ " .word gSystemText_SaveCompletedPressA\n"
+ " .word CB2_FadeAndReturnToTitleScreen+1\n"
+ "\n"
+ );
+}
+#else
static void CB2_WipeSave(void)
{
u8 wipeTries = 0;
@@ -198,8 +345,9 @@ static void CB2_WipeSave(void)
SetMainCallback2(CB2_FadeAndReturnToTitleScreen);
}
+#endif
-static void CB2_GameplayCannotBeContinued(void)
+/*static*/ void CB2_GameplayCannotBeContinued(void)
{
gSaveFailedClockInfo[0] = FALSE;
@@ -264,6 +412,41 @@ static void VBlankCB_UpdateClockGraphics(void)
gSaveFailedClockInfo[1]--;
}
+#if DEBUG
+__attribute__((naked))
+bool8 VerifySectorWipe(u16 sector)
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " ldr r2, ._50 @ \n"
+ " mov r3, #0x80\n"
+ " lsl r3, r3, #0x5\n"
+ " mov r1, #0x0\n"
+ " bl ReadFlash\n"
+ " mov r0, #0x0\n"
+ " ldr r1, ._50 + 4 @ \n"
+ "._49:\n"
+ " add r0, r0, #0x1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, r1\n"
+ " bls ._49 @cond_branch\n"
+ " ldr r0, ._50 + 8 @ \n"
+ " ldrb r0, [r0]\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._51:\n"
+ " .align 2, 0\n"
+ "._50:\n"
+ " .word +0x2000000\n"
+ " .word 0x3ff\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ "\n"
+ );
+}
+#else
static bool8 VerifySectorWipe(u16 sector)
{
u32 *ptr = (u32 *)&gSharedMem;
@@ -277,6 +460,7 @@ static bool8 VerifySectorWipe(u16 sector)
return FALSE;
}
+#endif
static bool8 WipeSector(u16 sector)
{
@@ -294,7 +478,7 @@ static bool8 WipeSector(u16 sector)
return failed;
}
-static bool8 WipeSectors(u32 sectorBits)
+/*static*/ bool8 WipeSectors(u32 sectorBits)
{
u16 i;
diff --git a/src/engine/sprite.c b/src/engine/sprite.c
index cf35e12a3..a9d84e01a 100644
--- a/src/engine/sprite.c
+++ b/src/engine/sprite.c
@@ -1,8 +1,10 @@
#include "global.h"
+#include "debug.h"
#include "sprite.h"
#include "main.h"
#include "menu_cursor.h"
#include "palette.h"
+#include "sprite.h"
#define MAX_SPRITE_COPY_REQUESTS 64
@@ -822,6 +824,12 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr
gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size;
gSpriteCopyRequestCount++;
}
+#if DEBUG
+ else
+ {
+ Crash(sDmaOverErrorMsg);
+ }
+#endif
}
void RequestSpriteCopy(const void *src, u8 *dest, u16 size)
@@ -833,6 +841,12 @@ void RequestSpriteCopy(const void *src, u8 *dest, u16 size)
gSpriteCopyRequests[gSpriteCopyRequestCount].size = size;
gSpriteCopyRequestCount++;
}
+#if DEBUG
+ else
+ {
+ Crash(sDmaOverErrorMsg);
+ }
+#endif
}
// these two functions are unused.
diff --git a/src/engine/task.c b/src/engine/task.c
index 7bd2b5937..3e8a5588c 100644
--- a/src/engine/task.c
+++ b/src/engine/task.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "debug.h"
#include "task.h"
#define ACTIVE_SENTINEL 0x10
@@ -11,8 +12,9 @@ struct Task gTasks[ACTIVE_SENTINEL];
static void InsertTask(u8 newTaskId);
static u8 FindFirstActiveTask();
-// Unused string
-const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました");
+const u8 gError_NoTasksLeft[] = _(
+ "TASK OVER\n"
+ "タスクがオーバーしました");
void ResetTasks()
{
@@ -49,6 +51,10 @@ u8 CreateTask(TaskFunc func, u8 priority)
}
}
+#if DEBUG
+ Crash(gError_NoTasksLeft);
+#endif
+
return 0;
}
diff --git a/src/engine/trade.c b/src/engine/trade.c
index 4bd39c4ef..36e6fc757 100644
--- a/src/engine/trade.c
+++ b/src/engine/trade.c
@@ -4495,8 +4495,8 @@ static __attribute__((naked)) void sub_804B41C(void)
}
#endif
-static void sub_804B790(void)
// In-game trade init
+void sub_804B790(void)
{
u8 otName[11];
switch (gMain.state)
diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c
index b49628bfa..998c4697e 100644
--- a/src/engine/trainer_card.c
+++ b/src/engine/trainer_card.c
@@ -5,6 +5,7 @@
#include "field_effect.h"
#include "graphics.h"
#include "link.h"
+#include "m4a.h"
#include "main.h"
#include "menu.h"
#include "money.h"
@@ -52,7 +53,6 @@ extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0};
-extern const u8 gBadgesTiles[];
extern const u16 gUnknown_083B5F0C[];
extern const u16 gBadgesPalette[];
extern const u16 gUnknown_083B5F4C[];
@@ -63,6 +63,34 @@ const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp");
// XXX: what is this?
u8 *const ewram_ = gSharedMem;
+#if DEBUG
+const struct TrainerCard gUnknown_Debug_083E0448 =
+{
+ .gender = FEMALE,
+ .stars = 4,
+ .hasPokedex = TRUE,
+ .var_3 = TRUE,
+ .var_4 = TRUE,
+ .firstHallOfFameA = 999,
+ .firstHallOfFameB = 99,
+ .firstHallOfFameC = 99,
+ .pokedexSeen = 411,
+ .trainerId = 12345,
+ .playTimeHours = 99,
+ .playTimeMinutes = 99,
+ .linkBattleWins = 9999,
+ .linkBattleLosses = 9999,
+ .battleTowerWins = 9999,
+ .battleTowerLosses = 9999,
+ .contestsWithFriends = 999,
+ .pokeblocksWithFriends = 0xFFFF,
+ .pokemonTrades = 0xFFFF,
+ .money = 99999,
+ .var_28 = {1, 2, 3, 4},
+ .playerName = _("てすと"),
+};
+#endif
+
bool8 TrainerCard_Init(struct Task *);
bool8 TrainerCard_WaitForFadeInToFinish(struct Task *);
bool8 TrainerCard_WaitForKeys(struct Task *);
@@ -176,8 +204,15 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void);
static void TrainerCard_Back_PrintPokemonTrades(void);
void unref_sub_8094588(u16 left, u16 top);
+#if DEBUG
+static u8 gDebug_03000748;
+#endif
+
void TrainerCard_ShowPlayerCard(Callback arg1)
{
+#if DEBUG
+ gDebug_03000748 = 0;
+#endif
TrainerCard_InitScreenForPlayer(arg1);
SetMainCallback2(sub_8093174);
ewram0_2.language = GAME_LANGUAGE;
@@ -185,11 +220,41 @@ void TrainerCard_ShowPlayerCard(Callback arg1)
void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2)
{
+#if DEBUG
+ gDebug_03000748 = 0;
+#endif
TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2);
SetMainCallback2(sub_8093174);
ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language;
}
+#if DEBUG
+void debug_sub_80A0710(Callback callback)
+{
+ gDebug_03000748 = TRUE;
+ TrainerCard_InitScreenForPlayer(callback);
+ SetMainCallback2(sub_8093174);
+ ewram0_2.language = GAME_LANGUAGE;
+}
+
+void debug_sub_80A073C(Callback callback)
+{
+ memcpy(&gTrainerCards[0], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard));
+ gDebug_03000748=TRUE;
+ TrainerCard_InitScreenForLinkPlayer(0, callback);
+ SetMainCallback2(sub_8093174);
+ ewram0_2.language = GAME_LANGUAGE;
+}
+
+void debug_sub_80A0780()
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ memcpy(&gTrainerCards[i], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard));
+}
+#endif
+
static void sub_8093174(void)
{
switch (gMain.state)
@@ -538,6 +603,19 @@ static void TrainerCard_FillFlags(void)
}
}
}
+
+#if DEBUG
+ if (gDebug_03000748 != 0)
+ {
+ ewram0_2.showHallOfFame = TRUE;
+ ewram0_2.showLinkBattleStatus = TRUE;
+ ewram0_2.showBattleTowerStatus = TRUE;
+ ewram0_2.showContestRecord = TRUE;
+ ewram0_2.showMixingRecord = TRUE;
+ ewram0_2.showTradingRecord = TRUE;
+ memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges));
+ }
+#endif
}
void sub_80937A4()
@@ -630,6 +708,17 @@ bool8 TrainerCard_WaitForKeys(struct Task *task)
}
return TRUE;
}
+#if DEBUG
+ else if (gDebug_03000748 && gMain.newKeys & R_BUTTON)
+ {
+ ewram0_2.starCount++;
+ ewram0_2.starCount %= 5;
+ TrainerCard_LoadPalettes();
+ if (ewram0_2.backSideShown == 0)
+ TrainerCard_DrawStars();
+ }
+#endif
+
return FALSE;
}
@@ -1334,7 +1423,11 @@ static void TrainerCard_Front_PrintPokedexCount(void)
{
u8 buffer[16];
- if (!ewram0_2.showPokedexCount)
+ if (
+#if DEBUG
+ gDebug_03000748 == 0 &&
+#endif
+ !ewram0_2.showPokedexCount)
{
TrainerCard_ClearPokedexLabel();
}