mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-09-06 18:01:04 -04:00
Implement & link m_birthday_ovl
This commit is contained in:
@@ -0,0 +1,267 @@
|
||||
#include "m_birthday_ovl.h"
|
||||
|
||||
#include "m_common_data.h"
|
||||
#include "m_font.h"
|
||||
#include "sys_matrix.h"
|
||||
|
||||
static mBR_Ovl_c birthday_ovl_data;
|
||||
|
||||
static void mBR_window_close(Submenu* submenu, mSM_MenuInfo_c* menu_info, mBR_Ovl_c* birthday_ovl) {
|
||||
u16* data_p = birthday_ovl->birthday_data;
|
||||
|
||||
(*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP);
|
||||
Common_Get(now_private)->birthday.month = data_p[mBR_Ovl_IDX_MONTH];
|
||||
Common_Get(now_private)->birthday.day = data_p[mBR_Ovl_IDX_DAY];
|
||||
sAdo_SysTrgStart(2);
|
||||
}
|
||||
|
||||
static void mBR_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
||||
(*submenu->overlay->move_Move_proc)(submenu, menu_info);
|
||||
}
|
||||
|
||||
static void mBR_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
||||
static lbRTC_time_c work_time = { 0, 0, 0, 1, lbRTC_SUNDAY, lbRTC_JANUARY, 2000 };
|
||||
mBR_Ovl_c* birthday_ovl = submenu->overlay->birthday_ovl;
|
||||
int* idx_p = &birthday_ovl->idx;
|
||||
u16* data_p = birthday_ovl->birthday_data;
|
||||
u32 trigger = submenu->overlay->menu_control.trigger;
|
||||
|
||||
if ((trigger & (BUTTON_B | BUTTON_CLEFT))) {
|
||||
if (*idx_p != 0) {
|
||||
(*idx_p)--;
|
||||
sAdo_SysTrgStart(0x1003);
|
||||
}
|
||||
}
|
||||
else if ((trigger & BUTTON_START)) {
|
||||
mBR_window_close(submenu, menu_info, birthday_ovl);
|
||||
}
|
||||
else if ((trigger & (BUTTON_A | BUTTON_CRIGHT))) {
|
||||
if (*idx_p == mBR_Ovl_IDX_OK) {
|
||||
if ((trigger & BUTTON_CRIGHT) == 0) {
|
||||
mBR_window_close(submenu, menu_info, birthday_ovl);
|
||||
}
|
||||
}
|
||||
else {
|
||||
(*idx_p)++;
|
||||
sAdo_SysTrgStart(0xD);
|
||||
}
|
||||
}
|
||||
else if ((trigger & (BUTTON_CUP | BUTTON_CDOWN))) {
|
||||
if (*idx_p != mBR_Ovl_IDX_OK) {
|
||||
if ((trigger & BUTTON_CDOWN)) {
|
||||
data_p[*idx_p]--;
|
||||
}
|
||||
else {
|
||||
data_p[*idx_p]++;
|
||||
}
|
||||
|
||||
work_time.day = data_p[mBR_Ovl_IDX_DAY];
|
||||
work_time.month = data_p[mBR_Ovl_IDX_MONTH];
|
||||
if (!lbRTC_IsValidTime(&work_time)) {
|
||||
if (
|
||||
(
|
||||
*idx_p == mBR_Ovl_IDX_MONTH &&
|
||||
data_p[mBR_Ovl_IDX_MONTH] != 0 &&
|
||||
data_p[mBR_Ovl_IDX_MONTH] < 13
|
||||
) || (
|
||||
(trigger & BUTTON_CDOWN) &&
|
||||
*idx_p == mBR_Ovl_IDX_DAY
|
||||
)
|
||||
) {
|
||||
work_time.day = 31;
|
||||
while (!lbRTC_IsValidTime(&work_time)) {
|
||||
work_time.day--;
|
||||
}
|
||||
|
||||
data_p[mBR_Ovl_IDX_DAY] = work_time.day;
|
||||
}
|
||||
else if ((trigger & BUTTON_CUP)) {
|
||||
data_p[*idx_p] = 1;
|
||||
}
|
||||
else {
|
||||
data_p[mBR_Ovl_IDX_MONTH] = lbRTC_DECEMBER;
|
||||
}
|
||||
}
|
||||
|
||||
sAdo_SysTrgStart(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void mBR_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
||||
(*submenu->overlay->move_End_proc)(submenu, menu_info);
|
||||
}
|
||||
|
||||
typedef void (*mBR_OVL_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*);
|
||||
|
||||
static void mBR_birthday_ovl_move(Submenu* submenu) {
|
||||
static mBR_OVL_MOVE_PROC ovl_move_proc[mSM_OVL_PROC_NUM] = {
|
||||
&mBR_move_Move,
|
||||
&mBR_move_Play,
|
||||
(mBR_OVL_MOVE_PROC)none_proc1,
|
||||
(mBR_OVL_MOVE_PROC)none_proc1,
|
||||
&mBR_move_End
|
||||
};
|
||||
|
||||
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_BIRTHDAY];
|
||||
|
||||
(*menu_info->pre_move_func)(submenu);
|
||||
(*ovl_move_proc[menu_info->proc_status])(submenu, menu_info);
|
||||
}
|
||||
|
||||
extern Gfx birthday_win_mode[];
|
||||
extern Gfx birthday_win_model[];
|
||||
extern Gfx brt_win_month_model[];
|
||||
|
||||
extern u8 tim_win_january_tex_rgb_i4[];
|
||||
extern u8 tim_win_february_tex_rgb_i4[];
|
||||
extern u8 tim_win_march_tex_rgb_i4[];
|
||||
extern u8 tim_win_april_tex_rgb_i4[];
|
||||
extern u8 tim_win_may_tex_rgb_i4[];
|
||||
extern u8 tim_win_june_tex_rgb_i4[];
|
||||
extern u8 tim_win_july_tex_rgb_i4[];
|
||||
extern u8 tim_win_august_tex_rgb_i4[];
|
||||
extern u8 tim_win_september_tex_rgb_i4[];
|
||||
extern u8 tim_win_october_tex_rgb_i4[];
|
||||
extern u8 tim_win_november_tex_rgb_i4[];
|
||||
extern u8 tim_win_december_tex_rgb_i4[];
|
||||
|
||||
static void mBR_set_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game) {
|
||||
static u8 chr_table[21] = "When's your birthday?";
|
||||
static u8 close_table[2] = "OK";
|
||||
static u8* month_tex[lbRTC_MONTHS_MAX] = {
|
||||
tim_win_january_tex_rgb_i4,
|
||||
tim_win_february_tex_rgb_i4,
|
||||
tim_win_march_tex_rgb_i4,
|
||||
tim_win_april_tex_rgb_i4,
|
||||
tim_win_may_tex_rgb_i4,
|
||||
tim_win_june_tex_rgb_i4,
|
||||
tim_win_july_tex_rgb_i4,
|
||||
tim_win_august_tex_rgb_i4,
|
||||
tim_win_september_tex_rgb_i4,
|
||||
tim_win_october_tex_rgb_i4,
|
||||
tim_win_november_tex_rgb_i4,
|
||||
tim_win_december_tex_rgb_i4
|
||||
};
|
||||
static int color_type[2][3] = {
|
||||
{ 195, 0, 0 },
|
||||
{ 70, 145, 225 }
|
||||
};
|
||||
|
||||
GRAPH* graph = game->graph;
|
||||
mBR_Ovl_c* birthday_ovl = submenu->overlay->birthday_ovl;
|
||||
f32 x = menu_info->position[0];
|
||||
f32 y = menu_info->position[1];
|
||||
f32 tex_x;
|
||||
f32 tex_y;
|
||||
u8 str[2];
|
||||
int* color_p;
|
||||
u8 s;
|
||||
u8 t;
|
||||
Gfx* gfx;
|
||||
|
||||
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
||||
Matrix_translate(x, y, 140.0f, 1);
|
||||
|
||||
OPEN_DISP(graph);
|
||||
gfx = NOW_POLY_OPA_DISP;
|
||||
|
||||
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(gfx++, birthday_win_mode);
|
||||
|
||||
tex_x = -submenu->overlay->menu_control.texture_pos[0] * 4.0f;
|
||||
tex_y = -submenu->overlay->menu_control.texture_pos[1] * 4.0f;
|
||||
s = (int)tex_x & 0xFF;
|
||||
t = (int)tex_y & 0xFF;
|
||||
gDPSetTileSize_Dolphin(gfx++, G_TX_RENDERTILE, s, t, 32, 32);
|
||||
gSPDisplayList(gfx++, birthday_win_model);
|
||||
|
||||
color_p = color_type[birthday_ovl->idx != mBR_Ovl_IDX_MONTH];
|
||||
|
||||
gDPSetPrimColor(gfx++, 0, 255, color_p[0], color_p[1], color_p[2], 255);
|
||||
|
||||
gSPSegment(gfx++, G_MWO_SEGMENT_8, month_tex[birthday_ovl->birthday_data[mBR_Ovl_IDX_MONTH] - 1]);
|
||||
|
||||
gSPDisplayList(gfx++, brt_win_month_model);
|
||||
|
||||
SET_POLY_OPA_DISP(gfx);
|
||||
CLOSE_DISP(graph);
|
||||
|
||||
(*submenu->overlay->set_char_matrix_proc)(graph);
|
||||
mFont_SetLineStrings(
|
||||
game,
|
||||
chr_table, sizeof(chr_table),
|
||||
x + 119.0f, -y + 88.0f,
|
||||
255, 255, 255, 255,
|
||||
FALSE,
|
||||
TRUE,
|
||||
0.875f, 0.875f,
|
||||
mFont_MODE_POLY
|
||||
);
|
||||
|
||||
mFont_UnintToString(str, 2, birthday_ovl->birthday_data[mBR_Ovl_IDX_DAY], 2, FALSE, TRUE, TRUE);
|
||||
|
||||
color_p = color_type[birthday_ovl->idx != mBR_Ovl_IDX_DAY];
|
||||
mFont_SetLineStrings(
|
||||
game,
|
||||
str, sizeof(str),
|
||||
x + 171.0f, -y + 124.0f,
|
||||
color_p[0], color_p[1], color_p[2], 255,
|
||||
FALSE,
|
||||
TRUE,
|
||||
1.0f, 1.0f,
|
||||
mFont_MODE_POLY
|
||||
);
|
||||
|
||||
color_p = color_type[birthday_ovl->idx != mBR_Ovl_IDX_OK];
|
||||
mFont_SetLineStrings(
|
||||
game,
|
||||
close_table, sizeof(close_table),
|
||||
x + 198.0f, -y + 124.0f,
|
||||
color_p[0], color_p[1], color_p[2], 255,
|
||||
FALSE,
|
||||
TRUE,
|
||||
1.0f, 1.0f,
|
||||
mFont_MODE_POLY
|
||||
);
|
||||
}
|
||||
|
||||
static void mBR_birthday_ovl_draw(Submenu* submenu, GAME* game) {
|
||||
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_BIRTHDAY];
|
||||
|
||||
(*menu_info->pre_draw_func)(submenu, game);
|
||||
mBR_set_dl(submenu, menu_info, game);
|
||||
}
|
||||
|
||||
extern void mBR_birthday_ovl_set_proc(Submenu* submenu) {
|
||||
mSM_Control_c* control = &submenu->overlay->menu_control;
|
||||
|
||||
control->menu_move_func = &mBR_birthday_ovl_move;
|
||||
control->menu_draw_func = &mBR_birthday_ovl_draw;
|
||||
}
|
||||
|
||||
static void mBR_birthday_ovl_init(Submenu* submenu) {
|
||||
mBR_Ovl_c* birthday_ovl = submenu->overlay->birthday_ovl;
|
||||
(*submenu->overlay->move_chg_base_proc)(&submenu->overlay->menu_info[mSM_OVL_BIRTHDAY], mSM_MOVE_IN_TOP);
|
||||
submenu->overlay->menu_control.animation_flag = FALSE;
|
||||
|
||||
birthday_ovl->birthday_data[mBR_Ovl_IDX_MONTH] = lbRTC_JANUARY;
|
||||
birthday_ovl->birthday_data[mBR_Ovl_IDX_DAY] = 1;
|
||||
sAdo_SysTrgStart(0x17C);
|
||||
}
|
||||
|
||||
extern void mBR_birthday_ovl_construct(Submenu* submenu) {
|
||||
Submenu_Overlay_c* overlay = submenu->overlay;
|
||||
|
||||
if (overlay->birthday_ovl == NULL) {
|
||||
mem_clear((u8*)&birthday_ovl_data, sizeof(mBR_Ovl_c), 0);
|
||||
overlay->birthday_ovl = &birthday_ovl_data;
|
||||
}
|
||||
|
||||
mBR_birthday_ovl_init(submenu);
|
||||
mBR_birthday_ovl_set_proc(submenu);
|
||||
}
|
||||
|
||||
extern void mBR_birthday_ovl_destruct(Submenu* submenu) {
|
||||
submenu->overlay->birthday_ovl = NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user