Skip to content

Commit

Permalink
Parse demo data (LostArtefacts#651)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahm86 authored May 4, 2024
1 parent 18a0188 commit 3f43352
Show file tree
Hide file tree
Showing 22 changed files with 463 additions and 26 deletions.
76 changes: 76 additions & 0 deletions TRLevelControl/Build/TRDemoBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
using TRLevelControl.Model;

namespace TRLevelControl.Build;

public class TRDemoBuilder<G, I>
where G : Enum
where I : Enum
{
private readonly TRGameVersion _version;

public TRDemoBuilder(TRGameVersion version)
{
_version = version;
}

public TRDemoData<G, I> Read(TRLevelReader reader)
{
ushort numDemoData = reader.ReadUInt16();
if (numDemoData == 0)
{
return null;
}

TRDemoData<G, I> demoData = new()
{
LaraPos = reader.ReadVertex32(),
LaraRot = reader.ReadVertex32(),
LaraRoom = reader.ReadInt32(),
};

if (_version > TRGameVersion.TR1)
{
demoData.LaraLastGun = (G)(object)reader.ReadInt32();
}

int inputData;
while ((inputData = reader.ReadInt32()) != -1)
{
demoData.Inputs.Add((I)(object)inputData);
}

return demoData;
}

public void Write(TRDemoData<G, I> demoData, TRLevelWriter writer)
{
if (demoData == null)
{
writer.Write((ushort)0);
return;
}

byte[] data;
{
using MemoryStream ms = new();
using TRLevelWriter demoWriter = new(ms);

demoWriter.Write(demoData.LaraPos);
demoWriter.Write(demoData.LaraRot);
demoWriter.Write(demoData.LaraRoom);

if (_version > TRGameVersion.TR1)
{
demoWriter.Write((int)(object)demoData.LaraLastGun);
}

demoWriter.Write(demoData.Inputs.Select(i => (int)(object)i));
demoWriter.Write(-1);

data = ms.ToArray();
}

writer.Write((ushort)data.Length);
writer.Write(data);
}
}
18 changes: 14 additions & 4 deletions TRLevelControl/Control/TR1LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ protected override void Read(TRLevelReader reader)

ReadCinematicFrames(reader);

ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
ReadDemoData(reader);

ReadSoundEffects(reader);
}
Expand Down Expand Up @@ -103,8 +102,7 @@ protected override void Write(TRLevelWriter writer)

WriteCinematicFrames(writer);

writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
WriteDemoData(writer);

WriteSoundEffects(writer);
}
Expand Down Expand Up @@ -290,6 +288,18 @@ private void WriteCinematicFrames(TRLevelWriter writer)
writer.Write(_level.CinematicFrames);
}

private void ReadDemoData(TRLevelReader reader)
{
TRDemoBuilder<TR1DemoGun, TR1InputState> builder = new(TRGameVersion.TR1);
_level.DemoData = builder.Read(reader);
}

private void WriteDemoData(TRLevelWriter writer)
{
TRDemoBuilder<TR1DemoGun, TR1InputState> builder = new(TRGameVersion.TR1);
builder.Write(_level.DemoData, writer);
}

private void ReadSoundEffects(TRLevelReader reader)
{
_level.SoundEffects = new();
Expand Down
18 changes: 14 additions & 4 deletions TRLevelControl/Control/TR2LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ protected override void Read(TRLevelReader reader)

ReadCinematicFrames(reader);

ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
ReadDemoData(reader);

ReadSoundEffects(reader);
}
Expand Down Expand Up @@ -103,8 +102,7 @@ protected override void Write(TRLevelWriter writer)

WriteCinematicFrames(writer);

writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
WriteDemoData(writer);

WriteSoundEffects(writer);
}
Expand Down Expand Up @@ -296,6 +294,18 @@ private void WriteCinematicFrames(TRLevelWriter writer)
writer.Write(_level.CinematicFrames);
}

private void ReadDemoData(TRLevelReader reader)
{
TRDemoBuilder<TR2DemoGun, TR2InputState> builder = new(TRGameVersion.TR2);
_level.DemoData = builder.Read(reader);
}

private void WriteDemoData(TRLevelWriter writer)
{
TRDemoBuilder<TR2DemoGun, TR2InputState> builder = new(TRGameVersion.TR2);
builder.Write(_level.DemoData, writer);
}

