Magic_GameClient/sqr/User/Init/Init.nut

119 lines
3.6 KiB
Plaintext
Raw Normal View History

2024-06-01 10:52:07 +08:00
/*
文件名: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();
}