Synced src/mon_markings.c and partly synced PSS

This commit is contained in:
Eduardo Quezada
2022-07-30 02:22:59 -04:00
parent 4a60396428
commit 60ce72fa5a
88 changed files with 1742 additions and 1590 deletions
+427 -331
View File
@@ -5,510 +5,606 @@
#include "graphics.h"
#include "constants/songs.h"
static EWRAM_DATA struct PokemonMarkMenu * sMenu = NULL;
#define ANIM_CURSOR (NUM_MON_MARKINGS * 2)
#define ANIM_TEXT (ANIM_CURSOR + 1)
static void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 tilesTag, u16 paletteTag);
static void nullsub_62(struct Sprite * sprite);
static void SpriteCB_MarkingIcon(struct Sprite * sprite);
static void SpriteCB_Cursor(struct Sprite * sprite);
static struct Sprite * CreateMonMarkingSprite(u16 tilesTag, u16 paletteTag, const u16 *palette, u16 size);
#define SELECTION_OK NUM_MON_MARKINGS
#define SELECTION_CANCEL (SELECTION_OK + 1)
static void CreateMonMarkingsMenuSprites(s16, s16, u16, u16);
static void SpriteCB_Dummy(struct Sprite *);
static void SpriteCB_Marking(struct Sprite *);
static void SpriteCB_Cursor(struct Sprite *);
static struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16);
static const u16 sMonMarkingsPal[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
static const u16 sMonMarkingsTiles[] = INCBIN_U16("graphics/misc/mon_markings.4bpp");
static const u16 sMonMarkings_Gfx[] = INCBIN_U16("graphics/misc/mon_markings.4bpp");
static const u8 sUnref_83EE828[] = {0x09, 0x50, 0x13, 0x02, 0xFF};
static const struct OamData sOamData_64x64 = {
.shape = SPRITE_SHAPE(64x64),
.size = SPRITE_SIZE(64x64)
};
static const struct OamData sOamData_8x8 = {
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8)
};
static const union AnimCmd sAnimCmd_MenuMark_CircleOff[] = {
ANIMCMD_FRAME(0x0, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_CircleOn[] = {
ANIMCMD_FRAME(0x1, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_SquareOff[] = {
ANIMCMD_FRAME(0x2, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_SquareOn[] = {
ANIMCMD_FRAME(0x3, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_TriangleOff[] = {
ANIMCMD_FRAME(0x4, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_TriangleOn[] = {
ANIMCMD_FRAME(0x5, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_HeartOff[] = {
ANIMCMD_FRAME(0x6, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_HeartOn[] = {
ANIMCMD_FRAME(0x7, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_Cursor[] = {
ANIMCMD_FRAME(0x8, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MenuMark_Blank[] = {
ANIMCMD_FRAME(0x9, 5),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_MenuMark[] = {
sAnimCmd_MenuMark_CircleOff,
sAnimCmd_MenuMark_CircleOn,
sAnimCmd_MenuMark_SquareOff,
sAnimCmd_MenuMark_SquareOn,
sAnimCmd_MenuMark_TriangleOff,
sAnimCmd_MenuMark_TriangleOn,
sAnimCmd_MenuMark_HeartOff,
sAnimCmd_MenuMark_HeartOn,
sAnimCmd_MenuMark_Cursor,
sAnimCmd_MenuMark_Blank
};
static const union AnimCmd sAnimCmd_Frame_0[] = {
ANIMCMD_FRAME(0x0, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_Frame_1[] = {
ANIMCMD_FRAME(0x40, 5),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_Frame[] = {
sAnimCmd_Frame_0,
sAnimCmd_Frame_1
};
static const struct OamData sOamData_32x8 = {
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8)
};
static const union AnimCmd sAnimCmd_MonMark_0000[] = {
ANIMCMD_FRAME(0x0, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1000[] = {
ANIMCMD_FRAME(0x4, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0100[] = {
ANIMCMD_FRAME(0x8, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1100[] = {
ANIMCMD_FRAME(0xc, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0010[] = {
ANIMCMD_FRAME(0x10, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1010[] = {
ANIMCMD_FRAME(0x14, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0110[] = {
ANIMCMD_FRAME(0x18, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1110[] = {
ANIMCMD_FRAME(0x1c, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0001[] = {
ANIMCMD_FRAME(0x20, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1001[] = {
ANIMCMD_FRAME(0x24, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0101[] = {
ANIMCMD_FRAME(0x28, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1101[] = {
ANIMCMD_FRAME(0x2c, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0011[] = {
ANIMCMD_FRAME(0x30, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1011[] = {
ANIMCMD_FRAME(0x34, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_0111[] = {
ANIMCMD_FRAME(0x38, 5),
ANIMCMD_END
};
static const union AnimCmd sAnimCmd_MonMark_1111[] = {
ANIMCMD_FRAME(0x3c, 5),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_MonMarkSet[] = {
sAnimCmd_MonMark_0000,
sAnimCmd_MonMark_1000,
sAnimCmd_MonMark_0100,
sAnimCmd_MonMark_1100,
sAnimCmd_MonMark_0010,
sAnimCmd_MonMark_1010,
sAnimCmd_MonMark_0110,
sAnimCmd_MonMark_1110,
sAnimCmd_MonMark_0001,
sAnimCmd_MonMark_1001,
sAnimCmd_MonMark_0101,
sAnimCmd_MonMark_1101,
sAnimCmd_MonMark_0011,
sAnimCmd_MonMark_1011,
sAnimCmd_MonMark_0111,
sAnimCmd_MonMark_1111
};
void SetMonMarkingsMenuPointer(struct PokemonMarkMenu * markMenu)
static const struct OamData sOamData_MenuWindow =
{
sMenu = markMenu;
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x64),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x64),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
// Used for the markings, OK/Cancel text, and cursor sprites
static const struct OamData sOamData_8x8 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.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 union AnimCmd sAnim_Marking_CircleOff[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_CircleOn[] =
{
ANIMCMD_FRAME(1, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_SquareOff[] =
{
ANIMCMD_FRAME(2, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_SquareOn[] =
{
ANIMCMD_FRAME(3, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_TriangleOff[] =
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_TriangleOn[] =
{
ANIMCMD_FRAME(5, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_HeartOff[] =
{
ANIMCMD_FRAME(6, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Marking_HeartOn[] =
{
ANIMCMD_FRAME(7, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_Cursor[] =
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_OKCancelText[] =
{
ANIMCMD_FRAME(9, 5),
ANIMCMD_END,
};
static const union AnimCmd *const sAnims_MenuSprite[] =
{
sAnim_Marking_CircleOff,
sAnim_Marking_CircleOn,
sAnim_Marking_SquareOff,
sAnim_Marking_SquareOn,
sAnim_Marking_TriangleOff,
sAnim_Marking_TriangleOn,
sAnim_Marking_HeartOff,
sAnim_Marking_HeartOn,
[ANIM_CURSOR] = sAnim_Cursor,
[ANIM_TEXT] = sAnim_OKCancelText,
};
static const union AnimCmd sAnim_MenuWindow_UpperHalf[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MenuWindow_LowerHalf[] =
{
ANIMCMD_FRAME(64, 5),
ANIMCMD_END,
};
static const union AnimCmd *const sAnims_MenuWindow[] =
{
sAnim_MenuWindow_UpperHalf,
sAnim_MenuWindow_LowerHalf,
};
static const struct OamData sOamData_MarkingCombo =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const union AnimCmd sAnim_MarkingCombo_AllOff[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_Circle[] =
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_Square[] =
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleSquare[] =
{
ANIMCMD_FRAME(12, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_Triangle[] =
{
ANIMCMD_FRAME(16, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleTriangle[] =
{
ANIMCMD_FRAME(20, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_SquareTriangle[] =
{
ANIMCMD_FRAME(24, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleSquareTriangle[] =
{
ANIMCMD_FRAME(28, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_Heart[] =
{
ANIMCMD_FRAME(32, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleHeart[] =
{
ANIMCMD_FRAME(36, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_SquareHeart[] =
{
ANIMCMD_FRAME(40, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleSquareHeart[] =
{
ANIMCMD_FRAME(44, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_TriangleHeart[] =
{
ANIMCMD_FRAME(48, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_CircleTriangleHeart[] =
{
ANIMCMD_FRAME(52, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_SquareTriangleHeart[] =
{
ANIMCMD_FRAME(56, 5),
ANIMCMD_END,
};
static const union AnimCmd sAnim_MarkingCombo_AllOn[] =
{
ANIMCMD_FRAME(60, 5),
ANIMCMD_END,
};
static const union AnimCmd *const sAnims_MarkingCombo[] =
{
sAnim_MarkingCombo_AllOff,
sAnim_MarkingCombo_Circle,
sAnim_MarkingCombo_Square,
sAnim_MarkingCombo_CircleSquare,
sAnim_MarkingCombo_Triangle,
sAnim_MarkingCombo_CircleTriangle,
sAnim_MarkingCombo_SquareTriangle,
sAnim_MarkingCombo_CircleSquareTriangle,
sAnim_MarkingCombo_Heart,
sAnim_MarkingCombo_CircleHeart,
sAnim_MarkingCombo_SquareHeart,
sAnim_MarkingCombo_CircleSquareHeart,
sAnim_MarkingCombo_TriangleHeart,
sAnim_MarkingCombo_CircleTriangleHeart,
sAnim_MarkingCombo_SquareTriangleHeart,
sAnim_MarkingCombo_AllOn,
};
static EWRAM_DATA struct MonMarkingsMenu *sMenu = NULL;
void InitMonMarkingsMenu(struct MonMarkingsMenu *ptr)
{
sMenu = ptr;
}
static void GetUserFrameForMonMarkings(void)
static void BufferMenuWindowTiles(void)
{
const struct TextWindowGraphics * frame = GetUserFrameGraphicsInfo(gSaveBlock2Ptr->optionsWindowFrameType);
const struct TextWindowGraphics *frame = GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType);
sMenu->frameTiles = frame->tiles;
sMenu->framePalette = frame->palette;
sMenu->tileLoadState = 0;
CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
CpuFill16(0, sMenu->windowSpriteTiles, sizeof(sMenu->windowSpriteTiles));
}
static bool8 DoLoadMonMarkingsFrameGfx(void)
static bool8 BufferMenuFrameTiles(void)
{
u16 i;
u8 *menuWindowSpriteTiles = &sMenu->menuWindowSpriteTiles[256 * sMenu->tileLoadState];
u8 *dest = sMenu->windowSpriteTiles + sMenu->tileLoadState * 0x100;
switch (sMenu->tileLoadState)
{
case 0:
CpuFastCopy(sMenu->frameTiles + 0x00, menuWindowSpriteTiles, 0x20);
CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
CpuFastCopy(sMenu->frameTiles + 0x20, menuWindowSpriteTiles + 0x20 * (i + 1), 0x20);
CpuFastCopy(sMenu->frameTiles + 0x40, menuWindowSpriteTiles + 0x20 * 7, 0x20);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
default:
CpuFastCopy(sMenu->frameTiles + 0x60, menuWindowSpriteTiles + 0x00, 0x20);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
CpuFastCopy(sMenu->frameTiles + 0x80, menuWindowSpriteTiles + 0x20 * (i + 1), 0x20);
CpuFastCopy(sMenu->frameTiles + 0xA0, menuWindowSpriteTiles + 0x20 * 7, 0x20);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
case 13:
CpuFastCopy(sMenu->frameTiles + 0xC0, menuWindowSpriteTiles + 0x00, 0x20);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
CpuFastCopy(sMenu->frameTiles + 0xE0, menuWindowSpriteTiles + 0x20 * (i + 1), 0x20);
CpuFastCopy(sMenu->frameTiles + 0x100, menuWindowSpriteTiles + 0x20 * 7, 0x20);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
return FALSE;
case 14:
return FALSE;
}
return TRUE;
}
void LoadMonMarkingsFrameGfx(void)
void BufferMonMarkingsMenuTiles(void)
{
GetUserFrameForMonMarkings();
while (DoLoadMonMarkingsFrameGfx())
{}
BufferMenuWindowTiles();
while (BufferMenuFrameTiles());
}
void DrawMonMarkingsMenu(u8 markings, s16 x, s16 y)
void OpenMonMarkingsMenu(u8 markings, s16 x, s16 y)
{
u16 i;
sMenu->cursorPos = 0;
sMenu->markings = markings;
for (i = 0; i < 4; i++)
{
for (i = 0; i < NUM_MON_MARKINGS; i++)
sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
}
CreateMonMarkingsMenuSprites(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);;
CreateMonMarkingsMenuSprites(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
}
void TeardownMonMarkingsMenu(void)
void FreeMonMarkingsMenu(void)
{
u16 i;
for (i = 0; i < 3; i++)
{
FreeSpriteTilesByTag(sMenu->baseTileTag + i);
}
FreeSpritePaletteByTag(sMenu->basePaletteTag);
FreeSpritePaletteByTag(sMenu->basePaletteTag + 1);
for (i = 0; i < 2; i++)
for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++)
{
if (sMenu->menuWindowSprites[i] == NULL)
if (sMenu->windowSprites[i] == NULL)
return; // break;
DestroySprite(sMenu->menuWindowSprites[i]);
DestroySprite(sMenu->windowSprites[i]);
}
for (i = 0; i < 4; i++)
for (i = 0; i < NUM_MON_MARKINGS; i++)
{
if (sMenu->menuMarkingSprites[i] == NULL)
if (sMenu->markingSprites[i] == NULL)
return; // break;
DestroySprite(sMenu->menuMarkingSprites[i]);
DestroySprite(sMenu->markingSprites[i]);
}
if (sMenu->unkSprite != NULL)
DestroySprite(sMenu->unkSprite);
if (sMenu->menuTextSprite != NULL)
DestroySprite(sMenu->menuTextSprite);
if (sMenu->cursorSprite != NULL)
DestroySprite(sMenu->cursorSprite);
if (sMenu->textSprite != NULL)
DestroySprite(sMenu->textSprite);
}
bool8 MonMarkingsHandleInput(void)
bool8 HandleMonMarkingsMenuInput(void)
{
u16 i;
if (JOY_NEW(DPAD_UP))
{
s8 pos;
PlaySE(SE_SELECT);
if (--sMenu->cursorPos < 0)
sMenu->cursorPos = 5;
pos = --sMenu->cursorPos;
if (pos < 0)
sMenu->cursorPos = SELECTION_CANCEL;
return TRUE;
}
if (JOY_NEW(DPAD_DOWN))
{
s8 pos;
PlaySE(SE_SELECT);
if (++sMenu->cursorPos > 5)
pos = ++sMenu->cursorPos;
if (pos > SELECTION_CANCEL)
sMenu->cursorPos = 0;
return TRUE;
}
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
switch (sMenu->cursorPos)
{
case 4:
case SELECTION_OK:
sMenu->markings = 0;
for (i = 0; i < 4; i++)
for (i = 0; i < NUM_MON_MARKINGS; i++)
sMenu->markings |= sMenu->markingsArray[i] << i;
return FALSE;
case 5:
case SELECTION_CANCEL:
return FALSE;
}
sMenu->markingsArray[sMenu->cursorPos] = sMenu->markingsArray[sMenu->cursorPos] ? FALSE : TRUE;
sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos];
return TRUE;
}
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
return FALSE;
}
return TRUE;
}
static void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 tilesTag, u16 paletteTag)
#define sMarkingId data[0]
#define sCursorYOffset data[0]
static void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
{
u16 i;
u8 spriteId;
struct SpriteSheet sheets[] = {
{
.data = sMenu->menuWindowSpriteTiles,
.size = 0x1000,
.tag = tilesTag
}, {
.data = gUnknown_8E9CBBC,
.size = 0x320,
.tag = tilesTag + 1
}, {}
struct SpriteSheet sheets[] =
{
{ sMenu->windowSpriteTiles, 0x1000, baseTileTag },
{ gMonMarkingsMenu_Gfx, 0x320, baseTileTag + 1 },
{}
};
struct SpritePalette palettes[] = {
{
.data = sMenu->framePalette,
.tag = paletteTag
}, {
.data = gUnknown_8E9CB9C,
.tag = paletteTag + 1
}, {}
struct SpritePalette palettes[] =
{
{ sMenu->framePalette, basePaletteTag },
{ gMonMarkingsMenu_Pal, basePaletteTag + 1},
{}
};
struct SpriteTemplate sprTemplate = {
.tileTag = tilesTag,
.paletteTag = paletteTag,
.oam = &sOamData_64x64,
.anims = sSpriteAnimTable_Frame,
struct SpriteTemplate template =
{
.tileTag = baseTileTag,
.paletteTag = basePaletteTag,
.oam = &sOamData_MenuWindow,
.anims = sAnims_MenuWindow,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = nullsub_62
.callback = SpriteCB_Dummy,
};
LoadSpriteSheets(sheets);
LoadSpritePalettes(palettes);
for (i = 0; i < 2; i++)
// Create window sprites
for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++)
{
spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1);
spriteId = CreateSprite(&template, x + 32, y + 32, 1);
if (spriteId != MAX_SPRITES)
{
sMenu->menuWindowSprites[i] = &gSprites[spriteId];
sMenu->windowSprites[i] = &gSprites[spriteId];
StartSpriteAnim(&gSprites[spriteId], i);
}
else
{
sMenu->menuWindowSprites[i] = NULL;
sMenu->windowSprites[i] = NULL;
return;
}
}
sMenu->windowSprites[1]->y = y + 96;
sMenu->menuWindowSprites[1]->y = y + 96;
sprTemplate.tileTag++;
sprTemplate.paletteTag++;
sprTemplate.anims = sSpriteAnimTable_MenuMark;
sprTemplate.callback = SpriteCB_MarkingIcon;
sprTemplate.oam = &sOamData_8x8;
for (i = 0; i < 4; i++)
// Create marking sprites
template.tileTag++;
template.paletteTag++;
template.anims = sAnims_MenuSprite;
template.callback = SpriteCB_Marking;
template.oam = &sOamData_8x8;
for (i = 0; i < NUM_MON_MARKINGS; i++)
{
spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0);
spriteId = CreateSprite(&template, x + 32, y + 16 + 16 * i, 0);
if (spriteId != MAX_SPRITES)
{
sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
gSprites[spriteId].data[0] = i;
sMenu->markingSprites[i] = &gSprites[spriteId];
gSprites[spriteId].sMarkingId = i;
}
else
{
sMenu->menuMarkingSprites[i] = NULL;
sMenu->markingSprites[i] = NULL;
return;
}
}
sprTemplate.callback = SpriteCallbackDummy;
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
// Create OK/Cancel text sprite
template.callback = SpriteCallbackDummy;
spriteId = CreateSprite(&template, 0, 0, 0);
if (spriteId != MAX_SPRITES)
{
sMenu->menuTextSprite = &gSprites[spriteId];
sMenu->menuTextSprite->oam.shape = ST_OAM_SQUARE;
sMenu->menuTextSprite->oam.size = 2;
StartSpriteAnim(sMenu->menuTextSprite, 9);
sMenu->menuTextSprite->x = x + 32;
sMenu->menuTextSprite->y = y + 80;
CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0);
sMenu->textSprite = &gSprites[spriteId];
sMenu->textSprite->oam.shape = SPRITE_SHAPE(32x32);
sMenu->textSprite->oam.size = SPRITE_SIZE(32x32);
StartSpriteAnim(sMenu->textSprite, ANIM_TEXT);
sMenu->textSprite->x = x + 32;
sMenu->textSprite->y = y + 80;
CalcCenterToCornerVec(sMenu->textSprite, SPRITE_SHAPE(32x16), SPRITE_SIZE(32x16), ST_OAM_AFFINE_OFF);
}
else
{
sMenu->menuTextSprite = NULL;
sMenu->textSprite = NULL;
}
sprTemplate.callback = SpriteCB_Cursor;
spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0);
// Create cursor sprite
template.callback = SpriteCB_Cursor;
spriteId = CreateSprite(&template, x + 12, 0, 0);
if (spriteId != MAX_SPRITES)
{
sMenu->unkSprite = &gSprites[spriteId];
sMenu->unkSprite->data[0] = y + 16;
StartSpriteAnim(sMenu->unkSprite, 8);
sMenu->cursorSprite = &gSprites[spriteId];
sMenu->cursorSprite->sCursorYOffset = y + 16;
StartSpriteAnim(sMenu->cursorSprite, ANIM_CURSOR);
}
else
{
sMenu->unkSprite = NULL;
sMenu->cursorSprite = NULL;
}
}
static void nullsub_62(struct Sprite * sprite)
{}
static void SpriteCB_MarkingIcon(struct Sprite * sprite)
static void SpriteCB_Dummy(struct Sprite *sprite)
{
if (sMenu->markingsArray[sprite->data[0]])
StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
}
static void SpriteCB_Marking(struct Sprite *sprite)
{
if (sMenu->markingsArray[sprite->sMarkingId])
StartSpriteAnim(sprite, 2 * sprite->sMarkingId + 1); // Set marking 'on'
else
StartSpriteAnim(sprite, 2 * sprite->data[0] + 0);
StartSpriteAnim(sprite, 2 * sprite->sMarkingId); // Set marking 'off'
}
static void SpriteCB_Cursor(struct Sprite * sprite)
#undef sMarkingId
static void SpriteCB_Cursor(struct Sprite *sprite)
{
sprite->y = 16 * sMenu->cursorPos + sprite->data[0];
sprite->y = (16 * sMenu->cursorPos) + sprite->sCursorYOffset;
}
struct Sprite * CreateMonMarkingSprite_SelectCombo(u16 tileTag, u16 paletteTag, const u16 *palette)
#undef sCursorYOffset
// Creates a mon marking combination sprite with a spritesheet that holds every possible combination, used by the summary screen / Pokénav
struct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (palette == NULL)
palette = sMonMarkingsPal;
return CreateMonMarkingSprite(tileTag, paletteTag, palette, 16);
return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1 << NUM_MON_MARKINGS);
}
struct Sprite * CreateMonMarkingSprite_AllOff(u16 tileTag, u16 paletteTag, const u16 *palette)
// Creates a mon marking combination sprite with a spritesheet that holds only one combination, used for the currently selected PC mon
struct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (palette == NULL)
palette = sMonMarkingsPal;
return CreateMonMarkingSprite(tileTag, paletteTag, palette, 1);
return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1);
}
static struct Sprite * CreateMonMarkingSprite(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
static struct Sprite *CreateMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
{
u8 spriteId;
struct SpriteTemplate sprTemplate;
struct SpriteSheet sheet = { sMonMarkingsTiles, 0x80, tileTag };
struct SpriteTemplate template;
struct SpriteSheet sheet = { sMonMarkings_Gfx, 0x80, tileTag };
struct SpritePalette sprPalette = { palette, paletteTag };
sprTemplate.tileTag = tileTag;
sprTemplate.paletteTag = paletteTag;
sprTemplate.oam = &sOamData_32x8;
sprTemplate.anims = sSpriteAnimTable_MonMarkSet;
sprTemplate.images = NULL;
sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
sprTemplate.callback = nullsub_62;
template.tileTag = tileTag;
template.paletteTag = paletteTag;
template.oam = &sOamData_MarkingCombo;
template.anims = sAnims_MarkingCombo;
template.images = NULL;
template.affineAnims = gDummySpriteAffineAnimTable;
template.callback = SpriteCB_Dummy;
sheet.size = size * 0x80;
LoadSpriteSheet(&sheet);
LoadSpritePalette(&sprPalette);
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
spriteId = CreateSprite(&template, 0, 0, 0);
if (spriteId != MAX_SPRITES)
return &gSprites[spriteId];
else
return NULL;
}
void RequestDma3LoadMonMarking(u8 markings, void * dest)
// Update what combination is shown, used for sprites created with CreateMonMarkingComboSprite
void UpdateMonMarkingTiles(u8 markings, void *dest)
{
RequestDma3Copy(&sMonMarkingsTiles[64 * markings], dest, 0x80, DMA3_32BIT);
RequestDma3Copy(&sMonMarkings_Gfx[64 * markings], dest, 0x80, DMA3_32BIT);
}