private void ReadSoundEffects(TRLevelReader reader)
{
_level.SoundEffects = new();
Expand Down
18 changes: 14 additions & 4 deletions TRLevelControl/Control/TR3LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ protected override void Read(TRLevelReader reader)

ReadCinematicFrames(reader);

ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
ReadDemoData(reader);

ReadSoundEffects(reader);
}
Expand Down Expand Up @@ -103,8 +102,7 @@ protected override void Write(TRLevelWriter writer)

WriteCinematicFrames(writer);

writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
WriteDemoData(writer);

WriteSoundEffects(writer);
}
Expand Down Expand Up @@ -296,6 +294,18 @@ private void WriteCinematicFrames(TRLevelWriter writer)
writer.Write(_level.CinematicFrames);
}

private void ReadDemoData(TRLevelReader reader)
{
TRDemoBuilder<TR3DemoGun, TR3InputState> builder = new(TRGameVersion.TR3);
_level.DemoData = builder.Read(reader);
}

private void WriteDemoData(TRLevelWriter writer)
{
TRDemoBuilder<TR3DemoGun, TR3InputState> builder = new(TRGameVersion.TR3);
builder.Write(_level.DemoData, writer);
}

private void ReadSoundEffects(TRLevelReader reader)
{
_level.SoundEffects = new();
Expand Down
7 changes: 3 additions & 4 deletions TRLevelControl/Control/TR4LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -315,16 +315,15 @@ private void WriteEntities(TRLevelWriter writer)
writer.Write(_level.AIEntities);
}

private void ReadDemoData(TRLevelReader reader)
private static void ReadDemoData(TRLevelReader reader)
{
ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
Debug.Assert(numDemoData == 0);
}

private void WriteDemoData(TRLevelWriter writer)
{
writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
writer.Write((ushort)0);
}

private void ReadSoundEffects(TRLevelReader reader)
Expand Down
7 changes: 3 additions & 4 deletions TRLevelControl/Control/TR5LevelControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,16 +367,15 @@ private void WriteEntities(TRLevelWriter writer)
writer.Write(_level.AIEntities);
}

private void ReadDemoData(TRLevelReader reader)
private static void ReadDemoData(TRLevelReader reader)
{
ushort numDemoData = reader.ReadUInt16();
_level.DemoData = reader.ReadBytes(numDemoData);
Debug.Assert(numDemoData == 0);
}

private void WriteDemoData(TRLevelWriter writer)
{
writer.Write((ushort)_level.DemoData.Length);
writer.Write(_level.DemoData);
writer.Write((ushort)0);
}

private void ReadSoundEffects(TRLevelReader reader)
Expand Down
12 changes: 12 additions & 0 deletions TRLevelControl/Model/Common/TRDemoData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace TRLevelControl.Model;

public class TRDemoData<G, I>
where G : Enum
where I : Enum
{
public TRVertex32 LaraPos { get; set; }
public TRVertex32 LaraRot { get; set; }
public int LaraRoom { get; set; }
public G LaraLastGun { get; set; }
public List<I> Inputs { get; set; } = new();
}
6 changes: 6 additions & 0 deletions TRLevelControl/Model/TR1/Enums/TR1DemoGun.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TRLevelControl.Model;

public enum TR1DemoGun
{
None = 0,
}
24 changes: 24 additions & 0 deletions TRLevelControl/Model/TR1/Enums/TR1InputState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace TRLevelControl.Model;

[Flags]
public enum TR1InputState
{
None = 0,
Forward = 1 << 0,
Back = 1 << 1,
Left = 1 << 2,
Right = 1 << 3,
Jump = 1 << 4,
Draw = 1 << 5,
Action = 1 << 6,
Walk = 1 << 7,
Option = 1 << 8,
Look = 1 << 9,
StepLeft = 1 << 10,
StepRight = 1 << 11,
Roll = 1 << 12,
MenuConfirm = 1 << 20,
MenuBack = 1 << 21,
Save = 1 << 22,
Load = 1 << 23,
}
2 changes: 1 addition & 1 deletion TRLevelControl/Model/TR1/TR1Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TR1Level : TRLevelBase
public List<byte> LightMap { get; set; }
public List<TRColour> Palette { get; set; }
public List<TRCinematicFrame> CinematicFrames { get; set; }
public byte[] DemoData { get; set; }
public TRDemoData<TR1DemoGun, TR1InputState> DemoData { get; set; }
public SortedDictionary<TR1SFX, TR1SoundEffect> SoundEffects { get; set; }

