mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
Merge pull request #247 from Cuyler36:ac_quest_talk_fj_init
Implement & link ac_quest_talk_fj_init.c
This commit is contained in:
@@ -434,6 +434,10 @@ ac_quest_manager.c:
|
||||
.text: [0x80485508, 0x80487A78]
|
||||
.data: [0x8068A520, 0x8068ADF8]
|
||||
.bss: [0x812FC920, 0x812FC938]
|
||||
ac_quest_talk_fj_init.c:
|
||||
.text: [0x80487A78, 0x80488474]
|
||||
.data: [0x8068ADF8, 0x8068AE40]
|
||||
.bss: [0x812FC938, 0x812FCA68]
|
||||
ac_rope.c:
|
||||
.text: [0x804967A4, 0x80496AB8]
|
||||
.rodata: [0x80644DB0, 0x80644DB8]
|
||||
|
||||
@@ -110,6 +110,16 @@ enum {
|
||||
mSM_IV_OPEN_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
mSM_BD_OPEN_WRITE,
|
||||
mSM_BD_OPEN_READ,
|
||||
mSM_BD_OPEN_REWRITE,
|
||||
mSM_BD_OPEN_WRITE_ISLAND,
|
||||
mSM_BD_OPEN_READ_ISLAND,
|
||||
|
||||
mSM_BD_OPEN_NUM
|
||||
};
|
||||
|
||||
typedef struct submenu_item_s {
|
||||
mActor_name_t item;
|
||||
u8 slot_no;
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
#include "ac_quest_talk_fj_init.h"
|
||||
|
||||
#include "m_common_data.h"
|
||||
#include "m_msg.h"
|
||||
|
||||
enum {
|
||||
aQMgr_FJ_TALK_STEP_SELECT_TALK,
|
||||
aQMgr_FJ_TALK_STEP_HINT_OR_HINT,
|
||||
aQMgr_FJ_TALK_STEP_HINT_OR_FJ,
|
||||
aQMgr_FJ_TALK_STEP_HAND_REWARD,
|
||||
aQMgr_FJ_TALK_STEP_GET_ITEM,
|
||||
aQMgr_FJ_TALK_STEP_WAIT_BUTTON,
|
||||
aQMgr_FJ_TALK_STEP_GET_ITEM_WAIT,
|
||||
aQMgr_FJ_TALK_STEP_REWARD_TO,
|
||||
aQMgr_FJ_TALK_STEP_LETTER_BEFORE,
|
||||
aQMgr_FJ_TALK_STEP_SHOW_LETTER,
|
||||
aQMgr_FJ_TALK_STEP_THANKS_LETTER_OPEN_MSG,
|
||||
aQMgr_FJ_TALK_STEP_WAIT_NOTHING,
|
||||
aQMgr_FJ_TALK_STEP_FINISH,
|
||||
|
||||
aQMgr_FJ_TALK_STEP_NUM
|
||||
};
|
||||
|
||||
static int aQMgr_fj_get_my_msg(int base_msg, int looks) {
|
||||
int msg_no = base_msg + looks * 2;
|
||||
|
||||
return msg_no;
|
||||
}
|
||||
|
||||
static int aQMgr_actor_decide_fj_message_no(aQMgr_target_c* target, int msg_type) {
|
||||
aQMgr_set_data_c* set_data_p = target->set_data_p;
|
||||
|
||||
return set_data_p->msg_start[msg_type];
|
||||
}
|
||||
|
||||
static void aQMgr_fj_set_msg_no(QUEST_MANAGER_ACTOR* manager) {
|
||||
int base_msg;
|
||||
int msg_no;
|
||||
|
||||
if (manager->msg_category != aQMgr_MSG_KIND_NONE) {
|
||||
manager->category_msg_no_start = aQMgr_actor_decide_fj_message_no(&manager->target, manager->msg_category);
|
||||
}
|
||||
|
||||
base_msg = manager->category_msg_no_start;
|
||||
if (base_msg != 15 && base_msg != 0) {
|
||||
int looks = mNpc_GetNpcLooks(*manager->client);
|
||||
|
||||
msg_no = aQMgr_fj_get_my_msg(base_msg, looks);
|
||||
}
|
||||
else {
|
||||
msg_no = base_msg;
|
||||
}
|
||||
|
||||
manager->msg_no = msg_no;
|
||||
manager->msg_category = aQMgr_MSG_KIND_NONE;
|
||||
manager->category_msg_no_start = 0;
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_to(QUEST_MANAGER_ACTOR* manager) {
|
||||
ACTOR* client = *manager->client;
|
||||
Animal_c* animal = ((NPC_ACTOR*)client)->npc_info.animal;
|
||||
aQMgr_regist_c* regist = manager->regist;
|
||||
int res = -1;
|
||||
|
||||
|
||||
if (animal != NULL) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aQMgr_REGIST_NUM; i++) {
|
||||
if (regist->quest_info != NULL) {
|
||||
if (mNpc_CheckCmpAnimalPersonalID(&animal->id, ®ist->to_id) == TRUE) {
|
||||
res = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
regist++;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int aQMgr_fj_check_own_quest(QUEST_MANAGER_ACTOR* manager) {
|
||||
int regist_idx = aQMgr_actor_check_to(manager);
|
||||
|
||||
if (regist_idx != -1) {
|
||||
mQst_base_c* quest_info = manager->regist[regist_idx].quest_info;
|
||||
|
||||
if (quest_info != NULL) {
|
||||
if (quest_info->progress == 0 || quest_info->progress == 1) {
|
||||
regist_idx = -1;
|
||||
}
|
||||
else {
|
||||
mActor_name_t item = ((mQst_errand_c*)quest_info)->item;
|
||||
|
||||
if (item != EMPTY_NO) {
|
||||
int idx = mPr_GetPossessionItemIdxWithCond(Common_Get(now_private), item, mPr_ITEM_COND_QUEST);
|
||||
|
||||
if (idx == -1) {
|
||||
regist_idx = -1;
|
||||
}
|
||||
else {
|
||||
((mQst_errand_c*)quest_info)->pockets_idx = idx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
regist_idx = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return regist_idx;
|
||||
}
|
||||
|
||||
static int aQMgr_get_select_hellow_no(QUEST_MANAGER_ACTOR* manager, int hour) {
|
||||
static int select_msg_no[aQMgr_TIME_NUM] = { 0x003E, 0x003F, 0x0040, 0x0040 };
|
||||
int time_idx = (*manager->get_time_kind_proc)(hour);
|
||||
|
||||
return select_msg_no[time_idx];
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_select_talk(QUEST_MANAGER_ACTOR* manager) {
|
||||
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
|
||||
aQMgr_choice_c* choice = &manager->choice;
|
||||
int regist_idx;
|
||||
|
||||
manager->mail_memory = NULL;
|
||||
mMsg_Unset_LockContinue(mMsg_Get_base_window_p());
|
||||
regist_idx = aQMgr_fj_check_own_quest(manager);
|
||||
|
||||
if (regist_idx != -1) {
|
||||
aQMgr_regist_c* regist = &manager->regist[regist_idx];
|
||||
|
||||
if (regist->quest_info != NULL) {
|
||||
if (regist->quest_info->quest_type == mQst_QUEST_TYPE_ERRAND && regist->quest_info->quest_kind == mQst_ERRAND_FIRSTJOB_SEND_LETTER) {
|
||||
regist_idx = -1;
|
||||
}
|
||||
else {
|
||||
choice->choice_ids[0] = 0x68;
|
||||
choice->choice_ids[1] = aQMgr_get_select_hellow_no(manager, rtc_time->hour);
|
||||
choice->choice_num = 3;
|
||||
choice->talk_action = -1;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_HINT_OR_FJ;
|
||||
manager->regist_idx = regist_idx;
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_TARGET);
|
||||
manager->target.quest_inv_item_idx = (*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_GET_ITEM_IDX);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (regist_idx == -1) {
|
||||
choice->choice_ids[0] = aQMgr_get_select_hellow_no(manager, rtc_time->hour);
|
||||
choice->choice_ids[1] = 0x2F;
|
||||
choice->choice_num = 3;
|
||||
choice->talk_action = -1;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_HINT_OR_HINT;
|
||||
manager->regist_idx = regist_idx;
|
||||
}
|
||||
|
||||
choice->choice_ids[2] = 0x16A + mQst_GetRandom(5);
|
||||
manager->category_msg_no_start = 0x2A6;
|
||||
mChoice_no_b_set(mChoice_Get_base_window_p());
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_MSG_NO);
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_CHOICE_STR);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_hint_or_hint(QUEST_MANAGER_ACTOR* manager) {
|
||||
if (manager->choice.talk_action == 0 || manager->choice.talk_action == 1) {
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_CHANGE_TALK_NORMAL);
|
||||
}
|
||||
else {
|
||||
manager->msg_category = aQMgr_MSG_KIND_NONE;
|
||||
manager->category_msg_no_start = 0x254A;
|
||||
manager->choice.talk_action = -1;
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_MSG_NO);
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
mMsg_Set_ForceNext(mMsg_Get_base_window_p());
|
||||
}
|
||||
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_hint_or_fj(QUEST_MANAGER_ACTOR* manager) {
|
||||
if (manager->choice.talk_action == 0) {
|
||||
mMsg_request_main_disappear_wait_type2(mMsg_Get_base_window_p());
|
||||
manager->msg_category = aQMgr_MSG_KIND_COMPLETE_INIT;
|
||||
aQMgr_fj_set_msg_no(manager);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_MSG_DISAPPEAR_WAIT;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_HAND_REWARD;
|
||||
mMsg_Set_ForceNext(mMsg_Get_base_window_p());
|
||||
}
|
||||
else if (manager->choice.talk_action == 1) {
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_CHANGE_TALK_NORMAL);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
}
|
||||
else {
|
||||
manager->msg_category = aQMgr_MSG_KIND_NONE;
|
||||
manager->category_msg_no_start = 0x254A;
|
||||
manager->choice.talk_action = -1;
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_MSG_NO);
|
||||
mMsg_Set_ForceNext(mMsg_Get_base_window_p());
|
||||
}
|
||||
|
||||
manager->choice.talk_action = -1;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_hand_reward(QUEST_MANAGER_ACTOR* manager) {
|
||||
Submenu* submenu = manager->submenu;
|
||||
int item_idx = manager->target.quest_inv_item_idx;
|
||||
|
||||
mSM_open_submenu_new2(submenu, mSM_OVL_INVENTORY, mSM_IV_OPEN_QUEST, item_idx, NULL, 1);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_HAND_ITEM_WAIT;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_GET_ITEM;
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_get_item(QUEST_MANAGER_ACTOR* manager) {
|
||||
if (manager->handover_item) {
|
||||
manager->msg_category = aQMgr_MSG_KIND_COMPLETE_INIT;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_GET_ITEM_WAIT;
|
||||
mQst_SetItemNameStr(manager->handover_item, mMsg_ITEM_STR0);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_MSG_APPEAR_WAIT;
|
||||
aQMgr_fj_set_msg_no(manager);
|
||||
}
|
||||
else {
|
||||
manager->regist_idx = -1;
|
||||
manager->target.free_data_p = NULL;
|
||||
manager->msg_category = aQMgr_MSG_KIND_NONE;
|
||||
manager->category_msg_no_start = 0x4AB;
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_MSG_NO);
|
||||
}
|
||||
|
||||
mMsg_ChangeMsgData(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
mMsg_request_main_appear_wait_type1(mMsg_Get_base_window_p());
|
||||
mMsg_Unset_LockContinue(mMsg_Get_base_window_p());
|
||||
mMsg_Set_ForceNext(mMsg_Get_base_window_p());
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_get_item_wait(QUEST_MANAGER_ACTOR* manager) {
|
||||
if (manager->target.quest_info.quest_kind == mQst_ERRAND_FIRSTJOB_DELIVER_AXE || manager->target.quest_info.quest_kind == mQst_ERRAND_FIRSTJOB_DELIVER_AXE2) {
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_WAIT_BUTTON;
|
||||
}
|
||||
else {
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_REWARD_TO;
|
||||
}
|
||||
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_NPC_HAND_WAIT_MSG_WAIT;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_wait_button(QUEST_MANAGER_ACTOR* manager) {
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_LETTER_BEFORE;
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_CHECK_BUTTON;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_reward_to(QUEST_MANAGER_ACTOR* manager) {
|
||||
int item_idx = manager->target.quest_inv_item_idx;
|
||||
int regist_idx = manager->regist_idx;
|
||||
|
||||
manager->regist[regist_idx].quest_info->progress = 0;
|
||||
mNpc_ClearAnimalPersonalID(&((mQst_errand_c*)manager->regist[regist_idx].quest_info)->recipient);
|
||||
mPr_SetPossessionItem(Common_Get(now_private), item_idx, manager->target.quest_item, mPr_ITEM_COND_NORMAL);
|
||||
manager->msg_category = aQMgr_MSG_KIND_COMPLETE_END;
|
||||
aQMgr_fj_set_msg_no(manager);
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_SET_NPC_TAKEOUT_ITEM);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_letter_before(QUEST_MANAGER_ACTOR* manager) {
|
||||
mMsg_request_main_disappear_wait_type2(mMsg_Get_base_window_p());
|
||||
mMsg_Set_LockContinue(mMsg_Get_base_window_p());
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_MSG_DISAPPEAR_WAIT;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_SHOW_LETTER;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_show_letter(QUEST_MANAGER_ACTOR* manager) {
|
||||
Submenu* submenu = manager->submenu;
|
||||
ACTOR* client = *manager->client;
|
||||
Animal_c* animal = ((NPC_ACTOR*)client)->npc_info.animal;
|
||||
static Mail_c show_mail;
|
||||
|
||||
mMl_clear_mail(&show_mail);
|
||||
mNpc_AnimalMail2Mail(&show_mail, &(*manager->memory)->letter, &(*manager->memory)->memory_player_id, &animal->id);
|
||||
mSM_open_submenu_new(submenu, mSM_OVL_BOARD, mSM_BD_OPEN_READ, 0, &show_mail);
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_HAND_ITEM_WAIT;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_THANKS_LETTER_OPEN_MSG;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_thanks_letter_open_msg(QUEST_MANAGER_ACTOR* manager) {
|
||||
int regist_idx = manager->regist_idx;
|
||||
|
||||
manager->regist[regist_idx].quest_info->progress = 0;
|
||||
mNpc_ClearAnimalPersonalID(&((mQst_errand_c*)manager->regist[regist_idx].quest_info)->recipient);
|
||||
manager->msg_category = aQMgr_MSG_KIND_COMPLETE_END;
|
||||
manager->talk_step = aQMgr_FJ_TALK_STEP_FINISH;
|
||||
mMsg_request_main_appear_wait_type1(mMsg_Get_base_window_p());
|
||||
aQMgr_fj_set_msg_no(manager);
|
||||
mMsg_ChangeMsgData(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
mMsg_Set_ForceNext(mMsg_Get_base_window_p());
|
||||
mMsg_Unset_LockContinue(mMsg_Get_base_window_p());
|
||||
manager->sub_talk_state = aQMgr_TALK_SUB_STATE_WAIT;
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
static void aQMgr_talk_fj_wait_nothing(QUEST_MANAGER_ACTOR* manager) { }
|
||||
|
||||
static void aQMgr_talk_fj_finish(QUEST_MANAGER_ACTOR* manager) {
|
||||
(*manager->talk_common_proc)(manager, aQMgr_TALK_COMMON_CLEAR_TALK_INFO);
|
||||
mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), manager->msg_no);
|
||||
}
|
||||
|
||||
typedef void (*aQMgr_FJ_TALK_PROC)(QUEST_MANAGER_ACTOR*);
|
||||
|
||||
extern void aQMgr_talk_first_job_init(QUEST_MANAGER_ACTOR* manager) {
|
||||
static aQMgr_FJ_TALK_PROC talk_proc[aQMgr_FJ_TALK_STEP_NUM] = {
|
||||
&aQMgr_talk_fj_select_talk,
|
||||
&aQMgr_talk_fj_hint_or_hint,
|
||||
&aQMgr_talk_fj_hint_or_fj,
|
||||
&aQMgr_talk_fj_hand_reward,
|
||||
&aQMgr_talk_fj_get_item,
|
||||
&aQMgr_talk_fj_wait_button,
|
||||
&aQMgr_talk_fj_get_item_wait,
|
||||
&aQMgr_talk_fj_reward_to,
|
||||
&aQMgr_talk_fj_letter_before,
|
||||
&aQMgr_talk_fj_show_letter,
|
||||
&aQMgr_talk_fj_thanks_letter_open_msg,
|
||||
&aQMgr_talk_fj_wait_nothing,
|
||||
&aQMgr_talk_fj_finish
|
||||
};
|
||||
int talk_step = manager->talk_step;
|
||||
int choice_no = mChoice_Get_ChoseNum(mChoice_Get_base_window_p());
|
||||
|
||||
mChoice_Clear_ChoseNum(mChoice_Get_base_window_p());
|
||||
manager->choice.talk_action = choice_no;
|
||||
(*talk_proc[talk_step])(manager);
|
||||
manager->talk_state = aQMgr_TALK_STATE_SUB;
|
||||
}
|
||||
+6
-6
@@ -1103,7 +1103,7 @@ static void mBD_move_Obey(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
||||
mem_copy(board_ovl->dst_p->content.footer + footer_len_diff, t_footer_p, footer_len - t_footer_len);
|
||||
}
|
||||
|
||||
if (menu_info->data0 != 3) {
|
||||
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);
|
||||
@@ -1396,7 +1396,7 @@ static void mBD_set_writing_header(Submenu* submenu, GAME* game, mSM_MenuInfo_c*
|
||||
int len;
|
||||
|
||||
if (menu_info->proc_status == mSM_OVL_PROC_PLAY) {
|
||||
if (menu_info->data0 == 3) {
|
||||
if (menu_info->data0 == mSM_BD_OPEN_WRITE_ISLAND) {
|
||||
mFont_SetLineStrings(
|
||||
game,
|
||||
mail_content->header, board_ovl->lengths[mBD_FIELD_HEADER],
|
||||
@@ -1463,7 +1463,7 @@ static void mBD_set_writing_header(Submenu* submenu, GAME* game, mSM_MenuInfo_c*
|
||||
else {
|
||||
u8 tmp_header[MAIL_HEADER_LEN + PLAYER_NAME_LEN];
|
||||
|
||||
if (menu_info->data0 == 3 || menu_info->data0 == 4) {
|
||||
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];
|
||||
}
|
||||
@@ -1529,7 +1529,7 @@ static void mBD_set_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info)
|
||||
|
||||
mBD_set_frame_dl(graph, menu_info, x, y, submenu->overlay->board_ovl);
|
||||
|
||||
if (menu_info->data0 == 1 || menu_info->data0 == 4 || submenu->overlay->board_ovl->first == FALSE) {
|
||||
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);
|
||||
}
|
||||
@@ -1564,7 +1564,7 @@ static void mBD_board_ovl_init(Submenu* submenu) {
|
||||
board_ovl->header_pos = mBD_HEADER_POS_PRE_NAME;
|
||||
board_ovl->dst_p = (Mail_c*)menu_info->data2;
|
||||
|
||||
if (menu_info->data0 == 0) {
|
||||
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;
|
||||
@@ -1589,7 +1589,7 @@ static void mBD_board_ovl_init(Submenu* submenu) {
|
||||
else {
|
||||
mMl_copy_mail(&board_ovl->mail, (Mail_c*)menu_info->data2);
|
||||
|
||||
if (menu_info->data0 == 1 || menu_info->data0 == 4) {
|
||||
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 {
|
||||
|
||||
+19
-11
@@ -3,6 +3,7 @@ import re
|
||||
import argparse
|
||||
from re import Match
|
||||
from io import TextIOWrapper
|
||||
import typing
|
||||
from ruamel.yaml import YAML
|
||||
from ruamel.yaml import CommentedMap
|
||||
from ruamel.yaml import CommentedSeq
|
||||
@@ -19,24 +20,24 @@ class SymbolInfo:
|
||||
self.start_address = start
|
||||
self.end_address = start + size
|
||||
|
||||
def get_address_range(self)->tuple[int, int]:
|
||||
def get_address_range(self)->typing.Tuple[int, int]:
|
||||
return self.start_address, self.end_address
|
||||
|
||||
class SliceSection:
|
||||
section_symbol: SymbolInfo = None
|
||||
symbols: list[SymbolInfo] = None
|
||||
symbols: typing.List[SymbolInfo] = None
|
||||
|
||||
def __init__(self, symbol: SymbolInfo) -> None:
|
||||
self.section_symbol = symbol
|
||||
self.symbols = []
|
||||
|
||||
class SliceInfo:
|
||||
sections: list[SliceSection] = None
|
||||
sections: typing.List[SliceSection] = None
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.sections = []
|
||||
|
||||
def get_address_range(self)->tuple[int, int]:
|
||||
def get_address_range(self)->typing.Tuple[int, int]:
|
||||
start_address = self.sections[0].section_symbol.start_address
|
||||
end_address = self.sections[-1].section_symbol.end_address
|
||||
if len(self.sections[-1].symbols) > 0:
|
||||
@@ -57,14 +58,14 @@ class Address_Sort_Entry:
|
||||
|
||||
#region Constants
|
||||
# Dictionary for the offsets we need to apply to the addresses from the map
|
||||
address_offset_map : dict[str, int] = {
|
||||
address_offset_map : typing.Dict[str, int] = {
|
||||
".text": int("0x803702A8", 16),
|
||||
".rodata": int("0x80641260", 16),
|
||||
".data": int("0x8064D500", 16),
|
||||
".bss": int("0x8125A7C0", 16)
|
||||
}
|
||||
|
||||
prioritized_addresses: list[str] = [".text", ".rodata", ".data", ".bss"]
|
||||
prioritized_addresses: typing.List[str] = [".text", ".rodata", ".data", ".bss"]
|
||||
|
||||
script_dir: str = os.path.dirname(os.path.realpath(__file__))
|
||||
root_dir: str = os.path.abspath(os.path.join(script_dir, ".."))
|
||||
@@ -79,7 +80,7 @@ slice_boundary_format = "[{start_address}, {end_address}]"
|
||||
#endregion
|
||||
|
||||
#region Sorting
|
||||
def sort_by_starting_address(data: CommentedMap, address_sort_keys: list[str])->CommentedMap:
|
||||
def sort_by_starting_address(data: CommentedMap, address_sort_keys: typing.List[str])->CommentedMap:
|
||||
if len(data) <= 1:
|
||||
return data
|
||||
|
||||
@@ -92,7 +93,14 @@ def sort_by_starting_address(data: CommentedMap, address_sort_keys: list[str])->
|
||||
if address_key not in entry:
|
||||
continue
|
||||
|
||||
starting_address = entry[address_key]
|
||||
# Ensure starting_address is an integer
|
||||
if isinstance(entry[address_key], int):
|
||||
starting_address = entry[address_key]
|
||||
elif isinstance(entry[address_key], CommentedSeq):
|
||||
starting_address = entry[address_key][0]
|
||||
else:
|
||||
print('Address key %s is not an int or CommentedSeq! type: %s value: %s' % (address_key, type(entry[address_key]), entry[address_key]))
|
||||
starting_address = 0
|
||||
break
|
||||
|
||||
ordered_entries.append(Address_Sort_Entry(key, entry, starting_address))
|
||||
@@ -169,7 +177,7 @@ def gather_symbols_for_section(address_offset: int, file_reader:TextIOWrapper, s
|
||||
symbol.end_address = next_match_start_address
|
||||
section.symbols.append(symbol)
|
||||
|
||||
def gather_tu_symbols(tu_name: str, map_path: str)->dict[str, SliceInfo]:
|
||||
def gather_tu_symbols(tu_name: str, map_path: str)->typing.Dict[str, SliceInfo]:
|
||||
gathered_symbols: dict[str, SliceInfo] = {}
|
||||
tu_regex = re.compile(specific_tu_pattern_format.format(tu_name = tu_name))
|
||||
|
||||
@@ -200,7 +208,7 @@ def gather_tu_symbols(tu_name: str, map_path: str)->dict[str, SliceInfo]:
|
||||
#endregion
|
||||
|
||||
#region Asset Slices Config File
|
||||
def update_asset_slice_config(tu_name: str, binary_slice_file_path: str, asset_slice_file_path: str, symbols_for_tu: dict[str, SliceInfo]):
|
||||
def update_asset_slice_config(tu_name: str, binary_slice_file_path: str, asset_slice_file_path: str, symbols_for_tu: typing.Dict[str, SliceInfo]):
|
||||
if ".data" not in symbols_for_tu:
|
||||
return
|
||||
|
||||
@@ -278,7 +286,7 @@ def update_asset_slice_config(tu_name: str, binary_slice_file_path: str, asset_s
|
||||
#endregion
|
||||
|
||||
#region Slice Config File
|
||||
def update_binary_slice_config(tu_name: str, slice_file_path: str, symbols_for_tu: dict[str, SliceInfo]):
|
||||
def update_binary_slice_config(tu_name: str, slice_file_path: str, symbols_for_tu: typing.Dict[str, SliceInfo]):
|
||||
yaml = YAML(typ="rt")
|
||||
yaml.indent(mapping=4, sequence=4, offset=4)
|
||||
data: CommentedMap = None
|
||||
|
||||
Reference in New Issue
Block a user