Merge with master
This commit is contained in:
248
src/battle_pyramid.c
Normal file
248
src/battle_pyramid.c
Normal file
@@ -0,0 +1,248 @@
|
||||
#include "global.h"
|
||||
#include "main.h"
|
||||
#include "battle_controllers.h"
|
||||
#include "bg.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_weather.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "overworld.h"
|
||||
#include "palette.h"
|
||||
#include "party_menu.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "script.h"
|
||||
#include "task.h"
|
||||
#include "constants/rgb.h"
|
||||
|
||||
EWRAM_DATA struct
|
||||
{
|
||||
u32 unk0;
|
||||
u8 filler4[0x804 - 0x4];
|
||||
u8 unk804[11];
|
||||
u8 unk80F[5];
|
||||
u8 unk814;
|
||||
u8 filler815;
|
||||
s8 unk816;
|
||||
u8 filler817[0x984 - 0x817];
|
||||
u16 unk984;
|
||||
u8 filler986[0x98C - 0x986];
|
||||
} *gUnknown_0203CF2C = NULL;
|
||||
EWRAM_DATA struct
|
||||
{
|
||||
void (*callback)(void);
|
||||
u8 unk4;
|
||||
u16 unk6;
|
||||
u16 unk8;
|
||||
} gUnknown_0203CF30 = {0};
|
||||
|
||||
extern const struct BgTemplate gUnknown_0861F2B4[3];
|
||||
|
||||
void sub_81C4F98(u8 a0, void (*callback)(void));
|
||||
void sub_81C4F44(u8 taskId);
|
||||
void sub_81C504C(void);
|
||||
bool8 sub_81C5078(void);
|
||||
void sub_81C51DC(void);
|
||||
bool8 sub_81C5238(void);
|
||||
void sub_81C5314(void);
|
||||
void sub_81C5674(void);
|
||||
void sub_81C56F8(void);
|
||||
void sub_81C5924(void);
|
||||
void sub_81C59BC(void);
|
||||
void sub_81C5A20(void);
|
||||
void sub_81C6BD8(void);
|
||||
void sub_81C6EF4(void);
|
||||
void sub_81C700C(void);
|
||||
|
||||
void sub_81C4EEC(void)
|
||||
{
|
||||
gUnknown_0203CF30.unk6 = 0;
|
||||
gUnknown_0203CF30.unk8 = 0;
|
||||
}
|
||||
|
||||
void sub_81C4EFC(void)
|
||||
{
|
||||
sub_81C4F98(0, CB2_ReturnToFieldWithOpenMenu);
|
||||
}
|
||||
|
||||
void sub_81C4F10(void)
|
||||
{
|
||||
sub_81C4F98(1, SetCB2ToReshowScreenAfterMenu2);
|
||||
}
|
||||
|
||||
void sub_81C4F24(void)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
FadeScreen(1, 0);
|
||||
CreateTask(sub_81C4F44, 10);
|
||||
}
|
||||
|
||||
void sub_81C4F44(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
overworld_free_bg_tilemaps();
|
||||
gFieldCallback2 = hm_add_c3_without_phase_2;
|
||||
sub_81C4F98(3, CB2_ReturnToField);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81C4F84(void)
|
||||
{
|
||||
sub_81C4F98(4, gUnknown_0203CF30.callback);
|
||||
}
|
||||
|
||||
void sub_81C4F98(u8 a0, void (*callback)(void))
|
||||
{
|
||||
gUnknown_0203CF2C = AllocZeroed(sizeof(*gUnknown_0203CF2C));
|
||||
|
||||
if (a0 != 4)
|
||||
{
|
||||
gUnknown_0203CF30.unk4 = a0;
|
||||
}
|
||||
|
||||
if (callback != NULL)
|
||||
{
|
||||
gUnknown_0203CF30.callback = callback;
|
||||
}
|
||||
|
||||
gUnknown_0203CF2C->unk0 = 0;
|
||||
gUnknown_0203CF2C->unk814 = -1;
|
||||
gUnknown_0203CF2C->unk816 = -1;
|
||||
|
||||
memset(gUnknown_0203CF2C->unk804, 0xFF, sizeof(gUnknown_0203CF2C->unk804));
|
||||
memset(gUnknown_0203CF2C->unk80F, 0xFF, sizeof(gUnknown_0203CF2C->unk80F));
|
||||
|
||||
SetMainCallback2(sub_81C504C);
|
||||
}
|
||||
|
||||
void sub_81C501C(void)
|
||||
{
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
do_scheduled_bg_tilemap_copies_to_vram();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
void sub_81C5038(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void sub_81C504C(void)
|
||||
{
|
||||
while (sub_81221EC() != TRUE && sub_81C5078() != TRUE && sub_81221AC() != TRUE);
|
||||
}
|
||||
|
||||
bool8 sub_81C5078(void)
|
||||
{
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
SetVBlankHBlankCallbacksToNull();
|
||||
clear_scheduled_bg_copies_to_vram();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 1:
|
||||
ScanlineEffect_Stop();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 2:
|
||||
FreeAllSpritePalettes();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 3:
|
||||
ResetPaletteFade();
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
gMain.state++;
|
||||
break;
|
||||
case 4:
|
||||
ResetSpriteData();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 5:
|
||||
if (!sub_81221AC())
|
||||
{
|
||||
ResetTasks();
|
||||
}
|
||||
gMain.state++;
|
||||
break;
|
||||
case 6:
|
||||
sub_81C51DC();
|
||||
gUnknown_0203CF2C->unk984 = 0;
|
||||
gMain.state++;
|
||||
break;
|
||||
case 7:
|
||||
if (sub_81C5238())
|
||||
{
|
||||
gMain.state++;
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
sub_81C6BD8();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 9:
|
||||
sub_81C5924();
|
||||
sub_81C59BC();
|
||||
sub_81C5A20();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 10:
|
||||
sub_81C5314();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 11:
|
||||
sub_81C56F8();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 12:
|
||||
sub_81C6EF4();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 13:
|
||||
sub_81C5674();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 14:
|
||||
sub_81C700C();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 15:
|
||||
BlendPalettes(0xFFFFFFFF, 0x10, 0);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 16:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
gMain.state++;
|
||||
break;
|
||||
default:
|
||||
SetVBlankCallback(sub_81C5038);
|
||||
SetMainCallback2(sub_81C501C);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_81C51DC(void)
|
||||
{
|
||||
ResetVramOamAndBgCntRegs();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_0861F2B4, ARRAY_COUNT(gUnknown_0861F2B4));
|
||||
SetBgTilemapBuffer(2, gUnknown_0203CF2C->filler4);
|
||||
ResetAllBgsCoordinates();
|
||||
schedule_bg_copy_tilemap_to_vram(2);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
|
||||
DISPCNT_OBJ_1D_MAP |
|
||||
DISPCNT_OBJ_ON);
|
||||
ShowBg(0);
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
}
|
||||
@@ -55,7 +55,7 @@ extern const u8* const gBattleScriptsForMoveEffects[];
|
||||
// functions
|
||||
extern void sub_81A5718(u8 battlerId); // battle frontier 2
|
||||
extern void sub_81A56B4(void); // battle frontier 2
|
||||
extern void sub_81BFA38(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen
|
||||
extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen
|
||||
extern u8 sub_81C1B94(void); // pokemon summary screen
|
||||
extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokenav.s
|
||||
extern void sub_81D3640(u8 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s
|
||||
@@ -5732,7 +5732,7 @@ static void atk5A_yesnoboxlearnmove(void)
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
FreeAllWindowBuffers();
|
||||
sub_81BFA38(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
|
||||
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
|
||||
gBattleScripting.learnMoveState++;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2436,7 +2436,7 @@ static void CB2_HandleBlenderEndGame(void)
|
||||
sBerryBlenderData->gameEndState++;
|
||||
break;
|
||||
case 10:
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 1:
|
||||
case -1:
|
||||
|
||||
@@ -86,7 +86,7 @@ static void Task_DoClearSaveDataScreenYesNo(u8 taskId)
|
||||
|
||||
static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId)
|
||||
{
|
||||
switch(ProcessMenuInputNoWrap_())
|
||||
switch(Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
FillWindowPixelBuffer(0, 17);
|
||||
|
||||
1756
src/contest_ai.c
Normal file
1756
src/contest_ai.c
Normal file
File diff suppressed because it is too large
Load Diff
54
src/data/text/nature_names.h
Normal file
54
src/data/text/nature_names.h
Normal file
@@ -0,0 +1,54 @@
|
||||
static const u8 sHardyNatureName[] = _("HARDY");
|
||||
static const u8 sLonelyNatureName[] = _("LONELY");
|
||||
static const u8 sBraveNatureName[] = _("BRAVE");
|
||||
static const u8 sAdamantNatureName[] = _("ADAMANT");
|
||||
static const u8 sNaughtyNatureName[] = _("NAUGHTY");
|
||||
static const u8 sBoldNatureName[] = _("BOLD");
|
||||
static const u8 sDocileNatureName[] = _("DOCILE");
|
||||
static const u8 sRelaxedNatureName[] = _("RELAXED");
|
||||
static const u8 sImpishNatureName[] = _("IMPISH");
|
||||
static const u8 sLaxNatureName[] = _("LAX");
|
||||
static const u8 sTimidNatureName[] = _("TIMID");
|
||||
static const u8 sHastyNatureName[] = _("HASTY");
|
||||
static const u8 sSeriousNatureName[] = _("SERIOUS");
|
||||
static const u8 sJollyNatureName[] = _("JOLLY");
|
||||
static const u8 sNaiveNatureName[] = _("NAIVE");
|
||||
static const u8 sModestNatureName[] = _("MODEST");
|
||||
static const u8 sMildNatureName[] = _("MILD");
|
||||
static const u8 sQuietNatureName[] = _("QUIET");
|
||||
static const u8 sBashfulNatureName[] = _("BASHFUL");
|
||||
static const u8 sRashNatureName[] = _("RASH");
|
||||
static const u8 sCalmNatureName[] = _("CALM");
|
||||
static const u8 sGentleNatureName[] = _("GENTLE");
|
||||
static const u8 sSassyNatureName[] = _("SASSY");
|
||||
static const u8 sCarefulNatureName[] = _("CAREFUL");
|
||||
static const u8 sQuirkyNatureName[] = _("QUIRKY");
|
||||
|
||||
const u8 *const gNatureNamePointers[] =
|
||||
{
|
||||
[NATURE_HARDY] = sHardyNatureName,
|
||||
[NATURE_LONELY] = sLonelyNatureName,
|
||||
[NATURE_BRAVE] = sBraveNatureName,
|
||||
[NATURE_ADAMANT] = sAdamantNatureName,
|
||||
[NATURE_NAUGHTY] = sNaughtyNatureName,
|
||||
[NATURE_BOLD] = sBoldNatureName,
|
||||
[NATURE_DOCILE] = sDocileNatureName,
|
||||
[NATURE_RELAXED] = sRelaxedNatureName,
|
||||
[NATURE_IMPISH] = sImpishNatureName,
|
||||
[NATURE_LAX] = sLaxNatureName,
|
||||
[NATURE_TIMID] = sTimidNatureName,
|
||||
[NATURE_HASTY] = sHastyNatureName,
|
||||
[NATURE_SERIOUS] = sSeriousNatureName,
|
||||
[NATURE_JOLLY] = sJollyNatureName,
|
||||
[NATURE_NAIVE] = sNaiveNatureName,
|
||||
[NATURE_MODEST] = sModestNatureName,
|
||||
[NATURE_MILD] = sMildNatureName,
|
||||
[NATURE_QUIET] = sQuietNatureName,
|
||||
[NATURE_BASHFUL] = sBashfulNatureName,
|
||||
[NATURE_RASH] = sRashNatureName,
|
||||
[NATURE_CALM] = sCalmNatureName,
|
||||
[NATURE_GENTLE] = sGentleNatureName,
|
||||
[NATURE_SASSY] = sSassyNatureName,
|
||||
[NATURE_CAREFUL] = sCarefulNatureName,
|
||||
[NATURE_QUIRKY] = sQuirkyNatureName,
|
||||
};
|
||||
@@ -659,7 +659,7 @@ static void CB2_EggHatch_1(void)
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
|
||||
|
||||
@@ -168,8 +168,8 @@ u16 *GetVarPointer(u16 id)
|
||||
return NULL;
|
||||
else if (id < SPECIAL_VARS_START)
|
||||
return &gSaveBlock1Ptr->vars[id - VARS_START];
|
||||
else
|
||||
return gSpecialVars[id - SPECIAL_VARS_START];
|
||||
else
|
||||
return gSpecialVars[id - SPECIAL_VARS_START];
|
||||
}
|
||||
|
||||
u16 VarGet(u16 id)
|
||||
@@ -200,8 +200,8 @@ u8 *GetFlagPointer(u16 id)
|
||||
return NULL;
|
||||
else if (id < SPECIAL_FLAGS_START)
|
||||
return &gSaveBlock1Ptr->flags[id / 8];
|
||||
else
|
||||
return &gUnknown_020375FC[(id - SPECIAL_FLAGS_START) / 8];
|
||||
else
|
||||
return &gUnknown_020375FC[(id - SPECIAL_FLAGS_START) / 8];
|
||||
}
|
||||
|
||||
u8 FlagSet(u16 id)
|
||||
|
||||
@@ -66,7 +66,7 @@ extern void sub_807F19C(void);
|
||||
extern void sub_807B140(void);
|
||||
extern void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
|
||||
extern void Overworld_PlaySpecialMapMusic(void);
|
||||
extern void sub_81BFA38(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move);
|
||||
extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move);
|
||||
extern u8 sub_81C1B94(void);
|
||||
extern void sub_807F1A8(u8 arg0, const u8 *arg1, u8 arg2);
|
||||
extern void sub_800E084(void);
|
||||
@@ -918,7 +918,7 @@ static void Task_EvolutionScene(u8 taskID)
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
FreeAllWindowBuffers();
|
||||
sub_81BFA38(gPlayerParty, gTasks[taskID].tPartyID,
|
||||
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
|
||||
gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics,
|
||||
gMoveToLearn);
|
||||
gTasks[taskID].tLearnMoveState++;
|
||||
@@ -1222,7 +1222,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
sEvoCursorPos = 0;
|
||||
@@ -1252,7 +1252,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
Free(GetBgTilemapBuffer(0));
|
||||
FreeAllWindowBuffers();
|
||||
|
||||
sub_81BFA38(gPlayerParty, gTasks[taskID].tPartyID,
|
||||
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
|
||||
gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics,
|
||||
gMoveToLearn);
|
||||
gTasks[taskID].tLearnMoveState++;
|
||||
|
||||
@@ -63,32 +63,24 @@ s16 GetTruckBoxMovement(int a1) // for the box movement?
|
||||
return 0;
|
||||
}
|
||||
|
||||
// smh STILL BROKEN IN EMERALD
|
||||
void Task_Truck1(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
s16 cameraYpan;
|
||||
s16 box1 = 0;
|
||||
s16 box2 = 0;
|
||||
s16 box3 = 0;
|
||||
u8 mapNum, mapGroup;
|
||||
register s16 zero asm("r4");
|
||||
s16 cameraXpan = 0, cameraYpan = 0;
|
||||
s16 box1, box2, box3;
|
||||
|
||||
box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box.
|
||||
sub_808E82C(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, 3, box1 + 3);
|
||||
sub_808E82C(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, 3 - cameraXpan, box1 + 3);
|
||||
box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box.
|
||||
sub_808E82C(2, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, 0, box2 - 3);
|
||||
sub_808E82C(2, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, -cameraXpan, box2 - 3);
|
||||
box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box.
|
||||
mapNum = gSaveBlock1Ptr->location.mapNum;
|
||||
mapGroup = gSaveBlock1Ptr->location.mapGroup;
|
||||
zero = 0;
|
||||
sub_808E82C(3, mapNum, mapGroup, -3, box3);
|
||||
sub_808E82C(3, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, -3 - cameraXpan, box3);
|
||||
|
||||
if (++data[0] == SECONDS(500)) // this will never run
|
||||
data[0] = zero; // reset the timer if it gets stuck.
|
||||
data[0] = 0; // reset the timer if it gets stuck.
|
||||
|
||||
cameraYpan = GetTruckCameraBobbingY(data[0]);
|
||||
SetCameraPanning(0, cameraYpan);
|
||||
SetCameraPanning(cameraXpan, cameraYpan);
|
||||
}
|
||||
|
||||
void Task_Truck2(u8 taskId)
|
||||
|
||||
@@ -1369,7 +1369,7 @@ void Task_HandleInBattleItemMenuInput(u8 taskId)
|
||||
{
|
||||
if (sub_81221EC() != TRUE)
|
||||
{
|
||||
s8 r4 = ProcessMenuInputNoWrapAround();
|
||||
s8 r4 = Menu_ProcessInputNoWrapAround();
|
||||
switch (r4)
|
||||
{
|
||||
case -2:
|
||||
|
||||
833
src/learn_move.c
Normal file
833
src/learn_move.c
Normal file
@@ -0,0 +1,833 @@
|
||||
#include "global.h"
|
||||
#include "main.h"
|
||||
#include "battle.h"
|
||||
#include "bg.h"
|
||||
#include "contest_effect.h"
|
||||
#include "data2.h"
|
||||
#include "event_data.h"
|
||||
#include "field_screen.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "learn_move.h"
|
||||
#include "list_menu.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "overworld.h"
|
||||
#include "palette.h"
|
||||
#include "pokemon_summary_screen.h"
|
||||
#include "pokenav.h"
|
||||
#include "script.h"
|
||||
#include "sound.h"
|
||||
#include "sprite.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "constants/rgb.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static EWRAM_DATA struct
|
||||
{
|
||||
u8 state;
|
||||
u8 spriteIds[16]; /*0x001*/
|
||||
u16 movesToLearn[4]; /*0x012*/
|
||||
u8 filler1A[0x44 - 0x1A]; /*0x01A*/
|
||||
u8 partyMon; /*0x044*/
|
||||
u8 moveSlot; /*0x045*/
|
||||
struct ListMenuItem menuItems[20]; /*0x048*/
|
||||
u8 fillerE8[0x110 - 0xE8]; /*0x0E8*/
|
||||
u8 numMenuChoices; /*0x110*/
|
||||
u8 numToShowAtOnce; /*0x111*/
|
||||
u8 listMenuTask; /*0x112*/
|
||||
u8 scrollArrowTaskId1; /*0x113*/
|
||||
u8 scrollArrowTaskId2; /*0x114*/
|
||||
u16 scrollOffset; /*0x116*/
|
||||
} *sLearnMoveStruct = {0};
|
||||
|
||||
static EWRAM_DATA struct {
|
||||
u16 listOffset;
|
||||
u16 listRow;
|
||||
u8 showContestInfo;
|
||||
} sLearnMoveStruct2 = {0};
|
||||
|
||||
const u16 gUnknown_085CE9F8[] = INCBIN_U16("graphics/interface/ui_learn_move.gbapal");
|
||||
const u8 gUnknown_085CEA18[] = INCBIN_U8("graphics/interface/ui_learn_move.4bpp");
|
||||
|
||||
const struct OamData gUnknown_085CEB98 =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = ST_OAM_OBJ_NORMAL,
|
||||
.mosaic = 0,
|
||||
.bpp = ST_OAM_4BPP,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = 0,
|
||||
.tileNum = 0,
|
||||
.priority = 0,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
const struct OamData gUnknown_085CEBA0 =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = ST_OAM_OBJ_NORMAL,
|
||||
.mosaic = 0,
|
||||
.bpp = ST_OAM_4BPP,
|
||||
.shape = ST_OAM_V_RECTANGLE,
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = 0,
|
||||
.tileNum = 0,
|
||||
.priority = 0,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
const struct OamData gUnknown_085CEBA8 =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = ST_OAM_OBJ_NORMAL,
|
||||
.mosaic = 0,
|
||||
.bpp = ST_OAM_4BPP,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = 0,
|
||||
.tileNum = 0,
|
||||
.priority = 0,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
const struct SpriteSheet gUnknown_085CEBB0 =
|
||||
{
|
||||
.data = gUnknown_085CEA18,
|
||||
.size = 0x180,
|
||||
.tag = 5525
|
||||
};
|
||||
|
||||
const struct SpritePalette gUnknown_085CEBB8 =
|
||||
{
|
||||
.data = gUnknown_085CE9F8,
|
||||
.tag = 5526
|
||||
};
|
||||
|
||||
const struct ScrollArrowsTemplate gUnknown_085CEBC0 =
|
||||
{
|
||||
.firstArrowType = 0,
|
||||
.firstX = 27,
|
||||
.firstY = 16,
|
||||
.secondArrowType = 1,
|
||||
.secondX = 117,
|
||||
.secondY = 16,
|
||||
.fullyUpThreshold = -1,
|
||||
.fullyDownThreshold = -1,
|
||||
.tileTag = 5325,
|
||||
.palTag = 5325,
|
||||
.palNum = 0,
|
||||
};
|
||||
|
||||
const struct ScrollArrowsTemplate gUnknown_085CEBD0 =
|
||||
{
|
||||
.firstArrowType = 2,
|
||||
.firstX = 192,
|
||||
.firstY = 8,
|
||||
.secondArrowType = 3,
|
||||
.secondX = 192,
|
||||
.secondY = 104,
|
||||
.fullyUpThreshold = 0,
|
||||
.fullyDownThreshold = 0,
|
||||
.tileTag = 5425,
|
||||
.palTag = 5425,
|
||||
.palNum = 0,
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_085CEBE0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(8, 5, FALSE, FALSE),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_085CEBE8[] =
|
||||
{
|
||||
ANIMCMD_FRAME(9, 5, FALSE, FALSE),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_085CEBF0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(10, 5, FALSE, FALSE),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_085CEBF8[] =
|
||||
{
|
||||
ANIMCMD_FRAME(11, 5, FALSE, FALSE),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd *const gUnknown_085CEC00[] =
|
||||
{
|
||||
gUnknown_085CEBE0,
|
||||
gUnknown_085CEBE8,
|
||||
gUnknown_085CEBF0,
|
||||
gUnknown_085CEBF8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_085CEC10 =
|
||||
{
|
||||
.tileTag = 5525,
|
||||
.paletteTag = 5526,
|
||||
.oam = &gUnknown_085CEB98,
|
||||
.anims = gUnknown_085CEC00,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
const struct BgTemplate gUnknown_085CEC28[] =
|
||||
{
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 31,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 0,
|
||||
.baseTile = 0,
|
||||
},
|
||||
{
|
||||
.bg = 1,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 30,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 1,
|
||||
.baseTile = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static void LearnMoveMain(void);
|
||||
static void CreateMenuItemsList(void);
|
||||
static void CreateHearts(void);
|
||||
static void CB2_Main(void);
|
||||
static void Task_WaitForFadeOut(u8 taskId);
|
||||
static void CB2_InitLearnMove(void);
|
||||
static void CB2_InitLearnMoveReturnFromSelectMove(void);
|
||||
static void InitBGs(void);
|
||||
static void AddScrollArrows(void);
|
||||
static void HandleInput(u8);
|
||||
static void ShowTeachMoveText(u8);
|
||||
static s32 GetCurrentItemId(void);
|
||||
static void FreeListMenuResources(void);
|
||||
static void RemoveScrollArrows(void);
|
||||
static void HideSpritesAndPrintTeachText(bool8);
|
||||
|
||||
static void VBlankCB_LearnMove(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void TeachMoveTutorMove(void)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
CreateTask(Task_WaitForFadeOut, 0xA);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
|
||||
}
|
||||
|
||||
static void Task_WaitForFadeOut(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
SetMainCallback2(CB2_InitLearnMove);
|
||||
gFieldCallback = sub_80AF168;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void CB2_InitLearnMove(void)
|
||||
{
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
ResetTasks();
|
||||
clear_scheduled_bg_copies_to_vram();
|
||||
sLearnMoveStruct = AllocZeroed(sizeof(*sLearnMoveStruct));
|
||||
sLearnMoveStruct->partyMon = gSpecialVar_0x8004;
|
||||
SetVBlankCallback(VBlankCB_LearnMove);
|
||||
|
||||
InitBGs();
|
||||
sub_81D2824(0);
|
||||
|
||||
sLearnMoveStruct2.listOffset = 0;
|
||||
sLearnMoveStruct2.listRow = 0;
|
||||
sLearnMoveStruct2.showContestInfo = FALSE;
|
||||
|
||||
CreateMenuItemsList();
|
||||
|
||||
LoadSpriteSheet(&gUnknown_085CEBB0);
|
||||
LoadSpritePalette(&gUnknown_085CEBB8);
|
||||
CreateHearts();
|
||||
|
||||
sLearnMoveStruct->listMenuTask = ListMenuInit(&gMultiuseListMenuTemplate, sLearnMoveStruct2.listOffset, sLearnMoveStruct2.listRow);
|
||||
FillPalette(RGB_BLACK, 0, 2);
|
||||
SetMainCallback2(CB2_Main);
|
||||
}
|
||||
|
||||
static void CB2_InitLearnMoveReturnFromSelectMove(void)
|
||||
{
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
ResetTasks();
|
||||
clear_scheduled_bg_copies_to_vram();
|
||||
sLearnMoveStruct = AllocZeroed(sizeof(*sLearnMoveStruct));
|
||||
sLearnMoveStruct->state = 28;
|
||||
sLearnMoveStruct->partyMon = gSpecialVar_0x8004;
|
||||
sLearnMoveStruct->moveSlot = gSpecialVar_0x8005;
|
||||
SetVBlankCallback(VBlankCB_LearnMove);
|
||||
|
||||
InitBGs();
|
||||
sub_81D2824(sLearnMoveStruct2.showContestInfo);
|
||||
CreateMenuItemsList();
|
||||
|
||||
LoadSpriteSheet(&gUnknown_085CEBB0);
|
||||
LoadSpritePalette(&gUnknown_085CEBB8);
|
||||
CreateHearts();
|
||||
|
||||
sLearnMoveStruct->listMenuTask = ListMenuInit(&gMultiuseListMenuTemplate, sLearnMoveStruct2.listOffset, sLearnMoveStruct2.listRow);
|
||||
FillPalette(RGB_BLACK, 0, 2);
|
||||
SetMainCallback2(CB2_Main);
|
||||
}
|
||||
|
||||
static void InitBGs(void)
|
||||
{
|
||||
ResetVramOamAndBgCntRegs();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_085CEC28, 2);
|
||||
ResetAllBgsCoordinates();
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
|
||||
DISPCNT_OBJ_1D_MAP |
|
||||
DISPCNT_OBJ_ON);
|
||||
ShowBg(0);
|
||||
ShowBg(1);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
}
|
||||
|
||||
static void CB2_Main(void)
|
||||
{
|
||||
LearnMoveMain();
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
do_scheduled_bg_tilemap_copies_to_vram();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void sub_816084C(const u8 *src)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, src);
|
||||
sub_81D2BF4(gStringVar4);
|
||||
}
|
||||
|
||||
static void LearnMoveMain(void)
|
||||
{
|
||||
switch (sLearnMoveStruct->state)
|
||||
{
|
||||
case 0:
|
||||
sLearnMoveStruct->state++;
|
||||
HideSpritesAndPrintTeachText(FALSE);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
sLearnMoveStruct->state = 4;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
sLearnMoveStruct->state++;
|
||||
break;
|
||||
case 3:
|
||||
HideSpritesAndPrintTeachText(FALSE);
|
||||
sLearnMoveStruct->state++;
|
||||
AddScrollArrows();
|
||||
break;
|
||||
case 4:
|
||||
HandleInput(FALSE);
|
||||
return;
|
||||
case 5:
|
||||
ShowTeachMoveText(FALSE);
|
||||
sLearnMoveStruct->state++;
|
||||
AddScrollArrows();
|
||||
break;
|
||||
case 6:
|
||||
HandleInput(TRUE);
|
||||
break;
|
||||
case 8:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sub_81D2C50();
|
||||
sLearnMoveStruct->state++;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
{
|
||||
s8 selection = Menu_ProcessInputNoWrap_();
|
||||
|
||||
if (selection == 0)
|
||||
{
|
||||
if (GiveMoveToMon(&gPlayerParty[sLearnMoveStruct->partyMon], GetCurrentItemId()) != 0xFFFF)
|
||||
{
|
||||
sub_816084C(gText_PkmnLearnedMove4);
|
||||
gSpecialVar_0x8004 = 1;
|
||||
sLearnMoveStruct->state = 31;
|
||||
}
|
||||
else
|
||||
{
|
||||
sLearnMoveStruct->state = 16;
|
||||
}
|
||||
}
|
||||
else if (selection == -1 || selection == 1)
|
||||
{
|
||||
if (sLearnMoveStruct2.showContestInfo == FALSE)
|
||||
{
|
||||
sLearnMoveStruct->state = 3;
|
||||
}
|
||||
else if (sLearnMoveStruct2.showContestInfo == TRUE)
|
||||
{
|
||||
sLearnMoveStruct->state = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sub_81D2C50();
|
||||
sLearnMoveStruct->state++;
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
{
|
||||
s8 selection = Menu_ProcessInputNoWrap_();
|
||||
|
||||
if (selection == 0)
|
||||
{
|
||||
gSpecialVar_0x8004 = selection;
|
||||
sLearnMoveStruct->state = 14;
|
||||
}
|
||||
else if (selection == -1 || selection == 1)
|
||||
{
|
||||
if (sLearnMoveStruct2.showContestInfo == FALSE)
|
||||
{
|
||||
sLearnMoveStruct->state = 3;
|
||||
}
|
||||
else if (sLearnMoveStruct2.showContestInfo == TRUE)
|
||||
{
|
||||
sLearnMoveStruct->state = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
sub_816084C(gText_PkmnTryingToLearnMove);
|
||||
sLearnMoveStruct->state++;
|
||||
break;
|
||||
case 17:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sub_81D2C50();
|
||||
sLearnMoveStruct->state = 18;
|
||||
}
|
||||
break;
|
||||
case 18:
|
||||
{
|
||||
s8 var = Menu_ProcessInputNoWrap_();
|
||||
|
||||
if (var == 0)
|
||||
{
|
||||
sub_816084C(gText_WhichMoveToForget2);
|
||||
sLearnMoveStruct->state = 19;
|
||||
}
|
||||
else if (var == -1 || var == 1)
|
||||
{
|
||||
sLearnMoveStruct->state = 24;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
StringCopy(gStringVar2, gMoveNames[GetCurrentItemId()]);
|
||||
sub_816084C(gText_StopTryingToTeachMove);
|
||||
sLearnMoveStruct->state++;
|
||||
break;
|
||||
case 25:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sub_81D2C50();
|
||||
sLearnMoveStruct->state++;
|
||||
}
|
||||
break;
|
||||
case 26:
|
||||
{
|
||||
s8 var = Menu_ProcessInputNoWrap_();
|
||||
|
||||
if (var == 0)
|
||||
{
|
||||
sLearnMoveStruct->state = 27;
|
||||
}
|
||||
else if (var == -1 || var == 1)
|
||||
{
|
||||
// What's the point? It gets set to 16, anyway.
|
||||
if (sLearnMoveStruct2.showContestInfo == FALSE)
|
||||
{
|
||||
sLearnMoveStruct->state = 3;
|
||||
}
|
||||
else if (sLearnMoveStruct2.showContestInfo == TRUE)
|
||||
{
|
||||
sLearnMoveStruct->state = 5;
|
||||
}
|
||||
sLearnMoveStruct->state = 16;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 27:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
FillWindowPixelBuffer(3, 0x11);
|
||||
if (sLearnMoveStruct2.showContestInfo == FALSE)
|
||||
{
|
||||
sLearnMoveStruct->state = 3;
|
||||
}
|
||||
else if (sLearnMoveStruct2.showContestInfo == TRUE)
|
||||
{
|
||||
sLearnMoveStruct->state = 5;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 19:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sLearnMoveStruct->state = 20;
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
}
|
||||
break;
|
||||
case 20:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, CB2_InitLearnMoveReturnFromSelectMove, GetCurrentItemId());
|
||||
FreeListMenuResources();
|
||||
}
|
||||
break;
|
||||
case 21:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sLearnMoveStruct->state = 14;
|
||||
}
|
||||
break;
|
||||
case 22:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
case 14:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
sLearnMoveStruct->state++;
|
||||
break;
|
||||
case 15:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
FreeListMenuResources();
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
break;
|
||||
case 28:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
sLearnMoveStruct->state++;
|
||||
if (sLearnMoveStruct2.showContestInfo == FALSE)
|
||||
{
|
||||
HideSpritesAndPrintTeachText(TRUE);
|
||||
}
|
||||
else if (sLearnMoveStruct2.showContestInfo == TRUE)
|
||||
{
|
||||
ShowTeachMoveText(TRUE);
|
||||
}
|
||||
RemoveScrollArrows();
|
||||
CopyWindowToVram(3, 2);
|
||||
break;
|
||||
case 29:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (sLearnMoveStruct->moveSlot == MAX_MON_MOVES)
|
||||
{
|
||||
sLearnMoveStruct->state = 24;
|
||||
}
|
||||
else
|
||||
{
|
||||
u16 moveId = GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_MOVE1 + sLearnMoveStruct->moveSlot);
|
||||
|
||||
StringCopy(gStringVar3, gMoveNames[moveId]);
|
||||
RemoveMonPPBonus(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->moveSlot);
|
||||
SetMonMoveSlot(&gPlayerParty[sLearnMoveStruct->partyMon], GetCurrentItemId(), sLearnMoveStruct->moveSlot);
|
||||
StringCopy(gStringVar2, gMoveNames[GetCurrentItemId()]);
|
||||
sub_816084C(gText_12AndPoof);
|
||||
sLearnMoveStruct->state = 30;
|
||||
gSpecialVar_0x8004 = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 30:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
sub_816084C(gText_PkmnForgotMoveAndLearnedNew);
|
||||
sLearnMoveStruct->state = 31;
|
||||
PlayFanfare(MUS_FANFA1);
|
||||
}
|
||||
break;
|
||||
case 31:
|
||||
if (!sub_81D2C3C())
|
||||
{
|
||||
PlayFanfare(MUS_FANFA1);
|
||||
sLearnMoveStruct->state = 32;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
if (IsFanfareTaskInactive())
|
||||
{
|
||||
sLearnMoveStruct->state = 33;
|
||||
}
|
||||
break;
|
||||
case 33:
|
||||
if (gMain.newKeys & A_BUTTON)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sLearnMoveStruct->state = 14;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void FreeListMenuResources(void)
|
||||
{
|
||||
RemoveScrollArrows();
|
||||
DestroyListMenuTask(sLearnMoveStruct->listMenuTask, &sLearnMoveStruct2.listOffset, &sLearnMoveStruct2.listRow);
|
||||
FreeAllWindowBuffers();
|
||||
FREE_AND_SET_NULL(sLearnMoveStruct);
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
}
|
||||
|
||||
static void HideSpritesAndPrintTeachText(bool8 a)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
|
||||
}
|
||||
|
||||
if (!a)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToPkmn);
|
||||
FillWindowPixelBuffer(3, 0x11);
|
||||
PrintTextOnWindow(3, 1, gStringVar4, 0, 1, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void HandleInput(bool8 showContest)
|
||||
{
|
||||
s32 itemId = ListMenuHandleInputGetItemId(sLearnMoveStruct->listMenuTask);
|
||||
ListMenuGetScrollAndRow(sLearnMoveStruct->listMenuTask, &sLearnMoveStruct2.listOffset, &sLearnMoveStruct2.listRow);
|
||||
|
||||
switch (itemId)
|
||||
{
|
||||
case LIST_NOTHING_CHOSEN:
|
||||
if (!(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) && !GetLRKeysState())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
PlaySE(SE_SELECT);
|
||||
|
||||
if (showContest == FALSE)
|
||||
{
|
||||
PutWindowTilemap(1);
|
||||
sLearnMoveStruct->state = 5;
|
||||
sLearnMoveStruct2.showContestInfo = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PutWindowTilemap(0);
|
||||
sLearnMoveStruct->state = 3;
|
||||
sLearnMoveStruct2.showContestInfo = FALSE;
|
||||
}
|
||||
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ShowHideHearts(GetCurrentItemId());
|
||||
break;
|
||||
case LIST_B_PRESSED:
|
||||
PlaySE(SE_SELECT);
|
||||
RemoveScrollArrows();
|
||||
sLearnMoveStruct->state = 12;
|
||||
StringExpandPlaceholders(gStringVar4, gText_GiveUpTeachingNewMove);
|
||||
sub_81D2BF4(gStringVar4);
|
||||
break;
|
||||
default:
|
||||
PlaySE(SE_SELECT);
|
||||
RemoveScrollArrows();
|
||||
sLearnMoveStruct->state = 8;
|
||||
StringCopy(gStringVar2, gMoveNames[itemId]);
|
||||
StringExpandPlaceholders(gStringVar4, gText_TeachX);
|
||||
sub_81D2BF4(gStringVar4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static s32 GetCurrentItemId(void)
|
||||
{
|
||||
return sLearnMoveStruct->menuItems[sLearnMoveStruct2.listRow + sLearnMoveStruct2.listOffset].id;
|
||||
}
|
||||
|
||||
static void ShowTeachMoveText(bool8 showContest)
|
||||
{
|
||||
if (showContest == FALSE)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToPkmn);
|
||||
FillWindowPixelBuffer(3, 0x11);
|
||||
PrintTextOnWindow(3, 1, gStringVar4, 0, 1, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateHearts(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
sLearnMoveStruct->scrollArrowTaskId2 = -1;
|
||||
sLearnMoveStruct->scrollArrowTaskId1 = -1;
|
||||
AddScrollArrows();
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
sLearnMoveStruct->spriteIds[i] = CreateSprite(&gUnknown_085CEC10, (i - (i / 4) * 4) * 8 + 104, (i / 4) * 8 + 36, 0);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
sLearnMoveStruct->spriteIds[i + 8] = CreateSprite(&gUnknown_085CEC10, (i - (i / 4) * 4) * 8 + 104, (i / 4) * 8 + 52, 0);
|
||||
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 2);
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void AddScrollArrows(void)
|
||||
{
|
||||
if (sLearnMoveStruct->scrollArrowTaskId2 == 0xFF)
|
||||
{
|
||||
sLearnMoveStruct->scrollArrowTaskId2 = AddScrollIndicatorArrowPair(&gUnknown_085CEBC0, &sLearnMoveStruct->scrollOffset);
|
||||
}
|
||||
|
||||
if (sLearnMoveStruct->scrollArrowTaskId1 == 0xFF)
|
||||
{
|
||||
gTempScrollArrowTemplate = gUnknown_085CEBD0;
|
||||
gTempScrollArrowTemplate.fullyDownThreshold = sLearnMoveStruct->numMenuChoices - sLearnMoveStruct->numToShowAtOnce;
|
||||
sLearnMoveStruct->scrollArrowTaskId1 = AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, &sLearnMoveStruct2.listOffset);
|
||||
}
|
||||
}
|
||||
|
||||
static void RemoveScrollArrows(void)
|
||||
{
|
||||
if (sLearnMoveStruct->scrollArrowTaskId2 != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(sLearnMoveStruct->scrollArrowTaskId2);
|
||||
sLearnMoveStruct->scrollArrowTaskId2 = 0xFF;
|
||||
}
|
||||
|
||||
if (sLearnMoveStruct->scrollArrowTaskId1 != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(sLearnMoveStruct->scrollArrowTaskId1);
|
||||
sLearnMoveStruct->scrollArrowTaskId1 = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateMenuItemsList(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 nickname[POKEMON_NAME_LENGTH + 1];
|
||||
|
||||
sLearnMoveStruct->numMenuChoices = GetMoveRelearnerMoves(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn);
|
||||
|
||||
for (i = 0; i < sLearnMoveStruct->numMenuChoices; i++)
|
||||
{
|
||||
sLearnMoveStruct->menuItems[i].name = gMoveNames[sLearnMoveStruct->movesToLearn[i]];
|
||||
sLearnMoveStruct->menuItems[i].id = sLearnMoveStruct->movesToLearn[i];
|
||||
}
|
||||
|
||||
GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_NICKNAME, nickname);
|
||||
StringCopy10(gStringVar1, nickname);
|
||||
sLearnMoveStruct->menuItems[sLearnMoveStruct->numMenuChoices].name = gText_Cancel;
|
||||
sLearnMoveStruct->menuItems[sLearnMoveStruct->numMenuChoices].id = LIST_B_PRESSED;
|
||||
sLearnMoveStruct->numMenuChoices++;
|
||||
sLearnMoveStruct->numToShowAtOnce = sub_81D28C8(sLearnMoveStruct->menuItems, sLearnMoveStruct->numMenuChoices);
|
||||
}
|
||||
|
||||
void ShowHideHearts(s32 item)
|
||||
{
|
||||
u16 numHearts;
|
||||
u16 i;
|
||||
|
||||
if (!sLearnMoveStruct2.showContestInfo || item == LIST_B_PRESSED)
|
||||
{
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
numHearts = (u8)(gContestEffects[gContestMoves[item].effect].appeal / 10);
|
||||
|
||||
if (numHearts == 0xFF)
|
||||
{
|
||||
numHearts = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (i < numHearts)
|
||||
{
|
||||
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i]], 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i]], 0);
|
||||
}
|
||||
gSprites[sLearnMoveStruct->spriteIds[i]].invisible = FALSE;
|
||||
}
|
||||
|
||||
numHearts = (u8)(gContestEffects[gContestMoves[item].effect].jam / 10);
|
||||
|
||||
if (numHearts == 0xFF)
|
||||
{
|
||||
numHearts = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (i < numHearts)
|
||||
{
|
||||
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 2);
|
||||
}
|
||||
gSprites[sLearnMoveStruct->spriteIds[i + 8]].invisible = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1362,7 +1362,7 @@ void task_new_game_prof_birch_speech_part2_3(u8 taskId)
|
||||
|
||||
void task_new_game_prof_birch_speech_part2_4(u8 taskId)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
@@ -1802,7 +1802,7 @@ void sub_8031D74(void)
|
||||
|
||||
s8 sub_8031DB4(void)
|
||||
{
|
||||
return ProcessMenuInputNoWrapAround();
|
||||
return Menu_ProcessInputNoWrapAround();
|
||||
}
|
||||
|
||||
void set_default_player_name(u8 nameId)
|
||||
|
||||
@@ -986,7 +986,7 @@ s8 ProcessMenuInput(void)
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 ProcessMenuInputNoWrapAround(void)
|
||||
s8 Menu_ProcessInputNoWrapAround(void)
|
||||
{
|
||||
u8 oldPos = gUnknown_0203CD90.cursorPos;
|
||||
|
||||
@@ -1044,7 +1044,7 @@ s8 ProcessMenuInput_other(void)
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 ProcessMenuInputNoWrapAround_other(void)
|
||||
s8 Menu_ProcessInputNoWrapAround_other(void)
|
||||
{
|
||||
u8 oldPos = gUnknown_0203CD90.cursorPos;
|
||||
|
||||
@@ -1187,9 +1187,9 @@ void sub_8198C34(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum
|
||||
sub_8198AF8(window, fontId, 0, 1, baseTileNum, paletteNum, 0);
|
||||
}
|
||||
|
||||
s8 ProcessMenuInputNoWrap_(void)
|
||||
s8 Menu_ProcessInputNoWrap_(void)
|
||||
{
|
||||
s8 result = ProcessMenuInputNoWrapAround();
|
||||
s8 result = Menu_ProcessInputNoWrapAround();
|
||||
if (result != MENU_NOTHING_CHOSEN)
|
||||
sub_8198C78();
|
||||
return result;
|
||||
|
||||
@@ -169,7 +169,7 @@ void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *templa
|
||||
|
||||
static void Task_CallYesOrNoCallback(u8 taskId)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
|
||||
@@ -272,7 +272,7 @@ static void PlayerPCProcessMenuInput(u8 taskId)
|
||||
if(gPcItemMenuOptionsNum > 3)
|
||||
inputOptionId = ProcessMenuInput();
|
||||
else
|
||||
inputOptionId = ProcessMenuInputNoWrapAround();
|
||||
inputOptionId = Menu_ProcessInputNoWrapAround();
|
||||
|
||||
switch(inputOptionId)
|
||||
{
|
||||
@@ -686,7 +686,7 @@ static void Mailbox_DrawYesNoBeforeMove(u8 taskId)
|
||||
|
||||
static void Mailbox_MoveToBagYesNoPrompt(u8 taskId)
|
||||
{
|
||||
switch(ProcessMenuInputNoWrap_())
|
||||
switch(Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
Mailbox_DoMailMoveToBag(taskId);
|
||||
|
||||
@@ -1042,7 +1042,7 @@ static void Task_HandlePokeblockOptionsInput(u8 taskId)
|
||||
if (sub_81221EC() == TRUE)
|
||||
return;
|
||||
|
||||
itemId = ProcessMenuInputNoWrapAround();
|
||||
itemId = Menu_ProcessInputNoWrapAround();
|
||||
if (itemId == MENU_NOTHING_CHOSEN)
|
||||
{
|
||||
return;
|
||||
|
||||
1256
src/pokemon.c
1256
src/pokemon.c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -997,7 +997,7 @@ void sub_80E9FB0(u8 taskId)
|
||||
{
|
||||
s8 input;
|
||||
|
||||
input = ProcessMenuInputNoWrapAround();
|
||||
input = Menu_ProcessInputNoWrapAround();
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
|
||||
@@ -975,7 +975,7 @@ bool8 sub_8102318(struct Task *task)
|
||||
|
||||
bool8 sub_8102344(struct Task *task)
|
||||
{
|
||||
s8 input = ProcessMenuInputNoWrap_();
|
||||
s8 input = Menu_ProcessInputNoWrap_();
|
||||
if (input == 0)
|
||||
{
|
||||
sub_8197434(0, TRUE);
|
||||
|
||||
@@ -985,7 +985,7 @@ static u8 SaveYesNoCallback(void)
|
||||
|
||||
static u8 SaveConfirmInputCallback(void)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0: // Yes
|
||||
switch (gSaveFileStatus)
|
||||
@@ -1045,7 +1045,7 @@ static u8 SaveConfirmOverwriteCallback(void)
|
||||
|
||||
static u8 SaveOverwriteInputCallback(void)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0: // Yes
|
||||
sSaveDialogCallback = SaveSavingMessageCallback;
|
||||
@@ -1169,7 +1169,7 @@ static u8 BattlePyramidRetireYesNoCallback(void)
|
||||
|
||||
static u8 BattlePyramidRetireInputCallback(void)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0: // Yes
|
||||
return SAVE_CANCELED;
|
||||
|
||||
@@ -258,7 +258,7 @@ static void Task_StarterChoose5(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0: // YES
|
||||
// Return the starter choice and exit.
|
||||
|
||||
75
src/unk_pokedex_area_screen_helper.c
Normal file
75
src/unk_pokedex_area_screen_helper.c
Normal file
@@ -0,0 +1,75 @@
|
||||
#include "global.h"
|
||||
#include "main.h"
|
||||
#include "menu.h"
|
||||
#include "bg.h"
|
||||
#include "malloc.h"
|
||||
#include "palette.h"
|
||||
|
||||
EWRAM_DATA u8 *gUnknown_0203CF28 = NULL;
|
||||
|
||||
static const u16 gUnknown_0861D140[] = INCBIN_U16("graphics/interface/region_map.gbapal");
|
||||
static const u8 gUnknown_0861D1A0[] = INCBIN_U8("graphics/interface/region_map.8bpp.lz");
|
||||
static const u8 gUnknown_0861DEF4[] = INCBIN_U8("graphics/interface/region_map.bin.lz");
|
||||
static const u8 gUnknown_0861E208[] = INCBIN_U8("graphics/interface/region_map_affine.8bpp.lz");
|
||||
static const u8 gUnknown_0861EF64[] = INCBIN_U8("graphics/interface/region_map_affine.bin.lz");
|
||||
|
||||
struct UnkStruct_1C4D70
|
||||
{
|
||||
u32 bg:2;
|
||||
u32 unk2:8;
|
||||
u32 unk10:2;
|
||||
u32 unk12:20;
|
||||
};
|
||||
|
||||
void sub_81C4D70(struct UnkStruct_1C4D70 *template)
|
||||
{
|
||||
u8 unk;
|
||||
gUnknown_0203CF28 = Alloc(4);
|
||||
unk = template->unk10;
|
||||
|
||||
if (unk == 0)
|
||||
{
|
||||
SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 0);
|
||||
decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861D1A0, 0, template->unk2, unk);
|
||||
sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861DEF4, 0, 0, 1), template->unk2, 32, 32, unk);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 2);
|
||||
SetBgAttribute(template->bg, 9, 1);
|
||||
decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861E208, 0, template->unk2, 0);
|
||||
sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861EF64, 0, 0, 1), template->unk2, 64, 64, 1);
|
||||
}
|
||||
|
||||
ChangeBgX(template->bg, 0, 0);
|
||||
ChangeBgY(template->bg, 0, 0);
|
||||
SetBgAttribute(template->bg, BG_CTRL_ATTR_SCREENSIZE, 1);
|
||||
CpuCopy32(gUnknown_0861D140, &gPlttBufferUnfaded[0x70], 0x60);
|
||||
*gUnknown_0203CF28 = template->bg;
|
||||
}
|
||||
|
||||
bool32 sub_81C4E90(void)
|
||||
{
|
||||
if (!free_temp_tile_data_buffers_if_possible())
|
||||
{
|
||||
ShowBg(*gUnknown_0203CF28);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81C4EB4(void)
|
||||
{
|
||||
if (gUnknown_0203CF28 != NULL)
|
||||
{
|
||||
FREE_AND_SET_NULL(gUnknown_0203CF28);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81C4ED0(u32 a0)
|
||||
{
|
||||
ChangeBgY(*gUnknown_0203CF28, a0 * 0x100, 0);
|
||||
}
|
||||
@@ -763,7 +763,7 @@ static void Task_SetClock3(u8 taskId)
|
||||
|
||||
static void Task_SetClock4(u8 taskId)
|
||||
{
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
switch (Menu_ProcessInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
|
||||
Reference in New Issue
Block a user