From b38d149d6f89e0e93c4cca00d38b30bb34114de1 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Sun, 24 Jan 2021 23:48:40 +0600 Subject: [PATCH] MMF2 Support(beta) --- CTFAK/MMFParser/EXE/ChunkList.cs | 3 ++ .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 6 ++-- CTFAK/MMFParser/EXE/Loaders/Frame.cs | 32 ++++++++++++++++++- .../EXE/Loaders/Objects/Animations.cs | 4 +++ CTFAK/MMFParser/EXE/Loaders/StringChunk.cs | 3 +- CTFAK/MMFParser/EXE/PackData.cs | 17 +++++++--- CTFAK/MMFParser/Translation/PAME2MFA.cs | 10 +----- CTFAK/Settings.cs | 1 + CTFAK/Utils/ByteReader.cs | 6 ++++ 9 files changed, 63 insertions(+), 19 deletions(-) diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index 99caa92..bbf21b5 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -297,6 +297,9 @@ namespace CTFAK.MMFParser.EXE case 13117: loader = new Events(chunk); break; + case 13127: + loader= new MovementTimerBase(chunk); + break; } loader?.Read(); diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 0e89774..68fa495 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -149,7 +149,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Handle = Reader.ReadInt32(); if (!Debug) { - if (Settings.Build>288) Handle -= 1; + // if (Settings.Build>288) Handle -= 1; if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; } @@ -330,7 +330,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } } } - else if (_transparent != null) + /*else if (_transparent != null) { for (int i = 0; i < (_height * _width * 4)-3; i++) { @@ -339,7 +339,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks _colorArray[i] = _transparent.A; } } - } + }*/ return; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Frame.cs b/CTFAK/MMFParser/EXE/Loaders/Frame.cs index 27c9073..22524f6 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Frame.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Frame.cs @@ -56,6 +56,7 @@ namespace CTFAK.MMFParser.EXE.Loaders private Transition _fadeIn; private Transition _fadeOut; private VirtualRect _virtualSize; + private MovementTimerBase _movementTimer; public override void Print(bool ext) @@ -93,6 +94,7 @@ namespace CTFAK.MMFParser.EXE.Loaders _layers = Chunks.GetChunk(); _objects = Chunks.GetChunk(); _events = Chunks.GetChunk(); + _movementTimer = Chunks.GetChunk(); _fadeIn = Chunks.PopChunk(); _fadeOut = Chunks.PopChunk(); @@ -106,6 +108,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public int Height => _header.Height; public int VirtWidth => _virtualSize.Right; public int VirtHeight => _virtualSize.Bottom; + public int MovementTimer => _movementTimer.Value; public string Name => _name?.Value ?? "UNK"; public string Password => _password.Value; public Color Background => _header.Background; @@ -355,7 +358,7 @@ namespace CTFAK.MMFParser.EXE.Loaders YCoeff = Reader.ReadSingle(); NumberOfBackgrounds = Reader.ReadInt32(); BackgroudIndex = Reader.ReadInt32(); - Name = Reader.ReadWideString(); + Name = Reader.ReadUniversal(); } public override void Print(bool ext) @@ -398,4 +401,31 @@ namespace CTFAK.MMFParser.EXE.Loaders public VirtualRect(ByteReader reader) : base(reader){} public VirtualRect(ChunkList.Chunk chunk) : base(chunk){} } + public class MovementTimerBase:ChunkLoader + { + public int Value; + + public MovementTimerBase(ByteReader reader) : base(reader) + { + } + + public MovementTimerBase(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Value = Reader.ReadInt32(); + } + + public override void Print(bool ext) + { + throw new NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new NotImplementedException(); + } + } } \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs index c73b92b..3cbe5f2 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs @@ -90,6 +90,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects dir.Read(); DirectionDict.Add(i,dir); } + else + { + DirectionDict.Add(i,new AnimationDirection((ByteReader) null)); + } } } diff --git a/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs b/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs index 73c8977..dd45a13 100644 --- a/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs +++ b/CTFAK/MMFParser/EXE/Loaders/StringChunk.cs @@ -12,7 +12,8 @@ namespace CTFAK.MMFParser.EXE.Loaders public override void Read() { Reader = new ByteReader(Chunk.ChunkData); - Value = Reader.ReadWideString(); + 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 4de1b7f..10a197b 100644 --- a/CTFAK/MMFParser/EXE/PackData.cs +++ b/CTFAK/MMFParser/EXE/PackData.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using CTFAK.Utils; @@ -17,16 +18,18 @@ namespace CTFAK.MMFParser.EXE long start = exeReader.Tell(); byte[] header = exeReader.ReadBytes(8); - exeReader.Skip(8); + // exeReader.Skip(8); uint headerSize = exeReader.ReadUInt32(); + Debug.Assert(headerSize==32); uint dataSize = exeReader.ReadUInt32(); exeReader.Seek((int)(start + dataSize - 32)); - exeReader.Skip(4); + Logger.Log(exeReader.ReadAscii(4)); exeReader.Seek(start + 16); uint formatVersion = exeReader.ReadUInt32(); - exeReader.Skip(8); + Debug.Assert(exeReader.ReadInt32()==0); + Debug.Assert(exeReader.ReadInt32()==0); uint count = exeReader.ReadUInt32(); @@ -44,7 +47,8 @@ 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++) { @@ -68,7 +72,10 @@ namespace CTFAK.MMFParser.EXE public void Read(ByteReader exeReader) { UInt16 len = exeReader.ReadUInt16(); - PackFilename = exeReader.ReadWideString(len); + PackFilename = exeReader.ReadUniversal(len); + + + Logger.Log(PackFilename); _bingo = exeReader.ReadInt32(); Data = exeReader.ReadBytes(exeReader.ReadInt32()); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index ea81c49..839976c 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -406,19 +406,11 @@ namespace CTFAK.MMFParser.Translation newAnimation.Name = $"User Defined {j}"; var newDirections = new List(); EXE.Loaders.Objects.Animation animation = null; - try - { - if (animHeader.AnimationDict.ContainsKey(origAnim.Key)) + if (animHeader.AnimationDict.ContainsKey(origAnim.Key)) { animation = animHeader?.AnimationDict[origAnim.Key]; } else break; - - } - catch - { - } - if (animation != null) { if (animation.DirectionDict != null) diff --git a/CTFAK/Settings.cs b/CTFAK/Settings.cs index 7490bb7..29e54f3 100644 --- a/CTFAK/Settings.cs +++ b/CTFAK/Settings.cs @@ -32,6 +32,7 @@ namespace CTFAK public static string ProjectPath; public static int Build; + public static bool Unicode; public static bool DoMFA; public static bool UseGUI; diff --git a/CTFAK/Utils/ByteReader.cs b/CTFAK/Utils/ByteReader.cs index 83045fd..979e6c0 100644 --- a/CTFAK/Utils/ByteReader.cs +++ b/CTFAK/Utils/ByteReader.cs @@ -124,6 +124,12 @@ namespace CTFAK.Utils return str; } + + public string ReadUniversal(int len=-1) + { + if (Settings.Unicode) return ReadWideString(len); + else return ReadAscii(len); + } public Color ReadColor() {