summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2017-08-11 16:06:12 -0500
committercamthesaxman <cameronghall@cox.net>2017-08-11 16:06:12 -0500
commita50ec1ee05ff46ea8335b982ac501bc9917ec289 (patch)
treeeeff4924997ea1b03e21c6f1c55552a088c1fd14 /src
parentbb0cad7c072703f5a540e8c22c8e137267331f4d (diff)
decompile sub_813265C - sub_81330E8
Diffstat (limited to 'src')
-rw-r--r--src/learn_move.c556
1 files changed, 556 insertions, 0 deletions
diff --git a/src/learn_move.c b/src/learn_move.c
new file mode 100644
index 000000000..fe14cebf6
--- /dev/null
+++ b/src/learn_move.c
@@ -0,0 +1,556 @@
+#include "global.h"
+#include "data2.h"
+#include "field_fadetransition.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_cursor.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "rom4.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "task.h"
+
+struct UnknownStruct1
+{
+ const u8 *unk0;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+};
+
+extern u8 ewram[];
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u8 gTileBuffer[];
+
+extern const struct WindowConfig gWindowConfig_81E6CE4;
+extern const struct WindowConfig gWindowConfig_81E7240;
+extern const struct UnknownStruct1 gUnknown_08402D08[];
+extern const struct SpriteSheet gUnknown_08402D80;
+extern const struct SpritePalette gUnknown_08402D88;
+
+extern void sub_809D9F0(struct Pokemon *, u8, u8, void *, u32);
+
+struct Struct2017000
+{
+ u8 unk0;
+ u8 filler1[2];
+ u8 unk3;
+ u8 unk4;
+ u8 unk5[16];
+ u8 filler15[3];
+ u8 unk18;
+ u8 filler19[0x1B-0x19];
+ u8 unk1B;
+ u8 filler1C;
+ u8 unk1D;
+ u8 unk1E;
+ u8 filler1F;
+ u16 unk20[4];
+ u8 filler28[0x2C3-0x28];
+ u8 unk2C3;
+ u8 unk2C4;
+ u8 unk2C5;
+ u8 unk2C6;
+};
+
+extern struct Struct2017000 *gUnknown_030007B0;
+
+const u16 gDexArrows_Pal[] = INCBIN_U16("graphics/pokedex/arrows.gbapal");
+
+const u8 gDexArrows_Gfx[] = INCBIN_U8("graphics/pokedex/arrows.4bpp");
+
+const u8 gUnknown_08402CF8[][4] =
+{
+ { 0, 0, 9, 13},
+ {10, 0, 29, 7},
+ { 2, 14, 27, 19},
+ {10, 8, 29, 13},
+};
+
+const struct UnknownStruct1 gUnknown_08402D08[] =
+{
+ {OtherText_Battle, 1, 1, 0},
+ {OtherText_Power, 1, 4, 1},
+ {OtherText_Accuracy, 1, 9, 2},
+ {NULL, 0, 0, 0},
+ {OtherText_Contest, 1, 1, 0},
+ {OtherText_Appeal, 1, 4, 1},
+ {OtherText_Jam, 1, 9, 2},
+ {NULL, 0, 0, 0},
+};
+
+void sub_813269C(u8);
+void sub_81326D8(void);
+void sub_8132870(void);
+void sub_8132908(void);
+void sub_8132FEC(void);
+void sub_8133030(u8);
+u8 sub_81330E8(void);
+void sub_8133140(u8);
+u8 sub_8133248(void);
+void sub_81332A0(void);
+void sub_8133358(void);
+void sub_8133558(void);
+void sub_813362C(void);
+void sub_8133800(void);
+void sub_8133AEC();
+void sub_8133CA4(void);
+
+void sub_813265C(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_8132670(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_813269C, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+}
+
+void sub_813269C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_81326D8);
+ gFieldCallback = sub_8080990;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_81326D8(void)
+{
+ REG_DISPCNT = 0;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ gUnknown_030007B0 = (struct Struct2017000 *)(ewram + 0x17000);
+ sub_81332A0();
+ gUnknown_030007B0->unk2C5 = gSpecialVar_0x8004;
+ sub_8133558();
+ SetVBlankCallback(sub_813265C);
+
+ SetUpWindowConfig(&gWindowConfig_81E7240);
+ InitMenuWindow(&gWindowConfig_81E7240);
+ MenuZeroFillScreen();
+
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ MenuZeroFillScreen();
+
+ REG_BG0VOFS = 0;
+ REG_BG0VOFS = 0; // huh?
+ REG_BG1HOFS = 0;
+ REG_BG1HOFS = 0; // huh?
+
+ LoadSpriteSheet(&gUnknown_08402D80);
+ LoadSpritePalette(&gUnknown_08402D88);
+ sub_8133358();
+ FillPalette(0, 0, 2);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(sub_8132870);
+}
+
+void sub_81327A4(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ gUnknown_030007B0 = (struct Struct2017000 *)(ewram + 0x17000);
+ sub_8133558();
+ gUnknown_030007B0->unk2C6 = gSpecialVar_0x8005;
+ SetVBlankCallback(sub_813265C);
+
+ SetUpWindowConfig(&gWindowConfig_81E7240);
+ InitMenuWindow(&gWindowConfig_81E7240);
+ MenuZeroFillScreen();
+
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ MenuZeroFillScreen();
+
+ REG_DISPCNT = 0x1340;
+ REG_BG0VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1HOFS = 0; // huh?
+
+ LoadSpriteSheet(&gUnknown_08402D80);
+ LoadSpritePalette(&gUnknown_08402D88);
+ sub_8133358();
+ FillPalette(0, 0, 2);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(sub_8132870);
+}
+
+void sub_8132870(void)
+{
+ sub_8132908();
+ if (gUnknown_030007B0->unk1D != 0)
+ {
+ gUnknown_030007B0->unk1D = 0;
+ sub_814AD7C(0x58, (gUnknown_030007B0->unk18 * 2 + 1) * 8);
+ }
+ if (gUnknown_030007B0->unk1E != 0)
+ {
+ gUnknown_030007B0->unk1E = 0;
+ sub_8133800();
+ }
+ if (gUnknown_030007B0->unk2C3 != 0)
+ {
+ sub_8133AEC(gUnknown_030007B0->unk2C4, 1);
+ gUnknown_030007B0->unk2C3 = 0;
+ }
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_81328E8(const u8 *a)
+{
+ StringExpandPlaceholders(gStringVar4, a);
+ MenuPrintMessage(gStringVar4, 3, 15);
+}
+
+void sub_8132908(void)
+{
+ switch (gUnknown_030007B0->unk0)
+ {
+ case 0:
+ gUnknown_030007B0->unk0++;
+ sub_8132FEC();
+ sub_8133030(0);
+ sub_8133800();
+ gSprites[1].pos1.x = 0x48;
+ gUnknown_030007B0->unk2C3 = 1;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ REG_DISPCNT = 0x1340;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ gUnknown_030007B0->unk0 = 4;
+ break;
+ case 2:
+ gUnknown_030007B0->unk0++;
+ break;
+ case 3:
+ sub_8133030(0);
+ sub_8133800();
+ gUnknown_030007B0->unk2C3 = 1;
+ gUnknown_030007B0->unk0++;
+ gSprites[1].pos1.x = 0x48;
+ break;
+ case 4:
+ if (sub_81330E8() == 0)
+ sub_813362C();
+ return;
+ case 5:
+ sub_8133140(0);
+ sub_8133800();
+ gUnknown_030007B0->unk2C3 = 1;
+ gSprites[1].pos1.x = 0x48;
+ gUnknown_030007B0->unk0++;
+ break;
+ case 6:
+ if (sub_8133248() == 0)
+ sub_813362C();
+ break;
+ case 8:
+ if (MenuUpdateWindowText())
+ {
+ DisplayYesNoMenu(21, 7, 1);
+ gUnknown_030007B0->unk0++;
+ }
+ break;
+ case 9:
+ {
+ s8 var = ProcessMenuInputNoWrap_();
+
+ if (var == 0)
+ {
+ sub_8133CA4();
+ if (GiveMoveToMon(&gPlayerParty[gUnknown_030007B0->unk2C5], gUnknown_030007B0->unk20[gUnknown_030007B0->unk1B]) != 0xFFFF)
+ {
+ sub_81328E8(gOtherText_PokeLearnedMove);
+ gSpecialVar_0x8004 = 1;
+ gUnknown_030007B0->unk0 = 31;
+ }
+ else
+ {
+ gUnknown_030007B0->unk0 = 16;
+ }
+ }
+ else if (var == -1 || var == 1)
+ {
+ sub_8133CA4();
+ if (gUnknown_030007B0->unk2C4 == 0)
+ gUnknown_030007B0->unk0 = 3;
+ if (gUnknown_030007B0->unk2C4 == 1)
+ gUnknown_030007B0->unk0 = 5;
+ }
+ }
+ break;
+ case 12:
+ if (MenuUpdateWindowText())
+ {
+ DisplayYesNoMenu(21, 7, 1);
+ gUnknown_030007B0->unk0++;
+ }
+ break;
+ case 13:
+ {
+ s8 r4 = ProcessMenuInputNoWrap_();
+
+ if (r4 == 0)
+ {
+ sub_8133CA4();
+ gSpecialVar_0x8004 = r4;
+ gUnknown_030007B0->unk0 = 14;
+ }
+ else if (r4 == -1 || r4 == 1)
+ {
+ sub_8133CA4();
+ if (gUnknown_030007B0->unk2C4 == 0)
+ gUnknown_030007B0->unk0 = 3;
+ if (gUnknown_030007B0->unk2C4 == 1)
+ gUnknown_030007B0->unk0 = 5;
+ }
+ }
+ break;
+ case 16:
+ sub_81328E8(gOtherText_DeleteOlderMove);
+ gUnknown_030007B0->unk0++;
+ break;
+ case 17:
+ if (MenuUpdateWindowText())
+ {
+ DisplayYesNoMenu(21, 7, 1);
+ gUnknown_030007B0->unk0 = 18;
+ }
+ break;
+ case 18:
+ {
+ s8 var = ProcessMenuInputNoWrap_();
+
+ if (var == 0)
+ {
+ sub_8133CA4();
+ sub_81328E8(gOtherText_WhichMoveToForget);
+ gUnknown_030007B0->unk0 = 19;
+ }
+ else if (var == -1 || var == 1)
+ {
+ sub_8133CA4();
+ gUnknown_030007B0->unk0 = 24;
+ }
+ }
+ break;
+ case 24:
+ sub_81328E8(gOtherText_StopLearningMove);
+ gUnknown_030007B0->unk0++;
+ break;
+ case 25:
+ if (MenuUpdateWindowText())
+ {
+ gUnknown_030007B0->unk0 = 26;
+ DisplayYesNoMenu(21, 7, 1);
+ }
+ break;
+ case 26:
+ {
+ s8 var = ProcessMenuInputNoWrap_();
+
+ if (var == 0)
+ {
+ sub_8133CA4();
+ gUnknown_030007B0->unk0 = 27;
+ }
+ else if (var == -1 || var == 1)
+ {
+ sub_8133CA4();
+
+ // What's the point? It gets set to 16, anyway.
+ if (gUnknown_030007B0->unk2C4 == 0)
+ gUnknown_030007B0->unk0 = 3;
+ if (gUnknown_030007B0->unk2C4 == 1)
+ gUnknown_030007B0->unk0 = 5;
+ gUnknown_030007B0->unk0 = 16;
+ }
+ }
+ break;
+ case 27:
+ if (MenuUpdateWindowText())
+ {
+ if (gUnknown_030007B0->unk2C4 == 0)
+ gUnknown_030007B0->unk0 = 3;
+ if (gUnknown_030007B0->unk2C4 == 1)
+ gUnknown_030007B0->unk0 = 5;
+ }
+ break;
+ case 19:
+ if (MenuUpdateWindowText())
+ {
+ gUnknown_030007B0->unk0 = 20;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ }
+ break;
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ sub_809D9F0(gPlayerParty, gUnknown_030007B0->unk2C5, gPlayerPartyCount - 1, sub_81327A4, gUnknown_030007B0->unk20[gUnknown_030007B0->unk1B]);
+ gUnknown_030007B0->unk0 = 28;
+ }
+ break;
+ case 21:
+ if (MenuUpdateWindowText())
+ gUnknown_030007B0->unk0 = 14;
+ break;
+ case 22:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gUnknown_030007B0->unk0++;
+ break;
+ case 15:
+ if (!gPaletteFade.active)
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+ break;
+ case 28:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gUnknown_030007B0->unk0++;
+ sub_8132FEC();
+ sub_8133800();
+ if (gUnknown_030007B0->unk2C4 == 0)
+ sub_8133030(1);
+ if (gUnknown_030007B0->unk2C4 == 1)
+ {
+ gSprites[1].pos1.x = 0x48;
+ sub_8133140(1);
+ }
+ sub_8133AEC(gUnknown_030007B0->unk2C4, 1);
+ break;
+ case 29:
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_030007B0->unk2C6 == 4)
+ {
+ gUnknown_030007B0->unk0 = 24;
+ }
+ else
+ {
+ u16 moveId = GetMonData(&gPlayerParty[gUnknown_030007B0->unk2C5], MON_DATA_MOVE1 + gUnknown_030007B0->unk2C6);
+
+ StringCopy(gStringVar3, gMoveNames[moveId]);
+ RemoveMonPPBonus(&gPlayerParty[gUnknown_030007B0->unk2C5], gUnknown_030007B0->unk2C6);
+ SetMonMoveSlot(&gPlayerParty[gUnknown_030007B0->unk2C5], gUnknown_030007B0->unk20[gUnknown_030007B0->unk1B], gUnknown_030007B0->unk2C6);
+ StringCopy(gStringVar2, gMoveNames[gUnknown_030007B0->unk20[gUnknown_030007B0->unk1B]]);
+ sub_81328E8(gOtherText_ForgotMove123);
+ gUnknown_030007B0->unk0 = 30;
+ gSpecialVar_0x8004 = 1;
+ }
+ }
+ break;
+ case 30:
+ if (MenuUpdateWindowText())
+ {
+#ifdef ENGLISH
+ sub_81328E8(gOtherText_ForgotOrDidNotLearnMove);
+#else
+ sub_81328E8(deuOtherText_ForgotAndLearned);
+#endif
+ gUnknown_030007B0->unk0 = 31;
+ PlayFanfare(BGM_FANFA1);
+ }
+ break;
+ case 31:
+ if (MenuUpdateWindowText())
+ {
+ PlayFanfare(BGM_FANFA1);
+ gUnknown_030007B0->unk0 = 32;
+ }
+ break;
+ case 32:
+ if (IsFanfareTaskInactive())
+ gUnknown_030007B0->unk0 = 33;
+ break;
+ case 33:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_030007B0->unk0 = 14;
+ }
+ break;
+ }
+}
+
+void sub_8132FEC(void)
+{
+ u32 i;
+
+ BasicInitMenuWindow(&gWindowConfig_81E7240);
+ for (i = 0; i < 4; i++)
+ {
+ MenuDrawTextWindow(
+ gUnknown_08402CF8[i][0],
+ gUnknown_08402CF8[i][1],
+ gUnknown_08402CF8[i][2],
+ gUnknown_08402CF8[i][3]);
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6CE4);
+}
+
+void sub_8133030(bool8 a)
+{
+ s32 i;
+
+ gSprites[gUnknown_030007B0->unk3].invisible = FALSE;
+ gSprites[gUnknown_030007B0->unk4].invisible = FALSE;
+ for (i = 0; i < 16; i++)
+ {
+ // Hmm...
+ gSprites[*((u8 *)gUnknown_030007B0 + i + 7)].invisible = TRUE;
+ }
+ for (i = 0; gUnknown_08402D08[i].unk0 != NULL; i++)
+ {
+ sub_8072C74(gTileBuffer, gUnknown_08402D08[i].unk0, 64, 2);
+ MenuPrint(gTileBuffer, gUnknown_08402D08[i].unk4, gUnknown_08402D08[i].unk5);
+ }
+ if (!a)
+ {
+ sub_8072AB0(gOtherText_TeachWhichMove, 24, 120, 192, 32, 1);
+ }
+}
+
+u8 sub_81330E8(void)
+{
+ u32 r4 = ((gMain.newKeys & 0x30) != 0);
+
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR
+ && (gMain.newKeys & 0x300))
+ r4++;
+
+ if (r4 != 0)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_030007B0->unk0 = 5;
+ gUnknown_030007B0->unk2C4 = 1;
+ }
+
+ return r4;
+}