Fixed crash when reading game settings
This commit is contained in:
parent
6ed3e101d9
commit
e7fbce93e2
@ -1,15 +1,24 @@
|
||||
namespace SoulstormReplayReader.Core.Domain;
|
||||
|
||||
public sealed class GameSettings
|
||||
public sealed class GameSettings(int gameSettingsCount = 8)
|
||||
{
|
||||
public byte AiDifficulty { get; set; }
|
||||
public byte StartResources { get; set; }
|
||||
public byte LockTeams { get; set; }
|
||||
public byte CheatsOn { get; set; }
|
||||
public byte StartingLocation { get; set; }
|
||||
public byte GameSpeed { get; set; }
|
||||
public byte ResourceSharing { get; set; }
|
||||
public byte ResourceRate { get; set; }
|
||||
private readonly Dictionary<string, int> _settings = new(gameSettingsCount);
|
||||
public IReadOnlyDictionary<string, int> Settings => _settings;
|
||||
|
||||
public void AddSetting(string name, int value)
|
||||
{
|
||||
_settings.Add(name, value);
|
||||
}
|
||||
|
||||
public int AiDifficulty => _settings["FDIA"]; // FDIA = AIDF = AI Difficulty
|
||||
public int StartResources => _settings["TSSR"]; // TSSR = RSST = Starting Resources
|
||||
public int LockTeams => _settings["MTKL"]; // MTKL = LKTM = Lock Teams
|
||||
public int CheatsOn => _settings["AEHC"]; // AEHC = CHEA = Cheats Enabled
|
||||
public int StartingLocation => _settings["COLS"]; // COLS = SLOC = Starting Location
|
||||
public int GameSpeed => _settings["DPSG"]; // DPSG = GSPD = Game Speed
|
||||
public int ResourceSharing => _settings["HSSR"]; // HSSR = RSSH = Resource Sharing
|
||||
public int ResourceRate => _settings["TRSR"]; // TRSR = RSRT = Resource Rate
|
||||
public int DisableFlyers => _settings["YLFN"]; // YLFN = NFLY = No flyers
|
||||
|
||||
public bool IsQuickStart => StartResources == 1;
|
||||
public bool AreCheatsOn => CheatsOn == 1;
|
||||
|
||||
@ -23,7 +23,7 @@ public sealed class ReplayModel
|
||||
public List<IGameAction> Actions { get; set; }
|
||||
public List<ChatMessageModel> ChatMessages { get; set; }
|
||||
|
||||
public GameSettings GameSettings { get; } = new();
|
||||
public GameSettings GameSettings { get; set; }
|
||||
public WinConditions WinConditions { get; } = new();
|
||||
|
||||
public Exception Exception { get; set; }
|
||||
|
||||
@ -152,7 +152,6 @@ public sealed class SsReplayReader(Stream stream) : IDisposable
|
||||
|
||||
_binaryReader.SkipInt32(3);
|
||||
Replay.WorldSeed = _binaryReader.ReadUInt32();
|
||||
_binaryReader.SkipInt32(); // Размер слотов в игре. Всегда 8
|
||||
|
||||
Descriptor.DataBaseStart = _binaryReader.Position;
|
||||
Descriptor.DataBaseSize = Descriptor.DataBaseChunkSize - 20;
|
||||
@ -188,42 +187,30 @@ public sealed class SsReplayReader(Stream stream) : IDisposable
|
||||
// Game setting:
|
||||
// * 0000 - value
|
||||
// * AAAA - compact name
|
||||
// res: 0000COLS = (0000)random (COLS=SLOC)Starting locations
|
||||
// res: 0000COLS = (0000)(COLS=SLOC=Starting locations)
|
||||
private void ReadGameSettings()
|
||||
{
|
||||
Replay.GameSettings.AiDifficulty = _binaryReader.ReadByte(); // FDIA = AIDF = AI Difficulty
|
||||
_binaryReader.Skip(7);
|
||||
var gameSettingsCount = _binaryReader.ReadInt32();
|
||||
Replay.GameSettings = new GameSettings(gameSettingsCount);
|
||||
|
||||
Replay.GameSettings.StartResources = _binaryReader.ReadByte(); // TSSR = RSST = Starting Resources
|
||||
_binaryReader.Skip(7);
|
||||
for (var i = 0; i < gameSettingsCount; i++)
|
||||
{
|
||||
var value = _binaryReader.ReadInt32();
|
||||
var name = _binaryReader.ReadAsciiString(4);
|
||||
Replay.GameSettings.AddSetting(name, value);
|
||||
}
|
||||
|
||||
Replay.GameSettings.LockTeams = _binaryReader.ReadByte(); // MTKL = LKTM = Lock Teams
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
Replay.GameSettings.CheatsOn = _binaryReader.ReadByte(); // AEHC = CHEA = Cheats Enabled
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
Replay.GameSettings.StartingLocation = _binaryReader.ReadByte(); // COLS = SLOC = Starting Location
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
Replay.GameSettings.GameSpeed = _binaryReader.ReadByte(); // DPSG = GSPD = Game Speed
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
Replay.GameSettings.ResourceSharing = _binaryReader.ReadByte(); // HSSR = RSSH = Resource Sharing
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
Replay.GameSettings.ResourceRate = _binaryReader.ReadByte(); // TRSR = RSRT = Resource Rate
|
||||
_binaryReader.Skip(7);
|
||||
|
||||
#if DEBUGLOGGING
|
||||
Console.WriteLine($"{Replay.GameSettings.AiDifficulty} " +
|
||||
$"{Replay.GameSettings.StartResources} " +
|
||||
$"{Replay.GameSettings.LockTeams} " +
|
||||
$"{Replay.GameSettings.CheatsOn} " +
|
||||
$"{Replay.GameSettings.StartingLocation} " +
|
||||
$"{Replay.GameSettings.GameSpeed} " +
|
||||
$"{Replay.GameSettings.ResourceSharing} " +
|
||||
$"{Replay.GameSettings.ResourceRate}"
|
||||
#if DEBUG
|
||||
Console.WriteLine($"Game settings ({gameSettingsCount}):\n"
|
||||
+ $"AI Difficulty: {Replay.GameSettings.AiDifficulty}\n"
|
||||
+ $"Starting Resources: {Replay.GameSettings.StartResources}\n"
|
||||
+ $"Lock Teams: {Replay.GameSettings.LockTeams}\n"
|
||||
+ $"Cheats Enabled: {Replay.GameSettings.CheatsOn}\n"
|
||||
+ $"Starting Location: {Replay.GameSettings.StartingLocation}\n"
|
||||
+ $"Game Speed: {Replay.GameSettings.GameSpeed}\n"
|
||||
+ $"Resource Sharing: {Replay.GameSettings.ResourceSharing}\n"
|
||||
+ $"Resource Rate: {Replay.GameSettings.ResourceRate}\n"
|
||||
+ $"No flyers: {Replay.GameSettings.DisableFlyers}\n"
|
||||
);
|
||||
#endif
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
string[] filePaths =
|
||||
{
|
||||
@"TestReplaysDE\Broken\2p_blood_river_[Rem].2025-10-26.18-13-28.rec",
|
||||
// @"TestReplays\replay_6p_2v2v2_001.rec",
|
||||
// @"TestReplays\gens_builds\ork_many_researches.rec",
|
||||
// @"TestReplays\lag\lag3.rec",
|
||||
@ -18,6 +19,8 @@ string[] filePaths =
|
||||
// "TestReplays\\unification_anon_2_races.rec"
|
||||
// "TestReplays\\Unfair\\Bugs\\SoB_2commanders_1squad.rec",
|
||||
// @"TestReplays\Unfair\Cheats\eresArchitect_delet.rec",
|
||||
// @"TestReplays\Unfair\Cheats\deleted_necron_mainbuilding.rec",
|
||||
// @"TestReplays\destroy_actions\destroy_necron_mainbuilding.rec",
|
||||
// @"TestReplays\Broken\#860994_empty_name.rec",
|
||||
// "TestReplays\\Unfair\\Cheats\\mono_in_1_min.rec",
|
||||
// @"TestReplays\old\BM.rec"
|
||||
@ -25,6 +28,7 @@ string[] filePaths =
|
||||
};
|
||||
string[] dirPaths =
|
||||
{
|
||||
// "TestReplaysDE",
|
||||
// "TestReplays\\Many",
|
||||
// "TestReplays\\Many",
|
||||
// "TestReplays\\Many",
|
||||
@ -72,6 +76,9 @@ foreach (var replayPath in replayPaths)
|
||||
};
|
||||
var replay = replayReader.ReadFull();
|
||||
|
||||
Console.WriteLine(string.Join('\n', replay.Players.Select(x => $"{x.Name} {x.Badge.Name} {x.ColorScheme.Eyes}")));
|
||||
|
||||
Console.WriteLine(replay.Version);
|
||||
Console.WriteLine(string.Join(' ', replay.WinConditions));
|
||||
|
||||
// #if DEBUGLOGGING
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="TestReplays/**" CopyToOutputDirectory="PreserveNewest"/>
|
||||
<None Include="TestReplaysDE/**" CopyToOutputDirectory="PreserveNewest"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
SoulstormReplayReader.Playground/TestReplaysDE/8p_dowDE.rec
Normal file
BIN
SoulstormReplayReader.Playground/TestReplaysDE/8p_dowDE.rec
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user