summaryrefslogtreecommitdiff
path: root/src/mon_markings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mon_markings.c')
-rw-r--r--src/mon_markings.c617
1 files changed, 617 insertions, 0 deletions
diff --git a/src/mon_markings.c b/src/mon_markings.c
new file mode 100644
index 000000000..dcdc54434
--- /dev/null
+++ b/src/mon_markings.c
@@ -0,0 +1,617 @@
+#include "global.h"
+#include "main.h"
+#include "menu_cursor.h"
+#include "text_window.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "mon_markings.h"
+
+#ifdef GERMAN
+#define MENU_TEXT_SPRITE_X_OFFSET 24
+#else
+#define MENU_TEXT_SPRITE_X_OFFSET 32
+#endif
+
+extern u8 gPokenavConditionMenuMisc_Gfx[];
+extern u16 gUnknown_08E966B8[];
+
+const u16 gUnknown_083E49F4[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
+const u8 gUnknown_083E4A14[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
+
+const struct OamData gOamData_83E5214 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gOamData_83E521C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E5224[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E522C[] =
+{
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5234[] =
+{
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E523C[] =
+{
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5244[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E524C[] =
+{
+ ANIMCMD_FRAME(5, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5254[] =
+{
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E525C[] =
+{
+ ANIMCMD_FRAME(7, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5264[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E526C[] =
+{
+ ANIMCMD_FRAME(9, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E5274[] =
+{
+ gSpriteAnim_83E5224,
+ gSpriteAnim_83E522C,
+ gSpriteAnim_83E5234,
+ gSpriteAnim_83E523C,
+ gSpriteAnim_83E5244,
+ gSpriteAnim_83E524C,
+ gSpriteAnim_83E5254,
+ gSpriteAnim_83E525C,
+ gSpriteAnim_83E5264,
+ gSpriteAnim_83E526C,
+};
+
+const union AnimCmd gSpriteAnim_83E529C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52A4[] =
+{
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E52AC[] =
+{
+ gSpriteAnim_83E529C,
+ gSpriteAnim_83E52A4,
+};
+
+const struct OamData gOamData_83E52B4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E52BC[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52C4[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52CC[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52D4[] =
+{
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52DC[] =
+{
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52E4[] =
+{
+ ANIMCMD_FRAME(20, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52EC[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52F4[] =
+{
+ ANIMCMD_FRAME(28, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52FC[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5304[] =
+{
+ ANIMCMD_FRAME(36, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E530C[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5314[] =
+{
+ ANIMCMD_FRAME(44, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E531C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5324[] =
+{
+ ANIMCMD_FRAME(52, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E532C[] =
+{
+ ANIMCMD_FRAME(56, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5334[] =
+{
+ ANIMCMD_FRAME(60, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E533C[] =
+{
+ gSpriteAnim_83E52BC,
+ gSpriteAnim_83E52C4,
+ gSpriteAnim_83E52CC,
+ gSpriteAnim_83E52D4,
+ gSpriteAnim_83E52DC,
+ gSpriteAnim_83E52E4,
+ gSpriteAnim_83E52EC,
+ gSpriteAnim_83E52F4,
+ gSpriteAnim_83E52FC,
+ gSpriteAnim_83E5304,
+ gSpriteAnim_83E530C,
+ gSpriteAnim_83E5314,
+ gSpriteAnim_83E531C,
+ gSpriteAnim_83E5324,
+ gSpriteAnim_83E532C,
+ gSpriteAnim_83E5334,
+};
+
+static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
+
+static void sub_80F761C(s16, s16, u16, u16);
+static void nullsub_65(struct Sprite *);
+static void sub_80F78CC(struct Sprite *);
+static void sub_80F7908(struct Sprite *);
+static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16);
+
+void sub_80F727C(struct PokemonMarkMenu *ptr)
+{
+ sMenu = ptr;
+ sMenu->spriteSheetLoadRequired = FALSE;
+}
+
+void sub_80F728C(void)
+{
+ const struct FrameGraphics *frame = TextWindow_GetFrameGraphics(gSaveBlock2.optionsWindowFrameType);
+ sMenu->frameTiles = frame->tiles;
+ sMenu->framePalette = frame->palette;
+ sMenu->tileLoadState = 0;
+ CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
+}
+
+bool8 sub_80F72D4(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_80F7404(void)
+{
+ sub_80F728C();
+ while (sub_80F72D4())
+ ;
+}
+
+void sub_80F7418(u8 markings, s16 x, s16 y)
+{
+ u16 i;
+ sMenu->cursorPos = 0;
+ sMenu->markings = markings;
+ for (i = 0; i < 4; i++)
+ sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
+ DestroyMenuCursor();
+ sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
+}
+
+void sub_80F7470(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++)
+ {
+ if (!sMenu->menuWindowSprites[i])
+ return;
+ DestroySprite(sMenu->menuWindowSprites[i]);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!sMenu->menuMarkingSprites[i])
+ return;
+ DestroySprite(sMenu->menuMarkingSprites[i]);
+ }
+
+ DestroyMenuCursor();
+
+ if (sMenu->menuTextSprite)
+ DestroySprite(sMenu->menuTextSprite);
+}
+
+bool8 sub_80F7500(void)
+{
+ u16 i;
+ struct SpriteSheet sheets[3] =
+ {
+ { sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag },
+ { gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 },
+ { NULL, 0, 0 }
+ };
+
+ if (sMenu->spriteSheetLoadRequired)
+ {
+ LoadTilesForSpriteSheets(sheets);
+ sMenu->spriteSheetLoadRequired = FALSE;
+ }
+
+ 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 < 4; 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;
+}
+
+void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
+{
+ u16 i;
+ u8 spriteId;
+
+ struct SpriteSheet sheets[] =
+ {
+ { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag },
+ { gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 },
+ { NULL, 0 }
+ };
+
+ struct SpritePalette palettes[] =
+ {
+ { sMenu->framePalette, basePaletteTag },
+ { gUnknown_08E966B8, basePaletteTag + 1},
+ { NULL, 0 }
+ };
+
+ struct SpriteTemplate sprTemplate =
+ {
+ baseTileTag,
+ basePaletteTag,
+ &gOamData_83E5214,
+ gSpriteAnimTable_83E52AC,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ nullsub_65,
+ };
+
+ sMenu->spriteSheetLoadRequired = TRUE;
+ AllocTilesForSpriteSheets(sheets);
+ LoadSpritePalettes(palettes);
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 2);
+ if (spriteId != 64)
+ {
+ 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 = gSpriteAnimTable_83E5274;
+ sprTemplate.callback = sub_80F78CC;
+ sprTemplate.oam = &gOamData_83E521C;
+
+ for (i = 0; i < 4; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 1);
+ if (spriteId != 64)
+ {
+ sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
+ gSprites[spriteId].data[0] = i;
+ }
+ else
+ {
+ sMenu->menuMarkingSprites[i] = NULL;
+ return;
+ }
+ }
+
+ sprTemplate.callback = SpriteCallbackDummy;
+
+ spriteId = CreateSprite(&sprTemplate, 0, 0, 1);
+
+ if (spriteId != 64)
+ {
+ sMenu->menuTextSprite = &gSprites[spriteId];
+ sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE;
+ sMenu->menuTextSprite->oam.size = 3;
+ 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;
+ }
+
+ sMenu->cursorBaseY = y + 8;
+ MenuCursor_Create814A5C0(0, basePaletteTag + 1, 15, 0, 0x30);
+ MenuCursor_SetPos814A880(x + 8, sMenu->cursorBaseY);
+ sub_814AABC(sub_80F7908);
+}
+
+void nullsub_65(struct Sprite *sprite)
+{
+}
+
+void sub_80F78CC(struct Sprite *sprite)
+{
+ if (sMenu->markingsArray[sprite->data[0]])
+ StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
+ else
+ StartSpriteAnim(sprite, 2 * sprite->data[0]);
+}
+
+void sub_80F7908(struct Sprite *sprite)
+{
+ sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY;
+}
+
+struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette)
+{
+ if (!palette)
+ palette = gUnknown_083E49F4;
+ return sub_80F7960(tileTag, paletteTag, palette, 16);
+}
+
+struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette)
+{
+ if (!palette)
+ palette = gUnknown_083E49F4;
+ return sub_80F7960(tileTag, paletteTag, palette, 1);
+}
+
+struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
+{
+ u8 spriteId;
+ struct SpriteTemplate sprTemplate;
+ struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag };
+ struct SpritePalette sprPalette = { palette, paletteTag };
+
+ sprTemplate.tileTag = tileTag;
+ sprTemplate.paletteTag = paletteTag;
+ sprTemplate.oam = &gOamData_83E52B4;
+ sprTemplate.anims = gSpriteAnimTable_83E533C;
+ sprTemplate.images = NULL;
+ sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sprTemplate.callback = nullsub_65;
+
+ sheet.size = size * 0x80;
+
+ LoadSpriteSheet(&sheet);
+ LoadSpritePalette(&sprPalette);
+
+ spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
+ if (spriteId != 64)
+ return &gSprites[spriteId];
+ else
+ return NULL;
+}
+
+void sub_80F7A10(u8 markings, void *dest)
+{
+ DmaCopy16Defvars(3, gUnknown_083E4A14 + markings * 0x80, dest, 0x80);
+}