Audio Explorer

This commit is contained in:
dexy 2022-01-13 05:07:07 +11:00
parent e76e854ead
commit df79715e6b
11 changed files with 1303 additions and 266 deletions

View File

@ -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<Dat54ModularSynthSoundData>(node, "UnkItems");
UnkItemCount = (UnkItems?.Length ?? 0);
Variables = XmlRel.ReadItemArray<Dat54ModularSynthSoundVariable>(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

View File

@ -89,6 +89,19 @@ namespace CodeWalker.GameFiles
public Dictionary<MetaHash, Dictionary<MetaHash, RpfFileEntry>> PedTextureDicts { get; set; }
public Dictionary<MetaHash, Dictionary<MetaHash, RpfFileEntry>> PedClothDicts { get; set; }
public List<RelFile> AudioDatRelFiles = new List<RelFile>();
public Dictionary<MetaHash, RelData> AudioConfigDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioSpeechDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioSynthsDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioMixersDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioCurvesDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioCategsDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioSoundsDict = new Dictionary<MetaHash, RelData>();
public Dictionary<MetaHash, RelData> AudioGameDict = new Dictionary<MetaHash, RelData>();
public List<RpfFile> BaseRpfs { get; private set; }
public List<RpfFile> AllRpfs { get; private set; }
public List<RpfFile> 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<uint, RpfFileEntry> datrelentries = new Dictionary<uint, RpfFileEntry>();
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<RelFile>();
var audioConfigDict = new Dictionary<MetaHash, RelData>();
var audioSpeechDict = new Dictionary<MetaHash, RelData>();
var audioSynthsDict = new Dictionary<MetaHash, RelData>();
var audioMixersDict = new Dictionary<MetaHash, RelData>();
var audioCurvesDict = new Dictionary<MetaHash, RelData>();
var audioCategsDict = new Dictionary<MetaHash, RelData>();
var audioSoundsDict = new Dictionary<MetaHash, RelData>();
var audioGameDict = new Dictionary<MetaHash, RelData>();
foreach (var datrelentry in datrelentries.Values)
{
var relfile = RpfMan.GetFile<RelFile>(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)
{

View File

@ -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<AudioPlacement> Zones = new List<AudioPlacement>();
public List<AudioPlacement> Emitters = new List<AudioPlacement>();
public List<AudioPlacement> AllItems = new List<AudioPlacement>();
public List<RelFile> AllFiles = new List<RelFile>();
public Dictionary<RelFile, AudioPlacement[]> PlacementsDict = new Dictionary<RelFile, AudioPlacement[]>();
@ -41,49 +26,22 @@ namespace CodeWalker.World
GameFileCache = gameFileCache;
var rpfman = gameFileCache.RpfMan;
Zones.Clear();
Emitters.Clear();
AllItems.Clear();
Dictionary<uint, RpfFileEntry> datrelentries = new Dictionary<uint, RpfFileEntry>();
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<AudioPlacement> placements = new List<AudioPlacement>();
foreach (var dat151entry in datrelentries.Values)
foreach (var relfile in GameFileCache.AudioDatRelFiles)
{
var relfile = rpfman.GetFile<RelFile>(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<uint, RpfFileEntry> 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<AudioPlacement> placements, bool addtoLists = false)
{
foreach (var reldata in relfile.RelDatas)

View File

@ -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;
}
}

View File

@ -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();

View File

@ -262,16 +262,6 @@
e2d2SZBn3BDEyPiVG5X23Ap3LtwYqxPDuBkxUEmGNWnPzTCEn1GZjBBcYawROqpiopbZ8v/CtN9mmB+9
1vZY1yV7KT9+37JAwB1LBeyfTv8N11OX0LGtniroCF2hd2L+f3A9qqp2iWbL30hjPP3/CJi+jvVtWwLw
A4Rmgl76+inbAAAAAElFTkSuQmCC
</value>
</data>
<data name="SearchButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ
MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM
TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo
6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD
NQar60zqQI0AAAAASUVORK5CYII=
</value>
</data>
<data name="SearchGlobalButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -291,6 +281,16 @@
lVY67e7NJiI/2QxXrEetVVZsAY5938U5NzUbthbgknMW7735iOnYsB0AqBXXlJL5jOnYsDUBqA1uMcbh
mYyuz6aAU/M9hKDP3GR0ffYegNrwXEpRADdZr5+aAlB7UAB3j1V/Anh1j1UD4Fub4YrN8HPL9gAVE1vf
J6IiRgAAAABJRU5ErkJggg==
</value>
</data>
<data name="SearchButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ
MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM
TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo
6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD
NQar60zqQI0AAAAASUVORK5CYII=
</value>
</data>
<metadata name="MainStatusBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -304,7 +304,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADo
HwAAAk1TRnQBSQFMAgEBGAEAAbgBAQG4AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
HwAAAk1TRnQBSQFMAgEBGAEAAcgBAQHIAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAXADAAEBAQABCAYAARwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@ -0,0 +1,212 @@

namespace CodeWalker.Tools
{
partial class AudioExplorerForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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<string, RelData> NameComboLookup = new Dictionary<string, RelData>();
public AudioExplorerForm(GameFileCache gfc)
{
GameFileCache = gfc;
InitializeComponent();
LoadDropDowns();
}
private void LoadDropDowns()
{
if (!GameFileCache.IsInited) return;
NameComboLookup.Clear();
NameComboBox.Items.Clear();
NameComboBox.AutoCompleteCustomSource.Clear();
List<string> namelist = new List<string>();
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);
}
}
}

View File

@ -0,0 +1,427 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="XmlTextBox.ServiceColors" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
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==
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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=
</value>
</data>
</root>

View File

@ -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;
}
}

View File

@ -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();