public static void Create(string To_File) { if (!IsInit) { return; } //共通 if (!Directory.Exists(Path.GetDirectoryName(To_File))) { Directory.CreateDirectory(Path.GetDirectoryName(To_File)); } Write_All.Add("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); Write_All.Add("<WwiseDocument Type=\"WorkUnit\" ID=\"{2A4DC1AF-DA27-4BAB-BFB5-D16386FA615E}\" SchemaVersion=\"97\">"); Write_All.Add("<Attenuations>"); Write_All.Add("<WorkUnit Name=\"Default Work Unit\" ID=\"{2A4DC1AF-DA27-4BAB-BFB5-D16386FA615E}\" PersistMode=\"Standalone\">"); Write_All.Add("<ChildrenList>"); //Attenuationの数だけ追加 foreach (Attenuation_Relation Temp_Info in BNK_Info.Attenuation_Info) { Write_All.Add("<Attenuation Name=\"" + Temp_Info.Name + "\" ID=\"{" + Temp_Info.GUID + "}\" ShortID=\"" + Temp_Info.ShortID + "\">"); Write_All.Add("<PropertyList>"); int Write_Max_Value_Line = Write_All.Count; Write_All.Add("</PropertyList>"); Write_All.Add("<CurveUsageInfoList>"); int Insert_Start_Line = Write_All.Count; List <int> CurveToUseOnly = new List <int>(); for (int Number = 0; Number < 7; Number++) { if (Temp_Info.curveToUse[Number]) { CurveToUseOnly.Add(Number); } } int Curve_Number = 0; bool IsExistVolumeDry = false; bool IsExistLPF = false; bool IsExistHPF = false; bool IsExistSpread = false; bool IsExistFocus = false; double RTPC_Max_Value = 0; for (int Number = Temp_Info.Curve_Start_Line; Number <= Temp_Info.Curve_End_Line; Number++) { if (BNK_Info.Read_All[Number].Contains("<object name=\"CAkConversionTable\"")) { bool IsEndOK = true; int pRTPCMgr_Count = 0; for (int Number_01 = Number; Number_01 <= Temp_Info.Curve_End_Line; Number_01++) { if (BNK_Info.Read_All[Number_01].Contains("<list name=\"pRTPCMgr\"")) { pRTPCMgr_Count = int.Parse(Get_Config.Get_Count(BNK_Info.Read_All[Number_01])); IsEndOK = false; } else if (BNK_Info.Read_All[Number_01].Contains("</list>")) { IsEndOK = true; } if (BNK_Info.Read_All[Number_01].Contains("</object>") && IsEndOK) { break; } } string Header_Name = ""; string Curve_Name_Line = ""; int Flag = 0; if (CurveToUseOnly[Curve_Number] == 0) { Header_Name = "VolumeDryUsage"; Curve_Name_Line = "<Curve Name=\"VolumeDry\" ID=\"{A9E42A0E-83F8-4B7D-A14F-480B0C2B51DF}\">"; Flag = 3; IsExistVolumeDry = true; } else if (CurveToUseOnly[Curve_Number] == 3) { Header_Name = "LowPassFilterUsage"; Curve_Name_Line = "<Curve Name=\"LowPassFilter\" ID=\"{4F001EC2-9CC8-4392-8288-1EEA50989868}\">"; Flag = 65537; IsExistLPF = true; } else if (CurveToUseOnly[Curve_Number] == 4) { Header_Name = "HighPassFilterUsage"; Curve_Name_Line = "<Curve Name=\"HighPassFilter\" ID=\"{5B13F357-F022-4AB6-B0F0-9AB4B403F248}\">"; Flag = 65537; IsExistHPF = true; } else if (CurveToUseOnly[Curve_Number] == 5) { Header_Name = "SpreadUsage"; Curve_Name_Line = "<Curve Name=\"Spread\" ID=\"{67C40131-35B3-4291-A98F-1BA12172DF31}\">"; Flag = 1; IsExistSpread = true; } else if (CurveToUseOnly[Curve_Number] == 6) { Header_Name = "FocusUsage"; Curve_Name_Line = "<Curve Name=\"Focus\" ID=\"{6DA87678-DAE5-4A25-B176-67FC98AE4E99}\">"; Flag = 1; IsExistFocus = true; } Write_All.Add("<" + Header_Name + ">"); Write_All.Add("<CurveUsageInfo Platform=\"Linked\" CurveToUse=\"Custom\">"); Write_All.Add(Curve_Name_Line); Write_All.Add("<PropertyList>"); Write_All.Add("<Property Name=\"Flags\" Type=\"int32\" Value=\"" + Flag + "\"/>"); Write_All.Add("</PropertyList>"); Write_All.Add("<PointList>"); //RTPCの処理とほとんど同じ //ただし、音量の設定のみは0で元の音量、-1で全く聞こえなくなるという感じなので45 * Y_Posにしています(45は大体の目安) for (int Number_01 = Number; Number_01 <= Temp_Info.Curve_End_Line; Number_01++) { if (BNK_Info.Read_All[Number_01].Contains("<object name=\"AkRTPCGraphPoint\"")) { int RTPC_Number = int.Parse(Get_Config.Get_Index(BNK_Info.Read_All[Number_01])); Write_All.Add("<Point>"); double X_Pos = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_01 + 1])); double Y_Pos = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_01 + 2])); string Interp = Get_Config.Get_SegmentShape(Get_Config.Get_Value_FMT(BNK_Info.Read_All[Number_01 + 3])); Write_All.Add("<XPos>" + X_Pos + "</XPos>"); if (CurveToUseOnly[Curve_Number] == 0) { Write_All.Add("<YPos>" + (int)(45 * Y_Pos) + "</YPos>"); } else { Write_All.Add("<YPos>" + Y_Pos + "</YPos>"); } if (RTPC_Number == 0) { Write_All.Add("<Flags>5</Flags>"); } else if (RTPC_Number + 1 == pRTPCMgr_Count) { Write_All.Add("<Flags>37</Flags>"); } else { Write_All.Add("<Flags>0</Flags>"); } if (RTPC_Max_Value < X_Pos) { RTPC_Max_Value = X_Pos; } if (Interp != "") { Write_All.Add("<SegmentShape>" + Interp + "</SegmentShape>"); } Write_All.Add("</Point>"); } if (BNK_Info.Read_All[Number_01].Contains("</list>")) { break; } } //RTPCの設定より前に記述する必要があるため、Insertで無理やりねじ込む Write_All.Add("</PointList>"); Write_All.Add("</Curve>"); Write_All.Add("</CurveUsageInfo>"); Write_All.Add("</" + Header_Name + ">"); //音量の設定のみ以下の文字列が必要 if (CurveToUseOnly[Curve_Number] == 0) { Write_All.Add("<VolumeWetGameUsage>"); Write_All.Add("<CurveUsageInfo Platform=\"Linked\" CurveToUse=\"UseVolumeDry\"/>"); Write_All.Add("</VolumeWetGameUsage>"); Write_All.Add("<VolumeWetUserUsage>"); Write_All.Add("<CurveUsageInfo Platform=\"Linked\" CurveToUse=\"UseVolumeDry\"/>"); Write_All.Add("</VolumeWetUserUsage>"); } Curve_Number++; } } CurveToUseOnly.Clear(); Write_All.Insert(Write_Max_Value_Line, "<Property Name=\"RadiusMax\" Type=\"Real64\" Value=\"" + RTPC_Max_Value + "\"/>"); //以下の設定がない場合、設定がないことを記述 //よくよく考えたら必要ないことに気が付いた if (!IsExistVolumeDry) { Add_Not_Use_Property("VolumeDryUsage", Insert_Start_Line); } if (!IsExistLPF) { Add_Not_Use_Property("LowPassFilterUsage", Insert_Start_Line); } if (!IsExistHPF) { Add_Not_Use_Property("HighPassFilterUsage", Insert_Start_Line); } if (!IsExistSpread) { Add_Not_Use_Property("SpreadUsage", Insert_Start_Line); } if (!IsExistFocus) { Add_Not_Use_Property("FocusUsage", Insert_Start_Line); } Write_All.Add("</CurveUsageInfoList>"); Write_All.Add("</Attenuation>"); } Write_All.Add("</ChildrenList>"); Write_All.Add("</WorkUnit>"); Write_All.Add("</Attenuations>"); Write_All.Add("</WwiseDocument>"); //ファイルに書き込んでメモリを解放 File.WriteAllLines(To_File, Write_All); Write_All.Clear(); }
public static void Init() { if (BNK_Info.Read_All.Count == 0) { return; } List <int> Switch_Numbers = new List <int>(); //Blend Containerのみを抽出 for (int Number = 0; Number < BNK_Info.ID_Line.Count; Number++) { if (BNK_Info.ID_Line[Number][2] == "CAkLayerCntr") { Switch_Numbers.Add(Number); } } foreach (int Number in Switch_Numbers) { uint Parent_ShortID = uint.Parse(BNK_Info.ID_Line[Number][0]); int Start_Line = -1; //特定の文字がある行までスキップ for (int Number_01 = int.Parse(BNK_Info.ID_Line[Number][1]); Number_01 < BNK_Info.Read_All.Count; Number_01++) { if (BNK_Info.Read_All[Number_01].Contains("<list name=\"pLayers\"")) { Start_Line = Number_01; break; } if (BNK_Info.Read_All[Number_01].Contains("type=\"u8\" name=\"eHircType\"")) { break; } } if (Start_Line == -1) { break; } //レイヤー1つ1つの中の情報をリストに保存 for (int Number_01 = Start_Line; Number_01 < BNK_Info.Read_All.Count; Number_01++) { if (BNK_Info.Read_All[Number_01].Contains("<object name=\"CAkLayer\"")) { uint Layer_ShortID = uint.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_01 + 1])); uint RTPC_ShortID = 0; for (int Number_02 = Number_01; Number_02 < BNK_Info.Read_All.Count; Number_02++) { if (BNK_Info.Read_All[Number_02].Contains("type=\"tid\" name=\"rtpcID\"")) { RTPC_ShortID = uint.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_02])); break; } if (BNK_Info.Read_All[Number_01].Contains("type=\"u8\" name=\"eHircType\"")) { break; } } if (RTPC_ShortID != 0) { List <Layer_CrossFade> CrossFades = new List <Layer_CrossFade>(); for (int Number_02 = Number_01 + 1; Number_02 < BNK_Info.Read_All.Count; Number_02++) { if (BNK_Info.Read_All[Number_02].Contains("<object name=\"CAssociatedChildData\"")) { uint Target_ShortID = uint.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_02 + 1])); int RTPC_Count = int.Parse(Get_Config.Get_Count(BNK_Info.Read_All[Number_02 + 3])); int Next_Index = 0; int Next_Index_Plus = 2; double Start_From = 0; double Start_To = 0; double End_From = 0; double End_To = 0; bool IsEnd = false; for (int Number_03 = Number_02; Number_03 < BNK_Info.Read_All.Count; Number_03++) { if (BNK_Info.Read_All[Number_03].Contains("</list>") || BNK_Info.Read_All[Number_03].Contains("type=\"u8\" name=\"eHircType\"")) { break; } if (BNK_Info.Read_All[Number_03].Contains("<object name=\"AkRTPCGraphPoint\"")) { int Index_Now = int.Parse(Get_Config.Get_Index(BNK_Info.Read_All[Number_03])); if (Index_Now == Next_Index) { Start_From = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_03 + 1])); Start_To = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_03 + 2])); if (Start_To == 1) { Next_Index_Plus = 2; } else { Next_Index_Plus = 3; } } else if (Index_Now == Next_Index + Next_Index_Plus || Index_Now == RTPC_Count - 1) { End_From = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_03 + 1])); End_To = double.Parse(Get_Config.Get_Property_Value(BNK_Info.Read_All[Number_03 + 2])); Next_Index = Index_Now + 1; IsEnd = true; } } if (IsEnd) { CrossFades.Add(new Layer_CrossFade(Target_ShortID, Start_From, Start_To, End_From, End_To)); Start_From = 0; Start_To = 0; End_From = 0; End_To = 0; IsEnd = false; } } } else if (BNK_Info.Read_All[Number_02].Contains("type=\"u8\" name=\"eHircType\"") || BNK_Info.Read_All[Number_02].Contains("<object name=\"CAkLayer\"")) { break; } } Layer_Info.Add(new Layer_Relation(Parent_ShortID, Layer_ShortID, RTPC_ShortID, Number_01, CrossFades)); } } else if (BNK_Info.Read_All[Number_01].Contains("type=\"u8\" name=\"eHircType\"")) { break; } } } Switch_Numbers.Clear(); //情報を視覚的にするためファイルに保存 /*List<string> Test = new List<string>(); * foreach (Layer_Relation Temp_01 in Layer_Info) * { * Test.Add("ShortID:" + Temp_01.ShortID); * Test.Add("Parent_ShortID:" + Temp_01.Parent_ShortID); * Test.Add("RTPC_ShortID:" + Temp_01.RTPC_ShortID); * Test.Add("GUID:" + Temp_01.GUID); * foreach (Layer_CrossFade Temp_02 in Temp_01.Children) * { * Test.Add(" Target_ShortID:" + Temp_02.Target_ShortID); * Test.Add(" Start_From:" + Temp_02.Start_From); * Test.Add(" Start_To:" + Temp_02.Start_To); * Test.Add(" End_From:" + Temp_02.End_From); * Test.Add(" End_To:" + Temp_02.End_To); * } * } * File.WriteAllLines(Voice_Set.Special_Path + "/Test.txt", Test); * Test.Clear();*/ }