summaryrefslogtreecommitdiff
path: root/include/menu_specialized.h
blob: d1e30d4d6b52818e49299eb9facba4fcb8396183 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef GUARD_MENU_SPECIALIZED_H
#define GUARD_MENU_SPECIALIZED_H

#include "sprite.h"
#include "player_pc.h"
#include "list_menu.h"
#include "pokemon.h"
#include "constants/berry.h"

// Window IDs for the Player PC Mailbox
enum {
    MAILBOXWIN_TITLE,
    MAILBOXWIN_LIST,
    MAILBOXWIN_OPTIONS,
    MAILBOXWIN_COUNT
};

enum {
    TAG_CONDITION_MON = 100,
    TAG_CONDITION_BALL,
    TAG_CONDITION_CANCEL,
    TAG_CONDITION_BALL_PLACEHOLDER,
    TAG_CONDITION_SPARKLE,
    TAG_CONDITION_MON_MARKINGS,
    TAG_CONDITION_MARKINGS_MENU,
    TAG_CONDITION_MARKINGS_MENU_2, // Used implicitly by CreateMonMarkingsMenuSprites
};

enum {
    CONDITION_ICON_SELECTED,
    CONDITION_ICON_UNSELECTED,
};

#define MAX_CONDITION_SPARKLES 10

// The number of extra sparkles shown on a Pokémon's condition screen.
// All Pokémon start with 1, so the max here is MAX_CONDITION_SPARKLES - 1
#define GET_NUM_CONDITION_SPARKLES(sheen)((sheen) != MAX_SHEEN) ? (sheen) / ((u32)MAX_SHEEN / (MAX_CONDITION_SPARKLES - 1) + 1) : MAX_CONDITION_SPARKLES - 1;

#define CONDITION_GRAPH_TOP_Y  56
#define CONDITION_GRAPH_BOTTOM_Y 121
#define CONDITION_GRAPH_HEIGHT  (CONDITION_GRAPH_BOTTOM_Y - CONDITION_GRAPH_TOP_Y + 1)
#define CONDITION_GRAPH_CENTER_X 155
#define CONDITION_GRAPH_CENTER_Y ((CONDITION_GRAPH_BOTTOM_Y + CONDITION_GRAPH_TOP_Y) / 2 + 3)
#define CONDITION_GRAPH_UPDATE_STEPS 10
#define CONDITION_GRAPH_LOAD_MAX 4

// Equivalent to flavor and contest values, but in a different order.
enum {
    CONDITION_COOL,
    CONDITION_TOUGH,
    CONDITION_SMART,
    CONDITION_CUTE,
    CONDITION_BEAUTY,
    CONDITION_COUNT
};

// Yet another order. This one is the same (by coincidence) as the contest categories
enum {
    GRAPH_COOL,
    GRAPH_BEAUTY,
    GRAPH_CUTE,
    GRAPH_SMART,
    GRAPH_TOUGH,
};

struct ConditionGraph
{
    /*0x000*/ u8 conditions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
    /*0x014*/ struct UCoords16 savedPositions[CONDITION_GRAPH_LOAD_MAX][CONDITION_COUNT];
    /*0x064*/ struct UCoords16 newPositions[CONDITION_GRAPH_UPDATE_STEPS][CONDITION_COUNT];
    /*0x12C*/ struct UCoords16 curPositions[CONDITION_COUNT];
    /*0x140*/ u16 scanlineRight[CONDITION_GRAPH_HEIGHT][2];
    /*0x248*/ u16 scanlineLeft[CONDITION_GRAPH_HEIGHT][2];
    /*0x350*/ u16 bottom;
    /*0x352*/ u16 updateCounter;
    /*0x354*/ bool8 needsDraw;
    /*0x355*/ u8 scanlineResetState;
};

// Mailbox menu
bool8 MailboxMenu_Alloc(u8 count);
u8 MailboxMenu_AddWindow(u8 windowIdx);
u8 MailboxMenu_CreateList(struct PlayerPCItemPageStruct *page);
void MailboxMenu_AddScrollArrows(struct PlayerPCItemPageStruct *page);
void MailboxMenu_Free(void);
void MailboxMenu_RemoveWindow(u8 windowIdx);

// Condition graph
void ConditionGraph_Init(struct ConditionGraph *graph);
void ConditionGraph_InitWindow(u8 bg);
void ConditionGraph_InitResetScanline(struct ConditionGraph *graph);
bool8 ConditionGraph_ResetScanline(struct ConditionGraph *graph);
void ConditionGraph_Draw(struct ConditionGraph *graph);
bool8 ConditionGraph_TryUpdate(struct ConditionGraph *graph);
void ConditionGraph_Update(struct ConditionGraph *graph);
void ConditionGraph_CalcPositions(u8 *conditions, struct UCoords16 *positions);
void ConditionGraph_SetNewPositions(struct ConditionGraph *graph, struct UCoords16 *arg1, struct UCoords16 *arg2);

// Condition menu
bool8 ConditionMenu_UpdateMonEnter(struct ConditionGraph *graph, s16 *x);
bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x);
bool8 MoveConditionMonOnscreen(s16 *x);
bool8 MoveConditionMonOffscreen(s16 *x);
void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel);
void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal);
void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals);
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst);

// Condition sparkles
void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal);
void ResetConditionSparkleSprites(struct Sprite **sprites);
void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count);
void DestroyConditionSparkleSprites(struct Sprite **sprites);
void FreeConditionSparkles(struct Sprite **sprites);

// Move relearner
void MoveRelearnerPrintText(u8 *str);
bool16 MoveRelearnerRunTextPrinters(void);
void MoveRelearnerCreateYesNoMenu(void);
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices);
void InitMoveRelearnerWindows(bool8 useContextWindow);

// Level up window
void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);
void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);
void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);

#endif // GUARD_MENU_SPECIALIZED_H