/* 文件名:Init.nut 路径:Init/Init.nut 创建日期:2024-05-07 17:38 文件用途:初始化操作 */ function charPtrToInt(arr) { local value = ((arr[0]) << 0) | ((arr[1]) << 8) | ((arr[2]) << 16) | ((arr[3]) << 24); return value; } function CrcDecode(Ro, Length, crc32) { local num = 2175242257; for (local i = 0; i< Length; i += 4) { local Pos = Ro.tell(); local anInt = charPtrToInt([Ro[Pos], Ro[Pos + 1], Ro[Pos + 2], Ro[Pos + 3]]); local val = (anInt ^ num ^ crc32); local jiemi = (val >> 6) | ((val << (32 - 6)) & 0xFFFFFFFF); Ro[Pos] = ((jiemi >> 0) & 0xFF); Ro[Pos + 1] = ((jiemi >> 8) & 0xFF); Ro[Pos + 2] = ((jiemi >> 16) & 0xFF); Ro[Pos + 3] = ((jiemi >> 24) & 0xFF); Ro.seek(4, 'c'); } } //初始化PVF文件树 function InitPvfTreeHeader(HeaderRo) { //读取UUID的长度 local UUID_LENGTH = HeaderRo.GetInt(); //UUID 读 1 - 36位 构造 UTF8 string local UUID = HeaderRo.GetString(UUID_LENGTH); //版本号 local Version = HeaderRo.GetInt(); // 文件路径数据的大小 local AlignedIndexHeaderSize = HeaderRo.GetInt(); // 解密密钥 local IndexHeaderCrc = HeaderRo.GetInt(); // 文件数量 local IndexSize = HeaderRo.GetInt(); local FristPos = HeaderRo.tell(); CrcDecode(HeaderRo, AlignedIndexHeaderSize, IndexHeaderCrc) local CurrPos = 0; ScriptData.StartPos = AlignedIndexHeaderSize + 56; for (local i = 0; i< IndexSize; i++) { HeaderRo.seek(FristPos + CurrPos); local FileNumber = HeaderRo.GetInt(); local FilePathLength = HeaderRo.GetInt(); local FileName = HeaderRo.GetString(FilePathLength); local FileLength = HeaderRo.GetInt(); local Cre32 = HeaderRo.GetInt(); local RelativeOffset = HeaderRo.GetInt(); if (FileLength > 0) { local RealFileLength = (FileLength + 3) & 4294967292; ScriptData.PvfFileInfo[FileName] <- { ROffset = RelativeOffset, Cr32 = Cre32, Length = RealFileLength, } } CurrPos += 20; CurrPos += FilePathLength; } } //初始化PVF数据 文件树初始化完成以后被调用 function CB_InitPvfData() { //文件 local FileIo = null; try { FileIo = file("Script.pvf", "rb"); } catch (exception) { error("打不开Script文件!"); } if (!FileIo) return; local FileRo = BlobEx(FileIo.readblob(FileIo.len())); InitPvfTreeHeader(FileRo); FileIo.close(); InitStringBin(FileRo); InitLoadString(FileRo); local AllFileStartPos = ScriptData.StartPos; foreach(FilePath, Info in ScriptData.PvfFileInfo) { FileRo.seek(AllFileStartPos + Info.ROffset); CrcDecode(FileRo, Info.Length, Info.Cr32); //解密完需要重新调整指针位置 FileRo.seek(AllFileStartPos + Info.ROffset); //构建AniMap if (endswith(FilePath, ".ani") && !endswith(FilePath, ".als")) { try { ScriptData.Ani[FilePath] <- InitPvfAni(FileRo); } catch (exception) { // if (FilePath == "monster/goblin/animation_goblin2/damage2.ani") print("Ani :" + FilePath + "加载错误"); // print(exception); // print("Ani :" + FilePath + "加载错误"); } // ScriptData.RemoveFileInfo(FilePath); //不知道为什么删除脚本会删多 貌似和识别有点关系 有空再修 } } ScriptData.IO = FileRo; // print("初始化Ani完成数量: " + ScriptData.Ani.len()); ScriptData.Init(); }