119 lines
3.6 KiB
Plaintext
119 lines
3.6 KiB
Plaintext
|
|
/*
|
||
|
|
文件名: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();
|
||
|
|
}
|