42 lines
2.1 KiB
C#
42 lines
2.1 KiB
C#
using System.Text;
|
||
using SoulstormReplayReader.Core.Extensions;
|
||
|
||
namespace SoulstormReplayReader.Core.Services;
|
||
|
||
public static class ReplayService
|
||
{
|
||
public static void Rename(Stream inStream, Stream outStream, string newName)
|
||
{
|
||
var binaryReader = new ExBinaryReader(inStream);
|
||
var binaryWriter = new BinaryWriter(outStream);
|
||
|
||
// Костыльное нахождение длины старого имени игры
|
||
binaryReader
|
||
.Skip(182) // Перемещаюсь на позицию после (GameInfo.FOLDWMAN....)
|
||
.Skip(binaryReader.ReadInt32() + 20) // DataSdscSize + 24
|
||
.Skip(85);
|
||
var bytesLengthDifference = (newName.Length - binaryReader.ReadInt32()) * 2;
|
||
binaryReader.Seek(0);
|
||
|
||
binaryWriter.Write(binaryReader.ReadBytes(149 + 4)); // Перемещаюсь к позиции перед размером FOLDINFO
|
||
binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен
|
||
|
||
binaryWriter.Write(binaryReader.ReadBytes(21 + 4)); // Иду к позиции перед размером FOLDWMAN
|
||
|
||
var foldWmanSize = binaryReader.ReadInt32();
|
||
binaryWriter.Write(foldWmanSize);
|
||
binaryWriter.Write(binaryReader.ReadBytes(foldWmanSize + 16)); // Телепортируюсь к позиции перед размером DataBase
|
||
binaryWriter.Write(binaryReader.ReadInt32() + bytesLengthDifference); // Переписываю, добавляя разность длинн имен
|
||
|
||
binaryWriter.Write(binaryReader.ReadBytes(85)); // Первые 85 байт DataBase статичные
|
||
binaryWriter.Write(newName.Length); // После них идет длина имени игры
|
||
|
||
binaryReader.Skip(binaryReader.ReadInt32() * 2);
|
||
binaryWriter.Write(Encoding.Unicode.GetBytes(newName)); // И ее имя
|
||
|
||
while (binaryReader.HasBytes)
|
||
binaryWriter.Write(binaryReader.ReadByte());
|
||
|
||
binaryWriter.Flush();
|
||
}
|
||
} |