diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 184f592d..2a6ae8e7 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -55,6 +55,10 @@ m_lights.c: m_malloc.c: .text: [0x803BC510, 0x803BC70C] .bss: [0x81297CA0, 0x81297CD0] +m_mail.c: + .text: [0x803BC70C, 0x803BD230] + .data: [0x80656670, 0x806566C0] + .bss: [0x81297CD0, 0x81297E68] m_mail_password_check.c: .text: [0x803BD250, 0x803BEC9C] .data: [0x806566C0, 0x806571D8] diff --git a/include/m_land.h b/include/m_land.h index 31dbdaa2..1dfe5705 100644 --- a/include/m_land.h +++ b/include/m_land.h @@ -24,7 +24,7 @@ extern int mLd_CheckCmpLand(u8* name_a, u16 id_a, u8* name_b, u16 id_b); extern void mLd_ClearLandName(u8* name); extern void mLd_CopyLandName(u8* dst, u8* src); extern int mLd_AddMuraString(u8* name, int name_len); -extern void mLd_GetLandNameStringAddMura(u8* buf); +extern int mLd_GetLandNameStringAddMura(u8* buf); extern void mLd_SetFreeStrLandMuraName(u8* name, int free_str_no); extern u8* mLd_GetLandName(); extern u16 mLd_MakeLandId(); diff --git a/include/m_mail.h b/include/m_mail.h index 7a903026..d70d7251 100644 --- a/include/m_mail.h +++ b/include/m_mail.h @@ -3,6 +3,7 @@ #include "types.h" #include "m_personal_id.h" +#include "m_npc_personal_id.h" #include "m_actor_type.h" #ifdef __cplusplus @@ -13,6 +14,11 @@ extern "C" { #define MAIL_FOOTER_LEN 32 #define MAIL_BODY_LEN 192 +#define MAIL_FOOTER2_LEN 48 +#define MAIL_HEADER2_LEN (MAIL_FOOTER2_LEN - PLAYER_NAME_LEN) + +#define mMl_POSTOFFICE_GIFT_NUM 4 + enum { mMl_NAME_TYPE_PLAYER, mMl_NAME_TYPE_NPC, @@ -21,6 +27,16 @@ enum { mMl_TYPE_CLEAR = 0xFF }; +enum { + mMl_FONT_0, + mMl_FONT_SEND, + mMl_FONT_2, + mMl_FONT_3, + mMl_FONT_4, + + mMl_FONT_NUM +}; + /* sizeof(Mail_nm_c) == 0x16 */ typedef struct mail_nm_s { /* 0x00 */ PersonalID_c personalID; @@ -59,12 +75,29 @@ typedef struct mail_s { /* 0x02E */ Mail_ct_c content; } Mail_c; -extern int mMl_strlen(u8* str, int maxlen, u8 check_char); -extern void mMl_clear_mail_box(Mail_c* mail_box, int count); +extern int mMl_strlen(u8* str, int size, u8 end_char); +extern int mMl_strlen2(int* found, u8* str, int size, u8 end_char); +extern void mMl_clear_mail_header(Mail_hdr_c* header); extern void mMl_clear_mail(Mail_c* mail); +extern void mMl_clear_mail_box(Mail_c* mail, int num); +extern int mMl_check_not_used_mail(Mail_c* mail); +extern void mMl_copy_header_name(Mail_c* dst, Mail_c* src); extern void mMl_set_to_plname(Mail_c* mail, PersonalID_c* pid); -extern int mMl_chk_mail_free_space(Mail_c* mailbox, int count); +extern void mMl_set_playername(Mail_c* mail, PersonalID_c* pid); +extern void mMl_init_mail(Mail_c* mail, PersonalID_c* pid); +extern int mMl_chk_mail_free_space(Mail_c* mail, int num); +extern int mMl_count_use_mail_space(Mail_c* mail, int num); extern void mMl_copy_mail(Mail_c* dst, Mail_c* src); +extern void mMl_clear_mail_header_common(Mail_hs_c* header); +extern void mMl_set_mail_name_npcinfo(Mail_nm_c* name, AnmPersonalID_c* anm_pid); +extern int mMl_get_npcinfo_from_mail_name(AnmPersonalID_c* anm_pid, Mail_nm_c* name); +extern int mMl_hunt_for_send_address(Mail_c* mail); +extern int mMl_check_send_mail(Mail_c* mail); +extern int mMl_check_set_present_myself(Mail_c* mail); +extern int mMl_send_mail_box(PersonalID_c* recipient_pid, int player_no, Mail_c* mail, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type); +extern int mMl_send_mail_postoffice(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type); +extern int mMl_send_mail(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type); +extern void mMl_start_send_mail(); #ifdef __cplusplus } diff --git a/include/m_name_table.h b/include/m_name_table.h index b0c57f60..4a2007d1 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -367,11 +367,80 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define FTR_BIRTHDAY_CAKE_NORTH 0x11FE #define FTR_BIRTHDAY_CAKE_WEST 0x11FF -#define FTR0_END 0x1FFF - #define FTR_TAPEDECK 0x1E58 +#define FTR_PIGGY_BANK 0x1FAC + +#define FTR_TISSUE 0x1FB0 + +#define FTR0_END 0x1FFF + + #define ITM_PAPER_START 0x2000 +#define ITM_PAPER00 (ITM_PAPER_START + 0) +#define ITM_PAPER01 (ITM_PAPER_START + 1) +#define ITM_PAPER02 (ITM_PAPER_START + 2) +#define ITM_PAPER03 (ITM_PAPER_START + 3) +#define ITM_PAPER04 (ITM_PAPER_START + 4) +#define ITM_PAPER05 (ITM_PAPER_START + 5) +#define ITM_PAPER06 (ITM_PAPER_START + 6) +#define ITM_PAPER07 (ITM_PAPER_START + 7) +#define ITM_PAPER08 (ITM_PAPER_START + 8) +#define ITM_PAPER09 (ITM_PAPER_START + 9) +#define ITM_PAPER10 (ITM_PAPER_START + 10) +#define ITM_PAPER11 (ITM_PAPER_START + 11) +#define ITM_PAPER12 (ITM_PAPER_START + 12) +#define ITM_PAPER13 (ITM_PAPER_START + 13) +#define ITM_PAPER14 (ITM_PAPER_START + 14) +#define ITM_PAPER15 (ITM_PAPER_START + 15) +#define ITM_PAPER16 (ITM_PAPER_START + 16) +#define ITM_PAPER17 (ITM_PAPER_START + 17) +#define ITM_PAPER18 (ITM_PAPER_START + 18) +#define ITM_PAPER19 (ITM_PAPER_START + 19) +#define ITM_PAPER20 (ITM_PAPER_START + 20) +#define ITM_PAPER21 (ITM_PAPER_START + 21) +#define ITM_PAPER22 (ITM_PAPER_START + 22) +#define ITM_PAPER23 (ITM_PAPER_START + 23) +#define ITM_PAPER24 (ITM_PAPER_START + 24) +#define ITM_PAPER25 (ITM_PAPER_START + 25) +#define ITM_PAPER26 (ITM_PAPER_START + 26) +#define ITM_PAPER27 (ITM_PAPER_START + 27) +#define ITM_PAPER28 (ITM_PAPER_START + 28) +#define ITM_PAPER29 (ITM_PAPER_START + 29) +#define ITM_PAPER30 (ITM_PAPER_START + 30) +#define ITM_PAPER31 (ITM_PAPER_START + 31) +#define ITM_PAPER32 (ITM_PAPER_START + 32) +#define ITM_PAPER33 (ITM_PAPER_START + 33) +#define ITM_PAPER34 (ITM_PAPER_START + 34) +#define ITM_PAPER35 (ITM_PAPER_START + 35) +#define ITM_PAPER36 (ITM_PAPER_START + 36) +#define ITM_PAPER37 (ITM_PAPER_START + 37) +#define ITM_PAPER38 (ITM_PAPER_START + 38) +#define ITM_PAPER39 (ITM_PAPER_START + 39) +#define ITM_PAPER40 (ITM_PAPER_START + 40) +#define ITM_PAPER41 (ITM_PAPER_START + 41) +#define ITM_PAPER42 (ITM_PAPER_START + 42) +#define ITM_PAPER43 (ITM_PAPER_START + 43) +#define ITM_PAPER44 (ITM_PAPER_START + 44) +#define ITM_PAPER45 (ITM_PAPER_START + 45) +#define ITM_PAPER46 (ITM_PAPER_START + 46) +#define ITM_PAPER47 (ITM_PAPER_START + 47) +#define ITM_PAPER48 (ITM_PAPER_START + 48) +#define ITM_PAPER49 (ITM_PAPER_START + 49) +#define ITM_PAPER50 (ITM_PAPER_START + 50) +#define ITM_PAPER51 (ITM_PAPER_START + 51) +#define ITM_PAPER52 (ITM_PAPER_START + 52) +#define ITM_PAPER53 (ITM_PAPER_START + 53) +#define ITM_PAPER54 (ITM_PAPER_START + 54) +#define ITM_PAPER55 (ITM_PAPER_START + 55) +#define ITM_PAPER56 (ITM_PAPER_START + 56) +#define ITM_PAPER57 (ITM_PAPER_START + 57) +#define ITM_PAPER58 (ITM_PAPER_START + 58) +#define ITM_PAPER59 (ITM_PAPER_START + 59) +#define ITM_PAPER60 (ITM_PAPER_START + 60) +#define ITM_PAPER61 (ITM_PAPER_START + 61) +#define ITM_PAPER62 (ITM_PAPER_START + 62) +#define ITM_PAPER63 (ITM_PAPER_START + 63) #define ITM_PAPER_STACK_TWO_START 0x2040 #define ITM_PAPER_STACK_THREE_START 0x2080 #define ITM_PAPER_STACK_FOUR_START 0x20C0 @@ -801,10 +870,20 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITM_KABU_100 0x2F02 #define ITM_KABU_SPOILED 0x2F03 +#define FTR1_START 0x3000 + +#define FTR_POST_MODEL 0x3020 + #define FTR_ORANGEBOX 0x30F8 + #define FTR_COLLEGERULE_SOUTH 0x30FC + #define FTR_CALLIGRAPHY_PAD_WEST 0x313B +#define FTR_MAILBOX 0x3294 + +#define FTR1_END 0x3000 + #define DOOR_START 0x4000 #define DOOR0 DOOR_START /* 0x4000 */ #define DOOR1 (DOOR0 + 1) /* 0x4001 */ diff --git a/include/m_private.h b/include/m_private.h index 5de89ad6..16efe470 100644 --- a/include/m_private.h +++ b/include/m_private.h @@ -21,6 +21,12 @@ extern "C" { #define mPr_WALLET_MAX 99999 +#define mPr_FLAG_POSTOFFICE_GIFT0 (1 << 2) // 1,000,000 Bells +#define mPr_FLAG_POSTOFFICE_GIFT1 (1 << 3) // 10,000,000 Bells +#define mPr_FLAG_POSTOFFICE_GIFT2 (1 << 4) // 100,000,000 Bells +#define mPr_FLAG_POSTOFFICE_GIFT3 (1 << 5) // 999,999,999 Bells + + enum { mPr_PLAYER_0, mPr_PLAYER_1, diff --git a/rel/m_land.c b/rel/m_land.c index a15aafc2..4716bbe1 100644 --- a/rel/m_land.c +++ b/rel/m_land.c @@ -168,7 +168,7 @@ extern int mLd_AddMuraString(u8* name, int name_len) { * @brief Gets the town name with "Mura" (むら/村) added. * @param buf Buffer to store the town name with "Mura" (むら/村) added. */ -extern void mLd_GetLandNameStringAddMura(u8* buf) { +extern int mLd_GetLandNameStringAddMura(u8* buf) { int mura_size; u8* name = mLd_GetLandName(); @@ -179,6 +179,8 @@ extern void mLd_GetLandNameStringAddMura(u8* buf) { for (mura_size; mura_size < LAND_NAME_MURA_SIZE; mura_size++) { buf[mura_size] = CHAR_SPACE; } + + return mura_size; } /** diff --git a/rel/m_mail.c b/rel/m_mail.c new file mode 100644 index 00000000..d3734f10 --- /dev/null +++ b/rel/m_mail.c @@ -0,0 +1,380 @@ +#include "m_mail.h" + +#include "m_private.h" +#include "m_font.h" +#include "m_land.h" +#include "m_name_table.h" +#include "m_common_data.h" +#include "m_house.h" +#include "m_handbill.h" +#include "libultra/libultra.h" + +/* TODO: fix bss ordering*/ +static u8 free_str[16]; +static Mail_c l_ml_mail; +static u8 footer[MAIL_FOOTER2_LEN]; +static u8 header[MAIL_HEADER2_LEN]; + +extern int mMl_strlen(u8* str, int size, u8 end_char) { + u32 end_p = size + (u32)str; + int i; + + end_p--; + for (size; size != 0; size--) { + + if (*(u8*)end_p != end_char) { + return size; + } + + end_p--; + } + + return 0; +} + +extern int mMl_strlen2(int* found, u8* str, int size, u8 end_char) { + int len = 0; + + if (found != NULL) { + *found = FALSE; + } + + for (size; size != 0; size--) { + len++; + if (*str == end_char) { + if (found != NULL) { + *found = TRUE; + } + break; + } + + str++; + } + + return len; +} + +extern void mMl_clear_mail_header(Mail_hdr_c* header) { + mPr_ClearPersonalID(&header->recipient.personalID); + header->recipient.type = mMl_TYPE_CLEAR; + + mPr_ClearPersonalID(&header->sender.personalID); + header->sender.type = mMl_TYPE_CLEAR; +} + +extern void mMl_clear_mail(Mail_c* mail) { + bzero(mail, sizeof(Mail_c)); + mMl_clear_mail_header(&mail->header); + mem_clear(mail->content.header, MAIL_HEADER_LEN + MAIL_BODY_LEN + MAIL_FOOTER_LEN, CHAR_SPACE); + mail->content.font = -1; +} + +extern void mMl_clear_mail_box(Mail_c* mail, int num) { + while (num != 0) { + num--; + mMl_clear_mail(mail); + mail++; + } +} + +extern int mMl_check_not_used_mail(Mail_c* mail) { + int res = FALSE; + if (mail->content.font == 0xFF) { + res = TRUE; + } + + return res; +} + +extern void mMl_copy_header_name(Mail_c* dst, Mail_c* src) { + dst->header.recipient.type = src->header.recipient.type; + mPr_CopyPersonalID(&dst->header.recipient.personalID, &src->header.recipient.personalID); +} + +extern void mMl_set_to_plname(Mail_c* mail, PersonalID_c* pid) { + mPr_CopyPersonalID(&mail->header.recipient.personalID, pid); + mail->header.recipient.type = mMl_NAME_TYPE_PLAYER; +} + +extern void mMl_set_playername(Mail_c* mail, PersonalID_c* pid) { + mPr_CopyPersonalID(&mail->header.sender.personalID, pid); + mail->header.sender.type = mMl_NAME_TYPE_PLAYER; +} + +extern void mMl_init_mail(Mail_c* mail, PersonalID_c* pid) { + mMl_clear_mail(mail); + mMl_set_playername(mail, pid); + mail->content.font = mMl_FONT_SEND; + mail->content.mail_type = 0; + mail->content.paper_type = 0; +} + +extern int mMl_chk_mail_free_space(Mail_c* mail, int num) { + int free_idx; + + for (free_idx = 0; free_idx < num; free_idx++) { + if (mMl_check_not_used_mail(mail) == TRUE) { + return free_idx; + } + + mail++; + } + + return -1; +} + +extern int mMl_count_use_mail_space(Mail_c* mail, int num) { + int used = 0; + int i; + + for (i = 0; i < num; i++) { + if (mMl_check_not_used_mail(mail) != TRUE) { + used++; + } + + mail++; + } + + return used; +} + +extern void mMl_copy_mail(Mail_c* dst, Mail_c* src) { + mem_copy((u8*)dst, (u8*)src, sizeof(Mail_c)); +} + +extern void mMl_clear_mail_header_common(Mail_hs_c* header) { + header->header_back_start = -1; + header->unknown = 0; + mem_clear(header->header, MAIL_HEADER_LEN, CHAR_SPACE); + mem_clear(header->footer, MAIL_FOOTER_LEN, CHAR_SPACE); +} + +extern void mMl_set_mail_name_npcinfo(Mail_nm_c* name, AnmPersonalID_c* anm_pid) { + u8 animal_name[PLAYER_NAME_LEN]; + + name->type = mMl_NAME_TYPE_NPC; + mNpc_GetNpcWorldNameAnm(animal_name, anm_pid); + mPr_CopyPlayerName(name->personalID.player_name, animal_name); + name->personalID.land_id = anm_pid->land_id; + mLd_CopyLandName(name->personalID.land_name, anm_pid->land_name); + name->personalID.player_id = (((anm_pid->npc_id & 0xFF) << 8) | anm_pid->name_id); +} + +extern int mMl_get_npcinfo_from_mail_name(AnmPersonalID_c* anm_pid, Mail_nm_c* name) { + int res = FALSE; + + if (name->type == mMl_NAME_TYPE_NPC) { + anm_pid->npc_id = ((name->personalID.player_id & 0xFF00) >> 8) | NPC_START; + anm_pid->land_id = name->personalID.land_id; + mLd_CopyLandName(anm_pid->land_name, name->personalID.land_name); + anm_pid->name_id = name->personalID.player_id; + anm_pid->looks = mNpc_GetLooks(anm_pid->npc_id); + + res = TRUE; + } + + return res; +} + +extern int mMl_hunt_for_send_address(Mail_c* mail) { + int i; + + if (mail->header.recipient.type != mMl_NAME_TYPE_PLAYER) { + return -1; + } + + for (i = 0; i < mHS_HOUSE_NUM; i++) { + if (mPr_CheckCmpPersonalID(&Save_Get(homes[i]).ownerID, &mail->header.recipient.personalID) == TRUE) { + return i; + } + } + + return -1; +} + +extern int mMl_check_send_mail(Mail_c* mail) { + return mail->content.font == mMl_FONT_SEND; +} + +extern int mMl_check_set_present_myself(Mail_c* mail) { + u8 font = mail->content.font; + + if (font == mMl_FONT_SEND || font == mMl_FONT_3 || font == mMl_FONT_4) { + return TRUE; + } + + return FALSE; +} + +static void mMl_load_mail_data(Mail_c* mail, int mail_no) { + int header_back_start; + + mHandbill_Load_HandbillFromRom(mail->content.header, &header_back_start, mail->content.footer, mail->content.body, mail_no); + mail->content.header_back_start = header_back_start; +} + +/* TODO: fix bss ordering */ +static void mMl_load_mail_data2(Mail_c* mail, int mail_no) { + //static u8 header[MAIL_HEADER2_LEN]; + //static u8 footer[MAIL_FOOTER2_LEN]; + int header_back_start; + + mHandbill_Load_HandbillFromRom2(header, MAIL_HEADER2_LEN, &header_back_start, footer, MAIL_FOOTER2_LEN, mail->content.body, mail_no); + + bcopy(header, mail->content.header, MAIL_HEADER_LEN); + bcopy(footer, mail->content.footer, MAIL_FOOTER_LEN); + mail->content.header_back_start = header_back_start; +} + +static void mMl_get_mail_to_player_com(Mail_c* mail, PersonalID_c* recipient_pid, mActor_name_t present, mActor_name_t paper, u8* sender_name, int mail_no, u32 proc_type, u8 mail_type) { + static void (*get_proc[2])(Mail_c*, int) = { &mMl_load_mail_data, &mMl_load_mail_data2 }; + proc_type %= 2; + + mMl_clear_mail(mail); + (*get_proc[proc_type])(mail, mail_no); + mail->content.font = mMl_FONT_0; + mail->content.mail_type = mail_type; + + mPr_CopyPersonalID(&mail->header.recipient.personalID, recipient_pid); + mail->header.recipient.type = mMl_NAME_TYPE_PLAYER; + + mPr_ClearPersonalID(&mail->header.sender.personalID); + mPr_CopyPlayerName(mail->header.sender.personalID.player_name, sender_name); + mail->header.sender.type = mMl_NAME_TYPE_MUSEUM; + + mail->present = present; + mail->content.paper_type = (paper - ITM_PAPER_START) % 64; +} + +static int mMl_send_mail_box_com(PersonalID_c* recipient_pid, int player_no, Mail_c* mail, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type) { + mHm_hs_c* house; + int res = FALSE; + + house = Save_GetPointer(homes[mHS_get_arrange_idx(player_no)]); + + if (mPr_CheckCmpPersonalID(recipient_pid, &house->ownerID) == TRUE) { + int free_idx = mMl_chk_mail_free_space(house->mailbox, HOME_MAILBOX_SIZE); + if (free_idx != -1) { + mMl_get_mail_to_player_com(mail, recipient_pid, present, paper, sender_name, mail_no, proc_type, mail_type); + mMl_copy_mail(house->mailbox + free_idx, mail); + res = TRUE; + } + } + + return res; +} + +extern int mMl_send_mail_box(PersonalID_c* recipient_pid, int player_no, Mail_c* mail, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type) { + return mMl_send_mail_box_com(recipient_pid, player_no, mail, present, paper, mail_no, sender_name, proc_type, 0); +} + +static int mMl_send_mail_postoffice_com(Mail_c* mail, PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type) { + int res = FALSE; + + if (mPO_get_keep_mail_sum() < mPO_MAIL_STORAGE_SIZE) { + mMl_get_mail_to_player_com(mail, recipient_pid, present, paper, sender_name, mail_no, proc_type, mail_type); + res = mPO_receipt_proc(mail, mPO_SENDTYPE_MAIL); + } + + return res; +} + +extern int mMl_send_mail_postoffice(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type) { + return mMl_send_mail_postoffice_com(&l_ml_mail, recipient_pid, player_no, present, paper, mail_no, sender_name, proc_type, mail_type); +} + +static int mMl_send_mail_com(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type) { + Mail_c* mail = &l_ml_mail; + int res = mMl_send_mail_box_com(recipient_pid, player_no, mail, present, paper, mail_no, sender_name, proc_type, mail_type); + if (res != TRUE) { + res = mMl_send_mail_postoffice_com(mail, recipient_pid, player_no, present, paper, mail_no, sender_name, proc_type, mail_type); + } + + return res; +} + +extern int mMl_send_mail(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type) { + return mMl_send_mail_com(recipient_pid, player_no, present, paper, mail_no, sender_name, proc_type, 0); +} + +typedef struct post_office_gift_info_s { + int mail_no; + mActor_name_t present; + mActor_name_t paper; + int player_received_flag; + u32 required_balance; +} mMl_PostOffice_Info_c; + +static mMl_PostOffice_Info_c l_mml_postoffice_info[mMl_POSTOFFICE_GIFT_NUM] = { + { + 0x0246, + FTR_TISSUE, + ITM_PAPER00, + mPr_FLAG_POSTOFFICE_GIFT0, + 1000000 + }, + { + 0x0247, + FTR_PIGGY_BANK, + ITM_PAPER00, + mPr_FLAG_POSTOFFICE_GIFT1, + 10000000 + }, + { + 0x0248, + FTR_MAILBOX, + ITM_PAPER00, + mPr_FLAG_POSTOFFICE_GIFT2, + 100000000 + }, + { + 0x0249, + FTR_POST_MODEL, + ITM_PAPER00, + mPr_FLAG_POSTOFFICE_GIFT3, + 999999999 + } +}; + +static void mMl_send_postoffice_mail() { + //static u8 free_str[16]; // TODO: fix bss ordering + static u8 debug_name[PLAYER_NAME_LEN] = { 0x91, 0x92, 0x93, 0x94, 0x95, 0x91, 0x00, 0x00 }; + + Private_c* priv = Save_Get(private); + mMl_PostOffice_Info_c* po_info; + int town_name_len; + int i; + + town_name_len = mLd_GetLandNameStringAddMura(free_str); + mHandbill_Set_free_str(0, free_str, town_name_len); + + for (i = 0; i < PLAYER_NUM; i++) { + if (mPr_NullCheckPersonalID(&priv->player_ID) == FALSE) { + int j; + + mHandbill_Set_free_str(1, priv->player_ID.player_name, PLAYER_NAME_LEN); + po_info = l_mml_postoffice_info; + for (j = 0; j < mMl_POSTOFFICE_GIFT_NUM; j++) { + if ((priv->bank_account >= po_info->required_balance) && + (priv->state_flags & po_info->player_received_flag) == FALSE + ) { + int res = mMl_send_mail_com(&priv->player_ID, i, po_info->present, po_info->paper, po_info->mail_no, debug_name, 0, 10); + + if (res == TRUE) { + priv->state_flags |= po_info->player_received_flag; + } + + break; + } + + po_info++; + } + } + + priv++; + } +} + +extern void mMl_start_send_mail() { + mMl_send_postoffice_mail(); +}