2017-09-21 18:33:05 +08:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.IO ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
2017-12-18 03:35:08 +08:00
using TC = System . ComponentModel . TypeConverterAttribute ;
using EXP = System . ComponentModel . ExpandableObjectConverter ;
using SharpDX ;
2017-09-21 18:33:05 +08:00
2017-12-24 20:36:18 +08:00
/ *
Parts of this are adapted from CamxxCore ' s RageAudioTool , although it ' s been completely reworked for CW .
- dexyfex
https : //github.com/CamxxCore/RageAudioTool
MIT License
Copyright ( c ) 2017 Cameron Berry
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the "Software" ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE .
* /
2017-09-21 18:33:05 +08:00
namespace CodeWalker.GameFiles
{
2017-12-18 03:35:08 +08:00
[TC(typeof(EXP))] public class RelFile : PackedFile
2017-09-21 18:33:05 +08:00
{
public RpfFileEntry FileEntry { get ; set ; }
public string Name { get ; set ; }
public uint Type { get ; set ; }
public uint DataLength { get ; set ; }
public byte [ ] DataBlock { get ; set ; }
public uint DataUnkVal { get ; set ; }
public uint NameTableLength { get ; set ; }
public uint NameTableCount { get ; set ; }
public uint [ ] NameTableOffsets { get ; set ; }
public string [ ] NameTable { get ; set ; }
public uint IndexCount { get ; set ; }
public uint IndexStringFlags { get ; set ; }
public RelIndexHash [ ] IndexHashes { get ; set ; }
public RelIndexString [ ] IndexStrings { get ; set ; }
public uint Unk05Count { get ; set ; }
public uint [ ] Unk05Arr { get ; set ; }
public MetaHash [ ] Unk05Hashes { get ; set ; }
2017-12-23 04:56:39 +08:00
public uint ContainerCount { get ; set ; }
public uint [ ] ContainerUnkArr { get ; set ; }
public MetaHash [ ] ContainerHashes { get ; set ; }
2017-09-21 18:33:05 +08:00
public RelData [ ] RelDatas { get ; set ; }
public RelData [ ] RelDatasSorted { get ; set ; }
//testing zone for decoding .rel audio files.
2017-12-23 04:56:39 +08:00
public Dictionary < uint , RelData > RelDataDict { get ; set ; } = new Dictionary < uint , RelData > ( ) ;
2017-09-21 18:33:05 +08:00
public RelFile ( )
{
}
public RelFile ( RpfFileEntry entry )
{
FileEntry = entry ;
}
public void Load ( byte [ ] data , RpfFileEntry entry )
{
FileEntry = entry ;
Name = entry . Name ;
MemoryStream ms = new MemoryStream ( data ) ;
BinaryReader br = new BinaryReader ( ms ) ;
StringBuilder sb = new StringBuilder ( ) ;
Type = br . ReadUInt32 ( ) ; //type/version?
DataLength = br . ReadUInt32 ( ) ; //length of data block
2017-12-18 03:35:08 +08:00
DataBlock = br . ReadBytes ( ( int ) DataLength ) ; //main data block...
2017-09-21 18:33:05 +08:00
NameTableLength = br . ReadUInt32 ( ) ; //length of this nametable block
NameTableCount = br . ReadUInt32 ( ) ;
if ( NameTableCount > 0 )
{
uint [ ] d02 = new uint [ NameTableCount ] ; //string offsets
for ( uint i = 0 ; i < NameTableCount ; i + + )
{
d02 [ i ] = br . ReadUInt32 ( ) ;
}
NameTableOffsets = d02 ;
string [ ] names = new string [ NameTableCount ] ;
for ( uint i = 0 ; i < NameTableCount ; i + + )
{
sb . Clear ( ) ;
while ( true )
{
char c = ( char ) br . ReadByte ( ) ;
if ( c ! = 0 ) sb . Append ( c ) ;
else break ;
}
names [ i ] = sb . ToString ( ) ;
2017-12-23 04:56:39 +08:00
//JenkIndex.Ensure(names[i]); //really need both here..?
JenkIndex . Ensure ( names [ i ] . ToLowerInvariant ( ) ) ;
2017-09-21 18:33:05 +08:00
}
NameTable = names ;
}
IndexCount = br . ReadUInt32 ( ) ; //count of index items
if ( IndexCount > 0 )
{
//checking NameTableLength here doesn't make sense!
if ( ( Type = = 4 ) & & ( NameTableLength = = 4 ) ) //audioconfig.dat4.rel
{
IndexStringFlags = br . ReadUInt32 ( ) ; //what is this? 2524
RelIndexString [ ] indexstrs = new RelIndexString [ IndexCount ] ;
for ( uint i = 0 ; i < IndexCount ; i + + )
{
byte sl = br . ReadByte ( ) ;
sb . Clear ( ) ;
for ( int j = 0 ; j < sl ; j + + )
{
char c = ( char ) br . ReadByte ( ) ;
if ( c ! = 0 ) sb . Append ( c ) ;
}
RelIndexString cunk01 = new RelIndexString ( ) ;
cunk01 . Name = sb . ToString ( ) ;
cunk01 . Offset = br . ReadUInt32 ( ) ;
cunk01 . Length = br . ReadUInt32 ( ) ;
indexstrs [ i ] = cunk01 ;
}
IndexStrings = indexstrs ;
}
else //for all other .rel files...
{
RelIndexHash [ ] indexhashes = new RelIndexHash [ IndexCount ] ;
for ( uint i = 0 ; i < IndexCount ; i + + )
{
RelIndexHash unk01 = new RelIndexHash ( ) ;
unk01 . Name = new MetaHash ( br . ReadUInt32 ( ) ) ;
unk01 . Offset = br . ReadUInt32 ( ) ;
unk01 . Length = br . ReadUInt32 ( ) ;
indexhashes [ i ] = unk01 ;
}
IndexHashes = indexhashes ;
}
}
Unk05Count = br . ReadUInt32 ( ) ;
if ( Unk05Count ! = 0 )
{
uint [ ] d05 = new uint [ Unk05Count ] ;
MetaHash [ ] d05h = new MetaHash [ Unk05Count ] ;
for ( uint i = 0 ; i < Unk05Count ; i + + )
{
d05 [ i ] = br . ReadUInt32 ( ) ;
var pos = ms . Position ;
ms . Position = d05 [ i ] ;
d05h [ i ] = new MetaHash ( br . ReadUInt32 ( ) ) ;
ms . Position = pos ;
}
Unk05Arr = d05 ;
Unk05Hashes = d05h ;
}
2017-12-23 04:56:39 +08:00
ContainerCount = br . ReadUInt32 ( ) ;
if ( ContainerCount ! = 0 )
2017-09-21 18:33:05 +08:00
{
2017-12-23 04:56:39 +08:00
uint [ ] cunks = new uint [ ContainerCount ] ;
MetaHash [ ] chashes = new MetaHash [ ContainerCount ] ;
for ( uint i = 0 ; i < ContainerCount ; i + + )
2017-09-21 18:33:05 +08:00
{
2017-12-23 04:56:39 +08:00
cunks [ i ] = br . ReadUInt32 ( ) ;
2017-09-21 18:33:05 +08:00
var pos = ms . Position ;
2017-12-23 04:56:39 +08:00
ms . Position = cunks [ i ] ;
chashes [ i ] = new MetaHash ( br . ReadUInt32 ( ) ) ;
2017-09-21 18:33:05 +08:00
ms . Position = pos ;
}
2017-12-23 04:56:39 +08:00
ContainerUnkArr = cunks ;
ContainerHashes = chashes ;
2017-09-21 18:33:05 +08:00
}
if ( ms . Position ! = ms . Length )
{ }
//EOF!
br . Dispose ( ) ;
ms . Dispose ( ) ;
ParseDataBlock ( ) ;
}
private void ParseDataBlock ( )
{
MemoryStream ms = new MemoryStream ( DataBlock ) ;
BinaryReader br = new BinaryReader ( ms ) ;
2017-12-18 03:35:08 +08:00
DataUnkVal = br . ReadUInt32 ( ) ; //3 bytes used... for? ..version? flags?
2017-12-20 07:52:50 +08:00
//switch (DataUnkVal)
//{
// case 5252715: //dlcbusiness_amp.dat10.rel
// case 5301323: //dlcbeach_game.dat149.rel
// case 5378673: //dlcmpheist_game.dat150.rel
// case 5750395: //dlcbeach_game.dat150.rel
// case 6353778: //dlcbeach_game.dat151.rel
// case 6894089: //dlcpilotschool_game.dat151.rel
// case 6978435: //dlcxmas2_amp.dat10.rel
// case 7126027: //audioconfig.dat4.rel
// case 7314721: //dlcmpheist_amp.dat10.rel
// case 7516460: //dlcpd03_game.dat151.rel
// case 7917027: //dlcluxe_amp.dat10.rel
// case 7921508: //dlcluxe_game.dat151.rel
// case 8149475: //dlcluxe2_amp.dat10.rel
// case 8751734: //dlcsfx1_game.dat151.rel
// case 9028036: //dlchalloween_amp.dat10.rel
// case 9037528: //dlclowrider_amp.dat10.rel
// case 9458585: //dlcapartment_amp.dat10.rel
// case 9486222: //dlcapartment_mix.dat15.rel
// case 9806108: //mpvalentines2_amp.dat10.rel
// case 9813679: //dlcjanuary2016_amp.dat10.rel
// case 10269543://dlclow2_amp.dat10.rel
// case 10891463://dlcexec1_amp.dat10.rel
// case 11171338://dlcstunt_amp.dat10.rel
// case 11918985://dlcbiker_amp.dat10.rel
// case 12470522://dlcimportexport_amp.dat10.rel
// case 12974726://audioconfig.dat4.rel
// case 13117164://dlcspecialraces_amp.dat10.rel
// break;
// default:
// break;
//}
2017-09-21 18:33:05 +08:00
List < RelData > reldatas = new List < RelData > ( ) ;
if ( IndexHashes ! = null )
{
foreach ( var indexhash in IndexHashes )
{
2017-12-18 03:35:08 +08:00
reldatas . Add ( ReadRelData ( br , indexhash ) ) ;
2017-09-21 18:33:05 +08:00
}
}
else if ( IndexStrings ! = null )
{
foreach ( var indexstr in IndexStrings )
{
2017-12-18 03:35:08 +08:00
reldatas . Add ( ReadRelData ( br , indexstr ) ) ;
2017-09-21 18:33:05 +08:00
}
}
RelDatas = reldatas . ToArray ( ) ;
2017-12-22 04:26:04 +08:00
reldatas . Sort ( ( d1 , d2 ) = > d1 . DataOffset . CompareTo ( d2 . DataOffset ) ) ;
2017-09-21 18:33:05 +08:00
RelDatasSorted = reldatas . ToArray ( ) ;
br . Dispose ( ) ;
ms . Dispose ( ) ;
2017-12-23 04:56:39 +08:00
RelDataDict . Clear ( ) ;
foreach ( var reldata in RelDatas )
{
if ( ( reldata . NameHash = = 0 ) & & ! string . IsNullOrEmpty ( reldata . Name ) )
{
reldata . NameHash = JenkHash . GenHash ( reldata . Name ) ; //should this be lower case?
JenkIndex . Ensure ( reldata . Name ) ;
JenkIndex . Ensure ( reldata . Name . ToLowerInvariant ( ) ) ; //which one to use?
}
//if (reldata.NameHash == 0)
//{ }//no hits here
//if (RelDataDict.ContainsKey(reldata.NameHash))
//{ }//no hits here
RelDataDict [ reldata . NameHash ] = reldata ;
}
foreach ( var reldata in RelDatas )
{
RelSound snd = reldata as RelSound ;
if ( snd ! = null )
{
if ( snd . AudioTracksCount > 0 )
{
snd . AudioTracks = new RelData [ snd . AudioTracksCount ] ;
for ( int i = 0 ; i < snd . AudioTracksCount ; i + + )
{
var audhash = snd . AudioTrackHashes [ i ] ;
RelData auddata = null ;
if ( RelDataDict . TryGetValue ( audhash , out auddata ) )
{
snd . AudioTracks [ i ] = auddata ;
}
else
{ }
}
}
if ( snd . AudioContainers ! = null )
{
foreach ( var cnt in snd . AudioContainers )
{
string cname = JenkIndex . TryGetString ( cnt . Hash ) ;
if ( ! string . IsNullOrEmpty ( cname ) )
{ }
else
{ }
}
}
}
}
#region test
2017-12-18 03:35:08 +08:00
//foreach (var d in RelDatas)
//{
// using (BinaryReader dbr = new BinaryReader(new MemoryStream(d.Data)))
// {
// switch (Type)
// {
// case 4: //00000100 //speech.dat4.rel, audioconfig.dat4.rel
// ParseData4(d, dbr);
// break;
// case 10: //00001010 //amp.dat10.rel
// ParseData10(d, dbr);
// break;
// case 15: //00001111 //mix.dat15.rel
// ParseData15(d, dbr);
// break;
// case 16: //00010000 //curves.dat16.rel
// ParseData16(d, dbr);
// break;
// case 22: //00010110 //categories.dat22.rel
// ParseData22(d, dbr);
// break;
// case 54: //00110110 //sounds.dat54.rel
// ParseData54(d, dbr);
// break;
// case 149: //10010101 //game.dat149.rel
// ParseData149(d, dbr);
// break;
// case 150: //10010110 //game.dat150.rel
// ParseData150(d, dbr);
// break;
// case 151: //10010111 //game.dat151.rel
// ParseData151(d, dbr);
// break;
// default:
// break;
// }
// }
//}
2017-12-23 04:56:39 +08:00
#endregion
2017-12-18 03:35:08 +08:00
}
private RelData ReadRelData ( BinaryReader br , RelIndexHash h )
{
return ReadRelData ( br , null , h . Name , h . Offset , h . Length ) ;
}
private RelData ReadRelData ( BinaryReader br , RelIndexString s )
{
return ReadRelData ( br , s . Name , 0 , s . Offset , s . Length ) ;
}
private RelData ReadRelData ( BinaryReader br , string name , MetaHash hash , uint offset , uint length )
{
br . BaseStream . Position = offset ;
byte [ ] data = br . ReadBytes ( ( int ) length ) ;
RelData d = new RelData ( ) ; //use this base object to construct the derived one...
d . Name = name ;
d . NameHash = hash ;
2017-12-22 04:26:04 +08:00
d . DataOffset = offset ;
d . DataLength = length ;
2017-12-18 03:35:08 +08:00
d . Data = data ;
using ( BinaryReader dbr = new BinaryReader ( new MemoryStream ( data ) ) )
2017-09-21 18:33:05 +08:00
{
2017-12-18 03:35:08 +08:00
d . ReadType ( dbr ) ;
switch ( Type )
2017-09-21 18:33:05 +08:00
{
2017-12-18 03:35:08 +08:00
case 4 : //speech.dat4.rel, audioconfig.dat4.rel
return ReadData4 ( d , dbr ) ;
case 10 : //amp.dat10.rel
return ReadData10 ( d , dbr ) ;
case 15 : //mix.dat15.rel
return ReadData15 ( d , dbr ) ;
case 16 : //curves.dat16.rel
return ReadData16 ( d , dbr ) ;
case 22 : //categories.dat22.rel
return ReadData22 ( d , dbr ) ;
case 54 : //sounds.dat54.rel
return ReadData54 ( d , dbr ) ;
case 149 : //game.dat149.rel
return ReadData149 ( d , dbr ) ;
case 150 : //game.dat150.rel
return ReadData150 ( d , dbr ) ;
case 151 : //game.dat151.rel
return ReadData151 ( d , dbr ) ;
default :
return d ; //shouldn't get here...
2017-09-21 18:33:05 +08:00
}
}
2017-12-18 03:35:08 +08:00
}
2017-09-21 18:33:05 +08:00
2017-12-18 03:35:08 +08:00
private RelData ReadData4 ( RelData d , BinaryReader br )
{
if ( NameTableLength = = 4 ) //(for audioconfig.dat4.rel)
{
}
else //(for eg speech.dat4.rel)
{
}
return d ;
}
private RelData ReadData10 ( RelData d , BinaryReader br )
{
return d ;
2017-09-21 18:33:05 +08:00
}
2017-12-18 03:35:08 +08:00
private RelData ReadData15 ( RelData d , BinaryReader br )
{
return d ;
}
private RelData ReadData16 ( RelData d , BinaryReader br )
{
return d ;
}
private RelData ReadData22 ( RelData d , BinaryReader br )
{
2017-12-20 07:52:50 +08:00
//RelSound s = new RelSound(d, br);
//return s;
return d ;
2017-12-18 03:35:08 +08:00
}
private RelData ReadData54 ( RelData d , BinaryReader br )
{
switch ( ( Dat54SoundType ) d . TypeID )
{
case Dat54SoundType . LoopingSound : return new Dat54LoopingSound ( d , br ) ;
case Dat54SoundType . EnvelopeSound : return new Dat54EnvelopeSound ( d , br ) ;
case Dat54SoundType . TwinLoopSound : return new Dat54TwinLoopSound ( d , br ) ;
case Dat54SoundType . SpeechSound : return new Dat54SpeechSound ( d , br ) ;
case Dat54SoundType . OnStopSound : return new Dat54OnStopSound ( d , br ) ;
case Dat54SoundType . WrapperSound : return new Dat54WrapperSound ( d , br ) ;
case Dat54SoundType . SequentialSound : return new Dat54SequentialSound ( d , br ) ;
case Dat54SoundType . StreamingSound : return new Dat54StreamingSound ( d , br ) ;
case Dat54SoundType . RetriggeredOverlappedSound : return new Dat54RetriggeredOverlappedSound ( d , br ) ;
case Dat54SoundType . CrossfadeSound : return new Dat54CrossfadeSound ( d , br ) ;
case Dat54SoundType . CollapsingStereoSound : return new Dat54CollapsingStereoSound ( d , br ) ;
case Dat54SoundType . SimpleSound : return new Dat54SimpleSound ( d , br ) ;
case Dat54SoundType . MultitrackSound : return new Dat54MultitrackSound ( d , br ) ;
case Dat54SoundType . RandomizedSound : return new Dat54RandomizedSound ( d , br ) ;
case Dat54SoundType . EnvironmentSound : return new Dat54EnvironmentSound ( d , br ) ;
case Dat54SoundType . DynamicEntitySound : return new Dat54DynamicEntitySound ( d , br ) ;
case Dat54SoundType . SequentialOverlapSound : return new Dat54SequentialOverlapSound ( d , br ) ;
case Dat54SoundType . ModularSynthSound : return new Dat54ModularSynthSound ( d , br ) ;
case Dat54SoundType . GranularSound : return new Dat54GranularSound ( d , br ) ;
case Dat54SoundType . DirectionalSound : return new Dat54DirectionalSound ( d , br ) ;
case Dat54SoundType . KineticSound : return new Dat54KineticSound ( d , br ) ;
case Dat54SoundType . SwitchSound : return new Dat54SwitchSound ( d , br ) ;
case Dat54SoundType . VariableCurveSound : return new Dat54VariableCurveSound ( d , br ) ;
case Dat54SoundType . VariablePrintValueSound : return new Dat54VariablePrintValueSound ( d , br ) ;
case Dat54SoundType . VariableBlockSound : return new Dat54VariableBlockSound ( d , br ) ;
case Dat54SoundType . IfSound : return new Dat54IfSound ( d , br ) ;
case Dat54SoundType . MathOperationSound : return new Dat54MathOperationSound ( d , br ) ;
case Dat54SoundType . ParameterTransformSound : return new Dat54ParameterTransformSound ( d , br ) ;
case Dat54SoundType . FluctuatorSound : return new Dat54FluctuatorSound ( d , br ) ;
case Dat54SoundType . AutomationSound : return new Dat54AutomationSound ( d , br ) ;
case Dat54SoundType . ExternalStreamSound : return new Dat54ExternalStreamSound ( d , br ) ;
case Dat54SoundType . SoundSet : return new Dat54SoundSet ( d , br ) ;
case Dat54SoundType . Unknown : return new Dat54UnknownSound ( d , br ) ;
case Dat54SoundType . Unknown2 : return new Dat54UnknownSound2 ( d , br ) ;
case Dat54SoundType . SoundList : return new Dat54SoundList ( d , br ) ;
default :
return new Dat54Sound ( d , br ) ; //shouldn't get here
}
}
private RelData ReadData149 ( RelData d , BinaryReader br )
{
2017-12-20 07:52:50 +08:00
//RelSound s = new RelSound(d, br);
//return s;
return d ;
2017-12-18 03:35:08 +08:00
}
private RelData ReadData150 ( RelData d , BinaryReader br )
{
return d ;
}
private RelData ReadData151 ( RelData d , BinaryReader br )
{
switch ( ( Dat151RelType ) d . TypeID )
{
2017-12-26 22:45:26 +08:00
case Dat151RelType . Collision : //maybe for vehicle
case Dat151RelType . Vehicle :
case Dat151RelType . VehicleEngine :
case Dat151RelType . Entity : //not sure about this
case Dat151RelType . Stream : //generic audio stream?
case Dat151RelType . Helicopter : //maybe
case Dat151RelType . SpeechParams :
case Dat151RelType . Weapon :
case Dat151RelType . RadioStationsDLC : //
case Dat151RelType . RadioDLC :
case Dat151RelType . DLCMusic :
case Dat151RelType . PedPVG : //maybe Ped Voice Group?
case Dat151RelType . WeaponAudioItem :
case Dat151RelType . Aeroplane :
case Dat151RelType . Mood :
case Dat151RelType . StartTrackAction :
case Dat151RelType . StopTrackAction :
case Dat151RelType . SetMoodAction :
case Dat151RelType . PlayerAction :
case Dat151RelType . StartOneShotAction :
case Dat151RelType . StopOneShotAction :
case Dat151RelType . AnimalParams :
case Dat151RelType . VehicleScannerParams : //maybe not just vehicle
case Dat151RelType . Explosion :
case Dat151RelType . VehicleEngineGranular : //maybe not just vehicle
case Dat151RelType . ShoreLinePool :
case Dat151RelType . ShoreLineLake :
case Dat151RelType . ShoreLineRiver :
case Dat151RelType . ShoreLineOcean :
case Dat151RelType . ShoreLineList :
case Dat151RelType . RadioDjSpeechAction :
case Dat151RelType . FadeOutRadioAction :
case Dat151RelType . FadeInRadioAction :
case Dat151RelType . ForceRadioTrackAction :
case Dat151RelType . Unk2 :
case Dat151RelType . Unk7 :
case Dat151RelType . Unk9 :
case Dat151RelType . Unk11 :
case Dat151RelType . Unk12 :
case Dat151RelType . Unk13 :
case Dat151RelType . Unk15 :
case Dat151RelType . Unk16 :
case Dat151RelType . Unk18 :
case Dat151RelType . Unk22 :
case Dat151RelType . Unk23 :
case Dat151RelType . Unk27 :
case Dat151RelType . Unk28 :
case Dat151RelType . Unk29 :
case Dat151RelType . Unk31 :
case Dat151RelType . Unk33 :
case Dat151RelType . Unk35 :
case Dat151RelType . Unk36 :
case Dat151RelType . Unk40 :
case Dat151RelType . Unk41 :
case Dat151RelType . Unk42 :
case Dat151RelType . Interior :
case Dat151RelType . Unk45 :
case Dat151RelType . InteriorRoom :
case Dat151RelType . Unk47 :
case Dat151RelType . Unk48 :
case Dat151RelType . Unk49 :
case Dat151RelType . Unk51 :
case Dat151RelType . Mod :
case Dat151RelType . Unk53 :
case Dat151RelType . Unk54 :
case Dat151RelType . Unk55 :
case Dat151RelType . Unk56 :
case Dat151RelType . Unk59 :
case Dat151RelType . Unk69 :
case Dat151RelType . Unk70 :
case Dat151RelType . Unk71 :
case Dat151RelType . Unk72 :
case Dat151RelType . Unk74 :
case Dat151RelType . Unk75 :
case Dat151RelType . Unk77 :
case Dat151RelType . Unk78 :
case Dat151RelType . Unk79 :
case Dat151RelType . Unk80 :
case Dat151RelType . Unk81 :
case Dat151RelType . Unk82 :
case Dat151RelType . Unk83 :
case Dat151RelType . Unk84 :
case Dat151RelType . Unk85 :
case Dat151RelType . Unk86 :
case Dat151RelType . Unk95 :
case Dat151RelType . Unk96 :
case Dat151RelType . Unk99 :
case Dat151RelType . Unk100 :
case Dat151RelType . Unk101 :
case Dat151RelType . Unk105 :
case Dat151RelType . Unk106 :
case Dat151RelType . Unk107 :
case Dat151RelType . Unk108 :
case Dat151RelType . Unk109 :
case Dat151RelType . Unk110 :
case Dat151RelType . Unk111 :
case Dat151RelType . Unk112 :
case Dat151RelType . Unk113 :
case Dat151RelType . Unk114 :
case Dat151RelType . Unk115 :
case Dat151RelType . Unk116 :
case Dat151RelType . Unk117 :
case Dat151RelType . Unk118 :
case Dat151RelType . Unk119 :
case Dat151RelType . Unk120 :
case Dat151RelType . Unk121 :
return new Dat151RelData ( d , br ) ;
case Dat151RelType . AmbientEmitterList : return new Dat151AmbientEmitterList ( d , br ) ;
2017-12-23 04:56:39 +08:00
case Dat151RelType . AmbientZone : return new Dat151AmbientZone ( d , br ) ;
case Dat151RelType . AmbientEmitter : return new Dat151AmbientEmitter ( d , br ) ;
2017-12-26 22:45:26 +08:00
case Dat151RelType . AmbientZoneList : return new Dat151AmbientZoneList ( d , br ) ;
2017-12-20 07:52:50 +08:00
default :
return new Dat151RelData ( d , br ) ;
2017-12-18 03:35:08 +08:00
}
}
#region first research
2017-09-21 18:33:05 +08:00
private void ParseData4 ( RelData d , BinaryReader br )
{
//speech.dat4.rel, audioconfig.dat4.rel
2017-12-22 04:26:04 +08:00
if ( d . DataLength = = 1 )
2017-09-21 18:33:05 +08:00
{
byte b = br . ReadByte ( ) ;
switch ( b )
{
case 0 :
case 25 :
case 28 :
case 34 :
case 89 :
case 94 :
case 178 :
break ;
default :
break ;
}
return ;
}
2017-12-22 04:26:04 +08:00
if ( d . DataLength = = 2 )
2017-09-21 18:33:05 +08:00
{
byte b = br . ReadByte ( ) ;
switch ( b )
{
case 4 :
case 1 :
case 15 :
case 12 :
case 3 :
case 2 :
case 7 :
case 5 :
case 158 :
case 25 :
case 16 :
case 64 :
case 6 :
case 8 :
case 14 :
case 22 :
case 18 :
case 20 :
case 32 :
case 17 :
case 30 :
case 9 :
case 0 :
case 47 :
case 224 :
case 200 :
case 136 :
case 45 :
case 54 :
case 28 :
case 19 :
case 37 :
case 61 :
case 38 :
case 128 :
case 24 :
case 26 :
case 40 :
case 13 :
case 36 :
case 78 :
case 34 :
case 10 :
case 21 :
case 192 :
case 60 :
case 29 :
case 33 :
case 72 :
case 57 :
case 133 :
case 11 :
break ;
default :
break ;
}
return ;
}
2017-12-22 04:26:04 +08:00
if ( d . DataLength = = 4 )
2017-09-21 18:33:05 +08:00
{
uint h = br . ReadUInt32 ( ) ;
return ;
}
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 4 :
case 1 :
case 0 :
case 6 :
case 3 :
case 2 :
case 5 :
case 7 :
case 15 :
case 10 :
case 8 :
case 9 :
break ;
case 23 :
case 12 :
case 11 :
case 16 :
case 13 :
case 36 :
case 30 :
case 31 :
case 27 :
case 20 :
case 19 :
case 14 :
case 40 :
case 46 :
case 22 :
case 18 :
case 21 :
case 45 :
case 17 :
case 48 :
case 87 :
case 38 :
case 28 :
case 29 :
case 43 :
case 69 :
case 50 :
case 25 :
case 32 :
case 35 :
case 34 :
break ;
default :
break ;
}
}
private void ParseData10 ( RelData d , BinaryReader br )
{
//amp.dat10.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 1 :
case 3 :
break ;
default :
break ;
}
}
private void ParseData15 ( RelData d , BinaryReader br )
{
//mix.dat15.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
break ;
default :
break ;
}
}
private void ParseData16 ( RelData d , BinaryReader br )
{
//curves.dat16.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 12 :
case 13 :
case 15 :
break ;
default :
break ;
}
}
private void ParseData22 ( RelData d , BinaryReader br )
{
//categories.dat22.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 0 :
break ;
default :
break ;
}
}
private void ParseData54 ( RelData d , BinaryReader br )
{
//sounds.dat54.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 :
case 12 :
case 13 :
case 14 :
case 15 :
case 16 :
case 17 :
case 18 :
case 19 :
case 20 :
case 21 :
case 22 :
case 23 :
case 24 :
case 25 :
case 26 :
case 27 :
case 28 :
case 29 :
case 30 :
case 31 :
case 32 :
case 33 :
case 34 :
case 35 :
break ;
default :
break ;
}
}
private void ParseData149 ( RelData d , BinaryReader br )
{
//game.dat149.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 3 :
case 4 :
case 17 :
case 50 :
case 57 :
case 62 :
case 63 :
case 66 :
case 76 :
case 88 :
case 90 :
break ;
default :
break ;
}
}
private void ParseData150 ( RelData d , BinaryReader br )
{
//game.dat150.rel
byte b00 = br . ReadByte ( ) ;
switch ( b00 )
{
case 3 :
case 4 :
case 6 :
case 8 :
case 17 :
case 32 :
case 37 :
case 38 :
case 39 :
case 47 :
case 50 :
case 52 :
case 57 :
case 62 :
case 63 :
case 64 :
case 65 :
case 66 :
case 76 :
case 88 :
case 90 :
case 117 :
break ;
default :
break ;
}
}
private void ParseData151 ( RelData d , BinaryReader br )
{
//game.dat151.rel
byte b00 = br . ReadByte ( ) ; //???
switch ( b00 )
{
case 1 : //new
case 2 : //new
case 3 :
case 4 :
case 5 : //new
case 6 :
case 7 : //new
case 8 : //
case 9 : //new
case 11 : //new
case 12 : //new
case 13 : //new
case 14 : //new
case 15 : //new
case 16 : //new
case 17 :
case 18 : //new
case 22 : //new
case 23 : //new
case 24 : //new
case 25 : //new
case 26 : //new
case 27 : //new
case 28 : //new
case 29 : //new
case 30 : //new
case 31 : //new
case 32 : //
case 33 : //new
case 35 : //new
case 36 : //new
case 37 : //
case 38 : //
case 39 : //
case 40 : //new
case 41 : //new
case 42 : //new
case 44 : //new
case 45 : //new
case 46 : //new
case 47 : //
case 48 : //new
case 49 : //new
case 50 :
case 51 : //new
case 52 : //
case 53 : //new
case 54 : //new
case 55 : //new
case 56 : //new
case 57 :
case 59 : //new
case 62 :
case 63 :
case 64 :
case 65 : //
case 66 :
case 67 : //new
case 68 : //new
case 69 : //new
case 70 : //new
case 71 : //new
case 72 : //new
case 73 : //new
case 74 : //new
case 75 : //new
case 76 :
case 77 : //new
case 78 : //new
case 79 : //new
case 80 : //new
case 81 : //new
case 82 : //new
case 83 : //new
case 84 : //new
case 85 : //new
case 86 : //new
case 87 : //new
case 88 :
case 90 :
case 91 : //new
case 92 : //new
case 93 : //new
case 94 : //new
case 95 : //new
case 96 : //new
case 98 : //new
case 99 : //new
case 100 : //new
case 101 : //new
case 102 : //new
case 103 : //new
case 104 : //new
case 105 : //new
case 106 : //new
case 107 : //new
case 108 : //new
case 109 : //new
case 110 : //new
case 111 : //new
case 112 : //new
case 113 : //new
case 114 : //new
case 115 : //new
case 116 : //new
case 117 :
case 118 : //new
case 119 : //new
case 120 : //new
case 121 : //new
break ;
default :
break ;
}
}
2017-12-18 03:35:08 +08:00
#endregion
2017-09-21 18:33:05 +08:00
public override string ToString ( )
{
return Name ;
}
}
2017-12-18 03:35:08 +08:00
[TC(typeof(EXP))] public struct RelIndexHash
2017-09-21 18:33:05 +08:00
{
public MetaHash Name { get ; set ; }
public uint Offset { get ; set ; }
public uint Length { get ; set ; }
public override string ToString ( )
{
return Name . ToString ( ) + ", " + Offset . ToString ( ) + ", " + Length . ToString ( ) ;
}
}
2017-12-18 03:35:08 +08:00
[TC(typeof(EXP))] public struct RelIndexString
2017-09-21 18:33:05 +08:00
{
public string Name { get ; set ; }
public uint Offset { get ; set ; }
public uint Length { get ; set ; }
public override string ToString ( )
{
return Name + ", " + Offset . ToString ( ) + ", " + Length . ToString ( ) ;
}
}
2017-12-18 03:35:08 +08:00
[TC(typeof(EXP))] public class RelData
2017-09-21 18:33:05 +08:00
{
public MetaHash NameHash { get ; set ; }
public string Name { get ; set ; }
2017-12-22 04:26:04 +08:00
public uint DataOffset { get ; set ; }
public uint DataLength { get ; set ; }
2017-09-21 18:33:05 +08:00
public byte [ ] Data { get ; set ; }
2017-12-18 03:35:08 +08:00
public byte TypeID { get ; set ; }
public RelData ( ) { }
public RelData ( RelData d )
{
NameHash = d . NameHash ;
Name = d . Name ;
2017-12-22 04:26:04 +08:00
DataOffset = d . DataOffset ;
DataLength = d . DataLength ;
2017-12-18 03:35:08 +08:00
Data = d . Data ;
TypeID = d . TypeID ;
}
public void ReadType ( BinaryReader br )
{
TypeID = br . ReadByte ( ) ;
}
2017-09-21 18:33:05 +08:00
2017-12-18 03:35:08 +08:00
public string GetNameString ( )
{
return ( string . IsNullOrEmpty ( Name ) ) ? NameHash . ToString ( ) : Name ;
}
public string GetBaseString ( )
{
2017-12-22 04:26:04 +08:00
return DataOffset . ToString ( ) + ", " + DataLength . ToString ( ) + ": " + GetNameString ( ) ;
2017-12-18 03:35:08 +08:00
}
2017-09-21 18:33:05 +08:00
public override string ToString ( )
{
2017-12-18 03:35:08 +08:00
return GetBaseString ( ) + ": " + TypeID . ToString ( ) ;
2017-09-21 18:33:05 +08:00
}
2017-12-20 07:52:50 +08:00
public static bool Bit ( uint f , int b )
{
return ( ( f & ( 1 u < < b ) ) ! = 0 ) ; //just for handyness... maybe move this?
}
public static bool BadF ( float f )
{
return ( ( f < - 15000 ) | | ( f > 15000 ) ) ;
}
2017-09-21 18:33:05 +08:00
}
2017-12-18 03:35:08 +08:00
[TC(typeof(EXP))] public class RelSoundHeader
{
2017-12-20 07:52:50 +08:00
public FlagsUint Flags { get ; set ; }
2017-12-18 03:35:08 +08:00
public FlagsUint UnkFlags { get ; set ; }
public ushort Unk01 { get ; set ; }
public ushort Unk02 { get ; set ; }
public ushort Unk03 { get ; set ; } //0xD-0xF
public ushort Unk04 { get ; set ; } //0xF-0x11
public ushort Unk05 { get ; set ; } //0x11-0x13
public ushort Unk06 { get ; set ; } //0x13-0x15
public ushort Unk07 { get ; set ; } //0x15-0x17
public ushort Unk08 { get ; set ; } //0x17-0x19
public ushort Unk09 { get ; set ; } //0x19-0x1B
public MetaHash UnkHash1 { get ; set ; } //0x1B-0x1F
public MetaHash UnkHash2 { get ; set ; } //0x1F-0x23
public ushort Unk10 { get ; set ; } //0x23-0x25
public ushort Unk11 { get ; set ; } //0x25-0x27
public ushort Unk12 { get ; set ; } //0x27-0x29
public MetaHash CategoryHash { get ; set ; } //0x29-0x2D
public ushort Unk14 { get ; set ; } //0x2D-0x2F
public ushort Unk15 { get ; set ; } //0x2F-0x31
public ushort Unk16 { get ; set ; } //0x31-0x33
public ushort Unk17 { get ; set ; } //0x33-0x35
public MetaHash UnkHash3 { get ; set ; } //0x35-0x39
public ushort Unk18 { get ; set ; } //0x39-0x3B
public byte Unk19 { get ; set ; } //0x3B-0x3C
public byte Unk20 { get ; set ; } //0x3C-0x3D
public byte Unk21 { get ; set ; } //0x3D-0x3E
public MetaHash UnkHash4 { get ; set ; } //0x3E-0x42
public MetaHash UnkHash5 { get ; set ; } //0x42-0x46
public ushort Unk22 { get ; set ; } //0x46-0x48
public ushort Unk23 { get ; set ; } //0x48-0x4A
public ushort Unk24 { get ; set ; } //0x4A-0x4C
2017-12-20 07:52:50 +08:00
public ushort Unk25 { get ; set ; } //0x4A-0x4C
public ushort Unk26 { get ; set ; } //0x4A-0x4C
2017-12-18 03:35:08 +08:00
2017-12-20 07:52:50 +08:00
public RelSoundHeader ( BinaryReader br )
2017-12-18 03:35:08 +08:00
{
Flags = br . ReadUInt32 ( ) ;
2017-12-20 07:52:50 +08:00
//if (Flags.Value != 0xAAAAAAAA)
if ( ( Flags . Value & 0xFF ) ! = 0xAA )
2017-12-18 03:35:08 +08:00
{
if ( Bit ( 0 ) ) UnkFlags = br . ReadUInt32 ( ) ;
if ( Bit ( 1 ) ) Unk01 = br . ReadUInt16 ( ) ;
if ( Bit ( 2 ) ) Unk02 = br . ReadUInt16 ( ) ;
if ( Bit ( 3 ) ) Unk03 = br . ReadUInt16 ( ) ;
if ( Bit ( 4 ) ) Unk04 = br . ReadUInt16 ( ) ;
if ( Bit ( 5 ) ) Unk05 = br . ReadUInt16 ( ) ;
if ( Bit ( 6 ) ) Unk06 = br . ReadUInt16 ( ) ;
if ( Bit ( 7 ) ) Unk07 = br . ReadUInt16 ( ) ;
2017-12-20 07:52:50 +08:00
}
if ( ( Flags . Value & 0xFF00 ) ! = 0xAA00 )
{
2017-12-18 03:35:08 +08:00
if ( Bit ( 8 ) ) Unk08 = br . ReadUInt16 ( ) ;
if ( Bit ( 9 ) ) Unk09 = br . ReadUInt16 ( ) ;
if ( Bit ( 10 ) ) UnkHash1 = br . ReadUInt32 ( ) ;
if ( Bit ( 11 ) ) UnkHash2 = br . ReadUInt32 ( ) ;
if ( Bit ( 12 ) ) Unk10 = br . ReadUInt16 ( ) ;
if ( Bit ( 13 ) ) Unk11 = br . ReadUInt16 ( ) ;
if ( Bit ( 14 ) ) Unk12 = br . ReadUInt16 ( ) ;
if ( Bit ( 15 ) ) CategoryHash = br . ReadUInt32 ( ) ;
2017-12-20 07:52:50 +08:00
}
if ( ( Flags . Value & 0xFF0000 ) ! = 0xAA0000 )
{
2017-12-18 03:35:08 +08:00
if ( Bit ( 16 ) ) Unk14 = br . ReadUInt16 ( ) ;
if ( Bit ( 17 ) ) Unk15 = br . ReadUInt16 ( ) ;
if ( Bit ( 18 ) ) Unk16 = br . ReadUInt16 ( ) ;
if ( Bit ( 19 ) ) Unk17 = br . ReadUInt16 ( ) ;
if ( Bit ( 20 ) ) UnkHash3 = br . ReadUInt32 ( ) ;
if ( Bit ( 21 ) ) Unk18 = br . ReadUInt16 ( ) ;
if ( Bit ( 22 ) ) Unk19 = br . ReadByte ( ) ;
if ( Bit ( 23 ) ) Unk20 = br . ReadByte ( ) ;
2017-12-20 07:52:50 +08:00
}
if ( ( Flags . Value & 0xFF000000 ) ! = 0xAA000000 )
{
2017-12-18 03:35:08 +08:00
if ( Bit ( 24 ) ) Unk21 = br . ReadByte ( ) ;
if ( Bit ( 25 ) ) UnkHash4 = br . ReadUInt32 ( ) ;
if ( Bit ( 26 ) ) UnkHash5 = br . ReadUInt32 ( ) ;
if ( Bit ( 27 ) ) Unk22 = br . ReadUInt16 ( ) ;
if ( Bit ( 28 ) ) Unk23 = br . ReadUInt16 ( ) ;
if ( Bit ( 29 ) ) Unk24 = br . ReadUInt16 ( ) ;
2017-12-20 07:52:50 +08:00
if ( Bit ( 30 ) ) Unk25 = br . ReadUInt16 ( ) ; //maybe not
if ( Bit ( 31 ) ) Unk26 = br . ReadUInt16 ( ) ; //maybe not
2017-12-18 03:35:08 +08:00
}
}
private bool Bit ( int b )
{
2017-12-20 07:52:50 +08:00
return ( ( Flags . Value & ( 1 u < < b ) ) ! = 0 ) ;
2017-12-18 03:35:08 +08:00
}
public override string ToString ( )
{
2017-12-20 07:52:50 +08:00
return string . Format ( "{0}: {1}, {2}, {3}, {4}, {5}, {6}, {7}" , Flags . Hex , UnkFlags . Hex , CategoryHash , UnkHash1 , UnkHash2 , UnkHash3 , UnkHash4 , UnkHash5 ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class RelSound : RelData
{
public RelSoundHeader Header { get ; set ; }
public byte AudioTracksCount { get ; set ; }
2017-12-23 04:56:39 +08:00
public RelData [ ] AudioTracks { get ; set ; }
public MetaHash [ ] AudioTrackHashes { get ; set ; }
2017-12-20 07:52:50 +08:00
public MetaHash [ ] AudioContainers { get ; set ; } //Relative path to parent wave container (i.e. "RESIDENT/animals")
2017-12-18 03:35:08 +08:00
public RelSound ( RelData d , BinaryReader br ) : base ( d )
{
2017-12-20 07:52:50 +08:00
Header = new RelSoundHeader ( br ) ;
2017-12-18 03:35:08 +08:00
}
2017-12-23 04:56:39 +08:00
public void ReadAudioTrackHashes ( BinaryReader br )
2017-12-18 03:35:08 +08:00
{
AudioTracksCount = br . ReadByte ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new MetaHash [ AudioTracksCount ] ;
2017-12-18 03:35:08 +08:00
for ( int i = 0 ; i < AudioTracksCount ; i + + )
{
2017-12-23 04:56:39 +08:00
AudioTrackHashes [ i ] = br . ReadUInt32 ( ) ;
2017-12-18 03:35:08 +08:00
}
}
}
public enum Dat54SoundType : byte
{
LoopingSound = 1 ,
EnvelopeSound = 2 ,
TwinLoopSound = 3 ,
SpeechSound = 4 ,
OnStopSound = 5 ,
WrapperSound = 6 ,
SequentialSound = 7 ,
StreamingSound = 8 ,
RetriggeredOverlappedSound = 9 ,
CrossfadeSound = 10 ,
CollapsingStereoSound = 11 ,
SimpleSound = 12 ,
MultitrackSound = 13 ,
RandomizedSound = 14 ,
EnvironmentSound = 15 ,
DynamicEntitySound = 16 ,
SequentialOverlapSound = 17 ,
ModularSynthSound = 18 ,
GranularSound = 19 ,
DirectionalSound = 20 ,
KineticSound = 21 ,
SwitchSound = 22 ,
VariableCurveSound = 23 ,
VariablePrintValueSound = 24 ,
VariableBlockSound = 25 ,
IfSound = 26 ,
MathOperationSound = 27 ,
ParameterTransformSound = 28 ,
FluctuatorSound = 29 ,
AutomationSound = 30 ,
ExternalStreamSound = 31 ,
SoundSet = 32 ,
Unknown = 33 ,
Unknown2 = 34 ,
SoundList = 35
}
[TC(typeof(EXP))] public class Dat54Sound : RelSound
{
public Dat54SoundType Type { get ; set ; }
public Dat54Sound ( RelData d , BinaryReader br ) : base ( d , br )
{
Type = ( Dat54SoundType ) TypeID ;
}
public override string ToString ( )
{
return GetBaseString ( ) + ": " + Type . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54LoopingSound : Dat54Sound
{
public short UnkShort0 { get ; set ; } //0x0-0x2
public short UnkShort1 { get ; set ; } //0x2-0x4
public short UnkShort2 { get ; set ; } //0x4-0x6
public MetaHash AudioHash { get ; set ; } //0x6-0xA
public MetaHash ParameterHash { get ; set ; } //0xA-0xE
public Dat54LoopingSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShort0 = br . ReadInt16 ( ) ;
UnkShort1 = br . ReadInt16 ( ) ;
UnkShort2 = br . ReadInt16 ( ) ;
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
ParameterHash = br . ReadUInt32 ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54EnvelopeSound : Dat54Sound
{
public ushort UnkShortA { get ; set ; } //0x0-0x2
public ushort UnkShortA1 { get ; set ; } //0x2-0x4
public ushort UnkShortB { get ; set ; } //0x4-0x6
public ushort UnkShortB1 { get ; set ; } //0x6-0x8
public byte UnkByteA { get ; set ; } //0x8-0x9
public byte UnkByteA1 { get ; set ; } //0x9-0xA
public int UnkInt { get ; set ; } //0xA-0xE
public ushort UnkShortC { get ; set ; } //0xE-0x10
public int UnkIntA { get ; set ; } //0x10-0x14
public int UnkIntA1 { get ; set ; } //0x14-0x18
public MetaHash CurvesUnkHash0 { get ; set ; } //0x18-0x1C
public MetaHash CurvesUnkHash1 { get ; set ; } //0x1C-0x20
public MetaHash CurvesUnkHash2 { get ; set ; } //0x20-0x24
public MetaHash ParameterHash0 { get ; set ; } //0x24-0x28
public MetaHash ParameterHash1 { get ; set ; } //0x28-0x2C
public MetaHash ParameterHash2 { get ; set ; } //0x2C-0x30
public MetaHash ParameterHash3 { get ; set ; } //0x30-0x34
public MetaHash ParameterHash4 { get ; set ; } //0x34-0x38
public MetaHash AudioHash { get ; set ; } // audio track 0x38-0x3C
public int UnkIntC { get ; set ; } //0x3C-0x40
public MetaHash ParameterHash5 { get ; set ; } //0x40-0x44
public float UnkFloat0 { get ; set ; } //0x44-0x48
public float UnkFloat1 { get ; set ; } //0x48-0x4C
public Dat54EnvelopeSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShortA = br . ReadUInt16 ( ) ; //0x0-0x2
UnkShortA1 = br . ReadUInt16 ( ) ; //0x2-0x4
UnkShortB = br . ReadUInt16 ( ) ; //0x4-0x6
UnkShortB1 = br . ReadUInt16 ( ) ; //0x6-0x8
UnkByteA = br . ReadByte ( ) ; //0x8-0x9
UnkByteA1 = br . ReadByte ( ) ; //0x9-0xA
UnkInt = br . ReadInt32 ( ) ; //0xA-0xE
UnkShortC = br . ReadUInt16 ( ) ; //0xE-0x10
UnkIntA = br . ReadInt32 ( ) ; //0x10-0x14
UnkIntA1 = br . ReadInt32 ( ) ; //0x14-0x18
CurvesUnkHash0 = br . ReadUInt32 ( ) ; //0x18-0x1C
CurvesUnkHash1 = br . ReadUInt32 ( ) ; //0x1C-0x20
CurvesUnkHash2 = br . ReadUInt32 ( ) ; //0x20-0x24
ParameterHash0 = br . ReadUInt32 ( ) ; //0x24-0x28
ParameterHash1 = br . ReadUInt32 ( ) ; //0x28-0x2C
ParameterHash2 = br . ReadUInt32 ( ) ; //0x2C-0x30
ParameterHash3 = br . ReadUInt32 ( ) ; //0x30-0x34
ParameterHash4 = br . ReadUInt32 ( ) ; //0x34-0x38
AudioHash = br . ReadUInt32 ( ) ; //0x38-0x3C
UnkIntC = br . ReadInt32 ( ) ; //0x3C-0x40
ParameterHash5 = br . ReadUInt32 ( ) ; //0x40-0x44
UnkFloat0 = br . ReadSingle ( ) ; //0x44-0x48
UnkFloat1 = br . ReadSingle ( ) ; //0x48-0x4C
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54TwinLoopSound : Dat54Sound
{
public ushort UnkShort0 { get ; set ; } //0x0-0x2
public ushort UnkShort1 { get ; set ; } //0x2-0x4
public ushort UnkShort2 { get ; set ; } //0x4-0x6
public ushort UnkShort3 { get ; set ; } //0x6-0x8
public MetaHash UnkHash { get ; set ; } //0x8-0xC
public MetaHash ParameterHash0 { get ; set ; } //0xC-0x10
public MetaHash ParameterHash1 { get ; set ; } //0x10-0x14
public MetaHash ParameterHash2 { get ; set ; } //0x14-0x18
public MetaHash ParameterHash3 { get ; set ; } //0x18-0x1C
public Dat54TwinLoopSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShort0 = br . ReadUInt16 ( ) ;
UnkShort1 = br . ReadUInt16 ( ) ;
UnkShort2 = br . ReadUInt16 ( ) ;
UnkShort3 = br . ReadUInt16 ( ) ;
UnkHash = br . ReadUInt32 ( ) ;
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
ParameterHash2 = br . ReadUInt32 ( ) ;
ParameterHash3 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54SpeechSound : Dat54Sound
{
public int UnkInt0 { get ; set ; } //maybe file index?
public int UnkInt1 { get ; set ; } //ox4-0x8
public MetaHash VoiceDataHash { get ; set ; } //0x8-0xC
public string SpeechName { get ; set ; } //0xD-...
public Dat54SpeechSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkInt0 = br . ReadInt32 ( ) ;
UnkInt1 = br . ReadInt32 ( ) ;
VoiceDataHash = br . ReadUInt32 ( ) ;
SpeechName = br . ReadString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54OnStopSound : Dat54Sound
{
public MetaHash AudioHash0 { get ; set ; }
public MetaHash AudioHash1 { get ; set ; }
public MetaHash AudioHash2 { get ; set ; }
public Dat54OnStopSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash0 = br . ReadUInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
AudioHash2 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 , AudioHash2 } ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54WrapperSound : Dat54Sound
{
public MetaHash AudioHash0 { get ; set ; } //0x0-0x4
public int FrameStartTime { get ; set ; } //0x4-0x8 // maybe start delay?
public MetaHash AudioHash1 { get ; set ; } //0x8-0xC
public short FrameTimeInterval { get ; set ; } //0xC-0xE // [camxx:] My guess is that this is related to the time at which a child sound should start playin (or the length of the sound).
public byte ItemCount { get ; set ; }
public MetaHash [ ] Variables { get ; set ; } //0xF
public byte [ ] UnkByteData { get ; set ; } // ...
public Dat54WrapperSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash0 = br . ReadUInt32 ( ) ;
FrameStartTime = br . ReadInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
FrameTimeInterval = br . ReadInt16 ( ) ;
ItemCount = br . ReadByte ( ) ;
Variables = new MetaHash [ ItemCount ] ;
for ( int i = 0 ; i < ItemCount ; i + + )
{
Variables [ i ] = br . ReadUInt32 ( ) ;
}
UnkByteData = br . ReadBytes ( ItemCount ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 } ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54SequentialSound : Dat54Sound
{
public Dat54SequentialSound ( RelData d , BinaryReader br ) : base ( d , br )
{
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54StreamingSound : Dat54Sound
{
int UnkInt { get ; set ; } //0x0-0x4
public Dat54StreamingSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkInt = br . ReadInt32 ( ) ;
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54RetriggeredOverlappedSound : Dat54Sound
{
public ushort UnkShort0 { get ; set ; } //0x0-0x2
public ushort UnkShort1 { get ; set ; } //0x2-0x4
public ushort UnkShort2 { get ; set ; } //0x4-0x6
public ushort UnkShort3 { get ; set ; } // 0x6-0x8
public MetaHash ParameterHash0 { get ; set ; } //0x8-0xC
public MetaHash ParameterHash1 { get ; set ; } //0xC-0x10
public MetaHash AudioHash0 { get ; set ; }
public MetaHash AudioHash1 { get ; set ; }
public MetaHash AudioHash2 { get ; set ; }
public Dat54RetriggeredOverlappedSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShort0 = br . ReadUInt16 ( ) ;
UnkShort1 = br . ReadUInt16 ( ) ;
UnkShort2 = br . ReadUInt16 ( ) ;
UnkShort3 = br . ReadUInt16 ( ) ;
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
AudioHash0 = br . ReadUInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
AudioHash2 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 , AudioHash2 } ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54CrossfadeSound : Dat54Sound
{
public MetaHash AudioHash0 { get ; set ; }
public MetaHash AudioHash1 { get ; set ; }
public byte UnkByte { get ; set ; } //0x8-0x9
public float UnkFloat0 { get ; set ; } //0x9-0xD
public float UnkFloat1 { get ; set ; } //0xD-0x11
public int UnkInt2 { get ; set ; } //0xD-0x15
public MetaHash UnkCurvesHash { get ; set ; } //0x15-0x19
public MetaHash ParameterHash0 { get ; set ; } //0x19-0x1D
public MetaHash ParameterHash1 { get ; set ; } //0x1D-0x21
public MetaHash ParameterHash2 { get ; set ; } //0x21-0x25
public MetaHash ParameterHash3 { get ; set ; } //0x25-0x29
public MetaHash ParameterHash4 { get ; set ; } //0x29-0x2D
public Dat54CrossfadeSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash0 = br . ReadUInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 } ;
2017-12-18 03:35:08 +08:00
UnkByte = br . ReadByte ( ) ;
UnkFloat0 = br . ReadSingle ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
UnkInt2 = br . ReadInt32 ( ) ;
UnkCurvesHash = br . ReadUInt32 ( ) ;
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
ParameterHash2 = br . ReadUInt32 ( ) ;
ParameterHash3 = br . ReadUInt32 ( ) ;
ParameterHash4 = br . ReadUInt32 ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54CollapsingStereoSound : Dat54Sound
{
public MetaHash AudioHash0 { get ; set ; }
public MetaHash AudioHash1 { get ; set ; }
public float UnkFloat0 { get ; set ; }
public float UnkFloat1 { get ; set ; }
public MetaHash ParameterHash0 { get ; set ; } //0x10-0x14
public MetaHash ParameterHash1 { get ; set ; } //0x14-0x18
public MetaHash ParameterHash2 { get ; set ; } //0x18-0x1C
public MetaHash ParameterHash3 { get ; set ; } //0x1C-0x20
public MetaHash ParameterHash4 { get ; set ; } //0x20-0x24
public MetaHash ParameterHash5 { get ; set ; } //0x28-0x2C
public int UnkInt { get ; set ; } //0x24-0x28
public byte UnkByte { get ; set ; } //0x2c-0x2D
public Dat54CollapsingStereoSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash0 = br . ReadUInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 } ;
2017-12-18 03:35:08 +08:00
UnkFloat0 = br . ReadSingle ( ) ; //0x8
UnkFloat1 = br . ReadSingle ( ) ; //0xC
ParameterHash0 = br . ReadUInt32 ( ) ; //0x10
ParameterHash1 = br . ReadUInt32 ( ) ; //0x14
ParameterHash2 = br . ReadUInt32 ( ) ; //0x18
ParameterHash3 = br . ReadUInt32 ( ) ; //0x1C
ParameterHash4 = br . ReadUInt32 ( ) ; //0x20
UnkInt = br . ReadInt32 ( ) ; //0x24-0x28
ParameterHash5 = br . ReadUInt32 ( ) ; //0x28-0x2C
UnkByte = br . ReadByte ( ) ; //0x2C-0x2D
}
}
[TC(typeof(EXP))] public class Dat54SimpleSound : Dat54Sound
{
2017-12-20 07:52:50 +08:00
public MetaHash ContainerName { get ; set ; } //Relative path to parent wave container (i.e. "RESIDENT/animals")
2017-12-18 03:35:08 +08:00
public MetaHash FileName { get ; set ; } //Name of the .wav file
public byte WaveSlotNum { get ; set ; } //Internal index of wave (.awc) container
public Dat54SimpleSound ( RelData d , BinaryReader br ) : base ( d , br )
{
ContainerName = br . ReadUInt32 ( ) ;
2017-12-20 07:52:50 +08:00
AudioContainers = new [ ] { ContainerName } ;
2017-12-18 03:35:08 +08:00
FileName = br . ReadUInt32 ( ) ;
WaveSlotNum = br . ReadByte ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54MultitrackSound : Dat54Sound
{
public Dat54MultitrackSound ( RelData d , BinaryReader br ) : base ( d , br )
{
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54RandomizedSound : Dat54Sound
{
public byte UnkByte { get ; set ; } //0x0-0x1 something count?
public byte UnkBytesCount { get ; set ; } //0x1-0x2
public byte [ ] UnkBytes { get ; set ; }
public byte ItemCount { get ; set ; }
public float [ ] AudioTrackUnkFloats { get ; set ; } //probability..?
public Dat54RandomizedSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkByte = br . ReadByte ( ) ;
UnkBytesCount = br . ReadByte ( ) ;
UnkBytes = br . ReadBytes ( UnkBytesCount ) ;
ItemCount = br . ReadByte ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new MetaHash [ ItemCount ] ;
2017-12-18 03:35:08 +08:00
AudioTrackUnkFloats = new float [ ItemCount ] ;
for ( int i = 0 ; i < ItemCount ; i + + )
{
2017-12-23 04:56:39 +08:00
AudioTrackHashes [ i ] = br . ReadUInt32 ( ) ;
2017-12-18 03:35:08 +08:00
AudioTrackUnkFloats [ i ] = br . ReadSingle ( ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54EnvironmentSound : Dat54Sound
{
2017-12-20 07:52:50 +08:00
public byte UnkByte { get ; set ; }
2017-12-18 03:35:08 +08:00
public Dat54EnvironmentSound ( RelData d , BinaryReader br ) : base ( d , br )
{
2017-12-20 07:52:50 +08:00
UnkByte = br . ReadByte ( ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54DynamicEntitySound : Dat54Sound
{
public byte ItemCount { get ; set ; }
public MetaHash [ ] UnkHashes { get ; set ; }
public Dat54DynamicEntitySound ( RelData d , BinaryReader br ) : base ( d , br )
{
ItemCount = br . ReadByte ( ) ;
UnkHashes = new MetaHash [ ItemCount ] ;
for ( int i = 0 ; i < ItemCount ; i + + )
{
UnkHashes [ i ] = br . ReadUInt32 ( ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54SequentialOverlapSound : Dat54Sound
{
public ushort UnkShort { get ; set ; }
public MetaHash ParameterHash0 { get ; set ; } //0x2-0x6
public MetaHash ParameterHash1 { get ; set ; } //0x6-0xA
public Dat54SequentialOverlapSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShort = br . ReadUInt16 ( ) ;
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54ModularSynthSound : Dat54Sound
{
public MetaHash OptAmpUnkHash { get ; set ; } //0x0-0x4
public MetaHash UnkHash { 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 Dat54ModularSynthSound ( RelData d , BinaryReader br ) : base ( d , br )
{
OptAmpUnkHash = br . ReadUInt32 ( ) ; //0x0-0x4
UnkHash = br . ReadUInt32 ( ) ; //0x4-0x8
UnkFloat = br . ReadSingle ( ) ; //0x8-0xC
UnkInt = br . ReadInt32 ( ) ; //0xC-0x10
TrackCount = br . ReadInt32 ( ) ; //0x10-0x14
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new MetaHash [ 4 ] ;
2017-12-18 03:35:08 +08:00
for ( int i = 0 ; i < 4 ; i + + )
{
2017-12-23 04:56:39 +08:00
AudioTrackHashes [ i ] = br . ReadUInt32 ( ) ;
2017-12-18 03:35:08 +08:00
}
UnkItemCount = br . ReadInt32 ( ) ;
UnkItems = new Dat54ModularSynthSoundData [ UnkItemCount ] ;
for ( int i = 0 ; i < UnkItemCount ; i + + )
{
UnkItems [ i ] = new Dat54ModularSynthSoundData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54ModularSynthSoundData
{
public MetaHash UnkHash { get ; set ; }
public MetaHash ParameterHash { get ; set ; }
public float Value { get ; set ; }
public Dat54ModularSynthSoundData ( BinaryReader br )
{
UnkHash = br . ReadUInt32 ( ) ;
ParameterHash = br . ReadUInt32 ( ) ;
Value = br . ReadSingle ( ) ;
}
public override string ToString ( )
{
return UnkHash . ToString ( ) + ": " + ParameterHash . ToString ( ) + ": " + FloatUtil . ToString ( Value ) ;
}
}
[TC(typeof(EXP))] public class Dat54GranularSound : Dat54Sound
{
public int WaveSlotIndex { get ; set ; } //0x0-0x4
public Dat54GranularSoundFile Wave1 { get ; set ; }
public Dat54GranularSoundFile Wave2 { get ; set ; }
public Dat54GranularSoundFile Wave3 { get ; set ; }
public Dat54GranularSoundFile Wave4 { get ; set ; }
public Dat54GranularSoundFile Wave5 { get ; set ; }
public Dat54GranularSoundFile Wave6 { get ; set ; }
public Dat54GranularSoundData DataItem1 { get ; set ; } //0x34-0x3C
public Dat54GranularSoundData DataItem2 { get ; set ; } //0x3C-0x44
public Dat54GranularSoundData DataItem3 { get ; set ; } //0x44-0x4C
public Dat54GranularSoundData DataItem4 { get ; set ; } //0x4C-0x54
public Dat54GranularSoundData DataItem5 { get ; set ; } //0x54-0x5C
public Dat54GranularSoundData DataItem6 { get ; set ; } //0x5C-0x64
public int UnkInt0 { get ; set ; } //0x64-0x68
public int UnkInt1 { get ; set ; } //0x68-0x6C
public ushort UnkShort0 { get ; set ; } //0x6C-0x6E
public ushort UnkShort1 { get ; set ; } //0x6E-0x70
public ushort UnkShort2 { get ; set ; } //0x70-0x72
public ushort UnkShort3 { get ; set ; } //0x72-0x74
public ushort UnkShort4 { get ; set ; } //0x74-0x76
public ushort UnkShort5 { get ; set ; } //0x76-0x78
public MetaHash TrackName { get ; set ; } //0x78-0x7C
public byte UnkVecCount { get ; set ; } //0x7C-0x7D
public Vector2 [ ] UnkVecData { get ; set ; } //0x7D-...
public Dat54GranularSound ( RelData d , BinaryReader br ) : base ( d , br )
{
WaveSlotIndex = br . ReadInt32 ( ) ;
Wave1 = new Dat54GranularSoundFile ( br ) ;
Wave2 = new Dat54GranularSoundFile ( br ) ;
Wave3 = new Dat54GranularSoundFile ( br ) ;
Wave4 = new Dat54GranularSoundFile ( br ) ;
Wave5 = new Dat54GranularSoundFile ( br ) ;
Wave6 = new Dat54GranularSoundFile ( br ) ;
AudioContainers = new [ ] {
Wave1 . ContainerName ,
Wave2 . ContainerName ,
Wave3 . ContainerName ,
Wave4 . ContainerName ,
Wave5 . ContainerName ,
Wave6 . ContainerName
} ;
DataItem1 = new Dat54GranularSoundData ( br ) ;
DataItem2 = new Dat54GranularSoundData ( br ) ;
DataItem3 = new Dat54GranularSoundData ( br ) ;
DataItem4 = new Dat54GranularSoundData ( br ) ;
DataItem5 = new Dat54GranularSoundData ( br ) ;
DataItem6 = new Dat54GranularSoundData ( br ) ;
UnkInt0 = br . ReadInt32 ( ) ;
UnkInt1 = br . ReadInt32 ( ) ;
UnkShort0 = br . ReadUInt16 ( ) ;
UnkShort1 = br . ReadUInt16 ( ) ;
UnkShort2 = br . ReadUInt16 ( ) ;
UnkShort3 = br . ReadUInt16 ( ) ;
UnkShort4 = br . ReadUInt16 ( ) ;
UnkShort5 = br . ReadUInt16 ( ) ;
TrackName = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { TrackName } ;
2017-12-18 03:35:08 +08:00
UnkVecCount = br . ReadByte ( ) ;
UnkVecData = new Vector2 [ UnkVecCount ] ;
for ( int i = 0 ; i < UnkVecCount ; i + + )
{
UnkVecData [ i ] = new Vector2 ( br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54GranularSoundFile
{
public MetaHash ContainerName { get ; set ; } //0x0-0x4
public MetaHash FileName { get ; set ; } //0x4-0x8
public Dat54GranularSoundFile ( BinaryReader br )
{
ContainerName = br . ReadUInt32 ( ) ;
FileName = br . ReadUInt32 ( ) ;
}
public override string ToString ( )
{
return ContainerName . ToString ( ) + ": " + FileName . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54GranularSoundData
{
public byte UnkFlags0 { get ; set ; } //0x0-0x1
public byte UnkFlags1 { get ; set ; } //0x1-0x2
public byte UnkByte0 { get ; set ; } //0x2-0x3
public byte UnkByte1 { get ; set ; } //0x3-0x4
public float UnkFloat { get ; set ; } //0x4-0x8
public Dat54GranularSoundData ( BinaryReader br )
{
UnkFlags0 = br . ReadByte ( ) ;
UnkFlags1 = br . ReadByte ( ) ;
UnkByte0 = br . ReadByte ( ) ;
UnkByte1 = br . ReadByte ( ) ;
UnkFloat = br . ReadSingle ( ) ;
}
public override string ToString ( )
{
return UnkFlags0 . ToString ( ) + ": " + UnkFlags1 . ToString ( ) + ": " + UnkByte0 . ToString ( ) + ": " + UnkByte1 . ToString ( ) + ": " + FloatUtil . ToString ( UnkFloat ) ;
}
}
[TC(typeof(EXP))] public class Dat54DirectionalSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public float UnkFloat0 { get ; set ; } //0x4-0x8
public float UnkFloat1 { get ; set ; } //0x8-0xC
public float UnkFloat2 { get ; set ; } //0xC-0x10
public float UnkFloat3 { get ; set ; } //0x10-0x14
public float UnkFloat4 { get ; set ; } //0x14-0x18
public Dat54DirectionalSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
UnkFloat0 = br . ReadSingle ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
UnkFloat2 = br . ReadSingle ( ) ;
UnkFloat3 = br . ReadSingle ( ) ;
UnkFloat4 = br . ReadSingle ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54KineticSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public float UnkFloat0 { get ; set ; } //Maybe kinetic force vector?
public float UnkFloat1 { get ; set ; }
public float UnkFloat2 { get ; set ; }
public Dat54KineticSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
UnkFloat0 = br . ReadSingle ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
UnkFloat2 = br . ReadSingle ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54SwitchSound : Dat54Sound
{
public MetaHash ParameterHash { get ; set ; } //0x0-0x4
public Dat54SwitchSound ( RelData d , BinaryReader br ) : base ( d , br )
{
ParameterHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
}
}
[TC(typeof(EXP))] public class Dat54VariableCurveSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public MetaHash ParameterHash0 { get ; set ; } //0x4-0x8
public MetaHash ParameterHash1 { get ; set ; } //0x8-0xC
public MetaHash UnkCurvesHash { get ; set ; } //0xC-0x10
public Dat54VariableCurveSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
UnkCurvesHash = br . ReadUInt32 ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54VariablePrintValueSound : Dat54Sound
{
public MetaHash ParameterHash { get ; set ; } //0x0-0x4
public string VariableString { get ; set ; }
public Dat54VariablePrintValueSound ( RelData d , BinaryReader br ) : base ( d , br )
{
ParameterHash = br . ReadUInt32 ( ) ;
VariableString = br . ReadString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54VariableBlockSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public byte VariableCount { get ; set ; }
public Dat54VariableData [ ] Variables { get ; set ; }
public Dat54VariableBlockSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
VariableCount = br . ReadByte ( ) ;
Variables = new Dat54VariableData [ VariableCount ] ;
for ( int i = 0 ; i < VariableCount ; i + + )
{
Variables [ i ] = new Dat54VariableData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54VariableData
{
public MetaHash Name { get ; set ; }
public float Value { get ; set ; }
public float UnkFloat { get ; set ; }
public byte Flags { get ; set ; }
public Dat54VariableData ( BinaryReader br )
{
Name = br . ReadUInt32 ( ) ;
Value = br . ReadSingle ( ) ;
UnkFloat = br . ReadSingle ( ) ;
Flags = br . ReadByte ( ) ;
}
public override string ToString ( )
{
return Name + ": " + FloatUtil . ToString ( Value ) + ": " + FloatUtil . ToString ( UnkFloat ) + ": " + Flags . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54IfSound : Dat54Sound
{
public MetaHash AudioHash1 { get ; set ; }
public MetaHash AudioHash2 { get ; set ; }
public MetaHash ParameterHash1 { get ; set ; }
public byte UnkByte { get ; set ; }
public float UnkFloat { get ; set ; }
public MetaHash ParameterHash2 { get ; set ; }
public Dat54IfSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash1 = br . ReadUInt32 ( ) ;
AudioHash2 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash1 , AudioHash2 } ;
2017-12-18 03:35:08 +08:00
ParameterHash1 = br . ReadUInt32 ( ) ;
UnkByte = br . ReadByte ( ) ;
UnkFloat = br . ReadSingle ( ) ;
ParameterHash2 = br . ReadUInt32 ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54MathOperationSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public byte UnkDataCount { get ; set ; }
public Dat54MathOperationSoundData [ ] UnkData { get ; set ; }
public Dat54MathOperationSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
UnkDataCount = br . ReadByte ( ) ;
UnkData = new Dat54MathOperationSoundData [ UnkDataCount ] ;
for ( int i = 0 ; i < UnkDataCount ; i + + )
{
UnkData [ i ] = new Dat54MathOperationSoundData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54MathOperationSoundData
{
public byte UnkByte { get ; set ; } //0x0-0x1
public int UnkInt0 { get ; set ; } //0x1-0x5
public int UnkInt1 { get ; set ; } //0x5-0x9
public int UnkInt2 { get ; set ; } //0x9-0xD
public int UnkInt3 { get ; set ; } //0xD-0x11
public int UnkInt4 { get ; set ; } //0x11-0x15
public MetaHash ParameterHash0 { get ; set ; } //0x15-0x19
public MetaHash ParameterHash1 { get ; set ; } //0x19-0x1D
public Dat54MathOperationSoundData ( BinaryReader br )
{
UnkByte = br . ReadByte ( ) ;
UnkInt0 = br . ReadInt32 ( ) ;
UnkInt1 = br . ReadInt32 ( ) ;
UnkInt2 = br . ReadInt32 ( ) ;
UnkInt3 = br . ReadInt32 ( ) ;
UnkInt4 = br . ReadInt32 ( ) ;
ParameterHash0 = br . ReadUInt32 ( ) ;
ParameterHash1 = br . ReadUInt32 ( ) ;
}
public override string ToString ( )
{
return ParameterHash0 . ToString ( ) + ", " + ParameterHash1 . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54ParameterTransformSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public int ItemCount { get ; set ; }
public Dat54ParameterTransformSoundData [ ] Items { get ; set ; }
public Dat54ParameterTransformSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
ItemCount = br . ReadInt32 ( ) ; //0x4-0x8
Items = new Dat54ParameterTransformSoundData [ ItemCount ] ;
for ( int i = 0 ; i < ItemCount ; i + + )
{
Items [ i ] = new Dat54ParameterTransformSoundData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54ParameterTransformSoundData
{
public MetaHash ParameterHash { get ; set ; } //0x0-0x4
public float UnkFloat0 { get ; set ; } //0x4-0x8
public float UnkFloat1 { get ; set ; } //0x8-0xC
public int NestedDataCount { get ; set ; }
public Dat54ParameterTransformSoundData2 [ ] NestedData { get ; set ; } //0x10..
public Dat54ParameterTransformSoundData ( BinaryReader br )
{
ParameterHash = br . ReadUInt32 ( ) ;
UnkFloat0 = br . ReadSingle ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
NestedDataCount = br . ReadInt32 ( ) ;
NestedData = new Dat54ParameterTransformSoundData2 [ NestedDataCount ] ;
for ( int i = 0 ; i < NestedDataCount ; i + + )
{
NestedData [ i ] = new Dat54ParameterTransformSoundData2 ( br ) ;
}
}
public override string ToString ( )
{
return ParameterHash . ToString ( ) + ", " + NestedDataCount . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54ParameterTransformSoundData2
{
public float UnkFloat0 { get ; set ; } //0x0-0x4
public int UnkInt { get ; set ; } //0x4
public MetaHash ParameterHash { get ; set ; } //0x8-0xC
public float UnkFloat1 { get ; set ; } //0xC
public float UnkFloat2 { get ; set ; } //0x10-0x14
public int NestedItemCount { get ; set ; }
public Vector2 [ ] NestedItems { get ; set ; } //0x18-...
public Dat54ParameterTransformSoundData2 ( BinaryReader br )
{
UnkFloat0 = br . ReadSingle ( ) ;
UnkInt = br . ReadInt32 ( ) ;
ParameterHash = br . ReadUInt32 ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
UnkFloat2 = br . ReadSingle ( ) ;
NestedItemCount = br . ReadInt32 ( ) ;
NestedItems = new Vector2 [ NestedItemCount ] ;
for ( int i = 0 ; i < NestedItemCount ; i + + )
{
NestedItems [ i ] = new Vector2 ( br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
}
}
public override string ToString ( )
{
return ParameterHash . ToString ( ) + ", " + NestedItemCount . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54FluctuatorSound : Dat54Sound
{
public MetaHash AudioHash { get ; set ; }
public int ItemCount { get ; set ; }
public Dat54FluctuatorSoundData [ ] Items { get ; set ; }
public Dat54FluctuatorSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash } ;
2017-12-18 03:35:08 +08:00
ItemCount = br . ReadInt32 ( ) ; //0x4-0x8
Items = new Dat54FluctuatorSoundData [ ItemCount ] ;
for ( int i = 0 ; i < ItemCount ; i + + )
{
Items [ i ] = new Dat54FluctuatorSoundData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54FluctuatorSoundData
{
public byte UnkByte0 { get ; set ; } //0x0-0x1
public byte UnkByte1 { get ; set ; } //0x1-0x2
public MetaHash ParameterHash { get ; set ; } //0x2-0x6
public float UnkFloat00 { get ; set ; } //0x6-0xA
public float UnkFloat01 { get ; set ; } //0xA-0xE
public float UnkFloat02 { get ; set ; } //0xE-0x12
public float UnkFloat03 { get ; set ; } //0x12-0x16
public float UnkFloat04 { get ; set ; } //0x16-0x1A
public float UnkFloat05 { get ; set ; } //0x1A-0x1E
public float UnkFloat06 { get ; set ; } //0x1E-0x22
public float UnkFloat07 { get ; set ; } //0x22-0x26
public float UnkFloat08 { get ; set ; } //0x26-0x2A
public float UnkFloat09 { get ; set ; } //0x2A-0x2E
public float UnkFloat10 { get ; set ; } //0x2E-0x32
public Dat54FluctuatorSoundData ( BinaryReader br )
{
UnkByte0 = br . ReadByte ( ) ;
UnkByte1 = br . ReadByte ( ) ;
ParameterHash = br . ReadUInt32 ( ) ;
UnkFloat00 = br . ReadSingle ( ) ;
UnkFloat01 = br . ReadSingle ( ) ;
UnkFloat02 = br . ReadSingle ( ) ;
UnkFloat03 = br . ReadSingle ( ) ;
UnkFloat04 = br . ReadSingle ( ) ;
UnkFloat05 = br . ReadSingle ( ) ;
UnkFloat06 = br . ReadSingle ( ) ;
UnkFloat07 = br . ReadSingle ( ) ;
UnkFloat08 = br . ReadSingle ( ) ;
UnkFloat09 = br . ReadSingle ( ) ;
UnkFloat10 = br . ReadSingle ( ) ;
}
public override string ToString ( )
{
return ParameterHash . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54AutomationSound : Dat54Sound
{
public MetaHash AudioHash0 { get ; set ; }
public float UnkFloat0 { get ; set ; } //0x4-0x8
public float UnkFloat1 { get ; set ; } //0x8-0xC
public MetaHash ParameterHash { get ; set ; } //0xC-0x10
public MetaHash AudioHash1 { get ; set ; }
public int WaveSlotId { get ; set ; } //0x14-0x18
public MetaHash UnkHash1 { get ; set ; } //0x18-0x1C
public int UnkDataCount { get ; set ; } // array data count 0x1C-0x20
public Dat54AutomationSoundData [ ] UnkData { get ; set ; } //0x20-
public Dat54AutomationSound ( RelData d , BinaryReader br ) : base ( d , br )
{
AudioHash0 = br . ReadUInt32 ( ) ;
UnkFloat0 = br . ReadSingle ( ) ;
UnkFloat1 = br . ReadSingle ( ) ;
ParameterHash = br . ReadUInt32 ( ) ;
AudioHash1 = br . ReadUInt32 ( ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new [ ] { AudioHash0 , AudioHash1 } ;
2017-12-18 03:35:08 +08:00
WaveSlotId = br . ReadInt32 ( ) ;
UnkHash1 = br . ReadUInt32 ( ) ;
UnkDataCount = br . ReadInt32 ( ) ;
UnkData = new Dat54AutomationSoundData [ UnkDataCount ] ;
for ( int i = 0 ; i < UnkDataCount ; i + + )
{
UnkData [ i ] = new Dat54AutomationSoundData ( br ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54AutomationSoundData
{
public int UnkInt { get ; set ; } //0x0-0x1
public MetaHash UnkHash { get ; set ; } //0x2-0x6
public Dat54AutomationSoundData ( BinaryReader br )
{
UnkInt = br . ReadInt32 ( ) ;
UnkHash = br . ReadUInt32 ( ) ;
}
public override string ToString ( )
{
return UnkInt . ToString ( ) + ", " + UnkHash . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54ExternalStreamSound : Dat54Sound
{
public Dat54ExternalStreamSound ( RelData d , BinaryReader br ) : base ( d , br )
{
2017-12-23 04:56:39 +08:00
ReadAudioTrackHashes ( br ) ;
2017-12-18 03:35:08 +08:00
2017-12-20 07:52:50 +08:00
//FlagsUint u1 = br.ReadUInt32();
//FlagsUint u2 = br.ReadUInt32();
//FlagsUint u3 = br.ReadUInt32();
//FlagsUint u4 = br.ReadUInt32();
2017-12-18 03:35:08 +08:00
//TODO: could be more to read!
if ( br . BaseStream . Position ! = br . BaseStream . Length )
{ } //hits here!
}
}
[TC(typeof(EXP))] public class Dat54SoundSet : Dat54Sound
{
public int ItemCount { get ; set ; }
public Dat54SoundSetItem [ ] Items { get ; set ; }
public Dat54SoundSet ( RelData d , BinaryReader br ) : base ( d , br )
{
ItemCount = br . ReadInt32 ( ) ;
Items = new Dat54SoundSetItem [ ItemCount ] ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new MetaHash [ ItemCount ] ;
2017-12-18 03:35:08 +08:00
for ( int i = 0 ; i < ItemCount ; i + + )
{
Items [ i ] = new Dat54SoundSetItem ( br ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes [ i ] = Items [ i ] . SoundName ;
2017-12-18 03:35:08 +08:00
}
}
}
[TC(typeof(EXP))] public class Dat54SoundSetItem
{
public MetaHash ScriptName { get ; set ; }
public MetaHash SoundName { get ; set ; }
public Dat54SoundSetItem ( BinaryReader br )
{
ScriptName = br . ReadUInt32 ( ) ;
SoundName = br . ReadUInt32 ( ) ;
}
public override string ToString ( )
{
return ScriptName . ToString ( ) + ": " + SoundName . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54UnknownSound : Dat54Sound
{
public byte UnkDataCount { get ; set ; }
public Dat54UnknownSoundData [ ] UnkData { get ; set ; }
public Dat54UnknownSound ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkDataCount = br . ReadByte ( ) ;
UnkData = new Dat54UnknownSoundData [ UnkDataCount ] ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes = new MetaHash [ UnkDataCount ] ;
2017-12-18 03:35:08 +08:00
for ( int i = 0 ; i < UnkDataCount ; i + + )
{
UnkData [ i ] = new Dat54UnknownSoundData ( br ) ;
2017-12-23 04:56:39 +08:00
AudioTrackHashes [ i ] = br . ReadUInt32 ( ) ;
2017-12-18 03:35:08 +08:00
}
}
}
[TC(typeof(EXP))] public class Dat54UnknownSoundData
{
public byte UnkByte0 { get ; set ; }
public byte UnkByte1 { get ; set ; }
public byte UnkByte2 { get ; set ; }
public Dat54UnknownSoundData ( BinaryReader br )
{
UnkByte0 = br . ReadByte ( ) ;
UnkByte1 = br . ReadByte ( ) ;
UnkByte2 = br . ReadByte ( ) ;
}
public override string ToString ( )
{
return UnkByte0 . ToString ( ) + ": " + UnkByte1 . ToString ( ) + ": " + UnkByte2 . ToString ( ) ;
}
}
[TC(typeof(EXP))] public class Dat54UnknownSound2 : Dat54Sound
{
public uint UnkCount { get ; set ; }
public MetaHash [ ] UnkItems { get ; set ; }
public Dat54UnknownSound2 ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkCount = br . ReadUInt32 ( ) ;
UnkItems = new MetaHash [ UnkCount ] ;
for ( int i = 0 ; i < UnkCount ; i + + )
{
UnkItems [ i ] = br . ReadUInt32 ( ) ;
}
}
}
[TC(typeof(EXP))] public class Dat54SoundList : Dat54Sound
{
public ushort UnkShort { get ; set ; }
public uint Count { get ; set ; }
public MetaHash [ ] Items { get ; set ; }
public Dat54SoundList ( RelData d , BinaryReader br ) : base ( d , br )
{
UnkShort = br . ReadUInt16 ( ) ;
Count = br . ReadUInt32 ( ) ;
Items = new MetaHash [ Count ] ;
for ( int i = 0 ; i < Count ; i + + )
{
Items [ i ] = br . ReadUInt32 ( ) ;
}
if ( br . BaseStream . Position ! = br . BaseStream . Length )
{ }
}
}
public enum Dat151RelType : byte //not sure how correct these are?
{
2017-12-23 04:56:39 +08:00
Collision = 1 , //maybe for vehicle
2017-12-26 22:45:26 +08:00
Unk2 = 2 ,
2017-12-23 04:56:39 +08:00
Vehicle = 3 ,
VehicleEngine = 4 ,
2017-12-26 22:45:26 +08:00
Entity = 5 , //not sure about this
Stream = 6 , //possibly, generic audio stream
Unk7 = 7 ,
2017-12-23 04:56:39 +08:00
Helicopter = 8 , //maybe
2017-12-26 22:45:26 +08:00
Unk9 = 9 ,
Unk11 = 11 ,
Unk12 = 12 ,
Unk13 = 13 ,
2017-12-18 03:35:08 +08:00
SpeechParams = 14 ,
2017-12-26 22:45:26 +08:00
Unk15 = 15 ,
Unk16 = 16 ,
2017-12-23 04:56:39 +08:00
Weapon = 17 ,
2017-12-26 22:45:26 +08:00
Unk18 = 18 ,
Unk22 = 22 ,
Unk23 = 23 ,
2017-12-23 04:56:39 +08:00
RadioStationsDLC = 24 , //
RadioDLC = 25 ,
DLCMusic = 26 ,
2017-12-26 22:45:26 +08:00
Unk27 = 27 ,
Unk28 = 28 ,
Unk29 = 29 ,
2017-12-23 04:56:39 +08:00
PedPVG = 30 , //maybe Ped Voice Group?
2017-12-26 22:45:26 +08:00
Unk31 = 31 ,
2017-12-23 04:56:39 +08:00
AmbientEmitterList = 32 ,
2017-12-26 22:45:26 +08:00
Unk33 = 33 ,
Unk35 = 35 ,
Unk36 = 36 ,
2017-12-23 04:56:39 +08:00
AmbientZone = 37 ,
AmbientEmitter = 38 ,
AmbientZoneList = 39 ,
2017-12-26 22:45:26 +08:00
Unk40 = 40 ,
Unk41 = 41 ,
Unk42 = 42 ,
Interior = 44 ,
Unk45 = 45 ,
InteriorRoom = 46 ,
Unk47 = 47 ,
Unk48 = 48 ,
Unk49 = 49 ,
2017-12-23 04:56:39 +08:00
WeaponAudioItem = 50 ,
2017-12-26 22:45:26 +08:00
Unk51 = 51 ,
Mod = 52 , //what actually is a "mod" here? a change in some audio settings maybe?
Unk53 = 53 ,
Unk54 = 54 ,
Unk55 = 55 ,
Unk56 = 56 ,
2017-12-23 04:56:39 +08:00
Aeroplane = 57 ,
2017-12-26 22:45:26 +08:00
Unk59 = 59 ,
2017-12-23 04:56:39 +08:00
Mood = 62 ,
2017-12-18 03:35:08 +08:00
StartTrackAction = 63 ,
StopTrackAction = 64 ,
SetMoodAction = 65 ,
2017-12-23 04:56:39 +08:00
PlayerAction = 66 ,
2017-12-18 03:35:08 +08:00
StartOneShotAction = 67 ,
StopOneShotAction = 68 ,
2017-12-26 22:45:26 +08:00
Unk69 = 69 ,
Unk70 = 70 ,
Unk71 = 71 ,
Unk72 = 72 ,
2017-12-18 03:35:08 +08:00
AnimalParams = 73 ,
2017-12-26 22:45:26 +08:00
Unk74 = 74 ,
Unk75 = 75 ,
2017-12-23 04:56:39 +08:00
VehicleScannerParams = 76 , //maybe not just vehicle
2017-12-26 22:45:26 +08:00
Unk77 = 77 ,
Unk78 = 78 ,
Unk79 = 79 ,
Unk80 = 80 ,
Unk81 = 81 ,
Unk82 = 82 ,
Unk83 = 83 ,
Unk84 = 84 ,
Unk85 = 85 ,
Unk86 = 86 ,
2017-12-23 04:56:39 +08:00
Explosion = 87 ,
VehicleEngineGranular = 88 , //maybe not just vehicle
2017-12-18 03:35:08 +08:00
ShoreLinePool = 90 ,
ShoreLineLake = 91 ,
ShoreLineRiver = 92 ,
ShoreLineOcean = 93 ,
ShoreLineList = 94 ,
2017-12-26 22:45:26 +08:00
Unk95 = 95 ,
Unk96 = 96 ,
2017-12-18 03:35:08 +08:00
RadioDjSpeechAction = 98 ,
2017-12-26 22:45:26 +08:00
Unk99 = 99 ,
Unk100 = 100 ,
Unk101 = 101 ,
2017-12-18 03:35:08 +08:00
FadeOutRadioAction = 102 ,
FadeInRadioAction = 103 ,
2017-12-26 22:45:26 +08:00
ForceRadioTrackAction = 104 ,
Unk105 = 105 ,
Unk106 = 106 ,
Unk107 = 107 ,
Unk108 = 108 ,
Unk109 = 109 ,
Unk110 = 110 ,
Unk111 = 111 ,
Unk112 = 112 ,
Unk113 = 113 ,
Unk114 = 114 ,
Unk115 = 115 ,
Unk116 = 116 ,
Unk117 = 117 ,
Unk118 = 118 ,
Unk119 = 119 ,
Unk120 = 120 ,
Unk121 = 121 ,
2017-12-18 03:35:08 +08:00
}
[TC(typeof(EXP))] public class Dat151RelData : RelData
{
public Dat151RelType Type { get ; set ; }
2017-12-20 07:52:50 +08:00
public static int TotCount = 0 ; //###############DEBUGG
public static List < string > FoundCoords = new List < string > ( ) ; //###############DEBUGG
public void RecVec ( Vector3 v )
{
float tol = 20.0f ;
if ( ( Math . Abs ( v . X ) > tol ) | | ( Math . Abs ( v . Y ) > tol ) | | ( Math . Abs ( v . Z ) > tol ) )
{
FoundCoords . Add ( FloatUtil . GetVector3String ( v ) + ", " + GetNameString ( ) ) ;
}
}
2017-12-18 03:35:08 +08:00
public Dat151RelData ( ) { }
public Dat151RelData ( RelData d , BinaryReader br ) : base ( d )
{
Type = ( Dat151RelType ) TypeID ;
}
public override string ToString ( )
{
return GetBaseString ( ) + ": " + Type . ToString ( ) ;
}
}
2017-12-20 07:52:50 +08:00
[TC(typeof(EXP))] public class Dat151Sound : RelSound
{
public Dat151RelType Type { get ; set ; }
2017-12-18 03:35:08 +08:00
2017-12-20 07:52:50 +08:00
public Dat151Sound ( RelData d , BinaryReader br ) : base ( d , br )
{
Type = ( Dat151RelType ) TypeID ;
}
2017-12-18 03:35:08 +08:00
2017-12-20 07:52:50 +08:00
public override string ToString ( )
{
return GetBaseString ( ) + ": " + Type . ToString ( ) ;
}
}
2017-12-22 04:26:04 +08:00
public enum Dat151ZoneShape : uint
{
Box = 0 ,
Sphere = 1 ,
Line = 2 ,
}
2017-12-26 22:45:26 +08:00
[TC(typeof(EXP))] public class Dat151AmbientEmitterList : Dat151RelData
{
public uint UnkOffset0 { get ; set ; }
public uint EmitterCount { get ; set ; }
public MetaHash [ ] EmitterHashes { get ; set ; }
public Dat151AmbientEmitterList ( RelData d , BinaryReader br ) : base ( d , br )
{
br . BaseStream . Position = 0 ; //1 byte was read already (TypeID)
UnkOffset0 = ( ( br . ReadUInt32 ( ) > > 8 ) & 0xFFFFFF ) ;
EmitterCount = br . ReadUInt32 ( ) ;
EmitterHashes = new MetaHash [ EmitterCount ] ;
for ( int i = 0 ; i < EmitterCount ; i + + )
{
EmitterHashes [ i ] = br . ReadUInt32 ( ) ;
}
long bytesleft = br . BaseStream . Length - br . BaseStream . Position ;
if ( bytesleft ! = 0 )
{ } //no hits here
}
}
2017-12-23 04:56:39 +08:00
[TC(typeof(EXP))] public class Dat151AmbientZone : Dat151RelData
2017-12-20 07:52:50 +08:00
{
public uint UnkOffset0 { get ; set ; }
public FlagsUint Flags00 { get ; set ; }
2017-12-22 04:26:04 +08:00
public Dat151ZoneShape Shape { get ; set ; }
2017-12-20 07:52:50 +08:00
public FlagsUint Flags02 { get ; set ; }
2017-12-22 04:26:04 +08:00
public Vector3 OuterPos { get ; set ; }
public float Unused01 { get ; set ; }
public Vector3 OuterSize { get ; set ; }
public float Unused02 { get ; set ; }
public Vector4 OuterVec1 { get ; set ; }
public Vector4 OuterVec2 { get ; set ; }
public uint OuterAngle { get ; set ; }
public Vector3 OuterVec3 { get ; set ; }
public Vector3 InnerPos { get ; set ; }
public float Unused06 { get ; set ; }
public Vector3 InnerSize { get ; set ; }
public float Unused07 { get ; set ; }
public Vector4 InnerVec1 { get ; set ; }
public Vector4 InnerVec2 { get ; set ; }
public uint InnerAngle { get ; set ; }
public Vector3 InnerVec3 { get ; set ; }
public Vector4 Vec11 { get ; set ; }
public Vector4 Vec12 { get ; set ; }
public Vector4 Vec13 { get ; set ; }
2017-12-20 07:52:50 +08:00
2017-12-20 21:49:56 +08:00
public FlagsUint Flags05 { get ; set ; }
public byte Unk14 { get ; set ; }
public byte Unk15 { get ; set ; }
public ushort HashesCount { get ; set ; }
public byte Unk16 { get ; set ; }
public MetaHash [ ] Hashes { get ; set ; }
public uint ExtParamsCount { get ; set ; }
public ExtParam [ ] ExtParams { get ; set ; }
public struct ExtParam
2017-12-20 07:52:50 +08:00
{
2017-12-20 21:49:56 +08:00
public MetaHash Hash { get ; set ; }
public float Value { get ; set ; }
public ExtParam ( BinaryReader br )
{
Hash = br . ReadUInt32 ( ) ;
Value = br . ReadSingle ( ) ;
}
public override string ToString ( )
{
return Hash . ToString ( ) + ": " + FloatUtil . ToString ( Value ) ;
}
}
2017-12-20 07:52:50 +08:00
2017-12-22 04:26:04 +08:00
2017-12-23 04:56:39 +08:00
public Dat151AmbientZone ( RelData d , BinaryReader br ) : base ( d , br )
2017-12-20 21:49:56 +08:00
{
2017-12-20 07:52:50 +08:00
br . BaseStream . Position = 0 ; //1 byte was read already (TypeID)
UnkOffset0 = ( ( br . ReadUInt32 ( ) > > 8 ) & 0xFFFFFF ) ;
Flags00 = br . ReadUInt32 ( ) ;
2017-12-22 04:26:04 +08:00
Shape = ( Dat151ZoneShape ) br . ReadUInt32 ( ) ;
2017-12-20 07:52:50 +08:00
Flags02 = br . ReadUInt32 ( ) ;
2017-12-22 04:26:04 +08:00
OuterPos = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Unused01 = br . ReadSingle ( ) ;
OuterSize = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Unused02 = br . ReadSingle ( ) ;
OuterVec1 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
OuterVec2 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
OuterAngle = br . ReadUInt32 ( ) ; //###
OuterVec3 = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
InnerPos = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Unused06 = br . ReadSingle ( ) ;
InnerSize = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Unused07 = br . ReadSingle ( ) ;
InnerVec1 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
InnerVec2 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
InnerAngle = br . ReadUInt32 ( ) ; //###
InnerVec3 = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Vec11 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Vec12 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Vec13 = new Vector4 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
2017-12-20 07:52:50 +08:00
2017-12-20 21:49:56 +08:00
Flags05 = br . ReadUInt32 ( ) ;
Unk14 = br . ReadByte ( ) ;
Unk15 = br . ReadByte ( ) ;
HashesCount = br . ReadByte ( ) ;
Unk16 = br . ReadByte ( ) ;
Hashes = new MetaHash [ HashesCount ] ;
for ( int i = 0 ; i < HashesCount ; i + + )
2017-12-20 07:52:50 +08:00
{
2017-12-20 21:49:56 +08:00
Hashes [ i ] = br . ReadUInt32 ( ) ;
2017-12-20 07:52:50 +08:00
}
2017-12-20 21:49:56 +08:00
ExtParamsCount = br . ReadUInt32 ( ) ;
ExtParams = new ExtParam [ ExtParamsCount ] ;
for ( int i = 0 ; i < ExtParamsCount ; i + + )
{
ExtParams [ i ] = new ExtParam ( br ) ;
}
if ( ExtParamsCount ! = 0 )
2017-12-20 07:52:50 +08:00
{ }
2017-12-20 21:49:56 +08:00
var data = this . Data ;
long bytesleft = br . BaseStream . Length - br . BaseStream . Position ;
if ( bytesleft ! = 0 )
{
2017-12-22 04:26:04 +08:00
//byte[] remainder = br.ReadBytes((int)bytesleft);
//for (int i = 0; i < remainder.Length; i++)
//{
// if (remainder[i] != 0)
// { } //no hits here! probably got everything, i'm assuming the block is padded to 0x10 or something.
//}
2017-12-20 21:49:56 +08:00
}
2017-12-22 04:26:04 +08:00
//RecVec(Pos01);//debug coords output
//RecVec(Pos06);
2017-12-20 07:52:50 +08:00
2017-12-22 04:26:04 +08:00
if ( Unused01 ! = 0 )
{ } //no hit
if ( Unused02 ! = 0 )
{ } //no hit
if ( Unused06 ! = 0 )
{ } //no hit
if ( Unused07 ! = 0 )
{ } //no hit
if ( Shape ! = 0 )
{ } //eg 1, 2
if ( Flags02 . Value ! = 0 )
{ } //no hit
if ( OuterAngle > 360 )
{ } //no hit
if ( InnerAngle > 360 )
{ } //no hit
if ( Flags05 . Value ! = 0 )
{ } //eg 0xAE64583B, 0x61083310, 0xCAE96294, 0x1C376176
2017-12-20 07:52:50 +08:00
}
}
2017-12-23 04:56:39 +08:00
[TC(typeof(EXP))] public class Dat151AmbientEmitter : Dat151RelData
2017-12-20 07:52:50 +08:00
{
public uint UnkOffset0 { get ; set ; }
public FlagsUint Unk00 { get ; set ; }
public FlagsUint Unk01 { get ; set ; }
public FlagsUint Unk02 { get ; set ; }
public Vector3 Position { get ; set ; }
public FlagsUint Unk03 { get ; set ; } //0
public MetaHash Unk04 { get ; set ; }
public MetaHash Unk05 { get ; set ; }
public FlagsUint Unk06 { get ; set ; } //0
public FlagsUint Unk07 { get ; set ; } //0xFFFFFFFF
public FlagsUint Unk08 { get ; set ; } //0
public float Unk09 { get ; set ; } //1, 5, 100, ...
2017-12-22 04:26:04 +08:00
public float InnerRad { get ; set ; } //0, 4, ... 100 ... min value?
public float OuterRad { get ; set ; } //15, 16, 12, 10, 20, 300 ... max value?
2017-12-20 07:52:50 +08:00
public FlagsByte Unk12 { get ; set ; }
public FlagsByte Unk13 { get ; set ; } //0,1,2,3,4,5
public FlagsByte Unk14 { get ; set ; }
public FlagsByte Unk15 { get ; set ; } //0,1,2,3,4,5
public FlagsUshort Unk16 { get ; set ; } //0..600
public FlagsUshort Unk17 { get ; set ; } //0..150
public FlagsByte Unk18 { get ; set ; } //0,1,2
public FlagsByte Unk19 { get ; set ; } //0,1,2
public FlagsByte Unk20 { get ; set ; } //1,2,3,4,8,255
public FlagsByte Unk21 { get ; set ; } //1,2,3,4,5,6,8,10,255
public FlagsByte Unk22 { get ; set ; } //0, 50, 80, 100
public FlagsByte Unk23 { get ; set ; } //1,2,3,5
public ushort ExtParamCount { get ; set ; } //0,1,2,4
public ExtParam [ ] ExtParams { get ; set ; }
public struct ExtParam
{
public MetaHash Hash ;
public float Value ;
public uint Flags ;
public ExtParam ( BinaryReader br )
{
Hash = br . ReadUInt32 ( ) ;
Value = br . ReadSingle ( ) ;
Flags = br . ReadUInt32 ( ) ;
}
public override string ToString ( )
{
return Hash . ToString ( ) + ": " + FloatUtil . ToString ( Value ) + ": " + Flags . ToString ( ) ;
}
}
2017-12-23 04:56:39 +08:00
public Dat151AmbientEmitter ( RelData d , BinaryReader br ) : base ( d , br )
2017-12-20 07:52:50 +08:00
{
br . BaseStream . Position = 0 ; //1 byte was read already (TypeID)
UnkOffset0 = ( ( br . ReadUInt32 ( ) > > 8 ) & 0xFFFFFF ) ;
Unk00 = br . ReadUInt32 ( ) ;
Unk01 = br . ReadUInt32 ( ) ;
Unk02 = br . ReadUInt32 ( ) ;
Position = new Vector3 ( br . ReadSingle ( ) , br . ReadSingle ( ) , br . ReadSingle ( ) ) ;
Unk03 = br . ReadUInt32 ( ) ; //0
Unk04 = br . ReadUInt32 ( ) ;
Unk05 = br . ReadUInt32 ( ) ;
Unk06 = br . ReadUInt32 ( ) ; //0
Unk07 = br . ReadUInt32 ( ) ; //0xFFFFFFFF
Unk08 = br . ReadUInt32 ( ) ; //0
Unk09 = br . ReadSingle ( ) ; //1, 5, 100, ...
2017-12-22 04:26:04 +08:00
InnerRad = br . ReadSingle ( ) ; //0, 4, ... 100 ... min value?
OuterRad = br . ReadSingle ( ) ; //15, 16, 12, 10, 20, 300 ... max value?
2017-12-20 07:52:50 +08:00
Unk12 = br . ReadByte ( ) ;
Unk13 = br . ReadByte ( ) ; //0,1,2,3,4,5
Unk14 = br . ReadByte ( ) ;
Unk15 = br . ReadByte ( ) ; //0,1,2,3,4,5
Unk16 = br . ReadUInt16 ( ) ; //0..600
Unk17 = br . ReadUInt16 ( ) ; //0..150
Unk18 = br . ReadByte ( ) ; //0,1,2
Unk19 = br . ReadByte ( ) ; //0,1,2
Unk20 = br . ReadByte ( ) ; //1,2,3,4,8,255
Unk21 = br . ReadByte ( ) ; //1,2,3,4,5,6,8,10,255
Unk22 = br . ReadByte ( ) ; //0, 50, 80, 100
Unk23 = br . ReadByte ( ) ; //1,2,3,5
ExtParamCount = br . ReadUInt16 ( ) ; //0,1,2,4
if ( ExtParamCount > 0 )
{
ExtParams = new ExtParam [ ExtParamCount ] ;
for ( int i = 0 ; i < ExtParamCount ; i + + )
{
ExtParams [ i ] = new ExtParam ( br ) ;
}
//array seems to be padded to multiples of 16 bytes. (read the rest here)
int brem = ( 16 - ( ( ExtParamCount * 12 ) % 16 ) ) % 16 ;
if ( brem > 0 )
{
byte [ ] brema = br . ReadBytes ( brem ) ;
//for (int i = 0; i < brem; i++)
//{
// if (brema[i] != 0)
// { } //check all remaining bytes are 0 - never hit here
//}
}
}
switch ( Unk12 . Value ) //no pattern?
{
default :
break ;
}
switch ( Unk13 . Value )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
break ;
default :
break ;
}
switch ( Unk14 . Value ) //no pattern?
{
default :
break ;
}
switch ( Unk15 . Value )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
break ;
default :
break ;
}
switch ( Unk16 . Value )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 :
case 12 :
case 13 :
case 14 :
case 15 :
case 16 :
case 18 :
case 20 :
case 22 :
case 24 :
case 25 :
case 26 :
case 30 :
case 32 :
case 35 :
case 40 :
case 45 :
case 48 :
case 50 :
case 51 :
case 54 :
case 55 :
case 57 :
case 60 :
case 64 :
case 65 :
case 70 :
case 75 :
case 80 :
case 90 :
case 95 :
case 97 :
case 100 :
case 120 :
case 125 :
case 130 :
case 135 :
case 140 :
case 145 :
case 150 :
case 160 :
case 170 :
case 178 :
case 180 :
case 190 :
case 200 :
case 220 :
case 225 :
case 240 :
case 245 :
case 250 :
case 300 :
case 350 :
case 500 :
case 600 :
break ;
default :
break ;
}
switch ( Unk17 . Value )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 12 :
case 15 :
case 17 :
case 20 :
case 21 :
case 22 :
case 25 :
case 27 :
case 30 :
case 32 :
case 35 :
case 40 :
case 50 :
case 60 :
case 100 :
case 150 :
break ;
default :
break ;
}
switch ( Unk18 . Value )
{
case 0 :
case 1 :
case 2 :
break ;
default :
break ;
}
switch ( Unk19 . Value )
{
case 0 :
case 1 :
case 2 :
break ;
default :
break ;
}
switch ( Unk20 . Value )
{
case 1 :
case 2 :
case 3 :
case 4 :
case 8 :
case 255 :
break ;
default :
break ;
}
switch ( Unk21 . Value )
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 8 :
case 10 :
case 255 :
break ;
default :
break ;
}
switch ( Unk22 . Value )
{
case 0 :
case 50 :
case 80 :
case 100 :
break ;
default :
break ;
}
switch ( Unk23 . Value )
{
case 1 :
case 2 :
case 3 :
case 5 :
break ;
default :
break ;
}
switch ( ExtParamCount )
{
case 0 :
case 1 :
case 2 :
case 4 :
break ;
default :
break ;
}
//if ((Position.X != 0) || (Position.Y != 0) || (Position.Z != 0))
//{
// FoundCoords.Add(FloatUtil.GetVector3String(Position) + ", " + GetNameString());
//}
long bytesleft = br . BaseStream . Length - br . BaseStream . Position ;
if ( bytesleft ! = 0 )
{ }
}
}
2017-12-26 22:45:26 +08:00
[TC(typeof(EXP))] public class Dat151AmbientZoneList : Dat151RelData
{
public uint UnkOffset0 { get ; set ; }
public uint ZoneCount { get ; set ; }
public MetaHash [ ] ZoneHashes { get ; set ; }
public Dat151AmbientZoneList ( RelData d , BinaryReader br ) : base ( d , br )
{
br . BaseStream . Position = 0 ; //1 byte was read already (TypeID)
UnkOffset0 = ( ( br . ReadUInt32 ( ) > > 8 ) & 0xFFFFFF ) ;
ZoneCount = br . ReadUInt32 ( ) ;
ZoneHashes = new MetaHash [ ZoneCount ] ;
for ( int i = 0 ; i < ZoneCount ; i + + )
{
ZoneHashes [ i ] = br . ReadUInt32 ( ) ;
}
long bytesleft = br . BaseStream . Length - br . BaseStream . Position ;
if ( bytesleft ! = 0 )
{ } //no hits here
}
}
2017-12-18 03:35:08 +08:00
2017-09-21 18:33:05 +08:00
}