From 651556a16951ecfa125ce1f8bc3d72d031c25e59 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Sat, 23 Jan 2021 21:15:36 +0600 Subject: [PATCH] Global refactoring and cleanup --- CTFAK/GUI/FrameViewer.cs | 2 +- CTFAK/GUI/MainForm.cs | 19 +- CTFAK/MMFParser/EXE/GameData.cs | 2 +- .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 1 - .../MMFParser/EXE/Loaders/Banks/SoundBank.cs | 19 +- .../EXE/Loaders/Events/EventsParts.cs | 7 +- .../Loaders/Events/Expressions/Expression.cs | 4 - .../Events/Parameters/AlterableValue.cs | 1 - .../EXE/Loaders/Events/Parameters/Sample.cs | 2 + CTFAK/MMFParser/EXE/Loaders/Frame.cs | 131 ++++-------- CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs | 185 ++++------------ .../MMFParser/EXE/Loaders/Objects/Backdrop.cs | 7 +- .../EXE/Loaders/Objects/Movements.cs | 200 +++++++++++++++++- .../EXE/Loaders/Objects/ObjectCommon.cs | 5 +- CTFAK/MMFParser/EXE/Loaders/yves.cs | 3 - .../MFA/Loaders/mfachunks/Movements.cs | 20 +- CTFAK/MMFParser/Translation/MFAGenerator.cs | 2 + CTFAK/MMFParser/Translation/PAME2MFA.cs | 47 ++-- CTFAK/Program.cs | 4 +- CTFAK/Utils/ByteReader.cs | 6 + CTFAK/Utils/ImageDumper.cs | 15 +- 21 files changed, 365 insertions(+), 317 deletions(-) diff --git a/CTFAK/GUI/FrameViewer.cs b/CTFAK/GUI/FrameViewer.cs index 49eb44c..4f4e077 100644 --- a/CTFAK/GUI/FrameViewer.cs +++ b/CTFAK/GUI/FrameViewer.cs @@ -70,7 +70,7 @@ namespace CTFAK.GUI var size = new Size(Exe.Instance.GameData.Header.WindowWidth,Exe.Instance.GameData.Header.WindowHeight); //scrollableControl1.Size = new Size(frame.Width,frame.Height);; ClientSize = size; - var list = frame.Objects.Items.OrderBy(x=>x.Handle); + var list = frame.Objects.OrderBy(x=>x.Handle); foreach (var obj in list) { //TODO:Layers diff --git a/CTFAK/GUI/MainForm.cs b/CTFAK/GUI/MainForm.cs index 2f05e9a..6aca731 100644 --- a/CTFAK/GUI/MainForm.cs +++ b/CTFAK/GUI/MainForm.cs @@ -41,7 +41,6 @@ namespace CTFAK.GUI private bool _isAnimRunning; - private bool _isAudioPlaying; private SoundPlayer _soundPlayer; public Label ObjectViewerLabel; public TreeNode LastSelected; @@ -616,14 +615,14 @@ namespace CTFAK.GUI var frameNode = new ChunkNode(frame.Name, frame); objTreeView.Nodes.Add(frameNode); if (frame.Objects != null) - foreach (var objInst in frame.Objects.Items) + foreach (var objInst in frame.Objects) { var objInstNode = new ChunkNode(objInst.FrameItem.Name, objInst); frameNode.Nodes.Add(objInstNode); var loader = objInst.FrameItem.Properties.Loader; if (loader is ObjectCommon common) { - if (common.Parent.ObjectType == 2) //Active + if (common.Parent.ObjectType == Constants.ObjectType.Active) //Active { if (common.Animations != null) foreach (var pair in common.Animations?.AnimationDict) @@ -667,7 +666,7 @@ namespace CTFAK.GUI } } } - else if(common.Parent.ObjectType==7)//Counter + else if(common.Parent.ObjectType==Constants.ObjectType.Counter)//Counter { var count = common.Counters?.Frames?.Count??0; @@ -819,8 +818,8 @@ namespace CTFAK.GUI { text += $"Name: {frame.Name}\r\n"; text += $"Size: {frame.Width}x{frame.Height}\r\n"; - text += $"Objects: {frame.Objects.Items.Count}\r\n"; - text += $"Layers: {frame.Layers.Items.Count}\r\n"; + text += $"Objects: {frame.Objects.Count}\r\n"; + text += $"Layers: {frame.Layers.Count}\r\n"; text += $"Flags:\r\n"; foreach (var part in frame.Flags.ToString().Split(';')) { @@ -843,13 +842,13 @@ namespace CTFAK.GUI var common = ((ObjectCommon) instance.FrameItem.Properties.Loader); switch (instance.FrameItem.ObjectType) { - case 2: + case Constants.ObjectType.Active: text += $"Animations: {common.Animations?.AnimationDict.Count}"; imageViewPictureBox.Image = Exe.Instance.GameData.GameChunks.GetChunk() .FromHandle(common.Animations.AnimationDict.FirstOrDefault().Value.DirectionDict .FirstOrDefault().Value.Frames.FirstOrDefault()).Bitmap; break; - case 3: + case Constants.ObjectType.Text: ObjectViewerLabel = new Label(); var content = string.Empty; foreach (var par in common.Text.Items) @@ -864,7 +863,7 @@ namespace CTFAK.GUI imageViewPictureBox.Controls.Add(ObjectViewerLabel); break; - case 7: + case Constants.ObjectType.Counter: var handle = common.Counters?.Frames.FirstOrDefault(); if (handle == null) imageViewPictureBox.Image = imageViewPictureBox.ErrorImage; else @@ -884,7 +883,7 @@ namespace CTFAK.GUI } else { - if (instance.FrameItem.ObjectType == 1) + if (instance.FrameItem.ObjectType == Constants.ObjectType.Backdrop) imageViewPictureBox.Image = Exe.Instance.GameData.GameChunks.GetChunk().FromHandle(((Backdrop)instance.FrameItem.Properties.Loader).Image).Bitmap; } diff --git a/CTFAK/MMFParser/EXE/GameData.cs b/CTFAK/MMFParser/EXE/GameData.cs index 580a5bc..31e5ac2 100644 --- a/CTFAK/MMFParser/EXE/GameData.cs +++ b/CTFAK/MMFParser/EXE/GameData.cs @@ -132,7 +132,7 @@ namespace CTFAK.MMFParser.EXE Logger.Log("Frames: ", true, ConsoleColor.Cyan); foreach (var item in Frames) { - Logger.Log($" Frame: {item.Name,25}, Size: {item.Width,4}x{item.Height,4}, Number of objects: {item.CountOfObjs,5}", true, ConsoleColor.Cyan); + Logger.Log($" Frame: {item.Name,25}, Size: {item.Width,4}x{item.Height,4}, Number of objects: {item.Objects.Count,5}", true, ConsoleColor.Cyan); var objects = item.Chunks.GetChunk(); if (objects != null) { diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 680f1f0..4bdec13 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -143,7 +143,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks //tranparent,add later Color _transparent; byte[] _colorArray; - int _indexed; public byte[] rawImg; public byte[] rawAlpha; diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs index 5c1a2db..75b2dbc 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs @@ -57,6 +57,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks var item = new SoundItem(Reader); item.IsCompressed = IsCompressed; item.Read(); + if(!IsCompressed)Logger.Log(item.Name); OnSoundSaved?.Invoke(i,(int) NumOfItems); Items.Add(item); @@ -67,7 +68,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } public void Write(ByteWriter writer) { - writer.WriteInt32(NumOfItems); + writer.WriteInt32(Items.Count); foreach (var item in Items) { item.Write(writer); @@ -145,23 +146,23 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } if (IsCompressed) { - Name = soundData.ReadWideString(nameLenght); + Name = soundData.ReadAscii(nameLenght); + } else { - Name = soundData.ReadAscii(nameLenght); - + Name = soundData.ReadWideString(nameLenght); } this.Data = soundData.ReadBytes((int) soundData.Size()); - //Logger.Log("SoundHeader: "+Data.GetHex(4)); if (Settings.DumpSounds) { Name = Helper.CleanInput(Name); File.WriteAllBytes($"{Settings.SoundPath}\\{Name}.wav", Data); + // File.WriteAllBytes($"{Name}.wav", Data); } - //Save($"{Settings.DumpPath}\\SoundBank\\{Name}.wav"); + } @@ -171,11 +172,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks writer.WriteUInt32((uint)Handle); writer.WriteInt32(Checksum); writer.WriteInt32(References); - writer.WriteInt32(Data.Length+Name.Length+1); + writer.WriteInt32(Data.Length+Name.Length+8); writer.WriteInt32(Flags); writer.WriteInt32(0); - writer.WriteInt32(Name.Length+1); - writer.WriteAscii(Name); + writer.WriteInt32(Name.Length); + writer.WriteUnicode(Name); writer.WriteBytes(Data); diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs index 1196da3..8f876a7 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs @@ -215,12 +215,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public override string ToString() { if (Loader != null) return Loader.ToString(); - else - { - throw new NotImplementedException($"Unkown Parameter: {Code} "); - return $"UNK-{Code}"; - } - + else throw new Exception($"Unkown Parameter: {Code} "); } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs index 75c532c..bcf4430 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs @@ -176,7 +176,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions public class LongExp:ExpressionLoader { public int Val1; - private int _unk; public LongExp(ByteReader reader) : base(reader) { @@ -188,15 +187,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions public override void Read() { - // _unk = Reader.ReadInt32(); Value = Reader.ReadInt32(); } public override void Write(ByteWriter Writer) { - // Writer.WriteInt32((int) _unk); Writer.WriteInt32((int) Value); - } } public class ExtensionExp:ExpressionLoader diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/AlterableValue.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/AlterableValue.cs index 2ec8d71..c51e145 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/AlterableValue.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/AlterableValue.cs @@ -5,7 +5,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { class AlterableValue : Short { - public int Unk; public AlterableValue(ByteReader reader) : base(reader) { } public override void Read() diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Sample.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Sample.cs index c6a576d..130bab5 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Sample.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Sample.cs @@ -21,6 +21,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters Writer.WriteInt16((short) Handle); Writer.WriteUInt16((ushort) Flags); Writer.WriteUnicode(Name); + Writer.Skip(120); + Writer.WriteInt16(0); } public override string ToString() diff --git a/CTFAK/MMFParser/EXE/Loaders/Frame.cs b/CTFAK/MMFParser/EXE/Loaders/Frame.cs index bd70fe3..4fd178e 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Frame.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Frame.cs @@ -29,11 +29,6 @@ namespace CTFAK.MMFParser.EXE.Loaders public class Frame : ChunkLoader { - public string Name; - public string Password; - public int Width; - public int Height; - public Color Background; public BitDict Flags=new BitDict(new string[] { "XCoefficient", @@ -48,28 +43,25 @@ namespace CTFAK.MMFParser.EXE.Loaders "ToHide", "ToShow" }); - - public int CountOfObjs; - // int _top; - // int _bottom; - // int _left; - // int _right; + public ChunkList Chunks; - public FrameHeader Header; - public ObjectInstances Objects; - public Layers Layers; - public Events.Events Events; - public FramePalette Palette; - public Transition FadeIn; - public Transition FadeOut; + private FrameHeader _header; + private FrameName _name; + private FramePassword _password; + private FramePalette _palette; + private Layers _layers; + private ObjectInstances _objects; + private Events.Events _events; + private Transition _fadeIn; + private Transition _fadeOut; public override void Print(bool ext) { - Logger.Log($"Frame: {Name}", true, ConsoleColor.Green); - Logger.Log($" Password: {(Password!=null ? Password : "None")}", true, ConsoleColor.Green); + Logger.Log($"Frame: {_name}", true, ConsoleColor.Green); + Logger.Log($" Password: {Password}", true, ConsoleColor.Green); Logger.Log($" Size: {Width}x{Height}", true, ConsoleColor.Green); - Logger.Log($" Objects: {CountOfObjs}", true, ConsoleColor.Green); + Logger.Log($" Objects: {_objects.CountOfObjects}", true, ConsoleColor.Green); Logger.Log($"-------------------------", true, ConsoleColor.Green); } @@ -77,88 +69,49 @@ namespace CTFAK.MMFParser.EXE.Loaders { return new string[] { - $"Name: {Name}", + $"Name: {_name}", $"Size: {Width}x{Height}", - $"Objects: {CountOfObjs}" + $"Objects: {_objects.CountOfObjects}" }; } public override void Read() { - var frameReader = new ByteReader(Chunk.ChunkData); Chunks = new ChunkList(); - - Chunks.Read(frameReader); - var name = Chunks.GetChunk(); - if (name != null) //Just to be sure - { - this.Name = name.Value; - Logger.Log(Properties.GlobalStrings.readingFrame+" "+Name,true,ConsoleColor.Green); - } - var password = Chunks.GetChunk(); - if (password != null) //Just to be sure - { - this.Password = password.Value; - } - - var layers = Chunks.GetChunk(); - if (layers != null) - { - Layers = layers; - } - var events = Chunks.GetChunk(); - if (events != null) - { - Events = events; - } - var palette = Chunks.GetChunk(); - if (palette != null) - { - Palette = palette; - } - Header = Chunks.GetChunk(); - Width = Header.Width; - Height = Header.Height; - Background = Header.Background; - Flags.flag = Header.Flags.flag; - Objects = Chunks.GetChunk(); - if(Objects!=null) - { - CountOfObjs = Objects.CountOfObjects; - } - - FadeIn = Chunks.PopChunk(); - FadeOut = Chunks.PopChunk(); - - - - - - - foreach (var item in Chunks.Chunks) - { - //Directory.CreateDirectory($"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}"); - //string path = $"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}\\{chunk.name}.chunk"; - //File.WriteAllBytes(path, item.chunk_data); - - } + Logger.Log(Properties.GlobalStrings.readingFrame+" "+_name,true,ConsoleColor.Green); + _header = Chunks.GetChunk(); + _name = Chunks.GetChunk(); + _password = Chunks.GetChunk(); + _palette = Chunks.GetChunk(); + _layers = Chunks.GetChunk(); + _objects = Chunks.GetChunk(); + _events = Chunks.GetChunk(); + _fadeIn = Chunks.PopChunk(); + _fadeOut = Chunks.PopChunk(); + + Flags.flag = _header.Flags.flag; + } + + public int Width => _header.Width; + public int Height => _header.Height; + public string Name => _name.Value; + public string Password => _password.Value; + public Color Background => _header.Background; + public List Objects => _objects.Items; + public List Palette => _palette.Items; + public Events.Events Events => _events; + public List Layers => _layers.Items; + - - } - - public Frame(ByteReader reader) : base(reader) - { - } - - public Frame(ChunkList.Chunk chunk) : base(chunk) - { - } + public Frame(ByteReader reader) : base(reader){} + public Frame(ChunkList.Chunk chunk) : base(chunk){} + } public class FrameHeader : ChunkLoader diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs index e136f85..a6265b8 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs @@ -10,45 +10,14 @@ namespace CTFAK.MMFParser.EXE.Loaders public class ObjectInfo : ChunkLoader { public List Chunks = new List(); - //public int Properties = 0; - public string Name = "ERROR"; - public int Handle; - public int ObjectType; - public BitDict Flags = new BitDict(new string[] - { - "UNK1", - "UNK2", - "UNK3", - "UNK4", - "UNK5", - "UNK6", - "UNK7", - "UNK8", - "UNK9", - "UNK10", - "UNK11","UNK12","UNK13","UNK14", - - }); - public bool Transparent; - public bool Antialias; - public int InkEffect; - public int InkEffectValue; public int ShaderId; public int Items; - public ObjectProperties Properties; - - public ObjectInfo(Chunk chunk) : base(chunk) - { - } - - public ObjectInfo(ByteReader reader) : base(reader) - { - } - - public override void Print(bool ext) - { - } - + private ObjectHeader _header; + private ObjectName _name; + private ObjectProperties _properties; + public ObjectInfo(Chunk chunk) : base(chunk){} + public ObjectInfo(ByteReader reader) : base(reader){} + public override void Print(bool ext){} public override string[] GetReadableData() { return new string[] @@ -65,52 +34,29 @@ namespace CTFAK.MMFParser.EXE.Loaders infoChunks.Verbose = false; infoChunks.Read(Reader); - foreach (var infoChunk in infoChunks.Chunks) - { - - infoChunk.Verbose = false; - var loader = infoChunk.Loader; - - - if (loader is ObjectName) - { - - var actualLoader = (ObjectName)(loader); - Name = actualLoader.Value; - } - else if (loader is ObjectHeader) - { - - var actualLoader = (ObjectHeader)(loader); - Handle = actualLoader.Handle; - ObjectType = actualLoader.ObjectType; - Flags.flag = actualLoader.Flags; - - UInt32 inkEffect = actualLoader.InkEffect; - InkEffectValue = (int) actualLoader.InkEffectParameter; - Transparent = ByteFlag.GetFlag(inkEffect, 28); - Antialias = ByteFlag.GetFlag(inkEffect, 29); - } - else if (loader is ObjectProperties) - { - - Properties = (ObjectProperties)loader; - } - - } - - if (Properties != null) - { - Properties.ReadNew(ObjectType,this); - } + _header = infoChunks.GetChunk(); + _name = infoChunks.GetChunk(); + _properties = infoChunks.GetChunk(); + _properties.ReadNew((int) ObjectType,this); } + public int Handle => _header.Handle; + public string Name => _name.Value; + public ObjectProperties Properties => _properties; + public Constants.ObjectType ObjectType => (Constants.ObjectType) _header.ObjectType; + public int Flags => (int) _header.Flags; + public int InkEffect => (int) _header.InkEffect; + public int InkEffectValue => (int) _header.InkEffectParameter; + public bool Transparent => ByteFlag.GetFlag((uint) InkEffect, 28); + public bool Antialias => ByteFlag.GetFlag((uint) InkEffect, 29); + + public ImageItem GetPreview() { ImageItem bmp=null; var images = Exe.Instance.GameData.GameChunks.GetChunk(); - if (ObjectType == 2) + if (ObjectType == Constants.ObjectType.Active) { var anims = ((ObjectCommon) (Properties.Loader)).Animations; @@ -130,15 +76,15 @@ namespace CTFAK.MMFParser.EXE.Loaders bmp = images.Images[firstFrameHandle]; } } - else if (ObjectType == 1)//Backdrop + else if (ObjectType == Constants.ObjectType.Backdrop) { images.Images.TryGetValue(((Backdrop) Properties.Loader).Image, out var img); bmp = img; } - else if (ObjectType==0)//QuickBackdrop + else if (ObjectType==Constants.ObjectType.QuickBackdrop) { - - + images.Images.TryGetValue(((Quickbackdrop) Properties.Loader).Image, out var img); + bmp = img; } @@ -151,7 +97,7 @@ namespace CTFAK.MMFParser.EXE.Loaders var frames = Exe.Instance.GameData.Frames; foreach (var frame in frames) { - foreach (ObjectInstance instance in frame.Objects.Items) + foreach (ObjectInstance instance in frame.Objects) { if(instance.ObjectInfo==this.Handle)list.Add(instance); } @@ -163,13 +109,8 @@ namespace CTFAK.MMFParser.EXE.Loaders public class ObjectName : StringChunk { - public ObjectName(ByteReader reader) : base(reader) - { - } - - public ObjectName(Chunk chunk) : base(chunk) - { - } + public ObjectName(ByteReader reader) : base(reader){} + public ObjectName(Chunk chunk) : base(chunk){} } public class ObjectProperties : ChunkLoader @@ -177,53 +118,24 @@ namespace CTFAK.MMFParser.EXE.Loaders public bool IsCommon; public ChunkLoader Loader; - public ObjectProperties(ByteReader reader) : base(reader) - { - } - - public ObjectProperties(Chunk chunk) : base(chunk) - { - } - + public ObjectProperties(ByteReader reader) : base(reader){} + public ObjectProperties(Chunk chunk) : base(chunk){} public void ReadNew(int ObjectType,ObjectInfo parent) { - - //TODO: Fix shit - if(ObjectType==0)//QuickBackdrop - { - Loader=new Quickbackdrop(Reader); - } - else if (ObjectType == 1)//Backdrop - { - Loader = new Backdrop(Reader); - } + if(ObjectType==0) Loader=new Quickbackdrop(Reader); + else if (ObjectType == 1) Loader = new Backdrop(Reader); else { IsCommon = true; Loader = new ObjectCommon(Reader,parent); } - - if (Loader != null) - { - Loader.Read(); - } - } - - public override void Read() - { - + Loader?.Read(); } + public override void Read(){} + public override void Print(bool ext){} + public override string[] GetReadableData() => null; - public override void Print(bool ext) - { - throw new NotImplementedException(); - } - - public override string[] GetReadableData() - { - throw new NotImplementedException(); - } } public class ObjectHeader : ChunkLoader @@ -234,30 +146,17 @@ namespace CTFAK.MMFParser.EXE.Loaders public UInt32 InkEffect; public UInt32 InkEffectParameter; - public ObjectHeader(ByteReader reader) : base(reader) - { - } - - public ObjectHeader(Chunk chunk) : base(chunk) - { - } - - public override void Print(bool ext) - { - } - - public override string[] GetReadableData() - { - return null; - - } + public ObjectHeader(ByteReader reader) : base(reader){} + public ObjectHeader(Chunk chunk) : base(chunk){} + public override void Print(bool ext){} + public override string[] GetReadableData() => null; public override void Read() { Handle = Reader.ReadInt16(); ObjectType = Reader.ReadInt16(); - Int16 reserved = Reader.ReadInt16(); Flags = Reader.ReadUInt16(); + Int16 reserved = Reader.ReadInt16(); InkEffect = Reader.ReadUInt32(); InkEffectParameter = Reader.ReadUInt32(); } diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs index fd92cbe..db4d2e3 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs @@ -135,10 +135,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects Color2 = Reader.ReadColor(); GradFlags = Reader.ReadInt16(); } - else if(FillType==3) - { + // else if(FillType==3) + // { Image = Reader.ReadInt16(); - } + Logger.Log("QuickbackdropIMG: "+Image); + // } } public override void Print(bool ext) diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs index 6498beb..7bd0919 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Web.UI.WebControls; using CTFAK.Utils; namespace CTFAK.MMFParser.EXE.Loaders.Objects @@ -79,8 +82,18 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects case 1: Loader = new Mouse(Reader); break; - + case 3: + Loader=new EightDirections(Reader); + break; + case 5: + Loader=new MovementPath(Reader); + break; + case 4: + Loader=new Ball(Reader); + break; + } + if(Loader==null&&Type!=0) throw new Exception("Unsupported movement: "+Type); Loader?.Read(); } @@ -125,6 +138,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public short X2; public short Y1; public short Y2; + private short _unusedFlags; public Mouse(ByteReader reader) : base(reader) { @@ -140,17 +154,195 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects X2 = Reader.ReadInt16(); Y1 = Reader.ReadInt16(); Y2 = Reader.ReadInt16(); - var unusedFlags = Reader.ReadInt16(); + _unusedFlags = Reader.ReadInt16(); } public override void Write(ByteWriter Writer) { + Logger.Log("Writing mouse mov"); Writer.WriteInt16(X1); Writer.WriteInt16(X2); Writer.WriteInt16(Y1); Writer.WriteInt16(Y2); - Writer.WriteInt16(0); + Writer.WriteInt16(_unusedFlags); + + } + } + public class MovementPath:MovementLoader + { + public short MinimumSpeed; + public short MaximumSpeed; + public byte Loop; + public byte RepositionAtEnd; + public byte ReverseAtEnd; + public List Steps; + + public MovementPath(ByteReader reader) : base(reader) + { + } + + public MovementPath(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + var count = Reader.ReadInt16(); + MinimumSpeed = Reader.ReadInt16(); + MaximumSpeed = Reader.ReadInt16(); + Loop = Reader.ReadByte(); + RepositionAtEnd = Reader.ReadByte(); + ReverseAtEnd = Reader.ReadByte(); + Reader.Skip(1); + Steps = new List(); + for (int i = 0; i < count; i++) + { + var currentPosition = Reader.Tell(); + + Reader.Skip(1); + var size = Reader.ReadByte(); + var step =new MovementStep(Reader); + step.Read(); + Steps.Add(step); + Reader.Seek(currentPosition + size); + } + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt16((short) Steps.Count); + Writer.WriteInt16(MinimumSpeed); + Writer.WriteInt16(MaximumSpeed); + Writer.WriteInt8(Loop); + Writer.WriteInt8(RepositionAtEnd); + Writer.WriteInt8(ReverseAtEnd); + Writer.WriteInt8(0); + foreach (MovementStep step in Steps) + { + Writer.WriteInt8(0); + var newWriter = new ByteWriter(new MemoryStream()); + step.Write(newWriter); + Writer.WriteInt8((byte) (newWriter.Size()+2)); + Writer.WriteWriter(newWriter); + } + + } + } + public class MovementStep:MovementLoader + { + public byte Speed; + public byte Direction; + public short DestinationX; + public short DestinationY; + public short Cosinus; + public short Sinus; + public short Length; + public short Pause; + public string Name; + + public MovementStep(ByteReader reader) : base(reader) + { + } + + public MovementStep(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Speed = Reader.ReadByte(); + Direction = Reader.ReadByte(); + DestinationX = Reader.ReadInt16(); + DestinationY = Reader.ReadInt16(); + Cosinus = Reader.ReadInt16(); + Sinus = Reader.ReadInt16(); + Length = Reader.ReadInt16(); + Pause = Reader.ReadInt16(); + Name = Reader.ReadAscii(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt8(Speed); + Writer.WriteInt8(Direction); + Writer.WriteInt16(DestinationX); + Writer.WriteInt16(DestinationY); + Writer.WriteInt16(Cosinus); + Writer.WriteInt16(Sinus); + Writer.WriteInt16(Length); + Writer.WriteInt16(Pause); + Writer.WriteAscii(Name); + } + } + public class Ball:MovementLoader + { + public short Speed; + public short Randomizer; + public short Angles; + public short Security; + public short Deceleration; + + public Ball(ByteReader reader) : base(reader) + { + } + + public Ball(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Speed = Reader.ReadInt16(); + Randomizer = Reader.ReadInt16(); + Angles = Reader.ReadInt16(); + Security = Reader.ReadInt16(); + Deceleration = Reader.ReadInt16(); + + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt16(Speed); + Writer.WriteInt16(Randomizer); + Writer.WriteInt16(Angles); + Writer.WriteInt16(Security); + Writer.WriteInt16(Deceleration); + + } + } + public class EightDirections:MovementLoader + { + public short Speed; + public short Acceleration; + public short Deceleration; + public short Directions; + public short BounceFactor; + + public EightDirections(ByteReader reader) : base(reader) + { + } + + public EightDirections(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Speed = Reader.ReadInt16(); + Acceleration = Reader.ReadInt16(); + Deceleration = Reader.ReadInt16(); + BounceFactor = Reader.ReadInt16(); + Directions = Reader.ReadInt16(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt16(Speed); + Writer.WriteInt16(Acceleration); + Writer.WriteInt16(Deceleration); + Writer.WriteInt16(BounceFactor); + Writer.WriteInt16(Directions); } } } \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index 9eedbd0..87852aa 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -20,7 +20,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects private int Identifier; public Animations Animations; - private long _end; private BitDict preferences = new BitDict(new string[] { @@ -165,12 +164,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects switch (Parent.ObjectType) { //Text - case 3: + case Constants.ObjectType.Text: Text = new Text(Reader); Text.Read(); break; //Counter - case 7: + case Constants.ObjectType.Counter: Counters=new Counters(Reader); Counters.Read(); break; diff --git a/CTFAK/MMFParser/EXE/Loaders/yves.cs b/CTFAK/MMFParser/EXE/Loaders/yves.cs index 425fef6..70c7544 100644 --- a/CTFAK/MMFParser/EXE/Loaders/yves.cs +++ b/CTFAK/MMFParser/EXE/Loaders/yves.cs @@ -23,9 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders public override void Read() { - return; - - Logger.Log("dumpingIcon"); Reader.ReadBytes(Reader.ReadInt32() - 4); List colorIndexes = new List(); diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Movements.cs index 4c29f7e..d726dda 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Movements.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Movements.cs @@ -60,19 +60,19 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks Writer.AutoWriteUnicode(Extension); Writer.WriteUInt32(Identifier); var newWriter = new ByteWriter(new MemoryStream()); - if (Extension.Length==0) - { - + newWriter.WriteInt16(Player); newWriter.WriteInt16(Type); newWriter.WriteInt8(MovingAtStart); newWriter.Skip(3); newWriter.WriteInt32(DirectionAtStart); + // newWriter.WriteBytes(extData); - } - var new2 = new ByteWriter(new MemoryStream()); - Loader?.Write(new2); - newWriter.WriteWriter(new2); + + + Loader?.Write(newWriter); + newWriter.Skip(12); + newWriter.WriteInt16(0); Writer.WriteInt32((int) newWriter.Size()); Writer.WriteWriter(newWriter); @@ -107,6 +107,12 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks case 1: Loader = new Mouse(new ByteReader(extData)); break; + case 5: + Loader = new MovementPath(new ByteReader(extData)); + break; + case 4: + Loader = new Ball(new ByteReader(extData)); + break; } Loader?.Read(); diff --git a/CTFAK/MMFParser/Translation/MFAGenerator.cs b/CTFAK/MMFParser/Translation/MFAGenerator.cs index e0f7ff7..a58140b 100644 --- a/CTFAK/MMFParser/Translation/MFAGenerator.cs +++ b/CTFAK/MMFParser/Translation/MFAGenerator.cs @@ -46,6 +46,8 @@ namespace CTFAK.MMFParser.Translation 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(); + Settings.DoMFA = true; var template = new MFA.MFA(mfaReader); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index ac9d415..d36fe27 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -44,12 +44,12 @@ namespace CTFAK.MMFParser.Translation //mfa.Stamp = wtf; //if (game.Fonts != null) mfa.Fonts = game.Fonts; - - // mfa.Sounds = game.Sounds; - // foreach (var item in mfa.Sounds.Items) + mfa.Sounds.Items.Clear(); + // foreach (var item in game.Sounds.Items) // { - // item.IsCompressed = false; + // mfa.Sounds.Items.Add(item); // } + // mfa.Music = game.Music; mfa.Images.Items = game.Images.Images; foreach (var key in mfa.Images.Items.Keys) @@ -107,7 +107,7 @@ namespace CTFAK.MMFParser.Translation if(frame.Palette==null|| frame.Events==null|| frame.Objects==null) continue; var newFrame = new MFA.Loaders.Frame(null); - newFrame.Handle = game.Frames.IndexOf(frame)+1; + newFrame.Handle = game.Frames.IndexOf(frame); newFrame.Name = frame.Name; newFrame.SizeX = frame.Width; newFrame.SizeY = frame.Height; @@ -130,15 +130,15 @@ namespace CTFAK.MMFParser.Translation newFrame.Password = ""; newFrame.LastViewedX = 320; newFrame.LastViewedY = 240; - newFrame.Palette = frame.Palette.Items; + newFrame.Palette = frame.Palette; newFrame.StampHandle = 13; newFrame.ActiveLayer = 0; //LayerInfo - var count = frame.Layers.Items.Count; + var count = frame.Layers.Count; Logger.Log($"{newFrame.Name} - {count}"); for (int i=0;i= 32) + if ((int)item.ObjectType >= 32) { var newExt = new ExtensionObject(null); { @@ -490,7 +491,7 @@ namespace CTFAK.MMFParser.Translation Extension ext = null; foreach (var testExt in exts.Items) { - if (testExt.Handle == item.ObjectType - 32) ext = testExt; + if (testExt.Handle == (int)item.ObjectType - 32) ext = testExt; } newExt.ExtensionType = -1; @@ -508,7 +509,7 @@ namespace CTFAK.MMFParser.Translation // mfa.Extensions.Add(tuple); } - else if (item.ObjectType == 3) + else if (item.ObjectType == Constants.ObjectType.Text) { var text = itemLoader.Text; var newText = new Text(null); @@ -539,7 +540,7 @@ namespace CTFAK.MMFParser.Translation newItem.Loader = newText; } - else if (item.ObjectType == 6) + else if (item.ObjectType == Constants.ObjectType.Lives) { var counter = itemLoader.Counters; var lives = new Lives(null); @@ -562,7 +563,7 @@ namespace CTFAK.MMFParser.Translation newItem.Loader = lives; } - else if (item.ObjectType == 7) + else if (item.ObjectType == Constants.ObjectType.Counter) { var counter = itemLoader.Counters; var newCount = new Counter(null); diff --git a/CTFAK/Program.cs b/CTFAK/Program.cs index 7507964..dbc61ba 100644 --- a/CTFAK/Program.cs +++ b/CTFAK/Program.cs @@ -33,8 +33,8 @@ namespace CTFAK LoadableSettings.FromFile("settings.sav"); // // MFAGenerator.WriteTestMFA(); - MFAGenerator.ReadTestMFA(); - Environment.Exit(0); + // MFAGenerator.ReadTestMFA(); + // Environment.Exit(0); AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => { diff --git a/CTFAK/Utils/ByteReader.cs b/CTFAK/Utils/ByteReader.cs index 780b81b..83045fd 100644 --- a/CTFAK/Utils/ByteReader.cs +++ b/CTFAK/Utils/ByteReader.cs @@ -2,6 +2,7 @@ using System.Drawing; using System.IO; using System.Text; +using System.Windows.Forms.VisualStyles; namespace CTFAK.Utils { @@ -135,5 +136,10 @@ namespace CTFAK.Utils } + public override byte[] ReadBytes(int count=-1) + { + if (count == -1) return base.ReadBytes((int) this.Size()); + return base.ReadBytes(count); + } } } \ No newline at end of file diff --git a/CTFAK/Utils/ImageDumper.cs b/CTFAK/Utils/ImageDumper.cs index 6da5cb5..700f985 100644 --- a/CTFAK/Utils/ImageDumper.cs +++ b/CTFAK/Utils/ImageDumper.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using CTFAK.GUI; using CTFAK.GUI.GUIComponents; +using CTFAK.MMFParser; using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE.Loaders; using CTFAK.MMFParser.EXE.Loaders.Banks; @@ -55,7 +56,7 @@ namespace CTFAK.Utils public static void SaveFrame(Frame frame, ImageBank bank, string fullPath) { - foreach (var inst in frame.Objects.Items) + foreach (var inst in frame.Objects) { var path = $"{fullPath}\\{Helper.CleanInput(inst.FrameItem.Name)}"; Logger.Log("Saving Object to "+path); @@ -80,13 +81,13 @@ namespace CTFAK.Utils Directory.CreateDirectory(fullPath); switch (common.Parent.ObjectType) { - case 2: + case Constants.ObjectType.Active: foreach (var pair in common.Animations.AnimationDict.ToArray()) { SaveAnimation(pair.Value,bank,fullPath+"\\Animation "+pair.Key); } break; - case 7: + case Constants.ObjectType.Counter: if (common?.Counters?.Frames.Count == 0) return; if (common?.Counters?.Frames == null) return; foreach (int frame in common?.Counters?.Frames) @@ -164,7 +165,7 @@ namespace CTFAK.Utils { var currentFramePath = rootFolder + "\\" + Helper.CleanInput(frame.Name); - foreach (var item in frame.Objects.Items) + foreach (var item in frame.Objects) { var currentObjPath = currentFramePath + "\\" + Helper.CleanInput(item.Name); @@ -206,7 +207,7 @@ namespace CTFAK.Utils int count = 0; foreach (var frame in Exe.Instance.GameData.Frames) { - foreach (ObjectInstance objectInstance in frame.Objects.Items) + foreach (ObjectInstance objectInstance in frame.Objects) { count += objectInstance.FrameItem.GetFrames().Count; } @@ -224,7 +225,7 @@ namespace CTFAK.Utils if (obj.Properties.Loader is ObjectCommon common) { - if (obj.ObjectType == 2) + if (obj.ObjectType == Constants.ObjectType.Active) { foreach (var animKey in common.Animations.AnimationDict.Keys) { @@ -264,7 +265,7 @@ namespace CTFAK.Utils } } } - else if (obj.ObjectType == 7) + else if (obj.ObjectType == Constants.ObjectType.Counter) { var counters = common.Counters; if (counters == null) return frames;