diff --git a/titles/sao/base.py b/titles/sao/base.py index 24dd22d..936f017 100644 --- a/titles/sao/base.py +++ b/titles/sao/base.py @@ -305,31 +305,10 @@ class SaoBase: def handle_c816(self, header: SaoRequestHeader, request: bytes) -> bytes: #custom/synthesize_enhancement_equipment - req = bytes.fromhex(request)[24:] - - req_struct = Struct( - Padding(20), - "ticket_id" / Bytes(1), # needs to be parsed as an int - Padding(1), - "user_id_size" / Rebuild(Int32ub, len_(this.user_id) * 2), # calculates the length of the user_id - "user_id" / PaddedString(this.user_id_size, "utf_16_le"), # user_id is a (zero) padded string - "origin_user_equipment_id_size" / Rebuild(Int32ub, len_(this.origin_user_equipment_id) * 2), # calculates the length of the origin_user_equipment_id - "origin_user_equipment_id" / PaddedString(this.origin_user_equipment_id_size, "utf_16_le"), # origin_user_equipment_id is a (zero) padded string - Padding(3), - "material_common_reward_user_data_list_length" / Rebuild(Int8ub, len_(this.material_common_reward_user_data_list)), # material_common_reward_user_data_list is a byte, - "material_common_reward_user_data_list" / Array(this.material_common_reward_user_data_list_length, Struct( - "common_reward_type" / Int16ub, # team_no is a byte - "user_common_reward_id_size" / Rebuild(Int32ub, len_(this.user_common_reward_id) * 2), # calculates the length of the user_common_reward_id - "user_common_reward_id" / PaddedString(this.user_common_reward_id_size, "utf_16_le"), # user_common_reward_id is a (zero) padded string - )), - ) - - req_data = req_struct.parse(req) - - user_id = req_data.user_id + req_data = SaoSynthesizeEnhancementEquipmentRequest(header, request) synthesize_equipment_data = self.game_data.item.get_user_equipment(req_data.user_id, req_data.origin_user_equipment_id) - for i in range(0,req_data.material_common_reward_user_data_list_length): + for i in range(0,req_data.material_common_reward_user_data_count): itemList = self.game_data.static.get_item_id(req_data.material_common_reward_user_data_list[i].user_common_reward_id) heroList = self.game_data.static.get_hero_id(req_data.material_common_reward_user_data_list[i].user_common_reward_id) diff --git a/titles/sao/handlers/base.py b/titles/sao/handlers/base.py index 16bc3a9..d1c1efc 100644 --- a/titles/sao/handlers/base.py +++ b/titles/sao/handlers/base.py @@ -2055,7 +2055,6 @@ class SaoSynthesizeEnhancementHeroLogRequest(SaoBaseRequest): off += mat.get_size() self.material_common_reward_user_data_list.append(mat) - class SaoSynthesizeEnhancementHeroLogResponse(SaoBaseResponse): def __init__(self, cmd, hero_data) -> None: super().__init__(cmd) @@ -2207,9 +2206,31 @@ class SaoSynthesizeEnhancementHeroLogResponse(SaoBaseResponse): self.length = len(resp_data) return super().make() + resp_data -class SaoSynthesizeEnhancementEquipment(SaoBaseRequest): +class SaoSynthesizeEnhancementEquipmentRequest(SaoBaseRequest): def __init__(self, header: SaoRequestHeader, data: bytes) -> None: super().__init__(header, data) + off = 0 + ticket_id = decode_str(data, 0) + self.ticket_id = ticket_id[0] + off += ticket_id[1] + + user_id = decode_str(data, 0) + self.user_id = user_id[0] + off += user_id[1] + + origin_user_equipment_id = decode_str(data, 0) + self.origin_user_equipment_id = origin_user_equipment_id[0] + off += origin_user_equipment_id[1] + + self.material_common_reward_user_data_list: List[MaterialCommonRewardUserData] + + self.material_common_reward_user_data_count = decode_int(data, off) + off += INT_OFF + + for _ in range(self.material_common_reward_user_data_count): + mat = MaterialCommonRewardUserData(data, off) + off += mat.get_size() + self.material_common_reward_user_data_list.append(mat) class SaoSynthesizeEnhancementEquipmentResponse(SaoBaseResponse): def __init__(self, cmd, synthesize_equipment_data) -> None: