Beispiel #1
0
    def read(self, f, endian):
        address = f.tell()
        self.data = BCSPart(
            *struct.unpack(endian +
                           BCS_PART_BYTE_ORDER, f.read(BCS_PART_SIZE)))
        self.name = re.sub(r'[^\x20-\x7f]', '', self.name.decode())
        # print(self.data)
        if self.emd_offset:
            self.emd_name = read_name(f, address + self.emd_offset)
        if self.emm_offset:
            self.emm_name = read_name(f, address + self.emm_offset)
            # print(f'emm: {self.emm_name}')
        if self.emb_offset:
            self.emb_name = read_name(f, address + self.emb_offset)
            # print(f'emb: {self.emb_name}')
        if self.ean_offset:
            self.ean_name = read_name(f, address + self.ean_offset)
            # print(f'ean: {self.ean_name}')

        # Color Selectors
        self.color_selectors.clear()
        for i in range(self.num_color_selectors):
            f.seek(address + self.color_selector_offset +
                   i * BCS_COLOR_SELECTOR_SIZE)
            color_selector = ColorSelector()
            color_selector.read(f, endian)
            self.color_selectors.append(color_selector)

        # Physics
        self.physics.clear()
        for i in range(self.num_physics):
            f.seek(address + self.physics_offset + i * BCS_PHYSICS_SIZE)
            physics = Physics()
            physics.read(f, endian)
            self.physics.append(physics)

        # Unk3 Hack
        self.unk3.clear()
        if self.num_unk3:
            f.seek(address + self.unk3_offset)
            unk3_start_address = f.tell()
            i = 0
            while i < self.num_unk3:
                unk3 = struct.unpack(endian + "I", f.read(4))[0]
                if unk3 == 8:
                    i += 1

            unk3 = struct.unpack(endian + "I", f.read(4))[0]

            while True:
                h1 = unk3 & 0xFFFF
                h2 = unk3 >> 16
                unk3 = struct.unpack(endian + "I", f.read(4))[0]
                if h1 != h2:
                    break
            unk3_end_address = f.tell() - 4  # remove a byte
            unk3_length = unk3_end_address - unk3_start_address
            f.seek(unk3_start_address)
            self.unk3 = list(
                struct.unpack(endian + unk3_length * "B", f.read(unk3_length)))
Beispiel #2
0
 def read(self, f, endian):
     address = f.tell()
     self.data = BCSBone(
         *struct.unpack(endian +
                        BCS_BONE_BYTE_ORDER, f.read(BCS_BONE_SIZE)))
     if self.name_offset:
         self.name = read_name(f, address + self.name_offset)
Beispiel #3
0
 def read(self, f, endian):
     address = f.tell()
     self.data = BCSPartColor(*struct.unpack(
         endian + BCS_PART_COLOR_BYTE_ORDER, f.read(BCS_PART_COLOR_SIZE)))
     # print(self.data)
     if self.name_offset:
         self.name = read_name(f, address + self.name_offset)
         # print(f'name: {self.name}')
     self.colors.clear()
     f.seek(address + self.colors_offset)
     for i in range(self.num):
         color = Color()
         color.read(f, endian)
         self.colors.append(color)
