diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 0e6ec5ba..24e32317 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -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] diff --git a/include/m_submenu.h b/include/m_submenu.h index 8a07b4c9..39906db5 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -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; diff --git a/src/ac_quest_talk_fj_init.c b/src/ac_quest_talk_fj_init.c new file mode 100644 index 00000000..b6b0aec4 --- /dev/null +++ b/src/ac_quest_talk_fj_init.c @@ -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; +} diff --git a/src/m_board_ovl.c b/src/m_board_ovl.c index b37d49d9..5da621d8 100644 --- a/src/m_board_ovl.c +++ b/src/m_board_ovl.c @@ -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 { diff --git a/tools/tu_config.py b/tools/tu_config.py index b4d346f7..da3cbe6f 100644 --- a/tools/tu_config.py +++ b/tools/tu_config.py @@ -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