summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_setup.c26
-rw-r--r--src/clock.c92
-rw-r--r--src/lottery_corner.c10
-rw-r--r--src/main_menu.c2
-rw-r--r--src/menu.c11
-rw-r--r--src/option_menu.c2
-rw-r--r--src/palette.c18
-rw-r--r--src/party_menu.c317
-rw-r--r--src/pokemon_summary_screen.c72
-rw-r--r--src/rom4.c4
-rw-r--r--src/sound.c31
-rw-r--r--src/start_menu.c71
-rw-r--r--src/starter_choose.c2
-rw-r--r--src/wallclock.c8
14 files changed, 602 insertions, 64 deletions
diff --git a/src/battle_setup.c b/src/battle_setup.c
index fa0bf4ba1..5296f1923 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -164,7 +164,7 @@ void StartBattle_StandardWild(void)
ScriptContext2_Enable();
FreezeMapObjects();
sub_80597F4();
- gMain.field_8 = HandleWildBattleEnd;
+ gMain.savedCallback = HandleWildBattleEnd;
gBattleTypeFlags = 0;
task_add_01_battle_start(GetWildBattleTransition(), 0);
sav12_xor_increment(7);
@@ -176,7 +176,7 @@ void StartBattle_Roamer(void)
ScriptContext2_Enable();
FreezeMapObjects();
sub_80597F4();
- gMain.field_8 = HandleWildBattleEnd;
+ gMain.savedCallback = HandleWildBattleEnd;
gBattleTypeFlags = BATTLE_TYPE_ROAMER;
task_add_01_battle_start(GetWildBattleTransition(), 0);
sav12_xor_increment(7);
@@ -188,7 +188,7 @@ void StartBattle_Safari(void)
ScriptContext2_Enable();
FreezeMapObjects();
sub_80597F4();
- gMain.field_8 = sub_80C824C;
+ gMain.savedCallback = sub_80C824C;
gBattleTypeFlags = BATTLE_TYPE_SAFARI;
task_add_01_battle_start(GetWildBattleTransition(), 0);
}
@@ -205,7 +205,7 @@ void StartBattle_WallyTutorial(void)
{
CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5);
ScriptContext2_Enable();
- gMain.field_8 = c2_exit_to_overworld_1_continue_scripts_restart_music;
+ gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music;
gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL;
task_add_01_battle_start(8, 0);
}
@@ -213,7 +213,7 @@ void StartBattle_WallyTutorial(void)
void StartBattle_ScriptedWild(void)
{
ScriptContext2_Enable();
- gMain.field_8 = HandleScriptedWildBattleEnd;
+ gMain.savedCallback = HandleScriptedWildBattleEnd;
gBattleTypeFlags = 0;
task_add_01_battle_start(GetWildBattleTransition(), 0);
sav12_xor_increment(7);
@@ -223,7 +223,7 @@ void StartBattle_ScriptedWild(void)
void StartBattle_SouthernIsland(void)
{
ScriptContext2_Enable();
- gMain.field_8 = HandleScriptedWildBattleEnd;
+ gMain.savedCallback = HandleScriptedWildBattleEnd;
gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
task_add_01_battle_start(GetWildBattleTransition(), 0);
sav12_xor_increment(7);
@@ -233,7 +233,7 @@ void StartBattle_SouthernIsland(void)
void StartBattle_Rayquaza(void)
{
ScriptContext2_Enable();
- gMain.field_8 = HandleScriptedWildBattleEnd;
+ gMain.savedCallback = HandleScriptedWildBattleEnd;
gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
task_add_01_battle_start(0, BGM_BATTLE34);
sav12_xor_increment(7);
@@ -243,7 +243,7 @@ void StartBattle_Rayquaza(void)
void StartBattle_GroudonKyogre(void)
{
ScriptContext2_Enable();
- gMain.field_8 = HandleScriptedWildBattleEnd;
+ gMain.savedCallback = HandleScriptedWildBattleEnd;
gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;
if (gGameVersion == 2)
task_add_01_battle_start(0xB, BGM_BATTLE34); // KYOGRE
@@ -256,7 +256,7 @@ void StartBattle_GroudonKyogre(void)
void StartBattle_Regi(void)
{
ScriptContext2_Enable();
- gMain.field_8 = HandleScriptedWildBattleEnd;
+ gMain.savedCallback = HandleScriptedWildBattleEnd;
gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI;
task_add_01_battle_start(0xA, BGM_BATTLE36);
sav12_xor_increment(7);
@@ -500,7 +500,7 @@ u8 GetBattleTowerBattleTransition(void)
void ChooseStarter(void)
{
SetMainCallback2(CB2_ChooseStarter);
- gMain.field_8 = CB2_GiveStarter;
+ gMain.savedCallback = CB2_GiveStarter;
}
void CB2_GiveStarter(void)
@@ -524,7 +524,7 @@ void CB2_StartFirstBattle(void)
if (sub_811AAE8() == TRUE)
{
gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE;
- gMain.field_8 = HandleFirstBattleEnd;
+ gMain.savedCallback = HandleFirstBattleEnd;
SetMainCallback2(sub_800E7C4);
prev_quest_postbuffer_cursor_backup_reset();
overworld_poison_timer_set();
@@ -734,7 +734,7 @@ void trainer_flag_clear(u16 flag)
void sub_80825E4(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER;
- gMain.field_8 = sub_808260C;
+ gMain.savedCallback = sub_808260C;
task_add_01_battle_start_with_music_and_stats();
ScriptContext1_Stop();
}
@@ -777,7 +777,7 @@ void do_choose_name_or_words_screen(void)
void sub_80826B0(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER;
- gMain.field_8 = do_choose_name_or_words_screen;
+ gMain.savedCallback = do_choose_name_or_words_screen;
task_add_01_battle_start_with_music_and_stats();
ScriptContext1_Stop();
}
diff --git a/src/clock.c b/src/clock.c
new file mode 100644
index 000000000..e660abdd3
--- /dev/null
+++ b/src/clock.c
@@ -0,0 +1,92 @@
+#include "global.h"
+#include "main.h"
+#include "rtc.h"
+#include "event_data.h"
+#include "lottery_corner.h"
+#include "berry.h"
+#include "rom4.h"
+#include "wallclock.h"
+
+extern void sub_80FA220(u16);
+extern void sub_80BE8C4(u16);
+extern void sub_8080834(u16);
+extern void UpdatePartyPokerusTime(u16);
+extern void sub_810D2F4(u16);
+extern void UpdateBirchState(u16);
+extern void sub_810F618(u16);
+
+static void InitTimeBasedEvents(void);
+static void UpdatePerDay(struct Time *time);
+static void UpdatePerSecond(struct Time *time);
+static void ReturnFromStartWallClock(void);
+
+static void InitTimeBasedEvents(void)
+{
+ FlagSet(SYS_CLOCK_SET);
+ RtcCalcLocalTime();
+ gSaveBlock2.lastBerryTreeUpdate = gLocalTime;
+ VarSet(VAR_DAYS, gLocalTime.days);
+}
+
+void DoTimeBasedEvents(void)
+{
+ if (FlagGet(SYS_CLOCK_SET))
+ {
+ RtcCalcLocalTime();
+ UpdatePerDay(&gLocalTime);
+ UpdatePerSecond(&gLocalTime);
+ }
+}
+
+static void UpdatePerDay(struct Time *time)
+{
+ u16 *varPtr = GetVarPointer(VAR_DAYS);
+ int days = *varPtr;
+ u16 newDays;
+
+ if (days != time->days && days <= time->days)
+ {
+ newDays = time->days - days;
+ ClearUpperFlags();
+ sub_80FA220(newDays);
+ sub_80BE8C4(newDays);
+ sub_8080834(newDays);
+ UpdatePartyPokerusTime(newDays);
+ sub_810D2F4(newDays);
+ UpdateBirchState(newDays);
+ sub_810F618(newDays);
+ SetRandomLotteryNumber(newDays);
+ *varPtr = time->days;
+ }
+}
+
+static void UpdatePerSecond(struct Time *time)
+{
+ struct Time newTime;
+ s32 totalSeconds;
+
+ CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time);
+ totalSeconds = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes;
+
+ // there's no way to get the correct assembly other than with this nested if check. so dumb.
+ if (totalSeconds != 0)
+ {
+ if (totalSeconds >= 0)
+ {
+ BerryTreeTimeUpdate(totalSeconds);
+ gSaveBlock2.lastBerryTreeUpdate = *time;
+ }
+ }
+}
+
+static void ReturnFromStartWallClock(void)
+{
+ InitTimeBasedEvents();
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+void StartWallClock(void)
+{
+ SetMainCallback2(CB2_StartWallClock);
+ gMain.savedCallback = ReturnFromStartWallClock;
+}
diff --git a/src/lottery_corner.c b/src/lottery_corner.c
index 54ba3c46d..4d80f86c2 100644
--- a/src/lottery_corner.c
+++ b/src/lottery_corner.c
@@ -22,7 +22,7 @@ void ResetLotteryCorner(void)
u16 rand = Random();
SetLotteryNumber((Random() << 16) | rand);
- VarSet(0x4045, 0);
+ VarSet(VAR_POKELOT_PRIZE, 0);
}
void SetRandomLotteryNumber(u16 i)
@@ -147,14 +147,14 @@ void SetLotteryNumber(u32 lotteryNum)
u16 lowNum = lotteryNum >> 16;
u16 highNum = lotteryNum;
- VarSet(0x404B, highNum);
- VarSet(0x404C, lowNum);
+ VarSet(VAR_POKELOT_RND1, highNum);
+ VarSet(VAR_POKELOT_RND2, lowNum);
}
u32 GetLotteryNumber(void)
{
- u16 highNum = VarGet(0x404B);
- u16 lowNum = VarGet(0x404C);
+ u16 highNum = VarGet(VAR_POKELOT_RND1);
+ u16 lowNum = VarGet(VAR_POKELOT_RND2);
return (lowNum << 16) | highNum;
}
diff --git a/src/main_menu.c b/src/main_menu.c
index bbdae24fe..7adbda096 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -582,7 +582,7 @@ void Task_MainMenuPressedA(u8 taskId)
DestroyTask(taskId);
break;
case OPTION:
- gMain.field_8 = CB2_InitMainMenuFromOptions;
+ gMain.savedCallback = CB2_InitMainMenuFromOptions;
SetMainCallback2(CB2_InitOptionMenu);
DestroyTask(taskId);
break;
diff --git a/src/menu.c b/src/menu.c
index 4bb4dbec2..ee9376079 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -22,6 +22,9 @@ struct Menu
u8 columnXCoords[8];
};
+extern u8 OtherText_Yes[];
+extern u8 OtherText_No[];
+
static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16);
static void InitMenuWindowInternal(const struct WindowConfig *, u16);
static bool8 sub_80723D4(void);
@@ -41,7 +44,11 @@ EWRAM_DATA u16 gMenuTextWindowTileOffset = 0;
EWRAM_DATA u16 gMenuTextWindowContentTileOffset = 0;
EWRAM_DATA u16 gMenuMessageBoxContentTileOffset = 0;
-extern const struct MenuAction gMenuYesNoItems[];
+const struct MenuAction gMenuYesNoItems[] =
+{
+ { OtherText_Yes, NULL },
+ { OtherText_No, NULL },
+};
void CloseMenu(void)
{
@@ -143,7 +150,7 @@ void BasicInitMenuWindow(const struct WindowConfig *winConfig)
gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset;
}
-void MenuPrint(u8 *str, u8 left, u8 top)
+void MenuPrint(const u8 *str, u8 left, u8 top)
{
sub_8003460(gMenuWindowPtr, str, gMenuTextTileOffset, left, top);
}
diff --git a/src/option_menu.c b/src/option_menu.c
index 6d6310b46..f597429c1 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -310,7 +310,7 @@ static void Task_OptionMenuFadeOut(u8 taskId)
if(!gPaletteFade.active)
{
DestroyTask(taskId);
- SetMainCallback2(gMain.field_8);
+ SetMainCallback2(gMain.savedCallback);
}
}
diff --git a/src/palette.c b/src/palette.c
index bf93a036c..165eb2eae 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -30,7 +30,7 @@ struct PaletteStructTemplate
struct PaletteStruct
{
- struct PaletteStructTemplate *base;
+ const struct PaletteStructTemplate *base;
u32 ps_field_4_0:1;
u16 ps_field_4_1:1;
u32 baseDestOffset:9;
@@ -48,7 +48,19 @@ EWRAM_DATA u32 gFiller_202F394 = 0;
EWRAM_DATA static u32 sPlttBufferTransferPending = 0;
EWRAM_DATA static u8 sPaletteDecompressionBuffer[0x400] = {0};
-extern struct PaletteStructTemplate gDummyPaletteStructTemplate;
+static const struct PaletteStructTemplate sDummyPaletteStructTemplate =
+{
+ 0xFFFF,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0
+};
static void unused_sub_8073DFC(struct PaletteStruct *, u32 *);
static void unused_sub_8073F60(struct PaletteStruct *, u32 *);
@@ -332,7 +344,7 @@ void ResetPaletteStructByUid(u16 a1)
void ResetPaletteStruct(u8 paletteNum)
{
- sPaletteStructs[paletteNum].base = &gDummyPaletteStructTemplate;
+ sPaletteStructs[paletteNum].base = &sDummyPaletteStructTemplate;
sPaletteStructs[paletteNum].ps_field_4_0 = 0;
sPaletteStructs[paletteNum].baseDestOffset = 0;
sPaletteStructs[paletteNum].destOffset = 0;
diff --git a/src/party_menu.c b/src/party_menu.c
new file mode 100644
index 000000000..ce1b0f32a
--- /dev/null
+++ b/src/party_menu.c
@@ -0,0 +1,317 @@
+#include "global.h"
+#include "menu.h"
+#include "pokemon.h"
+#include "songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+
+#define DATA_COUNT (6)
+
+struct Unk201C000 {
+ /* 0x00 */ struct Pokemon *pokemon;
+ /* 0x04 */ u8 var04;
+ /* 0x05 */ u8 var05;
+ /* 0x06 */ u16 var06;
+ u8 pad_08[10];
+ /* 0x12 */ u16 var12;
+};
+
+struct Unk201B260 {
+ /* 0x00 */ u8 var00;
+ /* 0x01 */ u8 var01;
+ u8 pad_02[2];
+ /* 0x04 */ s16 var04[DATA_COUNT * 2];
+ u8 pad_1C[2];
+ /* 0x1E */ u16 var1E;
+ /* 0x20 */ u16 var20;
+};
+
+extern struct Unk201B260 unk_201B260;
+extern struct Unk201C000 unk_201C000;
+extern u8 gStringVar1[];
+extern u8 gUnknown_0202E8F4;
+extern u8 gUnknown_0202E8F6;
+
+extern u8 gUnknown_083769A8[][12];
+extern u8 gUnknown_08376D1C[DATA_COUNT];
+extern u8 *gUnknown_08376D04[DATA_COUNT];
+extern u8 gOtherText_TallPlusAndRightArrow[];
+
+void task_pc_turn_off(u8 *u8, int i);
+static void sub_806E884(u8 taskId);
+void sub_806F8AC(u8 taskId);
+void PartyMenuUpdateLevelOrStatus(struct Pokemon *, u8);
+u8 ExecuteTableBasedItemEffect__(u8 u8, u16 u16, int i);
+void sub_80701DC(u8 taskId);
+
+u8 sub_806E834(u8 *message, u8 arg1) {
+ u8 taskId;
+
+ gUnknown_0202E8F6 = 1;
+
+ MenuDrawTextWindow(3, 14, 26, 19);
+ MenuPrintMessage(message, 4, 15);
+
+ taskId = CreateTask(sub_806E884, 1);
+ gTasks[taskId].data[0] = arg1;
+
+ return taskId;
+}
+
+static void sub_806E884(u8 taskId) {
+ if (MenuUpdateWindowText() == 0) {
+ return;
+ }
+
+ gUnknown_0202E8F6 = 0;
+
+ if (gTasks[taskId].data[0] == 0) {
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ }
+
+ DestroyTask(taskId);
+}
+
+asm(".section .text_b");
+
+#ifdef NONMATCHING
+void sub_8070088(u8 taskId) {
+ u8 dummyTaskId;
+ struct Task *task2;
+
+ gTasks[taskId].func = TaskDummy;
+
+ if (GetMonData(&gPlayerParty[unk_201C000.var04], MON_DATA_SPECIES) == 0) {
+ gTasks[taskId].func = sub_80701DC;
+ return;
+ }
+
+ dummyTaskId = CreateTask(TaskDummy, 5);
+ task2 = &gTasks[dummyTaskId];
+
+ task2->data[10] = GetMonData(unk_201C000.pokemon, MON_DATA_MAX_HP);
+ task2->data[11] = GetMonData(unk_201C000.pokemon, MON_DATA_HP);
+
+ if (ExecuteTableBasedItemEffect__(unk_201C000.var05, unk_201C000.var06, 0)) {
+ DestroyTask(dummyTaskId);
+ gTasks[taskId].func = sub_80701DC;
+ return;
+ }
+
+ gUnknown_0202E8F4 = 1;
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ PlaySE(SE_KAIFUKU);
+ PartyMenuUpdateLevelOrStatus(unk_201C000.pokemon, unk_201C000.var05);
+
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle()][unk_201C000.var05], 9);
+ unk_201B260.var01 = 2; // u8
+
+ task2->data[12] = GetMonData(unk_201C000.pokemon, MON_DATA_HP) - task2->data[11];
+ task2->data[14]= 1;
+ unk_201B260.var1E = 1; // u16
+ unk_201B260.var20 = 1; // u16
+
+ unk_201C000.var12 = -0x8000;
+ task2->func = sub_806F8AC;
+}
+#else
+__attribute__((naked))
+void sub_8070088(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r1, _08070120 @ =gTasks\n\
+ mov r10, r1\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r1, 3\n\
+ mov r2, r10\n\
+ adds r7, r1, r2\n\
+ ldr r5, _08070124 @ =TaskDummy\n\
+ str r5, [r7]\n\
+ ldr r4, _08070128 @ =0x0201c000\n\
+ ldrb r0, [r4, 0x5]\n\
+ movs r1, 0x64\n\
+ mov r9, r1\n\
+ mov r2, r9\n\
+ muls r2, r0\n\
+ adds r0, r2, 0\n\
+ ldr r1, _0807012C @ =gPlayerParty\n\
+ mov r8, r1\n\
+ add r0, r8\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _08070118\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x5\n\
+ bl CreateTask\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ str r0, [sp]\n\
+ mov r0, r10\n\
+ adds r0, 0x8\n\
+ ldr r2, [sp]\n\
+ adds r6, r2, r0\n\
+ ldrb r0, [r4, 0x5]\n\
+ mov r1, r9\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ add r0, r8\n\
+ str r0, [r4]\n\
+ movs r1, 0x3A\n\
+ bl GetMonData\n\
+ strh r0, [r6, 0x14]\n\
+ ldr r0, [r4]\n\
+ movs r1, 0x39\n\
+ bl GetMonData\n\
+ strh r0, [r6, 0x16]\n\
+ ldrb r0, [r4, 0x5]\n\
+ ldrh r1, [r4, 0x6]\n\
+ movs r2, 0\n\
+ bl ExecuteTableBasedItemEffect__\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08070134\n\
+ adds r0, r5, 0\n\
+ bl DestroyTask\n\
+_08070118:\n\
+ ldr r0, _08070130 @ =sub_80701DC\n\
+ str r0, [r7]\n\
+ b _080701B0\n\
+ .align 2, 0\n\
+_08070120: .4byte gTasks\n\
+_08070124: .4byte TaskDummy\n\
+_08070128: .4byte 0x0201c000\n\
+_0807012C: .4byte gPlayerParty\n\
+_08070130: .4byte sub_80701DC\n\
+_08070134:\n\
+ ldr r1, _080701C0 @ =gUnknown_0202E8F4\n\
+ movs r0, 0x1\n\
+ strb r0, [r1]\n\
+ movs r0, 0x3\n\
+ movs r1, 0xE\n\
+ movs r2, 0x1A\n\
+ movs r3, 0x13\n\
+ bl MenuZeroFillWindowRect\n\
+ movs r0, 0x1\n\
+ bl PlaySE\n\
+ ldr r0, [r4]\n\
+ ldrb r1, [r4, 0x5]\n\
+ bl PartyMenuUpdateLevelOrStatus\n\
+ bl IsDoubleBattle\n\
+ adds r1, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ ldrb r1, [r4, 0x5]\n\
+ lsls r1, 1\n\
+ adds r0, r1\n\
+ ldr r1, _080701C4 @ =gUnknown_083769A8\n\
+ adds r0, r1\n\
+ movs r1, 0x9\n\
+ bl task_pc_turn_off\n\
+ ldr r2, _080701C8 @ =0xfffff261\n\
+ adds r1, r4, r2\n\
+ movs r0, 0x2\n\
+ strb r0, [r1]\n\
+ ldr r0, [r4]\n\
+ movs r1, 0x39\n\
+ bl GetMonData\n\
+ ldrh r1, [r6, 0x16]\n\
+ subs r0, r1\n\
+ strh r0, [r6, 0x18]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0x1C]\n\
+ ldr r1, _080701CC @ =0xfffff27e\n\
+ adds r0, r4, r1\n\
+ movs r1, 0x1\n\
+ strh r1, [r0]\n\
+ ldr r2, _080701D0 @ =0xfffff280\n\
+ adds r0, r4, r2\n\
+ strh r1, [r0]\n\
+ ldrh r1, [r6, 0x16]\n\
+ adds r2, 0x2\n\
+ adds r0, r4, r2\n\
+ strh r1, [r0]\n\
+ ldr r0, _080701D4 @ =0xffff8000\n\
+ str r0, [r4, 0xC]\n\
+ ldr r1, [sp]\n\
+ add r1, r10\n\
+ ldr r0, _080701D8 @ =sub_806F8AC\n\
+ str r0, [r1]\n\
+_080701B0:\n\
+ add sp, 0x4\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080701C0: .4byte gUnknown_0202E8F4\n\
+_080701C4: .4byte gUnknown_083769A8\n\
+_080701C8: .4byte 0xfffff261\n\
+_080701CC: .4byte 0xfffff27e\n\
+_080701D0: .4byte 0xfffff280\n\
+_080701D4: .4byte 0xffff8000\n\
+_080701D8: .4byte sub_806F8AC\n\
+ .syntax divided\n");
+}
+#endif
+
+
+asm(".section .text_c");
+
+void sub_8070848(u8 taskId) {
+ u8 i;
+
+ MenuDrawTextWindow(11, 0, 29, 7);
+
+ for (i = 0; i < DATA_COUNT; i++) {
+ u8 x;
+ u8 y;
+ u32 stat;
+ struct Pokemon **pokemon;
+
+ pokemon = &unk_201C000.pokemon;
+ asm("" ::: "r0");
+ stat = GetMonData(*pokemon, gUnknown_08376D1C[i]);
+
+ unk_201B260.var04[i + DATA_COUNT] = stat;
+ unk_201B260.var04[i] = stat - unk_201B260.var04[i];
+
+ x = (i / 3) * 9 + 11;
+ y = ((i % 3) << 1) + 1;
+
+ MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1);
+
+
+ if (i == 2) {
+ MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
+ } else {
+ MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1);
+ }
+
+ gStringVar1[0] = 0xFC;
+ gStringVar1[1] = 0x14;
+ gStringVar1[2] = 0x06;
+
+ ConvertIntToDecimalStringN(gStringVar1 + 3, unk_201B260.var04[i], 1, 2);
+
+ MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0);
+ }
+}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 58573e97e..b6b24b9d7 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -3,10 +3,13 @@
#include "menu.h"
#include "pokemon.h"
#include "string_util.h"
+#include "link.h"
extern u8 gStringVar1[];
extern u8 gStringVar4[];
+extern struct Pokemon *unk_2018000;
+
extern u8 *(gNatureNames[]);
extern const u8 gOtherText_Terminator4[];
extern const u8 gOtherText_Nature[];
@@ -16,10 +19,79 @@ extern const u8 gOtherText_Egg2[];
extern const u8 gOtherText_ObtainedInTrade[];
extern const u8 gOtherText_FatefulEncounter[];
extern const u8 gOtherText_Met2[];
+extern const u8 gOtherText_EggDayCare[];
+extern const u8 gOtherText_EggNicePlace[];
+extern const u8 gOtherText_EggObtainedInTrade[];
+extern const u8 gOtherText_EggHotSprings[];
u8 *sub_80A1E9C(u8 *dest, u8 *src, u8);
u8 PokemonSummaryScreen_CheckOT(struct Pokemon *pokemon);
u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level);
+u32 GetPlayerTrainerId(void);
+
+bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon)
+{
+ u32 trainerId;
+
+ if (unk_2018000 == gEnemyParty)
+ {
+ u8 enemyId = GetMultiplayerId() ^ 1;
+ trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF;
+ StringCopy(gStringVar1, gLinkPlayers[enemyId].name);
+ StripExtCtrlCodes(gStringVar1);
+ }
+ else
+ {
+ trainerId = GetPlayerTrainerId() & 0xFFFF;
+ StringCopy(gStringVar1, gSaveBlock2.playerName);
+ }
+
+ if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF))
+ return FALSE;
+
+ GetMonData(mon, MON_DATA_OT_NAME, gStringVar2);
+
+ if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2))
+ return TRUE;
+
+ return FALSE;
+}
+
+void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
+{
+ u8 locationMet;
+ u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME);
+
+ if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
+ {
+ MenuPrint(gOtherText_EggObtainedInTrade, left, top);
+ return;
+ }
+
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
+
+ if (locationMet == 255)
+ {
+ MenuPrint(gOtherText_EggNicePlace, left, top);
+ return;
+ }
+
+ if (!PokemonSummaryScreen_CheckOT(mon))
+ {
+ MenuPrint(gOtherText_EggObtainedInTrade, left, top);
+ return;
+ }
+
+ asm(""); // needed to match for some reason
+
+ if (locationMet == 253)
+ {
+ MenuPrint(gOtherText_EggHotSprings, left, top);
+ return;
+ }
+
+ MenuPrint(gOtherText_EggDayCare, left, top);
+}
void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top) {
u8 locationMet;
diff --git a/src/rom4.c b/src/rom4.c
index 971c46584..e7c28f474 100644
--- a/src/rom4.c
+++ b/src/rom4.c
@@ -731,7 +731,7 @@ bool16 sub_8053D30(struct WarpData *warp)
bool16 sub_8053D6C(struct WarpData *warp)
{
- if (VarGet(16563))
+ if (VarGet(0x40B3))
return FALSE;
if (warp->mapGroup != 32)
return FALSE;
@@ -1135,7 +1135,7 @@ void CB2_LoadMap(void)
ScriptContext2_Disable();
set_callback1(NULL);
SetMainCallback2(sub_810CC80);
- gMain.field_8 = CB2_LoadMap2;
+ gMain.savedCallback = CB2_LoadMap2;
}
void CB2_LoadMap2(void)
diff --git a/src/sound.c b/src/sound.c
index aa12ba477..c244c5cbe 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -32,8 +32,6 @@ extern struct MusicPlayerInfo gMPlay_SE1;
extern struct MusicPlayerInfo gMPlay_SE2;
extern struct MusicPlayerInfo gMPlay_SE3;
-extern struct Fanfare gFanfares[];
-
extern struct ToneData voicegroup_8452590[];
extern struct ToneData voicegroup_8452B90[];
extern struct ToneData voicegroup_8453190[];
@@ -44,6 +42,22 @@ extern struct ToneData voicegroup_8453DC0[];
extern struct ToneData voicegroup_84543C0[];
extern struct ToneData voicegroup_84549C0[];
+static const struct Fanfare sFanfares[] =
+{
+ { BGM_FANFA1, 80 },
+ { BGM_FANFA4, 160 },
+ { BGM_FANFA5, 220 },
+ { BGM_ME_WAZA, 220 },
+ { BGM_ME_ASA, 160 },
+ { BGM_ME_BACHI, 340 },
+ { BGM_ME_WASURE, 180 },
+ { BGM_ME_KINOMI, 120 },
+ { BGM_ME_TAMA, 710 },
+ { BGM_ME_B_BIG, 250 },
+ { BGM_ME_B_SMALL, 150 },
+ { BGM_ME_ZANNEN, 160 },
+};
+
static void Task_Fanfare(u8 taskId);
static void CreateFanfareTask(void);
static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode);
@@ -174,14 +188,10 @@ bool8 IsNotWaitingForBGMStop(void)
void PlayFanfareByFanfareNum(u8 fanfareNum)
{
- struct Fanfare *fanfares;
- struct Fanfare *fanfare;
u16 songNum;
m4aMPlayStop(&gMPlay_BGM);
- fanfares = gFanfares;
- fanfare = &fanfares[fanfareNum];
- songNum = fanfare->songNum;
- sFanfareCounter = fanfare->duration;
+ songNum = sFanfares[fanfareNum].songNum;
+ sFanfareCounter = sFanfares[fanfareNum].duration;
m4aSongNumStart(songNum);
}
@@ -205,7 +215,7 @@ bool8 WaitFanfare(bool8 stop)
void StopFanfareByFanfareNum(u8 fanfareNum)
{
- m4aSongNumStop(gFanfares[fanfareNum].songNum);
+ m4aSongNumStop(sFanfares[fanfareNum].songNum);
}
void PlayFanfare(u16 songNum)
@@ -213,8 +223,7 @@ void PlayFanfare(u16 songNum)
s32 i;
for (i = 0; (u32)i < 12; i++)
{
- struct Fanfare *fanfare = &gFanfares[i];
- if (fanfare->songNum == songNum)
+ if (sFanfares[i].songNum == songNum)
{
PlayFanfareByFanfareNum(i);
CreateFanfareTask();
diff --git a/src/start_menu.c b/src/start_menu.c
index 0d9e8af2c..87cb3f593 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -37,11 +37,6 @@ enum {
MENU_ACTION_PLAYER_LINK
};
-struct MenuItem {
- u8 *text;
- u8 (*callback)(void);
-};
-
static u8 (*saveDialogCallback)(void);
static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed
static bool8 savingComplete;
@@ -51,7 +46,6 @@ extern u16 gSaveFileStatus;
extern u16 gScriptResult;
extern u8 (*gCallback_03004AE8)(void);
extern u8 gUnknown_03004860;
-extern struct MenuItem gStartMenuItems[];
extern u8 gNumSafariBalls;
EWRAM_DATA static u8 sStartMenuCursorPos = 0;
@@ -67,6 +61,41 @@ extern u8 gSaveText_ThereIsAlreadyAFile[];
extern u8 gSaveText_ThereIsADifferentFile[];
extern u8 gSaveText_WouldYouLikeToSave[];
extern u8 gOtherText_SafariStock[];
+extern u8 SystemText_Pokedex[];
+extern u8 SystemText_Pokemon[];
+extern u8 SystemText_BAG[];
+extern u8 SystemText_Pokenav[];
+extern u8 SystemText_Player[];
+extern u8 SystemText_Save[];
+extern u8 SystemText_Option[];
+extern u8 SystemText_Exit[];
+extern u8 SystemText_Retire[];
+extern u8 SystemText_Player[];
+
+static u8 StartMenu_PokedexCallback(void);
+static u8 StartMenu_PokemonCallback(void);
+static u8 StartMenu_BagCallback(void);
+static u8 StartMenu_PokenavCallback(void);
+static u8 StartMenu_PlayerCallback(void);
+static u8 StartMenu_SaveCallback(void);
+static u8 StartMenu_OptionCallback(void);
+static u8 StartMenu_ExitCallback(void);
+static u8 StartMenu_RetireCallback(void);
+static u8 StartMenu_PlayerLinkCallback(void);
+
+static const struct MenuAction sStartMenuItems[] =
+{
+ { SystemText_Pokedex, StartMenu_PokedexCallback },
+ { SystemText_Pokemon, StartMenu_PokemonCallback },
+ { SystemText_BAG, StartMenu_BagCallback },
+ { SystemText_Pokenav, StartMenu_PokenavCallback },
+ { SystemText_Player, StartMenu_PlayerCallback },
+ { SystemText_Save, StartMenu_SaveCallback },
+ { SystemText_Option, StartMenu_OptionCallback },
+ { SystemText_Exit, StartMenu_ExitCallback },
+ { SystemText_Retire, StartMenu_RetireCallback },
+ { SystemText_Player, StartMenu_PlayerLinkCallback },
+};
//Private functions
static void BuildStartMenuActions(void);
@@ -180,7 +209,7 @@ static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n)
do
{
- MenuPrint(gStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2);
+ MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2);
_index++;
if(_index >= sNumStartMenuActions)
{
@@ -303,12 +332,12 @@ static u8 StartMenu_InputProcessCallback(void)
if(gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- if(gStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].callback == StartMenu_PokedexCallback)
+ if(sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback)
{
if(GetNationalPokedexCount(0) == 0)
return 0;
}
- gCallback_03004AE8 = gStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].callback;
+ gCallback_03004AE8 = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func;
if(gCallback_03004AE8 != StartMenu_SaveCallback &&
gCallback_03004AE8 != StartMenu_ExitCallback &&
gCallback_03004AE8 != StartMenu_RetireCallback)
@@ -324,7 +353,7 @@ static u8 StartMenu_InputProcessCallback(void)
}
//When player selects POKEDEX
-u8 StartMenu_PokedexCallback(void)
+static u8 StartMenu_PokedexCallback(void)
{
if(!gPaletteFade.active)
{
@@ -337,7 +366,7 @@ u8 StartMenu_PokedexCallback(void)
}
//When player selects POKEMON
-u8 StartMenu_PokemonCallback(void)
+static u8 StartMenu_PokemonCallback(void)
{
if(!gPaletteFade.active)
{
@@ -349,7 +378,7 @@ u8 StartMenu_PokemonCallback(void)
}
//When player selects BAG
-u8 StartMenu_BagCallback(void)
+static u8 StartMenu_BagCallback(void)
{
if(!gPaletteFade.active)
{
@@ -361,7 +390,7 @@ u8 StartMenu_BagCallback(void)
}
//When player selects POKENAV
-u8 StartMenu_PokenavCallback(void)
+static u8 StartMenu_PokenavCallback(void)
{
if(!gPaletteFade.active)
{
@@ -373,7 +402,7 @@ u8 StartMenu_PokenavCallback(void)
}
//When player selects his/her name
-u8 StartMenu_PlayerCallback(void)
+static u8 StartMenu_PlayerCallback(void)
{
if(!gPaletteFade.active)
{
@@ -385,7 +414,7 @@ u8 StartMenu_PlayerCallback(void)
}
//When player selects SAVE
-u8 StartMenu_SaveCallback(void)
+static u8 StartMenu_SaveCallback(void)
{
sub_8072DEC();
gCallback_03004AE8 = SaveCallback1;
@@ -393,27 +422,27 @@ u8 StartMenu_SaveCallback(void)
}
//When player selects OPTION
-u8 StartMenu_OptionCallback(void)
+static u8 StartMenu_OptionCallback(void)
{
if(!gPaletteFade.active)
{
PlayRainSoundEffect();
SetMainCallback2(CB2_InitOptionMenu);
- gMain.field_8 = sub_805469C;
+ gMain.savedCallback = sub_805469C;
return 1;
}
return 0;
}
//When player selects EXIT
-u8 StartMenu_ExitCallback(void)
+static u8 StartMenu_ExitCallback(void)
{
CloseMenu();
return 1;
}
//When player selects RETIRE
-u8 StartMenu_RetireCallback(void)
+static u8 StartMenu_RetireCallback(void)
{
CloseMenu();
SafariZoneRetirePrompt();
@@ -421,7 +450,7 @@ u8 StartMenu_RetireCallback(void)
}
//When player selects their name in multiplayer mode
-u8 StartMenu_PlayerLinkCallback(void)
+static u8 StartMenu_PlayerLinkCallback(void)
{
if(!gPaletteFade.active)
{
@@ -826,7 +855,7 @@ static void Task_8071B64(u8 taskId)
(*step)++;
break;
case 4:
- SetMainCallback2(gMain.field_8);
+ SetMainCallback2(gMain.savedCallback);
DestroyTask(taskId);
break;
}
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 2750705b8..68e644353 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -266,7 +266,7 @@ static void Task_StarterChoose5(u8 taskId)
case 0: //YES
//Return the starter choice and exit.
gScriptResult = gTasks[taskId].data[TD_STARTERSELECTION];
- SetMainCallback2(gMain.field_8);
+ SetMainCallback2(gMain.savedCallback);
break;
case 1: //NO
case -1: //B button
diff --git a/src/wallclock.c b/src/wallclock.c
index 1281fcc55..147a68d31 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -150,7 +150,7 @@ static void WallClockInit(void)
}
//Allow player to set the clock
-void Cb2_StartWallClock(void)
+void CB2_StartWallClock(void)
{
u8 taskId;
u8 spriteId;
@@ -189,7 +189,7 @@ void Cb2_StartWallClock(void)
}
//View, but don't set, the clock
-void Cb2_ViewWallClock(void)
+void CB2_ViewWallClock(void)
{
u8 taskId;
s16 angle1;
@@ -332,7 +332,7 @@ static void Task_SetClock5(u8 taskId)
static void Task_SetClock6(u8 taskId)
{
if(!gPaletteFade.active)
- SetMainCallback2((MainCallback)gMain.field_8);
+ SetMainCallback2((MainCallback)gMain.savedCallback);
}
static void Task_ViewClock1(u8 taskId)
@@ -358,7 +358,7 @@ static void Task_ViewClock3(u8 taskId)
static void Task_ViewClock4(u8 taskId)
{
if(!gPaletteFade.active)
- SetMainCallback2((MainCallback)gMain.field_8);
+ SetMainCallback2((MainCallback)gMain.savedCallback);
}
static u8 CalcMinHandDelta(u16 speed)