mm/src/code/z_play_hireso.c

1341 lines
67 KiB
C

#include "global.h"
#include "sys_cfb.h"
#include "z64bombers_notebook.h"
#include "interface/schedule_static/schedule_static.h"
#include "archives/schedule_dma_static/schedule_dma_static_yar.h"
#define BOMBERS_NOTEBOOK_ENTRY_SIZE 3
#define BOMBERS_NOTEBOOK_ENTRY_MAX 10
#define BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, entry) (((&sBombersNotebookEntries[row][entry])[0] & 0xF00) >> 8)
#define BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, entry) ((&sBombersNotebookEntries[row][entry])[0] & 0xFF)
#define BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[1])
#define BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[2])
#define BOMBERS_NOTEBOOK_ENTRY(pos, day, event, startTime, endTime) \
((pos)&0xF000) | (((day)&0xF) << 8) | ((event)&0xFF), (startTime), (endTime)
#define BOMBERS_NOTEBOOK_ENTRY_END 0x9999
#define BOMBERS_NOTEBOOK_ENTRY_POS_CENTER 0x0000
#define BOMBERS_NOTEBOOK_ENTRY_POS_BELOW 0x4000
#define BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE 0x8000
typedef enum {
/* 0 */ BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT,
/* 1 */ BOMBERS_NOTEBOOK_EVENT_ICON_MASK,
/* 2 */ BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON
} BombersNotebookEventIcon;
#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE 0xFFF0
#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI 0xFFF1
u16 sBombersNotebookEntries[BOMBERS_NOTEBOOK_PERSON_MAX][BOMBERS_NOTEBOOK_ENTRY_MAX * BOMBERS_NOTEBOOK_ENTRY_SIZE] = {
{
/* Bombers */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Anju */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY,
CLOCK_TIME(13, 45), CLOCK_TIME(16, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING,
CLOCK_TIME(14, 30), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI,
CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI,
CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(17, 0),
CLOCK_TIME(21, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3,
BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(6, 0),
CLOCK_TIME(12, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Kafei */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, CLOCK_TIME(16, 30),
CLOCK_TIME(22, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT,
CLOCK_TIME(18, 0), CLOCK_TIME(19, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Curiosity Shop Man */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK,
CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL,
CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK,
CLOCK_TIME(22, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Old Lady from Bomb Shop */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK,
CLOCK_TIME(0, 30), CLOCK_TIME(1, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Romani */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM,
CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM,
CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE,
CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Cremia */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK,
CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Mayor Dotour */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
CLOCK_TIME(8, 0), CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Madame Aroma */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Toto */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
CLOCK_TIME(5, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
CLOCK_TIME(5, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Gorman */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
CLOCK_TIME(5, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
CLOCK_TIME(5, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Postman */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
CLOCK_TIME(6, 0), CLOCK_TIME(12, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Rosa Sisters */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* ??? */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Anju's Grandmother */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2,
BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Kamaro */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Grog */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Gorman Brothers */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Shiro */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
{
/* Guru-Guru */
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
BOMBERS_NOTEBOOK_ENTRY_END,
},
};
s16 sBombersNotebookDayRectRectLeft[] = { 120, 120, 270, 420 };
TexturePtr sBombersNotebookDayTextures[] = {
gBombersNotebookDay1stENGTex,
gBombersNotebookDay2ndENGTex,
gBombersNotebookDayFinalENGTex,
};
#define DEFINE_EVENT(_enum, icon, _colorFlag, _description, _completedMessage, _completedFlag) icon,
s32 sBombersNotebookEventIcons[] = {
#include "tables/bombers_notebook/event_table.h"
};
#undef DEFINE_EVENT
s32 sBombersNotebookEventIconWidths[] = { 16, 24, 32 };
s32 sBombersNotebookEventIconHeights[] = { 16, 28, 28 };
#define DEFINE_EVENT(_enum, _icon, colorFlag, _description, _completedMessage, _completedFlag) colorFlag,
u16 sBombersNotebookEventColorWeekEventFlags[] = {
#include "tables/bombers_notebook/event_table.h"
};
#undef DEFINE_EVENT
void BombersNotebook_DrawScisTexRect(Gfx** gfxP, s32 rxl, s32 ryl, s32 rxh, s32 ryh, s32 tile, s32 s, s32 t, s32 dsdx,
s32 dtdy) {
s32 xl = rxl - (gCfbLeftAdjust * 4);
s32 yl = ryl - (gCfbUpperAdjust * 4);
s32 xh = rxh - (gCfbLeftAdjust * 4);
s32 yh = ryh - (gCfbUpperAdjust * 4);
Gfx* gfx = *gfxP;
gSPScisTextureRectangle(gfx++, xl, yl, xh, yh, tile, s, t, dsdx, dtdy);
*gfxP = gfx;
}
s16 sBombersNotebookHeaderColors[][3] = {
{ 116, 134, 146 }, // Column 1
{ 158, 156, 131 }, // Column 2
{ 174, 141, 151 }, // Column 3
};
void BombersNotebook_DrawHeaders(Gfx** gfxP) {
Gfx* gfx = *gfxP;
s32 i;
s32 rectLeft;
gDPLoadTextureBlock(gfx++, gBombersNotebookHeaderBoxTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
for (i = 0, rectLeft = 120; i < ARRAY_COUNT(sBombersNotebookHeaderColors); i++, rectLeft += 150) {
gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookHeaderColors[i][0], sBombersNotebookHeaderColors[i][1],
sBombersNotebookHeaderColors[i][2], 192);
BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 74 * 4, (rectLeft + 143) * 4, 98 * 4, 0, 0, 0, 1 << 10,
1 << 10);
}
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
for (i = 0, rectLeft = 124; i < ARRAY_COUNT(sBombersNotebookDayTextures); i++, rectLeft += 150) {
gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 48, 22, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 77 * 4, (rectLeft + 48) * 4, 99 * 4, 0, 0, 0, 1 << 10,
1 << 10);
}
rectLeft = 172;
gDPLoadTextureBlock_4b(gfx++, gBombersNotebook1800Tex, G_IM_FMT_IA, 48, 11, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
for (i = 0; i < 3; i++) {
BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 86 * 4, (rectLeft + 48) * 4, 97 * 4, 0, 0, 0, 1 << 10,
1 << 10);
rectLeft += 150;
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
// Each column/day gets subdivided into 4 sub columns, the first 2 sub columns use 1 color, the last 2 another
s16 sBombersNotebookColumnColors[][2][3] = {
{ { 165, 183, 195 }, { 140, 158, 170 } }, // Column 1
{ { 197, 195, 172 }, { 172, 170, 147 } }, // Column 2
{ { 223, 190, 200 }, { 190, 165, 175 } }, // Column 3
};
void BombersNotebook_DrawColumns(Gfx** gfxP) {
Gfx* gfx = *gfxP;
s16* color;
s32 i;
s32 j;
s32 k;
s32 columnRectLeft;
s32 subColumnRectLeft;
s32 pad;
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookSubColumnBoxTex, G_IM_FMT_I, 48, 1, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
color = &sBombersNotebookColumnColors[0][0][0];
for (i = 0, columnRectLeft = 120; i < ARRAY_COUNT(sBombersNotebookColumnColors); i++, columnRectLeft += 150) {
subColumnRectLeft = columnRectLeft;
for (j = 0; j < 2; j++) {
gDPSetPrimColor(gfx++, 0, 0, color[0], color[1], color[2], 192);
for (k = 0; k < 2; k++) {
BombersNotebook_DrawScisTexRect(&gfx, subColumnRectLeft * 4, 104 * 4, (subColumnRectLeft + 48) * 4,
480 * 4, 0, 0, 0, 1 << 10, 1 << 10);
subColumnRectLeft += 36;
}
color += 3;
}
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
TexturePtr sBombersNotebookEventIconTextures[] = {
gBombersNotebookEntryIconExclamationPointTex,
gBombersNotebookEntryIconMaskTex,
gBombersNotebookEntryIconRibbonTex,
};
s16 sBombersNotebookEntryIconColors[][3] = {
{ 255, 255, 0 },
{ 141, 255, 182 },
{ 255, 100, 60 },
};
void BombersNotebook_DrawEntries(Gfx** gfxP, s32 row, u32 rectTop) {
Gfx* gfx = *gfxP;
s32 entryRectLeft;
u32 eventIcon;
u32 unfinishedEvent = false;
u16 startTime;
u16 endTime;
s32 j = 0;
u32 iconRectLeft;
s32 entryRectRight;
u32 yOffset;
s32 entryWidth;
while (true) {
if (sBombersNotebookEntries[row][j] == BOMBERS_NOTEBOOK_ENTRY_END) {
if (!unfinishedEvent) {
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookStampTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 48, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, 567 * 4, (rectTop + 1) * 4, 599 * 4, (rectTop + 49) * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(gfx++, 255, 0, 0, 255);
BombersNotebook_DrawScisTexRect(&gfx, 565 * 4, (rectTop + -1) * 4, 597 * 4, (rectTop + 47) * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
}
break;
}
if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
yOffset = 8;
} else if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
yOffset = 24;
} else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
yOffset = 16;
}
startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, j) - CLOCK_TIME(6, 0);
endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, j) - CLOCK_TIME(6, 0);
entryRectLeft =
sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (startTime / CLOCK_TIME(0, 10));
entryRectRight =
sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (endTime / CLOCK_TIME(0, 10));
entryWidth = entryRectRight - entryRectLeft - 8;
if ((entryRectRight - entryRectLeft) < 8) {
entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
entryRectRight = entryRectLeft + 8;
}
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
(entryRectLeft + 6) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0, 1 << 10,
1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -2) * 4, (rectTop + yOffset + 2) * 4,
(entryRectRight + 2) * 4, (rectTop + yOffset + 18) * 4, 0, 0x80, 0, 1 << 10,
1 << 10);
if (entryWidth > 0) {
gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 6) * 4, (rectTop + yOffset + 2) * 4,
(entryRectLeft + 6 + entryWidth) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0,
1 << 10, 1 << 10);
}
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
//! FAKE: the ^ 0
BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft * 4) ^ 0, (rectTop + yOffset) * 4, (entryRectLeft + 4) * 4,
(rectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10, 1 << 10);
//! FAKE: the ^ 0
BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -4) * 4, (rectTop + yOffset) * 4,
(entryRectRight * 4) ^ 0, (rectTop + yOffset + 16) * 4, 0, 0x80, 0, 1 << 10,
1 << 10);
if (entryWidth > 0) {
gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 4) * 4, (rectTop + yOffset) * 4,
(entryRectLeft + 4 + entryWidth) * 4, (rectTop + yOffset + 16) * 4, 0, 0, 0,
1 << 10, 1 << 10);
}
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j)])) {
eventIcon =
sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - BOMBERS_NOTEBOOK_PERSON_MAX];
if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[eventIcon]) {
iconRectLeft =
(((entryRectLeft - sBombersNotebookEventIconWidths[eventIcon]) + entryRectRight) - entryRectLeft) +
3;
} else {
iconRectLeft = (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[eventIcon]) / 2) +
entryRectLeft;
}
if ((eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
yOffset -= 12;
} else if (!(sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
// BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
yOffset -= 6;
}
}
gDPLoadTextureBlock(gfx++, sBombersNotebookEventIconTextures[eventIcon], G_IM_FMT_IA, G_IM_SIZ_8b,
sBombersNotebookEventIconWidths[eventIcon], sBombersNotebookEventIconHeights[eventIcon],
0, G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
BombersNotebook_DrawScisTexRect(&gfx, (iconRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
(iconRectLeft + 2 + sBombersNotebookEventIconWidths[eventIcon]) * 4,
(rectTop + yOffset + 2 + sBombersNotebookEventIconHeights[eventIcon]) * 4,
0, 0, 0, 1 << 10, 1 << 10);
if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
BOMBERS_NOTEBOOK_PERSON_MAX] ==
BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE) {
gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
sBombersNotebookEntryIconColors[eventIcon][1],
sBombersNotebookEntryIconColors[eventIcon][2], 255);
} else if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
BOMBERS_NOTEBOOK_PERSON_MAX] ==
BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN)) {
gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
sBombersNotebookEntryIconColors[eventIcon][1],
sBombersNotebookEntryIconColors[eventIcon][2], 255);
} else {
gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
}
} else {
if (CHECK_WEEKEVENTREG(
sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
BOMBERS_NOTEBOOK_PERSON_MAX])) {
gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
sBombersNotebookEntryIconColors[eventIcon][1],
sBombersNotebookEntryIconColors[eventIcon][2], 255);
} else {
gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
}
}
BombersNotebook_DrawScisTexRect(&gfx, iconRectLeft * 4, (rectTop + yOffset) * 4,
(iconRectLeft + sBombersNotebookEventIconWidths[eventIcon]) * 4,
(rectTop + yOffset + sBombersNotebookEventIconHeights[eventIcon]) * 4, 0, 0,
0, 1 << 10, 1 << 10);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
} else {
unfinishedEvent = true;
}
j += BOMBERS_NOTEBOOK_ENTRY_SIZE;
}
*gfxP = gfx;
}
#define DEFINE_PERSON(_enum, photo, _description, _metEnum, _metMessage, _metFlag) photo,
TexturePtr sBombersNotebookPhotoTextures[] = {
#include "tables/bombers_notebook/person_table.h"
};
#undef DEFINE_PERSON
void BombersNotebook_DrawRows(BombersNotebook* this, Gfx** gfxP) {
static s16 sBarColorR = 0;
static s16 sBarColorG = 0;
static s16 sBarColorB = 0;
static s16 sBarColorTimer = 10;
static s16 sBarColorIndex = 0;
static s16 sBarColorTargetsR[] = { 100, 0 };
static s16 sBarColorTargetsG[] = { 80, 0 };
static s16 sBarColorTargetsB[] = { 255, 0 };
Gfx* gfx = *gfxP;
s32 photoWidth;
s32 rowEnd;
s32 cursorPage;
u32 barRectLeft;
f32 photoRectDs;
u32 photoOffset;
s32 i;
u32 rectTop;
s16 colorStep;
colorStep = ABS_ALT(sBarColorR - sBarColorTargetsR[sBarColorIndex]) / sBarColorTimer;
if (sBarColorR >= sBarColorTargetsR[sBarColorIndex]) {
sBarColorR -= colorStep;
} else {
sBarColorR += colorStep;
}
colorStep = ABS_ALT(sBarColorG - sBarColorTargetsG[sBarColorIndex]) / sBarColorTimer;
if (sBarColorG >= sBarColorTargetsG[sBarColorIndex]) {
sBarColorG -= colorStep;
} else {
sBarColorG += colorStep;
}
colorStep = ABS_ALT(sBarColorB - sBarColorTargetsB[sBarColorIndex]) / sBarColorTimer;
if (sBarColorB >= sBarColorTargetsB[sBarColorIndex]) {
sBarColorB -= colorStep;
} else {
sBarColorB += colorStep;
}
sBarColorTimer--;
if (sBarColorTimer == 0) {
sBarColorTimer = 10;
sBarColorR = sBarColorTargetsR[sBarColorIndex];
sBarColorG = sBarColorTargetsG[sBarColorIndex];
sBarColorB = sBarColorTargetsB[sBarColorIndex];
sBarColorIndex ^= 1;
}
rectTop = this->scrollOffset + 107;
if (this->cursorPage >= (BOMBERS_NOTEBOOK_PERSON_MAX - 8)) {
rowEnd = BOMBERS_NOTEBOOK_PERSON_MAX;
i = this->cursorPage;
} else {
rowEnd = this->cursorPage + 8;
i = rowEnd - 8;
}
cursorPage = i;
for (; i < rowEnd; i++, rectTop += 52) {
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
gDPLoadTextureBlock(gfx++, sBombersNotebookPhotoTextures[i], G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
} else {
gDPLoadTextureBlock(gfx++, gBombersNotebookEmptyPhotoTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
}
if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
barRectLeft = 56;
photoOffset = 8;
photoRectDs = 200.0f;
photoWidth = 64;
} else {
barRectLeft = 48;
photoOffset = 0;
photoRectDs = 150.0f;
photoWidth = 48;
}
BombersNotebook_DrawScisTexRect(&gfx, (57 - photoOffset) * 4, (rectTop - photoOffset) * 4,
(57 - photoOffset + photoWidth) * 4, (rectTop - photoOffset + photoWidth) * 4,
0, 0, 0, 1024.0f / (photoRectDs / 100.0f), 1024.0f / (photoRectDs / 100.0f));
if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
gDPSetPrimColor(gfx++, 0, 0, sBarColorR, sBarColorG, sBarColorB, 255);
} else {
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 60);
}
gDPLoadTextureBlock(gfx++, gBombersNotebookBarTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 4, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft + 57) * 4, (rectTop + 22) * 4,
(barRectLeft - photoOffset + 527) * 4, (rectTop + 26) * 4, 0, 0, 0, 1 << 10,
1 << 10);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft - photoOffset + 527) * 4, (rectTop + 16) * 4,
(barRectLeft - photoOffset + 543) * 4, (rectTop + 32) * 4, 0, 0, 0, 1 << 10,
1 << 10);
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
gDPPipeSync(gfx++);
gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
BombersNotebook_DrawEntries(&gfx, i, rectTop);
gDPPipeSync(gfx++);
gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
}
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
TexturePtr sBombersNotebookDigitTextures[] = {
gBombersNotebookDigit0Tex, gBombersNotebookDigit1Tex, gBombersNotebookDigit2Tex, gBombersNotebookDigit3Tex,
gBombersNotebookDigit4Tex, gBombersNotebookDigit5Tex, gBombersNotebookDigit6Tex, gBombersNotebookDigit7Tex,
gBombersNotebookDigit8Tex, gBombersNotebookDigit9Tex,
};
u8 sBombersNotebookDigitRectLeftOffsets[] = { 13, 8, 12, 13, 14, 13, 12, 12, 13, 12 };
s16 sBombersNotebookDayTexRectLeftOffsets[] = { 16, 12, 9 };
#define CURRENT_DAY_CLAMP_MIN_1 ((CURRENT_DAY == 0) ? 1 : CURRENT_DAY)
void BombersNotebook_DrawTimeOfDay(Gfx** gfxP) {
Gfx* gfx = *gfxP;
u32 timeOfDayRectLeft;
u32 timeBoxRectLeft;
u32 connectorRectLeft;
u32 lineRectLeft;
u32 digitsRectLeft;
u16 time;
s32 onesDigit;
s32 tensDigit;
s32 hours;
time = (((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0));
if (CURRENT_DAY == 0) {
time = 0;
}
timeOfDayRectLeft = sBombersNotebookDayRectRectLeft[CURRENT_DAY] + (time / CLOCK_TIME(0, 10));
if ((CURRENT_DAY_CLAMP_MIN_1 == 1) ||
((CURRENT_DAY_CLAMP_MIN_1 == 2) && (((void)0, gSaveContext.save.time) < CLOCK_TIME(12, 0)))) {
timeOfDayRectLeft -= 32;
lineRectLeft = timeOfDayRectLeft + 32;
} else if ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time >= (CLOCK_TIME(17, 0) - CLOCK_TIME(6, 0))) &&
(time <= (CLOCK_TIME(19, 0) - CLOCK_TIME(6, 0)))) {
timeOfDayRectLeft -= 64;
lineRectLeft = timeOfDayRectLeft + 64;
} else {
timeOfDayRectLeft -= 96;
lineRectLeft = timeOfDayRectLeft + 96;
}
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
gDPLoadTextureBlock_4b(gfx++, gBombersNoteoobkTimeOfDayBoxTex, G_IM_FMT_IA, 64, 28, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, timeOfDayRectLeft * 4, 42 * 4, (timeOfDayRectLeft + 128) * 4, 70 * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeOfDayENGTex, G_IM_FMT_I, 96, 20, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (timeOfDayRectLeft + 16) * 4, 47 * 4, (timeOfDayRectLeft + 112) * 4, 67 * 4,
0, 0, 0, 1 << 10, 1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
if (((CURRENT_DAY_CLAMP_MIN_1 >= 3) ||
((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time > (CLOCK_TIME(18, 0) - CLOCK_TIME(6, 0)))))) {
timeBoxRectLeft = timeOfDayRectLeft - 159;
connectorRectLeft = timeOfDayRectLeft - 17;
} else {
timeBoxRectLeft = timeOfDayRectLeft + 130;
connectorRectLeft = timeOfDayRectLeft + 113;
}
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxLeftTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, timeBoxRectLeft * 4, 42 * 4, (timeBoxRectLeft + 16) * 4, 70 * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxMiddleTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 16) * 4, 42 * 4, (timeBoxRectLeft + 141) * 4, 70 * 4, 0, 0,
0, 1 << 10, 1 << 10);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxRightTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 141) * 4, 42 * 4, (timeBoxRectLeft + 157) * 4, 70 * 4, 0,
0, 0, 1 << 10, 1 << 10);
gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[CURRENT_DAY_CLAMP_MIN_1 - 1], G_IM_FMT_IA, G_IM_SIZ_8b, 48,
22, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(
&gfx, (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1]) * 4, 46 * 4,
(timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1] + 48) * 4, 68 * 4, 0, 0,
0, 1 << 10, 1 << 10);
gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 255);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 56) * 4, 48 * 4, (timeBoxRectLeft + 72) * 4, 0x100, 0, 0,
0, 1 << 10, 1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
tensDigit = 0;
onesDigit = ((void)0, gSaveContext.save.time) / CLOCK_TIME_HOUR;
if (CURRENT_DAY == 0) {
onesDigit = 6;
}
hours = onesDigit;
do {
if (onesDigit >= 10) {
tensDigit++;
onesDigit -= 10;
}
} while (onesDigit >= 10);
digitsRectLeft = timeBoxRectLeft + 75;
gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
1 << 10, 1 << 10);
digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
1 << 10, 1 << 10);
digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[onesDigit];
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookColonTex, G_IM_FMT_I, 16, 17, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
1 << 10, 1 << 10);
digitsRectLeft += 7;
tensDigit = 0;
if (CURRENT_DAY == 0) {
onesDigit = TIME_TO_MINUTES_ALT_F((CLOCK_TIME_F(6, 0) - (hours * CLOCK_TIME_HOUR_F)));
} else {
onesDigit = TIME_TO_MINUTES_ALT_F(((void)0, gSaveContext.save.time) - (hours * CLOCK_TIME_HOUR_F));
}
do {
if (onesDigit >= 10) {
tensDigit++;
onesDigit -= 10;
}
} while (onesDigit >= 10);
gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
1 << 10, 1 << 10);
digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 14, 0,
G_TX_MIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, connectorRectLeft * 4, 49 * 4, (connectorRectLeft + 32) * 4, 63 * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPSetPrimColor(gfx++, 0, 0, 242, 0, 14, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookLineTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 1, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, lineRectLeft * 4, 74 * 4, (lineRectLeft + 32) * 4, 490 * 4, 0, 0, 0, 1 << 10,
1 << 10);
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(gfx++, 200, 0, 0, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, (lineRectLeft + -11) * 4, 70 * 4, (lineRectLeft + 13) * 4, 86 * 4, 0, 0, 0,
1 << 10, 1 << 10);
gDPPipeSync(gfx++);
*gfxP = gfx;
}
void BombersNotebook_DrawCursor(BombersNotebook* this, Gfx** gfxP) {
Gfx* gfx = *gfxP;
s32 cursorRow;
s32 cursorEntry;
s32 entryRectRight;
s32 entryRectLeft;
s32 entryIcon;
u32 cursorRectLeft;
u32 cursorRectTop;
u32 yOffset;
u16 startTime;
u16 endTime;
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gfx++, 0, 0, 255, 205, 55, 255);
gDPSetEnvColor(gfx++, 0, 0, 0, 255);
gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_MIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD);
if (this->cursorEntry == 0) {
BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 97) * 4, 63 * 4,
(this->cursorPageRow * 52 + 113) * 4, 0, 0, 0, 1 << 10, 1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 97) * 4, 114 * 4,
(this->cursorPageRow * 52 + 113) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 147) * 4, 63 * 4,
(this->cursorPageRow * 52 + 163) * 4, 0, 0, 0x200, 1 << 10, 1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 147) * 4, 114 * 4,
(this->cursorPageRow * 52 + 163) * 4, 0, 0x200, 0x200, 1 << 10, 1 << 10);
} else {
cursorRow = this->cursorPageRow + this->cursorPage;
cursorRectTop = (this->cursorPageRow * 52) + 107;
cursorEntry = this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE; // Offset from photo entry
if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
yOffset = 8;
} else if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
yOffset = 24;
} else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
yOffset = 16;
}
startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
entryRectLeft = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
(startTime / CLOCK_TIME(0, 10));
entryRectRight = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
(endTime / CLOCK_TIME(0, 10));
if ((entryRectRight - entryRectLeft) < 8) {
entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
entryRectRight = entryRectLeft + 8;
}
entryIcon = sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(cursorRow, cursorEntry) -
BOMBERS_NOTEBOOK_PERSON_MAX];
if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[entryIcon]) {
cursorRectLeft =
(((entryRectLeft - sBombersNotebookEventIconWidths[entryIcon]) + entryRectRight) - entryRectLeft) + 3;
} else {
cursorRectLeft =
(((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[entryIcon]) / 2) + entryRectLeft;
}
if (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT) {
cursorRectLeft -= 8;
cursorRectTop -= 8;
} else {
cursorRectLeft -= 9;
cursorRectTop -= 8;
}
if ((entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
yOffset -= 12;
} else if (!(sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
// BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
yOffset -= 6;
}
}
BombersNotebook_DrawScisTexRect(&gfx, cursorRectLeft * 4, (cursorRectTop + yOffset) * 4,
(cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10,
1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
(cursorRectTop + yOffset) * 4,
(cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
(cursorRectTop + yOffset + 16) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
BombersNotebook_DrawScisTexRect(
&gfx, cursorRectLeft * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
(cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) * 4,
0, 0, 0x200, 1 << 10, 1 << 10);
BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
(cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
(cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
(cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) *
4,
0, 0x200, 0x200, 1 << 10, 1 << 10);
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
void BombersNotebook_DrawArrows(BombersNotebook* this, Gfx** gfxP) {
static s16 sUpperArrowColorR = 0;
static s16 sUpperArrowColorG = 100;
static s16 sUpperArrowColorB = 255;
static s16 sLowerArrowColorR = 0;
static s16 sLowerArrowColorG = 100;
static s16 sLowerArrowColorB = 255;
static s16 sUpperArrowColorIndex = 0;
static s16 sLowerArrowColorIndex = 0;
static s16 sUpperArrowColorTimer = 6;
static s16 sLowerArrowColorTimer = 6;
static s16 sUpperArrowOffsetY = 0;
static s16 sLowerArrowOffsetY = 0;
static s16 sArrowColorTargetsG[] = { 175, 100 };
static s16 sArrowColorTargetsB[] = { 205, 255 };
Gfx* gfx = *gfxP;
u32 rectTop;
s16 colorStep;
gDPPipeSync(gfx++);
gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, 4, G_TX_NOLOD, G_TX_NOLOD);
colorStep = ABS_ALT(sUpperArrowColorG - sArrowColorTargetsG[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
if (sUpperArrowColorG >= sArrowColorTargetsG[sUpperArrowColorIndex]) {
sUpperArrowColorG -= colorStep;
} else {
sUpperArrowColorG += colorStep;
}
colorStep = ABS_ALT(sUpperArrowColorB - sArrowColorTargetsB[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
if (sUpperArrowColorB >= sArrowColorTargetsB[sUpperArrowColorIndex]) {
sUpperArrowColorB -= colorStep;
} else {
sUpperArrowColorB += colorStep;
}
sUpperArrowColorTimer--;
if (sUpperArrowColorTimer == 0) {
sUpperArrowOffsetY ^= 6;
sUpperArrowColorTimer = 6;
sUpperArrowColorG = sArrowColorTargetsG[sUpperArrowColorIndex];
sUpperArrowColorB = sArrowColorTargetsB[sUpperArrowColorIndex];
sUpperArrowColorIndex ^= 1;
}
colorStep = ABS_ALT(sLowerArrowColorG - sArrowColorTargetsG[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
if (sLowerArrowColorG >= sArrowColorTargetsG[sLowerArrowColorIndex]) {
sLowerArrowColorG -= colorStep;
} else {
sLowerArrowColorG += colorStep;
}
colorStep = ABS_ALT(sLowerArrowColorB - sArrowColorTargetsB[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
if (sLowerArrowColorB >= sArrowColorTargetsB[sLowerArrowColorIndex]) {
sLowerArrowColorB -= colorStep;
} else {
sLowerArrowColorB += colorStep;
}
sLowerArrowColorTimer--;
if (sLowerArrowColorTimer == 0) {
sLowerArrowOffsetY ^= 6;
sLowerArrowColorTimer = 6;
sLowerArrowColorG = sArrowColorTargetsG[sLowerArrowColorIndex];
sLowerArrowColorB = sArrowColorTargetsB[sLowerArrowColorIndex];
sLowerArrowColorIndex ^= 1;
}
if (this->cursorPage != 0) {
gDPPipeSync(gfx++);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gfx++, 0, 0, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
gDPSetEnvColor(gfx++, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
rectTop = (-sUpperArrowOffsetY + 83) * 4;
BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, rectTop, 70 * 4, rectTop + (16 * 4), 0, 0, 0x200, 1 << 10,
1 << 10);
}
if (this->cursorPage < 16) {
gDPPipeSync(gfx++);
gDPSetPrimColor(gfx++, 0, 0, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
gDPSetEnvColor(gfx++, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, (sLowerArrowOffsetY + 319) * 4, 70 * 4,
(sLowerArrowOffsetY + 335) * 4, 0, 0, 0, 1 << 10, 1 << 10);
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx) {
Gfx* gfx;
s32 pad[2];
func_8012CF0C(gfxCtx, this->loadState != BOMBERS_NOTEBOOK_LOAD_STATE_DONE, false, 0, 0, 0);
OPEN_DISPS(gfxCtx);
gfx = POLY_OPA_DISP;
if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
gSPSegment(gfx++, 0x07, this->scheduleDmaSegment);
gSPSegment(gfx++, 0x08, this->scheduleSegment);
gfx = Gfx_SetupDL39(gfx);
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetPrimColor(gfx++, 0, 0, 255, 255, 215, 255);
gDPSetEnvColor(gfx++, 100, 100, 100, 255);
gDPLoadTextureBlock(gfx++, gBombersNotebookBackgroundTex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
BombersNotebook_DrawScisTexRect(&gfx, 0 * 4, 0 * 4, SCREEN_WIDTH_HIRES * 4, SCREEN_HEIGHT_HIRES * 4, 0, 0, 0,
0x200, 0x200);
gDPPipeSync(gfx++);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
BombersNotebook_DrawHeaders(&gfx);
BombersNotebook_DrawColumns(&gfx);
gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 86, 600, 450);
BombersNotebook_DrawRows(this, &gfx);
gDPPipeSync(gfx++);
gSPDisplayList(gfx++, D_0E000000.setScissor);
BombersNotebook_DrawTimeOfDay(&gfx);
if (this->scrollAmount == 0) {
BombersNotebook_DrawCursor(this, &gfx);
}
BombersNotebook_DrawArrows(this, &gfx);
}
POLY_OPA_DISP = gfx;
CLOSE_DISPS(gfxCtx);
}
void BombersNotebook_LoadFiles(BombersNotebook* this, s32 flag) {
switch (this->loadState) {
case BOMBERS_NOTEBOOK_LOAD_STATE_NONE:
if (this->scheduleDmaSegment == NULL) {
break;
}
CmpDma_LoadAllFiles(this->scheduleDmaSegmentStart, this->scheduleDmaSegment, this->scheduleDmaSegmentSize);
osCreateMesgQueue(&this->loadQueue, this->loadMsg, ARRAY_COUNT(this->loadMsg));
DmaMgr_SendRequestImpl(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart,
this->scheduleSegmentSize, 0, &this->loadQueue, NULL);
this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_STARTED;
// fallthrough
case BOMBERS_NOTEBOOK_LOAD_STATE_STARTED:
if (osRecvMesg(&this->loadQueue, NULL, flag) == 0) {
this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_DONE;
}
break;
default:
break;
}
}
#define DEFINE_PERSON(_enum, _photo, description, _metEnum, _metMessage, _metFlag) description,
#define DEFINE_EVENT(_enum, _icon, _colorFlag, description, _completedMessage, _completedFlag) description,
u16 sBombersNotebookTextIds[] = {
#include "tables/bombers_notebook/person_table.h"
#include "tables/bombers_notebook/event_table.h"
};
#undef DEFINE_PERSON
#undef DEFINE_EVENT
void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input) {
static s16 sStickXRepeatTimer = 0;
static s16 sStickYRepeatTimer = 0;
static s16 sStickXRepeatState = 0;
static s16 sStickYRepeatState = 0;
s32 stickAdjX = input->rel.stick_x;
s32 stickAdjY = input->rel.stick_y;
s32 cursorEntryScan;
this->scheduleDmaSegmentStart = SEGMENT_ROM_START(schedule_dma_static_yar);
this->scheduleDmaSegmentSize = SEGMENT_ROM_SIZE(schedule_dma_static_syms);
this->scheduleSegmentStart = SEGMENT_ROM_START(schedule_static);
this->scheduleSegmentSize = SEGMENT_ROM_SIZE(schedule_static);
if (this->scheduleDmaSegment == NULL) {
this->scheduleDmaSegment = ZeldaArena_Malloc(this->scheduleDmaSegmentSize);
}
if (this->scheduleSegment == NULL) {
this->scheduleSegment = ZeldaArena_Malloc(this->scheduleSegmentSize);
}
BombersNotebook_LoadFiles(this, OS_MESG_NOBLOCK);
if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
if (stickAdjX < -30) {
if (sStickXRepeatState == -1) {
sStickXRepeatTimer--;
if (sStickXRepeatTimer < 0) {
sStickXRepeatTimer = 2;
} else {
stickAdjX = 0;
}
} else {
sStickXRepeatTimer = 10;
sStickXRepeatState = -1;
}
} else if (stickAdjX > 30) {
if (sStickXRepeatState == 1) {
sStickXRepeatTimer--;
if (sStickXRepeatTimer < 0) {
sStickXRepeatTimer = 2;
} else {
stickAdjX = 0;
}
} else {
sStickXRepeatTimer = 10;
sStickXRepeatState = 1;
}
} else {
sStickXRepeatState = 0;
}
if (stickAdjY < -30) {
if (sStickYRepeatState == -1) {
sStickYRepeatTimer--;
if (sStickYRepeatTimer < 0) {
sStickYRepeatTimer = 2;
} else {
stickAdjY = 0;
}
} else {
sStickYRepeatTimer = 10;
sStickYRepeatState = -1;
}
} else if (stickAdjY > 30) {
if (sStickYRepeatState == 1) {
sStickYRepeatTimer--;
if (sStickYRepeatTimer < 0) {
sStickYRepeatTimer = 2;
} else {
stickAdjY = 0;
}
} else {
sStickYRepeatTimer = 10;
sStickYRepeatState = 1;
}
} else {
sStickYRepeatState = 0;
}
if (this->scrollAmount == 0) {
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[this->cursorPageRow + this->cursorPage])) {
cursorEntryScan = this->cursorEntry;
if (stickAdjX > 30) {
while (true) {
cursorEntryScan += BOMBERS_NOTEBOOK_ENTRY_SIZE;
if (sBombersNotebookEntries[this->cursorPageRow + this->cursorPage]
[cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE] ==
BOMBERS_NOTEBOOK_ENTRY_END) {
while (true) {
cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
if (cursorEntryScan == 0) {
Audio_PlaySfx(NA_SE_SY_ERROR);
break;
}
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
this->cursorPageRow + this->cursorPage,
cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
Audio_PlaySfx(NA_SE_SY_ERROR);
break;
}
}
break;
}
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
this->cursorPageRow + this->cursorPage,
cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
break;
}
}
this->cursorEntry = cursorEntryScan;
} else if (stickAdjX < -30) {
if (cursorEntryScan != 0) {
do {
cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
this->cursorPageRow + this->cursorPage,
cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
break;
}
} while (cursorEntryScan != 0);
this->cursorEntry = cursorEntryScan;
}
}
if (this->cursorEntry != 0) {
if (play->msgCtx.currentTextId !=
sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
this->cursorPageRow + this->cursorPage, this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]) {
Message_ContinueTextbox(play, sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
this->cursorPageRow + this->cursorPage,
this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]);
}
} else {
if (play->msgCtx.currentTextId != sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]) {
Message_ContinueTextbox(play, sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]);
}
}
} else {
Message_CloseTextbox(play);
}
if (stickAdjY < -30) {
if (this->cursorPageRow < 3) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
this->cursorEntry = 0;
this->cursorPageRow++;
} else if (this->cursorPage < (BOMBERS_NOTEBOOK_PERSON_MAX - 4)) {
if (sStickYRepeatState == -1) {
this->scrollAmount = -24;
} else {
this->scrollAmount = -12;
}
this->scrollOffset = 0;
this->cursorEntry = 0;
}
} else if (stickAdjY > 30) {
if (this->cursorPageRow > 0) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
this->cursorEntry = 0;
this->cursorPageRow--;
} else if (this->cursorPage != 0) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
this->cursorPage--;
if (sStickYRepeatState == 1) {
this->scrollAmount = 24;
} else {
this->scrollAmount = 12;
}
this->scrollOffset = -48;
this->cursorEntry = 0;
}
}
} else if (this->scrollAmount < 0) {
this->scrollOffset += this->scrollAmount;
if (ABS_ALT(this->scrollOffset) >= 48) {
Audio_PlaySfx(NA_SE_SY_CURSOR);
this->scrollOffset = 0;
this->scrollAmount = 0;
this->cursorPage++;
}
} else {
this->scrollOffset += this->scrollAmount;
if (this->scrollOffset == 0) {
this->scrollOffset = 0;
this->scrollAmount = 0;
}
}
}
}
void BombersNotebook_Init(BombersNotebook* this) {
bzero(this, sizeof(BombersNotebook));
}
void BombersNotebook_Destroy(BombersNotebook* this) {
if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_STARTED) {
BombersNotebook_LoadFiles(this, OS_MESG_BLOCK);
}
if (this->scheduleDmaSegment != NULL) {
ZeldaArena_Free(this->scheduleDmaSegment);
this->scheduleDmaSegment = NULL;
}
//! @bug: Does not free malloc'd memory for schedule segment
}