public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, bool f_bMan, out string IconTex) { var fetchedField = AccessTools.DeclaredField(typeof(SceneEdit), "m_byItemFileBuffer"); var fetchedVal = fetchedField.GetValue(@this) as byte[]; IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } try { using (AFileBase afileBase = GameUty.FileOpen(f_strMenuFileName, null)) { NDebug.Assert(afileBase.IsValid(), "メニューファイルが存在しません。 :" + f_strMenuFileName); if (fetchedVal == null) { fetchedVal = new byte[System.Math.Max(500000, afileBase.GetSize())]; } else if (fetchedVal.Length < afileBase.GetSize()) { fetchedVal = new byte[afileBase.GetSize()]; } afileBase.Read(ref fetchedVal, afileBase.GetSize()); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "メニューファイルがが読み込めませんでした。 : ", f_strMenuFileName, " : ", ex.Message, " : StackTrace :\n", ex.StackTrace })); throw ex; } BinaryReader binaryReader = new BinaryReader(new MemoryStream(fetchedVal), Encoding.UTF8); string text = binaryReader.ReadString(); NDebug.Assert(text == "CM3D2_MENU", "ProcScriptBin 例外 : ヘッダーファイルが不正です。" + text); int num = binaryReader.ReadInt32(); string path = binaryReader.ReadString(); string text2 = binaryReader.ReadString(); string text3 = binaryReader.ReadString(); string text4 = binaryReader.ReadString(); long num2 = (long)binaryReader.ReadInt32(); int num3 = 0; string text5 = null; string text6 = string.Empty; string text7 = string.Empty; try { for (; ;) { int num4 = (int)binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; } else if (stringCom == "setumei") { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); } else if (stringCom == "category") { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); } catch { Main.logger.LogWarning("カテゴリがありません。" + mi.m_strCateName); mi.m_mpn = MPN.null_mpn; } } else if (stringCom == "color_set") { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); } catch { Main.logger.LogWarning("カテゴリがありません。" + mi.m_strCateName); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { NDebug.Assert("無限色IDがありません。" + text10, false); } mi.m_pcMultiColorID = pcMultiColorID; } } else if (stringCom == "icon" || stringCom == "icons") { text5 = stringList[1]; } else if (!(stringCom == "iconl")) { if (!(stringCom == "setstr")) { if (!(stringCom == "アイテムパラメータ")) { if (stringCom == "saveitem") { string text11 = stringList[1]; if (text11 == string.Empty) { Main.logger.LogError("err SaveItem \"" + text11); } if (text11 == null) { Main.logger.LogError("err SaveItem null=\"" + text11); } if (text11 != string.Empty) { } } else if (!(stringCom == "catno")) { if (stringCom == "additem") { num3++; } else if (stringCom == "unsetitem") { mi.m_boDelOnly = true; } else if (stringCom == "priority") { mi.m_fPriority = float.Parse(stringList[1]); } else if (stringCom == "メニューフォルダ" && stringList[1].ToLower() == "man") { mi.m_bMan = true; } } } } } } } } catch (Exception ex2) { Main.logger.LogError(string.Concat(new string[] { "Exception ", Path.GetFileName(path), " 現在処理中だった行 = ", text6, " 以前の行 = ", text7, " ", ex2.Message, "StackTrace:\n", ex2.StackTrace })); throw ex2; } if (text5 != null && text5 != string.Empty) { try { IconTex = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Main.logger.LogError("Error:"); } } binaryReader.Close(); return(true); }
public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex) { IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } if (MenuCache.ContainsKey(f_strMenuFileName)) { try { MenuStub tempStub = MenuCache[f_strMenuFileName]; if (tempStub.DateModified == File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName])) { if (tempStub.Name != null) { mi.m_strMenuName = tempStub.Name; } if (tempStub.Description != null) { mi.m_strInfo = tempStub.Description; } if (tempStub.Category != null) { mi.m_strCateName = tempStub.Category; mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), tempStub.Category); } else { mi.m_mpn = MPN.null_mpn; } if (tempStub.ColorSetMPN != null) { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), tempStub.ColorSetMPN); } if (tempStub.ColorSetMenu != null) { mi.m_strMenuNameInColorSet = tempStub.ColorSetMenu; } if (tempStub.MultiColorID == null) { mi.m_pcMultiColorID = MaidParts.PARTS_COLOR.NONE; } else if (tempStub.MultiColorID != null) { mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), tempStub.MultiColorID); } mi.m_boDelOnly = tempStub.DelMenu; mi.m_fPriority = tempStub.Priority; mi.m_bMan = tempStub.ManMenu; IconTex = tempStub.Icon; return(true); } else { Main.logger.LogWarning($"A cache entry was found outdated. This should be automatically fixed and the cache reloaded."); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { $"Encountered an issue while trying to load menu {f_strMenuFileName} from cache. This should be automatically fixed and the cache reloaded.", "\n\n", ex.Message, "\n", ex.StackTrace })); } } try { if (FilesToRead[f_strMenuFileName] == null) { FilesToRead[f_strMenuFileName] = new MemoryStream(File.ReadAllBytes(FilesDictionary[f_strMenuFileName])); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "The following menu file could not be read! (メニューファイルがが読み込めませんでした。): ", f_strMenuFileName, "\n\n", ex.Message, "\n", ex.StackTrace })); return(false); } string text6 = string.Empty; string text7 = string.Empty; string path = ""; MenuStub cacheEntry = new MenuStub(); try { cacheEntry.DateModified = File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName]); BinaryReader binaryReader = new BinaryReader(FilesToRead[f_strMenuFileName], Encoding.UTF8); string text = binaryReader.ReadString(); if (text != "CM3D2_MENU") { Main.logger.LogError("ProcScriptBin (例外 : ヘッダーファイルが不正です。) The header indicates a file type that is not a menu file!" + text + " @ " + f_strMenuFileName); return(false); } binaryReader.ReadInt32(); path = binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadInt32(); string text5 = null; while (true) { int num4 = binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { if (stringList.Length > 1) { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; cacheEntry.Name = mi.m_strMenuName; } else { Main.logger.LogWarning("Menu file has no name and an empty description will be used instead." + " @ " + f_strMenuFileName); mi.m_strMenuName = ""; cacheEntry.Name = mi.m_strMenuName; } } else if (stringCom == "setumei") { if (stringList.Length > 1) { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); cacheEntry.Description = mi.m_strInfo; } else { Main.logger.LogWarning("Menu file has no description (setumei) and an empty description will be used instead." + " @ " + f_strMenuFileName); mi.m_strInfo = ""; cacheEntry.Description = mi.m_strInfo; } } else if (stringCom == "category") { if (stringList.Length > 1) { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; cacheEntry.Category = mi.m_strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); cacheEntry.Category = mi.m_mpn.ToString(); } catch { Main.logger.LogWarning("There is no category called (カテゴリがありません。): " + mi.m_strCateName + " @ " + f_strMenuFileName); return(false); } } else { Main.logger.LogWarning("The following menu file has a category parent with no category: " + f_strMenuFileName); return(false); } } else if (stringCom == "color_set") { if (stringList.Length > 1) { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); cacheEntry.ColorSetMPN = mi.m_eColorSetMPN.ToString(); } catch { Main.logger.LogWarning("There is no category called(カテゴリがありません。): " + mi.m_strCateName + " @ " + f_strMenuFileName); return(false); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); cacheEntry.ColorSetMenu = mi.m_strMenuNameInColorSet; } } else { Main.logger.LogWarning("A color_set entry exists but is otherwise empty" + " @ " + f_strMenuFileName); } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { Main.logger.LogError("無限色IDがありません。(The following free color ID does not exist: )" + text10 + " @ " + f_strMenuFileName); return(false); } mi.m_pcMultiColorID = pcMultiColorID; cacheEntry.MultiColorID = mi.m_pcMultiColorID.ToString(); } } else if (stringCom == "icon" || stringCom == "icons") { if (stringList.Length > 1) { text5 = stringList[1]; } else { Main.logger.LogError("The following menu file has an icon entry but no field set: " + f_strMenuFileName); return(false); } } else if (stringCom == "saveitem") { if (stringList.Length > 1) { string text11 = stringList[1]; if (String.IsNullOrEmpty(text11)) { Main.logger.LogWarning("SaveItem is either null or empty." + " @ " + f_strMenuFileName); } } else { Main.logger.LogWarning("A saveitem entry exists with nothing set in the field @ " + f_strMenuFileName); } } else if (stringCom == "unsetitem") { mi.m_boDelOnly = true; cacheEntry.DelMenu = mi.m_boDelOnly; } else if (stringCom == "priority") { if (stringList.Length > 1) { mi.m_fPriority = float.Parse(stringList[1]); cacheEntry.Priority = mi.m_fPriority; } else { Main.logger.LogError("The following menu file has a priority entry but no field set. A default value of 10000 will be used: " + f_strMenuFileName); mi.m_fPriority = 10000f; cacheEntry.Priority = mi.m_fPriority; } } else if (stringCom == "メニューフォルダ") { if (stringList.Length > 1) { if (stringList[1].ToLower() == "man") { mi.m_bMan = true; cacheEntry.ManMenu = mi.m_bMan; } } else { Main.logger.LogError("A a menu with a menu folder setting (メニューフォルダ) has an entry but no field set: " + f_strMenuFileName); return(false); } } } } if (!String.IsNullOrEmpty(text5)) { try { IconTex = text5; cacheEntry.Icon = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Main.logger.LogError("Error setting some icon tex from a normal mod." + " @ " + f_strMenuFileName); return(false); } } binaryReader.Close(); } catch (Exception ex2) { Main.logger.LogError(string.Concat(new string[] { "Exception when reading: ", f_strMenuFileName, "\nThe line currently being processed, likely the issue (現在処理中だった行): ", text6, "\nPrevious line (以前の行): ", text7, "\n\n", ex2.Message, "\n", ex2.StackTrace })); return(false); } MenuCache[f_strMenuFileName] = cacheEntry; return(true); }
public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex) { IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } try { if (MenuCache.ContainsKey(f_strMenuFileName)) { MenuStub tempStub = MenuCache[f_strMenuFileName]; if (tempStub.DateModified == File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName])) { if (tempStub.Name != null) { mi.m_strMenuName = tempStub.Name; } if (tempStub.Description != null) { mi.m_strInfo = tempStub.Description; } if (tempStub.Category != null) { mi.m_strCateName = tempStub.Category; mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), tempStub.Category); } else { mi.m_mpn = MPN.null_mpn; } if (tempStub.ColorSetMPN != null) { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), tempStub.ColorSetMPN); } if (tempStub.ColorSetMenu != null) { mi.m_strMenuNameInColorSet = tempStub.ColorSetMenu; } if (tempStub.MultiColorID == "null") { mi.m_pcMultiColorID = MaidParts.PARTS_COLOR.NONE; } else if (tempStub.MultiColorID != null) { mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), tempStub.MultiColorID); } mi.m_boDelOnly = tempStub.DelMenu; mi.m_fPriority = tempStub.Priority; mi.m_bMan = tempStub.ManMenu; IconTex = tempStub.Icon; return(true); } else { Debug.Log($"A cache entry was found outdated. This should be automatically fixed and the cache reloaded."); } } if (FilesToRead[f_strMenuFileName] == null) { FilesToRead[f_strMenuFileName] = new MemoryStream(File.ReadAllBytes(FilesDictionary[f_strMenuFileName])); } } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "メニューファイルがが読み込めませんでした。 : ", f_strMenuFileName, " : ", ex.Message, " : StackTrace :\n", ex.StackTrace })); throw ex; } string text6 = string.Empty; string text7 = string.Empty; string path = ""; MenuStub cacheEntry = new MenuStub(); try { cacheEntry.DateModified = File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName]); BinaryReader binaryReader = new BinaryReader(FilesToRead[f_strMenuFileName], Encoding.UTF8); string text = binaryReader.ReadString(); NDebug.Assert(text == "CM3D2_MENU", "ProcScriptBin 例外 : ヘッダーファイルが不正です。" + text); binaryReader.ReadInt32(); path = binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadInt32(); string text5 = null; while (true) { int num4 = binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; cacheEntry.Name = mi.m_strMenuName; } else if (stringCom == "setumei") { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); cacheEntry.Description = mi.m_strInfo; } else if (stringCom == "category") { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; cacheEntry.Category = mi.m_strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); cacheEntry.Category = mi.m_mpn.ToString(); } catch { Debug.LogWarning("カテゴリがありません。" + mi.m_strCateName); mi.m_mpn = MPN.null_mpn; } } else if (stringCom == "color_set") { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); cacheEntry.ColorSetMPN = mi.m_eColorSetMPN.ToString(); } catch { Debug.LogWarning("カテゴリがありません。" + mi.m_strCateName); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); cacheEntry.ColorSetMenu = mi.m_strMenuNameInColorSet; } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; cacheEntry.MultiColorID = "null"; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { NDebug.Assert("無限色IDがありません。" + text10, false); } mi.m_pcMultiColorID = pcMultiColorID; cacheEntry.MultiColorID = mi.m_pcMultiColorID.ToString(); } } else if (stringCom == "icon" || stringCom == "icons") { text5 = stringList[1]; } else if (!(stringCom == "iconl")) { if (!(stringCom == "setstr")) { if (!(stringCom == "アイテムパラメータ")) { if (stringCom == "saveitem") { string text11 = stringList[1]; if (text11 == string.Empty) { Debug.LogError("err SaveItem \"" + text11); } if (text11 == null) { Debug.LogError("err SaveItem null=\"" + text11); } } else if (!(stringCom == "catno")) { if (stringCom == "unsetitem") { mi.m_boDelOnly = true; cacheEntry.DelMenu = mi.m_boDelOnly; } else if (stringCom == "priority") { mi.m_fPriority = float.Parse(stringList[1]); cacheEntry.Priority = mi.m_fPriority; } else if (stringCom == "メニューフォルダ" && stringList[1].ToLower() == "man") { mi.m_bMan = true; cacheEntry.ManMenu = mi.m_bMan; } } } } } } } if (text5 != null && text5 != string.Empty) { try { IconTex = text5; cacheEntry.Icon = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Debug.LogError("Error:"); } } binaryReader.Close(); } catch (Exception ex2) { Debug.LogError(string.Concat(new string[] { "Exception ", Path.GetFileName(path), " 現在処理中だった行 = ", text6, " 以前の行 = ", text7, " ", ex2.Message, "StackTrace:\n", ex2.StackTrace })); throw ex2; } MenuCache[f_strMenuFileName] = cacheEntry; return(true); }