123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Text.RegularExpressions;
- using UnityEngine;
- namespace CGTool
- {
-
- public class AnimeInfo
- {
- public int Version;
-
- public uint Index;
-
- public uint Addr;
-
- public int ActionCount;
-
- public byte[] Unknow;
-
- public Dictionary<int, Dictionary<int, AnimeDetail>> AnimeDatas = new Dictionary<int, Dictionary<int, AnimeDetail>>();
- }
-
- public class AnimeFrameInfo
- {
-
- public uint GraphicIndex;
-
- public int Width;
-
- public int Height;
-
- public int OffsetX;
-
- public int OffsetY;
-
- public int AudioIndex;
-
- public Anime.EffectType Effect;
-
- public GraphicInfoData GraphicInfo;
-
- public Dictionary<int,Sprite> AnimeSprites = new Dictionary<int, Sprite>();
- }
-
- public class AnimeDetail
- {
- public uint Index;
- public int Version;
- public int Direction;
- public int ActionType;
- public uint CycleTime;
- public uint FrameCount;
- public Dictionary<int,Texture2D> AnimeTextures = new Dictionary<int, Texture2D>();
-
- public AnimeFrameInfo[] AnimeFrameInfos;
-
- }
-
- public class Anime : MonoBehaviour
- {
-
- public enum DirectionType
- {
- NULL=-1,
- North=0,
- NorthEast=1,
- East=2,
- SouthEast=3,
- South=4,
- SouthWest=5,
- West=6,
- NorthWest=7
- }
-
- public static DirectionType[,] DirectionTypeMap = new DirectionType[3,3]
- {
- {DirectionType.North,DirectionType.NorthEast,DirectionType.East},
- {DirectionType.NorthWest,DirectionType.NULL,DirectionType.SouthEast},
- {DirectionType.West,DirectionType.SouthWest,DirectionType.South}
- };
-
- public enum ActionType
- {
- NULL=-1,
- Stand=0,
- Walk=1,
- BeforeRun=2,
- Run=3,
- AfterRun=4,
- Attack=5,
- Magic=6,
- Throw=7,
- Hurt=8,
- Defence=9,
- Dead=10,
- Sit=11,
- Hi=12,
- Happy=13,
- Angry=14,
- Sad=15,
- Shake=16,
- Rock=17,
- Scissors=18,
- Paper=19,
- Fishing=20,
-
- }
-
- public enum EffectType
- {
- Hit=1,
- HitOver=2
- }
- public enum PlayType
- {
- Loop,
- Once,
- OnceAndDestroy
- }
-
- private static Dictionary<uint, AnimeInfo> _animeInfoCache = new Dictionary<uint, AnimeInfo>();
-
- private static Dictionary<int,string> _animeInfoVersionPrefex = new Dictionary<int, string>()
- {
-
- {0,@"AnimeInfo_\d+"},
-
- {1,@"AnimeInfoEx_\d+"}
- };
- private static List<string> _animeInfoFilePaths = new List<string>();
-
- private static Dictionary<int,string> _animeDataVersionPrefex = new Dictionary<int, string>()
- {
-
- {0,@"Anime_\d+"},
-
- {1,@"AnimeEx_\d+"}
- };
- private static List<string> _animeDataFilePaths = new List<string>();
-
- public static void Init()
- {
- DirectoryInfo directoryInfo = new DirectoryInfo(CGTool.BaseFolder);
- FileInfo[] files = directoryInfo.GetFiles();
-
- for (int i = 0; i < _animeInfoVersionPrefex.Count; i++)
- {
- foreach (FileInfo fileInfo in files)
- {
- if (Regex.IsMatch(fileInfo.Name, _animeInfoVersionPrefex[i]))
- {
- _animeInfoFilePaths.Add(fileInfo.Name);
- }
- if(Regex.IsMatch(fileInfo.Name,_animeDataVersionPrefex[i]))
- {
- _animeDataFilePaths.Add(fileInfo.Name);
- }
- }
- }
- if(_animeInfoFilePaths.Count==0) Debug.LogError("未找到动画信息文件");
- if(_animeDataFilePaths.Count==0) Debug.LogError("未找到动画数据文件");
- if(_animeDataFilePaths.Count!=_animeInfoFilePaths.Count) Debug.LogError("动画信息文件与动画数据文件数量不匹配");
-
-
- for (int i = 0; i < _animeInfoFilePaths.Count; i++)
- {
-
- Dictionary<uint, AnimeInfo> animeInfos = _loadAnimeInfo(i);
- Debug.Log("加载动画信息版本:[" + i + "] 动画数量:" + animeInfos.Count);
- }
- }
-
- public static AnimeInfo GetAnimeInfo(uint Index)
- {
-
- if (_animeInfoCache.ContainsKey(Index)) return _animeInfoCache[Index];
-
- int Version = 0;
- if (Index >= 105000) Version = 1;
- Dictionary<uint, AnimeInfo> animeInfos = _loadAnimeInfo(Version);
- if (animeInfos.ContainsKey(Index)) return animeInfos[Index];
- return null;
- }
-
- public static AnimeDetail GetAnimeDetail(uint serial,DirectionType Direction,ActionType Action)
- {
- AnimeInfo animeInfo = GetAnimeInfo(serial);
- if (animeInfo == null) return null;
- if (animeInfo.AnimeDatas.ContainsKey((int)Direction))
- {
- if (animeInfo.AnimeDatas[(int) Direction].ContainsKey((int) Action))
- {
- AnimeDetail animeDetail = animeInfo.AnimeDatas[(int) Direction][(int) Action];
-
- return animeInfo.AnimeDatas[(int)Direction][(int) Action];
- }
- }
- return null;
- }
-
- public static void BakeAnimeFrames(AnimeDetail animeDetail,int paletIndex = 0)
- {
- if(animeDetail.AnimeTextures.ContainsKey(paletIndex)) return;
-
- GraphicData[] graphicDatas = new GraphicData[animeDetail.FrameCount];
-
-
- uint textureWidth = 0;
- uint textureHeight = 0;
-
-
- for (var i = 0; i < animeDetail.FrameCount; i++)
- {
-
- GraphicInfoData graphicInfoData = GraphicInfo.GetGraphicInfoDataByIndex(animeDetail.Version,animeDetail.AnimeFrameInfos[i].GraphicIndex);
- if (graphicInfoData == null) continue;
- GraphicData graphicData = Graphic.GetGraphicData(graphicInfoData, paletIndex);
- if(graphicData == null) continue;
- graphicDatas[i] = graphicData;
- if(graphicData.Height > textureHeight) textureHeight = graphicData.Height;
- textureWidth += graphicData.Width + 5;
- animeDetail.AnimeFrameInfos[i].Width = (int) graphicData.Width;
- animeDetail.AnimeFrameInfos[i].Height = (int) graphicData.Height;
- animeDetail.AnimeFrameInfos[i].OffsetX = (int) graphicInfoData.OffsetX;
- animeDetail.AnimeFrameInfos[i].OffsetY = (int) graphicInfoData.OffsetY;
- animeDetail.AnimeFrameInfos[i].GraphicInfo = graphicInfoData;
- }
-
- Texture2D texture2dMix = new Texture2D((int) textureWidth, (int) textureHeight, TextureFormat.RGBA4444, false,false);
- Color32 transparentColor = new Color32(0, 0, 0, 0);
- Color32[] transparentColors = new Color32[texture2dMix.width * texture2dMix.height];
- for (var i = 0; i < transparentColors.Length; i++)
- {
- transparentColors[i] = transparentColor;
- }
- texture2dMix.SetPixels32(transparentColors,0);
-
- int offsetX = 0;
- for (var i = 0; i < animeDetail.FrameCount; i++)
- {
- GraphicData graphicData = graphicDatas[i];
- if(graphicData == null) continue;
- texture2dMix.SetPixels32((int) offsetX, 0, (int) graphicData.Width,
- (int) graphicData.Height,
- graphicData.Sprite.texture.GetPixels32());
- offsetX += (int) graphicData.Width + 5;
- }
- texture2dMix.Apply();
-
- animeDetail.AnimeTextures.Add(paletIndex,texture2dMix);
-
-
- offsetX = 0;
- for (var l = 0; l < animeDetail.FrameCount; l++)
- {
- if(graphicDatas[l] == null) continue;
- AnimeFrameInfo animeFrameInfo = animeDetail.AnimeFrameInfos[l];
- Vector2 pivot = new Vector2(0f, 1f);
- pivot.x += -(animeFrameInfo.OffsetX * 1f) / animeFrameInfo.Width;
- pivot.y -= (-animeFrameInfo.OffsetY * 1f) / animeFrameInfo.Height;
- Sprite sprite = Sprite.Create(texture2dMix, new Rect(offsetX, 0,
- animeDetail.AnimeFrameInfos[l].Width, animeDetail.AnimeFrameInfos[l].Height),
- pivot, 1, 1, SpriteMeshType.FullRect);
- offsetX += animeDetail.AnimeFrameInfos[l].Width + 5;
- animeFrameInfo.AnimeSprites.Add(paletIndex, sprite);
- }
-
- }
-
-
- private static Dictionary<uint, AnimeInfo> _loadAnimeInfo(int Version)
- {
-
- string infoFileName = _animeInfoFilePaths[Version];
- string dataFileName = _animeDataFilePaths[Version];
- FileInfo infoFile = new FileInfo(CGTool.BaseFolder + "/" + infoFileName);
- FileInfo dataFile = new FileInfo(CGTool.BaseFolder + "/" + dataFileName);
- if (!infoFile.Exists || !dataFile.Exists) return null;
-
- FileStream infoFileStream = infoFile.OpenRead();
- FileStream dataFileStream = dataFile.OpenRead();
- BinaryReader infoFileReader = new BinaryReader(infoFileStream);
- BinaryReader dataFileReader = new BinaryReader(dataFileStream);
-
- long DataLength = infoFileStream.Length / 12;
- for (int i = 0; i < DataLength; i++)
- {
-
- AnimeInfo animeInfo = new AnimeInfo();
- animeInfo.Version = Version;
- animeInfo.Index = BitConverter.ToUInt32(infoFileReader.ReadBytes(4),0);
- animeInfo.Addr = BitConverter.ToUInt32(infoFileReader.ReadBytes(4),0);
- animeInfo.ActionCount = infoFileReader.ReadUInt16();
- animeInfo.Unknow = infoFileReader.ReadBytes(2);
- dataFileStream.Position = animeInfo.Addr;
- for (int j = 0; j < animeInfo.ActionCount; j++)
- {
- AnimeDetail animeData = new AnimeDetail();
- animeData.Index = animeInfo.Index;
- animeData.Version = Version;
- animeData.Direction = dataFileReader.ReadUInt16();
- animeData.ActionType = dataFileReader.ReadUInt16();
- animeData.CycleTime = BitConverter.ToUInt32(dataFileReader.ReadBytes(4),0);
- animeData.FrameCount = BitConverter.ToUInt32(dataFileReader.ReadBytes(4),0);
- animeData.AnimeFrameInfos = new AnimeFrameInfo[animeData.FrameCount];
-
-
-
- for (int k = 0; k < animeData.FrameCount; k++)
- {
- animeData.AnimeFrameInfos[k] = new AnimeFrameInfo();
-
- animeData.AnimeFrameInfos[k].GraphicIndex = BitConverter.ToUInt32(dataFileReader.ReadBytes(4),0);
-
-
-
-
-
-
-
-
-
-
- animeData.AnimeFrameInfos[k].OffsetX = BitConverter.ToInt16(dataFileReader.ReadBytes(2),0);
- animeData.AnimeFrameInfos[k].OffsetY = BitConverter.ToInt16(dataFileReader.ReadBytes(2),0);
-
-
- int flag = BitConverter.ToInt16(dataFileReader.ReadBytes(2),0);
-
- if (flag>20000)
- {
-
- animeData.AnimeFrameInfos[k].Effect = EffectType.Hit;
- animeData.AnimeFrameInfos[k].AudioIndex = flag - 20000;
- }
- else if(flag>10000)
- {
-
- animeData.AnimeFrameInfos[k].Effect = EffectType.HitOver;
- animeData.AnimeFrameInfos[k].AudioIndex = flag - 10000;
- }
- else
- {
- animeData.AnimeFrameInfos[k].AudioIndex = flag;
- }
- }
- if (!animeInfo.AnimeDatas.ContainsKey(animeData.Direction))
- animeInfo.AnimeDatas.Add(animeData.Direction, new Dictionary<int, AnimeDetail>());
- if (animeInfo.AnimeDatas[animeData.Direction].ContainsKey(animeData.ActionType))
- {
- animeInfo.AnimeDatas[animeData.Direction][animeData.ActionType] = animeData;
- }
- else
- {
- animeInfo.AnimeDatas[animeData.Direction].Add(animeData.ActionType, animeData);
- }
- if (_animeInfoCache.ContainsKey(animeInfo.Index))
- {
- _animeInfoCache[animeInfo.Index] = animeInfo;
- }
- else
- {
- _animeInfoCache.Add(animeInfo.Index, animeInfo);
- }
- }
- }
- infoFileReader.Dispose();
- infoFileReader.Close();
- dataFileReader.Dispose();
- dataFileReader.Close();
- infoFileStream.Close();
- dataFileStream.Close();
- return _animeInfoCache;
- }
- }
- }
|