public override IEnumerable<TRMesh> DistinctMeshes => Models.Values.SelectMany(m => m.Meshes)
Expand Down
13 changes: 13 additions & 0 deletions TRLevelControl/Model/TR2/Enums/TR2DemoGun.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace TRLevelControl.Model;

public enum TR2DemoGun
{
None = 0,
Pistols = 1,
Autos = 2,
Uzis = 3,
Shotgun = 4,
M16 = 5,
GrenadeLauncher = 6,
Harpoon = 7,
}
25 changes: 25 additions & 0 deletions TRLevelControl/Model/TR2/Enums/TR2InputState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace TRLevelControl.Model;

[Flags]
public enum TR2InputState
{
None = 0,
Forward = 1 << 0,
Back = 1 << 1,
Left = 1 << 2,
Right = 1 << 3,
Jump = 1 << 4,
Draw = 1 << 5,
Action = 1 << 6,
Walk = 1 << 7,
Option = 1 << 8,
Look = 1 << 9,
StepLeft = 1 << 10,
StepRight = 1 << 11,
Roll = 1 << 12,
Flare = 1 << 19,
MenuConfirm = 1 << 20,
MenuBack = 1 << 21,
Save = 1 << 22,
Load = 1 << 23,
}
2 changes: 1 addition & 1 deletion TRLevelControl/Model/TR2/TR2Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class TR2Level : TRLevelBase
public List<TR2Entity> Entities { get; set; }
public List<byte> LightMap { get; set; }
public List<TRCinematicFrame> CinematicFrames { get; set; }
public byte[] DemoData { get; set; }
public TRDemoData<TR2DemoGun, TR2InputState> DemoData { get; set; }
public SortedDictionary<TR2SFX, TR2SoundEffect> SoundEffects { get; set; }

public override IEnumerable<TRMesh> DistinctMeshes => Models.Values.SelectMany(m => m.Meshes)
Expand Down
14 changes: 14 additions & 0 deletions TRLevelControl/Model/TR3/Enums/TR3DemoGun.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace TRLevelControl.Model;

public enum TR3DemoGun
{
None = 0,
Pistols = 1,
DEagle = 2,
Uzis = 3,
Shotgun = 4,
MP5 = 5,
RocketLauncher = 6,
GrenadeLauncher = 7,
Harpoon = 8,
}
27 changes: 27 additions & 0 deletions TRLevelControl/Model/TR3/Enums/TR3InputState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace TRLevelControl.Model;

[Flags]
public enum TR3InputState
{
None = 0,
Forward = 1 << 0,
Back = 1 << 1,
Left = 1 << 2,
Right = 1 << 3,
Jump = 1 << 4,
Draw = 1 << 5,
Action = 1 << 6,
Walk = 1 << 7,
Option = 1 << 8,
Look = 1 << 9,
StepLeft = 1 << 10,
StepRight = 1 << 11,
Roll = 1 << 12,
Flare = 1 << 19,
MenuConfirm = 1 << 20,
MenuBack = 1 << 21,
Save = 1 << 22,
Load = 1 << 23,
Duck = 1 << 30,
Sprint = 1 << 31,
}
2 changes: 1 addition & 1 deletion TRLevelControl/Model/TR3/TR3Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class TR3Level : TRLevelBase
public List<TR3Entity> Entities { get; set; }
public List<byte> LightMap { get; set; }
public List<TRCinematicFrame> CinematicFrames { get; set; }
public byte[] DemoData { get; set; }
public TRDemoData<TR3DemoGun, TR3InputState> DemoData { get; set; }
public SortedDictionary<TR3SFX, TR3SoundEffect> SoundEffects { get; set; }

public override IEnumerable<TRMesh> DistinctMeshes => Models.Values.SelectMany(m => m.Meshes)
Expand Down
1 change: 0 additions & 1 deletion TRLevelControl/Model/TR4/TR4Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ public class TR4Level : TRLevelBase
public List<TRSoundSource<TR4SFX>> SoundSources { get; set; }
public List<TR4Entity> Entities { get; set; }
public List<TR4AIEntity> AIEntities { get; set; }
public byte[] DemoData { get; set; }
public SortedDictionary<TR4SFX, TR4SoundEffect> SoundEffects { get; set; }

public override IEnumerable<TRMesh> DistinctMeshes => Models.Values.SelectMany(m => m.Meshes)
Expand Down
Loading

0 comments on commit 3f43352

Please sign in to comment.