mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
1377 lines
37 KiB
C
1377 lines
37 KiB
C
#include "m_map_ovl.h"
|
|
|
|
#include "audio.h"
|
|
#include "m_random_field.h"
|
|
#include "m_field_info.h"
|
|
#include "m_event.h"
|
|
#include "m_font.h"
|
|
#include "m_player.h"
|
|
#include "m_player_lib.h"
|
|
#include "game.h"
|
|
#include "sys_matrix.h"
|
|
#include "m_malloc.h"
|
|
#include "m_common_data.h"
|
|
|
|
extern u8 kan_tizu_f_TA_tex_txt[];
|
|
extern u8 kan_tizu_tst1_TA_tex_txt[];
|
|
extern u8 kan_tizu_t_TA_tex_txt[];
|
|
extern u8 kan_tizu_tr1_TA_tex_txt[];
|
|
extern u8 kan_tizu_fmh_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c3_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5_TA_tex_txt[];
|
|
extern u8 kan_tizu_c6_TA_tex_txt[];
|
|
extern u8 kan_tizu_c7_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c2r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c3r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c6r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c7r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c2r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c3r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_c6r3_TA_tex_txt[];
|
|
extern u8 kan_tizu_c7r3_TA_tex_txt[];
|
|
extern u8 kan_tizu_r1_TA_tex_txt[];
|
|
extern u8 kan_tizu_r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_r2_TA_tex_txt[];
|
|
extern u8 kan_tizu_r4_TA_tex_txt[];
|
|
extern u8 kan_tizu_r5_TA_tex_txt[];
|
|
extern u8 kan_tizu_r6_TA_tex_txt[];
|
|
extern u8 kan_tizu_r7_TA_tex_txt[];
|
|
extern u8 kan_tizu_r1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r2b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r2b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r4b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r5b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r6b_TA_tex_txt[];
|
|
extern u8 kan_tizu_r7b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c2s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c3s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c6s_TA_tex_txt[];
|
|
extern u8 kan_tizu_c7s_TA_tex_txt[];
|
|
extern u8 kan_tizu_m_TA_tex_txt[];
|
|
extern u8 kan_tizu_mr1_TA_tex_txt[];
|
|
extern u8 kan_tizu_fsh_TA_tex_txt[];
|
|
extern u8 kan_tizu_fpk_TA_tex_txt[];
|
|
extern u8 kan_tizu_fpo_TA_tex_txt[];
|
|
extern u8 kan_tizu_fko_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr1_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr2_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr2_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr4_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr5_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr6_TA_tex_txt[];
|
|
extern u8 kan_tizu_pr7_TA_tex_txt[];
|
|
extern u8 kan_tizu_mr1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_fmu_TA_tex_txt[];
|
|
extern u8 kan_tizu_fta_TA_tex_txt[];
|
|
extern u8 kan_tizu_tr1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c1r2b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c3r1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4r1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c4r2b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c5r2b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c6r1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_c7r1b_TA_tex_txt[];
|
|
extern u8 kan_tizu_mwf_TA_tex_txt[];
|
|
|
|
static u8* l_map_texture[108] = {
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_tst1_TA_tex_txt,
|
|
kan_tizu_t_TA_tex_txt,
|
|
kan_tizu_tr1_TA_tex_txt,
|
|
kan_tizu_fmh_TA_tex_txt,
|
|
kan_tizu_c1_TA_tex_txt,
|
|
kan_tizu_c2_TA_tex_txt,
|
|
kan_tizu_c3_TA_tex_txt,
|
|
kan_tizu_c4_TA_tex_txt,
|
|
kan_tizu_c5_TA_tex_txt,
|
|
kan_tizu_c6_TA_tex_txt,
|
|
kan_tizu_c7_TA_tex_txt,
|
|
kan_tizu_c1r1_TA_tex_txt,
|
|
kan_tizu_c2r1_TA_tex_txt,
|
|
kan_tizu_c3r1_TA_tex_txt,
|
|
kan_tizu_c4r1_TA_tex_txt,
|
|
kan_tizu_c5r1_TA_tex_txt,
|
|
kan_tizu_c6r1_TA_tex_txt,
|
|
kan_tizu_c7r1_TA_tex_txt,
|
|
kan_tizu_c1r2_TA_tex_txt,
|
|
kan_tizu_c2r2_TA_tex_txt,
|
|
kan_tizu_c3r2_TA_tex_txt,
|
|
kan_tizu_c4r2_TA_tex_txt,
|
|
kan_tizu_c5r2_TA_tex_txt,
|
|
kan_tizu_c1r2_TA_tex_txt,
|
|
kan_tizu_c4r2_TA_tex_txt,
|
|
kan_tizu_c5r2_TA_tex_txt,
|
|
kan_tizu_c6r3_TA_tex_txt,
|
|
kan_tizu_c7r3_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_r1_TA_tex_txt,
|
|
kan_tizu_r2_TA_tex_txt,
|
|
kan_tizu_r2_TA_tex_txt,
|
|
kan_tizu_r4_TA_tex_txt,
|
|
kan_tizu_r5_TA_tex_txt,
|
|
kan_tizu_r6_TA_tex_txt,
|
|
kan_tizu_r7_TA_tex_txt,
|
|
kan_tizu_r1b_TA_tex_txt,
|
|
kan_tizu_r2b_TA_tex_txt,
|
|
kan_tizu_r2b_TA_tex_txt,
|
|
kan_tizu_r4b_TA_tex_txt,
|
|
kan_tizu_r5b_TA_tex_txt,
|
|
kan_tizu_r6b_TA_tex_txt,
|
|
kan_tizu_r7b_TA_tex_txt,
|
|
kan_tizu_c1s_TA_tex_txt,
|
|
kan_tizu_c2s_TA_tex_txt,
|
|
kan_tizu_c3s_TA_tex_txt,
|
|
kan_tizu_c4s_TA_tex_txt,
|
|
kan_tizu_c5s_TA_tex_txt,
|
|
kan_tizu_c6s_TA_tex_txt,
|
|
kan_tizu_c7s_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_m_TA_tex_txt,
|
|
kan_tizu_mr1_TA_tex_txt,
|
|
kan_tizu_fsh_TA_tex_txt,
|
|
kan_tizu_fpk_TA_tex_txt,
|
|
kan_tizu_fpo_TA_tex_txt,
|
|
kan_tizu_fko_TA_tex_txt,
|
|
kan_tizu_pr1_TA_tex_txt,
|
|
kan_tizu_pr2_TA_tex_txt,
|
|
kan_tizu_pr2_TA_tex_txt,
|
|
kan_tizu_pr4_TA_tex_txt,
|
|
kan_tizu_pr5_TA_tex_txt,
|
|
kan_tizu_pr6_TA_tex_txt,
|
|
kan_tizu_pr7_TA_tex_txt,
|
|
kan_tizu_f_TA_tex_txt,
|
|
kan_tizu_r1_TA_tex_txt,
|
|
kan_tizu_c1_TA_tex_txt,
|
|
kan_tizu_c1_TA_tex_txt,
|
|
kan_tizu_c1_TA_tex_txt,
|
|
kan_tizu_c1_TA_tex_txt,
|
|
kan_tizu_mr1b_TA_tex_txt,
|
|
kan_tizu_mr1_TA_tex_txt,
|
|
kan_tizu_fmu_TA_tex_txt,
|
|
kan_tizu_fta_TA_tex_txt,
|
|
kan_tizu_tr1b_TA_tex_txt,
|
|
kan_tizu_c1r2b_TA_tex_txt,
|
|
kan_tizu_c3r1b_TA_tex_txt,
|
|
kan_tizu_c4r1b_TA_tex_txt,
|
|
kan_tizu_c4r2b_TA_tex_txt,
|
|
kan_tizu_c5r2b_TA_tex_txt,
|
|
kan_tizu_c6r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_c7r1b_TA_tex_txt,
|
|
kan_tizu_mwf_TA_tex_txt,
|
|
kan_tizu_mwf_TA_tex_txt,
|
|
kan_tizu_mwf_TA_tex_txt,
|
|
kan_tizu_mwf_TA_tex_txt,
|
|
kan_tizu_mwf_TA_tex_txt,
|
|
kan_tizu_c1r2b_TA_tex_txt,
|
|
kan_tizu_c4r2b_TA_tex_txt,
|
|
kan_tizu_c5r2b_TA_tex_txt
|
|
};
|
|
|
|
static u8 l_map_pal[108] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
|
|
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0
|
|
};
|
|
|
|
static u8 pluss_bridge[108] = {
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x59, 0xff, 0x5c, 0x5d, 0x57, 0xff, 0xff,
|
|
0x5a, 0x5b, 0x69, 0x6a, 0x6b, 0xff, 0xff, 0xff, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0xff,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
|
};
|
|
|
|
extern Gfx kan_win_model[];
|
|
extern Gfx kan_win_model2[];
|
|
|
|
static Gfx* kan_win_wakuT_model_p;
|
|
static Gfx* kan_win_waku1T_model_p;
|
|
static Gfx* kan_win_waku2T_model_p;
|
|
static Gfx* kan_win_waku3T_model_p;
|
|
static Gfx* kan_win_waku4T_model_p;
|
|
static Gfx* kan_win_color0_mode_p;
|
|
static Gfx* kan_win_color1_mode_p;
|
|
|
|
extern Gfx kan_win_wakuT_model[];
|
|
extern Gfx kan_waku_w1T_model[];
|
|
extern Gfx kan_waku_w2T_model[];
|
|
extern Gfx kan_waku_w3T_model[];
|
|
extern Gfx kan_waku_w4T_model[];
|
|
extern Gfx kan_win_color0_mode[];
|
|
extern Gfx kan_win_color1_mode[];
|
|
|
|
extern mMP_HousePos_c mMP_house_pos_list[];
|
|
|
|
extern Gfx kan_win_mode[];
|
|
|
|
static u16 kan_tizu1_pal[16] ATTRIBUTE_ALIGN(32) = {
|
|
0x0000, 0xc3b0, 0x9e87, 0xd294, 0xca52, 0xbdef, 0xb5ad, 0xb9ce,
|
|
0xa2e8, 0xb18c, 0xa705, 0xdaff, 0xab4a, 0xffff, 0xb635, 0xbe9f
|
|
};
|
|
|
|
static u16 kan_tizu2_pal[16] ATTRIBUTE_ALIGN(32) = {
|
|
0x0000, 0xc3b0, 0x9e87, 0xc94a, 0xe70d, 0xe1ce, 0xb5ad, 0xb195,
|
|
0xf390, 0xb18c, 0xa705, 0xffff, 0xd54a, 0xdaff, 0xb635, 0xbe9f
|
|
};
|
|
|
|
static u16* l_kan_tizu_pal[2] = {
|
|
kan_tizu1_pal, kan_tizu2_pal
|
|
};
|
|
|
|
extern u8 kan_win_suuji1_tex_rgb_ia8[];
|
|
extern u8 kan_win_suuji2_tex_rgb_ia8[];
|
|
extern u8 kan_win_suuji3_tex_rgb_ia8[];
|
|
extern u8 kan_win_suuji4_tex_rgb_ia8[];
|
|
extern u8 kan_win_suuji5_tex_rgb_ia8[];
|
|
|
|
static u8* kan_win_evw_anime_1_tex_table[FG_BLOCK_X_NUM] = {
|
|
kan_win_suuji1_tex_rgb_ia8,
|
|
kan_win_suuji2_tex_rgb_ia8,
|
|
kan_win_suuji3_tex_rgb_ia8,
|
|
kan_win_suuji4_tex_rgb_ia8,
|
|
kan_win_suuji5_tex_rgb_ia8,
|
|
};
|
|
|
|
extern u8 kan_win_a_tex_rgb_ia8[];
|
|
extern u8 kan_win_b_tex_rgb_ia8[];
|
|
extern u8 kan_win_c_tex_rgb_ia8[];
|
|
extern u8 kan_win_d_tex_rgb_ia8[];
|
|
extern u8 kan_win_e_tex_rgb_ia8[];
|
|
extern u8 kan_win_f_tex_rgb_ia8[];
|
|
|
|
static u8* kan_win_evw_anime_2_tex_table[FG_BLOCK_Z_NUM] = {
|
|
kan_win_a_tex_rgb_ia8,
|
|
kan_win_b_tex_rgb_ia8,
|
|
kan_win_c_tex_rgb_ia8,
|
|
kan_win_d_tex_rgb_ia8,
|
|
kan_win_e_tex_rgb_ia8,
|
|
kan_win_f_tex_rgb_ia8,
|
|
};
|
|
|
|
extern Gfx kan_win_npcT_1_model[];
|
|
extern Gfx kan_win_npcT_2_model[];
|
|
extern Gfx kan_win_npcT_3_model[];
|
|
|
|
extern Gfx kan_win_npc2T_1_model[];
|
|
extern Gfx kan_win_npc2T_2_model[];
|
|
extern Gfx kan_win_npc2T_3_model[];
|
|
|
|
static Gfx* kan_win_npcT_table[] = {
|
|
kan_win_npcT_1_model,
|
|
kan_win_npcT_2_model,
|
|
kan_win_npcT_3_model
|
|
};
|
|
|
|
static Gfx* kan_win_npc2T_table[] = {
|
|
kan_win_npc2T_1_model,
|
|
kan_win_npc2T_2_model,
|
|
kan_win_npc2T_3_model
|
|
};
|
|
|
|
extern Gfx kan_win_genzaiT_model[];
|
|
|
|
extern Gfx kan_tizu_mode[];
|
|
extern Gfx kan_tizu_model[];
|
|
|
|
extern Gfx kan_win_cursorT_model[];
|
|
|
|
extern Gfx kan_win_playerT_model[];
|
|
extern Gfx kan_win_omiseT_model[];
|
|
extern Gfx kan_win_koubanT_model[];
|
|
extern Gfx kan_win_yuuT_model[];
|
|
extern Gfx kan_win_yashiroT_model[];
|
|
extern Gfx kan_win_ekiT_model[];
|
|
extern Gfx kan_win_gomiT_model[];
|
|
extern Gfx kan_win_mu_model[];
|
|
extern Gfx kan_win_ta_model[];
|
|
extern Gfx kan_win_funeT_model[];
|
|
|
|
static mMP_LabelWord_c mMP_label_word_npc = {
|
|
-92.0f, -19.0f,
|
|
NULL, 0
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_npc = {
|
|
-98.0f, -24.0f,
|
|
kan_win_npcT_1_model,
|
|
{ &mMP_label_word_npc, NULL }
|
|
};
|
|
|
|
static mMP_LabelWord_c mMP_label_word_player = {
|
|
-92.0f, -21.5f,
|
|
NULL, 0
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_player = {
|
|
-98.0f, -26.5f,
|
|
kan_win_playerT_model,
|
|
{ &mMP_label_word_player, NULL }
|
|
};
|
|
|
|
static u8 mMP_label_str_shop[4] = { CHAR_S, CHAR_h, CHAR_o, CHAR_p };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_shop = {
|
|
-83.0f, -25.0f,
|
|
mMP_label_str_shop, 4
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_shop = {
|
|
-93.0f, -30.0f,
|
|
kan_win_omiseT_model,
|
|
{ &mMP_label_word_shop, NULL }
|
|
};
|
|
|
|
static u8 mMP_label_str_police[6] = { CHAR_P, CHAR_o, CHAR_l, CHAR_i, CHAR_c, CHAR_e };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_police = {
|
|
-83.0f, -19.0f,
|
|
mMP_label_str_police, 6
|
|
};
|
|
|
|
static u8 mMP_label_str_police2[7] = { CHAR_S, CHAR_t, CHAR_a, CHAR_t, CHAR_i, CHAR_o, CHAR_n };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_police2 = {
|
|
-83.0f, -31.0f,
|
|
mMP_label_str_police2, 7
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_police = {
|
|
-93.0f, -30.0f,
|
|
kan_win_koubanT_model,
|
|
{ &mMP_label_word_police, &mMP_label_word_police2 }
|
|
};
|
|
|
|
static u8 mMP_label_str_post[4] = { CHAR_P, CHAR_o, CHAR_s, CHAR_t };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_post = {
|
|
-83.0f, -19.0f,
|
|
mMP_label_str_post, 4
|
|
};
|
|
|
|
static u8 mMP_label_str_post2[6] = { CHAR_O, CHAR_f, CHAR_f, CHAR_i, CHAR_c, CHAR_e };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_post2 = {
|
|
-83.0f, -31.0f,
|
|
mMP_label_str_post2, 6
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_post = {
|
|
-93.0f, -30.0f,
|
|
kan_win_yuuT_model,
|
|
{ &mMP_label_word_post, &mMP_label_word_post2 }
|
|
};
|
|
|
|
static u8 mMP_label_str_shrine[7] = { CHAR_W, CHAR_i, CHAR_s, CHAR_h, CHAR_i, CHAR_n, CHAR_g };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_shrine = {
|
|
-83.0f, -19.0f,
|
|
mMP_label_str_shrine, 7
|
|
};
|
|
|
|
static u8 mMP_label_str_shrine2[4] = { CHAR_W, CHAR_e, CHAR_l, CHAR_l };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_shrine2 = {
|
|
-83.0f, -31.0f,
|
|
mMP_label_str_shrine2, 4
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_shrine = {
|
|
-93.0f, -30.0f,
|
|
kan_win_yashiroT_model,
|
|
{ &mMP_label_word_shrine, & mMP_label_word_shrine2 }
|
|
};
|
|
|
|
static u8 mMP_label_str_station[5] = { CHAR_T, CHAR_r, CHAR_a, CHAR_i, CHAR_n };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_station = {
|
|
-83.0f, -19.0f,
|
|
mMP_label_str_station, 5
|
|
};
|
|
|
|
static u8 mMP_label_str_station2[7] = { CHAR_S, CHAR_t, CHAR_a, CHAR_t, CHAR_i, CHAR_o, CHAR_n };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_station2 = {
|
|
-83.0f, -31.0f,
|
|
mMP_label_str_station2, 7
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_station = {
|
|
-93.0f, -31.0f,
|
|
kan_win_ekiT_model,
|
|
{ &mMP_label_word_station, &mMP_label_word_station2 }
|
|
};
|
|
|
|
static u8 mMP_label_str_junk[4] = { CHAR_D, CHAR_u, CHAR_m, CHAR_p };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_junk = {
|
|
-83.0f, -25.0f,
|
|
mMP_label_str_junk, 4
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_junk = {
|
|
-93.0f, -30.0f,
|
|
kan_win_gomiT_model,
|
|
{ &mMP_label_word_junk, NULL }
|
|
};
|
|
|
|
static u8 mMP_label_str_museum[6] = { CHAR_M, CHAR_u, CHAR_s, CHAR_e, CHAR_u, CHAR_m };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_museum = {
|
|
-83.0f, -25.0f,
|
|
mMP_label_str_museum, 6
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_museum = {
|
|
-93.0f, -30.0f,
|
|
kan_win_mu_model,
|
|
{ &mMP_label_word_museum, NULL }
|
|
};
|
|
|
|
static u8 mMP_label_str_needle[6] = { CHAR_T, CHAR_a, CHAR_i, CHAR_l, CHAR_o, CHAR_r };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_needle = {
|
|
-83.0f, -25.0f,
|
|
mMP_label_str_needle, 6
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_needle = {
|
|
-93.0f, -30.0f,
|
|
kan_win_ta_model,
|
|
{ &mMP_label_word_needle, NULL }
|
|
};
|
|
|
|
static u8 mMP_label_str_port[4] = { CHAR_D, CHAR_o, CHAR_c, CHAR_k };
|
|
|
|
static mMP_LabelWord_c mMP_label_word_port = {
|
|
-83.0f, -25.0f,
|
|
mMP_label_str_port, 4
|
|
};
|
|
|
|
static mMP_Label_c mMP_label_port = {
|
|
-93.0f, -30.0f,
|
|
kan_win_funeT_model,
|
|
{ &mMP_label_word_port, NULL }
|
|
};
|
|
|
|
static mMP_Label_c* mMP_label_data[mMP_LABEL_NUM] = {
|
|
&mMP_label_npc,
|
|
&mMP_label_player,
|
|
&mMP_label_shop,
|
|
&mMP_label_police,
|
|
&mMP_label_post,
|
|
&mMP_label_shrine,
|
|
&mMP_label_station,
|
|
&mMP_label_junk,
|
|
&mMP_label_museum,
|
|
&mMP_label_needle,
|
|
&mMP_label_port
|
|
};
|
|
|
|
static int mMP_check_layer(f32 y) {
|
|
int layer;
|
|
|
|
switch (mCoBG_Height2GetLayer(y)) {
|
|
case mCoBG_LAYER0:
|
|
layer = 2;
|
|
break;
|
|
case mCoBG_LAYER1:
|
|
layer = 1;
|
|
break;
|
|
case mCoBG_LAYER2:
|
|
layer = 0;
|
|
break;
|
|
default:
|
|
layer = 1;
|
|
break;
|
|
}
|
|
|
|
if (mRF_CheckFieldStep3() == FALSE) {
|
|
layer--;
|
|
}
|
|
|
|
if (layer < 0) {
|
|
layer = 0;
|
|
}
|
|
|
|
return layer;
|
|
}
|
|
|
|
static int mMP_check_bg_kind(u8 kind) {
|
|
int res = TRUE;
|
|
if (kind <= 8 || kind == 0x3D || kind == 0x3E || kind == 9 || kind == 10) {
|
|
res = FALSE;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static void mMP_make_max_no_table(int* max_no_table, int count) {
|
|
int bz;
|
|
int i;
|
|
int j = 0;
|
|
|
|
for (i = 0; i < count; i++) {
|
|
max_no_table[i] = 39;
|
|
}
|
|
|
|
//i = BLOCKXZ_2_BLOCKIDX(0, 1);
|
|
for (bz = 1; bz < mMP_BLOCKZ_MAX; bz++) {
|
|
u8 type;
|
|
int bx;
|
|
for (bx = 1; bx < mMP_BLOCKX_MAX; bx++) {
|
|
type = g_block_type_p[BLOCKXZ_2_BLOCKIDX(bx, bz)];
|
|
if (mMP_check_bg_kind(type) == TRUE) {
|
|
max_no_table[0] = type;
|
|
|
|
if (Save_Get(plus_bridge.exists) &&
|
|
Save_Get(plus_bridge.block_x) == bx &&
|
|
Save_Get(plus_bridge.block_z) == bz &&
|
|
pluss_bridge[type] != 0xFF
|
|
) {
|
|
max_no_table[0] = pluss_bridge[type];
|
|
}
|
|
|
|
max_no_table++;
|
|
j++;
|
|
}
|
|
|
|
if (j >= count) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void mMP_dma_texture(u8** texture_pp, int type) {
|
|
*texture_pp = l_map_texture[type];
|
|
}
|
|
|
|
static void mMP_set_map_texture_pal(mMP_Overlay_c* map_ovl) {
|
|
int max_no_table[FG_BLOCK_TOTAL_NUM];
|
|
int i;
|
|
|
|
mMP_make_max_no_table(max_no_table, FG_BLOCK_TOTAL_NUM);
|
|
for (i = 0; i < FG_BLOCK_TOTAL_NUM; i++) {
|
|
map_ovl->map_pal[i] = l_map_pal[max_no_table[i]];
|
|
mMP_dma_texture(&map_ovl->map_texture[i], max_no_table[i]);
|
|
}
|
|
}
|
|
|
|
static mActor_name_t mMP_GetFgBlockName(mMP_Overlay_c* map_ovl, int block_x, int block_z) {
|
|
return map_ovl->combination_table[Save_Get(combi_table[block_z][block_x]).combination_type].fg_id;
|
|
}
|
|
|
|
static void mMP_set_house_data(mMP_Overlay_c* map_ovl, mSM_MenuInfo_c* menu) {
|
|
static u8 akiya_str[PLAYER_NAME_LEN] = { CHAR_f, CHAR_r, CHAR_e, CHAR_e, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE };
|
|
|
|
mMP_ResidentInfo_c* resident_p = &map_ovl->player_info[0];
|
|
mMP_LabelInfo_c* player_block_label = &map_ovl->label_info[1][2];
|
|
Private_c* priv = Save_Get(private);
|
|
mMP_HousePos_c* house_pos2;
|
|
Animal_c* animal = Save_Get(animals);
|
|
int residents;
|
|
int i;
|
|
|
|
/* Process player resident info first */
|
|
|
|
player_block_label->label_cnt = PLAYER_NUM;
|
|
player_block_label->label_no = mMP_LABEL_PLAYER;
|
|
|
|
residents = 0;
|
|
for (i = 0; i < PLAYER_NUM; i++) {
|
|
if (mPr_CheckPrivate(priv) == TRUE &&
|
|
(Common_Get(now_private) != priv || mEv_CheckFirstIntro() == FALSE)
|
|
) {
|
|
mPr_CopyPlayerName(resident_p->name, priv->player_ID.player_name);
|
|
resident_p->sex = priv->gender;
|
|
resident_p->house_layer = 0;
|
|
resident_p->house_idx = 0;
|
|
|
|
player_block_label->residents[residents] = resident_p;
|
|
residents++;
|
|
resident_p++;
|
|
}
|
|
|
|
priv++;
|
|
}
|
|
|
|
for (residents; residents < PLAYER_NUM; residents++, resident_p++) {
|
|
mPr_CopyPlayerName(resident_p->name, akiya_str);
|
|
resident_p->sex = -1;
|
|
resident_p->house_layer = 0;
|
|
|
|
player_block_label->residents[residents] = resident_p;
|
|
}
|
|
|
|
house_pos2 = mMP_house_pos_list;
|
|
/* Process animal resident info next */
|
|
resident_p = &map_ovl->animal_info[0];
|
|
residents = 0;
|
|
|
|
for (i = 0; i < ANIMAL_NUM_MAX; i++, animal++, resident_p++) {
|
|
if (mNpc_CheckFreeAnimalInfo(animal) == FALSE) {
|
|
Anmhome_c* home = &animal->home_info;
|
|
mNpc_GetNpcWorldNameAnm(resident_p->name, &animal->id);
|
|
resident_p->sex = mNpc_GetLooks2Sex(animal->id.looks);
|
|
resident_p->house_layer = mMP_check_layer(Common_Get(npclist[i].house_position.y));
|
|
|
|
{
|
|
mActor_name_t fgblock_name = mMP_GetFgBlockName(map_ovl, home->block_x, home->block_z);
|
|
mMP_HousePos_c* house_pos = house_pos2;
|
|
mMP_HousePos_Entry_c* pos_info = house_pos[0].entries;
|
|
|
|
for (house_pos; house_pos->fgblock_name != 0x03B8; house_pos++) {
|
|
if (fgblock_name == house_pos->fgblock_name) {
|
|
int j;
|
|
pos_info = house_pos->entries;
|
|
|
|
for (j = 0; j < 3; j++, pos_info++) {
|
|
if (pos_info->ut_x == home->ut_x && pos_info->ut_z == home->ut_z - 1) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (j == 3) {
|
|
pos_info = &house_pos->entries[0]; // default
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
resident_p->house_idx = pos_info->idx;
|
|
}
|
|
|
|
{
|
|
int bx = home->block_x - 1;
|
|
int bz = home->block_z - 1;
|
|
mMP_LabelInfo_c* label_info = &map_ovl->label_info[bz][bx];
|
|
|
|
label_info->residents[label_info->label_cnt] = resident_p;
|
|
label_info->label_cnt++;
|
|
label_info->label_no = mMP_LABEL_NPC;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Sort villager houses by layer, with lower layers coming first */
|
|
{
|
|
mMP_ResidentInfo_c* resident;
|
|
mMP_ResidentInfo_c* next_resident;
|
|
mMP_LabelInfo_c* label_info = (mMP_LabelInfo_c*)map_ovl->label_info;
|
|
for (i = 0; i < FG_BLOCK_TOTAL_NUM; i++) {
|
|
if (label_info->label_no == mMP_LABEL_NPC && label_info->label_cnt > 1) {
|
|
|
|
int j;
|
|
for (j = 0; j < label_info->label_cnt - 1; j++) {
|
|
|
|
resident = label_info->residents[j];
|
|
next_resident = label_info->residents[j + 1];
|
|
|
|
if (resident->house_layer > next_resident->house_layer) {
|
|
label_info->residents[j] = next_resident;
|
|
label_info->residents[j + 1] = resident;
|
|
j = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
label_info++;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void mMP_set_field_data(mMP_Overlay_c* map_ovl) {
|
|
mMP_LabelInfo_c* label_info = (mMP_LabelInfo_c*)map_ovl->label_info;
|
|
int* block_kind_p = g_block_kind_p + BLOCKXZ_2_BLOCKIDX(1, 1); // start at the first non-border acre
|
|
int bx;
|
|
int bz;
|
|
|
|
|
|
for (bz = 0; bz < FG_BLOCK_Z_NUM; bz++) {
|
|
for (bx = 0; bx < FG_BLOCK_X_NUM; bx++) {
|
|
if (label_info->label_cnt <= 0) {
|
|
int kind = *block_kind_p;
|
|
|
|
if (kind & mRF_BLOCKKIND_SHOP) {
|
|
label_info->label_no = mMP_LABEL_SHOP;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_POLICE) {
|
|
label_info->label_no = mMP_LABEL_POLICE;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_POSTOFFICE) {
|
|
label_info->label_no = mMP_LABEL_POST;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_SHRINE) {
|
|
label_info->label_no = mMP_LABEL_SHRINE;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_STATION) {
|
|
label_info->label_no = mMP_LABEL_STATION;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_DUMP) {
|
|
label_info->label_no = mMP_LABEL_JUNK;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_MUSEUM) {
|
|
label_info->label_no = mMP_LABEL_MUSEUM;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_TAILORS) {
|
|
label_info->label_no = mMP_LABEL_NEEDLE;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
else if (kind & mRF_BLOCKKIND_DOCK) {
|
|
label_info->label_no = mMP_LABEL_PORT;
|
|
label_info->label_cnt = 2;
|
|
}
|
|
}
|
|
|
|
label_info++;
|
|
block_kind_p++;
|
|
}
|
|
|
|
block_kind_p += 2; // skip X border acres
|
|
}
|
|
}
|
|
|
|
static void mMP_set_init_data(mMP_Overlay_c* map_ovl, mSM_MenuInfo_c* menu_info) {
|
|
mMP_LabelInfo_c* label_info = (mMP_LabelInfo_c*)map_ovl->label_info;
|
|
PLAYER_ACTOR* player = get_player_actor_withoutCheck((GAME_PLAY*)gamePT);
|
|
int block_x;
|
|
int block_z;
|
|
int i;
|
|
|
|
if (Common_Get(field_type) != mFI_FIELDTYPE2_FG && Common_Get(door_data.next_scene_id) != 0) {
|
|
xyz_t pos;
|
|
|
|
xyz_t_move_s_xyz(&pos, Common_GetPointer(structure_exit_door_data.exit_position));
|
|
mFI_Wpos2BlockNum(&block_x, &block_z, pos);
|
|
}
|
|
else {
|
|
mFI_Wpos2BlockNum(&block_x, &block_z, player->actor_class.world.position);
|
|
}
|
|
|
|
map_ovl->player_bx = block_x - 1;
|
|
map_ovl->player_bz = block_z - 1;
|
|
|
|
map_ovl->sel_bx = map_ovl->player_bx;
|
|
map_ovl->sel_bz = map_ovl->player_bz;
|
|
|
|
map_ovl->map_cursor_current_xpos = (f32)map_ovl->player_bx * mMP_BLOCK_SIZE_F;
|
|
map_ovl->map_cursor_current_zpos = -(f32)map_ovl->player_bz * mMP_BLOCK_SIZE_F;
|
|
|
|
map_ovl->cursor_frame = 0;
|
|
|
|
map_ovl->map_cursor_target_xpos = map_ovl->map_cursor_current_xpos;
|
|
map_ovl->map_cursor_target_zpos = map_ovl->map_cursor_current_zpos;
|
|
|
|
mMP_set_map_texture_pal(map_ovl);
|
|
|
|
for (i = 0; i < FG_BLOCK_TOTAL_NUM; i++) {
|
|
label_info->label_cnt = 0;
|
|
label_info++;
|
|
}
|
|
|
|
mMP_set_house_data(map_ovl, menu_info);
|
|
mMP_set_field_data(map_ovl);
|
|
|
|
map_ovl->land_name_str_len = mMl_strlen(Save_Get(land_info.name), LAND_NAME_SIZE, CHAR_SPACE);
|
|
}
|
|
|
|
static void mMP_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu) {
|
|
(*submenu->overlay->move_Move_proc)(submenu, menu);
|
|
}
|
|
|
|
static void mMP_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu) {
|
|
Submenu_Overlay_c* ovl = submenu->overlay;
|
|
int trigger = ovl->menu_control.trigger;
|
|
mMP_Overlay_c* map_ovl = ovl->map_ovl;
|
|
int cursor_moved = FALSE;
|
|
|
|
if ((trigger & (BUTTON_A | BUTTON_B | BUTTON_START)) || (menu->data0 == 1 && (trigger & BUTTON_X))) {
|
|
(*ovl->move_chg_base_proc)(menu, 4);
|
|
sAdo_SysTrgStart(0x17D);
|
|
}
|
|
else if (trigger & BUTTON_CLEFT) {
|
|
if (map_ovl->sel_bx != 0) {
|
|
map_ovl->sel_bx--;
|
|
map_ovl->map_cursor_target_xpos -= mMP_BLOCK_SIZE_F;
|
|
cursor_moved = TRUE;
|
|
}
|
|
}
|
|
else if (trigger & BUTTON_CDOWN) {
|
|
if (map_ovl->sel_bz < FG_BLOCK_Z_NUM - 1) {
|
|
map_ovl->sel_bz++;
|
|
map_ovl->map_cursor_target_zpos -= mMP_BLOCK_SIZE_F;
|
|
cursor_moved = TRUE;
|
|
}
|
|
}
|
|
else if (trigger & BUTTON_CUP) {
|
|
if (map_ovl->sel_bz != 0) {
|
|
map_ovl->sel_bz--;
|
|
map_ovl->map_cursor_target_zpos += mMP_BLOCK_SIZE_F;
|
|
cursor_moved = TRUE;
|
|
}
|
|
}
|
|
else if (trigger & BUTTON_CRIGHT) {
|
|
if (map_ovl->sel_bx < FG_BLOCK_X_NUM - 1) {
|
|
map_ovl->sel_bx++;
|
|
map_ovl->map_cursor_target_xpos += mMP_BLOCK_SIZE_F;
|
|
cursor_moved = TRUE;
|
|
}
|
|
}
|
|
|
|
if (cursor_moved == TRUE) {
|
|
menu->proc_status = 2; // TODO: enum & name
|
|
sAdo_SysTrgStart(1);
|
|
}
|
|
|
|
map_ovl->cursor_frame++;
|
|
if (map_ovl->cursor_frame >= mMP_CURSOR_FRAMES) {
|
|
map_ovl->cursor_frame %= mMP_CURSOR_FRAMES;
|
|
}
|
|
else if (map_ovl->cursor_frame < 0) {
|
|
map_ovl->cursor_frame = 0;
|
|
}
|
|
}
|
|
|
|
static void mMP_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu) {
|
|
mMP_Overlay_c* map_ovl = submenu->overlay->map_ovl;
|
|
f32 x_remain = add_calc(&map_ovl->map_cursor_current_xpos, map_ovl->map_cursor_target_xpos, 0.7f, 19.0f, 1.8f);
|
|
f32 z_remain = add_calc(&map_ovl->map_cursor_current_zpos, map_ovl->map_cursor_target_zpos, 0.7f, 19.0f, 1.8f);
|
|
|
|
if (fabsf(x_remain) < 0.1f && fabsf(z_remain) < 0.1f) {
|
|
menu->proc_status = 1;
|
|
}
|
|
}
|
|
|
|
static void mMP_move_End(Submenu* submenu, mSM_MenuInfo_c* menu) {
|
|
(*submenu->overlay->move_End_proc)(submenu, menu);
|
|
}
|
|
|
|
typedef void (*mMP_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*);
|
|
static void mMP_map_ovl_move(Submenu* submenu) {
|
|
static mMP_MOVE_PROC ovl_move_proc[5] = {
|
|
&mMP_move_Move,
|
|
&mMP_move_Play,
|
|
&mMP_move_Wait,
|
|
(mMP_MOVE_PROC)&none_proc1,
|
|
&mMP_move_End
|
|
};
|
|
|
|
Submenu_Overlay_c* ovl = submenu->overlay;
|
|
mSM_MenuInfo_c* menu = &ovl->menu_info[mSM_OVL_MAP];
|
|
|
|
(*menu->pre_move_func)(submenu);
|
|
(*ovl_move_proc[menu->proc_status])(submenu, menu);
|
|
}
|
|
|
|
static void mMP_map_draw_init() {
|
|
kan_win_wakuT_model_p = kan_win_wakuT_model;
|
|
kan_win_waku1T_model_p = kan_waku_w1T_model;
|
|
kan_win_waku2T_model_p = kan_waku_w2T_model;
|
|
kan_win_waku3T_model_p = kan_waku_w3T_model;
|
|
kan_win_waku4T_model_p = kan_waku_w4T_model;
|
|
kan_win_color0_mode_p = kan_win_color0_mode;
|
|
kan_win_color1_mode_p = kan_win_color1_mode;
|
|
}
|
|
|
|
static int mMP_get_label_cnt(mMP_LabelInfo_c* label_info) {
|
|
int label_no = label_info->label_no;
|
|
if (label_no == mMP_LABEL_NPC || label_no == mMP_LABEL_PLAYER) {
|
|
return label_info->label_cnt;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static void mMP_set_house_dl(GRAPH* graph, mMP_Overlay_c* map_ovl, f32 pos_x, f32 pos_y) {
|
|
static f32 offset_x[3] = { 5.0f, 13.0f, 17.0f };
|
|
static f32 offset_y[3] = { -4.0f, -11.0f, -18.0f };
|
|
|
|
mMP_LabelInfo_c* label_info;
|
|
f32 y;
|
|
f32 base_x;
|
|
f32 temp_x;
|
|
f32 base_y;
|
|
mMP_ResidentInfo_c** resident_p;
|
|
int bz;
|
|
int bx;
|
|
int i;
|
|
Gfx* gfx;
|
|
|
|
label_info = (mMP_LabelInfo_c*)map_ovl->label_info;
|
|
|
|
base_y = (pos_y + 45.7f) + (0.5f * mMP_BLOCK_SIZE_F);
|
|
base_x = (pos_x + 11.7f) - (0.5f * mMP_BLOCK_SIZE_F);
|
|
|
|
OPEN_DISP(graph);
|
|
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
gSPDisplayList(gfx++, kan_win_mode);
|
|
|
|
/* draw all villager houses */
|
|
|
|
for (bz = 0; bz < FG_BLOCK_Z_NUM; bz++) {
|
|
temp_x = (pos_x + 11.7f) - (0.5f * mMP_BLOCK_SIZE_F);
|
|
for (bx = 0; bx < FG_BLOCK_X_NUM; bx++) {
|
|
if (label_info->label_no == mMP_LABEL_NPC) {
|
|
resident_p = label_info->residents;
|
|
|
|
for (i = 0; i < label_info->label_cnt; i++) {
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
Matrix_translate(
|
|
temp_x + offset_x[(*resident_p)->house_idx % 3],
|
|
base_y + offset_y[(*resident_p)->house_idx / 3],
|
|
140.0f,
|
|
1
|
|
);
|
|
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, kan_win_npc2T_table[(*resident_p)->house_layer]);
|
|
|
|
resident_p++;
|
|
}
|
|
}
|
|
|
|
temp_x += mMP_BLOCK_SIZE_F;
|
|
label_info++;
|
|
}
|
|
|
|
base_y -= mMP_BLOCK_SIZE_F;
|
|
//base_x = x_save;
|
|
}
|
|
|
|
/* draw "current acre" icon */
|
|
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
Matrix_translate(
|
|
((pos_x + 11.7f) - (0.5f * mMP_BLOCK_SIZE_F) + (f32)map_ovl->player_bx * mMP_BLOCK_SIZE_F) + 3.0f + 5.0f,
|
|
(pos_y + 45.7f - (0.5f * mMP_BLOCK_SIZE_F) - (f32)map_ovl->player_bz * mMP_BLOCK_SIZE_F) + 4.0f + 5.0f,
|
|
140.0f,
|
|
1
|
|
);
|
|
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, kan_win_genzaiT_model);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
static void mMP_set_map_dl(GRAPH* graph, mMP_Overlay_c* map_ovl) {
|
|
int bz;
|
|
int bx;
|
|
int block = 0;
|
|
Gfx* gfx;
|
|
|
|
OPEN_DISP(graph);
|
|
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
gDPSetTextureAdjustMode(gfx++, G_SPECIAL_TA_MODE, G_TA_DOLPHIN);
|
|
gSPDisplayList(gfx++, kan_tizu_mode);
|
|
|
|
Matrix_push();
|
|
Matrix_translate(11.7f, 45.7f, 0.0f, 1);
|
|
|
|
for (bz = 0; bz < FG_BLOCK_Z_NUM; bz++) {
|
|
for (bx = 0; bx < FG_BLOCK_X_NUM; bx++) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_8, map_ovl->map_texture[block]);
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_9, l_kan_tizu_pal[map_ovl->map_pal[block]]);
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, kan_tizu_model);
|
|
|
|
/* move right one acre */
|
|
Matrix_translate(mMP_BLOCK_SIZE_F, 0.0f, 0.0f, 1);
|
|
block++;
|
|
}
|
|
|
|
/* move left to '1' acre and down one acre */
|
|
Matrix_translate((-mMP_BLOCK_SIZE_F) * FG_BLOCK_X_NUM, -mMP_BLOCK_SIZE_F, 0.0f, 1);
|
|
}
|
|
|
|
Matrix_pull();
|
|
gDPSetTextureAdjustMode(gfx++, G_SPECIAL_TA_MODE, G_TA_N64);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
static void mMP_set_cursol_dl(GRAPH* graph, mMP_Overlay_c* map_ovl, f32 base_x, f32 base_y) {
|
|
static int col_g[mMP_CURSOR_FRAMES] = {
|
|
0,
|
|
1,
|
|
2,
|
|
5,
|
|
10,
|
|
20,
|
|
50,
|
|
75,
|
|
90,
|
|
100,
|
|
90,
|
|
75,
|
|
50,
|
|
20,
|
|
10,
|
|
5,
|
|
2,
|
|
1
|
|
};
|
|
|
|
static f32 cursol_scale[mMP_CURSOR_FRAMES] = {
|
|
1.0f,
|
|
1.015f,
|
|
1.03f,
|
|
1.04f,
|
|
1.05f,
|
|
1.06f,
|
|
1.07f,
|
|
1.08f,
|
|
1.09f,
|
|
1.1f,
|
|
1.09f,
|
|
1.08f,
|
|
1.07f,
|
|
1.06f,
|
|
1.05f,
|
|
1.04f,
|
|
1.03f,
|
|
1.015f
|
|
};
|
|
|
|
f32 x = map_ovl->map_cursor_current_xpos + base_x;
|
|
f32 y = map_ovl->map_cursor_current_zpos + base_y;
|
|
int frame = map_ovl->cursor_frame;
|
|
Gfx* gfx;
|
|
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
Matrix_translate(x + 11.7f, y + 45.7f, 140.0f, 1);
|
|
|
|
Matrix_scale(cursol_scale[frame], cursol_scale[frame], 1.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);
|
|
gDPSetPrimColor(gfx++, 0, 255, 255, col_g[frame], 255, 255);
|
|
gSPDisplayList(gfx++, kan_win_cursorT_model);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
static void mMP_set_label_dl(GAME* game, mMP_LabelInfo_c* label_info, f32 xpos, f32 ypos) {
|
|
mMP_Label_c* label = mMP_label_data[label_info->label_no];
|
|
|
|
if (label != NULL) {
|
|
mMP_ResidentInfo_c** resident_p = label_info->residents;
|
|
mMP_LabelWord_c* word;
|
|
f32 base_x = 160.0f + xpos;
|
|
f32 base_y = 120.0f - ypos;
|
|
int i;
|
|
|
|
for (i = 0; i < mMP_LABEL_WORD_NUM; i++) {
|
|
word = label->words[i];
|
|
|
|
if (word != NULL) {
|
|
if (word->str == NULL) {
|
|
/* draw resident name label (villagers, players) */
|
|
int j;
|
|
|
|
for (j = 0; j < label_info->label_cnt; j++) {
|
|
int width = mFont_GetStringWidth((*resident_p)->name, PLAYER_NAME_LEN, TRUE);
|
|
f32 scale_x = 54.0f / width;
|
|
|
|
if (scale_x > 0.75f) {
|
|
scale_x = 0.75f;
|
|
}
|
|
|
|
if (resident_p[0]->sex != -1) {
|
|
mFont_SetLineStrings(
|
|
game,
|
|
resident_p[0]->name, PLAYER_NAME_LEN,
|
|
base_x + word->ofs_x, base_y - word->ofs_y,
|
|
255, 75, 40, 255,
|
|
FALSE, TRUE,
|
|
scale_x, 0.75f,
|
|
mFont_MODE_POLY
|
|
);
|
|
}
|
|
else {
|
|
mFont_SetLineStrings(
|
|
game,
|
|
resident_p[0]->name, PLAYER_NAME_LEN,
|
|
base_x + word->ofs_x, base_y - word->ofs_y,
|
|
165, 145, 140, 255,
|
|
FALSE, TRUE,
|
|
scale_x, 0.75f,
|
|
mFont_MODE_POLY
|
|
);
|
|
}
|
|
|
|
resident_p++;
|
|
base_y += 12.0f;
|
|
}
|
|
}
|
|
else {
|
|
/* draw building name */
|
|
mFont_SetLineStrings(
|
|
game,
|
|
word->str, word->str_len,
|
|
base_x + word->ofs_x, base_y - word->ofs_y,
|
|
120, 95, 205, 255,
|
|
FALSE, TRUE,
|
|
0.75f, 0.75f,
|
|
mFont_MODE_POLY
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void mMP_set_base_dl(GRAPH* graph, mSM_MenuInfo_c* menu) {
|
|
Gfx* gfx;
|
|
|
|
OPEN_DISP(graph);
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
if (menu->data0 == 0) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_B, kan_win_color0_mode_p);
|
|
}
|
|
else {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_B, kan_win_color1_mode_p);
|
|
}
|
|
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, kan_win_model);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
static void mMP_set_win_dl(GRAPH* graph, mMP_Overlay_c* map_ovl, mMP_LabelInfo_c* label_info) {
|
|
int label_count = label_info->label_cnt;
|
|
Gfx* gfx;
|
|
|
|
OPEN_DISP(graph);
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
/* move X-acre number texture into segment 8 and Z-acre character texture int segment 9 */
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_8, kan_win_evw_anime_1_tex_table[map_ovl->sel_bx]);
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_9, kan_win_evw_anime_2_tex_table[map_ovl->sel_bz]);
|
|
|
|
/* move label area texture into segment 10 based on number of labels */
|
|
if (label_count == 4) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_A, kan_win_waku4T_model_p);
|
|
}
|
|
else if (label_count == 3) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_A, kan_win_waku3T_model_p);
|
|
}
|
|
else if (label_count == 1) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_A, kan_win_wakuT_model_p);
|
|
}
|
|
else if (label_count == 0) {
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_A, kan_win_waku1T_model_p);
|
|
}
|
|
else { /* label_count == 2 */
|
|
gSPSegment(gfx++, G_MWO_SEGMENT_A, kan_win_waku2T_model_p);
|
|
}
|
|
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, kan_win_model2);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
static void mMP_set_label_top_dl(GRAPH* graph, mMP_LabelInfo_c* label_info) {
|
|
mMP_Label_c* label = mMP_label_data[label_info->label_no];
|
|
mMP_ResidentInfo_c** resident_p;
|
|
|
|
if (label != NULL) {
|
|
int count = mMP_get_label_cnt(label_info);
|
|
int i;
|
|
Gfx* gfx;
|
|
|
|
OPEN_DISP(graph);
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
Matrix_push();
|
|
Matrix_translate(label->ofs_x, label->ofs_y, 0.0f, 1);
|
|
|
|
if (label_info->label_no == mMP_LABEL_NPC) {
|
|
resident_p = label_info->residents;
|
|
}
|
|
else {
|
|
resident_p = NULL;
|
|
}
|
|
|
|
for (i = 0; i < count; i++) {
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
|
|
if (resident_p != NULL && *resident_p != NULL && (*resident_p)->house_layer != 0) {
|
|
gSPDisplayList(gfx++, kan_win_npcT_table[(*resident_p)->house_layer]);
|
|
resident_p++;
|
|
}
|
|
else {
|
|
gSPDisplayList(gfx++, label->gfx);
|
|
|
|
if (resident_p != NULL) {
|
|
resident_p++;
|
|
}
|
|
}
|
|
|
|
Matrix_translate(0.0f, -12.0f, 0.0f, 1);
|
|
}
|
|
|
|
Matrix_pull();
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
}
|
|
|
|
static void mMP_set_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu) {
|
|
static u8 land_color[2][4] = {
|
|
{ 255, 0, 255, 255 },
|
|
{ 60, 60, 255, 255 },
|
|
};
|
|
|
|
GRAPH* graph = game->graph;
|
|
mMP_Overlay_c* map_ovl = submenu->overlay->map_ovl;
|
|
u8* col = land_color[menu->data0];
|
|
mMP_LabelInfo_c* label_info = &map_ovl->label_info[map_ovl->sel_bz][map_ovl->sel_bx];
|
|
u8* land_name;
|
|
f32 xpos = menu->position[0];
|
|
f32 ypos = menu->position[1];
|
|
f32 str_xpos;
|
|
f32 str_ypos;
|
|
|
|
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
Matrix_translate(xpos, ypos, 140.0f, 1);
|
|
|
|
mMP_set_base_dl(graph, menu);
|
|
mMP_set_map_dl(graph, map_ovl);
|
|
mMP_set_win_dl(graph, map_ovl, label_info);
|
|
mMP_set_label_top_dl(graph, label_info);
|
|
mMP_set_house_dl(graph, map_ovl, xpos, ypos);
|
|
mMP_set_cursol_dl(graph, map_ovl, xpos, ypos);
|
|
|
|
(*submenu->overlay->set_char_matrix_proc)(graph);
|
|
|
|
/* draw town name */
|
|
land_name = Save_Get(land_info.name);
|
|
str_xpos = (xpos + -136.0f) + 24.0f;
|
|
str_ypos = (ypos + 102.0f) + -29.0f;
|
|
mFont_SetLineStrings(
|
|
game,
|
|
land_name, map_ovl->land_name_str_len,
|
|
str_xpos + 160.0f, 120.0f - str_ypos,
|
|
col[0], col[1], col[2], 255,
|
|
FALSE, TRUE,
|
|
1.0f, 1.0f,
|
|
mFont_MODE_POLY
|
|
);
|
|
|
|
mMP_set_label_dl(game, label_info, xpos, ypos);
|
|
}
|
|
|
|
static void mMP_map_ovl_draw(Submenu* submenu, GAME* game) {
|
|
Submenu_Overlay_c* overlay = submenu->overlay;
|
|
mSM_MenuInfo_c* menu = &overlay->menu_info[mSM_OVL_MAP];
|
|
|
|
(*menu->pre_draw_func)(submenu, game);
|
|
mMP_set_dl(submenu, game, menu);
|
|
}
|
|
|
|
extern void mMP_map_ovl_set_proc(Submenu* submenu) {
|
|
Submenu_Overlay_c* overlay = submenu->overlay;
|
|
|
|
overlay->menu_control.menu_move_func = &mMP_map_ovl_move;
|
|
overlay->menu_control.menu_draw_func = &mMP_map_ovl_draw;
|
|
}
|
|
|
|
static void mMP_map_ovl_init(Submenu* submenu) {
|
|
Submenu_Overlay_c* overlay = submenu->overlay;
|
|
mSM_MenuInfo_c* menu = &overlay->menu_info[mSM_OVL_MAP];
|
|
|
|
overlay->menu_control.animation_flag = FALSE;
|
|
(*submenu->overlay->move_chg_base_proc)(menu, 5);
|
|
|
|
sAdo_SysTrgStart(0x17C);
|
|
mMP_set_init_data(submenu->overlay->map_ovl, menu);
|
|
}
|
|
|
|
extern void mMP_map_ovl_construct(Submenu* submenu) {
|
|
Submenu_Overlay_c* overlay = submenu->overlay;
|
|
|
|
if (overlay->map_ovl == NULL) {
|
|
overlay->map_ovl = (mMP_Overlay_c*)zelda_malloc(sizeof(mMP_Overlay_c));
|
|
mem_clear((u8*)overlay->map_ovl, sizeof(mMP_Overlay_c), 0);
|
|
overlay->map_ovl->combination_table = data_combi_table;
|
|
mMP_map_draw_init();
|
|
}
|
|
|
|
mMP_map_ovl_init(submenu);
|
|
mMP_map_ovl_set_proc(submenu);
|
|
}
|
|
|
|
extern void mMP_map_ovl_destruct(Submenu* submenu) {
|
|
mMP_Overlay_c* map_ovl = submenu->overlay->map_ovl;
|
|
|
|
if (map_ovl != NULL) {
|
|
zelda_free(map_ovl);
|
|
}
|
|
|
|
submenu->overlay->map_ovl = NULL;
|
|
}
|