208 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
/*
 | 
						|
文件名:ScriptManager.nut
 | 
						|
路径:Core/BaseClass/ScriptManager/ScriptManager.nut
 | 
						|
创建日期:2024-10-11	12:24
 | 
						|
文件用途:pvf 管理器
 | 
						|
*/
 | 
						|
class Script {
 | 
						|
 | 
						|
    C_Object = null;
 | 
						|
 | 
						|
    constructor(Path = "Script.pvf") {
 | 
						|
        print("正在初始化PVF...");
 | 
						|
        local StartTime = time();
 | 
						|
 | 
						|
        C_Object = Asset_LoadScript(Path);
 | 
						|
 | 
						|
        print("PVF初始化完毕!!!");
 | 
						|
        print("用时: " + (time() - StartTime) + "秒");
 | 
						|
        getroottable()._Script_Data_ <- this;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    function GetFileInfo(Path) {
 | 
						|
        local size = Asset_GetPvfFileSize(C_Object, Path);
 | 
						|
        if (size) {
 | 
						|
            local blobobj = blobex(size);
 | 
						|
            Asset_GetPvfFile(C_Object, Path, blobobj);
 | 
						|
            return blobobj;
 | 
						|
        } else return null;
 | 
						|
    }
 | 
						|
 | 
						|
    function GetBinString(Key) {
 | 
						|
        return Asset_GetPvfBinString(C_Object, Key);
 | 
						|
    }
 | 
						|
 | 
						|
    function GetLoadString(Key) {
 | 
						|
        return Asset_GetPvfLoadString(C_Object, Key);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class _PVF_Data_ {
 | 
						|
    //数据
 | 
						|
    Data = null;
 | 
						|
    //位置
 | 
						|
    Pos = 0;
 | 
						|
    //最大值
 | 
						|
    Max = 0;
 | 
						|
 | 
						|
    function _typeof() {
 | 
						|
        return "pvf_data";
 | 
						|
    }
 | 
						|
 | 
						|
    constructor(gData) {
 | 
						|
        Data = gData;
 | 
						|
        Max = gData.len();
 | 
						|
    }
 | 
						|
 | 
						|
    function Last() {
 | 
						|
        if (Pos > 0) {
 | 
						|
            Pos--;
 | 
						|
            return Get();
 | 
						|
        }
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    function Seek(i) {
 | 
						|
        if (Pos > 0 && Pos<(Max - 1)) {
 | 
						|
            Pos = i;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function Get() {
 | 
						|
        local Ret = Data[Pos];
 | 
						|
        if (Pos<(Max - 1)) {
 | 
						|
            Pos++;
 | 
						|
        }
 | 
						|
        return Ret;
 | 
						|
    }
 | 
						|
 | 
						|
    function Eof() {
 | 
						|
        if (Pos == Max - 1)
 | 
						|
            return true;
 | 
						|
    }
 | 
						|
 | 
						|
    function Next() {
 | 
						|
        if (Pos<(Max - 1)) {
 | 
						|
            Pos++;
 | 
						|
            return Get();
 | 
						|
        }
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class GlobaData {
 | 
						|
    //动画文件Map
 | 
						|
    Ani = null;
 | 
						|
 | 
						|
    constructor() {
 | 
						|
        Ani = {};
 | 
						|
    }
 | 
						|
 | 
						|
    //获取文件的IO
 | 
						|
    function GetFile(Path) {
 | 
						|
        return getroottable()._Script_Data_.GetFileInfo(Path);
 | 
						|
    }
 | 
						|
 | 
						|
    //获取文件并处理
 | 
						|
    function GetFileData(Path, Func) {
 | 
						|
        local IO = GetFile(Path);
 | 
						|
        if (IO) {
 | 
						|
            return ResolvingData(IO, Func, Path);
 | 
						|
        } else {
 | 
						|
            print(Path + "找不到文件!");
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //获取动画文件
 | 
						|
    function GetAni(Path) {
 | 
						|
        if (Path in Ani)
 | 
						|
            return Ani[Path];
 | 
						|
        else {
 | 
						|
            local IO = GetFile(Path);
 | 
						|
            if (IO) {
 | 
						|
                Ani[Path] <- InitPvfAni(IO);
 | 
						|
                Ani[Path].filepath <- Path;
 | 
						|
                return Ani[Path];
 | 
						|
            } else {
 | 
						|
                print(Path + "找不到文件!");
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function ResolvingData(IO, Func, Path) {
 | 
						|
        local DataTable = {};
 | 
						|
        DataTable.filepath <- Path;
 | 
						|
        local DataArr = [];
 | 
						|
        local Length = IO.len();
 | 
						|
        if (Length >= 7) {
 | 
						|
            local i = 2;
 | 
						|
            while (true) {
 | 
						|
                if (i< Length && Length - i >= 5) {
 | 
						|
                    local str = UnpackData(IO, i);
 | 
						|
                    i += 5;
 | 
						|
                    DataArr.push(str);
 | 
						|
                } else break;
 | 
						|
            }
 | 
						|
            Func(DataTable, _PVF_Data_(DataArr));
 | 
						|
            return DataTable;
 | 
						|
        }
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    function UnpackData(IO, i) {
 | 
						|
        local out = "";
 | 
						|
        IO.seek(i); //内容指示位
 | 
						|
        local currentByte = IO.readn('c'); //内容指示位
 | 
						|
        local after = IO.GetInt();
 | 
						|
        switch (currentByte) {
 | 
						|
            case 10: {
 | 
						|
                IO.seek(i - 4);
 | 
						|
                local Before = IO.GetInt();
 | 
						|
                local Buf = getroottable()._Script_Data_.GetBinString(after);
 | 
						|
                if (!Buf) {
 | 
						|
                    Buf = "";
 | 
						|
                } else {
 | 
						|
                    Buf = "<" + Before + "::" + Buf + "`" + getroottable()._Script_Data_.GetLoadString(Buf) + "`>";
 | 
						|
                }
 | 
						|
                Buf = Buf + "\r\n";
 | 
						|
                out += Buf;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            case 2: {
 | 
						|
                IO.seek(-4, 'c');
 | 
						|
                local ret = IO.readn('i');
 | 
						|
                return ret;
 | 
						|
            }
 | 
						|
            case 4: {
 | 
						|
                local Bbuf = blob(4);
 | 
						|
                Bbuf.writen(after, 'i');
 | 
						|
                Bbuf.seek(0);
 | 
						|
                local Buf = Bbuf.readn('f');
 | 
						|
                out += after + '\t';
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            case 6:
 | 
						|
            case 8:
 | 
						|
            case 7:
 | 
						|
            case 5: {
 | 
						|
                local Buf = getroottable()._Script_Data_.GetBinString(after);
 | 
						|
                if (!Buf) Buf = "";
 | 
						|
                return Buf;
 | 
						|
            }
 | 
						|
            default:
 | 
						|
                out += "";
 | 
						|
                break;
 | 
						|
        }
 | 
						|
 | 
						|
        return out;
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
getroottable().ScriptData <- GlobaData(); |