123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /**
- * 魔力宝贝图档解析脚本 - CGTool
- *
- * @Author HonorLee (dev@honorlee.me)
- * @Version 1.0 (2023-04-15)
- * @License GPL-3.0
- *
- * GraphicInfo.cs 图档索引解析类
- */
- using System;
- using System.Collections.Generic;
- using System.IO;
- using UnityEngine;
- // using Logger = Util.Logger;
- namespace CGTool
- {
- //GraphicInfo数据块
- public class GraphicInfoData
- {
- //版本号
- public int Version;
- //4 bytes 索引
- public uint Index;
- //4 bytes Graphic 地址
- public uint Addr;
- //4 bytes Graphic 数据长度
- public uint Length;
- //4 bytes Graphic 偏移 - X
- public int OffsetX;
- //4 bytes Graphic 偏移 - Y
- public int OffsetY;
- //4 bytes Graphic 宽
- public uint Width;
- //4 bytes Graphic 高
- public uint Height;
- //4 bytes Graphic East占地
- public int East;
- //4 bytes Graphic South 占地
- public int South;
- //bool 穿越标识
- public bool Blocked;
- //1 byte 作为地面无层级遮挡[Test]
- public byte AsGround;
- //4 bytes 未知标识
- public byte[] Unknow;
- //4 bytes 地图编号
- public uint MapSerial;
- }
- public class GraphicInfo:MonoBehaviour
- {
- // private static Logger _logger = new Logger("GraphicInfo", false);
- //版本索引字典 版本编号
- private static Dictionary<int, List<GraphicInfoData>> _cache = new Dictionary<int, List<GraphicInfoData>>();
- //版本-Addr映射字典 版本编号 -> Index -> GraphicInfoData
- private static Dictionary<int, Dictionary<uint, GraphicInfoData>>
- _indexDict = new Dictionary<int, Dictionary<uint, GraphicInfoData>>();
-
- //版本-Map编号映射字典 版本编号 -> MapSerial -> GraphicInfoData
- private static Dictionary<int, Dictionary<uint, GraphicInfoData>>
- _mapSerialDict = new Dictionary<int, Dictionary<uint, GraphicInfoData>>();
- private static List<string> _graphicInfoPaths = new List<string>()
- {
- //龙之沙漏 之前版本前Info数据
- "GraphicInfo_66.bin",
- //龙之沙漏 版本Info数据
- "GraphicInfoEx_5.bin"
- };
- //获取GraphicInfo数据,Info数据加载后会缓存
- public static List<GraphicInfoData> GetGraphicInfo(int Version)
- {
- //返回缓存数据
- if (_cache.ContainsKey(Version)) return _cache[Version];
-
- //初始化映射库
- _indexDict.Add(Version,new Dictionary<uint, GraphicInfoData>());
- _mapSerialDict.Add(Version,new Dictionary<uint, GraphicInfoData>());
- //加载并初始化数据
- List<GraphicInfoData> infoDatas = _loadGraphicInfo(Version);
- _cache.Add(Version, infoDatas);
-
- return infoDatas;
- }
- //通过地面编号获取GraphicInfo数据
- public static GraphicInfoData GetGraphicInfoDataByMapSerial(int Version, uint MapSerial)
- {
- GraphicInfoData graphicInfoData = null;
- if (_mapSerialDict.ContainsKey(Version))
- {
- _mapSerialDict[Version].TryGetValue(MapSerial, out graphicInfoData);
- // graphicInfoData = _mapSerialDict[Version][MapSerial];
- }
- return graphicInfoData;
- }
- //通过索引获取GraphicInfo数据
- public static GraphicInfoData GetGraphicInfoDataByIndex(int Version, uint Index)
- {
- GraphicInfoData graphicInfoData = null;
- if (_indexDict.ContainsKey(Version) && _indexDict[Version].ContainsKey(Index))
- {
- graphicInfoData = _indexDict[Version][Index];
- }
- return graphicInfoData;
- }
-
- //初始化加载GraphicInfo
- private static List<GraphicInfoData> _loadGraphicInfo(int Version)
- {
- //查找Info文件
- string fileName = _graphicInfoPaths[Version];
- FileInfo file = new FileInfo(CGTool.BaseFolder + "/" + fileName);
- if (!file.Exists) return null;
- //创建流读取器
- FileStream fileStream = file.OpenRead();
- BinaryReader fileReader = new BinaryReader(fileStream);
-
- //解析Info数据表
- List<GraphicInfoData> infoDatas = new List<GraphicInfoData>();
- long DataLength = fileStream.Length/40;
- for (int i = 0; i < DataLength; i++)
- {
- GraphicInfoData graphicInfoData = new GraphicInfoData();
- graphicInfoData.Version = Version;
- graphicInfoData.Index = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.Addr = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.Length = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.OffsetX = BitConverter.ToInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.OffsetY = BitConverter.ToInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.Width = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.Height = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- graphicInfoData.East = fileReader.ReadByte();
- graphicInfoData.South = fileReader.ReadByte();
- graphicInfoData.Blocked = fileReader.ReadByte() == 0;
- graphicInfoData.AsGround = fileReader.ReadByte();
- graphicInfoData.Unknow = fileReader.ReadBytes(4);
- graphicInfoData.MapSerial = BitConverter.ToUInt32(fileReader.ReadBytes(4),0);
- //建立映射表
- if(!_indexDict[Version].ContainsKey(graphicInfoData.Index)) _indexDict[Version].Add(graphicInfoData.Index, graphicInfoData);
- if(graphicInfoData.MapSerial > 0 && !_mapSerialDict[Version].ContainsKey(graphicInfoData.MapSerial)) _mapSerialDict[Version].Add(graphicInfoData.MapSerial, graphicInfoData);
-
- infoDatas.Add(graphicInfoData);
- // _logger.Write("Index: " + graphicInfoData.Index + " Addr: " + graphicInfoData.Addr +
- // " Width: " + graphicInfoData.Width +
- // " Height: " + graphicInfoData.Height +
- // " OffsetX: " + graphicInfoData.OffsetX +
- // " OffsetY: " + graphicInfoData.OffsetY +
- // " East: " + graphicInfoData.East +
- // " South: " + graphicInfoData.South +
- // " Blocked: " + graphicInfoData.Blocked +
- // " Unknow: " + BitConverter.ToString(graphicInfoData.Unknow).Replace("-", ",") +
- // " MapSerial: " + graphicInfoData.MapSerial);
- }
- // CGTool.Logger.Write("加载GraphicInfo - 版本: " + Version + " 文件: " + fileName + " 贴图总量: "+ infoDatas.Count);
- return infoDatas;
- }
- }
- }
|