diff --git a/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs b/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs index 953351b..d368af5 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/RelFile.cs @@ -1697,12 +1697,37 @@ namespace CodeWalker.GameFiles return null; } + public virtual MetaHash[] GetSynthHashes() + { + return null; + } + public virtual MetaHash[] GetMixerHashes() + { + return null; + } + public virtual MetaHash[] GetCurveHashes() + { + return null; + } + public virtual MetaHash[] GetCategoryHashes() + { + return null; + } + public virtual MetaHash[] GetSoundHashes() + { + return null; + } + public virtual MetaHash[] GetGameHashes() + { + return null; + } + + public virtual void Write(BinaryWriter bw) { bw.Write(Data); //fallback for default byte array data writing... } - public virtual void WriteXml(StringBuilder sb, int indent) { //default fallback to write raw data to XML... @@ -2176,6 +2201,20 @@ namespace CodeWalker.GameFiles return offsets.ToArray(); } + public override MetaHash[] GetSoundHashes() + { + return AudioTrackHashes; + } + public override MetaHash[] GetCurveHashes() + { + if ((Header != null) && (Header.RolloffCurve != 0)) return new[] { Header.RolloffCurve }; + return null; + } + public override MetaHash[] GetCategoryHashes() + { + if ((Header != null) && (Header.CategoryHash != 0)) return new[] { Header.CategoryHash }; + return null; + } } @@ -2443,6 +2482,10 @@ namespace CodeWalker.GameFiles { return new uint[] { 56 }; } + public override MetaHash[] GetCurveHashes() + { + return new[] { AttackCurve, DecayCurve, ReleaseCurve }; + } } [TC(typeof(EXP))] public class Dat54TwinLoopSound : Dat54Sound { @@ -2519,6 +2562,10 @@ namespace CodeWalker.GameFiles { return GetAudioTracksHashTableOffsets(28); } + public override MetaHash[] GetCurveHashes() + { + return new[] { CrossfadeCurve }; + } } [TC(typeof(EXP))] public class Dat54SpeechSound : Dat54Sound { @@ -2924,6 +2971,10 @@ namespace CodeWalker.GameFiles { return new uint[] { 0, 4 }; } + public override MetaHash[] GetCurveHashes() + { + return new[] { UnkCurvesHash }; + } } [TC(typeof(EXP))] public class Dat54CollapsingStereoSound : Dat54Sound { @@ -3292,20 +3343,20 @@ namespace CodeWalker.GameFiles } [TC(typeof(EXP))] public class Dat54ModularSynthSound : Dat54Sound { - public MetaHash OptAmpSynthSound { get; set; } //0x0-0x4 - public MetaHash UnkHash { get; set; } //0x4-0x8 + public MetaHash SynthSound { get; set; } //0x0-0x4 + public MetaHash SynthPreset { get; set; } //0x4-0x8 public float UnkFloat { get; set; } //0x8-0xC public int UnkInt { get; set; } //0xC-0x10 public int TrackCount { get; set; } - public int UnkItemCount { get; set; } - public Dat54ModularSynthSoundData[] UnkItems { get; set; } //0x28-.. + public int VariableCount { get; set; } + public Dat54ModularSynthSoundVariable[] Variables { get; set; } //0x28-.. public Dat54ModularSynthSound(RelFile rel) : base(rel, Dat54SoundType.ModularSynthSound) { } public Dat54ModularSynthSound(RelData d, BinaryReader br) : base(d, br) { - OptAmpSynthSound = br.ReadUInt32(); //0x0-0x4 - UnkHash = br.ReadUInt32(); //0x4-0x8 + SynthSound = br.ReadUInt32(); //0x0-0x4 + SynthPreset = br.ReadUInt32(); //0x4-0x8 UnkFloat = br.ReadSingle(); //0x8-0xC UnkInt = br.ReadInt32(); //0xC-0x10 TrackCount = br.ReadInt32(); //0x10-0x14 @@ -3314,41 +3365,41 @@ namespace CodeWalker.GameFiles { AudioTrackHashes[i] = br.ReadUInt32(); } - UnkItemCount = br.ReadInt32(); - UnkItems = new Dat54ModularSynthSoundData[UnkItemCount]; - for (int i = 0; i < UnkItemCount; i++) + VariableCount = br.ReadInt32(); + Variables = new Dat54ModularSynthSoundVariable[VariableCount]; + for (int i = 0; i < VariableCount; i++) { - UnkItems[i] = new Dat54ModularSynthSoundData(br); + Variables[i] = new Dat54ModularSynthSoundVariable(br); } } public override void ReadXml(XmlNode node) { base.ReadXml(node); - OptAmpSynthSound = XmlRel.GetHash(Xml.GetChildInnerText(node, "OptAmpSynthSound")); - UnkHash = XmlRel.GetHash(Xml.GetChildInnerText(node, "UnkHash")); + SynthSound = XmlRel.GetHash(Xml.GetChildInnerText(node, "SynthSound")); + SynthPreset = XmlRel.GetHash(Xml.GetChildInnerText(node, "SynthPreset")); UnkFloat = Xml.GetChildFloatAttribute(node, "UnkFloat", "value"); UnkInt = Xml.GetChildIntAttribute(node, "UnkInt", "value"); TrackCount = Xml.GetChildIntAttribute(node, "TrackCount", "value"); ReadAudioTracksXml(node); - UnkItems = XmlRel.ReadItemArray(node, "UnkItems"); - UnkItemCount = (UnkItems?.Length ?? 0); + Variables = XmlRel.ReadItemArray(node, "Variables"); + VariableCount = (Variables?.Length ?? 0); } public override void WriteXml(StringBuilder sb, int indent) { base.WriteXml(sb, indent); - RelXml.StringTag(sb, indent, "OptAmpSynthSound", RelXml.HashString(OptAmpSynthSound)); - RelXml.StringTag(sb, indent, "UnkHash", RelXml.HashString(UnkHash)); + RelXml.StringTag(sb, indent, "SynthSound", RelXml.HashString(SynthSound)); + RelXml.StringTag(sb, indent, "SynthPreset", RelXml.HashString(SynthPreset)); RelXml.ValueTag(sb, indent, "UnkFloat", FloatUtil.ToString(UnkFloat)); RelXml.ValueTag(sb, indent, "UnkInt", UnkInt.ToString()); RelXml.ValueTag(sb, indent, "TrackCount", TrackCount.ToString()); WriteAudioTracksXml(sb, indent); - RelXml.WriteItemArray(sb, UnkItems, indent, "UnkItems"); + RelXml.WriteItemArray(sb, Variables, indent, "Variables"); } public override void Write(BinaryWriter bw) { base.Write(bw); - bw.Write(OptAmpSynthSound); //0x0-0x4 - bw.Write(UnkHash); //0x4-0x8 + bw.Write(SynthSound); //0x0-0x4 + bw.Write(SynthPreset); //0x4-0x8 bw.Write(UnkFloat); //0x8-0xC bw.Write(UnkInt); //0xC-0x10 bw.Write(TrackCount); //0x10-0x14 @@ -3356,10 +3407,10 @@ namespace CodeWalker.GameFiles { bw.Write(AudioTrackHashes[i]); } - bw.Write(UnkItemCount); - for (int i = 0; i < UnkItemCount; i++) + bw.Write(VariableCount); + for (int i = 0; i < VariableCount; i++) { - UnkItems[i].Write(bw); + Variables[i].Write(bw); } } public override uint[] GetHashTableOffsets() @@ -3371,42 +3422,46 @@ namespace CodeWalker.GameFiles } return offsets.ToArray(); } + public override MetaHash[] GetSynthHashes() + { + return new[] { SynthSound, SynthPreset }; + } } - [TC(typeof(EXP))] public class Dat54ModularSynthSoundData : IMetaXmlItem + [TC(typeof(EXP))] public class Dat54ModularSynthSoundVariable : IMetaXmlItem { - public MetaHash UnkHash { get; set; } - public MetaHash ParameterHash { get; set; } + public MetaHash VariableName { get; set; } + public MetaHash ParameterName { get; set; } public float Value { get; set; } - public Dat54ModularSynthSoundData() + public Dat54ModularSynthSoundVariable() { } - public Dat54ModularSynthSoundData(BinaryReader br) + public Dat54ModularSynthSoundVariable(BinaryReader br) { - UnkHash = br.ReadUInt32(); - ParameterHash = br.ReadUInt32(); + VariableName = br.ReadUInt32(); + ParameterName = br.ReadUInt32(); Value = br.ReadSingle(); } public void ReadXml(XmlNode node) { - UnkHash = XmlRel.GetHash(Xml.GetChildInnerText(node, "UnkHash")); - ParameterHash = XmlRel.GetHash(Xml.GetChildInnerText(node, "ParameterHash")); + VariableName = XmlRel.GetHash(Xml.GetChildInnerText(node, "VariableName")); + ParameterName = XmlRel.GetHash(Xml.GetChildInnerText(node, "ParameterName")); Value = Xml.GetChildFloatAttribute(node, "Value", "value"); } public void WriteXml(StringBuilder sb, int indent) { - RelXml.StringTag(sb, indent, "UnkHash", RelXml.HashString(UnkHash)); - RelXml.StringTag(sb, indent, "ParameterHash", RelXml.HashString(ParameterHash)); + RelXml.StringTag(sb, indent, "VariableName", RelXml.HashString(VariableName)); + RelXml.StringTag(sb, indent, "ParameterName", RelXml.HashString(ParameterName)); RelXml.ValueTag(sb, indent, "Value", FloatUtil.ToString(Value)); } public void Write(BinaryWriter bw) { - bw.Write(UnkHash); - bw.Write(ParameterHash); + bw.Write(VariableName); + bw.Write(ParameterName); bw.Write(Value); } public override string ToString() { - return UnkHash.ToString() + ": " + ParameterHash.ToString() + ": " + FloatUtil.ToString(Value); + return VariableName.ToString() + ": " + ParameterName.ToString() + ": " + FloatUtil.ToString(Value); } } [TC(typeof(EXP))] public class Dat54GranularSound : Dat54Sound @@ -3860,6 +3915,10 @@ namespace CodeWalker.GameFiles { return new uint[] { 0 }; } + public override MetaHash[] GetCurveHashes() + { + return new[] { UnkCurvesHash }; + } } [TC(typeof(EXP))] public class Dat54VariablePrintValueSound : Dat54Sound { @@ -4876,6 +4935,10 @@ namespace CodeWalker.GameFiles } return offsets.ToArray(); } + public override MetaHash[] GetSoundHashes() + { + return Items; + } } [TC(typeof(EXP))] public class Dat54SoundList : Dat54Sound { @@ -4920,6 +4983,10 @@ namespace CodeWalker.GameFiles bw.Write(Items[i]); } } + public override MetaHash[] GetSoundHashes() + { + return Items; + } } @@ -23796,7 +23863,6 @@ namespace CodeWalker.GameFiles int indent = 0; int cindent = 1; var iindent = 2; - var icindent = 3; var name = "Dat" + ((uint)rel.RelType).ToString(); OpenTag(sb, indent, name); @@ -23824,84 +23890,7 @@ namespace CodeWalker.GameFiles foreach (var item in rel.RelDatasSorted) { - var typeid = item.TypeID.ToString(); - switch (rel.RelType) - { - case RelDatFileType.Dat54DataEntries: - typeid = ((Dat54SoundType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat149: - case RelDatFileType.Dat150: - case RelDatFileType.Dat151: - typeid = ((Dat151RelType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat4: - if (rel.IsAudioConfig) typeid = ((Dat4ConfigType)item.TypeID).ToString(); - else typeid = ((Dat4SpeechType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat10ModularSynth: - typeid = ((Dat10RelType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat15DynamicMixer: - typeid = ((Dat15RelType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat16Curves: - typeid = ((Dat16RelType)item.TypeID).ToString(); - break; - case RelDatFileType.Dat22Categories: - typeid = ((Dat22RelType)item.TypeID).ToString(); - break; - default: - break; - } - - var ntoffset = ""; - var dat151item = item as Dat151RelData; - if (dat151item != null) - { - ntoffset = " ntOffset=\"" + dat151item.NameTableOffset.ToString() + "\""; - } - var dat4config = item as Dat4ConfigData; - if (dat4config != null) - { - ntoffset = " ntOffset=\"" + dat4config.NameTableOffset.ToString() + "\""; - } - var dat4Speech = item as Dat4SpeechData; - if (dat4Speech != null) - { - if (dat4Speech.Type == Dat4SpeechType.Container) - { - ntoffset = " ntOffset=\"" + dat4Speech.NameTableOffset.ToString() + "\""; - } - } - var dat10item = item as Dat10RelData; - if (dat10item != null) - { - ntoffset = " ntOffset=\"" + dat10item.NameTableOffset.ToString() + "\""; - } - var dat15item = item as Dat15RelData; - if (dat15item != null) - { - ntoffset = " ntOffset=\"" + dat15item.NameTableOffset.ToString() + "\""; - } - var dat16item = item as Dat16RelData; - if (dat16item != null) - { - ntoffset = " ntOffset=\"" + dat16item.NameTableOffset.ToString() + "\""; - } - var dat22item = item as Dat22RelData; - if (dat22item != null) - { - ntoffset = " ntOffset=\"" + dat22item.NameTableOffset.ToString() + "\""; - } - - OpenTag(sb, iindent, "Item type=\"" + typeid + "\"" + ntoffset); - - StringTag(sb, icindent, "Name", item.Name ?? RelXml.HashString(item.NameHash)); - - item.WriteXml(sb, icindent); - - CloseTag(sb, iindent, "Item"); + GetXml(item, sb, iindent); } CloseTag(sb, cindent, "Items"); @@ -23913,6 +23902,97 @@ namespace CodeWalker.GameFiles return sb.ToString(); } + public static void GetXml(RelData item, StringBuilder sb, int iindent) + { + var icindent = iindent + 1; + var rel = item.Rel; + var typeid = item.TypeID.ToString(); + switch (rel.RelType) + { + case RelDatFileType.Dat54DataEntries: + typeid = ((Dat54SoundType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat149: + case RelDatFileType.Dat150: + case RelDatFileType.Dat151: + typeid = ((Dat151RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat4: + if (rel.IsAudioConfig) typeid = ((Dat4ConfigType)item.TypeID).ToString(); + else typeid = ((Dat4SpeechType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat10ModularSynth: + typeid = ((Dat10RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat15DynamicMixer: + typeid = ((Dat15RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat16Curves: + typeid = ((Dat16RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat22Categories: + typeid = ((Dat22RelType)item.TypeID).ToString(); + break; + default: + break; + } + + var ntoffset = ""; + var dat151item = item as Dat151RelData; + if (dat151item != null) + { + ntoffset = " ntOffset=\"" + dat151item.NameTableOffset.ToString() + "\""; + } + var dat4config = item as Dat4ConfigData; + if (dat4config != null) + { + ntoffset = " ntOffset=\"" + dat4config.NameTableOffset.ToString() + "\""; + } + var dat4Speech = item as Dat4SpeechData; + if (dat4Speech != null) + { + if (dat4Speech.Type == Dat4SpeechType.Container) + { + ntoffset = " ntOffset=\"" + dat4Speech.NameTableOffset.ToString() + "\""; + } + } + var dat10item = item as Dat10RelData; + if (dat10item != null) + { + ntoffset = " ntOffset=\"" + dat10item.NameTableOffset.ToString() + "\""; + } + var dat15item = item as Dat15RelData; + if (dat15item != null) + { + ntoffset = " ntOffset=\"" + dat15item.NameTableOffset.ToString() + "\""; + } + var dat16item = item as Dat16RelData; + if (dat16item != null) + { + ntoffset = " ntOffset=\"" + dat16item.NameTableOffset.ToString() + "\""; + } + var dat22item = item as Dat22RelData; + if (dat22item != null) + { + ntoffset = " ntOffset=\"" + dat22item.NameTableOffset.ToString() + "\""; + } + + OpenTag(sb, iindent, "Item type=\"" + typeid + "\"" + ntoffset); + + StringTag(sb, icindent, "Name", item.Name ?? RelXml.HashString(item.NameHash)); + + item.WriteXml(sb, icindent); + + CloseTag(sb, iindent, "Item"); + + } + public static string GetXml(RelData item, int indent = 0) + { + var sb = new StringBuilder(); + GetXml(item, sb, indent); + return sb.ToString(); + } + } public class XmlRel diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index a1f9ba1..87b4db5 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -89,6 +89,19 @@ namespace CodeWalker.GameFiles public Dictionary> PedTextureDicts { get; set; } public Dictionary> PedClothDicts { get; set; } + + public List AudioDatRelFiles = new List(); + public Dictionary AudioConfigDict = new Dictionary(); + public Dictionary AudioSpeechDict = new Dictionary(); + public Dictionary AudioSynthsDict = new Dictionary(); + public Dictionary AudioMixersDict = new Dictionary(); + public Dictionary AudioCurvesDict = new Dictionary(); + public Dictionary AudioCategsDict = new Dictionary(); + public Dictionary AudioSoundsDict = new Dictionary(); + public Dictionary AudioGameDict = new Dictionary(); + + + public List BaseRpfs { get; private set; } public List AllRpfs { get; private set; } public List DlcRpfs { get; private set; } @@ -98,6 +111,7 @@ namespace CodeWalker.GameFiles public bool LoadArchetypes = true; public bool LoadVehicles = true; public bool LoadPeds = true; + public bool LoadAudio = true; private bool PreloadedMode = false; private string GTAFolder; @@ -250,6 +264,9 @@ namespace CodeWalker.GameFiles UpdateStatus("Loading strings..."); InitStringDicts(); + UpdateStatus("Loading audio..."); + InitAudio(); + IsInited = true; } @@ -296,6 +313,9 @@ namespace CodeWalker.GameFiles UpdateStatus("Loading peds..."); InitPeds(); + UpdateStatus("Loading audio..."); + InitAudio(); + } private void InitDlcList() @@ -944,32 +964,26 @@ namespace CodeWalker.GameFiles RpfFileEntry fentry = entry as RpfFileEntry; if (entry.NameLower.EndsWith(".ydr")) { - YdrDict[entry.NameHash] = fentry; //replaces any existing entries... YdrDict[entry.ShortNameHash] = fentry; } else if (entry.NameLower.EndsWith(".ydd")) { - YddDict[entry.NameHash] = fentry; //replaces any existing entries... YddDict[entry.ShortNameHash] = fentry; } else if (entry.NameLower.EndsWith(".ytd")) { - YtdDict[entry.NameHash] = fentry; //replaces any existing entries... YtdDict[entry.ShortNameHash] = fentry; } else if (entry.NameLower.EndsWith(".yft")) { - YftDict[entry.NameHash] = fentry; YftDict[entry.ShortNameHash] = fentry; } else if (entry.NameLower.EndsWith(".ycd")) { - YcdDict[entry.NameHash] = fentry; YcdDict[entry.ShortNameHash] = fentry; } else if (entry.NameLower.EndsWith(".yed")) { - YedDict[entry.NameHash] = fentry; YedDict[entry.ShortNameHash] = fentry; } } @@ -1826,6 +1840,134 @@ namespace CodeWalker.GameFiles } + public void InitAudio() + { + if (!LoadAudio) return; + + Dictionary datrelentries = new Dictionary(); + void addRpfDatRelEntries(RpfFile rpffile) + { + if (rpffile.AllEntries == null) return; + foreach (var entry in rpffile.AllEntries) + { + if (entry is RpfFileEntry) + { + RpfFileEntry fentry = entry as RpfFileEntry; + if (entry.NameLower.EndsWith(".rel")) + { + datrelentries[entry.NameHash] = fentry; + } + } + } + } + + var audrpf = RpfMan.FindRpfFile("x64\\audio\\audio_rel.rpf"); + if (audrpf != null) + { + addRpfDatRelEntries(audrpf); + } + + if (EnableDlc) + { + var updrpf = RpfMan.FindRpfFile("update\\update.rpf"); + if (updrpf != null) + { + addRpfDatRelEntries(updrpf); + } + foreach (var dlcrpf in DlcActiveRpfs) //load from current dlc rpfs + { + addRpfDatRelEntries(dlcrpf); + } + if (DlcActiveRpfs.Count == 0) //when activated from RPF explorer... DLCs aren't initialised fully + { + foreach (var rpf in AllRpfs) //this is a bit of a hack - DLC orders won't be correct so likely will select wrong versions of things + { + if (rpf.NameLower.StartsWith("dlc")) + { + addRpfDatRelEntries(rpf); + } + } + } + } + + + var audioDatRelFiles = new List(); + var audioConfigDict = new Dictionary(); + var audioSpeechDict = new Dictionary(); + var audioSynthsDict = new Dictionary(); + var audioMixersDict = new Dictionary(); + var audioCurvesDict = new Dictionary(); + var audioCategsDict = new Dictionary(); + var audioSoundsDict = new Dictionary(); + var audioGameDict = new Dictionary(); + + + + foreach (var datrelentry in datrelentries.Values) + { + var relfile = RpfMan.GetFile(datrelentry); + if (relfile == null) continue; + + audioDatRelFiles.Add(relfile); + + var d = audioGameDict; + var t = relfile.RelType; + switch (t) + { + case RelDatFileType.Dat4: + d = relfile.IsAudioConfig ? audioConfigDict : audioSpeechDict; + break; + case RelDatFileType.Dat10ModularSynth: + d = audioSynthsDict; + break; + case RelDatFileType.Dat15DynamicMixer: + d = audioMixersDict; + break; + case RelDatFileType.Dat16Curves: + d = audioCurvesDict; + break; + case RelDatFileType.Dat22Categories: + d = audioCategsDict; + break; + case RelDatFileType.Dat54DataEntries: + d = audioSoundsDict; + break; + case RelDatFileType.Dat149: + case RelDatFileType.Dat150: + case RelDatFileType.Dat151: + default: + d = audioGameDict; + break; + } + + foreach (var reldata in relfile.RelDatas) + { + if (reldata.NameHash == 0) continue; + //if (d.TryGetValue(reldata.NameHash, out var exdata) && (exdata.TypeID != reldata.TypeID)) + //{ }//sanity check + d[reldata.NameHash] = reldata; + } + + } + + + + + AudioDatRelFiles = audioDatRelFiles; + AudioConfigDict = audioConfigDict; + AudioSpeechDict = audioSpeechDict; + AudioSynthsDict = audioSynthsDict; + AudioMixersDict = audioMixersDict; + AudioCurvesDict = audioCurvesDict; + AudioCategsDict = audioCategsDict; + AudioSoundsDict = audioSoundsDict; + AudioGameDict = audioGameDict; + + } + + + + public bool SetDlcLevel(string dlc, bool enable) { diff --git a/CodeWalker.Core/World/AudioZones.cs b/CodeWalker.Core/World/AudioZones.cs index 04c2fe9..9cf94a7 100644 --- a/CodeWalker.Core/World/AudioZones.cs +++ b/CodeWalker.Core/World/AudioZones.cs @@ -8,30 +8,15 @@ using System.Threading.Tasks; namespace CodeWalker.World { - public class AudioZones // : BasePathData + public class AudioZones { public volatile bool Inited = false; public GameFileCache GameFileCache; - //public Vector4[] GetNodePositions() - //{ - // return null; - //} - //public EditorVertex[] GetPathVertices() - //{ - // return null; - //} - //public EditorVertex[] GetTriangleVertices() - //{ - // return TriangleVerts; - //} - //public EditorVertex[] TriangleVerts; - public List Zones = new List(); public List Emitters = new List(); public List AllItems = new List(); - public List AllFiles = new List(); public Dictionary PlacementsDict = new Dictionary(); @@ -41,49 +26,22 @@ namespace CodeWalker.World GameFileCache = gameFileCache; - var rpfman = gameFileCache.RpfMan; - - Zones.Clear(); Emitters.Clear(); AllItems.Clear(); - Dictionary datrelentries = new Dictionary(); - var audrpf = rpfman.FindRpfFile("x64\\audio\\audio_rel.rpf"); - if (audrpf != null) - { - AddRpfDatRels(audrpf, datrelentries); - } - - if (gameFileCache.EnableDlc) - { - var updrpf = rpfman.FindRpfFile("update\\update.rpf"); - if (updrpf != null) - { - AddRpfDatRels(updrpf, datrelentries); - } - foreach (var dlcrpf in GameFileCache.DlcActiveRpfs) //load from current dlc rpfs - { - AddRpfDatRels(dlcrpf, datrelentries); - } - } - List placements = new List(); - foreach (var dat151entry in datrelentries.Values) + foreach (var relfile in GameFileCache.AudioDatRelFiles) { - var relfile = rpfman.GetFile(dat151entry); - if (relfile != null) - { - AllFiles.Add(relfile); + if (relfile == null) continue; - placements.Clear(); + placements.Clear(); - CreatePlacements(relfile, placements, true); + CreatePlacements(relfile, placements, true); - PlacementsDict[relfile] = placements.ToArray(); - } + PlacementsDict[relfile] = placements.ToArray(); } AllItems.AddRange(Zones); @@ -93,31 +51,6 @@ namespace CodeWalker.World } - - private void AddRpfDatRels(RpfFile rpffile, Dictionary datrelentries) - { - if (rpffile.AllEntries == null) return; - foreach (var entry in rpffile.AllEntries) - { - if (entry is RpfFileEntry) - { - RpfFileEntry fentry = entry as RpfFileEntry; - //if (entry.NameLower.EndsWith(".rel")) - //{ - // datrelentries[entry.NameHash] = fentry; - //} - if (entry.NameLower.EndsWith(".dat54.rel")) - { - datrelentries[entry.NameHash] = fentry; - } - if (entry.NameLower.EndsWith(".dat151.rel")) - { - datrelentries[entry.NameHash] = fentry; - } - } - } - } - private void CreatePlacements(RelFile relfile, List placements, bool addtoLists = false) { foreach (var reldata in relfile.RelDatas) diff --git a/CodeWalker/ExploreForm.Designer.cs b/CodeWalker/ExploreForm.Designer.cs index 6e88cbb..ff50761 100644 --- a/CodeWalker/ExploreForm.Designer.cs +++ b/CodeWalker/ExploreForm.Designer.cs @@ -69,6 +69,7 @@ this.ViewThemeDarkMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsBinSearchMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsAudioExplorerMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsRpfBrowserMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsJenkGenMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsJenkIndMenu = new System.Windows.Forms.ToolStripMenuItem(); @@ -125,6 +126,8 @@ this.ListContextNewMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextNewFolderMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextNewRpfArchiveMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.ListContextNewYtdFileMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextImportFbxMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextImportXmlMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextImportRawMenu = new System.Windows.Forms.ToolStripMenuItem(); @@ -155,8 +158,6 @@ this.OpenFileDialog = new System.Windows.Forms.OpenFileDialog(); this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); this.VSExtender = new WeifenLuo.WinFormsUI.Docking.VisualStudioToolStripExtender(this.components); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.ListContextNewYtdFileMenu = new System.Windows.Forms.ToolStripMenuItem(); this.MainMenu.SuspendLayout(); this.MainToolbar.SuspendLayout(); this.MainStatusBar.SuspendLayout(); @@ -199,20 +200,20 @@ // FileOpenFolderMenu // this.FileOpenFolderMenu.Name = "FileOpenFolderMenu"; - this.FileOpenFolderMenu.Size = new System.Drawing.Size(180, 22); + this.FileOpenFolderMenu.Size = new System.Drawing.Size(148, 22); this.FileOpenFolderMenu.Text = "Open Folder..."; this.FileOpenFolderMenu.Click += new System.EventHandler(this.FileOpenFolderMenu_Click); // // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(145, 6); // // FileExitMenu // this.FileExitMenu.Name = "FileExitMenu"; this.FileExitMenu.ShortcutKeyDisplayString = "Alt+F4"; - this.FileExitMenu.Size = new System.Drawing.Size(180, 22); + this.FileExitMenu.Size = new System.Drawing.Size(148, 22); this.FileExitMenu.Text = "Exit"; this.FileExitMenu.Click += new System.EventHandler(this.FileExitMenu_Click); // @@ -417,21 +418,21 @@ // ViewLargeIconsMenu // this.ViewLargeIconsMenu.Name = "ViewLargeIconsMenu"; - this.ViewLargeIconsMenu.Size = new System.Drawing.Size(180, 22); + this.ViewLargeIconsMenu.Size = new System.Drawing.Size(134, 22); this.ViewLargeIconsMenu.Text = "Large Icons"; this.ViewLargeIconsMenu.Click += new System.EventHandler(this.ViewLargeIconsMenu_Click); // // ViewSmallIconsMenu // this.ViewSmallIconsMenu.Name = "ViewSmallIconsMenu"; - this.ViewSmallIconsMenu.Size = new System.Drawing.Size(180, 22); + this.ViewSmallIconsMenu.Size = new System.Drawing.Size(134, 22); this.ViewSmallIconsMenu.Text = "Small Icons"; this.ViewSmallIconsMenu.Click += new System.EventHandler(this.ViewSmallIconsMenu_Click); // // ViewListMenu // this.ViewListMenu.Name = "ViewListMenu"; - this.ViewListMenu.Size = new System.Drawing.Size(180, 22); + this.ViewListMenu.Size = new System.Drawing.Size(134, 22); this.ViewListMenu.Text = "List"; this.ViewListMenu.Click += new System.EventHandler(this.ViewListMenu_Click); // @@ -440,14 +441,14 @@ this.ViewDetailsMenu.Checked = true; this.ViewDetailsMenu.CheckState = System.Windows.Forms.CheckState.Checked; this.ViewDetailsMenu.Name = "ViewDetailsMenu"; - this.ViewDetailsMenu.Size = new System.Drawing.Size(180, 22); + this.ViewDetailsMenu.Size = new System.Drawing.Size(134, 22); this.ViewDetailsMenu.Text = "Details"; this.ViewDetailsMenu.Click += new System.EventHandler(this.ViewDetailsMenu_Click); // // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(131, 6); // // ViewThemeMenu // @@ -457,7 +458,7 @@ this.ViewThemeLightMenu, this.ViewThemeDarkMenu}); this.ViewThemeMenu.Name = "ViewThemeMenu"; - this.ViewThemeMenu.Size = new System.Drawing.Size(180, 22); + this.ViewThemeMenu.Size = new System.Drawing.Size(134, 22); this.ViewThemeMenu.Text = "Theme"; // // ViewThemeWindowsMenu @@ -494,6 +495,7 @@ // this.ToolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ToolsBinSearchMenu, + this.ToolsAudioExplorerMenu, this.ToolsRpfBrowserMenu, this.ToolsJenkGenMenu, this.ToolsJenkIndMenu}); @@ -508,6 +510,14 @@ this.ToolsBinSearchMenu.Text = "Binary Search..."; this.ToolsBinSearchMenu.Click += new System.EventHandler(this.ToolsBinSearchMenu_Click); // + // ToolsAudioExplorerMenu + // + this.ToolsAudioExplorerMenu.Enabled = false; + this.ToolsAudioExplorerMenu.Name = "ToolsAudioExplorerMenu"; + this.ToolsAudioExplorerMenu.Size = new System.Drawing.Size(180, 22); + this.ToolsAudioExplorerMenu.Text = "Audio Explorer"; + this.ToolsAudioExplorerMenu.Click += new System.EventHandler(this.ToolsAudioExplorerMenu_Click); + // // ToolsRpfBrowserMenu // this.ToolsRpfBrowserMenu.Name = "ToolsRpfBrowserMenu"; @@ -541,7 +551,7 @@ // OptionsStartInEditModeMenu // this.OptionsStartInEditModeMenu.Name = "OptionsStartInEditModeMenu"; - this.OptionsStartInEditModeMenu.Size = new System.Drawing.Size(180, 22); + this.OptionsStartInEditModeMenu.Size = new System.Drawing.Size(168, 22); this.OptionsStartInEditModeMenu.Text = "Start in Edit mode"; this.OptionsStartInEditModeMenu.Click += new System.EventHandler(this.OptionsStartInEditModeMenu_Click); // @@ -553,7 +563,7 @@ this.OptionsStartInFolderDefaultMenu, this.OptionsStartInFolderCurrentMenu}); this.OptionsStartInFolderMenu.Name = "OptionsStartInFolderMenu"; - this.OptionsStartInFolderMenu.Size = new System.Drawing.Size(180, 22); + this.OptionsStartInFolderMenu.Size = new System.Drawing.Size(168, 22); this.OptionsStartInFolderMenu.Text = "Start in Folder"; // // OptionsStartInFolderValueMenu @@ -1001,7 +1011,7 @@ this.ListContextDefragmentSeparator, this.ListContextSelectAllMenu}); this.ListContextMenu.Name = "MainContextMenu"; - this.ListContextMenu.Size = new System.Drawing.Size(209, 486); + this.ListContextMenu.Size = new System.Drawing.Size(209, 464); // // ListContextViewMenu // @@ -1078,17 +1088,29 @@ // ListContextNewFolderMenu // this.ListContextNewFolderMenu.Name = "ListContextNewFolderMenu"; - this.ListContextNewFolderMenu.Size = new System.Drawing.Size(180, 22); + this.ListContextNewFolderMenu.Size = new System.Drawing.Size(146, 22); this.ListContextNewFolderMenu.Text = "Folder..."; this.ListContextNewFolderMenu.Click += new System.EventHandler(this.ListContextNewFolderMenu_Click); // // ListContextNewRpfArchiveMenu // this.ListContextNewRpfArchiveMenu.Name = "ListContextNewRpfArchiveMenu"; - this.ListContextNewRpfArchiveMenu.Size = new System.Drawing.Size(180, 22); + this.ListContextNewRpfArchiveMenu.Size = new System.Drawing.Size(146, 22); this.ListContextNewRpfArchiveMenu.Text = "RPF Archive..."; this.ListContextNewRpfArchiveMenu.Click += new System.EventHandler(this.ListContextNewRpfArchiveMenu_Click); // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(143, 6); + // + // ListContextNewYtdFileMenu + // + this.ListContextNewYtdFileMenu.Name = "ListContextNewYtdFileMenu"; + this.ListContextNewYtdFileMenu.Size = new System.Drawing.Size(146, 22); + this.ListContextNewYtdFileMenu.Text = "YTD File..."; + this.ListContextNewYtdFileMenu.Click += new System.EventHandler(this.ListContextNewYtdFileMenu_Click); + // // ListContextImportFbxMenu // this.ListContextImportFbxMenu.Name = "ListContextImportFbxMenu"; @@ -1287,18 +1309,6 @@ // this.VSExtender.DefaultRenderer = null; // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(177, 6); - // - // ListContextNewYtdFileMenu - // - this.ListContextNewYtdFileMenu.Name = "ListContextNewYtdFileMenu"; - this.ListContextNewYtdFileMenu.Size = new System.Drawing.Size(180, 22); - this.ListContextNewYtdFileMenu.Text = "YTD File..."; - this.ListContextNewYtdFileMenu.Click += new System.EventHandler(this.ListContextNewYtdFileMenu_Click); - // // ExploreForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1466,5 +1476,6 @@ private System.Windows.Forms.ToolStripMenuItem ToolsJenkIndMenu; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; private System.Windows.Forms.ToolStripMenuItem ListContextNewYtdFileMenu; + private System.Windows.Forms.ToolStripMenuItem ToolsAudioExplorerMenu; } } \ No newline at end of file diff --git a/CodeWalker/ExploreForm.cs b/CodeWalker/ExploreForm.cs index 4cfd93d..55ea6b1 100644 --- a/CodeWalker/ExploreForm.cs +++ b/CodeWalker/ExploreForm.cs @@ -241,6 +241,10 @@ namespace CodeWalker Scenarios.EnsureScenarioTypes(FileCache); UpdateStatus("File cache loaded."); + + Invoke(new Action(() => { + ToolsAudioExplorerMenu.Enabled = true; + })); } } }); @@ -4334,6 +4338,12 @@ namespace CodeWalker f.Show(this); } + private void ToolsAudioExplorerMenu_Click(object sender, EventArgs e) + { + AudioExplorerForm f = new AudioExplorerForm(FileCache); + f.Show(this); + } + private void ToolsJenkGenMenu_Click(object sender, EventArgs e) { JenkGenForm f = new JenkGenForm(); diff --git a/CodeWalker/ExploreForm.resx b/CodeWalker/ExploreForm.resx index 3ab0913..0f5487c 100644 --- a/CodeWalker/ExploreForm.resx +++ b/CodeWalker/ExploreForm.resx @@ -262,16 +262,6 @@ e2d2SZBn3BDEyPiVG5X23Ap3LtwYqxPDuBkxUEmGNWnPzTCEn1GZjBBcYawROqpiopbZ8v/CtN9mmB+9 1vZY1yV7KT9+37JAwB1LBeyfTv8N11OX0LGtniroCF2hd2L+f3A9qqp2iWbL30hjPP3/CJi+jvVtWwLw A4Rmgl76+inbAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ - MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM - TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo - 6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD - NQar60zqQI0AAAAASUVORK5CYII= @@ -291,6 +281,16 @@ lVY67e7NJiI/2QxXrEetVVZsAY5938U5NzUbthbgknMW7735iOnYsB0AqBXXlJL5jOnYsDUBqA1uMcbh mYyuz6aAU/M9hKDP3GR0ffYegNrwXEpRADdZr5+aAlB7UAB3j1V/Anh1j1UD4Fub4YrN8HPL9gAVE1vf J6IiRgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ + MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM + TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo + 6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD + NQar60zqQI0AAAAASUVORK5CYII= @@ -304,7 +304,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADo - HwAAAk1TRnQBSQFMAgEBGAEAAbgBAQG4AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + HwAAAk1TRnQBSQFMAgEBGAEAAcgBAQHIAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAAXADAAEBAQABCAYAARwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/CodeWalker/Tools/AudioExplorerForm.Designer.cs b/CodeWalker/Tools/AudioExplorerForm.Designer.cs new file mode 100644 index 0000000..0f89382 --- /dev/null +++ b/CodeWalker/Tools/AudioExplorerForm.Designer.cs @@ -0,0 +1,212 @@ + +namespace CodeWalker.Tools +{ + partial class AudioExplorerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AudioExplorerForm)); + this.MainSplitContainer = new System.Windows.Forms.SplitContainer(); + this.HierarchyTreeView = new CodeWalker.WinForms.TreeViewFix(); + this.PropertiesTabControl = new System.Windows.Forms.TabControl(); + this.DetailsTabPage = new System.Windows.Forms.TabPage(); + this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix(); + this.XmlTabPage = new System.Windows.Forms.TabPage(); + this.XmlTextBox = new FastColoredTextBoxNS.FastColoredTextBox(); + this.NameComboBox = new System.Windows.Forms.ComboBox(); + ((System.ComponentModel.ISupportInitialize)(this.MainSplitContainer)).BeginInit(); + this.MainSplitContainer.Panel1.SuspendLayout(); + this.MainSplitContainer.Panel2.SuspendLayout(); + this.MainSplitContainer.SuspendLayout(); + this.PropertiesTabControl.SuspendLayout(); + this.DetailsTabPage.SuspendLayout(); + this.XmlTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.XmlTextBox)).BeginInit(); + this.SuspendLayout(); + // + // MainSplitContainer + // + this.MainSplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.MainSplitContainer.Location = new System.Drawing.Point(0, 37); + this.MainSplitContainer.Name = "MainSplitContainer"; + // + // MainSplitContainer.Panel1 + // + this.MainSplitContainer.Panel1.Controls.Add(this.HierarchyTreeView); + // + // MainSplitContainer.Panel2 + // + this.MainSplitContainer.Panel2.Controls.Add(this.PropertiesTabControl); + this.MainSplitContainer.Size = new System.Drawing.Size(823, 527); + this.MainSplitContainer.SplitterDistance = 366; + this.MainSplitContainer.TabIndex = 0; + // + // HierarchyTreeView + // + this.HierarchyTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.HierarchyTreeView.FullRowSelect = true; + this.HierarchyTreeView.HideSelection = false; + this.HierarchyTreeView.Location = new System.Drawing.Point(0, 0); + this.HierarchyTreeView.Name = "HierarchyTreeView"; + this.HierarchyTreeView.ShowRootLines = false; + this.HierarchyTreeView.Size = new System.Drawing.Size(366, 527); + this.HierarchyTreeView.TabIndex = 0; + this.HierarchyTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.HierarchyTreeView_AfterSelect); + // + // PropertiesTabControl + // + this.PropertiesTabControl.Controls.Add(this.DetailsTabPage); + this.PropertiesTabControl.Controls.Add(this.XmlTabPage); + this.PropertiesTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.PropertiesTabControl.Location = new System.Drawing.Point(0, 0); + this.PropertiesTabControl.Name = "PropertiesTabControl"; + this.PropertiesTabControl.SelectedIndex = 0; + this.PropertiesTabControl.Size = new System.Drawing.Size(453, 527); + this.PropertiesTabControl.TabIndex = 0; + // + // DetailsTabPage + // + this.DetailsTabPage.Controls.Add(this.DetailsPropertyGrid); + this.DetailsTabPage.Location = new System.Drawing.Point(4, 22); + this.DetailsTabPage.Name = "DetailsTabPage"; + this.DetailsTabPage.Padding = new System.Windows.Forms.Padding(3); + this.DetailsTabPage.Size = new System.Drawing.Size(445, 501); + this.DetailsTabPage.TabIndex = 0; + this.DetailsTabPage.Text = "Details"; + this.DetailsTabPage.UseVisualStyleBackColor = true; + // + // DetailsPropertyGrid + // + this.DetailsPropertyGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.DetailsPropertyGrid.HelpVisible = false; + this.DetailsPropertyGrid.Location = new System.Drawing.Point(3, 3); + this.DetailsPropertyGrid.Name = "DetailsPropertyGrid"; + this.DetailsPropertyGrid.Size = new System.Drawing.Size(439, 495); + this.DetailsPropertyGrid.TabIndex = 26; + this.DetailsPropertyGrid.ToolbarVisible = false; + // + // XmlTabPage + // + this.XmlTabPage.Controls.Add(this.XmlTextBox); + this.XmlTabPage.Location = new System.Drawing.Point(4, 22); + this.XmlTabPage.Name = "XmlTabPage"; + this.XmlTabPage.Size = new System.Drawing.Size(537, 501); + this.XmlTabPage.TabIndex = 1; + this.XmlTabPage.Text = "XML"; + this.XmlTabPage.UseVisualStyleBackColor = true; + // + // XmlTextBox + // + this.XmlTextBox.AutoCompleteBracketsList = new char[] { + '(', + ')', + '{', + '}', + '[', + ']', + '\"', + '\"', + '\'', + '\''}; + this.XmlTextBox.AutoIndentChars = false; + this.XmlTextBox.AutoIndentCharsPatterns = ""; + this.XmlTextBox.AutoIndentExistingLines = false; + this.XmlTextBox.AutoScrollMinSize = new System.Drawing.Size(2, 14); + this.XmlTextBox.BackBrush = null; + this.XmlTextBox.CharHeight = 14; + this.XmlTextBox.CharWidth = 8; + this.XmlTextBox.CommentPrefix = null; + this.XmlTextBox.Cursor = System.Windows.Forms.Cursors.IBeam; + this.XmlTextBox.DelayedEventsInterval = 1; + this.XmlTextBox.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.XmlTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.XmlTextBox.Font = new System.Drawing.Font("Courier New", 9.75F); + this.XmlTextBox.IsReplaceMode = false; + this.XmlTextBox.Language = FastColoredTextBoxNS.Language.XML; + this.XmlTextBox.LeftBracket = '<'; + this.XmlTextBox.LeftBracket2 = '('; + this.XmlTextBox.Location = new System.Drawing.Point(0, 0); + this.XmlTextBox.Name = "XmlTextBox"; + this.XmlTextBox.Paddings = new System.Windows.Forms.Padding(0); + this.XmlTextBox.RightBracket = '>'; + this.XmlTextBox.RightBracket2 = ')'; + this.XmlTextBox.SelectionColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); + this.XmlTextBox.ServiceColors = ((FastColoredTextBoxNS.ServiceColors)(resources.GetObject("XmlTextBox.ServiceColors"))); + this.XmlTextBox.Size = new System.Drawing.Size(537, 501); + this.XmlTextBox.TabIndex = 1; + this.XmlTextBox.Zoom = 100; + // + // NameComboBox + // + this.NameComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.NameComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.NameComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; + this.NameComboBox.FormattingEnabled = true; + this.NameComboBox.Location = new System.Drawing.Point(12, 8); + this.NameComboBox.Name = "NameComboBox"; + this.NameComboBox.Size = new System.Drawing.Size(453, 21); + this.NameComboBox.TabIndex = 1; + this.NameComboBox.TextChanged += new System.EventHandler(this.NameComboBox_TextChanged); + // + // AudioExplorerForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(823, 564); + this.Controls.Add(this.NameComboBox); + this.Controls.Add(this.MainSplitContainer); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "AudioExplorerForm"; + this.Text = "Audio Explorer - CodeWalker by dexyfex"; + this.MainSplitContainer.Panel1.ResumeLayout(false); + this.MainSplitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.MainSplitContainer)).EndInit(); + this.MainSplitContainer.ResumeLayout(false); + this.PropertiesTabControl.ResumeLayout(false); + this.DetailsTabPage.ResumeLayout(false); + this.XmlTabPage.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.XmlTextBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer MainSplitContainer; + private System.Windows.Forms.ComboBox NameComboBox; + private WinForms.TreeViewFix HierarchyTreeView; + private System.Windows.Forms.TabControl PropertiesTabControl; + private System.Windows.Forms.TabPage DetailsTabPage; + private WinForms.PropertyGridFix DetailsPropertyGrid; + private System.Windows.Forms.TabPage XmlTabPage; + private FastColoredTextBoxNS.FastColoredTextBox XmlTextBox; + } +} \ No newline at end of file diff --git a/CodeWalker/Tools/AudioExplorerForm.cs b/CodeWalker/Tools/AudioExplorerForm.cs new file mode 100644 index 0000000..46e30d7 --- /dev/null +++ b/CodeWalker/Tools/AudioExplorerForm.cs @@ -0,0 +1,210 @@ +using CodeWalker.GameFiles; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CodeWalker.Tools +{ + public partial class AudioExplorerForm : Form + { + private GameFileCache GameFileCache { get; set; } + + private Dictionary NameComboLookup = new Dictionary(); + + public AudioExplorerForm(GameFileCache gfc) + { + GameFileCache = gfc; + InitializeComponent(); + LoadDropDowns(); + } + + + private void LoadDropDowns() + { + if (!GameFileCache.IsInited) return; + + NameComboLookup.Clear(); + NameComboBox.Items.Clear(); + NameComboBox.AutoCompleteCustomSource.Clear(); + List namelist = new List(); + void addItem(RelData item) + { + if (item == null) return; + var str = GetRelDataTitleString(item); + namelist.Add(str); + NameComboLookup.Add(str, item); + } + if (GameFileCache.AudioSoundsDict != null) + { + //foreach (var kvp in GameFileCache.AudioConfigDict) addItem(kvp.Value); + //foreach (var kvp in GameFileCache.AudioSpeechDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioSynthsDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioMixersDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioCurvesDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioCategsDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioSoundsDict) addItem(kvp.Value); + foreach (var kvp in GameFileCache.AudioGameDict) addItem(kvp.Value); + } + NameComboBox.AutoCompleteCustomSource.AddRange(namelist.ToArray()); + NameComboBox.Text = ""; + + + + } + + private string GetRelDataTitleString(RelData item) + { + if (item == null) return ""; + var h = item.NameHash; + var str = JenkIndex.TryGetString(h); + if (string.IsNullOrEmpty(str)) str = GlobalText.TryGetString(h);//is this necessary? + if (string.IsNullOrEmpty(str)) MetaNames.TryGetString(h, out str); + if (string.IsNullOrEmpty(str)) str = h.Hex; + var typeid = item.TypeID.ToString(); + var rel = item.Rel; + if (rel != null) + { + switch (rel.RelType) + { + case RelDatFileType.Dat54DataEntries: + typeid = ((Dat54SoundType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat149: + case RelDatFileType.Dat150: + case RelDatFileType.Dat151: + typeid = ((Dat151RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat4: + if (rel.IsAudioConfig) typeid = ((Dat4ConfigType)item.TypeID).ToString(); + else typeid = ((Dat4SpeechType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat10ModularSynth: + typeid = ((Dat10RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat15DynamicMixer: + typeid = ((Dat15RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat16Curves: + typeid = ((Dat16RelType)item.TypeID).ToString(); + break; + case RelDatFileType.Dat22Categories: + typeid = ((Dat22RelType)item.TypeID).ToString(); + break; + default: + break; + } + } + return str + " : " + typeid; + } + + + private void LoadItemHierarchy(RelData item, TreeNode parentNode = null) + { + TreeNode node = null; + if (parentNode == null) + { + HierarchyTreeView.Nodes.Clear(); + if (item == null) return; + node = HierarchyTreeView.Nodes.Add(GetRelDataTitleString(item)); + } + else + { + if (item == null) return; + node = parentNode.Nodes.Add(GetRelDataTitleString(item)); + } + + node.Tag = item; + + var synths = item.GetSynthHashes(); + var mixers = item.GetMixerHashes(); + var curves = item.GetCurveHashes(); + var categs = item.GetCategoryHashes(); + var sounds = item.GetSoundHashes(); + var games = item.GetGameHashes(); + + + if (synths != null) + { + foreach (var h in synths) + + { + if (GameFileCache.AudioSynthsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + if (mixers != null) + { + foreach (var h in mixers) + { + if (GameFileCache.AudioMixersDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + if (curves != null) + { + foreach (var h in curves) + { + if (GameFileCache.AudioCurvesDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + if (categs != null) + { + foreach (var h in categs) + { + if (GameFileCache.AudioCategsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + if (sounds != null) + { + foreach (var h in sounds) + { + if (GameFileCache.AudioSoundsDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + if (games != null) + { + foreach (var h in games) + { + if (GameFileCache.AudioGameDict.TryGetValue(h, out RelData child)) LoadItemHierarchy(child, node); + } + } + + + if (parentNode == null) + { + node.ExpandAll(); + HierarchyTreeView.SelectedNode = node; + } + + } + + + private void SelectItem(RelData item) + { + + DetailsPropertyGrid.SelectedObject = item; + + XmlTextBox.Text = RelXml.GetXml(item); + + } + + + private void NameComboBox_TextChanged(object sender, EventArgs e) + { + if (NameComboLookup.TryGetValue(NameComboBox.Text, out RelData item)) + { + LoadItemHierarchy(item); + } + } + + private void HierarchyTreeView_AfterSelect(object sender, TreeViewEventArgs e) + { + var item = HierarchyTreeView.SelectedNode?.Tag as RelData; + SelectItem(item); + } + } +} diff --git a/CodeWalker/Tools/AudioExplorerForm.resx b/CodeWalker/Tools/AudioExplorerForm.resx new file mode 100644 index 0000000..df5a7f0 --- /dev/null +++ b/CodeWalker/Tools/AudioExplorerForm.resx @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdGYXN0Q29sb3JlZFRleHRCb3gsIFZlcnNpb249Mi4xNi4yNC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWZiOGFhMTJiOTk0ZWY2MWIMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACJGYXN0Q29sb3JlZFRleHRCb3hOUy5TZXJ2aWNlQ29sb3JzBgAA + ACg8Q29sbGFwc2VNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxDb2xsYXBzZU1hcmtlckJh + Y2tDb2xvcj5rX19CYWNraW5nRmllbGQqPENvbGxhcHNlTWFya2VyQm9yZGVyQ29sb3I+a19fQmFja2lu + Z0ZpZWxkJjxFeHBhbmRNYXJrZXJGb3JlQ29sb3I+a19fQmFja2luZ0ZpZWxkJjxFeHBhbmRNYXJrZXJC + YWNrQ29sb3I+a19fQmFja2luZ0ZpZWxkKDxFeHBhbmRNYXJrZXJCb3JkZXJDb2xvcj5rX19CYWNraW5n + RmllbGQEBAQEBAQUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAA + ABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAFFN5c3RlbS5E + cmF3aW5nLkNvbG9yAwAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgMAAAACAAAABfz///8UU3lzdGVtLkRy + YXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAACgAAAAAA + AAAAlgABAAH7/////P///woAAAAAAAAAAKQAAQAB+v////z///8KAAAAAAAAAACWAAEAAfn////8//// + CgAAAAAAAAAATgABAAH4/////P///woAAAAAAAAAAKQAAQAB9/////z///8KAAAAAAAAAACWAAEACw== + + + + + + AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA + AABAAAAAAQAYAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////v8/u3v+Pn6//7+//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //7+/vX3/rzA3OHl9fz9//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////7//+zv+3Z6qcLI5Pr7//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////7+/+br+15in6+33vf5//////////////////7+//7+//////////////////// + //////////////////////////////3+//v8//v8//3+//////////////////////7+/+Ho+1dana20 + 4/b4//////////z9//P2/+Tp/ezw/vz9//////////////////////////////////////////7///X4 + /9Pa+tPa+/H1//z9//////////////////7+/93k+SsscaSr3PX3//////7+//L1/7W98AcWgrvC8Pj6 + //////////////////////////////////////////7+/+bs/xohiAEJdrvF9+7y//z9//////////// + //7+/9rh+CEkapmh0/T3//////j6/9HZ/AEHcgEEb9LZ+/r7//////////////////////////////// + //////////7//+/z/3F+zAAAXwQLcZai3fb4//////////////3+/97l/E9Tmaau4fT3/////+/0/1dd + sAAAV7a/8/H1//7+//////////////////////////////////////////////r8/+jv/46Y3QUUf6Ot + 5PX4//////////////3+/9zj+3Z6wLe/7fX4//////D0/212xnaAzerw//z9//////////////////// + //////////////////////////////////v8/+/z/+Dm+/D0//z9//////////7+//j6/9Pd+UhLjb/H + 9/D0//3+//n7/+nt/+jt//n7//////////////////////////////////////////////////////// + //7///7+//7+//7+//////////r8/+7z/83W+ImU2A0UdFNarr/K9env//X4//z9//3+//7///////// + //////////////////////////////////////////////////////////////////7///j6/+Pq/255 + xhckjE5XsVVftUlTqwAKeTA9nr3H8+7z//v8//////////////////////////////////////////// + //////////////////////////////7+//b4/9Tc+Sc0mRonj8rV/crX/ZSb48rX/brG8wwWgQAEdJei + 4efu//n7//7+//z9//z9//z9//z9//3+//////////////////////////////3+//f5/+3y/+nv/+ft + /8vV+io2mImU2M7c/7vG9yIvlQAOfCg4mM3Y/s/c/4aR1AQRfGtzwtni/ebt/9vi/tri/tXd+9Tc+O3x + /vz9//////////////////////////n6/87V+FVftkRPrFlnvSEqjQoUfmJvwWFvvg0TfQQIcxEchwAD + cy89n19rvVVitQwZgwAAaiMrkT9NqTVBoiw3mhQihig1mNLX+fv8//////////////////////////b5 + /52l4EFLqoCK03yF0VBctGhyw52o5GVrvQAAaneBzsHM+jA3mhYgiTtIpJOf3ouW2AAAbmh0wbbA8bS+ + 7qiz5pCb16+56e/z//3+//////////////////////////v8//H1/+vw/+zx/+nv/7/J9YqP3MbP/8LM + +hwqkFZftaCp5EhRrcTQ+9jj/8rW/UJMqn6J0ebt//X3//f5//b4//X3//f5//z9//////////////// + //////////7+//z9//3+//////////3+/+7z/6at64iP3aWs7XN8zRIfhyUykp2o5MHM+oKM0xonjY6X + 2+jv//v8//////7+//n7//b5//r7//7///////////////////7+//f5/+rw/9Pa9fL0/v7///////// + //v8//H1/+Tr/7i/91liu0NPq0VQrS06m0NNqDdCoYqU1+nv//v8//////////n7/9zi/qSt59ri/fL1 + //v8//7///////z9//D0/8rT+h0sjkVQrPD0//////////////////////z9/+7z/8LL9Jqk4aGq6LW/ + 8c3W9+Xs/vH1//v8//////////////f5/6at5gAAbxIfh6u16+Po/fr7//////b5/6ev5gAIeAAPernC + 8fX4//////////3+//v8//z9//////3+//j6//P3//P2//b4//r8//7+//7+//v8//r8//3+//////v8 + /+Xr/nuIzwAAbBseg5Sb2fb5//////f5/8DF8pWe3d/n/vT3//39//////v8/+zx/87V9+3x/v3+//// + //3+//j6//X4//v8//////////n7/+Dm/snR9fD0//39//z8/fv8/+3y/8LK9aGq4dfd9/n7//////z9 + //b5//X4//v8//////////7+/+7z/4aP1gEPet7k/f39//////f5/83U+ZCZ2u3x/v7+//////P3/215 + wgAJd7fB8/L1//7+//////3+//j6//f5//r8//7+//////////////////////////////j6/87W/AAA + X2duue3y//7+//////D0/05asBQfidzj/P39//////X4/6Su6AAAXBccgtff/vv8//////////////// + //////////////////////////////////////P3/3F8xhYli9Xe/fn6/////////+3y/1pltQAJd9be + /fv8//////z9/+rw/36I0Bknjs/W+vv8//////////////////////////////////////////////// + //////f5/8HI7tnf+/X4//7+/////////+/0/3R7xgAAb9ng/Pz9//////////n7/+Ln/dLY+fP2//3+ + //////////////////////////////////////////////////////3+//r7//v8//7+//////////// + //b4/7/F84eP0e/0//7+//////////7+//z9//v8//3+//////////////////////////////////// + //////////////////////////////////////////////////z9//b5//X4//v8//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////w////4 + P///+D////g8//D4MH/geCB/4Dggf+A4IH/wOCD/+DAB//hgAf//gAP//wAAB/AAAAPwAAAD8AAAA/AA + AAfjAAEHgYADAQPgBwEDEAEBAghgAQwIIEH8CCB//Bggf/wYMH/8ODD///h/////////////KAAAABAA + AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///+vv/fL1/v///wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4+Vx7/F5v///wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///4CHtrS62////////////////////wAAAAAAAAAAAP////H0/vf6/v// + /////////4yTwrrB4f///+zw+7rA6P39/////wAAAAAAAAAAAP///56l2BkcguXr/P///////42Uw8jO + 6P///ysvjWVqtP///////wAAAAAAAAAAAP////D0/0hPpsDG6////////6y02d7k8////3qAx+/z/f// + /wAAAAAAAAAAAAAAAAAAAP///////////////8zT8V5ns1Rcrdzh9f///////////wAAAAAAAAAAAAAA + AAAAAP////////7+/6ix3nmBxFthtmdwu09WqbC54/v9//r8//j6//39/wAAAAAAAAAAAOjt/H6I0FJc + skpSqHF+wRMahFZhs4iT1AsNc1pgrm52v2RsuO/z/gAAAP////////L2/cLJ7rrD64+V4DY+ozU+mYmU + 0X2Hy1hfss7V8urv/PP2/v///wAAAP///+Pp+d/k9////////+Pp/4uR3ysymW14xYOM0fD0/P///+Xq + +ri/6Pj6/wAAAOrv/j5DnbS75P////////////X4/+/0/ubr+/r7/////////9rh+hgZhKGo2QAAAPDz + /eLn+f////j6/2Nqttrg9////+Hn+P3+//3+/1hescLJ6/////L2/eru/AAAAAAAAAAAAP///8rR70tR + p/3+//v8/zY6jNPY7////09WqWpwu////wAAAAAAAAAAAAAAAAAAAAAAAPb4/vr7//////v8/5Wd1eHm + +P////v8//T3/wAAAAAAAAAAAAAAAP//AAD8PwAA/D8AAPwDAACAAwAAgAMAAIAHAADABwAAwAEAAMAB + AAAAAQAAAAEAAAABAAAAAQAAwAcAAOAPAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA + AAAAAAAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////v7//f7//P3//P3//P3/ + /f7//v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v7//P3/ + +fv/+fv/+Pr/+fv/+vv//P3//v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////f7/+fr/8/b/7PL/5+3/6e/+9Pf/+vv//v7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////P3/9/r/6O7/cXe1UVaet7z17fL/+Pr//f3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+/z/9Pj/4Oj/NzyCUlOd2dz/6O//9Pf//P3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+vv/8vb/2+P9X2OmREGLnqPd + 4+v/8vb/+/z///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////+vv/8fb/ + 1N35bXK1JSRtbHGz5O7/8fX/+/z///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+vv/8PX/3Ob/U1eaDwtXjZLT4+z/8fX/+/z///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+vv/8fb/2eP+MjR6AAA+c3i34Or/8fX/+/z///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+vv/8vb/1d/7MS91AAA1UFSS4On/8vb/+/z///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+vv/8fb/2OL+NjZ7AAArX2Ok + 4uz/8fX/+/z///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////+vv/8fb/ + 2eP/LjJ1DAxKfYTE4Or/8fX/+/z//////////////////////////////v7//v7//f7//f7//v7//v// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+vv/8PX/3OX/gILIR0eVeoHC3eb/8fX/+/z//////////////////////v7//P3/+fv/+Pr/ + +Pr/+Pr/+vv//P3//v7///////////////////////////////////////////////////////////// + /////////////////////////////v7//f7//P3/+vv/+vv/+/z//f3//v7///////////////////// + ////////////////////////+vv/8PX/2eP9ZWeqHx1obnOz4Or/8fX/+/z//////////////////v7/ + +/z/9fj/8vb/8PX/7vT/8fb/9fj/+fr//f7///////////////////////////////////////////// + /////////////////////////////////////////v///P3/+Pr/9fj/9fj/9Pj/9Pf/9vn/+/z//v7/ + ////////////////////////////////////////+vv/8fb/2eP9ODp9AAA5jZDQ5O7/8PX/+/z///// + /////////v7/+/z/9Pf/7fP/5u//wsz6j5XfuMDx7fL/9vn//P3///////////////////////////// + /////////////////////////////////////////////////////////f7/+Pr/8/b/5+3/2eH/2uP/ + 5u3/7fP/8/b/+vv//f7/////////////////////////////////////+vv/8PX/3ef/U1ebBgVKio/O + 4uz/8fX/+/z//////////v///P3/9fj/7fP/4uv/hIzZHSWPAABmU1i14ub/9/r/+/z///////////// + /////////////////////////////////////////////////////////////////////////P3/9Pf/ + 7/X/09z/TlSzNzWYj5bh5O7/6/L/8vb/+fv//f7/////////////////////////////////+vv/8fX/ + 2eP/QUWIEhBZbnSz3uj/8fb/+/z//////////f7/+Pr/7/T/6PH/iI7cAABvAABqAABncXjK6O//9fj/ + +/z///////////////////////////////////////////////////////////////////////////// + ////////+/z/8/f/2uD/Z27EAABnAABiBgl4jJTd5vD/6O//8vX/+fv//f7///////////////////// + ////////+vv/8fb/2OP/Mjd6AQE6ZGup4er/8fX/+/z/////////+vz/8fX/6/T/xM/8ExyJAABwAABu + GySRxc387fT/9ff//P3///////////////////////////////////////////////////////////// + ////////////////////////+vz/8/f/1Nr/MzqhAABhAxOBAARyBgp5jpLg5Oz/7PP/9Pf/+vz//v7/ + ////////////////////////+vv/8fb/2eP/KCtvBwZOjJHS4Or/8fX/+/z//////f7/9/n/7fP/3+j/ + UFq3AABtAAZ3BAh6mZ/n5vD/7vP/+Pr//v7///////////////////////////////////////////// + ////////////////////////////////////////+/z/9Pj/6e//sbb1KzWcAABwBhaBAAFyAgp6fITR + 1d777/T/+Pr//f7/////////////////////////+vv/8PX/3+j/WF2hBglTnaTj5O3/8PX/+/z///// + /P3/9Pf/6vL/k5riAAByAAR0AABrY2vE4ur/6vH/9ff//P3///////////////////////////////// + /////////////////////////////////////////////////////////f3/9/n/7fL/5O3/ytX/RU6w + AABpAA5+AABuAABnhord6e7/+fv//f7/////////////////////////+vv/7/T/3+j/k5jbT1KdgYjJ + 3uf+8fX/+/z/////+/z/9fn/4ef/NDqhAABnAABrJjCU0Nn/5/D/8fX/+vv//v7///////////////// + /////////////////////////////////////////////////////////////////////////v7/+/z/ + 9vn/7vP/6vP/ztb/O0CmAABpAABrQkuoxMn57PH/+Pr//f7/////////////////////////+vv/8PX/ + 2+X/en/CUFGak5nY3+j/8fX//P3//////P3/9fj/4en/i5DbNT2hIyuTpqzv4uz/7vP/9/n//f7///// + //////////////////////////////////////////////////////////////////////////////// + /////////////v7//P3/9vn/7/P/6vL/ytH/X2i9XWi7wsf/6e//8/f/+Pr//v7///////////////// + ////////+vv/8PX/3OX/WF2hW1ylvMD+3uf/8PX/+/z//////f7/9vn/7fP/4uj/j5Pgf4LV3+X/6fD/ + 9Pf//P3///////////////////////////////////////////////////////////////////////// + /////////////////////////////////v///P3/+Pr/8vX/7fP/5+//5u7/6vD/8PT/9vn//P3//v7/ + /////////////////////f7/9/n/7fP/0tz9LDJzNjh/nqTk2uT/7fL/9/n//f7//f7/+fv/8/b/7PL/ + 3eX/zM//5ev/9fj/+fv//v7///////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v///f3/+vv/9/n/9vn/9fj/9vn/ + +fr//P3//v7//////////////v///f7/+vv/9vn/7/T/5vD/2Ob/VFubERNdoajk4u//5O7/7vP/9vj/ + +fr/+vv/+Pr/9fj/9Pj/9fj/9fj/+Pr//P3///////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v///v7/ + /f7//P3//P3//f3//v7//v///////////////f7/+vz/9vn/8fX/7vT/5O3/3eb/z9n/cHjICxN5d37L + z9n/2eP/5O3/6/L/8PT/9Pf/9/n/+vv/+vv/+/z//P3//f3//v7///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////P3/+Pr/8/b/7vT/6vL/z9r+jZjeQUeq + IiuQCBN3AAFrBRB8Nj2iUViym6XlydH/4+z/6/L/8PT/9/n/+/z//f7//v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////f3/9/n/8fX/6/L/3uf/ + mKTkLzibAABoAAB0Fx+HDBh7FSGDAg16AABYAABlCBB/Ji2UhYza1+D/6PL/7fL/9Pf/+vv//f7///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////v7//P3/9/n/ + 8PT/7PT/z9j/XmO+AABtAABcMDSXoajsu8X7VV+5hYzblZ/fTVSxFSKMAABkAABnAAN2Qkmpsbrz5e3/ + 6vH/8fX/+Pr//P3//v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////P3/9/n/8PX/7PT/vcn3LTOZAABaAgR1ZWzD0Nf/5vL/1OP/l53lzs3/6fP/4+7/sLzwZ23CBxSD + AABnAABlHiaSmqHo3+j/5+//7/T/9vn//P3//v7///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////v7/ + /v7//v7//v7//f7/+/z/9vj/7vP/7PX/tcLzEBeGAABkPEWlqLPt2eX/4e7/3On/uMX1gofVe3vPhYzY + z93+5/X/4e3/lJ3gHiOPAABtAABqChiEbHLIytD/5/D/7PL/8/f/+Pr/+fr/+Pr/+Pr/+Pr/+Pr/+Pr/ + +Pr/+fv/+vv/+/z//f7//v7///////////////////////////////////////////////////////// + /v7//f7/+/z/+fv/9/n/9vj/9fj/9Pf/8fX/7PL/4uv/l6HgDhF7AAN4iZDe0d7/3uz/4vD/w83/VVm3 + ICiSAAFyAABlAABwaHTD1N//2un/3er/w838ZW3BEyOJJzKVAQ16NDmfwsn75fD/5u7/7PL/7vP/7fP/ + 7fP/7fL/7fP/7vP/7/T/8fb/9Pj/9vn/+fr//f3//v////////////////////////////////////// + /////////////v7//P3/+Pr/9Pf/8fX/7vT/7PL/6/L/6fH/5u7/6vX/tsD0CQx4AAFwkZvi7ff/4vD/ + 4fD/z9j/OkGlAABiAABwBxWAAAt7BBN+P0uofYLUztb/4O7/6fb/6fP/qa7xQkyoBg56AABqMjugx8/+ + 5fH/4Ov/4On/3uj/3eb/3+j/3uj/1+L/0d3/1d7/3+f/7fL/9vj/+vz//v7///////////////////// + /////////////////////////////f7/+fr/8/f/6/L/2d//v8j6vcf5ucP1wMv8wM3+vMj6PkqoAABo + UF25usP7tsPyvsr6sLrwQ0utAABqAAV1OUameIDRKDWZAAd2GyeOLDecmaHntsL0pbLom6riq7LzUlu0 + AANzBhR/AAZ0NT+ja3bBY2i/XGG6UViyWl65XGG7XGC6TVWvQU6pPkalODygqK7p8vb/+vz//v7///// + /////////////////////////////////////////////P3/9/n/7/T/wcj2R0ysExeFERmGDxuIFB6K + FBqICxSEAABsAAByDBiDCRSBBRCADhaFCRODAAh4AxF/AAl4CxeDHSaPAAp6AAN0AA19AAd3CBOBEBqH + BhGBAAh5AABwAAByAAh5BhSCAxWCAABsAABvAABlAABnAABxAABjAABmAABhAABdAABYAABhCAt/q7Lr + 8/f/+vv//v7//////////////////////////////////////////////////P3/+fv/3uT/SE2vAABn + CBB/GiCMLzmfLTWcGByJFRyKGCOOMj2gHymRDxiGGyOPLDCXBRF/AAh3BhaCEyKMICqTKC2WNDqfIzCV + Awx6Eh+JHiaPAAR3AAZ5CxSDICWQX2q7Q1CqAA1+AAFxDxuHiZTbVGC4dHnQnabrTVqzY23EUV62Slau + LjaZXWm9sLjz5ez/9vn/+fv//v7//////////////////////////////////////////////////P3/ + +Pv/4+n+e4LPfoPVpqv2vsf/zNX/zdb/xtH/v8v8pK7spKfysLb3vcr4ws784ej/hI/YAAZ1AAJzVF25 + yM//3Of/5+//i5LcAABpMzyfp6vxoKznlqHhqbbtx9H/8fz/kpvfAABiAABph4zc5PD/2OP/193/3un/ + 1+D/2OH/1+D/0Nr/zNL/3+j/6/L/7/T/9vn//P3//v////////////////////////////////////// + /////////////f7/+Pr/9Pf/6vD/5u3/3+b/4uv/6PD/5+//5O3/5/P/sL3sXmS7mZzoz9f/3+z/4e// + mKLiEiKKCBF/KTWZr7T06/f/3ev/VF2zChSBipPcz9v+4u7/3ur/3ev/5/X/qrPrISmSDRJ2Xmq/3ur/ + 4uv/6vH/7fP/7fL/7/T/7vP/7fP/7fP/8PX/8fX/9Pf/+Pr/+/z//v7///////////////////////// + /////////////////////////////v7//P3/+Pr/9vn/9Pf/8vb/8vb/8/b/9Pf/7/T/6/L/tL/ubXLH + en/Ti43gqavy0t3/nafjMj6fJzaaAAV1GyeOYmW7Nz6fAABgNj6i1N//3uz/2uX/3Oj/5PH/wcj7FR2J + AAN0gong0tr/6fH/7/P/9vj/+Pr/+fv/+fv/+Pr/+Pr/+Pr/+fv/+vv//P3//f7//v////////////// + /////////////////////////////////////////////////v7//f7//P3/+/z/+/z/+/z//f3//f7/ + +fv/8fX/5Oz/jpbfc3jObnXLcXfOk5rks7b4iY3dR1KvDhuEAABoAABlEBV9U12ytcD13Or/3en/3ej/ + 1eL/q7fvGR+MKDKZbnnNxc/76PD/8fX/+fr//f7//v///////v7//f7//f3//P3//f3//f7//v////// + /////////////////////////////////////////////////////v7//f7//P3//P3//f7//v7///// + /////////////////f7/9vn/7/T/yNH5lJrleoDVmZ3pmpzpc3nPfoTWf4bYVFy3HSaLZ3PGsrb8v8r8 + y9n9q7jre4LRf4fUgIvXAwZ1AABrhYjb0NX/6PH/8PX/+Pr//f7//////////v///f3/+vv/+Pr/9/r/ + 9/n/+Pr/+/z//f7//v7//////////////////////////////////////v///f7/+/z/+fr/9vj/9/n/ + +vz/+vv/+/z//v7//////////////////v7/+vz/8/f/7PL/2uT/t8H1srP6vcH+nKTnSlOxV2C7TVaz + WGS8QUqmSlSuSFOtR1GtbXTKVl23ARB5AAh2AABnd33P3eP/4ur/7/T/9/n//P3//////////////P3/ + 9/n/8vb/7PH/6fD/7PL/7vP/8vb/9vn/+/z//f7//////////////////////////////v7/+/z/+Pr/ + 8/b/7/T/8Pb/6vH/3eP97vL++fr//P3//////////////////////f7/+vv/9fj/7/T/5+//z9f+t7v4 + uLn9Z2zFLzucFCGIMz6gGCCMAAd4AAl2Dx2EER+GXWK8c3XLKzKXd4LP4er/6/L/8PX/9/n//P3//v// + /////////v7/+fv/8/b/7PP/y9H/i4/erLbt4er/5e3/7fP/8/b/+fv//f3//v7///////////////// + /v7/+/z/9vj/8PT/6/L/3+n/x9H9aHTAZGvG3+b9+Pr/+/z//////////////////////////v7/+/z/ + +Pr/8vb/6/H/3OX+wMn4maDmdHrPWGG6T1a1eoHWcHfOTlayUlq1SlKubHjAxMj/0dn/4+v/7PL/8vb/ + +Pr//P3//v7//////////////f7/+fr/7vP/xsv5YGXAHymRKjKYYWS9rbLz4u3/6/P/8vb/+fr//f7/ + /////////////v//+/z/9vj/7fL/5e3/xs7/Y23BIiiSAABeLTab3+b/9/r/+/z///////////////// + /////////////////f7/+vz/9vj/8PX/6vH/3eb/ydL8xM/6uMPyt733w8j/zNb/1Nz/3OT/4uz/5u7/ + 7fP/8vb/9vj/+vz//f7//////////////////////f7/+fv/7vP/jpHiAAJ1CxaBER6GAABoFRmGbXbH + 0Nf/7PL/9fj//P3//////////////v7/+fv/8/f/4Of/hYvbKDGZAABuAABdAAZyi5La5+7/9vn/+/z/ + /////////////////////////////////////v7//P3/+fv/9ff/8vb/7/X/7fP/6/L/5u3/5ez/6fD/ + 7PP/7/T/8fX/9Pf/9/n/+vv//P3//v7//v///////////////////////v7/+fv/8fb/2eH9fIbQExqH + AABrAAp6AAFyAABwS0+uztX39vn/+vz//////////////f7/+Pr/8ff/qbLpAABrAABhAABwDBWAfobX + 5e3/8PX/9vn//f3//////////v///f7/+/z/+vv/+vv/+vz//P3//v7//v///v7//P3/+vz/+Pr/9/n/ + 9vj/9vj/9vj/9vj/9/n/+fr/+/z//P3//f7//v7//f7//P3/+/z/+vz/+/z//P3//v7//////v7/+/z/ + 9fj/7/T/5/H/uML1U1e1AAh5AABuAABvMjmdv8bz9vr/+vv//////////////f7/+fv/7/T/iY7aDxSA + GiONa3XHsr7w4Oj/6/H/9Pf/+vz//v7//////v///P3/+Pr/9Pf/8/f/9fj/9fj/9vn/+/z//v7///// + /////////v7//f7//P3/+/z/+/z//P3//f7//v///////////////v7/+/z/9/n/9vn/9vn/9Pj/9vn/ + +/z//v7//////f7/+vz/9fj/7/T/6vL/3ef/i5PbGRqJBQl5jJbZ6vH/9Pj/+/z//////////////f7/ + +fv/8fT/1Nn9t7/0wcr54er/7fT/8fX/9fj/+vv//f7//////////f3/+Pr/8PT/6/L/3uX/ztb/5Or/ + 8/f/+Pr//f7//////////////f7/+vz/+Pr/+fv/+fv/+vv//f3//v///////////////P3/9/n/7vL/ + 193/ztf/5u3/7vP/9Pf/+/z//v7//////v7//P3/+Pr/8fX/7PP/5/D/sLfxoKnk4+r/8vf/9/n//f3/ + /////////////v7/+/z/9vn/9Pf/8vb/8fb/8fX/9Pf/+Pr//P3//v7//////////v7/+vv/8vb/5+7/ + y9H/WWO9KSmSkZXj6vD/+Pv//P3//////////f7/+Pr/9fj/8vb/6O7/7vP/9fj/+Pr//f7///////// + /v//+vv/8vb/7PP/hYraKiqKlp7i6PD/7fP/9ff/+/z//v7//////////f7/+vv/9ff/8fX/8PX/8vb/ + 8/f/9vn/+/z//v7//////////////////f7/+/z/+vv/+fr/+fr/+vv//P3//v7///////////////// + /P3/9fj/7PL/1d7/RUysAABhAABlg4ja6/D/+Pr//P3/////////+/z/9fj/6e7/2eD/h4/bnaXg7PH/ + 9fj/+/z//////////v7/+Pr/8PX/y9X1JDGVAABaERWDoKnp6PH/7vP/9/n//P3//////////////v7/ + /P3/+vv/+fv/+fv/+vv//P3//v7//////////////////////////v7//v7//v7//v7//v////////// + /////////////v7/+fv/8PX/7PX/ipPdAABsAABlQ1Cp3Ob/7vP/9/n//f7/////////+fv/9Pj/yNH5 + Ule2DBJ8Ljie0df+8fb/+fv//v7//////v7/+Pr/7/X/hY3YAABxAAl7AABuEBaEs7nz6fH/8fX/+vv/ + /v7//////////////////v///v7//v7//v7///////////////////////////////////////////// + /////////////////////////////f3/9vn/7PL/0tn/LzidAQFsAAB0iZHb6vP/8PT/+fv//v////// + /v7/+Pr/8vf/r7rqAAV4AABdPUen1N//7PL/9vn//f7//////v7/+fr/7/T/yc75S1G0AABrARKAAABp + Qker0df/7fP/9/n//f7///////////////////////////////////////////////////////////// + /////////////////////////////////////////////P3/9/n/5+7/cXXNAAd2AABuMDebzdT97PL/ + 9vj//P3//////////v7/9/n/7/X/tL/uFCCLAABqHSqRvcf46fD/9Pf//f3/////////+vv/8vX/6vH/ + yM3+JC2XAABtAAV2Agx9q7Ly7vT/9vn//f7///////////////////////////////////////////// + /////////////////////////////////////////////////////////////P3/9/r/4uj/WWO1AAVx + KTaYu8T07fT/8vb/+vv//v7//////////v7/9/n/7vX/vsn1Iy2SAABrAQ99mp/o6PD/9Pf//P3///// + /////P3/9/n/7vP/6fL/s7z2DBB/AABeQ0uttrr56e7/+Pr//f7///////////////////////////// + /////////////////////////////////////////////////////////////////////////////P3/ + +fv/4ef6g4zNbXfFw8v27fT/8vb/+Pr//f3//////////////v7/9/n/7vT/yNL7MjucAABtBxF/nKLo + 6fH/9Pf//P3//////////v7/+/z/9fj/7fL/6/T/jZXbLzScrrP14en/7fL/+fv//v7///////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////f7/+vz/8PP91dr34+f/8vb/8/f/9/r//P3//v///////////////v7/+Pr/8PX/1N3/ + QUqmAQRxBQ98m6Dm7PL/9fj//P3//////////////v7/+/z/9ff/8PX/5ez/ytH94ej/8vb/9vj/+/z/ + /v7///////////////////////////////////////////////////////////////////////////// + /////////////////////////////v7//P3/+vz/+fv/+Pr/+Pr/+vv//f3//v////////////////// + /v//+fv/9Pf/2+L/SVGtAABsLTaZytL58fX/9/n//f7//////////////////v7/+/z/9/n/9fj/9vn/ + 9fj/9vj/+vz//f7///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////v7//f7//f3//f3//f3//v7//v////// + ////////////////////+/z/9vn/6e//mZ7gTVarr7bp6/H/9fj/+vv//v7///////////////////// + /v7//f7/+/z/+/z/+/z//P3//v7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////f3/+Pr/9fj/6e7/4+n/8fb/9Pf/+Pr//f3///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v7//P3/+fv/+fv/+vv/+Pr/+vv/ + /P3//v7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v7//f7/ + /f3//P3//f7//v7//v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////4D/////////AH////////8Af////////wB/////////AH////////8Af////////wB/////// + //AH////////8Af////////wB/////////AH////////8AfwP//////wB8Af//+Af/AHgB///wA/8AcA + H///AB/wBgAf//8AD/AGAB///wAH8AYAH///AAPwBAAf//8AA/AEAD///wAD8AQAP///AAPwBAB///+A + A/AEAP///8AD4AAA////4AcAAAH////wDgAAAf/////8AAAH//////gAAAf/////4AAAAf/////gAAAA + ////+AAAAAAAD//AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+A + AAAAAAAP/4AAAAAAAB//wAAAAABAf/4HwAAAAYAf8APAAAADgA/gA+AAAAMAA8AD8AAABwADgAP8AAAf + AAOAA/4AAB8AA4ADAAAAAQADgAIAcA4AgAOABgBwDgBAA4AMAGAMADADwDwAYAwAOAfg+ABgBAAeH//4 + AEAEAB////gAwAYAH///+ADABgAf///4AcAGAB////gBwAcAH///+APAB4A////8B+AHwH//////4A// + ///////gD/////////Af//////////////8= + + + \ No newline at end of file diff --git a/CodeWalker/WorldForm.Designer.cs b/CodeWalker/WorldForm.Designer.cs index 617b768..42d8944 100644 --- a/CodeWalker/WorldForm.Designer.cs +++ b/CodeWalker/WorldForm.Designer.cs @@ -310,6 +310,7 @@ namespace CodeWalker this.ToolbarPanel = new System.Windows.Forms.Panel(); this.SubtitleLabel = new System.Windows.Forms.Label(); this.SubtitleTimer = new System.Windows.Forms.Timer(this.components); + this.ToolsMenuAudioExplorer = new System.Windows.Forms.ToolStripMenuItem(); this.StatusStrip.SuspendLayout(); this.ToolsPanel.SuspendLayout(); this.ToolsTabControl.SuspendLayout(); @@ -2750,6 +2751,7 @@ namespace CodeWalker this.ToolsMenuSelectionInfo, this.ToolsMenuProjectWindow, this.ToolsMenuCutsceneViewer, + this.ToolsMenuAudioExplorer, this.ToolsMenuWorldSearch, this.ToolsMenuBinarySearch, this.ToolsMenuJenkGen, @@ -2760,12 +2762,12 @@ namespace CodeWalker this.ToolsMenuExtractShaders, this.ToolsMenuOptions}); this.ToolsMenu.Name = "ToolsMenu"; - this.ToolsMenu.Size = new System.Drawing.Size(170, 312); + this.ToolsMenu.Size = new System.Drawing.Size(181, 356); // // ToolsMenuRPFBrowser // this.ToolsMenuRPFBrowser.Name = "ToolsMenuRPFBrowser"; - this.ToolsMenuRPFBrowser.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuRPFBrowser.Size = new System.Drawing.Size(180, 22); this.ToolsMenuRPFBrowser.Text = "RPF Browser..."; this.ToolsMenuRPFBrowser.Visible = false; this.ToolsMenuRPFBrowser.Click += new System.EventHandler(this.ToolsMenuRPFBrowser_Click); @@ -2773,14 +2775,14 @@ namespace CodeWalker // ToolsMenuRPFExplorer // this.ToolsMenuRPFExplorer.Name = "ToolsMenuRPFExplorer"; - this.ToolsMenuRPFExplorer.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuRPFExplorer.Size = new System.Drawing.Size(180, 22); this.ToolsMenuRPFExplorer.Text = "RPF Explorer..."; this.ToolsMenuRPFExplorer.Click += new System.EventHandler(this.ToolsMenuRPFExplorer_Click); // // ToolsMenuSelectionInfo // this.ToolsMenuSelectionInfo.Name = "ToolsMenuSelectionInfo"; - this.ToolsMenuSelectionInfo.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuSelectionInfo.Size = new System.Drawing.Size(180, 22); this.ToolsMenuSelectionInfo.Text = "Selection info..."; this.ToolsMenuSelectionInfo.Click += new System.EventHandler(this.ToolsMenuSelectionInfo_Click); // @@ -2788,7 +2790,7 @@ namespace CodeWalker // this.ToolsMenuProjectWindow.Enabled = false; this.ToolsMenuProjectWindow.Name = "ToolsMenuProjectWindow"; - this.ToolsMenuProjectWindow.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuProjectWindow.Size = new System.Drawing.Size(180, 22); this.ToolsMenuProjectWindow.Text = "Project window..."; this.ToolsMenuProjectWindow.Click += new System.EventHandler(this.ToolsMenuProjectWindow_Click); // @@ -2796,14 +2798,14 @@ namespace CodeWalker // this.ToolsMenuCutsceneViewer.Enabled = false; this.ToolsMenuCutsceneViewer.Name = "ToolsMenuCutsceneViewer"; - this.ToolsMenuCutsceneViewer.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuCutsceneViewer.Size = new System.Drawing.Size(180, 22); this.ToolsMenuCutsceneViewer.Text = "Cutscene viewer..."; this.ToolsMenuCutsceneViewer.Click += new System.EventHandler(this.ToolsMenuCutsceneViewer_Click); // // ToolsMenuWorldSearch // this.ToolsMenuWorldSearch.Name = "ToolsMenuWorldSearch"; - this.ToolsMenuWorldSearch.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuWorldSearch.Size = new System.Drawing.Size(180, 22); this.ToolsMenuWorldSearch.Text = "World search..."; this.ToolsMenuWorldSearch.Click += new System.EventHandler(this.ToolsMenuWorldSearch_Click); // @@ -2811,14 +2813,14 @@ namespace CodeWalker // this.ToolsMenuBinarySearch.Enabled = false; this.ToolsMenuBinarySearch.Name = "ToolsMenuBinarySearch"; - this.ToolsMenuBinarySearch.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuBinarySearch.Size = new System.Drawing.Size(180, 22); this.ToolsMenuBinarySearch.Text = "Binary search..."; this.ToolsMenuBinarySearch.Click += new System.EventHandler(this.ToolsMenuBinarySearch_Click); // // ToolsMenuJenkGen // this.ToolsMenuJenkGen.Name = "ToolsMenuJenkGen"; - this.ToolsMenuJenkGen.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuJenkGen.Size = new System.Drawing.Size(180, 22); this.ToolsMenuJenkGen.Text = "JenkGen..."; this.ToolsMenuJenkGen.Click += new System.EventHandler(this.ToolsMenuJenkGen_Click); // @@ -2826,42 +2828,42 @@ namespace CodeWalker // this.ToolsMenuJenkInd.Enabled = false; this.ToolsMenuJenkInd.Name = "ToolsMenuJenkInd"; - this.ToolsMenuJenkInd.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuJenkInd.Size = new System.Drawing.Size(180, 22); this.ToolsMenuJenkInd.Text = "JenkInd..."; this.ToolsMenuJenkInd.Click += new System.EventHandler(this.ToolsMenuJenkInd_Click); // // ToolsMenuExtractScripts // this.ToolsMenuExtractScripts.Name = "ToolsMenuExtractScripts"; - this.ToolsMenuExtractScripts.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuExtractScripts.Size = new System.Drawing.Size(180, 22); this.ToolsMenuExtractScripts.Text = "Extract scripts..."; this.ToolsMenuExtractScripts.Click += new System.EventHandler(this.ToolsMenuExtractScripts_Click); // // ToolsMenuExtractTextures // this.ToolsMenuExtractTextures.Name = "ToolsMenuExtractTextures"; - this.ToolsMenuExtractTextures.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuExtractTextures.Size = new System.Drawing.Size(180, 22); this.ToolsMenuExtractTextures.Text = "Extract textures..."; this.ToolsMenuExtractTextures.Click += new System.EventHandler(this.ToolsMenuExtractTextures_Click); // // ToolsMenuExtractRawFiles // this.ToolsMenuExtractRawFiles.Name = "ToolsMenuExtractRawFiles"; - this.ToolsMenuExtractRawFiles.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuExtractRawFiles.Size = new System.Drawing.Size(180, 22); this.ToolsMenuExtractRawFiles.Text = "Extract raw files..."; this.ToolsMenuExtractRawFiles.Click += new System.EventHandler(this.ToolsMenuExtractRawFiles_Click); // // ToolsMenuExtractShaders // this.ToolsMenuExtractShaders.Name = "ToolsMenuExtractShaders"; - this.ToolsMenuExtractShaders.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuExtractShaders.Size = new System.Drawing.Size(180, 22); this.ToolsMenuExtractShaders.Text = "Extract shaders..."; this.ToolsMenuExtractShaders.Click += new System.EventHandler(this.ToolsMenuExtractShaders_Click); // // ToolsMenuOptions // this.ToolsMenuOptions.Name = "ToolsMenuOptions"; - this.ToolsMenuOptions.Size = new System.Drawing.Size(169, 22); + this.ToolsMenuOptions.Size = new System.Drawing.Size(180, 22); this.ToolsMenuOptions.Text = "Options..."; this.ToolsMenuOptions.Click += new System.EventHandler(this.ToolsMenuOptions_Click); // @@ -2925,49 +2927,49 @@ namespace CodeWalker // ToolbarNewProjectButton // this.ToolbarNewProjectButton.Name = "ToolbarNewProjectButton"; - this.ToolbarNewProjectButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewProjectButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewProjectButton.Text = "New Project"; this.ToolbarNewProjectButton.Click += new System.EventHandler(this.ToolbarNewProjectButton_Click); // // ToolbarNewYmapButton // this.ToolbarNewYmapButton.Name = "ToolbarNewYmapButton"; - this.ToolbarNewYmapButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewYmapButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewYmapButton.Text = "New Ymap File"; this.ToolbarNewYmapButton.Click += new System.EventHandler(this.ToolbarNewYmapButton_Click); // // ToolbarNewYtypButton // this.ToolbarNewYtypButton.Name = "ToolbarNewYtypButton"; - this.ToolbarNewYtypButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewYtypButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewYtypButton.Text = "New Ytyp File"; this.ToolbarNewYtypButton.Click += new System.EventHandler(this.ToolbarNewYtypButton_Click); // // ToolbarNewYbnButton // this.ToolbarNewYbnButton.Name = "ToolbarNewYbnButton"; - this.ToolbarNewYbnButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewYbnButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewYbnButton.Text = "New Ybn File"; this.ToolbarNewYbnButton.Click += new System.EventHandler(this.ToolbarNewYbnButton_Click); // // ToolbarNewYndButton // this.ToolbarNewYndButton.Name = "ToolbarNewYndButton"; - this.ToolbarNewYndButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewYndButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewYndButton.Text = "New Ynd File"; this.ToolbarNewYndButton.Click += new System.EventHandler(this.ToolbarNewYndButton_Click); // // ToolbarNewTrainsButton // this.ToolbarNewTrainsButton.Name = "ToolbarNewTrainsButton"; - this.ToolbarNewTrainsButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewTrainsButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewTrainsButton.Text = "New Trains File"; this.ToolbarNewTrainsButton.Click += new System.EventHandler(this.ToolbarNewTrainsButton_Click); // // ToolbarNewScenarioButton // this.ToolbarNewScenarioButton.Name = "ToolbarNewScenarioButton"; - this.ToolbarNewScenarioButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarNewScenarioButton.Size = new System.Drawing.Size(167, 22); this.ToolbarNewScenarioButton.Text = "New Scenario File"; this.ToolbarNewScenarioButton.Click += new System.EventHandler(this.ToolbarNewScenarioButton_Click); // @@ -2990,21 +2992,21 @@ namespace CodeWalker // ToolbarOpenProjectButton // this.ToolbarOpenProjectButton.Name = "ToolbarOpenProjectButton"; - this.ToolbarOpenProjectButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarOpenProjectButton.Size = new System.Drawing.Size(152, 22); this.ToolbarOpenProjectButton.Text = "Open Project..."; this.ToolbarOpenProjectButton.Click += new System.EventHandler(this.ToolbarOpenProjectButton_Click); // // ToolbarOpenFilesButton // this.ToolbarOpenFilesButton.Name = "ToolbarOpenFilesButton"; - this.ToolbarOpenFilesButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarOpenFilesButton.Size = new System.Drawing.Size(152, 22); this.ToolbarOpenFilesButton.Text = "Open Files..."; this.ToolbarOpenFilesButton.Click += new System.EventHandler(this.ToolbarOpenFilesButton_Click); // // ToolbarOpenFolderButton // this.ToolbarOpenFolderButton.Name = "ToolbarOpenFolderButton"; - this.ToolbarOpenFolderButton.Size = new System.Drawing.Size(180, 22); + this.ToolbarOpenFolderButton.Size = new System.Drawing.Size(152, 22); this.ToolbarOpenFolderButton.Text = "Open Folder..."; this.ToolbarOpenFolderButton.Click += new System.EventHandler(this.ToolbarOpenFolderButton_Click); // @@ -3588,6 +3590,14 @@ namespace CodeWalker // this.SubtitleTimer.Tick += new System.EventHandler(this.SubtitleTimer_Tick); // + // ToolsMenuAudioExplorer + // + this.ToolsMenuAudioExplorer.Enabled = false; + this.ToolsMenuAudioExplorer.Name = "ToolsMenuAudioExplorer"; + this.ToolsMenuAudioExplorer.Size = new System.Drawing.Size(180, 22); + this.ToolsMenuAudioExplorer.Text = "Audio explorer..."; + this.ToolsMenuAudioExplorer.Click += new System.EventHandler(this.ToolsMenuAudioExplorer_Click); + // // WorldForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -3957,5 +3967,6 @@ namespace CodeWalker private System.Windows.Forms.CheckBox HDLightsCheckBox; private System.Windows.Forms.ToolStripMenuItem ToolbarSelectCalmingQuadButton; private System.Windows.Forms.ToolStripMenuItem ToolbarSelectWaveQuadButton; + private System.Windows.Forms.ToolStripMenuItem ToolsMenuAudioExplorer; } } \ No newline at end of file diff --git a/CodeWalker/WorldForm.cs b/CodeWalker/WorldForm.cs index b2a1674..3971d75 100644 --- a/CodeWalker/WorldForm.cs +++ b/CodeWalker/WorldForm.cs @@ -948,7 +948,7 @@ namespace CodeWalker if (!audiozones.Inited) return; renderaudfilelist.Clear(); - renderaudfilelist.AddRange(audiozones.AllFiles); + renderaudfilelist.AddRange(GameFileCache.AudioDatRelFiles); if (ProjectForm != null) { @@ -959,12 +959,6 @@ namespace CodeWalker audiozones.GetPlacements(renderaudfilelist, renderaudplacementslist); - //RenderablePathBatch rnd = renderableCache.GetRenderablePathBatch(audiozones); - //if ((rnd != null) && (rnd.IsLoaded)) - //{ - // shaders.Enqueue(rnd); - //} - BoundingBox bbox = new BoundingBox(); BoundingSphere bsph = new BoundingSphere(); @@ -4847,6 +4841,7 @@ namespace CodeWalker ToolbarProjectWindowButton.Enabled = true; ToolsMenuProjectWindow.Enabled = true; ToolsMenuCutsceneViewer.Enabled = true; + ToolsMenuAudioExplorer.Enabled = true; ToolsMenuBinarySearch.Enabled = true; ToolsMenuJenkInd.Enabled = true; } @@ -6740,6 +6735,12 @@ namespace CodeWalker ShowCutsceneForm(); } + private void ToolsMenuAudioExplorer_Click(object sender, EventArgs e) + { + AudioExplorerForm f = new AudioExplorerForm(gameFileCache); + f.Show(this); + } + private void ToolsMenuWorldSearch_Click(object sender, EventArgs e) { ShowSearchForm();