HonorLee 5 months ago
parent
commit
bf077f1ea4
3 changed files with 41 additions and 26 deletions
  1. 11 7
      CrossgateToolkit/Anime.cs
  2. 1 1
      CrossgateToolkit/Audio.cs
  3. 29 18
      CrossgateToolkit/Graphic.cs

+ 11 - 7
CrossgateToolkit/Anime.cs

@@ -173,12 +173,6 @@ namespace CrossgateToolkit
             
             long DataLength = infoFileStream.Length / 12;
             
-            //判断是否为高版本
-            bool isHighVersion = false;
-            dataFileStream.Position = 0x10;
-            byte[] tmpBytes = dataFileReader.ReadBytes(4);
-            if(tmpBytes.SequenceEqual(highVersionFlag)) isHighVersion = true;
-            
             // 循环初始化动画数据
             for (int i = 0; i < DataLength; i++)
             {
@@ -190,9 +184,17 @@ namespace CrossgateToolkit
                 animeInfo.Addr = BitConverter.ToUInt32(infoFileReader.ReadBytes(4),0);
                 animeInfo.ActionCount = infoFileReader.ReadUInt16();
                 animeInfo.Unknow = infoFileReader.ReadBytes(2);
+                if (animeInfo.Addr > dataFileStream.Length) break;
                 dataFileStream.Position = animeInfo.Addr;
                 for (int j = 0; j < animeInfo.ActionCount; j++)
                 {
+                    
+                    // 高版本标识
+                    bool isHighVersion = false;
+                    dataFileStream.Position += 16;
+                    if(dataFileReader.ReadBytes(4).SequenceEqual(highVersionFlag)) isHighVersion = true;
+                    dataFileStream.Position -= 20;
+                    
                     AnimeDetail animeData = new AnimeDetail();
                     animeData.Version = Version;
                     animeData.Serial = animeInfo.Serial;
@@ -200,6 +202,7 @@ namespace CrossgateToolkit
                     animeData.ActionType = dataFileReader.ReadUInt16();
                     animeData.CycleTime = BitConverter.ToUInt32(dataFileReader.ReadBytes(4),0);
                     animeData.FrameCount = BitConverter.ToUInt32(dataFileReader.ReadBytes(4),0);
+                    
                     // 高版本
                     if (isHighVersion)
                     {
@@ -223,12 +226,13 @@ namespace CrossgateToolkit
                     for (int k = 0; k < animeData.FrameCount; k++)
                     {
                         byte[] frameBytes = dataFileReader.ReadBytes(10);
+                        if (frameBytes.Length <10) break;
                         BinaryReader frameReader = new BinaryReader(new MemoryStream(frameBytes));
                         AnimeFrameInfo animeFrameInfo = new AnimeFrameInfo();
                         //GraphicIndex序号
                         animeFrameInfo.GraphicIndex = BitConverter.ToUInt32(frameReader.ReadBytes(4),0);
                         animeFrameInfo.OffsetX = BitConverter.ToInt16(frameReader.ReadBytes(2),0);
-                        animeFrameInfo.OffsetY = BitConverter.ToInt16(frameReader.ReadBytes(2),0);
+                        animeFrameInfo.OffsetY = BitConverter.ToInt16(frameReader.ReadBytes(2), 0);
                         
                         //标识位
                         int flag = BitConverter.ToInt16(frameReader.ReadBytes(2),0);

+ 1 - 1
CrossgateToolkit/Audio.cs

@@ -33,7 +33,7 @@ namespace CrossgateToolkit
             BGM,
             EFFECT
         }
-        // 获取指定类型、编号的音频AudioClip
+        // 播放指定类型、编号的音频AudioClip
         public static void Play(AudioSource audioSource,Type type, int id)
         {
             AudioClip audioClip;

+ 29 - 18
CrossgateToolkit/Graphic.cs

@@ -71,28 +71,42 @@ namespace CrossgateToolkit
             public int VersionCode;
             public string FullVersion;
         }
-        private static VersionInfo AnalysisVersion(string prefix,string filename)
+        private static VersionInfo AnalysisVersion(string prefix,FileInfo fileinfo)
         {
             VersionInfo versionInfo = new VersionInfo();
+            int suffixIndex = fileinfo.Name.LastIndexOf('.');
+                
+            // 解析版本号
+            string filename = fileinfo.Name.Substring(0, suffixIndex);
             versionInfo.FullVersion = filename.Substring(prefix.Length);
-            string[] versionArr = versionInfo.FullVersion.Split('_');
-            if (String.IsNullOrEmpty(versionArr[0]))
-            {
-                versionArr = versionArr.Skip(1).ToArray();
-            }
-
-            if (int.TryParse(versionArr[0], out int code))
+            if (string.IsNullOrEmpty(versionInfo.FullVersion))
             {
-                versionInfo.VersionCode = code;
+                string parentName = fileinfo.Directory != null ? fileinfo.Directory.Name : "";
+                versionInfo.FullVersion = "";
+                versionInfo.Version = parentName.ToUpper();
             }
             else
             {
-                versionInfo.Version = versionArr[0].ToUpper();
-                if(int.TryParse(versionArr[^1], out int vcode))
+                string[] versionArr = versionInfo.FullVersion.Split('_');
+                if (String.IsNullOrEmpty(versionArr[0]))
+                {
+                    versionArr = versionArr.Skip(1).ToArray();
+                }
+            
+                if (int.TryParse(versionArr[0], out int code))
                 {
-                    versionInfo.VersionCode = vcode;
+                    versionInfo.VersionCode = code;
+                }
+                else
+                {
+                    versionInfo.Version = versionArr[0].ToUpper();
+                    if(int.TryParse(versionArr[^1], out int vcode))
+                    {
+                        versionInfo.VersionCode = vcode;
+                    }
                 }
             }
+
             
             return versionInfo;
         }
@@ -106,16 +120,12 @@ namespace CrossgateToolkit
             foreach (FileInfo fileInfo in fileInfos)
             {
                 if (!fileInfo.Name.EndsWith(".bin",StringComparison.OrdinalIgnoreCase)) continue;
-                int suffixIndex = fileInfo.Name.LastIndexOf('.');
-                
-                // 解析版本号
-                string filename = fileInfo.Name.Substring(0, suffixIndex);
                 
                 if (fileInfo.Name.StartsWith("graphicinfo", StringComparison.OrdinalIgnoreCase))
                 {
                     // 找到GraphicInfo文件
                     // 获取对应版本号 GraphicInfo(*).bin
-                    VersionInfo versionInfo = AnalysisVersion("graphicinfo", filename);
+                    VersionInfo versionInfo = AnalysisVersion("graphicinfo", fileInfo);
                     // 判断是否存在对应graphic文件,忽略大小写
                     string graphicFileName = "graphic" + versionInfo.FullVersion + ".bin";
                     FileInfo graphicFileInfo = GetFileInfoByName(fileInfo.Directory, graphicFileName);
@@ -134,9 +144,10 @@ namespace CrossgateToolkit
                 {
                     // 找到AnimeInfo文件
                     // 获取对应版本号 AnimeInfo(*).bin
-                    VersionInfo versionInfo = AnalysisVersion("animeinfo", filename);
+                    VersionInfo versionInfo = AnalysisVersion("animeinfo", fileInfo);
                     // 判断是否存在对应anime文件
                     string animeFileName = "anime" + versionInfo.FullVersion + ".bin";
+                    Debug.Log(animeFileName);
                     FileInfo animeFileInfo = GetFileInfoByName(fileInfo.Directory, animeFileName);
                     if (!animeFileInfo.Exists)
                     {