11# TODO: implement encryption for saving files
22from collections import namedtuple
33import re
4- from typing import Tuple , Union
4+ from typing import Optional , Tuple , Union
55
66from . import File
77from ..enums import ArchiveFlags , ArchiveFlagsOld , CompressionFlags
@@ -21,12 +21,12 @@ class BundleFile(File.File):
2121 signature : str
2222 version_engine : str
2323 version_player : str
24- dataflags : Tuple [ArchiveFlags , ArchiveFlagsOld ]
25- decryptor : ArchiveStorageManager .ArchiveStorageDecryptor = None
24+ dataflags : Union [ArchiveFlags , ArchiveFlagsOld ]
25+ decryptor : Optional [ ArchiveStorageManager .ArchiveStorageDecryptor ] = None
2626 _uses_block_alignment : bool = False
2727
2828 def __init__ (
29- self , reader : EndianBinaryReader , parent : File , name : str = None , ** kwargs
29+ self , reader : EndianBinaryReader , parent : File , name : Optional [ str ] = None , ** kwargs
3030 ):
3131 super ().__init__ (parent = parent , name = name , ** kwargs )
3232 signature = self .signature = reader .read_string_to_null ()
@@ -92,7 +92,7 @@ def read_fs(self, reader: EndianBinaryReader):
9292 # header
9393 compressedSize = reader .read_u_int ()
9494 uncompressedSize = reader .read_u_int ()
95- self . dataflags = reader .read_u_int ()
95+ dataflagsValue = reader .read_u_int ()
9696
9797 version = self .get_version_tuple ()
9898 # https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch
@@ -105,9 +105,9 @@ def read_fs(self, reader: EndianBinaryReader):
105105 or (version [0 ] == 2021 and version < (2021 , 3 , 2 ))
106106 or (version [0 ] == 2022 and version < (2022 , 1 , 1 ))
107107 ):
108- self .dataflags = ArchiveFlagsOld (self . dataflags )
108+ self .dataflags = ArchiveFlagsOld (dataflagsValue )
109109 else :
110- self .dataflags = ArchiveFlags (self . dataflags )
110+ self .dataflags = ArchiveFlags (dataflagsValue )
111111
112112 if self .dataflags & self .dataflags .UsesAssetBundleEncryption :
113113 self .decryptor = ArchiveStorageManager .ArchiveStorageDecryptor (reader )
@@ -523,6 +523,14 @@ def decompress_data(
523523 def get_version_tuple (self ) -> Tuple [int , int , int ]:
524524 """Returns the version as a tuple."""
525525 version = self .version_engine
526- if not version or version == "0.0.0" :
527- version = config .get_fallback_version ()
528- return tuple (map (int , reVersion .match (version ).groups ()))
526+ match = None
527+ if version and version != "0.0.0" :
528+ match = reVersion .match (version )
529+ if not match or len (match .groups ()) < 3 :
530+ match = None
531+ if not match :
532+ match = reVersion .match (config .get_fallback_version ())
533+ if not match or len (match .groups ()) < 3 :
534+ raise ValueError ("Illegal fallback version format" )
535+ map_ = map (int , match .groups ())
536+ return (next (map_ ), next (map_ ), next (map_ ))
0 commit comments