Beispiel #4
0
    def read(self, f, endian):
        base_skeleton_address = f.tell()
        self.data = ESKHeader(*struct.unpack(endian + ESK_HEADER_BYTE_ORDER, f.read(ESK_HEADER_SIZE)))
        # print("--------------- read ESK \n[{}] bone_count : {}, flag : {}, bone_indices_offset : [{}],"
        #       " bone_names_offset : [{}], skinning_matrix_offset : [{}], transform_matrix_offset : [{}],"
        #       " unknown_offset_0 : [{}], unknown_offset_1 : [{}], unknown_offset_2 : [{}], unknown_offset_3 : [{}]"
        #       .format(base_skeleton_address, self.bone_count, self.flag, self.bone_indices_offset,
        #               self.bone_names_offset, self.skinning_matrix_offset, self.transform_matrix_offset,
        #               self.unknown_offset_0, self.unknown_offset_1, self.unknown_offset_2, self.unknown_offset_3))

        self.bones.clear()

        for i in range(self.bone_count):
            bone = Bone(i)
            # print("pyxenoverse {}".format(i))

            # Read Bone Indices
            f.seek(base_skeleton_address + self.bone_indices_offset + i * 8)
            bone.read_indices(f, endian)
            # print("    Indices - parent: {}, child: {}, sibling(next): {}, index4: {}".format(
            # pyxenoverse.parent_index, pyxenoverse.child_index, pyxenoverse.sibling_index, pyxenoverse.index_4))

            # Read Bone Name
            f.seek(base_skeleton_address + self.bone_names_offset + i * 4)
            address = struct.unpack(endian + 'I', f.read(4))[0]
            f.seek(base_skeleton_address + address)
            bone.name = read_name(f)
            # print("    Name - {}".format(pyxenoverse.name))

            # Read Skinning Matrices
            f.seek(base_skeleton_address + self.skinning_matrix_offset + i * 48)
            bone.read_skinning_matrix(f, endian)
            # print("    Skinning matrix\n{}\n".format(pyxenoverse.get_skinning_matrix_debug()))

            if self.transform_matrix_offset:
                # Read Bone matrices
                f.seek(base_skeleton_address + self.transform_matrix_offset + i * 64)
                bone.read_transform_matrix(f, endian)
                # print("    Transform matrix\n{}\n".format(pyxenoverse.get_transform_matrix_debug()))

            self.bones.append(bone)

        f.seek(base_skeleton_address + self.unknown_offset_0)
        unknown_0 = struct.unpack('<I', f.read(4))[0]
        self.m_have_128_unknown_bytes = (unknown_0 == 5)
Beispiel #5
0
    def read(self, f, endian):
        self.data = EANHeader(
            *struct.unpack(endian +
                           EAN_HEADER_BYTE_ORDER, f.read(EAN_HEADER_SIZE)))
        # print("--------------- read EAN \n[8] unkTotal : {}, animation_count : {}, SkeletonOffset : [{}]"
        #       " animation_keyframes_offset : [{}], animation_names_offset : [{}]".format(
        #           self.unknown_total, self.animation_count, self.skeleton_offset, self.animation_keyframes_offset,
        #           self.animation_names_offset))

        # Read Skeleton
        # print("----------- Skeleton")
        f.seek(self.skeleton_offset)
        self.skeleton = ESK(endian)
        self.skeleton.read(f, endian)

        # Read Animations
        # print("----------- Animations KeyFrames")
        self.animations.clear()
        for i in range(self.animation_count):
            animation = Animation(self)
            # Read Keyframes
            f.seek(self.animation_keyframes_offset + i * 4)
            address = struct.unpack(endian + 'I', f.read(4))[0]
            f.seek(address)
            # print("------ animation {} : [{}] => [{}]".format(i, self.animation_keyframes_offset + i * 4, address))
            animation.read(f, endian)

            # Read Name
            f.seek(self.animation_names_offset + i * 4)
            address = struct.unpack(endian + 'I', f.read(4))[0]
            f.seek(address)
            animation.name = read_name(f)
            # print("------ animation {} : [{}] => [{}] => {}".format(
            #     i, self.animation_names_offset + i * 4, address, animation.get_name()))

            self.animations.append(animation)
Beispiel #6
0
 def read(self, f, endian):
     address = f.tell()
     self.data = BCSPhysics(
         *struct.unpack(endian +
                        BCS_PHYSICS_BYTE_ORDER, f.read(BCS_PHYSICS_SIZE)))
     self.name = re.sub(r'[^\x20-\x7f]', '', self.name.decode())
     # print(self.data)
     if self.emd_offset:
         self.emd_name = read_name(f, address + self.emd_offset)
         # print(f'emd: {self.emd_name}')
     if self.emm_offset:
         self.emm_name = read_name(f, address + self.emm_offset)
         # print(f'emm: {self.emm_name}')
     if self.emb_offset:
         self.emb_name = read_name(f, address + self.emb_offset)
         # print(f'emb: {self.emb_name}')
     if self.ean_offset:
         self.ean_name = read_name(f, address + self.ean_offset)
         # print(f'ean: {self.ean_name}')
     if self.bone_offset:
         self.bone_name = read_name(f, address + self.bone_offset)
         # print(f'bone: {self.bone_name}')
     if self.scd_offset:
         self.scd_name = read_name(f, address + self.scd_offset)