diff --git a/CTFAK/CTFAK.csproj b/CTFAK/CTFAK.csproj index 52c5391..196323a 100644 --- a/CTFAK/CTFAK.csproj +++ b/CTFAK/CTFAK.csproj @@ -165,6 +165,7 @@ MainForm.cs + diff --git a/CTFAK/GUI/MainForm.cs b/CTFAK/GUI/MainForm.cs index 6aca731..942b1bb 100644 --- a/CTFAK/GUI/MainForm.cs +++ b/CTFAK/GUI/MainForm.cs @@ -50,10 +50,8 @@ namespace CTFAK.GUI { //Buttons InitializeComponent(); - if (LoadableSettings.instance["lang"]?.ToString()?.Length > 0) - { - Thread.CurrentThread.CurrentUICulture=new CultureInfo(LoadableSettings.instance["lang"].ToString()); - } + Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US"); + ColorTheme = color; foreach (Control item in Controls) @@ -274,7 +272,7 @@ namespace CTFAK.GUI Logger.Log("Loading GUI"); //GameData gameData = null; var exe = Exe.Instance; - var gameData = exe.GameData; + var gameData = exe?.GameData ?? Program.CleanData; treeView1.Nodes.Clear(); diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index b8a5804..77c0edc 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -258,6 +258,9 @@ namespace CTFAK.MMFParser.EXE case 13116: loader = new Transition(chunk); break; + case 13122: + loader = new VirtualRect(chunk); + break; case 13121: loader = new Layers(chunk); break; @@ -289,7 +292,7 @@ namespace CTFAK.MMFParser.EXE loader = new GlobalStrings(chunk); break; case 13117: - loader = new Events(chunk);//NOT WORKING + // loader = new Events(chunk); break; } diff --git a/CTFAK/MMFParser/EXE/EXE.cs b/CTFAK/MMFParser/EXE/EXE.cs index 62a80be..b8eba71 100644 --- a/CTFAK/MMFParser/EXE/EXE.cs +++ b/CTFAK/MMFParser/EXE/EXE.cs @@ -70,6 +70,7 @@ namespace CTFAK.MMFParser.EXE Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue); PackData.Read(exeReader); GameData = new GameData(); + Program.CleanData = GameData; GameData.Read(exeReader); Console.ForegroundColor = ConsoleColor.DarkGreen; } @@ -79,6 +80,7 @@ namespace CTFAK.MMFParser.EXE var oldData = new ChunkList(); oldData.Read(exeReader); GameData = new GameData(); + Program.CleanData = GameData; GameData.Read(exeReader); Console.ForegroundColor = ConsoleColor.DarkGreen; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 4bdec13..4026df9 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=true; + public bool PreloadOnly=false; public ImageBank(ByteReader reader) : base(reader) { @@ -76,8 +76,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once var tempImages = new Dictionary(); - - NumberOfItems = Reader.ReadUInt32(); + NumberOfItems = (uint) Reader.ReadInt32(); Logger.Log($"Found {NumberOfItems} images",true,ConsoleColor.Green); @@ -157,7 +156,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Handle = Reader.ReadInt32(); if (!Debug) { - if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; + if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; } Position = (int) Reader.Tell(); @@ -265,7 +264,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks ActionX = imageReader.ReadInt16(); ActionY = imageReader.ReadInt16(); _transparent = imageReader.ReadColor(); - if(Settings.twofiveplus)Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}"); + // Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}"); byte[] imageData; if(Settings.twofiveplus) Flags["LZX"] = false; if (Flags["LZX"]) diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs index 75b2dbc..219b49e 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs @@ -37,12 +37,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks public override void Read() { if (!Settings.DoMFA)Reader.Seek(0);//Reset the reader to avoid bugs when dumping more than once - - - - Items = new List(); - NumOfItems = Reader.ReadInt32(); + NumOfItems = Reader.ReadInt32(); Logger.Log("Found " + NumOfItems + " sounds",true,ConsoleColor.Green); //if (!Settings.DumpSounds) return; diff --git a/CTFAK/MMFParser/EXE/Loaders/Common.cs b/CTFAK/MMFParser/EXE/Loaders/Common.cs new file mode 100644 index 0000000..22a89f5 --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/Common.cs @@ -0,0 +1,24 @@ +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders +{ + public class Rect:ChunkLoader + { + public int Left; + public int Top; + public int Right; + public int Bottom; + public Rect(ByteReader reader) : base(reader){} + public Rect(ChunkList.Chunk chunk) : base(chunk){} + public override void Read() + { + Left = Reader.ReadInt32(); + Top = Reader.ReadInt32(); + Right = Reader.ReadInt32(); + Bottom = Reader.ReadInt32(); + } + + public override void Print(bool ext){} + public override string[] GetReadableData() => null; + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Frame.cs b/CTFAK/MMFParser/EXE/Loaders/Frame.cs index ea16bd2..0088ca7 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Frame.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Frame.cs @@ -54,6 +54,7 @@ namespace CTFAK.MMFParser.EXE.Loaders private Events.Events _events; private Transition _fadeIn; private Transition _fadeOut; + private VirtualRect _virtualSize; public override void Print(bool ext) @@ -69,9 +70,9 @@ namespace CTFAK.MMFParser.EXE.Loaders { return new string[] { - $"Name: {_name}", + $"Name: {Name}", $"Size: {Width}x{Height}", - $"Objects: {_objects.CountOfObjects}" + $"Objects: {Objects.Count}" }; } @@ -81,10 +82,10 @@ namespace CTFAK.MMFParser.EXE.Loaders var frameReader = new ByteReader(Chunk.ChunkData); Chunks = new ChunkList(); Chunks.Read(frameReader); - - Logger.Log(Properties.GlobalStrings.readingFrame+" "+_name,true,ConsoleColor.Green); + _header = Chunks.GetChunk(); + _virtualSize = Chunks.GetChunk(); _name = Chunks.GetChunk(); _password = Chunks.GetChunk(); _palette = Chunks.GetChunk(); @@ -96,11 +97,15 @@ namespace CTFAK.MMFParser.EXE.Loaders _fadeOut = Chunks.PopChunk(); Flags.flag = _header.Flags.flag; + Logger.Log(Properties.GlobalStrings.readingFrame+$" {Name}",true,ConsoleColor.Green); + } public int Width => _header.Width; public int Height => _header.Height; - public string Name => _name.Value; + public int VirtWidth => _virtualSize.Right; + public int VirtHeight => _virtualSize.Bottom; + public string Name => _name?.Value ?? "UNK"; public string Password => _password.Value; public Color Background => _header.Background; public List Objects => _objects?.Items ?? null; @@ -249,8 +254,8 @@ namespace CTFAK.MMFParser.EXE.Loaders { get { - if (Exe.Instance.GameData.GameChunks.GetChunk() == null) return null; - return Exe.Instance.GameData.GameChunks.GetChunk().FromHandle(ObjectInfo); + if (Program.CleanData.GameChunks.GetChunk() == null) return null; + return Program.CleanData.GameChunks.GetChunk().FromHandle(ObjectInfo); } } @@ -384,16 +389,12 @@ namespace CTFAK.MMFParser.EXE.Loaders } } - public override void Print(bool ext) - { - throw new NotImplementedException(); - } - - public override string[] GetReadableData() - { - throw new NotImplementedException(); - } + public override void Print(bool ext){} + public override string[] GetReadableData() => null; + } + public class VirtualRect:Rect + { + public VirtualRect(ByteReader reader) : base(reader){} + public VirtualRect(ChunkList.Chunk chunk) : base(chunk){} } - - } \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs index 3cd84ff..6fadde0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs @@ -158,7 +158,6 @@ namespace CTFAK.MMFParser.EXE.Loaders Flags = Reader.ReadUInt16(); InkEffect = Reader.ReadByte(); InkEffectParameter = Reader.ReadByte(); - Logger.Log("InkParam: "+InkEffectParameter); } } } \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs index 7bd0919..592568b 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs @@ -82,6 +82,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects case 1: Loader = new Mouse(Reader); break; + case 2: + Loader = new RaceMovement(Reader); + break; case 3: Loader=new EightDirections(Reader); break; @@ -345,4 +348,44 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects Writer.WriteInt16(Directions); } } + public class RaceMovement:MovementLoader + { + public short Speed; + public short Acceleration; + public short Deceleration; + public short RotationSpeed; + public short BounceFactor; + public short Angles; + public short ReverseEnabled; + + public RaceMovement(ByteReader reader) : base(reader) + { + } + + public RaceMovement(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Speed = Reader.ReadInt16(); + Acceleration = Reader.ReadInt16(); + Deceleration = Reader.ReadInt16(); + RotationSpeed = Reader.ReadInt16(); + BounceFactor = Reader.ReadInt16(); + Angles = Reader.ReadInt16(); + ReverseEnabled = Reader.ReadInt16(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt16(Speed); + Writer.WriteInt16(Acceleration); + Writer.WriteInt16(Deceleration); + Writer.WriteInt16(RotationSpeed); + Writer.WriteInt16(BounceFactor); + Writer.WriteInt16(Angles); + Writer.WriteInt16(ReverseEnabled); + } + } } \ No newline at end of file diff --git a/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs b/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs index 048a190..63a5235 100644 --- a/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs +++ b/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Windows.Forms.VisualStyles; using CTFAK.MMFParser.EXE; using CTFAK.Utils; @@ -7,21 +9,21 @@ namespace CTFAK.MMFParser.MFA.Loaders { public class ChunkList : DataLoader//This is used for MFA reading/writing { - List _items = new List(); public byte[] Saved; - public bool Log; + public List Items = new List(); + public bool Log=false; public override void Write(ByteWriter Writer) { - if (Saved != null) + foreach (MFAChunk chunk in Items) { - Writer.WriteBytes(Saved); - } - else - { - Writer.WriteInt8(0); + chunk.Write(Writer); } + Writer.WriteInt8(0); + return; + } + public override void Print() { @@ -33,11 +35,14 @@ namespace CTFAK.MMFParser.MFA.Loaders var start = Reader.Tell(); while(true) { - var id = Reader.ReadByte(); - if(Log)Logger.Log("ChunkID: "+id); - if(id==0) break; - var data = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32())); + var newChunk = new MFAChunk(Reader); + newChunk.Read(); + if(Log)Logger.Log("ChunkID: "+newChunk.Id); + if(newChunk.Id==0) break; + else Items.Add(newChunk); + + } var size = Reader.Tell() - start; @@ -48,4 +53,99 @@ namespace CTFAK.MMFParser.MFA.Loaders } public ChunkList(ByteReader reader) : base(reader) { } } + + + public class MFAChunk + { + + public ByteReader Reader; + public MFAChunkLoader Loader; + public byte Id; + public byte[] Data; + + public MFAChunk(ByteReader reader) + { + Reader = reader; + } + public void Read() + { + Id = Reader.ReadByte(); + if (Id == 0) return; + var size = Reader.ReadInt32(); + Data = Reader.ReadBytes(size); + var dataReader = new ByteReader(Data); + switch (Id) + { + case 33: + Loader = new FrameVirtualRect(dataReader); + break; + default: + Loader = null; + break; + + } + Loader?.Read(); + + + + } + + public void Write(ByteWriter writer) + { + writer.WriteInt8(Id); + if (Id == 0) return; + if (Loader == null) + { + writer.WriteInt32(Data.Length); + writer.WriteBytes(Data); + } + else + { + var newWriter = new ByteWriter(new MemoryStream()); + Loader.Write(newWriter); + writer.WriteInt32((int) newWriter.Size()); + writer.WriteWriter(newWriter); + } + + + + } + } + public class FrameVirtualRect:MFAChunkLoader + { + public int Left; + public int Top; + public int Right; + public int Bottom; + public FrameVirtualRect(ByteReader reader) : base(reader){} + public override void Read() + { + Left = Reader.ReadInt32(); + Top = Reader.ReadInt32(); + Right = Reader.ReadInt32(); + Bottom = Reader.ReadInt32(); + + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt32(Left); + Writer.WriteInt32(Top); + Writer.WriteInt32(Right); + Writer.WriteInt32(Bottom); + + } + } + + + public abstract class MFAChunkLoader + { + public ByteReader Reader; + protected MFAChunkLoader(ByteReader reader) + { + Reader = reader; + } + public abstract void Read(); + public abstract void Write(ByteWriter Writer); + } } diff --git a/CTFAK/MMFParser/MFA/Loaders/Events.cs b/CTFAK/MMFParser/MFA/Loaders/Events.cs index 3f3f778..5ba038d 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Events.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Events.cs @@ -174,7 +174,7 @@ namespace CTFAK.MMFParser.MFA.Loaders } else if (name == EventEnd) { - _cache = Reader.ReadBytes(122); + // _cache = Reader.ReadBytes(122); break; } @@ -279,7 +279,7 @@ namespace CTFAK.MMFParser.MFA.Loaders Writer.WriteAscii(EventEnd); - Writer.WriteBytes(_cache); + // Writer.WriteBytes(_cache); diff --git a/CTFAK/MMFParser/MFA/Loaders/Frame.cs b/CTFAK/MMFParser/MFA/Loaders/Frame.cs index 2777009..284cedb 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Frame.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Frame.cs @@ -215,6 +215,7 @@ namespace CTFAK.MMFParser.MFA.Loaders } Chunks = new ChunkList(Reader); + Chunks.Log = true; Chunks.Read(); if(Events.Items.Count==0)MFA.emptyEvents = Events; diff --git a/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs b/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs index 532dc65..4c43ef0 100644 --- a/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs +++ b/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs @@ -73,7 +73,7 @@ namespace CTFAK.MMFParser.MFA.Loaders throw new NotImplementedException("invalid icon"); } Chunks = new ChunkList(Reader); - Chunks.Log = true; + // Chunks.Log = true; Chunks.Read(); if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks; diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs index 2c5c684..c74459d 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -24,12 +24,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks for (int i = 0; i < 9; i++) { - if(_qualifiers.Count { @@ -52,19 +54,26 @@ namespace CTFAK } if (args.Length > 1) { - ReadFile(args[1],true,false,true); - MFAGenerator.BuildMFA(); - Environment.Exit(0); + if (args[1].EndsWith(".exe")) + { + ReadFile(args[1],true,false,true); + MFAGenerator.BuildMFA(); + Environment.Exit(0); + } + else + { + var reader = new ByteReader(new FileStream(args[1],FileMode.Open)); + CleanData = new GameData(); + CleanData.Read(reader); + } + } else if(args.Length==0) { - if (LoadableSettings.instance["mainColor"] == null) - MyForm = new MainForm(Color.FromArgb(223, 114, 38)); - else - MyForm = new MainForm( - LoadableSettings.instance.ToActual(LoadableSettings.instance["mainColor"])); + MyForm = new MainForm(Color.FromArgb(223, 114, 38)); + Application.Run(MyForm); } - Application.Run(MyForm); + @@ -98,15 +107,25 @@ namespace CTFAK Settings.DumpImages = dumpImages; Settings.DumpSounds = dumpSounds; Settings.Verbose = verbose; - - var exeReader = new ByteReader(path, FileMode.Open); - var currentExe = new Exe(); - Exe.Instance = currentExe; - var stopWatch = new Stopwatch(); - stopWatch.Start(); - currentExe.ParseExe(exeReader); - stopWatch.Stop(); - Logger.Log("Finished in "+stopWatch.Elapsed.ToString("g"), true, ConsoleColor.Yellow); + if (path.EndsWith(".exe")) + { + + var exeReader = new ByteReader(path, FileMode.Open); + var currentExe = new Exe(); + Exe.Instance = currentExe; + var stopWatch = new Stopwatch(); + stopWatch.Start(); + currentExe.ParseExe(exeReader); + stopWatch.Stop(); + Logger.Log("Finished in "+stopWatch.Elapsed.ToString("g"), true, ConsoleColor.Yellow); + + } + else + { + var reader = new ByteReader(new FileStream(path,FileMode.Open)); + CleanData = new GameData(); + CleanData.Read(reader); + } }