Merge branch 'master' of https://github.com/pret/pokeemerald into fix-eventobj

This commit is contained in:
GriffinR
2020-02-12 13:05:57 -05:00
71 changed files with 4332 additions and 2506 deletions
+1 -1
View File
@@ -718,7 +718,7 @@ static void CB2_InitBattleInternal(void)
gSaveBlock2Ptr->frontier.disableRecordBattle = FALSE;
for (i = 0; i < PARTY_SIZE; i++)
AdjustFriendship(&gPlayerParty[i], 3);
AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE);
gBattleCommunication[MULTIUSE_STATE] = 0;
}
+2 -2
View File
@@ -3434,7 +3434,7 @@ static void Cmd_getexp(void)
gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId];
gBattlescriptCurrInstr = BattleScript_LevelUp;
gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], 0);
AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL);
// update battle mon structure after level up
if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp)
@@ -6351,7 +6351,7 @@ static void PutLevelAndGenderOnLvlUpBox(void)
txtPtr = gStringVar4;
gStringVar4[0] = CHAR_SPECIAL_F9;
txtPtr++;
txtPtr[0] = 5;
txtPtr[0] = CHAR_LV_2;
txtPtr++;
var = (u32)(txtPtr);
+1 -1
View File
@@ -321,7 +321,7 @@ const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
[REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY),
};
static const u16 sBadgeFlags[8] =
static const u16 sBadgeFlags[NUM_BADGES] =
{
FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET,
FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET,
+3 -3
View File
@@ -92,13 +92,13 @@ void AdjustFriendshipOnBattleFaint(u8 battlerId)
if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level)
{
if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29)
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 8);
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE);
else
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL);
}
else
{
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL);
}
}
+13 -11
View File
@@ -1,11 +1,12 @@
#include "global.h"
#include "graphics.h"
const struct {
// Duplicate of sBerryFixGraphics in berry_fix_program.c
static const struct {
const u32 *gfx;
const u32 *tileMap;
const u32 *tilemap;
const u16 *pltt;
} gUnknown_08617128[] = {
} sBerryFixGraphics[] = {
{
gBerryFixGameboy_Gfx,
gBerryFixGameboy_Tilemap,
@@ -33,15 +34,16 @@ const struct {
}
};
void sub_81BAD84(u32 idx)
// Unused. See berry_fix_program.c
static void LoadBerryFixGraphics(u32 idx)
{
REG_DISPCNT = 0x0000;
REG_BG0HOFS = 0x0000;
REG_BG0VOFS = 0x0000;
REG_BLDCNT = 0x0000;
LZ77UnCompVram(gUnknown_08617128[idx].gfx, (void *)BG_CHAR_ADDR(0));
LZ77UnCompVram(gUnknown_08617128[idx].tileMap, (void *)BG_SCREEN_ADDR(31));
CpuCopy16(gUnknown_08617128[idx].pltt, (void *)PLTT, 0x200);
REG_DISPCNT = 0;
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
REG_BLDCNT = 0;
LZ77UnCompVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0));
LZ77UnCompVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31));
CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)PLTT, 0x200);
REG_BG0CNT = 0x1f00;
REG_DISPCNT = DISPCNT_BG0_ON;
}
+68 -18
View File
@@ -47,20 +47,65 @@ static const u8 sText_TransmittingPleaseWait[] = _("Transmitting. Please wait.\n
static const u8 sText_PleaseFollowInstructionsOnScreen[] = _("Please follow the instructions on your\nPOKéMON Ruby/Sapphire screen.");
static const u8 sText_TransmissionFailureTryAgain[] = _("Transmission failure.\n{COLOR RED}{SHADOW LIGHT_RED}Please try again.");
static const struct BgTemplate gUnknown_08618108[] = {
static const struct BgTemplate sBerryFixBgTemplates[] = {
{
0, 0, 30, 0, 0, 0
}, {
1, 1, 31, 0, 0, 1
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 1,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
}
};
static const struct WindowTemplate gUnknown_08618110[] = {
{0, 2, 4, 26, 2, 15, 0x001},
{0, 1, 11, 28, 8, 15, 0x035},
{0, 0, 8, 30, 2, 15, 0x115},
{0, 8, 0, 14, 2, 15, 0x151},
{-1}
static const struct WindowTemplate sBerryFixWindowTemplates[] = {
{
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 4,
.width = 26,
.height = 2,
.paletteNum = 15,
.baseBlock = 1
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 11,
.width = 28,
.height = 8,
.paletteNum = 15,
.baseBlock = 53
},
{
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 8,
.width = 30,
.height = 2,
.paletteNum = 15,
.baseBlock = 277
},
{
.bg = 0,
.tilemapLeft = 8,
.tilemapTop = 0,
.width = 14,
.height = 2,
.paletteNum = 15,
.baseBlock = 337
},
DUMMY_WIN_TEMPLATE
};
static const u16 sUnknown_08618138[] = {
@@ -82,7 +127,12 @@ static const u8 *const sBerryProgramTexts[] = {
sText_BerryProgramWillBeUpdatedPressA
};
static const void *const gUnknown_08618178[][3] = {
static const struct {
const u32 *gfx;
const u32 *tilemap;
const u16 *pltt;
} sBerryFixGraphics[] = {
{
gBerryFixGameboy_Gfx,
gBerryFixGameboy_Tilemap,
@@ -117,8 +167,8 @@ extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
void CB2_InitBerryFixProgram(void)
{
DisableInterrupts(0xFFFF);
EnableInterrupts(0x0001);
DisableInterrupts(0xFFFF); // all
EnableInterrupts(INTR_FLAG_VBLANK);
m4aSoundVSyncOff();
SetVBlankCallback(NULL);
ResetSpriteData();
@@ -216,12 +266,12 @@ static void berry_fix_gpu_set(void)
DmaFill32(3, 0, PLTT, PLTT_SIZE);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_08618108, ARRAY_COUNT(gUnknown_08618108));
InitBgsFromTemplates(0, sBerryFixBgTemplates, ARRAY_COUNT(sBerryFixBgTemplates));
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
InitWindows(gUnknown_08618110);
InitWindows(sBerryFixWindowTemplates);
DeactivateAllTextPrinters();
DmaCopy32(3, sUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
@@ -293,9 +343,9 @@ static void berry_fix_text_print(int scene)
break;
}
CopyBgTilemapBufferToVram(0);
LZ77UnCompVram(gUnknown_08618178[scene][0], (void *)BG_CHAR_ADDR(1));
LZ77UnCompVram(gUnknown_08618178[scene][1], (void *)BG_SCREEN_ADDR(31));
CpuCopy32(gUnknown_08618178[scene][2], (void *)BG_PLTT, 0x100);
LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1));
LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31));
CpuCopy32(sBerryFixGraphics[scene].pltt, (void *)BG_PLTT, 0x100);
ShowBg(0);
ShowBg(1);
}
+112
View File
@@ -14,6 +14,118 @@
static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0;
// Unused
static const struct BgTemplate sBerryPowderBgTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 2,
.mapBaseIndex = 12,
.screenSize = 1,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 2,
.mapBaseIndex = 14,
.screenSize = 1,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 3,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
};
// ? Part of the BG templates?
static const u32 sUnknown[] = {0xFF, 0x00};
// Unused
static const struct WindowTemplate sBerryPowderWindowTemplates[] =
{
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 28,
.height = 2,
.paletteNum = 13,
.baseBlock = 19
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 5,
.width = 28,
.height = 14,
.paletteNum = 13,
.baseBlock = 75
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 5,
.width = 28,
.height = 7,
.paletteNum = 13,
.baseBlock = 75
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 8,
.width = 19,
.height = 3,
.paletteNum = 13,
.baseBlock = 19
},
{
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 7,
.width = 6,
.height = 4,
.paletteNum = 13,
.baseBlock = 76
},
{
.bg = 0,
.tilemapLeft = 4,
.tilemapTop = 6,
.width = 22,
.height = 5,
.paletteNum = 13,
.baseBlock = 19
},
{
.bg = 0,
.tilemapLeft = 5,
.tilemapTop = 8,
.width = 19,
.height = 3,
.paletteNum = 13,
.baseBlock = 19
},
};
static u32 DecryptBerryPowder(u32 *powder)
{
return *powder ^ gSaveBlock2Ptr->encryptionKey;
+4 -4
View File
@@ -1190,16 +1190,16 @@ void Script_ShowLinkTrainerCard(void)
// color into gStringVar2.
bool32 GetLinkTrainerCardColor(u8 linkPlayerIndex)
{
u32 trainerCardColorIndex;
u32 numStars;
gSpecialVar_0x8006 = linkPlayerIndex;
StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name);
trainerCardColorIndex = GetTrainerCardStars(linkPlayerIndex);
if (trainerCardColorIndex == 0)
numStars = GetTrainerCardStars(linkPlayerIndex);
if (numStars == 0)
return FALSE;
StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]);
StringCopy(gStringVar2, gTrainerCardColorNames[numStars - 1]);
return TRUE;
}
+228 -28
View File
@@ -83,19 +83,6 @@ struct ContestLink80F57C4
EWRAM_DATA struct ContestLink80F57C4 *gUnknown_0203A034 = NULL;
extern const struct BgTemplate gUnknown_0858D888[4];
extern const struct WindowTemplate gUnknown_0858D898[];
extern const struct CompressedSpriteSheet gUnknown_0858D878[];
extern const struct CompressedSpritePalette gUnknown_0858D880[];
extern const struct SpriteSheet gUnknown_0858D8E0;
extern const struct SpriteTemplate gSpriteTemplate_858D8C8;
extern const u8 sContestLinkTextColors[];
extern const u8 gUnknown_0858D6D0[];
extern const struct SpriteTemplate gSpriteTemplate_858D7F8;
extern const struct SpriteSheet gUnknown_0858D810[];
extern const struct SpritePalette gUnknown_0858D850;
extern const struct SpriteTemplate gSpriteTemplate_858D860;
static void sub_80F6A9C(void);
static void sub_80F71C8(void);
u8 sub_80F7310(u8, u8);
@@ -152,6 +139,219 @@ static void sub_80F85BC(u8);
static void sub_80F86B8(u8);
static void sub_80F878C(u8);
static void sub_80F87B4(u8);
static void sub_80F7768(struct Sprite *sprite);
static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
static const struct OamData sOamData_858D7F0 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x32),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x32),
.tileNum = 0,
.priority = 3,
.paletteNum = 2,
.affineParam = 0,
};
static const struct SpriteTemplate sSpriteTemplate_858D7F8 =
{
.tileTag = 3009,
.paletteTag = 3009,
.oam = &sOamData_858D7F0,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
static const struct SpriteSheet sUnknown_0858D810[] =
{
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 },
{ .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 },
};
static const struct SpritePalette sUnknown_0858D850 =
{
.data = sMiscBlank_Pal,
.tag = 3009,
};
static const struct OamData sOamData_858D858 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const struct SpriteTemplate sSpriteTemplate_858D860 =
{
.tileTag = 3017,
.paletteTag = 3017,
.oam = &sOamData_858D858,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80F7768
};
static const struct CompressedSpriteSheet sUnknown_0858D878 =
{
.data = gContestConfetti_Gfx,
.size = 0x220,
.tag = 3017
};
static const struct CompressedSpritePalette sUnknown_0858D880 =
{
.data = gContestConfetti_Pal,
.tag = 3017
};
static const struct BgTemplate sUnknown_0858D888[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0,
},
{
.bg = 1,
.charBaseIndex = 0,
.mapBaseIndex = 24,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0,
},
{
.bg = 2,
.charBaseIndex = 0,
.mapBaseIndex = 28,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0,
},
{
.bg = 3,
.charBaseIndex = 0,
.mapBaseIndex = 26,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0,
}
};
static const struct WindowTemplate sUnknown_0858D898[] =
{
{
.bg = 1,
.tilemapLeft = 7,
.tilemapTop = 4,
.width = 12,
.height = 2,
.paletteNum = 15,
.baseBlock = 770
},
{
.bg = 1,
.tilemapLeft = 7,
.tilemapTop = 7,
.width = 12,
.height = 2,
.paletteNum = 15,
.baseBlock = 794
},
{
.bg = 1,
.tilemapLeft = 7,
.tilemapTop = 10,
.width = 12,
.height = 2,
.paletteNum = 15,
.baseBlock = 818
},
{
.bg = 1,
.tilemapLeft = 7,
.tilemapTop = 13,
.width = 12,
.height = 2,
.paletteNum = 15,
.baseBlock = 842
},
DUMMY_WIN_TEMPLATE,
};
static const struct OamData sUnknown_0858D8C0 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x16),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const struct SpriteTemplate sSpriteTemplate_858D8C8 =
{
.tileTag = 22222,
.paletteTag = 0,
.oam = &sUnknown_0858D8C0,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
static const struct SpriteSheet sUnknown_0858D8E0 =
{
.data = gMiscBlank_Gfx,
.size = 0x200,
.tag = 22222
};
static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
void sub_80F57C4(void)
{
@@ -159,11 +359,11 @@ void sub_80F57C4(void)
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_0858D888, ARRAY_COUNT(gUnknown_0858D888));
InitBgsFromTemplates(0, sUnknown_0858D888, ARRAY_COUNT(sUnknown_0858D888));
for (i = 0; i < 4; i++)
SetBgTilemapBuffer(i, gUnknown_0203A034->unkC[i]);
InitWindows(gUnknown_0858D898);
InitWindows(sUnknown_0858D898);
DeactivateAllTextPrinters();
SetGpuReg(REG_OFFSET_MOSAIC, 0);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
@@ -210,7 +410,7 @@ void sub_80F591C(void)
CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0);
sub_80F71C8();
LoadCompressedPalette(gUnknown_08C1A2B4, 0, 0x200);
LoadPalette(gUnknown_0858D6B0, 0xF0, 0x20);
LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20);
for (i = 0; i < 4; i++)
{
@@ -669,8 +869,8 @@ static void sub_80F6404(u8 taskId)
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].callback = sub_80F75A8;
gUnknown_0203A034->unk0->spriteId = spriteId;
LoadCompressedSpriteSheet(gUnknown_0858D878);
LoadCompressedSpritePalette(gUnknown_0858D880);
LoadCompressedSpriteSheet(&sUnknown_0858D878);
LoadCompressedSpritePalette(&sUnknown_0858D880);
CreateTask(sub_80F7670, 10);
gTasks[taskId].data[0]++;
break;
@@ -900,9 +1100,9 @@ static void sub_80F6AE8(void)
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1;
sheet = LoadSpriteSheet(&gUnknown_0858D8E0);
sheet = LoadSpriteSheet(&sUnknown_0858D8E0);
RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1);
spriteId = CreateSprite(&gSpriteTemplate_858D8C8, 8, 8, 0);
spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
}
}
@@ -937,7 +1137,7 @@ s32 sub_80F6B78(const u8 *text, u8 spriteId)
AddTextPrinterParameterized3(windowId, 1, (strWidth * 8 - origWidth) / 2, 1, sContestLinkTextColors, -1, text);
windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA));
src = (u8 *)(gUnknown_0858D6D0);
src = (u8 *)(sUnknown_0858D6D0);
sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + VRAM + 0x10000);
@@ -1043,7 +1243,7 @@ _080F6BD0:\n\
movs r1, 0x7\n\
bl GetWindowAttribute\n\
mov r9, r0\n\
ldr r2, =gUnknown_0858D6D0\n\
ldr r2, =sUnknown_0858D6D0\n\
mov r8, r2\n\
lsls r1, r7, 4\n\
adds r1, r7\n\
@@ -1257,11 +1457,11 @@ static void sub_80F6DC0(void)
struct SpriteTemplate template;
u8 spriteIds[8];
template = gSpriteTemplate_858D7F8;
for (i = 0; i < 8; i++)
LoadSpriteSheet(&gUnknown_0858D810[i]);
template = sSpriteTemplate_858D7F8;
for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
LoadSpriteSheet(&sUnknown_0858D810[i]);
LoadSpritePalette(&gUnknown_0858D850);
LoadSpritePalette(&sUnknown_0858D850);
for (i = 0; i < 8; i++)
{
spriteIds[i] = CreateSprite(&template, 272, 144, 10);
@@ -1629,7 +1829,7 @@ static void sub_80F7670(u8 taskId)
gTasks[taskId].data[0] = 0;
if (gUnknown_0203A034->unk0->unk7 < 40)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5);
u8 spriteId = CreateSprite(&sSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5);
gSprites[spriteId].data[0] = Random() % 512;
gSprites[spriteId].data[1] = (Random() % 24) + 16;
gSprites[spriteId].data[2] = (Random() % 256) + 48;
@@ -1642,7 +1842,7 @@ static void sub_80F7670(u8 taskId)
DestroyTask(taskId);
}
void sub_80F7768(struct Sprite *sprite)
static void sub_80F7768(struct Sprite *sprite)
{
s16 delta;
+3
View File
@@ -58,3 +58,6 @@ const u8 gSlotMachineReelTimeExplosion1[] = INCBIN_U8("graphics/slot_machine/ree
const u8 gSlotMachineReelTimeShadow[] = INCBIN_U8("graphics/slot_machine/shadow.4bpp");
const u8 gSlotMachineReelTimePikaAura[] = INCBIN_U8("graphics/slot_machine/pika_aura.4bpp");
const u8 gUnknown_08DD19F8[] = INCBIN_U8("graphics/unknown/unknown_DD19F8.bin");
const u8 gUnknown_08DD1A18[] = INCBIN_U8("graphics/unknown/unknown_DD1A18.4bpp");
+1 -1
View File
@@ -27,7 +27,7 @@ static void sub_8098154(u8 taskId)
switch (task->data[0])
{
case 0:
sub_81973A4();
LoadMessageBoxAndBorderGfx();
task->data[0]++;
break;
case 1:
+1 -1
View File
@@ -48,7 +48,7 @@ static void FaintFromFieldPoison(u8 partyIdx)
struct Pokemon *pokemon = gPlayerParty + partyIdx;
u32 status = STATUS1_NONE;
AdjustFriendship(pokemon, 0x07);
AdjustFriendship(pokemon, FRIENDSHIP_EVENT_FAINT_FIELD_PSN);
SetMonData(pokemon, MON_DATA_STATUS, &status);
GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
+12 -18
View File
@@ -1418,27 +1418,21 @@ const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_scre
#include "data/graphics/slot_machine.h"
const u16 gUnknown_08DD19F8[] = INCBIN_U16("graphics/unknown/unknown_DD19F8.bin");
const u8 gUnknown_08DD1A18[] = INCBIN_U8("graphics/unknown/unknown_DD1A18.4bpp");
// trainer card
const u16 gEmeraldTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal");
const u32 gEmeraldTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz");
const u16 gHoennTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal");
const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz");
const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.lz");
const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.lz");
const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.lz");
const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.lz");
const u32 gUnknown_08DD1F78[] = INCBIN_U32("graphics/unknown/unknown_DD1F78.bin.lz");
const u32 gUnknown_08DD2010[] = INCBIN_U32("graphics/unknown/unknown_DD2010.bin.lz");
const u32 gUnknown_08DD21B0[] = INCBIN_U32("graphics/unknown/unknown_DD21B0.bin.lz");
const u32 gUnknown_08DD228C[] = INCBIN_U32("graphics/unknown/unknown_DD228C.bin.lz");
const u16 gFireRedTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star_fr.gbapal");
const u32 gFireRedTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_fr.4bpp.lz");
const u32 gUnknown_08DD2AE0[] = INCBIN_U32("graphics/unknown/unknown_DD2AE0.bin.lz");
const u32 gUnknown_08DD2B78[] = INCBIN_U32("graphics/unknown/unknown_DD2B78.bin.lz");
const u32 gUnknown_08DD2D30[] = INCBIN_U32("graphics/unknown/unknown_DD2D30.bin.lz");
const u32 gUnknown_08DD2E5C[] = INCBIN_U32("graphics/unknown/unknown_DD2E5C.bin.lz");
const u16 gKantoTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star_fr.gbapal");
const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_fr.4bpp.lz");
const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg_fr.bin.lz");
const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_fr.bin.lz");
const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back_fr.bin.lz");
const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link_fr.bin.lz");
// pokemon storage system
+17 -17
View File
@@ -432,8 +432,8 @@ struct ListBuffer2 {
};
struct TempWallyStruct {
struct ItemSlot bagPocket_Items[30];
struct ItemSlot bagPocket_PokeBalls[16];
struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
u16 cursorPosition[POCKETS_COUNT];
u16 scrollPosition[POCKETS_COUNT];
u8 filler[0x2];
@@ -445,7 +445,7 @@ EWRAM_DATA struct BagStruct gBagPositionStruct = {0};
static EWRAM_DATA struct ListBuffer1 *sListBuffer1 = 0;
static EWRAM_DATA struct ListBuffer2 *sListBuffer2 = 0;
EWRAM_DATA u16 gSpecialVar_ItemId = 0;
static EWRAM_DATA struct TempWallyStruct *gUnknown_0203CE80 = 0;
static EWRAM_DATA struct TempWallyStruct *sTempWallyBag = 0;
extern u8 *const gPocketNamesStringsTable[];
extern u8* gReturnToXStringsTable[];
@@ -2130,17 +2130,17 @@ void PrepareBagForWallyTutorial(void)
{
u32 i;
gUnknown_0203CE80 = AllocZeroed(sizeof(struct TempWallyStruct));
memcpy(gUnknown_0203CE80->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items));
memcpy(gUnknown_0203CE80->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls));
gUnknown_0203CE80->pocket = gBagPositionStruct.pocket;
sTempWallyBag = AllocZeroed(sizeof(struct TempWallyStruct));
memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items));
memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls));
sTempWallyBag->pocket = gBagPositionStruct.pocket;
for (i = 0; i <= 4; i++)
{
gUnknown_0203CE80->cursorPosition[i] = gBagPositionStruct.cursorPosition[i];
gUnknown_0203CE80->scrollPosition[i] = gBagPositionStruct.scrollPosition[i];
sTempWallyBag->cursorPosition[i] = gBagPositionStruct.cursorPosition[i];
sTempWallyBag->scrollPosition[i] = gBagPositionStruct.scrollPosition[i];
}
ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, 30);
ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, 16);
ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT);
ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT);
ResetBagScrollPositions();
}
@@ -2148,15 +2148,15 @@ void RestoreBagAfterWallyTutorial(void)
{
u32 i;
memcpy(gSaveBlock1Ptr->bagPocket_Items, gUnknown_0203CE80->bagPocket_Items, sizeof(gUnknown_0203CE80->bagPocket_Items));
memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, gUnknown_0203CE80->bagPocket_PokeBalls, sizeof(gUnknown_0203CE80->bagPocket_PokeBalls));
gBagPositionStruct.pocket = gUnknown_0203CE80->pocket;
memcpy(gSaveBlock1Ptr->bagPocket_Items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items));
memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls));
gBagPositionStruct.pocket = sTempWallyBag->pocket;
for (i = 0; i <= 4; i++)
{
gBagPositionStruct.cursorPosition[i] = gUnknown_0203CE80->cursorPosition[i];
gBagPositionStruct.scrollPosition[i] = gUnknown_0203CE80->scrollPosition[i];
gBagPositionStruct.cursorPosition[i] = sTempWallyBag->cursorPosition[i];
gBagPositionStruct.scrollPosition[i] = sTempWallyBag->scrollPosition[i];
}
Free(gUnknown_0203CE80);
Free(sTempWallyBag);
}
void DoWallyTutorialBagMenu(void)
+1 -1
View File
@@ -2188,7 +2188,7 @@ static void MainMenu_FormatSavegameBadges(void)
u8 badgeCount = 0;
u32 i;
for (i = FLAG_BADGE01_GET; i <= FLAG_BADGE08_GET; i++)
for (i = FLAG_BADGE01_GET; i < FLAG_BADGE01_GET + NUM_BADGES; i++)
{
if (FlagGet(i))
badgeCount++;
+3 -3
View File
@@ -1287,7 +1287,7 @@ static bool32 sub_81963F0(u8 taskId)
ChangeBgY(0, 0, 0);
if (!gMatchCallState.triggeredFromScript)
{
sub_81973A4();
LoadMessageBoxAndBorderGfx();
playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);
ScriptMovement_UnfreezeObjectEvents();
@@ -1746,7 +1746,7 @@ static void PopulateBattleFrontierStreak(int matchCallId, u8 *destStr)
ConvertIntToDecimalStringN(destStr, gBattleFrontierStreakInfo.streak, STR_CONV_MODE_LEFT_ALIGN, i);
}
static const u16 sBadgeFlags[] =
static const u16 sBadgeFlags[NUM_BADGES] =
{
FLAG_BADGE01_GET,
FLAG_BADGE02_GET,
@@ -1762,7 +1762,7 @@ static int GetNumOwnedBadges(void)
{
u32 i;
for (i = 0; i < 8; i++)
for (i = 0; i < NUM_BADGES; i++)
{
if (!FlagGet(sBadgeFlags[i]))
break;
+11 -11
View File
@@ -159,7 +159,7 @@ void sub_8197200(void)
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
DeactivateAllTextPrinters();
sub_81973A4();
LoadMessageBoxAndBorderGfx();
}
u16 RunTextPrintersAndIsPrinter0Active(void)
@@ -209,7 +209,7 @@ void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonP
AddTextPrinterParameterized2(0, 1, gStringVar4, speed, NULL, 2, 1, 3);
}
void sub_81973A4(void)
void LoadMessageBoxAndBorderGfx(void)
{
LoadMessageBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10);
@@ -458,7 +458,7 @@ u16 sub_81978D0(u8 colorNum)
void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback)
{
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, 1, GetPlayerTextSpeedDelay(), string, callback);
CopyWindowToVram(0, 3);
}
@@ -2133,7 +2133,7 @@ void blit_move_info_icon(u8 windowId, u8 iconId, u16 x, u16 y)
BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height);
}
void sub_819A344(u8 a0, u8 *dest, u8 color)
void BufferSaveMenuText(u8 textId, u8 *dest, u8 color)
{
s32 curFlag;
s32 flagCount;
@@ -2147,28 +2147,28 @@ void sub_819A344(u8 a0, u8 *dest, u8 color)
*(string++) = EXT_CTRL_CODE_SHADOW;
*(string++) = color + 1;
switch (a0)
switch (textId)
{
case 0:
case SAVE_MENU_NAME:
StringCopy(string, gSaveBlock2Ptr->playerName);
break;
case 1:
case SAVE_MENU_CAUGHT:
if (IsNationalPokedexEnabled())
string = ConvertIntToDecimalStringN(string, GetNationalPokedexCount(FLAG_GET_CAUGHT), STR_CONV_MODE_LEFT_ALIGN, 3);
else
string = ConvertIntToDecimalStringN(string, GetHoennPokedexCount(FLAG_GET_CAUGHT), STR_CONV_MODE_LEFT_ALIGN, 3);
*string = EOS;
break;
case 2:
case SAVE_MENU_PLAY_TIME:
string = ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
*(string++) = CHAR_COLON;
ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
break;
case 3:
case SAVE_MENU_LOCATION:
GetMapNameGeneric(string, gMapHeader.regionMapSectionId);
break;
case 4:
for (curFlag = FLAG_BADGE01_GET, flagCount = 0, endOfString = string + 1; curFlag <= FLAG_BADGE08_GET; curFlag++)
case SAVE_MENU_BADGES:
for (curFlag = FLAG_BADGE01_GET, flagCount = 0, endOfString = string + 1; curFlag < FLAG_BADGE01_GET + NUM_BADGES; curFlag++)
{
if (FlagGet(curFlag))
flagCount++;
+1 -1
View File
@@ -955,7 +955,7 @@ static u8 *sub_81D2CD0(u8 *dst, u16 boxId, u16 monId)
*(str++) = 9;
*(str++) = CHAR_SLASH;
*(str++) = CHAR_SPECIAL_F9;
*(str++) = 5;
*(str++) = CHAR_LV_2;
str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, 3);
*(str++) = CHAR_SPACE;
*str = EOS;
+1 -1
View File
@@ -4701,7 +4701,7 @@ static void Task_LearnedMove(u8 taskId)
if (move[1] == 0)
{
AdjustFriendship(mon, 4);
AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM);
if (item < ITEM_HM01_CUT)
RemoveBagItem(item, 1);
}
+3 -3
View File
@@ -505,7 +505,7 @@ void sub_816B31C(void)
void Mailbox_DoRedrawMailboxMenuAfterReturn(void)
{
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 1);
InitItemStorageMenu(CreateTask(ItemStorage_HandleReturnToProcessInput, 0), 1);
FadeInFromBlack();
@@ -739,7 +739,7 @@ static void pal_fill_for_maplights_or_black(void)
{
u8 taskId;
sub_81973A4();
LoadMessageBoxAndBorderGfx();
taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0);
if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE)
Mailbox_DrawMailboxMenu(taskId);
@@ -847,7 +847,7 @@ static void Mailbox_UpdateMailListAfterDeposit(void)
&& playerPCItemPageInfo.itemsAbove != 0)
playerPCItemPageInfo.itemsAbove--;
ItemStorage_SetItemAndMailCount(taskId);
sub_81973A4();
LoadMessageBoxAndBorderGfx();
if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE)
Mailbox_DrawMailboxMenu(taskId);
else
+69 -36
View File
@@ -61,6 +61,7 @@ static void DecryptBoxMon(struct BoxPokemon *boxMon);
static void sub_806E6CC(u8 taskId);
static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId);
static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
static bool8 ShouldSkipFriendshipChange(void);
// EWRAM vars
EWRAM_DATA static u8 sLearningMoveTableID = 0;
@@ -73,7 +74,21 @@ EWRAM_DATA struct Unknown_806F160_Struct *gUnknown_020249B4[2] = {NULL};
// const rom data
#include "data/battle_moves.h"
static const u8 sUnreferencedData[] = {0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00};
// Used in an unreferenced function in RS.
// Unreferenced here and in FRLG.
struct CombinedMove
{
u16 move1;
u16 move2;
u16 newMove;
};
static const struct CombinedMove sCombinedMoves[2] =
{
{MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE},
{0xFFFF, 0xFFFF, 0xFFFF}
};
#define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name
#define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name
@@ -1872,22 +1887,34 @@ const u8 gStatStageRatios[][2] =
static const u16 sDeoxysBaseStats[] =
{
50, // Hp
95, // Attack
90, // Defense
180, // Speed
95, // Sp.Attack
90, // Sp.Defense
[STAT_HP] = 50,
[STAT_ATK] = 95,
[STAT_DEF] = 90,
[STAT_SPEED] = 180,
[STAT_SPATK] = 95,
[STAT_SPDEF] = 90,
};
const u16 gLinkPlayerFacilityClasses[] =
const u16 gLinkPlayerFacilityClasses[NUM_MALE_LINK_FACILITY_CLASSES + NUM_FEMALE_LINK_FACILITY_CLASSES] =
{
FACILITY_CLASS_COOLTRAINER_M, FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER,
FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER,
FACILITY_CLASS_PKMN_BREEDER_M, FACILITY_CLASS_GUITARIST,
FACILITY_CLASS_COOLTRAINER_F, FACILITY_CLASS_HEX_MANIAC, FACILITY_CLASS_PICNICKER,
FACILITY_CLASS_LASS, FACILITY_CLASS_PSYCHIC_F, FACILITY_CLASS_BATTLE_GIRL,
FACILITY_CLASS_PKMN_BREEDER_F, FACILITY_CLASS_BEAUTY
// Male classes
FACILITY_CLASS_COOLTRAINER_M,
FACILITY_CLASS_BLACK_BELT,
FACILITY_CLASS_CAMPER,
FACILITY_CLASS_YOUNGSTER,
FACILITY_CLASS_PSYCHIC_M,
FACILITY_CLASS_BUG_CATCHER,
FACILITY_CLASS_PKMN_BREEDER_M,
FACILITY_CLASS_GUITARIST,
// Female Classes
FACILITY_CLASS_COOLTRAINER_F,
FACILITY_CLASS_HEX_MANIAC,
FACILITY_CLASS_PICNICKER,
FACILITY_CLASS_LASS,
FACILITY_CLASS_PSYCHIC_F,
FACILITY_CLASS_BATTLE_GIRL,
FACILITY_CLASS_PKMN_BREEDER_F,
FACILITY_CLASS_BEAUTY
};
static const u8 sHoldEffectToType[][2] =
@@ -2049,17 +2076,19 @@ static const u8 sStatsToRaise[] =
STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC
};
static const s8 gUnknown_08329ECE[][3] =
// 3 modifiers each for how much to change friendship for different ranges
// 0-99, 100-199, 200+
static const s8 sFriendshipEventModifiers[][3] =
{
{ 5, 3, 2},
{ 5, 3, 2},
{ 1, 1, 0},
{ 3, 2, 1},
{ 1, 1, 0},
{ 1, 1, 1},
{-1, -1, -1},
{-5, -5, -10},
{-5, -5, -10},
[FRIENDSHIP_EVENT_GROW_LEVEL] = { 5, 3, 2},
[FRIENDSHIP_EVENT_VITAMIN] = { 5, 3, 2},
[FRIENDSHIP_EVENT_BATTLE_ITEM] = { 1, 1, 0},
[FRIENDSHIP_EVENT_LEAGUE_BATTLE] = { 3, 2, 1},
[FRIENDSHIP_EVENT_LEARN_TMHM] = { 1, 1, 0},
[FRIENDSHIP_EVENT_WALKING] = { 1, 1, 1},
[FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1},
[FRIENDSHIP_EVENT_FAINT_FIELD_PSN] = {-5, -5, -10},
[FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10},
};
static const u16 sHMMoves[] =
@@ -5069,7 +5098,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
}
break;
case 5:
if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0)
{
var_34 = itemEffect[var_3C];
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
@@ -5095,7 +5124,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
break;
case 6:
if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200
&& (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
&& (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0)
{
var_34 = itemEffect[var_3C];
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
@@ -5120,7 +5149,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
var_3C++;
break;
case 7:
if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0)
{
var_34 = itemEffect[var_3C];
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
@@ -5738,12 +5767,18 @@ u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
return n;
}
#define IS_LEAGUE_BATTLE \
((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR \
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER \
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) \
void AdjustFriendship(struct Pokemon *mon, u8 event)
{
u16 species, heldItem;
u8 holdEffect;
if (sub_806F104())
if (ShouldSkipFriendshipChange())
return;
species = GetMonData(mon, MON_DATA_SPECIES2, 0);
@@ -5765,18 +5800,16 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
{
u8 friendshipLevel = 0;
s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
if (friendship > 99)
friendshipLevel++;
if (friendship > 199)
friendshipLevel++;
if ((event != 5 || !(Random() & 1))
&& (event != 3
|| ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION))))
if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1))
&& (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE))
{
s8 mod = gUnknown_08329ECE[event][friendshipLevel];
s8 mod = sFriendshipEventModifiers[event][friendshipLevel];
if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
mod = (150 * mod) / 100;
friendship += mod;
@@ -6768,7 +6801,7 @@ bool8 HasTwoFramesAnimation(u16 species)
&& species != SPECIES_UNOWN);
}
bool8 sub_806F104(void)
static bool8 ShouldSkipFriendshipChange(void)
{
if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER))
return TRUE;
+2 -2
View File
@@ -1735,7 +1735,7 @@ static void Task_PokemonStorageSystemPC(u8 taskId)
{
case 0:
CreatePCMenu(task->data[1], &task->data[15]);
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 0);
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, TEXT_SPEED_FF, NULL, 2, 1, 3);
@@ -6898,7 +6898,7 @@ static void SetCursorMonData(void *pokemon, u8 mode)
*(txtPtr++) = 3;
*(txtPtr++) = 0;
*(txtPtr++) = CHAR_SPECIAL_F9;
*(txtPtr++) = 5;
*(txtPtr++) = CHAR_LV_2;
txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
txtPtr[0] = CHAR_SPACE;
+15 -15
View File
@@ -21,7 +21,7 @@ struct PokenavResources
u32 (*currentMenuCb1)(void);
u32 currentMenuIndex;
u16 mode;
u16 fieldA;
u16 conditionSearchId;
bool32 hasAnyRibbons;
void *field10[SUBSTRUCT_COUNT];
};
@@ -57,7 +57,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C,
.unk8 = sub_81C9924,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -66,7 +66,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -75,7 +75,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_2,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -84,7 +84,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_3,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -93,7 +93,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_4,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -102,7 +102,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_5,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
.unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
@@ -156,7 +156,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_11,
.unk4 = sub_81CAB24,
.unk8 = sub_81CB260,
.unkC = sub_81CB29C,
.unkC = CreateMatchCallLoopedTask,
.unk10 = sub_81CB2CC,
.unk14 = sub_81CAB38,
.unk18 = sub_81CB2E0,
@@ -554,18 +554,18 @@ void SetPokenavMode(u16 mode)
gPokenavResources->mode = mode;
}
void sub_81C7694(u32 a0)
void SetSelectedConditionSearch(u32 cursorPos)
{
u32 value = a0;
u32 searchId = cursorPos;
if (value > 4)
value = 0;
gPokenavResources->fieldA = value;
if (searchId > POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH - POKENAV_MENUITEM_CONDITION_SEARCH_COOL)
searchId = 0;
gPokenavResources->conditionSearchId = searchId;
}
u32 sub_81C76AC(void)
u32 GetSelectedConditionSearch(void)
{
return gPokenavResources->fieldA;
return gPokenavResources->conditionSearchId;
}
bool32 CanViewRibbonsMenu(void)
@@ -147,9 +147,9 @@ u32 sub_81CD110(struct PokenavSub11 *structPtr)
u32 sub_81CD19C(struct PokenavSub11 *structPtr)
{
if (structPtr->unk6300 == 0)
return 100002;
return POKENAV_MENU_2;
else
return 100010;
return POKENAV_MENU_A;
}
void sub_81CD1C0(void)
@@ -402,7 +402,7 @@ u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3)
*(str_++) = 9;
*(str_++) = CHAR_SLASH;
*(str_++) = CHAR_SPECIAL_F9;
*(str_++) = 5;
*(str_++) = CHAR_LV_2;
txtPtr = str_;
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
lvlDigits = str_ - txtPtr;
@@ -113,9 +113,9 @@ static const struct WindowTemplate gUnknown_086235B4 =
.baseBlock = 20
};
static const u8 gUnknown_086235BC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086235C8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086235D4[] = _("{UNK_SPACER}");
static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_8(void)
{
@@ -130,7 +130,7 @@ bool32 PokenavCallback_Init_8(void)
structPtr->unk0 = sub_81CF010;
structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1);
structPtr->unk18 = 0;
structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()];
structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()];
return TRUE;
}
@@ -143,7 +143,7 @@ bool32 PokenavCallback_Init_10(void)
structPtr->unkPtr = GetSubstructPtr(18);
structPtr->unk0 = sub_81CF030;
structPtr->unk18 = 1;
structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()];
structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()];
return TRUE;
}
@@ -443,7 +443,7 @@ static u32 sub_81CF418(s32 state)
HideBg(3);
if (!unk->unkC)
{
u8 r4 = sub_81C76AC() + 8;
u8 r4 = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
LoadLeftHeaderGfxForIndex(r4);
sub_81C7FA0(r4, 1, 0);
sub_81C7FA0(1, 1, 0);
@@ -673,13 +673,16 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest)
u8 level;
u8 * s;
const u8 * genderStr;
if (item->boxId == 14)
// Mon is in party
if (item->boxId == TOTAL_BOXES_COUNT)
{
struct Pokemon * mon = &gPlayerParty[item->monId];
gender = GetMonGender(mon);
level = GetLevelFromMonExp(mon);
GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
}
// Mon is in PC
else
{
struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
@@ -687,24 +690,25 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest)
level = GetLevelFromBoxMonExp(mon);
GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
}
StringGetEnd10(gStringVar3);
dest = sub_81DB494(dest, 1, gStringVar3, 60);
switch (gender)
{
default:
genderStr = gUnknown_086235D4;
genderStr = sText_NoGenderSymbol;
break;
case MON_MALE:
genderStr = gUnknown_086235BC;
genderStr = sText_MaleSymbol;
break;
case MON_FEMALE:
genderStr = gUnknown_086235C8;
genderStr = sText_FemaleSymbol;
break;
}
s = StringCopy(gStringVar1, genderStr);
*s++ = CHAR_SLASH;
*s++ = CHAR_SPECIAL_F9;
*s++ = 5; // LV
*s++ = CHAR_LV_2;
ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
sub_81DB494(dest, 1, gStringVar1, 40);
}
@@ -286,7 +286,7 @@ bool32 sub_81CB260(void)
return TRUE;
}
void sub_81CB29C(s32 index)
void CreateMatchCallLoopedTask(s32 index)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1);
+513
View File
@@ -0,0 +1,513 @@
#include "global.h"
#include "pokenav.h"
#include "event_data.h"
#include "main.h"
#include "sound.h"
#include "constants/songs.h"
struct Pokenav1Struct
{
u16 menuType;
s16 cursorPos;
u16 currMenuItem;
u16 helpBarIndex;
u32 unk8;
u32 (*callback)(struct Pokenav1Struct*);
};
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state);
static void ReturnToConditionMenu(struct Pokenav1Struct *state);
static void ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 sub_81C97BC(struct Pokenav1Struct *state);
static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1);
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state);
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state);
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state);
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state);
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state);
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state);
static u32 HandleMainMenuInput(struct Pokenav1Struct *state);
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*);
static void SetMenuInputHandler(struct Pokenav1Struct *state);
// Number of entries - 1 for that menu type
static const u8 sLastCursorPositions[] =
{
[POKENAV_MENU_TYPE_DEFAULT] = 2,
[POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
[POKENAV_MENU_TYPE_CONDITION] = 2,
[POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
};
static const u8 sMenuItems[][6] =
{
[POKENAV_MENU_TYPE_DEFAULT] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
[2 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
POKENAV_MENUITEM_RIBBONS,
[4 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION] =
{
POKENAV_MENUITEM_CONDITION_PARTY,
POKENAV_MENUITEM_CONDITION_SEARCH,
POKENAV_MENUITEM_CONDITION_CANCEL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
},
};
static u8 GetPokenavMainMenuType(void)
{
u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
{
menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
if (FlagGet(FLAG_SYS_RIBBON_GET))
menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
}
return menuType;
}
bool32 PokenavCallback_Init_0(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 0;
state->currMenuItem = POKENAV_MENUITEM_MAP;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_4(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 2;
state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_5(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 3;
state->currMenuItem = POKENAV_MENUITEM_RIBBONS;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_2(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 0;
state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
bool32 PokenavCallback_Init_3(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
state->cursorPos = GetSelectedConditionSearch();
state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
state->helpBarIndex = HELPBAR_NONE;
SetMenuInputHandler(state);
return TRUE;
}
static void SetMenuInputHandler(struct Pokenav1Struct *state)
{
switch (state->menuType)
{
case POKENAV_MENU_TYPE_DEFAULT:
SetPokenavMode(POKENAV_MODE_NORMAL);
// fallthrough
case POKENAV_MENU_TYPE_UNLOCK_MC:
case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
state->callback = GetMainMenuInputHandler();
break;
case POKENAV_MENU_TYPE_CONDITION:
state->callback = HandleConditionMenuInput;
break;
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
state->callback = HandleConditionSearchMenuInput;
break;
}
}
static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*)
{
switch (GetPokenavMode())
{
default:
case POKENAV_MODE_NORMAL:
return HandleMainMenuInput;
case POKENAV_MODE_FORCE_CALL_READY:
return HandleMainMenuInputTutorial;
case POKENAV_MODE_FORCE_CALL_EXIT:
return HandleMainMenuInputEndTutorial;
}
}
u32 sub_81C941C(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->callback(state);
}
void sub_81C9430(void)
{
FreePokenavSubstruct(1);
}
static u32 HandleMainMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON)
{
switch (sMenuItems[state->menuType][state->cursorPos])
{
case POKENAV_MENUITEM_MAP:
state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
sub_81C97B0(state, POKENAV_MENU_6);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION:
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 0;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
state->callback = HandleConditionMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION;
case POKENAV_MENUITEM_MATCH_CALL:
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(state, POKENAV_MENU_B);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_RIBBONS:
if (CanViewRibbonsMenu())
{
state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
sub_81C97B0(state, POKENAV_MENU_C);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
state->callback = HandleCantOpenRibbonsInput;
return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
}
case POKENAV_MENUITEM_SWITCH_OFF:
return -1;
}
}
if (gMain.newKeys & B_BUTTON)
return -1;
return POKENAV_MENU_FUNC_NONE;
}
// Force the player to select Match Call during the call Mr. Stone pokenav tutorial
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON)
{
if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
{
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(state, POKENAV_MENU_B);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_HAZURE);
return POKENAV_MENU_FUNC_NONE;
}
}
if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_HAZURE);
return POKENAV_MENU_FUNC_NONE;
}
return POKENAV_MENU_FUNC_NONE;
}
// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON)
{
u32 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
{
PlaySE(SE_HAZURE);
return POKENAV_MENU_FUNC_NONE;
}
else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
{
state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(state, POKENAV_MENU_B);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
return -1;
}
}
else if (gMain.newKeys & B_BUTTON)
{
return -1;
}
return POKENAV_MENU_FUNC_NONE;
}
// Handles input after selecting Ribbons when there are no ribbon winners left
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
{
state->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
state->callback = GetMainMenuInputHandler();
return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON)
{
switch (sMenuItems[state->menuType][state->cursorPos])
{
case POKENAV_MENUITEM_CONDITION_SEARCH:
state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
state->cursorPos = 0;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
state->callback = HandleConditionSearchMenuInput;
return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
case POKENAV_MENUITEM_CONDITION_PARTY:
state->helpBarIndex = 0;
sub_81C97B0(state, POKENAV_MENU_7);
return POKENAV_MENU_FUNC_OPEN_FEATURE;
case POKENAV_MENUITEM_CONDITION_CANCEL:
PlaySE(SE_SELECT);
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
if (gMain.newKeys & B_BUTTON)
{
if (state->cursorPos != sLastCursorPositions[state->menuType])
{
state->cursorPos = sLastCursorPositions[state->menuType];
state->callback = CB2_ReturnToMainMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state)
{
if (UpdateMenuCursorPos(state))
return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON)
{
u8 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
{
SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
sub_81C97B0(state, POKENAV_MENU_8);
state->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
return POKENAV_MENU_FUNC_OPEN_FEATURE;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
if (gMain.newKeys & B_BUTTON)
{
if (state->cursorPos != sLastCursorPositions[state->menuType])
{
state->cursorPos = sLastCursorPositions[state->menuType];
state->callback = CB2_ReturnToConditionMenu;
return POKENAV_MENU_FUNC_MOVE_CURSOR;
}
else
{
PlaySE(SE_SELECT);
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
}
return POKENAV_MENU_FUNC_NONE;
}
static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state)
{
ReturnToMainMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
}
static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state)
{
ReturnToConditionMenu(state);
return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
}
static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1)
{
state->unk8 = a1;
state->callback = sub_81C97BC;
}
static u32 sub_81C97BC(struct Pokenav1Struct *state)
{
return state->unk8;
}
static void ReturnToMainMenu(struct Pokenav1Struct *state)
{
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 1;
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
state->callback = HandleMainMenuInput;
}
static void ReturnToConditionMenu(struct Pokenav1Struct *state)
{
state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 1;
state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
state->callback = HandleConditionMenuInput;
}
static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state)
{
if (gMain.newKeys & DPAD_UP)
{
if (--state->cursorPos < 0)
state->cursorPos = sLastCursorPositions[state->menuType];
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE;
}
else if (gMain.newKeys & DPAD_DOWN)
{
state->cursorPos++;
if (state->cursorPos > sLastCursorPositions[state->menuType])
state->cursorPos = 0;
state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE;
}
else
{
return FALSE;
}
}
int GetPokenavMenuType(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->menuType;
}
// Position of cursor relative to number of current menu options
int GetPokenavCursorPos(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->cursorPos;
}
// ID of menu item the cursor is currently on
int GetCurrentMenuItemId(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->currMenuItem;
}
u16 GetHelpBarTextId(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->helpBarIndex;
}
@@ -23,31 +23,31 @@ struct Pokenav2Struct
{
bool32 (*callback)(void);
u32 loopedTaskId;
u16 optionDescriptionWindowId;
u16 optionDescWindowId;
u8 bg3ScrollTaskId;
u8 cursorPos;
bool8 otherIconsInMotion;
u8 field_00d;
bool32 iconVisible[6];
bool32 iconVisible[MAX_POKENAV_MENUITEMS];
struct Sprite * field_028;
struct Sprite * iconSprites[6][4];
struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][4];
u16 bg1TilemapBuffer[0x400];
};
static struct Pokenav2Struct * sub_81C9958(void);
static bool32 sub_81C99FC(void);
static u32 sub_81C9A10(s32 state);
static u32 sub_81C9C6C(s32 state);
static u32 sub_81C9CA8(s32 state);
static u32 sub_81C9D44(s32 state);
static u32 sub_81C9DD8(s32 state);
static u32 sub_81C9E58(s32 state);
static u32 sub_81C9EC8(s32 state);
static u32 sub_81C9EF8(s32 state);
static u32 sub_81C9F28(s32 state);
static u32 LoopedTask_MoveMenuCursor(s32 state);
static u32 LoopedTask_OpenConditionMenu(s32 state);
static u32 LoopedTask_ReturnToMainMenu(s32 state);
static u32 LoopedTask_OpenConditionSearchMenu(s32 state);
static u32 LoopedTask_ReturnToConditionMenu(s32 state);
static u32 LoopedTask_SelectRibbonsNoWinners(s32 state);
static u32 LoopedTask_ReShowDescription(s32 state);
static u32 LoopedTask_OpenPokenavFeature(s32 state);
static void sub_81C9FC4(void);
static void sub_81C9FEC(void);
static void sub_81CA02C(void);
static void CreateMenuOptionSprites(void);
static void sub_81CA094(void);
static void sub_81CA0C8(void);
static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2);
@@ -56,7 +56,7 @@ static void sub_81CA278(void);
static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3);
static void sub_81CA3B4(struct Sprite ** sprites);
static void sub_81CA2DC(void);
static bool32 sub_81CA324(void);
static bool32 AreMenuOptionSpritesMoving(void);
static void sub_81CA448(struct Sprite ** sprites, bool32 a1);
static void sub_81CA474(struct Sprite * sprite);
static void sub_81CA4AC(struct Sprite * sprite);
@@ -64,9 +64,9 @@ static void sub_81CA580(u8 taskId);
static void sub_81CA640(void);
static void sub_81CA6AC(struct Sprite * sprite);
static void sub_81CA698(void);
static void sub_81CA6E0(void);
static void sub_81CA714(void);
static void sub_81CA770(void);
static void AddOptionDescriptionWindow(void);
static void PrintCurrentOptionDescription(void);
static void PrintNoRibbonWinners(void);
static bool32 sub_81CA7C4(void);
static void sub_81CA7D4(void);
static void sub_81CA7F4(void);
@@ -120,16 +120,16 @@ static const struct BgTemplate gUnknown_08620194[] = {
}
};
static const LoopedTask gUnknown_086201A0[] = {
NULL,
sub_81C9C6C,
sub_81C9CA8,
sub_81C9D44,
sub_81C9DD8,
sub_81C9E58,
sub_81C9EC8,
sub_81C9EF8,
sub_81C9F28
static const LoopedTask sMenuHandlerLoopTaskFuncs[] = {
[POKENAV_MENU_FUNC_NONE] = NULL,
[POKENAV_MENU_FUNC_MOVE_CURSOR] = LoopedTask_MoveMenuCursor,
[POKENAV_MENU_FUNC_OPEN_CONDITION] = LoopedTask_OpenConditionMenu,
[POKENAV_MENU_FUNC_RETURN_TO_MAIN] = LoopedTask_ReturnToMainMenu,
[POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH] = LoopedTask_OpenConditionSearchMenu,
[POKENAV_MENU_FUNC_RETURN_TO_CONDITION] = LoopedTask_ReturnToConditionMenu,
[POKENAV_MENU_FUNC_NO_RIBBON_WINNERS] = LoopedTask_SelectRibbonsNoWinners,
[POKENAV_MENU_FUNC_RESHOW_DESCRIPTION] = LoopedTask_ReShowDescription,
[POKENAV_MENU_FUNC_OPEN_FEATURE] = LoopedTask_OpenPokenavFeature
};
static const struct CompressedSpriteSheet gUnknown_086201C4[] =
@@ -175,39 +175,45 @@ struct UnkStruct_08620240
{
u16 unk0;
u16 unk2;
const u16 *unk4[6];
const u16 *unk4[MAX_POKENAV_MENUITEMS];
};
static const struct UnkStruct_08620240 gUnknown_08620240[5] =
// TODO
static const struct UnkStruct_08620240 gUnknown_08620240[POKENAV_MENU_TYPE_COUNT] =
{
[POKENAV_MENU_TYPE_DEFAULT] =
{
0x2A,
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C}
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C}
},
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{
0x2A,
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C}
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C}
},
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{
0x2A,
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C}
0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C}
},
[POKENAV_MENU_TYPE_CONDITION] =
{
0x38,
0x14,
{gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C}
0x14,
{gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C}
},
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{
0x28,
0x10,
{gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C}
0x10,
{gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C}
},
};
static const struct WindowTemplate gUnknown_086202CC =
static const struct WindowTemplate sOptionDescWindowTemplate =
{
.bg = 1,
.tilemapLeft = 3,
@@ -218,28 +224,28 @@ static const struct WindowTemplate gUnknown_086202CC =
.baseBlock = 8
};
static const u8 *const gUnknown_086202D4[] =
static const u8 *const sPageDescriptions[] =
{
gText_CheckMapOfHoenn,
gText_CheckPokemonInDetail,
gText_CallRegisteredTrainer,
gText_CheckObtainedRibbons,
gText_PutAwayPokenav,
gText_CheckPartyPokemonInDetail,
gText_CheckAllPokemonInDetail,
gText_ReturnToPokenavMenu,
gText_FindCoolPokemon,
gText_FindBeautifulPokemon,
gText_FindCutePokemon,
gText_FindSmartPokemon,
gText_FindToughPokemon,
gText_ReturnToConditionMenu
[POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn,
[POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail,
[POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer,
[POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons,
[POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav,
[POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail,
[POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail,
[POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu,
[POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon,
[POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon,
[POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon,
[POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon,
[POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon,
[POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = gText_ReturnToConditionMenu
};
static const u8 sOptionDescTextColors[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN};
static const u8 sOptionDescTextColors[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN};
static const u8 sOptionDescTextColors2[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN};
static const struct OamData gUnknown_08620314 =
static const struct OamData sOamData_MenuOption =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -266,20 +272,20 @@ static const union AffineAnimCmd gUnknown_0862032C[] =
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd *const gUnknown_08620344[] =
static const union AffineAnimCmd *const sSpriteAnims_MenuOption[] =
{
gUnknown_0862031C,
gUnknown_0862032C
gUnknown_0862032C
};
static const struct SpriteTemplate gUnknown_0862034C =
static const struct SpriteTemplate sMenuOptionSpriteTemplate =
{
.tileTag = 3,
.paletteTag = 4,
.oam = &gUnknown_08620314,
.oam = &sOamData_MenuOption,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_08620344,
.affineAnims = sSpriteAnims_MenuOption,
.callback = SpriteCallbackDummy,
};
@@ -368,11 +374,11 @@ static struct Pokenav2Struct * sub_81C9958(void)
}
void sub_81C9990(s32 ltIdx)
void CreateMenuHandlerLoopedTask(s32 ltIdx)
{
struct Pokenav2Struct * unk = GetSubstructPtr(2);
unk->loopedTaskId = CreateLoopedTask(gUnknown_086201A0[ltIdx], 1);
unk->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1);
unk->callback = sub_81C99FC;
}
@@ -388,7 +394,7 @@ void sub_81C99D4(void)
struct Pokenav2Struct * unk = GetSubstructPtr(2);
sub_81CA7F4();
RemoveWindow(unk->optionDescriptionWindowId);
RemoveWindow(unk->optionDescWindowId);
sub_81C9FEC();
sub_81CA994();
FreePokenavSubstruct(2);
@@ -434,21 +440,21 @@ static u32 sub_81C9A10(s32 state)
decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FC98, 0, 0, 0);
decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FCAC, 0, 0, 1);
CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20);
if (sub_81C9894() == 3 || sub_81C9894() == 4)
if (GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION || GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION_SEARCH)
sub_81CA850();
return LT_INC_AND_PAUSE;
case 3:
if (free_temp_tile_data_buffers_if_possible())
return LT_PAUSE;
sub_81CA6E0();
AddOptionDescriptionWindow();
sub_81CA7D4();
return LT_INC_AND_CONTINUE;
case 4:
sub_81C9FC4();
return LT_INC_AND_CONTINUE;
case 5:
sub_81CA714();
sub_81CA02C();
PrintCurrentOptionDescription();
CreateMenuOptionSprites();
sub_81CA640();
sub_81CA0C8();
return LT_INC_AND_PAUSE;
@@ -467,12 +473,12 @@ static u32 sub_81C9A10(s32 state)
PlaySE(SE_PN_ON);
sub_81C7AC0(3);
}
switch (sub_81C9894())
switch (GetPokenavMenuType())
{
case 4:
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
LoadLeftHeaderGfxForIndex(7);
// fallthrough
case 3:
case POKENAV_MENU_TYPE_CONDITION:
LoadLeftHeaderGfxForIndex(1);
break;
default:
@@ -483,12 +489,12 @@ static u32 sub_81C9A10(s32 state)
case 8:
if (IsPaletteFadeActive())
return LT_PAUSE;
switch (sub_81C9894())
switch (GetPokenavMenuType())
{
case 4:
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
sub_81C7FA0(7, FALSE, FALSE);
// fallthrough
case 3:
case POKENAV_MENU_TYPE_CONDITION:
sub_81C7FA0(1, FALSE, FALSE);
break;
default:
@@ -499,7 +505,7 @@ static u32 sub_81C9A10(s32 state)
sub_81CA92C();
return LT_INC_AND_CONTINUE;
case 9:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -508,18 +514,18 @@ static u32 sub_81C9A10(s32 state)
return LT_FINISH;
}
static u32 sub_81C9C6C(s32 state)
static u32 LoopedTask_MoveMenuCursor(s32 state)
{
switch (state)
{
case 0:
sub_81CAA3C();
sub_81CA278();
sub_81CA714();
PrintCurrentOptionDescription();
PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE;
case 1:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81CA7C4())
return LT_PAUSE;
@@ -528,7 +534,7 @@ static u32 sub_81C9C6C(s32 state)
return LT_FINISH;
}
static u32 sub_81C9CA8(s32 state)
static u32 LoopedTask_OpenConditionMenu(s32 state)
{
switch (state)
{
@@ -539,7 +545,7 @@ static u32 sub_81C9CA8(s32 state)
PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE;
case 1:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -550,10 +556,10 @@ static u32 sub_81C9CA8(s32 state)
sub_81CA20C();
sub_81C7FA0(1, FALSE, FALSE);
sub_81CA818();
sub_81CA714();
PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE;
case 3:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -567,7 +573,7 @@ static u32 sub_81C9CA8(s32 state)
return LT_FINISH;
}
static u32 sub_81C9D44(s32 state)
static u32 LoopedTask_ReturnToMainMenu(s32 state)
{
switch (state)
{
@@ -577,7 +583,7 @@ static u32 sub_81C9D44(s32 state)
sub_81C7FC4(1, 0);
return LT_INC_AND_PAUSE;
case 1:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -588,10 +594,10 @@ static u32 sub_81C9D44(s32 state)
sub_81CA20C();
sub_81C7FA0(0, FALSE, FALSE);
sub_81CA864();
sub_81CA714();
PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE;
case 3:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -605,7 +611,7 @@ static u32 sub_81C9D44(s32 state)
return LT_FINISH;
}
static u32 sub_81C9DD8(s32 state)
static u32 LoopedTask_OpenConditionSearchMenu(s32 state)
{
switch (state)
{
@@ -615,7 +621,7 @@ static u32 sub_81C9DD8(s32 state)
PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE;
case 1:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
LoadLeftHeaderGfxForIndex(7);
sub_81CA0C8();
@@ -623,10 +629,10 @@ static u32 sub_81C9DD8(s32 state)
case 2:
sub_81CA20C();
sub_81C7FA0(7, FALSE, FALSE);
sub_81CA714();
PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE;
case 3:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -638,7 +644,7 @@ static u32 sub_81C9DD8(s32 state)
return LT_FINISH;
}
static u32 sub_81C9E58(s32 state)
static u32 LoopedTask_ReturnToConditionMenu(s32 state)
{
switch (state)
{
@@ -648,7 +654,7 @@ static u32 sub_81C9E58(s32 state)
sub_81C7FC4(7, 0);
return LT_INC_AND_PAUSE;
case 1:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -656,10 +662,10 @@ static u32 sub_81C9E58(s32 state)
return LT_INC_AND_PAUSE;
case 2:
sub_81CA20C();
sub_81CA714();
PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE;
case 3:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81CA89C())
return LT_PAUSE;
@@ -669,13 +675,13 @@ static u32 sub_81C9E58(s32 state)
return LT_FINISH;
}
static u32 sub_81C9EC8(s32 state)
static u32 LoopedTask_SelectRibbonsNoWinners(s32 state)
{
switch (state)
{
case 0:
PlaySE(SE_HAZURE);
sub_81CA770();
PrintNoRibbonWinners();
return LT_INC_AND_PAUSE;
case 1:
if (IsDma3ManagerBusyWithBgCopy())
@@ -685,13 +691,14 @@ static u32 sub_81C9EC8(s32 state)
return LT_FINISH;
}
static u32 sub_81C9EF8(s32 state)
// For redisplaying the Ribbons description to replace the No Ribbon Winners message
static u32 LoopedTask_ReShowDescription(s32 state)
{
switch (state)
{
case 0:
PlaySE(SE_SELECT);
sub_81CA714();
PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE;
case 1:
if (IsDma3ManagerBusyWithBgCopy())
@@ -701,7 +708,8 @@ static u32 sub_81C9EF8(s32 state)
return LT_FINISH;
}
static u32 sub_81C9F28(s32 state)
// For selecting a feature option from a menu, e.g. the Map, Match Call, Beauty search, etc.
static u32 LoopedTask_OpenPokenavFeature(s32 state)
{
switch (state)
{
@@ -714,12 +722,12 @@ static u32 sub_81C9F28(s32 state)
sub_81C7880();
sub_81CA9C8();
sub_81CA2DC();
switch (sub_81C9894())
switch (GetPokenavMenuType())
{
case 4:
case POKENAV_MENU_TYPE_CONDITION_SEARCH:
sub_81C7FC4(7, FALSE);
// fallthrough
case 3:
case POKENAV_MENU_TYPE_CONDITION:
sub_81C7FC4(1, FALSE);
break;
default:
@@ -729,7 +737,7 @@ static u32 sub_81C9F28(s32 state)
PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE;
case 2:
if (sub_81CA324())
if (AreMenuOptionSpritesMoving())
return LT_PAUSE;
if (sub_81C8010())
return LT_PAUSE;
@@ -766,16 +774,17 @@ static void sub_81C9FEC(void)
sub_81CA698();
}
static void sub_81CA02C(void)
static void CreateMenuOptionSprites(void)
{
s32 i, j;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
// Each menu option is 4 subsprites
for (j = 0; j < 4; j++)
{
u8 spriteId = CreateSprite(&gUnknown_0862034C, 0x8c, 20 * i + 40, 3);
u8 spriteId = CreateSprite(&sMenuOptionSpriteTemplate, 0x8c, 20 * i + 40, 3);
unk->iconSprites[i][j] = &gSprites[spriteId];
gSprites[spriteId].pos2.x = 32 * j;
}
@@ -787,7 +796,7 @@ static void sub_81CA094(void)
s32 i, j;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
for (j = 0; j < 4; j++)
{
@@ -799,8 +808,8 @@ static void sub_81CA094(void)
static void sub_81CA0C8(void)
{
s32 r0 = sub_81C9894();
sub_81CA0EC(gUnknown_08620240[r0].unk4, gUnknown_08620240[r0].unk0, gUnknown_08620240[r0].unk2);
s32 menuType = GetPokenavMenuType();
sub_81CA0EC(gUnknown_08620240[menuType].unk4, gUnknown_08620240[menuType].unk0, gUnknown_08620240[menuType].unk2);
}
static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2)
@@ -809,7 +818,7 @@ static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2)
struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 sp04 = GetSpriteTileStartByTag(3);
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
if (*a0 != NULL)
{
@@ -841,11 +850,11 @@ static void sub_81CA20C(void)
{
s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 r8 = sub_81C98A4();
s32 r8 = GetPokenavCursorPos();
s32 r7 = 0;
s32 r2;
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
if (unk->iconVisible[i])
{
@@ -868,10 +877,10 @@ static void sub_81CA278(void)
{
s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 r3 = sub_81C98A4();
s32 r3 = GetPokenavCursorPos();
s32 r5;
for (i = 0, r5 = 0; i < 6; i++)
for (i = 0, r5 = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
if (unk->iconVisible[i])
{
@@ -894,7 +903,7 @@ static void sub_81CA2DC(void)
s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
if (unk->iconVisible[i])
{
@@ -906,12 +915,12 @@ static void sub_81CA2DC(void)
}
}
static bool32 sub_81CA324(void)
static bool32 AreMenuOptionSpritesMoving(void)
{
s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++)
for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{
if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy)
return TRUE;
@@ -1112,34 +1121,35 @@ static void sub_81CA6AC(struct Sprite * sprite)
}
}
static void sub_81CA6E0(void)
static void AddOptionDescriptionWindow(void)
{
struct Pokenav2Struct * ptr = GetSubstructPtr(2);
ptr->optionDescriptionWindowId = AddWindow(&gUnknown_086202CC);
PutWindowTilemap(ptr->optionDescriptionWindowId);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
CopyWindowToVram(ptr->optionDescriptionWindowId, 3);
ptr->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate);
PutWindowTilemap(ptr->optionDescWindowId);
FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
CopyWindowToVram(ptr->optionDescWindowId, 3);
}
static void sub_81CA714(void)
static void PrintCurrentOptionDescription(void)
{
struct Pokenav2Struct * ptr = GetSubstructPtr(2);
int i = sub_81C98B4();
const u8 * s = gUnknown_086202D4[i];
int menuItem = GetCurrentMenuItemId();
const u8 * s = sPageDescriptions[menuItem];
u32 width = GetStringWidth(1, s, -1);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s);
FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s);
}
static void sub_81CA770(void)
// Printed when Ribbons is selected if no PC/party mons have ribbons
// Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners
static void PrintNoRibbonWinners(void)
{
struct Pokenav2Struct * ptr = GetSubstructPtr(2);
const u8 * s = gText_NoRibbonWinners;
u32 width = GetStringWidth(1, s, -1);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s);
FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s);
}
static bool32 sub_81CA7C4(void)
@@ -1259,9 +1269,9 @@ static void sub_81CA9EC(u8 taskId)
static void sub_81CAA3C(void)
{
int i = sub_81C9894();
int j = sub_81C98A4();
int r4 = gUnknown_08620240[i].unk2 * j + gUnknown_08620240[i].unk0 - 8;
int menuType = GetPokenavMenuType();
int cursorPos = GetPokenavCursorPos();
int r4 = gUnknown_08620240[menuType].unk2 * cursorPos + gUnknown_08620240[menuType].unk0 - 8;
CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140);
CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140);
CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20);
+19 -13
View File
@@ -50,7 +50,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2);
static void sub_81D024C(struct PokenavSub10 *ptr);
static void sub_81D0288(struct PokenavSub10 *ptr);
static void sub_81D0304(void);
static void sub_81D035C(struct PokenavMonList *, u8 *);
static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *);
static const LoopedTask gUnknown_086235D8[] =
{
@@ -107,9 +107,9 @@ static const struct WindowTemplate gUnknown_086237D4 =
.baseBlock = 20
};
static const u8 gUnknown_086237DC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086237E8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086237F4[] = _("{UNK_SPACER}");
static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_12(void)
{
@@ -188,12 +188,12 @@ static u32 sub_81CFA88(struct PokenavSub9 *structPtr)
static u32 sub_81CFB08(struct PokenavSub9 *structPtr)
{
return 100005;
return POKENAV_MENU_5;
}
static u32 sub_81CFB10(struct PokenavSub9 *structPtr)
{
return 100013;
return POKENAV_MENU_D;
}
static u32 sub_81CFB18(void)
@@ -660,7 +660,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2)
*ptr++ = CHAR_SLASH;
ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3);
x = GetStringCenterAlignXOffset(1, strbuf, 56);
AddTextPrinterParameterized(windowId, 1, strbuf,x, 1, 0xFF, NULL);
AddTextPrinterParameterized(windowId, 1, strbuf, x, 1, 0xFF, NULL);
}
static void sub_81D0304(void)
@@ -676,18 +676,21 @@ static void sub_81D0304(void)
template.unkC = 8;
template.unkD = 2;
template.unkE = 1;
template.listFunc.unk10_1 = sub_81D035C;
template.listFunc.unk10_1 = BufferRibbonMonInfoText;
template.unk14 = NULL;
sub_81C81D4(&gUnknown_086237B0[1], &template, 0);
}
static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
// Buffers the "Nickname gender/level" text for the ribbon mon list
static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest)
{
u8 gender;
u8 level;
u8 * s;
const u8 * genderStr;
struct PokenavMonList * item = item0;
// Mon is in party
if (item->boxId == TOTAL_BOXES_COUNT)
{
struct Pokemon * mon = &gPlayerParty[item->monId];
@@ -695,6 +698,7 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
level = GetLevelFromMonExp(mon);
GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
}
// Mon is in PC
else
{
struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
@@ -702,24 +706,26 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
level = GetLevelFromBoxMonExp(mon);
GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
}
StringGetEnd10(gStringVar3);
dest = sub_81DB494(dest, 1, gStringVar3, 60);
switch (gender)
{
default:
genderStr = gUnknown_086237F4;
genderStr = sText_NoGenderSymbol;
break;
case MON_MALE:
genderStr = gUnknown_086237DC;
genderStr = sText_MaleSymbol;
break;
case MON_FEMALE:
genderStr = gUnknown_086237E8;
genderStr = sText_FemaleSymbol;
break;
}
s = StringCopy(gStringVar1, genderStr);
*s++ = CHAR_SLASH;
*s++ = CHAR_SPECIAL_F9;
*s++ = 5; // LV
*s++ = CHAR_LV_2;
ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
dest = sub_81DB494(dest, 1, gStringVar1, 54);
ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2);
@@ -122,8 +122,8 @@ static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon
static const u16 gUnknown_08624058[] = INCBIN_U16("graphics/pokenav/ribbons_icon4.gbapal");
static const u16 gUnknown_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.gbapal");
static const u16 gUnknown_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal");
static const u32 gUnknown_086240B8[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz");
static const u32 gUnknown_08624280[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz");
static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz");
static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz");
static const struct BgTemplate gUnknown_08624B98[] =
{
@@ -235,7 +235,7 @@ u32 sub_81D0548(struct PokenavSub13 *structPtr)
u32 sub_81D05D4(struct PokenavSub13 *structPtr)
{
return 100014;
return POKENAV_MENU_E;
}
bool32 sub_81D05DC(struct PokenavSub13 *structPtr)
@@ -527,7 +527,7 @@ u32 sub_81D0A6C(s32 state)
if (!free_temp_tile_data_buffers_if_possible())
{
sub_8199DF0(1, 0, 0, 1);
decompress_and_copy_tile_data_to_vram(1, gUnknown_086240B8, 0, 1, 0);
decompress_and_copy_tile_data_to_vram(1, sRibbonIconsSmall_Gfx, 0, 1, 0);
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0);
@@ -837,7 +837,7 @@ void sub_81D0FF0(struct PokenavSub14 *structPtr)
txtPtr = StringCopy(gStringVar1, genderTxt);
*(txtPtr++) = CHAR_SLASH;
*(txtPtr++) = CHAR_SPECIAL_F9;
*(txtPtr++) = 5;
*(txtPtr++) = CHAR_LV_2;
ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3);
AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL);
CopyWindowToVram(windowId, 2);
@@ -1041,7 +1041,7 @@ void sub_81D13BC(u16 *dst, u32 id)
static const struct CompressedSpriteSheet gUnknown_08624C78 =
{
gUnknown_08624280, 0x1800, 9
sRibbonIconsBig_Gfx, 0x1800, 9
};
static const struct SpritePalette gUnknown_08624C80[] =
-466
View File
@@ -1,466 +0,0 @@
#include "global.h"
#include "pokenav.h"
#include "event_data.h"
#include "main.h"
#include "sound.h"
#include "constants/songs.h"
struct Pokenav1Struct
{
u16 menuType;
s16 cursorPos;
u16 descriptionId;
u16 helpBarIndex;
u32 unk8;
u32 (*callback)(struct Pokenav1Struct*);
};
static bool32 sub_81C9814(struct Pokenav1Struct *a0);
static void sub_81C97F8(struct Pokenav1Struct *a0);
static void sub_81C97C0(struct Pokenav1Struct *a0);
static u32 sub_81C97BC(struct Pokenav1Struct *a0);
static void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1);
static u32 sub_81C97A4(struct Pokenav1Struct *a0);
static u32 sub_81C9798(struct Pokenav1Struct *a0);
static u32 sub_81C96FC(struct Pokenav1Struct *a0);
static u32 sub_81C963C(struct Pokenav1Struct *a0);
static u32 sub_81C9600(struct Pokenav1Struct *a0);
static u32 sub_81C9588(struct Pokenav1Struct *a0);
static u32 sub_81C9520(struct Pokenav1Struct *a0);
static u32 sub_81C943C(struct Pokenav1Struct *a0);
static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*);
static void sub_81C939C(struct Pokenav1Struct *state);
static const u8 sLastCursorPositions[] = {2, 3, 4, 2, 5};
static const u8 sDescriptionIds[][6] =
{
{ 0, 1, 4, 4, 4, 4 },
{ 0, 1, 2, 4, 4, 4 },
{ 0, 1, 2, 3, 4, 4 },
{ 5, 6, 7, 4, 4, 4 },
{ 8, 9, 10, 11, 12, 13 },
};
static u8 GetPokenavMainMenuType(void)
{
u8 retVal = 0;
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
{
retVal = 1;
if (FlagGet(FLAG_SYS_RIBBON_GET))
retVal = 2;
}
return retVal;
}
bool32 PokenavCallback_Init_0(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 0;
state->descriptionId = 0;
state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state);
return TRUE;
}
bool32 PokenavCallback_Init_4(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 2;
state->descriptionId = 2;
state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state);
return TRUE;
}
bool32 PokenavCallback_Init_5(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = GetPokenavMainMenuType();
state->cursorPos = 3;
state->descriptionId = 3;
sub_81C939C(state);
return TRUE;
}
bool32 PokenavCallback_Init_2(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = 3;
state->cursorPos = 0;
state->descriptionId = 5;
state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state);
return TRUE;
}
bool32 PokenavCallback_Init_3(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
return FALSE;
state->menuType = 4;
state->cursorPos = sub_81C76AC();
state->descriptionId = state->cursorPos + 8;
state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state);
return TRUE;
}
static void sub_81C939C(struct Pokenav1Struct *state)
{
switch (state->menuType)
{
case 0:
SetPokenavMode(POKENAV_MODE_NORMAL);
// fallthrough
case 1:
case 2:
state->callback = sub_81C93EC();
break;
case 3:
state->callback = sub_81C963C;
break;
case 4:
state->callback = sub_81C96FC;
break;
}
}
static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*)
{
switch (GetPokenavMode())
{
default:
case POKENAV_MODE_NORMAL:
return sub_81C943C;
case POKENAV_MODE_FORCE_CALL_READY:
return sub_81C9520;
case POKENAV_MODE_FORCE_CALL_EXIT:
return sub_81C9588;
}
}
u32 sub_81C941C(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->callback(state);
}
void sub_81C9430(void)
{
FreePokenavSubstruct(1);
}
static u32 sub_81C943C(struct Pokenav1Struct *a0)
{
if (sub_81C9814(a0))
return 1;
if (gMain.newKeys & A_BUTTON)
{
switch (sDescriptionIds[a0->menuType][a0->cursorPos])
{
case 0:
a0->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
sub_81C97B0(a0, POKENAV_MENU_6);
return 8;
case 1:
a0->menuType = 3;
a0->cursorPos = 0;
a0->descriptionId = sDescriptionIds[3][0];
a0->callback = sub_81C963C;
return 2;
case 2:
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B);
return 8;
case 3:
if (CanViewRibbonsMenu())
{
a0->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
sub_81C97B0(a0, POKENAV_MENU_C);
return 8;
}
else
{
a0->callback = sub_81C9600;
return 6;
}
case 4:
return -1;
}
}
if (gMain.newKeys & B_BUTTON)
return -1;
return 0;
}
static u32 sub_81C9520(struct Pokenav1Struct *a0)
{
if (sub_81C9814(a0))
return 1;
if (gMain.newKeys & A_BUTTON)
{
if (sDescriptionIds[a0->menuType][a0->cursorPos] == 2)
{
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B);
return 8;
}
else
{
PlaySE(SE_HAZURE);
return 0;
}
}
if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_HAZURE);
return 0;
}
return 0;
}
static u32 sub_81C9588(struct Pokenav1Struct *a0)
{
if (sub_81C9814(a0))
return 1;
if (gMain.newKeys & A_BUTTON)
{
u32 v0 = sDescriptionIds[a0->menuType][a0->cursorPos];
if (v0 != 2 && v0 != 4)
{
PlaySE(SE_HAZURE);
return 0;
}
else if (v0 == 2)
{
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B);
return 8;
}
else
{
return -1;
}
}
else if (gMain.newKeys & B_BUTTON)
{
return -1;
}
return 0;
}
static u32 sub_81C9600(struct Pokenav1Struct *a0)
{
if (sub_81C9814(a0))
{
a0->callback = sub_81C93EC();
return 1;
}
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
a0->callback = sub_81C93EC();
return 7;
}
return 0;
}
static u32 sub_81C963C(struct Pokenav1Struct *a0)
{
u32 v0 = sub_81C9814(a0);
if (v0)
return 1;
if (gMain.newKeys & A_BUTTON)
{
switch (sDescriptionIds[a0->menuType][a0->cursorPos])
{
case 6:
a0->menuType = 4;
a0->cursorPos = v0;
a0->descriptionId = sDescriptionIds[4][0];
a0->callback = sub_81C96FC;
return 4;
case 5:
a0->helpBarIndex = v0;
sub_81C97B0(a0, POKENAV_MENU_7);
return 8;
case 7:
PlaySE(SE_SELECT);
sub_81C97C0(a0);
return 3;
}
}
if (gMain.newKeys & B_BUTTON)
{
if (a0->cursorPos != sLastCursorPositions[a0->menuType])
{
a0->cursorPos = sLastCursorPositions[a0->menuType];
a0->callback = sub_81C9798;
return 1;
}
else
{
PlaySE(SE_SELECT);
sub_81C97C0(a0);
return 3;
}
}
return 0;
}
static u32 sub_81C96FC(struct Pokenav1Struct *a0)
{
if (sub_81C9814(a0))
return 1;
if (gMain.newKeys & A_BUTTON)
{
u8 v0 = sDescriptionIds[a0->menuType][a0->cursorPos];
if (v0 != 13)
{
sub_81C7694(v0 - 8);
sub_81C97B0(a0, POKENAV_MENU_8);
a0->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
return 8;
}
else
{
PlaySE(SE_SELECT);
sub_81C97F8(a0);
return 5;
}
}
if (gMain.newKeys & B_BUTTON)
{
if (a0->cursorPos != sLastCursorPositions[a0->menuType])
{
a0->cursorPos = sLastCursorPositions[a0->menuType];
a0->callback = sub_81C97A4;
return 1;
}
else
{
PlaySE(SE_SELECT);
sub_81C97F8(a0);
return 5;
}
}
return 0;
}
static u32 sub_81C9798(struct Pokenav1Struct *a0)
{
sub_81C97C0(a0);
return 3;
}
static u32 sub_81C97A4(struct Pokenav1Struct *a0)
{
sub_81C97F8(a0);
return 5;
}
static void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1)
{
a0->unk8 = a1;
a0->callback = sub_81C97BC;
}
static u32 sub_81C97BC(struct Pokenav1Struct *a0)
{
return a0->unk8;
}
static void sub_81C97C0(struct Pokenav1Struct *a0)
{
a0->menuType = GetPokenavMainMenuType();
a0->cursorPos = 1;
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos];
a0->callback = sub_81C943C;
}
static void sub_81C97F8(struct Pokenav1Struct *a0)
{
a0->menuType = 3;
a0->cursorPos = 1;
a0->descriptionId = sDescriptionIds[3][1];
a0->callback = sub_81C963C;
}
static bool32 sub_81C9814(struct Pokenav1Struct *a0)
{
if (gMain.newKeys & DPAD_UP)
{
if (--a0->cursorPos < 0)
a0->cursorPos = sLastCursorPositions[a0->menuType];
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos];
return TRUE;
}
else if (gMain.newKeys & DPAD_DOWN)
{
a0->cursorPos++;
if (a0->cursorPos > sLastCursorPositions[a0->menuType])
a0->cursorPos = 0;
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos];
return TRUE;
}
else
{
return FALSE;
}
}
int sub_81C9894(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->menuType;
}
int sub_81C98A4(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->cursorPos;
}
int sub_81C98B4(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->descriptionId;
}
u16 GetHelpBarTextId(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->helpBarIndex;
}
+1 -1
View File
@@ -475,7 +475,7 @@ static void sub_809F048(void)
ShowBg(0);
InitWindows(sUnknown_08510408);
DeactivateAllTextPrinters();
sub_81973A4();
LoadMessageBoxAndBorderGfx();
}
static void CB2_ResetRtcScreen(void)
+68 -21
View File
@@ -8,15 +8,6 @@
#include "constants/event_objects.h"
#include "constants/metatile_labels.h"
extern const u8 RotatingTilePuzzle_Movement_ShiftRight[];
extern const u8 RotatingTilePuzzle_Movement_ShiftDown[];
extern const u8 RotatingTilePuzzle_Movement_ShiftLeft[];
extern const u8 RotatingTilePuzzle_Movement_ShiftUp[];
extern const u8 RotatingTilePuzzle_Movement_FaceRight[];
extern const u8 RotatingTilePuzzle_Movement_FaceDown[];
extern const u8 RotatingTilePuzzle_Movement_FaceLeft[];
extern const u8 RotatingTilePuzzle_Movement_FaceUp[];
#define ROTATE_COUNTERCLOCKWISE 0
#define ROTATE_CLOCKWISE 1
#define ROTATE_NONE 2
@@ -34,6 +25,62 @@ struct RotatingTilePuzzle
bool8 isTrickHouse;
};
static const u8 sMovement_ShiftRight[] =
{
MOVEMENT_ACTION_STORE_AND_LOCK_ANIM,
MOVEMENT_ACTION_WALK_NORMAL_RIGHT,
MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_ShiftDown[] =
{
MOVEMENT_ACTION_STORE_AND_LOCK_ANIM,
MOVEMENT_ACTION_WALK_NORMAL_DOWN,
MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_ShiftLeft[] =
{
MOVEMENT_ACTION_STORE_AND_LOCK_ANIM,
MOVEMENT_ACTION_WALK_NORMAL_LEFT,
MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_ShiftUp[] =
{
MOVEMENT_ACTION_STORE_AND_LOCK_ANIM,
MOVEMENT_ACTION_WALK_NORMAL_UP,
MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_FaceRight[] =
{
MOVEMENT_ACTION_FACE_RIGHT,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_FaceDown[] =
{
MOVEMENT_ACTION_FACE_DOWN,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_FaceLeft[] =
{
MOVEMENT_ACTION_FACE_LEFT,
MOVEMENT_ACTION_STEP_END
};
static const u8 sMovement_FaceUp[] =
{
MOVEMENT_ACTION_FACE_UP,
MOVEMENT_ACTION_STEP_END
};
// This file's functions.
static void SaveRotatingTileObject(u8 eventTemplateId, u8 arg1);
static void TurnUnsavedRotatingTileObject(u8 eventTemplateId, u8 arg1);
@@ -106,19 +153,19 @@ u16 MoveRotatingTileObjects(u8 puzzleNumber)
switch (puzzleTileNum)
{
case 0: // Right Arrow
movementScript = RotatingTilePuzzle_Movement_ShiftRight;
movementScript = sMovement_ShiftRight;
x = 1;
break;
case 1: // Down Arrow
movementScript = RotatingTilePuzzle_Movement_ShiftDown;
movementScript = sMovement_ShiftDown;
y = 1;
break;
case 2: // Left Arrow
movementScript = RotatingTilePuzzle_Movement_ShiftLeft;
movementScript = sMovement_ShiftLeft;
x = -1;
break;
case 3: // Up Arrow
movementScript = RotatingTilePuzzle_Movement_ShiftUp;
movementScript = sMovement_ShiftUp;
y = -1;
break;
default:
@@ -204,19 +251,19 @@ void TurnRotatingTileObjects(void)
switch (direction)
{
case DIR_EAST:
movementScript = RotatingTilePuzzle_Movement_FaceUp;
movementScript = sMovement_FaceUp;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP;
break;
case DIR_SOUTH:
movementScript = RotatingTilePuzzle_Movement_FaceRight;
movementScript = sMovement_FaceRight;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT;
break;
case DIR_WEST:
movementScript = RotatingTilePuzzle_Movement_FaceDown;
movementScript = sMovement_FaceDown;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN;
break;
case DIR_NORTH:
movementScript = RotatingTilePuzzle_Movement_FaceLeft;
movementScript = sMovement_FaceLeft;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT;
break;
default:
@@ -233,19 +280,19 @@ void TurnRotatingTileObjects(void)
switch (direction)
{
case DIR_EAST:
movementScript = RotatingTilePuzzle_Movement_FaceDown;
movementScript = sMovement_FaceDown;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN;
break;
case DIR_SOUTH:
movementScript = RotatingTilePuzzle_Movement_FaceLeft;
movementScript = sMovement_FaceLeft;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT;
break;
case DIR_WEST:
movementScript = RotatingTilePuzzle_Movement_FaceUp;
movementScript = sMovement_FaceUp;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP;
break;
case DIR_NORTH:
movementScript = RotatingTilePuzzle_Movement_FaceRight;
movementScript = sMovement_FaceRight;
objectEvents[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT;
break;
default:
+1 -1
View File
@@ -1304,7 +1304,7 @@ bool8 ScrCmd_cmdDB(struct ScriptContext *ctx)
if (msg == NULL)
msg = (const u8 *)ctx->data[0];
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 1);
AddTextPrinterParameterized(0, 1, msg, 0, 1, 0, 0);
return FALSE;
+2262 -111
View File
File diff suppressed because it is too large Load Diff
+10 -10
View File
@@ -450,7 +450,7 @@ static bool32 InitStartMenuStep(void)
sInitStartMenuData[0]++;
break;
case 2:
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawStdWindowFrame(sub_81979C4(sNumStartMenuActions), FALSE);
sInitStartMenuData[1] = 0;
sInitStartMenuData[0]++;
@@ -1314,37 +1314,37 @@ static void ShowSaveInfoWindow(void)
// Print region name
yOffset = 1;
sub_819A344(3, gStringVar4, TEXT_COLOR_GREEN);
BufferSaveMenuText(SAVE_MENU_LOCATION, gStringVar4, TEXT_COLOR_GREEN);
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, 0, yOffset, 0xFF, NULL);
// Print player name
yOffset = 0x11;
yOffset += 16;
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingPlayer, 0, yOffset, 0xFF, NULL);
sub_819A344(0, gStringVar4, color);
BufferSaveMenuText(SAVE_MENU_NAME, gStringVar4, color);
xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
PrintPlayerNameOnWindow(sSaveInfoWindowId, gStringVar4, xOffset, yOffset);
// Print badge count
yOffset = 0x21;
yOffset += 16;
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingBadges, 0, yOffset, 0xFF, NULL);
sub_819A344(4, gStringVar4, color);
BufferSaveMenuText(SAVE_MENU_BADGES, gStringVar4, color);
xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
{
// Print pokedex count
yOffset = 0x31;
yOffset += 16;
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingPokedex, 0, yOffset, 0xFF, NULL);
sub_819A344(1, gStringVar4, color);
BufferSaveMenuText(SAVE_MENU_CAUGHT, gStringVar4, color);
xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
}
// Print play time
yOffset += 0x10;
yOffset += 16;
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingTime, 0, yOffset, 0xFF, NULL);
sub_819A344(2, gStringVar4, color);
BufferSaveMenuText(SAVE_MENU_PLAY_TIME, gStringVar4, color);
xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+3 -3
View File
@@ -1206,12 +1206,12 @@ const u8 gText_UnionTradesAndBattles[] = _("UNION TRADES & BATTLES");
const u8 gText_BerryCrush[] = _("BERRY CRUSH");
const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD.");
const u8 gText_PokeblocksWithFriends[] = _("{POKEBLOCK}S W/FRIENDS");
const u8 gText_Var1DarkGreyShadowLightGrey[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}");
const u8 gText_NumPokeblocks[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}");
const u8 gText_WonContestsWFriends[] = _("WON CONTESTS W/FRIENDS");
const u8 gText_BattlePtsWon[] = _("BATTLE POINTS WON");
const u8 gText_Var1DarkLightGreyBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP");
const u8 gText_NumBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP");
const u8 gText_BattleTower[] = _("BATTLE TOWER");
const u8 gText_WSlashStraightSlash[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}");
const u8 gText_WinsStraight[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}");
const u8 gText_BattleTower2[] = _("BATTLE TOWER");
const u8 gText_BattleDome[] = _("BATTLE DOME");
const u8 gText_BattlePalace[] = _("BATTLE PALACE");
+459 -418
View File
File diff suppressed because it is too large Load Diff
+6 -5
View File
@@ -331,7 +331,7 @@ static u16 sub_818D65C(u16 species, u32 otId, u32 personality, bool8 isFrontPic,
return 0;
}
static u16 sub_818D6CC(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer)
static u16 CreateTrainerCardSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer)
{
u8 *framePics;
@@ -366,9 +366,10 @@ u16 sub_818D834(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 pal
return sub_818D65C(species, otId, personality, isFrontPic, paletteSlot, windowId, FALSE);
}
u16 sub_818D864(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
// Unused, FRLG only
u16 CreateTrainerCardMonIconSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
{
return sub_818D6CC(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE);
return CreateTrainerCardSprite(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE);
}
u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)
@@ -386,9 +387,9 @@ u16 sub_818D904(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId)
return sub_818D65C(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE);
}
u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
{
return sub_818D6CC(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);
return CreateTrainerCardSprite(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);
}
u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass)
+1 -1
View File
@@ -1943,7 +1943,7 @@ void sub_80EDB44(void)
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->rivalTrainer.kind = TVSHOW_TODAYS_RIVAL_TRAINER;
show->rivalTrainer.active = FALSE;
for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + 8; i ++)
for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i ++)
{
if (FlagGet(i))
{
+4 -4
View File
@@ -3376,7 +3376,7 @@ u8 sub_8016FF0(struct UnkStruct_Main4 * a0, u32 a1)
bool32 sub_8017020(const u8 *src)
{
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 1);
StringExpandPlaceholders(gStringVar4, src);
AddTextPrinterWithCustomSpeedForMessage(FALSE, 1);
@@ -3400,7 +3400,7 @@ bool8 PrintOnTextbox(u8 *textState, const u8 *str)
switch (*textState)
{
case 0:
sub_81973A4();
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 1);
StringExpandPlaceholders(gStringVar4, str);
AddTextPrinterForMessage_2(TRUE);
@@ -4316,9 +4316,9 @@ void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2)
ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]);
for (i = 0; i < 4; i++)
for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
{
CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->var_28[i]);
CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->easyChatProfile[i]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->field_C0[i + 3]);
}