mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-24 23:01:25 -04:00
1370 lines
62 KiB
C
1370 lines
62 KiB
C
#include "m_board_ovl.h"
|
|
|
|
#include "m_common_data.h"
|
|
#include "m_editor_ovl.h"
|
|
#include "m_editEndChk_ovl.h"
|
|
#include "m_font.h"
|
|
#include "m_tag_ovl.h"
|
|
#include "sys_matrix.h"
|
|
|
|
static mBD_Ovl_c board_ovl_data;
|
|
|
|
extern Gfx lat_letter01_model[];
|
|
extern Gfx lat_letter02_model[];
|
|
extern Gfx lat_letter03_model[];
|
|
extern Gfx lat_letter04_model[];
|
|
extern Gfx lat_letter05_model[];
|
|
extern Gfx lat_letter06_model[];
|
|
extern Gfx lat_letter07_model[];
|
|
extern Gfx lat_letter08_model[];
|
|
extern Gfx lat_letter09_model[];
|
|
extern Gfx lat_letter10_model[];
|
|
extern Gfx lat_letter11_model[];
|
|
extern Gfx lat_letter12_model[];
|
|
extern Gfx lat_letter13_model[];
|
|
extern Gfx lat_letter14_model[];
|
|
extern Gfx lat_letter15_model[];
|
|
extern Gfx lat_letter16_model[];
|
|
extern Gfx lat_letter17_model[];
|
|
extern Gfx lat_letter18_model[];
|
|
extern Gfx lat_letter19_model[];
|
|
extern Gfx lat_letter20_model[];
|
|
extern Gfx lat_letter21_model[];
|
|
extern Gfx lat_letter22_model[];
|
|
extern Gfx lat_letter23_model[];
|
|
extern Gfx lat_letter24_model[];
|
|
extern Gfx lat_letter25_model[];
|
|
extern Gfx lat_letter26_model[];
|
|
extern Gfx lat_letter27_model[];
|
|
extern Gfx lat_letter28_model[];
|
|
extern Gfx lat_letter29_model[];
|
|
extern Gfx lat_letter30_model[];
|
|
extern Gfx lat_letter31_model[];
|
|
extern Gfx lat_letter32_model[];
|
|
extern Gfx lat_letter33_model[];
|
|
extern Gfx lat_letter34_model[];
|
|
extern Gfx lat_letter35_model[];
|
|
extern Gfx lat_letter36_model[];
|
|
extern Gfx lat_letter37_model[];
|
|
extern Gfx lat_letter38_model[];
|
|
extern Gfx lat_letter39_model[];
|
|
extern Gfx lat_letter40_model[];
|
|
extern Gfx lat_letter41_model[];
|
|
extern Gfx lat_letter42_model[];
|
|
extern Gfx lat_letter43_model[];
|
|
extern Gfx lat_letter44_model[];
|
|
extern Gfx lat_letter45_model[];
|
|
extern Gfx lat_letter46_model[];
|
|
extern Gfx lat_letter47_model[];
|
|
extern Gfx lat_letter48_model[];
|
|
extern Gfx lat_letter49_model[];
|
|
extern Gfx lat_letter50_model[];
|
|
extern Gfx lat_letter51_model[];
|
|
extern Gfx lat_letter52_model[];
|
|
extern Gfx lat_letter53_model[];
|
|
extern Gfx lat_letter54_model[];
|
|
extern Gfx lat_letter55_model[];
|
|
extern Gfx lat_letter56_model[];
|
|
extern Gfx lat_letter57_model[];
|
|
extern Gfx lat_letter58_model[];
|
|
extern Gfx lat_letter59_model[];
|
|
extern Gfx lat_letter60_model[];
|
|
extern Gfx lat_letter61_model[];
|
|
extern Gfx lat_letter62_model[];
|
|
extern Gfx lat_letter63_win_model[];
|
|
extern Gfx lat_letter64_model[];
|
|
|
|
static Gfx* paper_disp_model[PAPER_NUM] = { lat_letter01_model,
|
|
lat_letter02_model,
|
|
lat_letter03_model,
|
|
lat_letter04_model,
|
|
lat_letter05_model,
|
|
lat_letter06_model,
|
|
lat_letter07_model,
|
|
lat_letter08_model,
|
|
lat_letter09_model,
|
|
lat_letter10_model,
|
|
lat_letter11_model,
|
|
lat_letter12_model,
|
|
lat_letter13_model,
|
|
lat_letter14_model,
|
|
lat_letter15_model,
|
|
lat_letter16_model,
|
|
lat_letter17_model,
|
|
lat_letter18_model,
|
|
lat_letter19_model,
|
|
lat_letter20_model,
|
|
lat_letter21_model,
|
|
lat_letter22_model,
|
|
lat_letter23_model,
|
|
lat_letter24_model,
|
|
lat_letter25_model,
|
|
lat_letter26_model,
|
|
lat_letter27_model,
|
|
lat_letter28_model,
|
|
lat_letter29_model,
|
|
lat_letter30_model,
|
|
lat_letter31_model,
|
|
lat_letter32_model,
|
|
lat_letter33_model,
|
|
lat_letter34_model,
|
|
lat_letter35_model,
|
|
lat_letter36_model,
|
|
lat_letter37_model,
|
|
lat_letter38_model,
|
|
lat_letter39_model,
|
|
lat_letter40_model,
|
|
lat_letter41_model,
|
|
lat_letter42_model,
|
|
lat_letter43_model,
|
|
lat_letter44_model,
|
|
lat_letter45_model,
|
|
lat_letter46_model,
|
|
lat_letter47_model,
|
|
lat_letter48_model,
|
|
lat_letter49_model,
|
|
lat_letter50_model,
|
|
lat_letter51_model,
|
|
lat_letter52_model,
|
|
lat_letter53_model,
|
|
lat_letter54_model,
|
|
lat_letter55_model,
|
|
lat_letter56_model,
|
|
lat_letter57_model,
|
|
lat_letter58_model,
|
|
lat_letter59_model,
|
|
lat_letter60_model,
|
|
lat_letter61_model,
|
|
lat_letter62_model,
|
|
lat_letter63_win_model,
|
|
lat_letter64_model,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL };
|
|
|
|
extern Gfx lat_letter01_sen_model[];
|
|
extern Gfx lat_letter02_sen_model[];
|
|
extern Gfx lat_letter03_sen_model[];
|
|
extern Gfx lat_letter04_senT_model[];
|
|
extern Gfx lat_letter06_sen_model[];
|
|
extern Gfx lat_letter07_sen_model[];
|
|
extern Gfx lat_letter08_sen_model[];
|
|
extern Gfx lat_letter10_sen_model[];
|
|
extern Gfx lat_letter12_sen_model[];
|
|
extern Gfx lat_letter16_sen_model[];
|
|
extern Gfx lat_letter17_sen_model[];
|
|
extern Gfx lat_letter18_sen_model[];
|
|
extern Gfx lat_letter20_sen_model[];
|
|
extern Gfx lat_letter21_sen_model[];
|
|
extern Gfx lat_letter22_sen_model[];
|
|
extern Gfx lat_letter29_sen_model[];
|
|
extern Gfx lat_letter30_sen_model[];
|
|
extern Gfx lat_letter31_sen_model[];
|
|
extern Gfx lat_letter32_sen_model[];
|
|
extern Gfx lat_letter33_sen_model[];
|
|
extern Gfx lat_letter34_sen_model[];
|
|
extern Gfx lat_letter35_sen_model[];
|
|
extern Gfx lat_letter36_sen_model[];
|
|
extern Gfx lat_letter37_sen_model[];
|
|
extern Gfx lat_letter38_sen_model[];
|
|
extern Gfx lat_letter39_sen_model[];
|
|
extern Gfx lat_letter40_sen_model[];
|
|
extern Gfx lat_letter41_sen_model[];
|
|
extern Gfx lat_letter42_sen_model[];
|
|
extern Gfx lat_letter43_sen_model[];
|
|
extern Gfx lat_letter44_sen_model[];
|
|
extern Gfx lat_letter45_sen_model[];
|
|
extern Gfx lat_letter46_sen_model[];
|
|
extern Gfx lat_letter47_sen_model[];
|
|
extern Gfx lat_letter48_sen_model[];
|
|
extern Gfx lat_letter49_sen_model[];
|
|
extern Gfx lat_letter50_sen_model[];
|
|
extern Gfx lat_letter51_sen_model[];
|
|
extern Gfx lat_letter52_sen_model[];
|
|
extern Gfx lat_letter53_sen_model[];
|
|
extern Gfx lat_letter54_sen_model[];
|
|
extern Gfx lat_letter55_sen_model[];
|
|
extern Gfx lat_letter56_sen_model[];
|
|
extern Gfx lat_letter57_sen_model[];
|
|
extern Gfx lat_letter58_sen_model[];
|
|
extern Gfx lat_letter59_sen_model[];
|
|
extern Gfx lat_letter60_sen_model[];
|
|
extern Gfx lat_letter61_sen_model[];
|
|
extern Gfx lat_letter62_sen_model[];
|
|
extern Gfx lat_letter63_senT_model[];
|
|
extern Gfx lat_letter64_sen_model[];
|
|
|
|
static Gfx* paper_disp_sen_model[PAPER_NUM] = { lat_letter01_sen_model,
|
|
lat_letter02_sen_model,
|
|
lat_letter03_sen_model,
|
|
lat_letter04_senT_model,
|
|
NULL,
|
|
lat_letter06_sen_model,
|
|
lat_letter07_sen_model,
|
|
lat_letter08_sen_model,
|
|
NULL,
|
|
lat_letter10_sen_model,
|
|
NULL,
|
|
lat_letter12_sen_model,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
lat_letter16_sen_model,
|
|
lat_letter17_sen_model,
|
|
lat_letter18_sen_model,
|
|
NULL,
|
|
lat_letter20_sen_model,
|
|
lat_letter21_sen_model,
|
|
lat_letter22_sen_model,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
lat_letter29_sen_model,
|
|
lat_letter30_sen_model,
|
|
lat_letter31_sen_model,
|
|
lat_letter32_sen_model,
|
|
lat_letter33_sen_model,
|
|
lat_letter34_sen_model,
|
|
lat_letter35_sen_model,
|
|
lat_letter36_sen_model,
|
|
lat_letter37_sen_model,
|
|
lat_letter38_sen_model,
|
|
lat_letter39_sen_model,
|
|
lat_letter40_sen_model,
|
|
lat_letter41_sen_model,
|
|
lat_letter42_sen_model,
|
|
lat_letter43_sen_model,
|
|
lat_letter44_sen_model,
|
|
lat_letter45_sen_model,
|
|
lat_letter46_sen_model,
|
|
lat_letter47_sen_model,
|
|
lat_letter48_sen_model,
|
|
lat_letter49_sen_model,
|
|
lat_letter50_sen_model,
|
|
lat_letter51_sen_model,
|
|
lat_letter52_sen_model,
|
|
lat_letter53_sen_model,
|
|
lat_letter54_sen_model,
|
|
lat_letter55_sen_model,
|
|
lat_letter56_sen_model,
|
|
lat_letter57_sen_model,
|
|
lat_letter58_sen_model,
|
|
lat_letter59_sen_model,
|
|
lat_letter60_sen_model,
|
|
lat_letter61_sen_model,
|
|
lat_letter62_sen_model,
|
|
lat_letter63_senT_model,
|
|
lat_letter64_sen_model,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL };
|
|
|
|
static rgba_t letter_color[PAPER_NUM] = {
|
|
{ 70, 40, 50, 255 }, { 40, 40, 130, 255 }, { 90, 30, 30, 255 }, { 75, 115, 215, 255 },
|
|
{ 90, 70, 20, 255 }, { 110, 60, 0, 255 }, { 95, 25, 0, 255 }, { 255, 255, 255, 255 },
|
|
{ 0, 100, 120, 255 }, { 40, 85, 0, 255 }, { 0, 40, 135, 255 }, { 155, 50, 60, 255 },
|
|
{ 255, 255, 255, 255 }, { 255, 255, 255, 255 }, { 90, 90, 90, 255 }, { 0, 10, 130, 255 },
|
|
{ 200, 255, 235, 255 }, { 70, 45, 30, 255 }, { 105, 65, 160, 255 }, { 65, 60, 0, 255 },
|
|
{ 60, 0, 90, 255 }, { 85, 85, 85, 255 }, { 255, 180, 0, 255 }, { 85, 55, 0, 255 },
|
|
{ 95, 75, 10, 255 }, { 120, 120, 120, 255 }, { 255, 255, 105, 255 }, { 109, 83, 21, 255 },
|
|
{ 0, 155, 0, 255 }, { 100, 130, 185, 255 }, { 0, 100, 0, 255 }, { 90, 100, 0, 255 },
|
|
{ 160, 0, 0, 255 }, { 115, 60, 0, 255 }, { 255, 185, 0, 255 }, { 255, 255, 205, 255 },
|
|
{ 0, 0, 100, 255 }, { 0, 100, 155, 255 }, { 0, 100, 205, 255 }, { 165, 20, 0, 255 },
|
|
{ 155, 40, 40, 255 }, { 0, 80, 135, 255 }, { 0, 20, 90, 255 }, { 100, 100, 155, 255 },
|
|
{ 0, 80, 5, 255 }, { 95, 70, 0, 255 }, { 100, 140, 100, 255 }, { 255, 255, 255, 255 },
|
|
{ 100, 110, 100, 255 }, { 80, 70, 0, 255 }, { 50, 155, 0, 255 }, { 0, 95, 175, 255 },
|
|
{ 0, 50, 90, 255 }, { 0, 60, 205, 255 }, { 0, 100, 0, 255 }, { 0, 80, 80, 255 },
|
|
{ 0, 115, 60, 255 }, { 100, 80, 100, 255 }, { 255, 255, 200, 255 }, { 90, 60, 0, 255 },
|
|
{ 55, 125, 0, 255 }, { 0, 155, 0, 255 }, { 70, 50, 235, 255 }, { 255, 255, 255, 255 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 },
|
|
{ 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 }
|
|
};
|
|
|
|
static int mBD_strLineCheck(u8** str_pp, u8* str_end_p, int* width, int* line) {
|
|
u8* str_p = *str_pp;
|
|
int res = mBD_LINE_CHECK_OK;
|
|
|
|
if (str_p >= str_end_p) {
|
|
res = mBD_LINE_CHECK_OVERSTRING;
|
|
} else if (*str_p == CHAR_NEW_LINE) {
|
|
str_pp[0] = str_p + 1;
|
|
line[0]++;
|
|
res = mBD_LINE_CHECK_NEWLINE;
|
|
} else {
|
|
width[0] += mFont_GetCodeWidth(*str_p, TRUE);
|
|
|
|
if (*width > mBD_MAX_WIDTH) {
|
|
res = mBD_LINE_CHECK_OVERLINE;
|
|
} else {
|
|
str_pp[0]++;
|
|
line[0]++;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static void mBD_roll_control(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl;
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
|
|
if (editor_ovl != NULL) {
|
|
int line;
|
|
int dist;
|
|
f32 pos;
|
|
f32 pos_dist;
|
|
f32 abs_pos_dist;
|
|
|
|
if (board_ovl->field == mBD_FIELD_BODY) {
|
|
line = editor_ovl->_24 + 2;
|
|
} else if (board_ovl->field == mBD_FIELD_HEADER) {
|
|
line = 0;
|
|
} else {
|
|
line = 9;
|
|
}
|
|
|
|
/* Calculate if we need to move the center of the display to the selected line */
|
|
dist = line - board_ovl->center_line;
|
|
if (dist < -2) {
|
|
board_ovl->center_line = line + 2;
|
|
menu_info->speed[1] = 1.0f;
|
|
} else if (dist > 2) {
|
|
board_ovl->center_line = line - 2;
|
|
menu_info->speed[1] = -1.0f;
|
|
}
|
|
|
|
pos = (f32)((board_ovl->center_line - 2) * 16);
|
|
pos_dist = pos - menu_info->position[1];
|
|
abs_pos_dist = fabsf(pos_dist);
|
|
|
|
if (abs_pos_dist > 0.1f) {
|
|
/* Interpolate to final position */
|
|
if (abs_pos_dist > 9.0f) {
|
|
menu_info->speed[1] *= 2.0f;
|
|
|
|
if (menu_info->speed[1] > 4.0f) {
|
|
menu_info->speed[1] = 4.0f;
|
|
}
|
|
} else if (abs_pos_dist < 7.0f) {
|
|
menu_info->speed[1] *= 0.5f;
|
|
|
|
if (menu_info->speed[1] < 1.0f) {
|
|
menu_info->speed[1] = 1.0f;
|
|
}
|
|
}
|
|
|
|
chase_f(&menu_info->position[1], pos, menu_info->speed[1]);
|
|
} else {
|
|
/* Close enough so immediately move to final position */
|
|
menu_info->position[1] = pos;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void mBD_roll_control2(mSM_MenuInfo_c* menu_info) {
|
|
f32 next_pos = menu_info->position[1] - menu_info->speed[1];
|
|
|
|
if (menu_info->speed[1] < 1.0f) {
|
|
menu_info->speed[1] = 1.0f;
|
|
}
|
|
|
|
if (next_pos > 0.0f) {
|
|
menu_info->position[1] = next_pos;
|
|
|
|
if (next_pos > -15.0f) {
|
|
/* Speed up if the position is greater than -15 */
|
|
|
|
/* -15 is a weird choice because we're supposed to slow down
|
|
after passing 31... */
|
|
menu_info->speed[1] *= 2.0f;
|
|
|
|
if (menu_info->speed[1] > 16.0f) {
|
|
menu_info->speed[1] = 16.0f;
|
|
}
|
|
} else if (next_pos < 31.0f) {
|
|
/* Slow down speed exponentially as we approach the top */
|
|
menu_info->speed[1] *= 0.5f;
|
|
|
|
if (menu_info->speed[1] < 1.0f) {
|
|
menu_info->speed[1] = 1.0f;
|
|
}
|
|
}
|
|
} else {
|
|
/* Clamp Y position to 0.0f */
|
|
menu_info->position[1] = 0.0f;
|
|
menu_info->speed[1] = 0.0f;
|
|
}
|
|
}
|
|
|
|
static void mBD_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
(*submenu->overlay->move_Move_proc)(submenu, menu_info);
|
|
}
|
|
|
|
static void mBD_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
if ((getTrigger() & (BUTTON_A | BUTTON_B | BUTTON_START))) {
|
|
(*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP);
|
|
sAdo_SysTrgStart(0x5F);
|
|
}
|
|
}
|
|
|
|
static void mBD_end_board(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
mSM_MenuInfo_c* address_menu = &submenu->overlay->menu_info[mSM_OVL_ADDRESS];
|
|
|
|
(*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP);
|
|
(*submenu->overlay->return_func_proc)(submenu, address_menu);
|
|
}
|
|
|
|
static void mBD_move_play(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
mSM_MenuInfo_c* editor_menu = &submenu->overlay->menu_info[mSM_OVL_EDITOR];
|
|
|
|
if (editor_menu->next_proc_status == mSM_OVL_PROC_END) {
|
|
menu_info->proc_status = mSM_OVL_PROC_OBEY;
|
|
submenu->overlay->board_ovl->center_line = 2;
|
|
mSM_open_submenu(submenu, mSM_OVL_EDITENDCHK, mEE_TYPE_BOARD, 0);
|
|
} else {
|
|
mBD_roll_control(submenu, menu_info);
|
|
}
|
|
}
|
|
|
|
static void mBD_move_Obey(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
mSM_MenuInfo_c* editEndChk_menu = &submenu->overlay->menu_info[mSM_OVL_EDITENDCHK];
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
mED_Ovl_c* editor_ovl;
|
|
Mail_hs_c* mail_header;
|
|
int footer_len;
|
|
int footer_len_diff;
|
|
int t_footer_len;
|
|
u8 t_footer[48];
|
|
u8* t_footer_p;
|
|
int i;
|
|
|
|
mBD_roll_control2(menu_info);
|
|
|
|
if (editEndChk_menu->proc_status == mSM_OVL_PROC_MOVE && editEndChk_menu->next_proc_status == mSM_OVL_PROC_END) {
|
|
editor_ovl = submenu->overlay->editor_ovl;
|
|
|
|
/* Did they select the 'yes' option? */
|
|
if (editEndChk_menu->data1 == 0) {
|
|
mail_header = &Common_Get(now_private)->saved_mail_header;
|
|
mMl_copy_mail(board_ovl->dst_p, &board_ovl->mail); // copy over mail
|
|
footer_len = mMl_strlen(board_ovl->mail.content.footer, MAIL_FOOTER_LEN, CHAR_SPACE);
|
|
footer_len_diff = board_ovl->lengths[mBD_FIELD_FOOTER] - footer_len;
|
|
mem_copy(t_footer, board_ovl->dst_p->content.footer, MAIL_FOOTER_LEN);
|
|
t_footer_p = t_footer;
|
|
t_footer_len = 0;
|
|
|
|
for (i = 0; i < footer_len; i++) {
|
|
if (*t_footer_p != CHAR_SPACE) {
|
|
break;
|
|
}
|
|
|
|
t_footer_len++;
|
|
t_footer_p++;
|
|
}
|
|
|
|
mem_clear(board_ovl->dst_p->content.footer, MAIL_FOOTER_LEN, CHAR_SPACE);
|
|
|
|
/* Check if we should copy part of the old footer back */
|
|
if (footer_len_diff < MAIL_FOOTER_LEN) {
|
|
mem_copy(board_ovl->dst_p->content.footer + footer_len_diff, t_footer_p, footer_len - t_footer_len);
|
|
}
|
|
|
|
if (menu_info->data0 != mSM_BD_OPEN_WRITE_ISLAND) {
|
|
mail_header->header_back_start = board_ovl->mail.content.header_back_start;
|
|
mem_copy(mail_header->header, board_ovl->dst_p->content.header, MAIL_HEADER_LEN);
|
|
mem_copy(mail_header->footer, board_ovl->dst_p->content.footer, MAIL_FOOTER_LEN);
|
|
}
|
|
|
|
/* Decrement stationery count */
|
|
if (menu_info->data1 != -1) {
|
|
int paper_tmp = Common_Get(now_private)->inventory.pockets[menu_info->data1] - ITM_PAPER_START;
|
|
int paper_num = (paper_tmp / PAPER_UNIQUE_NUM) + 1;
|
|
int paper_no = paper_tmp % PAPER_UNIQUE_NUM;
|
|
|
|
if (paper_num > 1) {
|
|
mPr_SetPossessionItem(Common_Get(now_private), menu_info->data1,
|
|
ITM_PAPER_START + paper_no + (paper_num - 2) * PAPER_UNIQUE_NUM,
|
|
mPr_ITEM_COND_NORMAL);
|
|
} else {
|
|
mPr_SetPossessionItem(Common_Get(now_private), menu_info->data1, EMPTY_NO, mPr_ITEM_COND_NORMAL);
|
|
}
|
|
|
|
(*submenu->overlay->tag_ovl->init_tag_data_item_win_proc)(submenu);
|
|
}
|
|
|
|
mBD_end_board(submenu, menu_info);
|
|
} else if (editEndChk_menu->data1 == 1) {
|
|
/* 'No' option was selected */
|
|
mSM_open_submenu_new2(submenu, mSM_OVL_EDITOR, mED_TYPE_BOARD, 0, board_ovl->mail.content.body,
|
|
MAIL_BODY_LEN);
|
|
board_ovl->field = mBD_FIELD_BODY;
|
|
board_ovl->header_pos = mBD_HEADER_POS_PRE_NAME;
|
|
menu_info->proc_status = mSM_OVL_PROC_PLAY;
|
|
} else {
|
|
/* 'Cancel' option was selected */
|
|
mBD_end_board(submenu, menu_info);
|
|
}
|
|
|
|
if (editor_ovl != NULL) {
|
|
editor_ovl->cursor_idx = 0;
|
|
editor_ovl->_22 = 0;
|
|
editor_ovl->_24 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void mBD_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
(*submenu->overlay->move_End_proc)(submenu, menu_info);
|
|
}
|
|
|
|
typedef void (*mBD_OVL_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*);
|
|
|
|
static void mBD_board_ovl_move(Submenu* submenu) {
|
|
static mBD_OVL_MOVE_PROC ovl_move_proc[mSM_OVL_PROC_NUM] = { &mBD_move_Move, &mBD_move_play, &mBD_move_Wait,
|
|
&mBD_move_Obey, &mBD_move_End };
|
|
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_BOARD];
|
|
|
|
(*menu_info->pre_move_func)(submenu);
|
|
(*ovl_move_proc[menu_info->proc_status])(submenu, menu_info);
|
|
}
|
|
|
|
extern Gfx lat_letter_mode[];
|
|
extern Gfx lat_letter_sen_mode[];
|
|
|
|
static void mBD_set_frame_dl(GRAPH* graph, mSM_MenuInfo_c* menu_info, f32 x, f32 y, mBD_Ovl_c* board_ovl) {
|
|
int paper_type = board_ovl->mail.content.paper_type;
|
|
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);
|
|
|
|
/* Draw paper background */
|
|
gSPDisplayList(gfx++, lat_letter_mode);
|
|
gSPDisplayList(gfx++, paper_disp_model[paper_type]);
|
|
|
|
/* Draw extra Gfx if necessary */
|
|
if (paper_disp_sen_model[paper_type] != NULL) {
|
|
gSPDisplayList(gfx++, lat_letter_sen_mode);
|
|
gSPDisplayList(gfx++, paper_disp_sen_model[paper_type]);
|
|
}
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
extern Gfx lat_point_mT_model[];
|
|
extern Gfx lat_hani_senT_model[];
|
|
|
|
static void mBD_set_point(Submenu* submenu, GAME* game, f32 x, f32 y) {
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
GRAPH* graph = game->graph;
|
|
u8* str_p;
|
|
int i;
|
|
int pre_back_width = 0;
|
|
Gfx* gfx;
|
|
|
|
str_p = board_ovl->mail.content.header;
|
|
i = board_ovl->mail.content.header_back_start;
|
|
while (i-- != 0) {
|
|
pre_back_width += mFont_GetCodeWidth(*str_p, TRUE);
|
|
str_p++;
|
|
}
|
|
|
|
board_ovl->ofs_x = x + (f32)pre_back_width + 36.0f + -96.0f;
|
|
board_ovl->ofs_y = y - -76.0f;
|
|
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
Matrix_translate(board_ovl->ofs_x, board_ovl->ofs_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++, lat_letter_mode);
|
|
gSPDisplayList(gfx++, lat_point_mT_model);
|
|
gSPDisplayList(gfx++, lat_hani_senT_model);
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
CLOSE_DISP(graph);
|
|
}
|
|
|
|
/* TODO: @nonmatching - float operation incorrectness in default switch case & cursol_draw call */
|
|
static void mBD_set_cursol(Submenu* submenu, GAME* game, f32 x, f32 y) {
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
|
|
if (board_ovl->header_pos == mBD_HEADER_POS_ON_NAME) {
|
|
mBD_set_point(submenu, game, x, y);
|
|
} else {
|
|
mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl;
|
|
f32 ofs_x;
|
|
f32 ofs_y;
|
|
f32 t_x;
|
|
f32 t_y;
|
|
f32 line;
|
|
|
|
switch (board_ovl->field) {
|
|
case mBD_FIELD_HEADER: {
|
|
int ox = 0;
|
|
|
|
if (board_ovl->header_pos == mBD_HEADER_POS_POST_NAME) {
|
|
ox = 80;
|
|
}
|
|
|
|
ofs_x = (f32)editor_ovl->_26 + (f32)ox + -7.0f;
|
|
ofs_y = 0.0f;
|
|
line = 0.0f;
|
|
break;
|
|
}
|
|
|
|
case mBD_FIELD_BODY: {
|
|
ofs_x = (f32)editor_ovl->_26 + -7.0f;
|
|
ofs_y = 12.0f;
|
|
line = (f32)(editor_ovl->_24 + 1);
|
|
break;
|
|
}
|
|
|
|
default: {
|
|
ofs_x = 192.0f - (f32)mFont_GetStringWidth(board_ovl->mail.content.footer,
|
|
board_ovl->lengths[mBD_FIELD_FOOTER], TRUE);
|
|
line = 7.0f;
|
|
ofs_x += (f32)editor_ovl->_26 + -7.0f;
|
|
// ofs_x = tmp + tmp2;
|
|
ofs_y = 24.0f;
|
|
break;
|
|
}
|
|
}
|
|
|
|
t_x = x + 64.0f + ofs_x;
|
|
t_y = (line * 16.0f);
|
|
(*submenu->overlay->editor_ovl->cursol_draw)(submenu, game, x + 64.0f + ofs_x, -y + 36.0f - t_y - ofs_y);
|
|
}
|
|
}
|
|
|
|
static void mBD_set_writing_footer(Submenu* submenu, GAME* game, f32 x, f32 y, rgba_t* color) {
|
|
int footer_len = submenu->overlay->board_ovl->lengths[mBD_FIELD_FOOTER];
|
|
int i;
|
|
int footer_size = 0;
|
|
u8* str_p;
|
|
|
|
str_p = submenu->overlay->board_ovl->mail.content.footer;
|
|
i = footer_len;
|
|
while (i-- != 0) {
|
|
footer_size += mFont_GetCodeWidth(*str_p, TRUE);
|
|
str_p++;
|
|
}
|
|
|
|
x += 192.0f - (f32)footer_size;
|
|
mFont_SetLineStrings(game, submenu->overlay->board_ovl->mail.content.footer, footer_len, x, y, color->r, color->g,
|
|
color->b, 255, FALSE, TRUE, 1.0f, 1.0f, mFont_MODE_POLY);
|
|
}
|
|
|
|
static void mBD_set_writing_body(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game, f32 x, f32* y, f32* end_x,
|
|
f32* end_y, rgba_t* color) {
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
u8* str = board_ovl->mail.content.body;
|
|
u8* str_p;
|
|
u8* str_end_p = str + submenu->overlay->board_ovl->lengths[mBD_FIELD_BODY];
|
|
int body_len;
|
|
int i;
|
|
int width = 0;
|
|
int line = 0;
|
|
int line_ret;
|
|
|
|
for (i = 0; i < mBD_BODY_LINE_NUM; i++) {
|
|
width = 0;
|
|
line = 0;
|
|
|
|
str_p = str;
|
|
do {
|
|
line_ret = mBD_strLineCheck(&str, str_end_p, &width, &line);
|
|
|
|
if (line_ret == mBD_LINE_CHECK_OVERSTRING) {
|
|
if (i != (mBD_BODY_LINE_NUM - 1) && ((str != str_p && str[-1] == CHAR_NEW_LINE) ||
|
|
width + mFont_GetCodeWidth(*str, TRUE) > mBD_MAX_WIDTH)) {
|
|
(*end_x) = (x + 1.0f) - 160.0f;
|
|
(*end_y) = -(*y + 16.0f) + 120.0f;
|
|
} else {
|
|
(*end_x) = (x + (f32)width + 1.0f) - 160.0f;
|
|
(*end_y) = -(*y) + 120.0f;
|
|
}
|
|
|
|
if (menu_info->proc_status != mSM_OVL_PROC_PLAY && str[-1] == CHAR_NEW_LINE) {
|
|
line--;
|
|
}
|
|
|
|
if (line != 0) {
|
|
mFont_SetLineStrings(game, str_p, line, x, *y, color->r, color->g, color->b, 255, FALSE, TRUE, 1.0f,
|
|
1.0f, mFont_MODE_POLY);
|
|
}
|
|
|
|
(*y) += (f32)(mBD_BODY_LINE_NUM - i) * 16.0f;
|
|
return;
|
|
}
|
|
} while (line_ret == mBD_LINE_CHECK_OK);
|
|
|
|
if (line_ret == mBD_LINE_CHECK_NEWLINE && menu_info->proc_status != mSM_OVL_PROC_PLAY) {
|
|
line--;
|
|
}
|
|
|
|
if (line != 0) {
|
|
mFont_SetLineStrings(game, str_p, line, x, *y, color->r, color->g, color->b, 255, FALSE, TRUE, 1.0f, 1.0f,
|
|
mFont_MODE_POLY);
|
|
}
|
|
|
|
(*y) += 16.0f;
|
|
}
|
|
}
|
|
|
|
/* TODO: @nonmatching - prolog instruction swap (likely due to way variables are accessed) */
|
|
static void mBD_set_writing_header(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info, f32 x, f32 y,
|
|
rgba_t* color) {
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
Mail_ct_c* mail_content = &board_ovl->mail.content;
|
|
u8* str_p;
|
|
int i = mail_content->header_back_start;
|
|
int header_len = 0;
|
|
int len;
|
|
|
|
if (menu_info->proc_status == mSM_OVL_PROC_PLAY) {
|
|
if (menu_info->data0 == mSM_BD_OPEN_WRITE_ISLAND) {
|
|
mFont_SetLineStrings(game, mail_content->header, board_ovl->lengths[mBD_FIELD_HEADER], x, y, color->r,
|
|
color->g, color->b, 255, FALSE, TRUE, 1.0f, 1.0f, mFont_MODE_POLY);
|
|
} else {
|
|
if (board_ovl->field == mBD_FIELD_HEADER) {
|
|
len = PLAYER_NAME_LEN;
|
|
} else {
|
|
len = board_ovl->header_name_len;
|
|
}
|
|
|
|
mFont_SetLineStrings(game, mail_content->header, mail_content->header_back_start, x, y, color->r, color->g,
|
|
color->b, 255, FALSE, TRUE, 1.0f, 1.0f, mFont_MODE_POLY);
|
|
|
|
str_p = mail_content->header;
|
|
while (i-- != 0) {
|
|
header_len += mFont_GetCodeWidth(*str_p, TRUE);
|
|
str_p++;
|
|
}
|
|
|
|
x += (f32)header_len;
|
|
mFont_SetLineStrings(game, board_ovl->mail.header.recipient.personalID.player_name, len, x, y, 185, 0, 0,
|
|
255, FALSE, TRUE, 1.0f, 1.0f, mFont_MODE_POLY);
|
|
|
|
if (mail_content->header_back_start < MAIL_HEADER_LEN) {
|
|
x += 80.0f;
|
|
mFont_SetLineStrings(game, &mail_content->header[mail_content->header_back_start],
|
|
board_ovl->lengths[mBD_FIELD_HEADER] - mail_content->header_back_start, x, y,
|
|
color->r, color->g, color->b, 255, FALSE, TRUE, 1.0f, 1.0f, mFont_MODE_POLY);
|
|
}
|
|
}
|
|
} else {
|
|
u8 tmp_header[MAIL_HEADER_LEN + PLAYER_NAME_LEN];
|
|
|
|
if (menu_info->data0 == mSM_BD_OPEN_WRITE_ISLAND || menu_info->data0 == mSM_BD_OPEN_READ_ISLAND) {
|
|
mem_copy(tmp_header, mail_content->header, board_ovl->lengths[mBD_FIELD_HEADER]);
|
|
len = board_ovl->lengths[mBD_FIELD_HEADER];
|
|
} else if (mail_content->mail_type == mMl_TYPE_SHOP_SALE_LEAFLET ||
|
|
mail_content->mail_type == mMl_TYPE_BROKER_SALE_LEAFLET || mail_content->mail_type == mMl_TYPE_5) {
|
|
mem_copy(tmp_header, mail_content->header, MAIL_HEADER_LEN);
|
|
len = MAIL_HEADER_LEN;
|
|
} else {
|
|
mem_copy(tmp_header, mail_content->header, mail_content->header_back_start);
|
|
mem_copy(&tmp_header[mail_content->header_back_start],
|
|
board_ovl->mail.header.recipient.personalID.player_name, board_ovl->header_name_len);
|
|
|
|
if (mail_content->header_back_start < MAIL_HEADER_LEN) {
|
|
mem_copy(&tmp_header[board_ovl->header_name_len + mail_content->header_back_start],
|
|
&mail_content->header[mail_content->header_back_start],
|
|
board_ovl->lengths[mBD_FIELD_HEADER] - mail_content->header_back_start);
|
|
}
|
|
|
|
len = board_ovl->header_name_len + board_ovl->lengths[mBD_FIELD_HEADER];
|
|
}
|
|
|
|
mFont_SetLineStrings(game, tmp_header, len, x, y, color->r, color->g, color->b, 255, FALSE, TRUE, 1.0f, 1.0f,
|
|
mFont_MODE_POLY);
|
|
}
|
|
}
|
|
|
|
static void mBD_set_character(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info, f32 x, f32 y) {
|
|
int paper_type = submenu->overlay->board_ovl->mail.content.paper_type;
|
|
rgba_t* color = &letter_color[paper_type];
|
|
f32 b_x = x + 64.0f;
|
|
f32 b_y = -y + 36.0f;
|
|
f32 end_x;
|
|
f32 end_y;
|
|
|
|
mBD_set_writing_header(submenu, game, menu_info, b_x, b_y, color);
|
|
|
|
b_y += 28.0f;
|
|
end_x = b_x - 160.0f;
|
|
end_y = -b_y + 120.0f;
|
|
mBD_set_writing_body(submenu, menu_info, game, b_x, &b_y, &end_x, &end_y, color);
|
|
b_y += 12.0f;
|
|
mBD_set_writing_footer(submenu, game, b_x, b_y, color);
|
|
|
|
if (menu_info->proc_status == mSM_OVL_PROC_PLAY && submenu->overlay->editor_ovl != NULL) {
|
|
mBD_set_cursol(submenu, game, x, y);
|
|
(*submenu->overlay->editor_ovl->end_code_draw)(submenu, game, end_x, end_y);
|
|
}
|
|
}
|
|
|
|
static void mBD_set_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) {
|
|
GRAPH* graph = game->graph;
|
|
f32 x = menu_info->position[0];
|
|
f32 y = menu_info->position[1];
|
|
|
|
mBD_set_frame_dl(graph, menu_info, x, y, submenu->overlay->board_ovl);
|
|
|
|
if (menu_info->data0 == mSM_BD_OPEN_READ || menu_info->data0 == mSM_BD_OPEN_READ_ISLAND ||
|
|
submenu->overlay->board_ovl->first == FALSE) {
|
|
(*submenu->overlay->set_char_matrix_proc)(graph);
|
|
mBD_set_character(submenu, game, menu_info, x, y);
|
|
}
|
|
}
|
|
|
|
static void mBD_board_ovl_draw(Submenu* submenu, GAME* game) {
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_BOARD];
|
|
|
|
(*menu_info->pre_draw_func)(submenu, game);
|
|
mBD_set_dl(submenu, game, menu_info);
|
|
}
|
|
|
|
extern void mBD_board_ovl_set_proc(Submenu* submenu) {
|
|
mSM_Control_c* control = &submenu->overlay->menu_control;
|
|
|
|
control->menu_move_func = &mBD_board_ovl_move;
|
|
control->menu_draw_func = &mBD_board_ovl_draw;
|
|
}
|
|
|
|
static void mBD_board_ovl_init(Submenu* submenu) {
|
|
static u8 header_str[3] = "To ";
|
|
static u8 footer_str[5] = "from ";
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_BOARD];
|
|
mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl;
|
|
|
|
submenu->overlay->menu_control.animation_flag = FALSE;
|
|
menu_info->proc_status = mSM_OVL_PROC_MOVE;
|
|
menu_info->move_drt = mSM_MOVE_IN_TOP;
|
|
|
|
board_ovl->field = mBD_FIELD_BODY;
|
|
board_ovl->center_line = 2;
|
|
board_ovl->header_pos = mBD_HEADER_POS_PRE_NAME;
|
|
board_ovl->dst_p = (Mail_c*)menu_info->data2;
|
|
|
|
if (menu_info->data0 == mSM_BD_OPEN_WRITE) {
|
|
Mail_hs_c* mail_header = &Common_Get(now_private)->saved_mail_header;
|
|
board_ovl->first = TRUE;
|
|
menu_info->next_proc_status = mSM_OVL_PROC_PLAY;
|
|
mSM_open_submenu_new2(submenu, mSM_OVL_ADDRESS, 0, 0, board_ovl->mail.content.body, mBD_MAX_WIDTH);
|
|
mMl_init_mail(&board_ovl->mail, &Common_Get(now_private)->player_ID);
|
|
board_ovl->mail.content.paper_type =
|
|
(Common_Get(now_private)->inventory.pockets[menu_info->data1] - ITM_PAPER_START) % PAPER_UNIQUE_NUM;
|
|
|
|
if (mail_header->header_back_start == -1) {
|
|
int name_len = mMl_strlen(Common_Get(now_private)->player_ID.player_name, PLAYER_NAME_LEN, CHAR_SPACE);
|
|
|
|
mem_copy(board_ovl->mail.content.header, header_str, sizeof(header_str));
|
|
mem_copy(board_ovl->mail.content.footer + sizeof(footer_str),
|
|
Common_Get(now_private)->player_ID.player_name, name_len);
|
|
mem_copy(board_ovl->mail.content.footer, footer_str, sizeof(footer_str));
|
|
board_ovl->mail.content.header_back_start = sizeof(header_str);
|
|
} else {
|
|
mem_copy(board_ovl->mail.content.header, mail_header->header, MAIL_HEADER_LEN);
|
|
mem_copy(board_ovl->mail.content.footer, mail_header->footer, MAIL_FOOTER_LEN);
|
|
board_ovl->mail.content.header_back_start = mail_header->header_back_start;
|
|
}
|
|
} else {
|
|
mMl_copy_mail(&board_ovl->mail, (Mail_c*)menu_info->data2);
|
|
|
|
if (menu_info->data0 == mSM_BD_OPEN_READ || menu_info->data0 == mSM_BD_OPEN_READ_ISLAND) {
|
|
menu_info->next_proc_status = mSM_OVL_PROC_WAIT;
|
|
} else {
|
|
menu_info->next_proc_status = mSM_OVL_PROC_PLAY;
|
|
mSM_open_submenu_new2(submenu, mSM_OVL_ADDRESS, 1, 0, board_ovl->mail.content.body, mBD_MAX_WIDTH);
|
|
}
|
|
|
|
board_ovl->first = FALSE;
|
|
board_ovl->header_name_len =
|
|
mMl_strlen(board_ovl->mail.header.recipient.personalID.player_name, PLAYER_NAME_LEN, CHAR_SPACE);
|
|
}
|
|
|
|
board_ovl->lengths[mBD_FIELD_HEADER] = mMl_strlen(board_ovl->mail.content.header, MAIL_HEADER_LEN, CHAR_SPACE);
|
|
board_ovl->lengths[mBD_FIELD_FOOTER] = mMl_strlen(board_ovl->mail.content.footer, MAIL_FOOTER_LEN, CHAR_SPACE);
|
|
board_ovl->lengths[mBD_FIELD_BODY] = mMl_strlen(board_ovl->mail.content.body, MAIL_BODY_LEN, CHAR_SPACE);
|
|
|
|
if (board_ovl->mail.content.header_back_start > MAIL_HEADER_LEN) {
|
|
board_ovl->mail.content.header_back_start = MAIL_HEADER_LEN;
|
|
}
|
|
|
|
if (board_ovl->mail.content.header_back_start > board_ovl->lengths[mBD_FIELD_HEADER]) {
|
|
board_ovl->lengths[mBD_FIELD_HEADER] = board_ovl->mail.content.header_back_start;
|
|
}
|
|
|
|
board_ovl->ofs_x = 0.0f;
|
|
board_ovl->ofs_y = 76.0f;
|
|
|
|
if (board_ovl->lengths[mBD_FIELD_FOOTER] != 0) {
|
|
int i;
|
|
u8* tmp_footer_p;
|
|
u8 tmp_footer[MAIL_FOOTER_LEN];
|
|
|
|
/* Cut out any left padding spaces */
|
|
tmp_footer_p = tmp_footer;
|
|
mem_copy(tmp_footer_p, board_ovl->mail.content.footer, MAIL_FOOTER_LEN);
|
|
for (i = 0; i < board_ovl->lengths[mBD_FIELD_FOOTER]; i++, tmp_footer_p++) {
|
|
if (*tmp_footer_p != CHAR_SPACE) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
mem_clear(board_ovl->mail.content.footer, MAIL_FOOTER_LEN, CHAR_SPACE);
|
|
mem_copy(board_ovl->mail.content.footer, tmp_footer_p, board_ovl->lengths[mBD_FIELD_FOOTER] - i);
|
|
}
|
|
}
|
|
|
|
extern void mBD_board_ovl_construct(Submenu* submenu) {
|
|
if (submenu->overlay->board_ovl == NULL) {
|
|
submenu->overlay->board_ovl = &board_ovl_data;
|
|
}
|
|
|
|
mBD_board_ovl_init(submenu);
|
|
mBD_board_ovl_set_proc(submenu);
|
|
}
|
|
|
|
extern void mBD_board_ovl_destruct(Submenu* submenu) {
|
|
submenu->overlay->board_ovl = NULL;
|
|
}
|