From 39ad8eed8391372f0d089881f40371ebcb3e2c32 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Mon, 25 Jan 2021 00:40:22 +0600 Subject: [PATCH] Fix broken images for R290+ --- .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 44 ++++++++++--------- .../EXE/Loaders/Events/Parameters/Group.cs | 5 +-- CTFAK/MMFParser/EXE/Loaders/Frame.cs | 5 ++- .../EXE/Loaders/Objects/Movements.cs | 28 +++++++++++- CTFAK/MMFParser/EXE/Loaders/StringChunk.cs | 1 - CTFAK/MMFParser/EXE/PackData.cs | 6 ++- CTFAK/Utils/Checksum.cs | 4 +- 7 files changed, 62 insertions(+), 31 deletions(-) diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 68fa495..82e4c05 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -17,7 +17,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks public bool SaveImages = false; public Dictionary Images = new Dictionary(); public uint NumberOfItems; - public bool PreloadOnly = false; + public bool PreloadOnly = true; public ImageBank(ByteReader reader) : base(reader) { @@ -149,7 +149,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Handle = Reader.ReadInt32(); if (!Debug) { - // if (Settings.Build>288) Handle -= 1; + if (Settings.Build>=290) Handle -= 1; if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; } @@ -223,7 +223,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks imageReader.Seek(start+ _checksum);//to prevent bugs } - + public void Load() { @@ -232,12 +232,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks ByteReader imageReader; if (!Settings.twofiveplus) imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a); - else imageReader = Reader; + else imageReader = Reader; long start = imageReader.Tell(); - - + + //return; - if(Settings.twofiveplus) imageReader.Skip(4); + if (Settings.twofiveplus) imageReader.Skip(4); _checksum = imageReader.ReadInt32(); _references = imageReader.ReadInt32(); Size = (int) imageReader.ReadUInt32(); @@ -249,7 +249,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks _width = imageReader.ReadInt16(); _height = imageReader.ReadInt16(); _graphicMode = imageReader.ReadByte(); - + Flags.flag = imageReader.ReadByte(); imageReader.Skip(2); @@ -260,10 +260,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks _transparent = imageReader.ReadColor(); // Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}"); byte[] imageData; - if(Settings.twofiveplus) Flags["LZX"] = false; + if (Settings.twofiveplus) Flags["LZX"] = false; if (Flags["LZX"]) { - + uint decompressedSize = imageReader.ReadUInt32(); imageData = Decompressor.decompress_block(imageReader, (int) (imageReader.Size() - imageReader.Tell()), (int) decompressedSize); @@ -276,14 +276,14 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks int bytesRead = 0; rawImg = imageData; - + if (Flags["RLE"] || Flags["RLEW"] || Flags["RLET"]) { - + } else { - + switch (_graphicMode) { case 4: @@ -305,14 +305,14 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks { Logger.Log("Reading 32-bit color"); (_colorArray, bytesRead) = ImageHelper.Read32(imageData, _width, _height); - break; + break; } default: { Logger.Log("Unknown Color Mode"); break; } - + } } @@ -330,16 +330,20 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } } } - /*else if (_transparent != null) + if (Settings.Build > 283) { - for (int i = 0; i < (_height * _width * 4)-3; i++) + if (_transparent != null) { - if (_colorArray[i+1]==_transparent.R&&_colorArray[i+2]==_transparent.G&&_colorArray[i+3]==_transparent.B) + for (int i = 0; i < (_height * _width * 4) - 3; i++) { - _colorArray[i] = _transparent.A; + if (_colorArray[i + 1] == _transparent.R && _colorArray[i + 2] == _transparent.G && + _colorArray[i + 3] == _transparent.B) + { + _colorArray[i] = _transparent.A; + } } } - }*/ + } return; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs index db1000d..c67d59e 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs @@ -22,6 +22,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters Id = Reader.ReadUInt16(); Name = Reader.ReadWideString(); Password = Reader.ReadInt32(); + Password = Checksum.MakeGroupChecksum("", Name); Logger.Log("Password: "+Password); } @@ -30,10 +31,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters Writer.WriteUInt16(Flags); Writer.WriteUInt16(Id); Writer.WriteUnicode(Name,true); - if(true) - { - Password = Checksum.MakeGroupChecksum("", Name); - } Writer.WriteInt32(Password); } diff --git a/CTFAK/MMFParser/EXE/Loaders/Frame.cs b/CTFAK/MMFParser/EXE/Loaders/Frame.cs index 22524f6..cb35b60 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Frame.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Frame.cs @@ -74,7 +74,10 @@ namespace CTFAK.MMFParser.EXE.Loaders { $"Name: {Name}", $"Size: {Width}x{Height}", - $"Objects: {Objects.Count}" + $"Virtual Size: {VirtWidth}x{VirtHeight}", + $"MVTimer: {MovementTimer}", + $"Objects: {Objects.Count}", + }; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs index 31ed7f5..1452115 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs @@ -50,6 +50,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public class Movement : ChunkLoader { + public static int DataSize; public int rootPos; public short Player; public short Type; @@ -70,7 +71,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects var nameOffset = Reader.ReadInt32(); var movementId = Reader.ReadInt32(); var newOffset = Reader.ReadInt32(); - var dataSize = Reader.ReadInt32(); + DataSize = Reader.ReadInt32(); Reader.Seek(rootPos+newOffset); Player = Reader.ReadInt16(); Type = Reader.ReadInt16(); @@ -94,6 +95,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects case 5: Loader=new MovementPath(Reader); break; + case 14: + Loader = new ExtensionsMovement(Reader); + break; } @@ -427,4 +431,26 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects } } + public class ExtensionsMovement:MovementLoader + { + public byte[] Data; + + public ExtensionsMovement(ByteReader reader) : base(reader) + { + } + + public ExtensionsMovement(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Data = Reader.ReadBytes(Movement.DataSize); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteBytes(Data); + } + } } \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs b/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs index dd45a13..85b46f0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs +++ b/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs @@ -13,7 +13,6 @@ namespace CTFAK.MMFParser.EXE.Loaders { Reader = new ByteReader(Chunk.ChunkData); Value = Reader.ReadUniversal(); - Print(true); } public override void Print(bool ext) diff --git a/CTFAK/MMFParser/EXE/PackData.cs b/CTFAK/MMFParser/EXE/PackData.cs index 10a197b..8fb3db6 100644 --- a/CTFAK/MMFParser/EXE/PackData.cs +++ b/CTFAK/MMFParser/EXE/PackData.cs @@ -24,7 +24,9 @@ namespace CTFAK.MMFParser.EXE uint dataSize = exeReader.ReadUInt32(); exeReader.Seek((int)(start + dataSize - 32)); - Logger.Log(exeReader.ReadAscii(4)); + var uheader = exeReader.ReadAscii(4); + if(uheader=="PAMU")Settings.Unicode = true; + else if(uheader=="PAME")Settings.Unicode = false; exeReader.Seek(start + 16); uint formatVersion = exeReader.ReadUInt32(); @@ -47,7 +49,7 @@ namespace CTFAK.MMFParser.EXE } header = exeReader.ReadFourCc(); - Logger.Log(header.GetHex(4)); + Logger.Log("PACK OFFSET: "+offset); exeReader.Seek(offset); for (int i = 0; i < count; i++) diff --git a/CTFAK/Utils/Checksum.cs b/CTFAK/Utils/Checksum.cs index fcb20a1..f160423 100644 --- a/CTFAK/Utils/Checksum.cs +++ b/CTFAK/Utils/Checksum.cs @@ -27,10 +27,10 @@ namespace CTFAK.Utils foreach (char c in pass) { v4 += WrapSingleChar(groupWords[v5] + (c & 0xC3)) ^ 0xF3; - v5++; + v5+=1; if (v5 > groupWords.Length) v5 = 0; } - + Logger.Log("GroupPass:"+v4); return v4; }