From 82a048f1d0050ae97545328ab1587ae09e1110f6 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Sun, 24 Jan 2021 16:54:13 +0600 Subject: [PATCH] Fixed missing frames and broken frame handles --- CTFAK/CTFAK.csproj | 1 + CTFAK/MMFParser/EXE/ChunkList.cs | 3 + .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 49 ++++---- .../EXE/Loaders/Events/Parameters/Group.cs | 4 +- CTFAK/MMFParser/EXE/Loaders/FrameHandles.cs | 43 +++++++ .../MMFParser/EXE/Loaders/Objects/Counters.cs | 5 +- .../EXE/Loaders/Objects/Movements.cs | 45 ++++++- CTFAK/MMFParser/Translation/MFAGenerator.cs | 2 +- CTFAK/MMFParser/Translation/PAME2MFA.cs | 116 ++++++++---------- CTFAK/Settings.cs | 2 +- CTFAK/Utils/Checksum.cs | 2 +- 11 files changed, 169 insertions(+), 103 deletions(-) create mode 100644 CTFAK/MMFParser/EXE/Loaders/FrameHandles.cs diff --git a/CTFAK/CTFAK.csproj b/CTFAK/CTFAK.csproj index 196323a..11c7928 100644 --- a/CTFAK/CTFAK.csproj +++ b/CTFAK/CTFAK.csproj @@ -176,6 +176,7 @@ + diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index 5c48a6f..2c15e2f 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -209,6 +209,9 @@ namespace CTFAK.MMFParser.EXE case 8743: loader = new ExtPath(chunk); break; + case 8747: + loader=new FrameHandles(chunk); + break; case 8750: loader = new EditorFilename(chunk); break; diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 4026df9..fba08f1 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 = false; public ImageBank(ByteReader reader) : base(reader) { @@ -51,64 +51,57 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks public ImageItem FromHandle(int handle) { Images.TryGetValue(handle, out var img); - if (handle == -1) return Images[Images.Count-1]; + if (handle == -1) return Images[Images.Count - 1]; if (img == null) return null; else return img; } - + public void LoadByHandle(int handle) { - + Images[handle].Load(); } - - + + public event MainForm.SaveHandler OnImageSaved; - - + + public override void Read() { - + if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once var tempImages = new Dictionary(); NumberOfItems = (uint) Reader.ReadInt32(); - Logger.Log($"Found {NumberOfItems} images",true,ConsoleColor.Green); - + Logger.Log($"Found {NumberOfItems} images", true, ConsoleColor.Green); + //if (!Settings.DumpImages) return; - Logger.Log("Reading Images",true,ConsoleColor.Green); + Logger.Log("Reading Images", true, ConsoleColor.Green); for (int i = 0; i < NumberOfItems; i++) { - if (MainForm.BreakImages) + if (MainForm.BreakImages) break; { - - break; - } - - var item = new ImageItem(Reader); - - item.Read(!PreloadOnly); - tempImages.Add(item.Handle, item); - if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); - OnImageSaved?.Invoke(i,(int) NumberOfItems); + var item = new ImageItem(Reader); - //if (Settings.Build >= 284) - // item.Handle -= 1; + item.Read(!PreloadOnly); + tempImages.Add(item.Handle, item); + if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); + OnImageSaved?.Invoke(i, (int) NumberOfItems); - //images[item.handle] = item; + } + } - Logger.Log("Images success",true,ConsoleColor.Green); + Logger.Log("Images success", true, ConsoleColor.Green); if (!MainForm.BreakImages) Images = tempImages; MainForm.BreakImages = false; - } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs index c402e4f..db1000d 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs @@ -27,10 +27,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Write(ByteWriter Writer) { - Writer.WriteUInt16(0); + Writer.WriteUInt16(Flags); Writer.WriteUInt16(Id); Writer.WriteUnicode(Name,true); - if(true)//decrypt password + if(true) { Password = Checksum.MakeGroupChecksum("", Name); } diff --git a/CTFAK/MMFParser/EXE/Loaders/FrameHandles.cs b/CTFAK/MMFParser/EXE/Loaders/FrameHandles.cs new file mode 100644 index 0000000..ab8986a --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/FrameHandles.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders +{ + public class FrameHandles:ChunkLoader + { + public Dictionary Items; + + public FrameHandles(ByteReader reader) : base(reader) + { + } + + public FrameHandles(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + + var len = Reader.Size() / 2; + Items = new Dictionary(); + for (int i = 0; i < len; i++) + { + var handle = Reader.ReadInt16(); + Logger.Log("Frame Handle: "+handle); + Items.Add(i,handle); + } + + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Counters.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Counters.cs index 94a7f41..95d4d19 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Counters.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Counters.cs @@ -62,6 +62,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public ushort DisplayType; public ushort Flags; public ushort Player; + public Shape Shape; public Counters(ByteReader reader) : base(reader) { @@ -103,8 +104,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects } else if (DisplayType == 2 || DisplayType == 3 || DisplayType == 5) { - //TODO: Shapes - Logger.Log("Ignoring unsupported counter type"); + Shape = new Shape(Reader); + Shape.Read(); } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs index 592568b..31ed7f5 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs @@ -88,12 +88,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects case 3: Loader=new EightDirections(Reader); break; - case 5: - Loader=new MovementPath(Reader); - break; case 4: Loader=new Ball(Reader); break; + case 5: + Loader=new MovementPath(Reader); + break; + } if(Loader==null&&Type!=0) throw new Exception("Unsupported movement: "+Type); @@ -388,4 +389,42 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects Writer.WriteInt16(ReverseEnabled); } } + public class PlatformMovement:MovementLoader + { + public short Speed; + public short Acceleration; + public short Deceleration; + public short Control; + public short Gravity; + public short JumpStrength; + + public PlatformMovement(ByteReader reader) : base(reader) + { + } + + public PlatformMovement(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Speed = Reader.ReadInt16(); + Acceleration = Reader.ReadInt16(); + Deceleration = Reader.ReadInt16(); + Control = Reader.ReadInt16(); + Gravity = Reader.ReadInt16(); + JumpStrength = Reader.ReadInt16(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt16(Speed); + Writer.WriteInt16(Acceleration); + Writer.WriteInt16(Deceleration); + Writer.WriteInt16(Control); + Writer.WriteInt16(Gravity); + Writer.WriteInt16(JumpStrength); + + } + } } \ No newline at end of file diff --git a/CTFAK/MMFParser/Translation/MFAGenerator.cs b/CTFAK/MMFParser/Translation/MFAGenerator.cs index a58140b..aeae949 100644 --- a/CTFAK/MMFParser/Translation/MFAGenerator.cs +++ b/CTFAK/MMFParser/Translation/MFAGenerator.cs @@ -45,7 +45,7 @@ namespace CTFAK.MMFParser.Translation else mfaReader = new ByteReader(TemplatePath, FileMode.Open); Logger.Log("Loading images"); Exe.Instance.GameData.GameChunks.GetChunk().PreloadOnly = false; - Exe.Instance.GameData.GameChunks.GetChunk().Read(true,false); + // Exe.Instance.GameData.GameChunks.GetChunk().Read(true,false); // Exe.Instance.GameData.GameChunks.GetChunk().Read(); Settings.DoMFA = true; diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index 71c84cf..1e6d2c4 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -57,6 +57,8 @@ namespace CTFAK.MMFParser.Translation mfa.Images.Items[key].Debug = true; } + // game.Images.Images.Clear(); + mfa.Author = game.Author ?? ""; mfa.Copyright = game.Copyright ?? ""; mfa.Company = ""; @@ -102,29 +104,34 @@ namespace CTFAK.MMFParser.Translation // var reference = mfa.Frames.FirstOrDefault(); mfa.Frames.Clear(); - foreach (Frame frame in game.Frames) + Dictionary indexHandles = new Dictionary(); + foreach (var pair in Program.CleanData.GameChunks.GetChunk().Items) + { + var key = pair.Key; + var handle = pair.Value; + if (!indexHandles.ContainsKey(handle)) indexHandles.Add(handle, key); + else indexHandles[handle] = key; + } + + + for (int a=0;a(); - // newRectLoader.Right = frame.Width; - // newRectLoader.Bottom = frame.Height; - - newFrame.Background = frame.Background; newFrame.FadeIn = null; newFrame.FadeOut = null; var mfaFlags = newFrame.Flags; var originalFlags = frame.Flags; - - mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"]; mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"]; @@ -147,21 +154,17 @@ namespace CTFAK.MMFParser.Translation for (int i=0;i(); newFrame.Events.Objects = new List(); - newFrame.Events._cache = MFA.MFA.emptyEvents._cache; newFrame.Events._ifMFA = true; newFrame.Events.Version = 1028; - // if (frame.Name == "jopajopaher") { foreach (var item in newFrame.Items) { @@ -235,43 +234,7 @@ namespace CTFAK.MMFParser.Translation newObject.InstanceHandle = 0xFFFFFFFF; newFrame.Events.Objects.Add(newObject); } - - foreach (EventGroup item in frame.Events.Items) - { - /*foreach (Action itemAction in item.Actions) - { - for (int a=0;a() {0}; + var shape = counter?.Shape; + + + if (counter != null) + { + if(counter.DisplayType==2||counter.DisplayType==3) + { + counter = null; + shape = null; + } + } if (counter == null) { newCount.DisplayType = 0; @@ -596,6 +570,7 @@ namespace CTFAK.MMFParser.Translation } else { + newCount.DisplayType = counter.DisplayType; newCount.CountType = counter.Inverse ? 1 : 0; newCount.Width = (int) counter.Width; @@ -603,11 +578,22 @@ namespace CTFAK.MMFParser.Translation newCount.Images = counter.Frames; newCount.Font = counter.Font; } - - newCount.Color1 = Color.White; - newCount.Color2 = Color.White; - newCount.Flags = 0; - newCount.VerticalGradient = 0; + + if (shape == null) + { + newCount.Color1=Color.Black; + newCount.Color2=Color.Black; + newCount.VerticalGradient = 0; + newCount.Flags = 0; + } + else + { + newCount.Color1 = Color.Green; + newCount.Color2 = Color.Red; + newCount.VerticalGradient = (uint) shape.GradFlags; + newCount.Flags = (uint) shape.FillType; + + } newItem.Loader = newCount; } diff --git a/CTFAK/Settings.cs b/CTFAK/Settings.cs index fc07472..7490bb7 100644 --- a/CTFAK/Settings.cs +++ b/CTFAK/Settings.cs @@ -38,7 +38,7 @@ namespace CTFAK - public static string DumperVersion = true ? "CTFAK 0.3.5 Alpha" : "CTFAK 0.2.1-a Debug"; + public static string DumperVersion = true ? "CTFAK 0.5 BETA" : "CTFAK 0.2.1-a Debug"; } public class LoadableSettings diff --git a/CTFAK/Utils/Checksum.cs b/CTFAK/Utils/Checksum.cs index 44c7883..fcb20a1 100644 --- a/CTFAK/Utils/Checksum.cs +++ b/CTFAK/Utils/Checksum.cs @@ -24,7 +24,7 @@ namespace CTFAK.Utils } var v5 = 0; - foreach (char c in groupWords) + foreach (char c in pass) { v4 += WrapSingleChar(groupWords[v5] + (c & 0xC3)) ^ 0xF3; v5++;