mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-18 20:47:40 +01:00
612 lines
14 KiB
C
612 lines
14 KiB
C
#include "global.h"
|
|
#include "dma3.h"
|
|
#include "graphics.h"
|
|
#include "main.h"
|
|
#include "window.h"
|
|
#include "list_menu.h"
|
|
#include "mon_markings.h"
|
|
#include "constants/songs.h"
|
|
#include "sound.h"
|
|
#include "sprite.h"
|
|
#include "text_window.h"
|
|
|
|
#define MENU_TEXT_SPRITE_X_OFFSET 32
|
|
|
|
// static functions
|
|
static void sub_811FC80(s16, s16, u16, u16);
|
|
static void TaskDummy7(struct Sprite *);
|
|
static void sub_811FF40(struct Sprite *);
|
|
static void sub_811FF7C(struct Sprite *);
|
|
static struct Sprite *sub_811FFD4(u16, u16, const u16 *, u16);
|
|
|
|
// .rodata
|
|
static const u16 gUnknown_0859E65C[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
|
|
static const u8 gUnknown_0859E67C[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
|
|
|
|
static const struct OamData gUnknown_0859EE7C =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = SPRITE_SHAPE(64x64),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(64x64),
|
|
.tileNum = 0,
|
|
.priority = 0,
|
|
.paletteNum = 0,
|
|
.affineParam = 0,
|
|
};
|
|
|
|
static const struct OamData gUnknown_0859EE84 =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = SPRITE_SHAPE(8x8),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(8x8),
|
|
.tileNum = 0,
|
|
.priority = 0,
|
|
.paletteNum = 0,
|
|
.affineParam = 0,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EE8C[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EE94[] =
|
|
{
|
|
ANIMCMD_FRAME(1, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EE9C[] =
|
|
{
|
|
ANIMCMD_FRAME(2, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EEA4[] =
|
|
{
|
|
ANIMCMD_FRAME(3, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EEAC[] =
|
|
{
|
|
ANIMCMD_FRAME(4, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EEB4[] =
|
|
{
|
|
ANIMCMD_FRAME(5, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EEBC[] =
|
|
{
|
|
ANIMCMD_FRAME(6, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EEC4[] =
|
|
{
|
|
ANIMCMD_FRAME(7, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EECC[] =
|
|
{
|
|
ANIMCMD_FRAME(8, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EED4[] =
|
|
{
|
|
ANIMCMD_FRAME(9, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_0859EEDC[] =
|
|
{
|
|
gUnknown_0859EE8C,
|
|
gUnknown_0859EE94,
|
|
gUnknown_0859EE9C,
|
|
gUnknown_0859EEA4,
|
|
gUnknown_0859EEAC,
|
|
gUnknown_0859EEB4,
|
|
gUnknown_0859EEBC,
|
|
gUnknown_0859EEC4,
|
|
gUnknown_0859EECC,
|
|
gUnknown_0859EED4,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF04[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF0C[] =
|
|
{
|
|
ANIMCMD_FRAME(64, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_0859EF14[] =
|
|
{
|
|
gUnknown_0859EF04,
|
|
gUnknown_0859EF0C,
|
|
};
|
|
|
|
static const struct OamData gUnknown_0859EF1C =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = SPRITE_SHAPE(32x8),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(32x8),
|
|
.tileNum = 0,
|
|
.priority = 0,
|
|
.paletteNum = 0,
|
|
.affineParam = 0,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF24[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF2C[] =
|
|
{
|
|
ANIMCMD_FRAME(4, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF34[] =
|
|
{
|
|
ANIMCMD_FRAME(8, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF3C[] =
|
|
{
|
|
ANIMCMD_FRAME(12, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF44[] =
|
|
{
|
|
ANIMCMD_FRAME(16, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF4C[] =
|
|
{
|
|
ANIMCMD_FRAME(20, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF54[] =
|
|
{
|
|
ANIMCMD_FRAME(24, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF5C[] =
|
|
{
|
|
ANIMCMD_FRAME(28, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF64[] =
|
|
{
|
|
ANIMCMD_FRAME(32, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF6C[] =
|
|
{
|
|
ANIMCMD_FRAME(36, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF74[] =
|
|
{
|
|
ANIMCMD_FRAME(40, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF7C[] =
|
|
{
|
|
ANIMCMD_FRAME(44, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF84[] =
|
|
{
|
|
ANIMCMD_FRAME(48, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF8C[] =
|
|
{
|
|
ANIMCMD_FRAME(52, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF94[] =
|
|
{
|
|
ANIMCMD_FRAME(56, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_0859EF9C[] =
|
|
{
|
|
ANIMCMD_FRAME(60, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_0859EFA4[] =
|
|
{
|
|
gUnknown_0859EF24,
|
|
gUnknown_0859EF2C,
|
|
gUnknown_0859EF34,
|
|
gUnknown_0859EF3C,
|
|
gUnknown_0859EF44,
|
|
gUnknown_0859EF4C,
|
|
gUnknown_0859EF54,
|
|
gUnknown_0859EF5C,
|
|
gUnknown_0859EF64,
|
|
gUnknown_0859EF6C,
|
|
gUnknown_0859EF74,
|
|
gUnknown_0859EF7C,
|
|
gUnknown_0859EF84,
|
|
gUnknown_0859EF8C,
|
|
gUnknown_0859EF94,
|
|
gUnknown_0859EF9C,
|
|
};
|
|
|
|
static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
|
|
|
|
void sub_811F90C(struct PokemonMarkMenu *ptr)
|
|
{
|
|
sMenu = ptr;
|
|
}
|
|
|
|
void sub_811F918(void)
|
|
{
|
|
const struct TilesPal *frame = GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType);
|
|
sMenu->frameTiles = frame->tiles;
|
|
sMenu->framePalette = frame->pal;
|
|
sMenu->tileLoadState = 0;
|
|
CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
|
|
}
|
|
|
|
bool8 sub_811F960(void)
|
|
{
|
|
u16 i;
|
|
u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100;
|
|
|
|
switch (sMenu->tileLoadState)
|
|
{
|
|
case 0:
|
|
CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);
|
|
for (i = 0; i < 6; i++)
|
|
{
|
|
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 + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);
|
|
for (i = 0; i < 6; i++)
|
|
{
|
|
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 + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);
|
|
for (i = 0; i < 6; i++)
|
|
{
|
|
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 sub_811FA90(void)
|
|
{
|
|
sub_811F918();
|
|
while (sub_811F960());
|
|
}
|
|
|
|
void sub_811FAA4(u8 markings, s16 x, s16 y)
|
|
{
|
|
u16 i;
|
|
sMenu->cursorPos = 0;
|
|
sMenu->markings = markings;
|
|
for (i = 0; i < NUM_MON_MARKINGS; i++)
|
|
sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
|
|
sub_811FC80(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
|
|
}
|
|
|
|
void sub_811FAF8(void)
|
|
{
|
|
u16 i;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
FreeSpriteTilesByTag(sMenu->baseTileTag + i);
|
|
FreeSpritePaletteByTag(sMenu->basePaletteTag + i);
|
|
}
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (!sMenu->menuWindowSprites[i])
|
|
return;
|
|
DestroySprite(sMenu->menuWindowSprites[i]);
|
|
sMenu->menuWindowSprites[i] = NULL;
|
|
}
|
|
for (i = 0; i < NUM_MON_MARKINGS; i++)
|
|
{
|
|
if (!sMenu->menuMarkingSprites[i])
|
|
return;
|
|
DestroySprite(sMenu->menuMarkingSprites[i]);
|
|
sMenu->menuMarkingSprites[i] = NULL;
|
|
}
|
|
if (sMenu->unkSprite)
|
|
{
|
|
DestroySprite(sMenu->unkSprite);
|
|
sMenu->unkSprite = NULL;
|
|
}
|
|
if (sMenu->menuTextSprite)
|
|
{
|
|
DestroySprite(sMenu->menuTextSprite);
|
|
sMenu->menuTextSprite = NULL;
|
|
}
|
|
}
|
|
|
|
bool8 sub_811FBA4(void)
|
|
{
|
|
u16 i;
|
|
|
|
if (gMain.newKeys & DPAD_UP)
|
|
{
|
|
s8 pos;
|
|
PlaySE(SE_SELECT);
|
|
pos = --sMenu->cursorPos;
|
|
if (pos < 0)
|
|
sMenu->cursorPos = 5;
|
|
return TRUE;
|
|
}
|
|
|
|
if (gMain.newKeys & DPAD_DOWN)
|
|
{
|
|
s8 pos;
|
|
PlaySE(SE_SELECT);
|
|
pos = ++sMenu->cursorPos;
|
|
if (pos > 5)
|
|
sMenu->cursorPos = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
if (gMain.newKeys & A_BUTTON)
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
|
|
switch (sMenu->cursorPos)
|
|
{
|
|
case 4:
|
|
sMenu->markings = 0;
|
|
for (i = 0; i < NUM_MON_MARKINGS; i++)
|
|
sMenu->markings |= sMenu->markingsArray[i] << i;
|
|
return FALSE;
|
|
case 5:
|
|
return FALSE;
|
|
}
|
|
|
|
sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos];
|
|
return TRUE;
|
|
}
|
|
|
|
if (gMain.newKeys & B_BUTTON)
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void sub_811FC80(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
|
|
{
|
|
u16 i;
|
|
u8 spriteId;
|
|
|
|
struct SpriteSheet sheets[] =
|
|
{
|
|
{ sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag },
|
|
{ gPokenavConditionMarker_Gfx, 0x320, baseTileTag + 1 },
|
|
{ NULL, 0 }
|
|
};
|
|
|
|
struct SpritePalette palettes[] =
|
|
{
|
|
{ sMenu->framePalette, basePaletteTag },
|
|
{ gPokenavConditionMarker_Pal, basePaletteTag + 1},
|
|
{ NULL, 0 }
|
|
};
|
|
|
|
struct SpriteTemplate sprTemplate =
|
|
{
|
|
baseTileTag,
|
|
basePaletteTag,
|
|
&gUnknown_0859EE7C,
|
|
gUnknown_0859EF14,
|
|
NULL,
|
|
gDummySpriteAffineAnimTable,
|
|
TaskDummy7,
|
|
};
|
|
|
|
LoadSpriteSheets(sheets);
|
|
LoadSpritePalettes(palettes);
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1);
|
|
if (spriteId != MAX_SPRITES)
|
|
{
|
|
sMenu->menuWindowSprites[i] = &gSprites[spriteId];
|
|
StartSpriteAnim(&gSprites[spriteId], i);
|
|
}
|
|
else
|
|
{
|
|
sMenu->menuWindowSprites[i] = NULL;
|
|
return;
|
|
}
|
|
}
|
|
|
|
sMenu->menuWindowSprites[1]->pos1.y = y + 96;
|
|
|
|
sprTemplate.tileTag++;
|
|
sprTemplate.paletteTag++;
|
|
sprTemplate.anims = gUnknown_0859EEDC;
|
|
sprTemplate.callback = sub_811FF40;
|
|
sprTemplate.oam = &gUnknown_0859EE84;
|
|
|
|
for (i = 0; i < NUM_MON_MARKINGS; i++)
|
|
{
|
|
spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0);
|
|
if (spriteId != MAX_SPRITES)
|
|
{
|
|
sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
|
|
gSprites[spriteId].data[0] = i;
|
|
}
|
|
else
|
|
{
|
|
sMenu->menuMarkingSprites[i] = NULL;
|
|
return;
|
|
}
|
|
}
|
|
|
|
sprTemplate.callback = SpriteCallbackDummy;
|
|
|
|
spriteId = CreateSprite(&sprTemplate, 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->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET;
|
|
sMenu->menuTextSprite->pos1.y = y + 80;
|
|
CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0);
|
|
}
|
|
else
|
|
{
|
|
sMenu->menuTextSprite = NULL;
|
|
}
|
|
|
|
sprTemplate.callback = sub_811FF7C;
|
|
spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0);
|
|
if (spriteId != MAX_SPRITES)
|
|
{
|
|
sMenu->unkSprite = &gSprites[spriteId];
|
|
sMenu->unkSprite->data[0] = y + 16;
|
|
StartSpriteAnim(sMenu->unkSprite, 8);
|
|
}
|
|
else
|
|
{
|
|
sMenu->unkSprite = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
static void TaskDummy7(struct Sprite *sprite)
|
|
{
|
|
}
|
|
|
|
static void sub_811FF40(struct Sprite *sprite)
|
|
{
|
|
if (sMenu->markingsArray[sprite->data[0]])
|
|
StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
|
|
else
|
|
StartSpriteAnim(sprite, 2 * sprite->data[0]);
|
|
}
|
|
|
|
static void sub_811FF7C(struct Sprite *sprite)
|
|
{
|
|
sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->data[0];
|
|
}
|
|
|
|
struct Sprite *sub_811FF94(u16 tileTag, u16 paletteTag, const u16 *palette)
|
|
{
|
|
if (!palette)
|
|
palette = gUnknown_0859E65C;
|
|
return sub_811FFD4(tileTag, paletteTag, palette, 16);
|
|
}
|
|
|
|
struct Sprite *sub_811FFB4(u16 tileTag, u16 paletteTag, const u16 *palette)
|
|
{
|
|
if (!palette)
|
|
palette = gUnknown_0859E65C;
|
|
return sub_811FFD4(tileTag, paletteTag, palette, 1);
|
|
}
|
|
|
|
static struct Sprite *sub_811FFD4(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
|
|
{
|
|
u8 spriteId;
|
|
struct SpriteTemplate sprTemplate;
|
|
struct SpriteSheet sheet = { gUnknown_0859E67C, 0x80, tileTag };
|
|
struct SpritePalette sprPalette = { palette, paletteTag };
|
|
|
|
sprTemplate.tileTag = tileTag;
|
|
sprTemplate.paletteTag = paletteTag;
|
|
sprTemplate.oam = &gUnknown_0859EF1C;
|
|
sprTemplate.anims = gUnknown_0859EFA4;
|
|
sprTemplate.images = NULL;
|
|
sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
|
|
sprTemplate.callback = TaskDummy7;
|
|
|
|
sheet.size = size * 0x80;
|
|
|
|
LoadSpriteSheet(&sheet);
|
|
LoadSpritePalette(&sprPalette);
|
|
|
|
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
|
|
if (spriteId != MAX_SPRITES)
|
|
return &gSprites[spriteId];
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
void sub_8120084(u8 markings, void *dest)
|
|
{
|
|
RequestDma3Copy(gUnknown_0859E67C + markings * 0x80, dest, 0x80, 0x10);
|
|
}
|