212 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			4.9 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) {
 | |
|         IO.seek(i); //内容指示位
 | |
|         local currentByte = IO.readn('c'); //内容指示位
 | |
|         local after = IO.GetInt();
 | |
|         switch (currentByte) {
 | |
|             case 9: {
 | |
|                 local NewcurrentByte = IO.readn('c'); //内容指示位
 | |
|                 local Newafter = IO.GetInt();
 | |
|                 local Buf = getroottable()._Script_Data_.GetBinString(Newafter);
 | |
|                 if (!Buf) {
 | |
|                     Buf = "";
 | |
|                 } else {
 | |
|                     Buf = getroottable()._Script_Data_.GetLoadString(Buf);
 | |
|                 }
 | |
|                 return Buf;
 | |
|             }
 | |
|             case 10: {
 | |
|                 local Buf = getroottable()._Script_Data_.GetBinString(after);
 | |
|                 if (!Buf) {
 | |
|                     Buf = "";
 | |
|                 } else {
 | |
|                     Buf = getroottable()._Script_Data_.GetLoadString(Buf);
 | |
|                 }
 | |
|                 return Buf;
 | |
|             }
 | |
|             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';
 | |
|                 return after;
 | |
|             }
 | |
|             case 6:
 | |
|             case 8:
 | |
|             case 7:
 | |
|             case 5: {
 | |
|                 local Buf = getroottable()._Script_Data_.GetBinString(after);
 | |
|                 if (!Buf) Buf = "";
 | |
|                 return Buf;
 | |
|             }
 | |
|             default:
 | |
|                 return "";
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| }
 | |
| getroottable().ScriptData <- GlobaData(); |