Dat151 progress

This commit is contained in:
dexy 2018-12-25 14:55:46 +11:00
parent 3bfe19bf80
commit df34b6f614
2 changed files with 327 additions and 39 deletions

View File

@ -506,6 +506,10 @@ namespace CodeWalker.GameFiles
{ {
switch ((Dat151RelType)d.TypeID) switch ((Dat151RelType)d.TypeID)
{ {
case Dat151RelType.AmbientEmitterList: return new Dat151AmbientEmitterList(d, br);
case Dat151RelType.AmbientZone: return new Dat151AmbientZone(d, br);
case Dat151RelType.AmbientEmitter: return new Dat151AmbientEmitter(d, br);
case Dat151RelType.AmbientZoneList: return new Dat151AmbientZoneList(d, br);
case Dat151RelType.Collision: return new Dat151Collision(d, br); //maybe for vehicle case Dat151RelType.Collision: return new Dat151Collision(d, br); //maybe for vehicle
case Dat151RelType.WeaponAudioItem: return new Dat151WeaponAudioItem(d, br); case Dat151RelType.WeaponAudioItem: return new Dat151WeaponAudioItem(d, br);
case Dat151RelType.StartTrackAction: return new Dat151StartTrackAction(d, br); case Dat151RelType.StartTrackAction: return new Dat151StartTrackAction(d, br);
@ -534,6 +538,11 @@ namespace CodeWalker.GameFiles
case Dat151RelType.Unk86: return new Dat151Unk86(d, br); case Dat151RelType.Unk86: return new Dat151Unk86(d, br);
case Dat151RelType.Unk81: return new Dat151Unk81(d, br); case Dat151RelType.Unk81: return new Dat151Unk81(d, br);
case Dat151RelType.Unk55: return new Dat151Unk55(d, br); case Dat151RelType.Unk55: return new Dat151Unk55(d, br);
case Dat151RelType.ShoreLinePool: return new Dat151ShoreLinePool(d, br);
case Dat151RelType.ShoreLineLake: return new Dat151ShoreLineLake(d, br);
case Dat151RelType.ShoreLineRiver: return new Dat151ShoreLineRiver(d, br);
case Dat151RelType.ShoreLineOcean: return new Dat151ShoreLineOcean(d, br);
case Dat151RelType.ShoreLineList: return new Dat151ShoreLineList(d, br);
case Dat151RelType.Vehicle: case Dat151RelType.Vehicle:
case Dat151RelType.VehicleEngine: case Dat151RelType.VehicleEngine:
@ -548,11 +557,6 @@ namespace CodeWalker.GameFiles
case Dat151RelType.VehicleScannerParams: //maybe not just vehicle case Dat151RelType.VehicleScannerParams: //maybe not just vehicle
case Dat151RelType.Explosion: case Dat151RelType.Explosion:
case Dat151RelType.VehicleEngineGranular: //maybe not just vehicle case Dat151RelType.VehicleEngineGranular: //maybe not just vehicle
case Dat151RelType.ShoreLinePool:
case Dat151RelType.ShoreLineLake:
case Dat151RelType.ShoreLineRiver:
case Dat151RelType.ShoreLineOcean:
case Dat151RelType.ShoreLineList:
case Dat151RelType.Unk2: case Dat151RelType.Unk2:
case Dat151RelType.Unk7: case Dat151RelType.Unk7:
case Dat151RelType.Unk9: case Dat151RelType.Unk9:
@ -615,10 +619,6 @@ namespace CodeWalker.GameFiles
case Dat151RelType.Unk121: case Dat151RelType.Unk121:
return new Dat151RelData(d, br); return new Dat151RelData(d, br);
case Dat151RelType.AmbientEmitterList: return new Dat151AmbientEmitterList(d, br);
case Dat151RelType.AmbientZone: return new Dat151AmbientZone(d, br);
case Dat151RelType.AmbientEmitter: return new Dat151AmbientEmitter(d, br);
case Dat151RelType.AmbientZoneList: return new Dat151AmbientZoneList(d, br);
default: default:
return new Dat151RelData(d, br); return new Dat151RelData(d, br);
} }
@ -631,9 +631,125 @@ namespace CodeWalker.GameFiles
private void BuildDataBlock()
{
if (RelDatas == null) return;
if (RelDatasSorted == null) return;
switch (RelType)
{
case RelDatFileType.Dat149:
case RelDatFileType.Dat150:
case RelDatFileType.Dat151Parameters:
break;
case RelDatFileType.Dat4://TODO!
case RelDatFileType.Dat54DataEntries://TODO!
default://TODO..?
return;
}
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
bw.Write(DataUnkVal);
RelData lastrd = null;//debug
for (int i = 0; i < RelDatasSorted.Length; i++)
{
var rd = RelDatasSorted[i];
switch ((Dat151RelType)rd.TypeID)
{
case Dat151RelType.AmbientEmitter:
case Dat151RelType.AmbientZone:
case Dat151RelType.Unk101:
case Dat151RelType.Unk35:
while ((ms.Position & 0xF) != 0) bw.Write((byte)0); //pad up to nearest 16 bytes
break;
case Dat151RelType.Mood:
case Dat151RelType.Unk70:
case Dat151RelType.Unk29:
case Dat151RelType.SpeechParams:
case Dat151RelType.Unk11:
case Dat151RelType.Unk41:
case Dat151RelType.Unk2:
case Dat151RelType.AmbientEmitterList:
case Dat151RelType.Weapon:
case Dat151RelType.Vehicle:
case Dat151RelType.StopTrackAction:
while ((ms.Position & 3) != 0) bw.Write((byte)0); //align these to nearest 4 bytes
break;
}
var pos = ms.Position;
if (ms.Position != rd.DataOffset)
{ }
rd.DataOffset = (uint)ms.Position;
rd.Write(bw);
var lengthwritten = ms.Position - pos;
if (lengthwritten != rd.DataLength)
{ }
lastrd = rd;
}
var buf = new byte[ms.Length];
ms.Position = 0;
ms.Read(buf, 0, buf.Length);
if ((DataBlock?.Length ?? 0) != buf.Length)
{ }
DataBlock = buf;
}
private void BuildIndex()
{
if (RelDatas == null) return;
if (RelDatasSorted == null) return;
switch (RelType)
{
case RelDatFileType.Dat149:
case RelDatFileType.Dat150:
case RelDatFileType.Dat151Parameters:
break;
case RelDatFileType.Dat4://TODO!
case RelDatFileType.Dat54DataEntries://TODO!
default://TODO..?
return;
}
//var sorted = RelDatasSorted.ToList();
//sorted.Sort((a, b) => { return ((uint)a.NameHash).CompareTo((uint)b.NameHash); });
//RelDatas = sorted.ToArray();
var hashes = new RelIndexHash[RelDatas.Length];
for (int i = 0; i < RelDatas.Length; i++)
{
var rd = RelDatas[i];
hashes[i] = new RelIndexHash() { Name = rd.NameHash, Offset = rd.DataOffset, Length = rd.DataLength };
}
//if (hashes.Length != IndexHashes.Length)
//{ }
IndexHashes = hashes;
}
private void BuildWavesTracks() private void BuildWavesTracks()
{ {
switch(RelType) if (RelDatasSorted == null) return;
switch (RelType)
{ {
case RelDatFileType.Dat149: case RelDatFileType.Dat149:
case RelDatFileType.Dat150: case RelDatFileType.Dat150:
@ -670,6 +786,7 @@ namespace CodeWalker.GameFiles
private void BuildWavesMaps() private void BuildWavesMaps()
{ {
//for discovering "WavesTracks" offsets
var relType = RelType; var relType = RelType;
switch (RelType) switch (RelType)
@ -821,7 +938,6 @@ namespace CodeWalker.GameFiles
public byte[] Save() public byte[] Save()
{ {
//build DataBlock //build DataBlock
//update DataLength //update DataLength
//update NameTableCount //update NameTableCount
@ -833,6 +949,8 @@ namespace CodeWalker.GameFiles
//update WaveContainersOffsets //update WaveContainersOffsets
//update WaveContainersCount //update WaveContainersCount
BuildDataBlock();
BuildIndex();
BuildWavesTracks(); BuildWavesTracks();
DataLength = (uint)(DataBlock?.Length ?? 0); DataLength = (uint)(DataBlock?.Length ?? 0);
@ -1035,6 +1153,12 @@ namespace CodeWalker.GameFiles
return null; return null;
} }
public virtual void Write(BinaryWriter bw)
{
bw.Write(Data); //fallback for default byte array data writing...
}
public string GetNameString() public string GetNameString()
{ {
return (string.IsNullOrEmpty(Name)) ? NameHash.ToString() : Name; return (string.IsNullOrEmpty(Name)) ? NameHash.ToString() : Name;
@ -2390,21 +2514,25 @@ namespace CodeWalker.GameFiles
return GetBaseString() + ": " + Type.ToString(); return GetBaseString() + ": " + Type.ToString();
} }
} }
[TC(typeof(EXP))] public class Dat151Sound : RelSound
{
public Dat151RelType Type { get; set; }
public Dat151Sound(RelData d, BinaryReader br) : base(d, br) [TC(typeof(EXP))] public struct Dat151HashPair
{ {
Type = (Dat151RelType)TypeID; public MetaHash Hash0 { get; set; }
public MetaHash Hash1 { get; set; }
public Dat151HashPair(MetaHash hash0, MetaHash hash1)
{
Hash0 = hash0;
Hash1 = hash1;
} }
public override string ToString() public override string ToString()
{ {
return GetBaseString() + ": " + Type.ToString(); return Hash0.ToString() + ": " + Hash1.ToString();
} }
} }
public enum Dat151ZoneShape : uint public enum Dat151ZoneShape : uint
{ {
Box = 0, Box = 0,
@ -2529,6 +2657,7 @@ namespace CodeWalker.GameFiles
if (ExtParamsCount != 0) if (ExtParamsCount != 0)
{ } { }
var data = this.Data; var data = this.Data;
long bytesleft = br.BaseStream.Length - br.BaseStream.Position; long bytesleft = br.BaseStream.Length - br.BaseStream.Position;
@ -2917,24 +3046,6 @@ namespace CodeWalker.GameFiles
} }
[TC(typeof(EXP))] public struct Dat151HashPair
{
public MetaHash Hash0 { get; set; }
public MetaHash Hash1 { get; set; }
public Dat151HashPair(MetaHash hash0, MetaHash hash1)
{
Hash0 = hash0;
Hash1 = hash1;
}
public override string ToString()
{
return Hash0.ToString() + ": " + Hash1.ToString();
}
}
[TC(typeof(EXP))] public class Dat151WeaponAudioItem : Dat151RelData [TC(typeof(EXP))] public class Dat151WeaponAudioItem : Dat151RelData
{ {
public MetaHash AudioTrack0 { get; set; } public MetaHash AudioTrack0 { get; set; }
@ -4249,11 +4360,185 @@ namespace CodeWalker.GameFiles
} }
} }
[TC(typeof(EXP))] public class Dat151ShoreLinePool : Dat151RelData
{
public uint Unk01 { get; set; }
public Vector4 Unk02 { get; set; }
public int Unk03 { get; set; }
public int Unk04 { get; set; }
public int Unk05 { get; set; }
public int Unk06 { get; set; }
public int Unk07 { get; set; }
public int Unk08 { get; set; }
public int Unk09 { get; set; }
public int Unk10 { get; set; }
public int Unk11 { get; set; }
public float Unk12 { get; set; }
public int PointsCount { get; set; }
public Vector2[] Points { get; set; }
public Dat151ShoreLinePool(RelData d, BinaryReader br) : base(d, br)
{
Unk01 = br.ReadUInt32();
Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
Unk03 = br.ReadInt32();
Unk04 = br.ReadInt32();
Unk05 = br.ReadInt32();
Unk06 = br.ReadInt32();
Unk07 = br.ReadInt32();
Unk08 = br.ReadInt32();
Unk09 = br.ReadInt32();
Unk10 = br.ReadInt32();
Unk11 = br.ReadInt32();
Unk12 = br.ReadSingle();
PointsCount = br.ReadInt32();
var points = new Vector2[PointsCount];
for (int i = 0; i < PointsCount; i++)
{
points[i] = new Vector2(br.ReadSingle(), br.ReadSingle());
}
Points = points;
var bytesleft = br.BaseStream.Length - br.BaseStream.Position;
if (bytesleft != 0)
{ }
}
}
[TC(typeof(EXP))] public class Dat151ShoreLineLake : Dat151RelData
{
public uint Unk01 { get; set; }
public Vector4 Unk02 { get; set; }
public int Unk03 { get; set; }
public int Unk04 { get; set; }
public uint Unk05 { get; set; }
public int PointsCount { get; set; }
public Vector2[] Points { get; set; }
public Dat151ShoreLineLake(RelData d, BinaryReader br) : base(d, br)
{
Unk01 = br.ReadUInt32();
Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
Unk03 = br.ReadInt32();
Unk04 = br.ReadInt32();
Unk05 = br.ReadUInt32();
byte b1 = (byte)((Unk05) & 0xFF);
byte b2 = (byte)((Unk05>>8) & 0xFF);
PointsCount = b2;
var points = new Vector2[PointsCount];
for (int i = 0; i < PointsCount; i++)
{
points[i] = new Vector2(br.ReadSingle(), br.ReadSingle());
}
Points = points;
var bytesleft = br.BaseStream.Length - br.BaseStream.Position;
if (bytesleft != 0)
{ }
}
}
[TC(typeof(EXP))] public class Dat151ShoreLineRiver : Dat151RelData
{
public uint Unk01 { get; set; }
public Vector4 Unk02 { get; set; }
public float Unk03 { get; set; }
public uint Unk04 { get; set; }
public uint Unk05 { get; set; }
public uint Unk06 { get; set; }
public uint PointsCount { get; set; }
public Vector3[] Points { get; set; }
public Dat151ShoreLineRiver(RelData d, BinaryReader br) : base(d, br)
{
Unk01 = br.ReadUInt32();
Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
Unk03 = br.ReadSingle();
Unk04 = br.ReadUInt32();
Unk05 = br.ReadUInt32();
Unk06 = br.ReadUInt32();
PointsCount = br.ReadUInt32();
var points = new Vector3[PointsCount];
for (int i = 0; i < PointsCount; i++)
{
points[i] = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
}
Points = points;
var bytesleft = br.BaseStream.Length - br.BaseStream.Position;
if (bytesleft != 0)
{ }
}
}
[TC(typeof(EXP))] public class Dat151ShoreLineOcean : Dat151RelData
{
public uint Unk01 { get; set; }
public Vector4 Unk02 { get; set; }
public float Unk03 { get; set; }
public uint Unk04 { get; set; }
public MetaHash Unk05 { get; set; }
public float Unk06 { get; set; }
public float Unk07 { get; set; }
public float Unk08 { get; set; }
public float Unk09 { get; set; }
public float Unk10 { get; set; }
public float Unk11 { get; set; }
public float Unk12 { get; set; }
public uint PointsCount { get; set; }
public Vector2[] Points { get; set; }
public Dat151ShoreLineOcean(RelData d, BinaryReader br) : base(d, br)
{
Unk01 = br.ReadUInt32();
Unk02 = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
Unk03 = br.ReadSingle();
Unk04 = br.ReadUInt32();
Unk05 = br.ReadUInt32();
Unk06 = br.ReadSingle();
Unk07 = br.ReadSingle();
Unk08 = br.ReadSingle();
Unk09 = br.ReadSingle();
Unk10 = br.ReadSingle();
Unk11 = br.ReadSingle();
Unk12 = br.ReadSingle();
PointsCount = br.ReadUInt32();
var points = new Vector2[PointsCount];
for (int i = 0; i < PointsCount; i++)
{
points[i] = new Vector2(br.ReadSingle(), br.ReadSingle());
}
Points = points;
var bytesleft = br.BaseStream.Length - br.BaseStream.Position;
if (bytesleft != 0)
{ }
}
}
[TC(typeof(EXP))] public class Dat151ShoreLineList : Dat151RelData
{
public uint ShoreLineCount { get; set; }
public MetaHash[] ShoreLines { get; set; }
public Dat151ShoreLineList(RelData d, BinaryReader br) : base(d, br)
{
ShoreLineCount = br.ReadUInt32();
var shorelines = new MetaHash[ShoreLineCount];
for (int i = 0; i < ShoreLineCount; i++)
{
shorelines[i] = br.ReadUInt32();
}
ShoreLines = shorelines;
var bytesleft = br.BaseStream.Length - br.BaseStream.Position;
if (bytesleft != 0)
{ }
}
}

View File

@ -2216,12 +2216,15 @@ namespace CodeWalker.GameFiles
{ {
if (data.Length != rbfe.FileUncompressedSize) if (data.Length != rbfe.FileUncompressedSize)
{ } { }
if (data.Length != rel.RawFileData.Length) else if (data.Length != rel.RawFileData.Length)
{ } { }
else
{
for (int i = 0; i < data.Length; i++) //raw file test for (int i = 0; i < data.Length; i++) //raw file test
if (data[i] != rel.RawFileData[i]) if (data[i] != rel.RawFileData[i])
{ } { }
} }
}
RelFile rel2 = new RelFile(); RelFile rel2 = new RelFile();