58 lines
1.6 KiB
C#
58 lines
1.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
|
||
namespace AnotherReplayReader.ReplayFile
|
||
{
|
||
internal sealed class CommandChunk
|
||
{
|
||
public byte CommandId { get; private set; }
|
||
public int PlayerIndex { get; private set; }
|
||
|
||
public static List<CommandChunk> Parse(ReplayChunk chunk)
|
||
{
|
||
if (chunk.Type != 1)
|
||
{
|
||
throw new NotImplementedException();
|
||
}
|
||
|
||
static int ManglePlayerId(byte id)
|
||
{
|
||
return id / 8 - 2;
|
||
}
|
||
|
||
using var reader = chunk.GetReader();
|
||
if (reader.ReadByte() != 1)
|
||
{
|
||
throw new InvalidDataException("Payload first byte not 1");
|
||
}
|
||
|
||
var list = new List<CommandChunk>();
|
||
var numberOfCommands = reader.ReadInt32();
|
||
for (var i = 0; i < numberOfCommands; ++i)
|
||
{
|
||
var commandId = reader.ReadByte();
|
||
var playerId = reader.ReadByte();
|
||
reader.ReadCommandData(commandId);
|
||
list.Add(new CommandChunk
|
||
{
|
||
CommandId = commandId,
|
||
PlayerIndex = ManglePlayerId(playerId)
|
||
});
|
||
}
|
||
|
||
if (reader.BaseStream.Position != reader.BaseStream.Length)
|
||
{
|
||
throw new InvalidDataException("Payload not fully parsed");
|
||
}
|
||
|
||
return list;
|
||
}
|
||
|
||
public override string ToString()
|
||
{
|
||
return $"[玩家 {PlayerIndex},{RA3Commands.GetCommandName(CommandId)}]";
|
||
}
|
||
}
|
||
}
|