diff --git a/CTFAK/CTFAK.csproj b/CTFAK/CTFAK.csproj index 95ced60..52c5391 100644 --- a/CTFAK/CTFAK.csproj +++ b/CTFAK/CTFAK.csproj @@ -127,6 +127,10 @@ + + ..\packages\zlib.net.1.0.4.0\lib\zlib.net.dll + True + @@ -176,7 +180,10 @@ + + + diff --git a/CTFAK/GUI/MainForm.Designer.cs b/CTFAK/GUI/MainForm.Designer.cs index e1fe2d3..8327c05 100644 --- a/CTFAK/GUI/MainForm.Designer.cs +++ b/CTFAK/GUI/MainForm.Designer.cs @@ -62,6 +62,7 @@ this.dumpPackButton = new System.Windows.Forms.Button(); this.packDataListBox = new System.Windows.Forms.ListBox(); this.objViewerTab = new System.Windows.Forms.TabPage(); + this.dumpSelectedBtn = new System.Windows.Forms.Button(); this.objViewerInfo = new System.Windows.Forms.Label(); this.imageViewerPlayAnim = new System.Windows.Forms.Button(); this.imageViewPictureBox = new System.Windows.Forms.PictureBox(); @@ -85,7 +86,6 @@ this.updateSettings = new System.Windows.Forms.Button(); this.colorBox = new System.Windows.Forms.TextBox(); this.packDataDialog = new System.Windows.Forms.SaveFileDialog(); - this.dumpSelectedBtn = new System.Windows.Forms.Button(); this.ChunkCombo.SuspendLayout(); this.tabControl1.SuspendLayout(); this.mainTab.SuspendLayout(); @@ -184,7 +184,7 @@ this.imageBar.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.imageBar.BackColor = System.Drawing.Color.Black; this.imageBar.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.imageBar.Location = new System.Drawing.Point(97, 272); + this.imageBar.Location = new System.Drawing.Point(97, 326); this.imageBar.Name = "imageBar"; this.imageBar.Size = new System.Drawing.Size(126, 24); this.imageBar.Step = 2; @@ -199,7 +199,7 @@ this.imageLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.imageLabel.Font = new System.Drawing.Font("Courier New", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.imageLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.imageLabel.Location = new System.Drawing.Point(229, 272); + this.imageLabel.Location = new System.Drawing.Point(229, 326); this.imageLabel.Name = "imageLabel"; this.imageLabel.Size = new System.Drawing.Size(126, 24); this.imageLabel.TabIndex = 9; @@ -214,7 +214,7 @@ this.soundLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.soundLabel.Font = new System.Drawing.Font("Courier New", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.soundLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.soundLabel.Location = new System.Drawing.Point(229, 320); + this.soundLabel.Location = new System.Drawing.Point(229, 374); this.soundLabel.Name = "soundLabel"; this.soundLabel.Size = new System.Drawing.Size(126, 24); this.soundLabel.TabIndex = 11; @@ -227,7 +227,7 @@ this.soundBar.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.soundBar.BackColor = System.Drawing.Color.Black; this.soundBar.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.soundBar.Location = new System.Drawing.Point(97, 320); + this.soundBar.Location = new System.Drawing.Point(97, 374); this.soundBar.Name = "soundBar"; this.soundBar.Size = new System.Drawing.Size(126, 23); this.soundBar.Step = 2; @@ -242,7 +242,7 @@ this.FolderBTN.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.FolderBTN.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.FolderBTN.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.FolderBTN.Location = new System.Drawing.Point(8, 214); + this.FolderBTN.Location = new System.Drawing.Point(8, 268); this.FolderBTN.Name = "FolderBTN"; this.FolderBTN.Size = new System.Drawing.Size(83, 42); this.FolderBTN.TabIndex = 12; @@ -258,7 +258,7 @@ this.soundsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.soundsButton.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.soundsButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.soundsButton.Location = new System.Drawing.Point(8, 310); + this.soundsButton.Location = new System.Drawing.Point(8, 364); this.soundsButton.Name = "soundsButton"; this.soundsButton.Size = new System.Drawing.Size(83, 42); this.soundsButton.TabIndex = 14; @@ -274,7 +274,7 @@ this.imagesButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.imagesButton.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.imagesButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.imagesButton.Location = new System.Drawing.Point(8, 262); + this.imagesButton.Location = new System.Drawing.Point(8, 316); this.imagesButton.Name = "imagesButton"; this.imagesButton.Size = new System.Drawing.Size(83, 42); this.imagesButton.TabIndex = 15; @@ -326,7 +326,7 @@ this.musicsButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.musicsButton.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.musicsButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.musicsButton.Location = new System.Drawing.Point(8, 358); + this.musicsButton.Location = new System.Drawing.Point(8, 412); this.musicsButton.Name = "musicsButton"; this.musicsButton.Size = new System.Drawing.Size(83, 42); this.musicsButton.TabIndex = 21; @@ -340,7 +340,7 @@ this.musicBar.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.musicBar.BackColor = System.Drawing.Color.Black; this.musicBar.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.musicBar.Location = new System.Drawing.Point(97, 368); + this.musicBar.Location = new System.Drawing.Point(97, 422); this.musicBar.Name = "musicBar"; this.musicBar.Size = new System.Drawing.Size(126, 23); this.musicBar.Step = 2; @@ -355,7 +355,7 @@ this.musicLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.musicLabel.Font = new System.Drawing.Font("Courier New", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204))); this.musicLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); - this.musicLabel.Location = new System.Drawing.Point(229, 368); + this.musicLabel.Location = new System.Drawing.Point(229, 422); this.musicLabel.Name = "musicLabel"; this.musicLabel.Size = new System.Drawing.Size(126, 24); this.musicLabel.TabIndex = 23; @@ -535,6 +535,17 @@ this.objViewerTab.TabIndex = 1; this.objViewerTab.Text = "Objects"; // + // dumpSelectedBtn + // + this.dumpSelectedBtn.Dock = System.Windows.Forms.DockStyle.Bottom; + this.dumpSelectedBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.dumpSelectedBtn.Location = new System.Drawing.Point(201, 426); + this.dumpSelectedBtn.Name = "dumpSelectedBtn"; + this.dumpSelectedBtn.Size = new System.Drawing.Size(731, 25); + this.dumpSelectedBtn.TabIndex = 4; + this.dumpSelectedBtn.Text = "Dump Selected"; + this.dumpSelectedBtn.UseVisualStyleBackColor = true; + // // objViewerInfo // this.objViewerInfo.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -786,18 +797,6 @@ // this.packDataDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.packDataDialog_FileOk); // - // dumpSelectedBtn - // - this.dumpSelectedBtn.Dock = System.Windows.Forms.DockStyle.Bottom; - this.dumpSelectedBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.dumpSelectedBtn.Location = new System.Drawing.Point(201, 426); - this.dumpSelectedBtn.Name = "dumpSelectedBtn"; - this.dumpSelectedBtn.Size = new System.Drawing.Size(731, 25); - this.dumpSelectedBtn.TabIndex = 4; - this.dumpSelectedBtn.Text = "Dump Selected"; - this.dumpSelectedBtn.UseVisualStyleBackColor = true; - this.dumpSelectedBtn.MouseClick += dumpSelectedBtn_Click; - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/CTFAK/GUI/MainForm.cs b/CTFAK/GUI/MainForm.cs index 2391a9b..0211d16 100644 --- a/CTFAK/GUI/MainForm.cs +++ b/CTFAK/GUI/MainForm.cs @@ -494,6 +494,8 @@ namespace CTFAK.GUI private void dumpMFAButton_Click(object sender, EventArgs e) { + var msg = MessageBox.Show("By using CTFAK, you agree that you will only used the decompiled MFAs for personal use and educational purposes.\nYou also agree that unless you are the original creator or have been given permission, you will not recompile any games using this tool.","Warning",MessageBoxButtons.OKCancel); + if(msg != DialogResult.OK) Environment.Exit(0); var worker = new BackgroundWorker(); worker.DoWork += (workSender, workE) => MFAGenerator.BuildMFA(); worker.RunWorkerCompleted += (workSender, workE) => @@ -624,41 +626,45 @@ namespace CTFAK.GUI if (common.Parent.ObjectType == 2) //Active { if (common.Animations != null) - foreach (var pair in common.Animations.AnimationDict) + foreach (var pair in common.Animations?.AnimationDict) { var animNode = new ChunkNode($"Animation {pair.Key}", pair.Value); objInstNode.Nodes.Add(animNode); - foreach (var dir in pair.Value.DirectionDict) - if (pair.Value.DirectionDict.Count > 1) - { - var dirNode = new ChunkNode( - $"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}", - dir.Value); - animNode.Nodes.Add(dirNode); - for (var a = 0; a < dir.Value.Frames.Count; a++) + if (pair.Value?.DirectionDict != null) + if (pair.Value?.DirectionDict != null) + { + foreach (var dir in pair.Value?.DirectionDict) + if (pair.Value.DirectionDict.Count > 1) { - var animFrame = dir.Value.Frames[a]; - bank.Images.TryGetValue(animFrame, out var img); - if (img != null) + var dirNode = new ChunkNode( + $"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}", + dir.Value); + animNode.Nodes.Add(dirNode); + for (var a = 0; a < dir.Value.Frames.Count; a++) { - var animFrameNode = new ChunkNode(a.ToString(), img); - dirNode.Nodes.Add(animFrameNode); + var animFrame = dir.Value.Frames[a]; + bank.Images.TryGetValue(animFrame, out var img); + if (img != null) + { + var animFrameNode = new ChunkNode(a.ToString(), img); + dirNode.Nodes.Add(animFrameNode); + } } } - } - else - { - for (var a = 0; a < dir.Value.Frames.Count; a++) + else { - var animFrame = dir.Value.Frames[a]; - bank.Images.TryGetValue(animFrame, out var img); - if (img != null) + for (var a = 0; a < dir.Value.Frames.Count; a++) { - var animFrameNode = new ChunkNode(a.ToString(), img); - animNode.Nodes.Add(animFrameNode); + var animFrame = dir.Value.Frames[a]; + bank.Images.TryGetValue(animFrame, out var img); + if (img != null) + { + var animFrameNode = new ChunkNode(a.ToString(), img); + animNode.Nodes.Add(animFrameNode); + } } } - } + } } } else if(common.Parent.ObjectType==7)//Counter diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index 5f95b58..b8a5804 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -4,6 +4,7 @@ using System.IO; using CTFAK.MMFParser.EXE.Loaders; using CTFAK.MMFParser.EXE.Loaders.Banks; using CTFAK.MMFParser.EXE.Loaders.Events; +using CTFAK.Properties.Locale; using CTFAK.Utils; namespace CTFAK.MMFParser.EXE @@ -13,33 +14,50 @@ namespace CTFAK.MMFParser.EXE public List Chunks = new List(); public bool Verbose = false; public List Frames = new List(); + public void Read(ByteReader reader) { Chunks.Clear(); - while (true) + if (!Settings.Old) { - Chunk chunk = new Chunk(Chunks.Count, this); - chunk.Verbose = Verbose; - chunk.Read(reader); - if (chunk.Id == 26214) + while (true) { - if(!Settings.twofiveplus) chunk.Loader = LoadChunk(chunk); - //LoadChunk(chunk); - } - else - { - chunk.Loader = LoadChunk(chunk); - } + Chunk chunk = new Chunk(Chunks.Count, this); + chunk.Verbose = Verbose; + chunk.Read(reader); + if (chunk.Id == 26214) + { + if(!Settings.twofiveplus) chunk.Loader = LoadModern(chunk); + //LoadChunk(chunk); + } + else + { + chunk.Loader = LoadModern(chunk); + } - Chunks.Add(chunk); - if (chunk.Id == 8750) chunk.BuildKey(); - if (chunk.Id == 8788) Settings.twofiveplus = true; + Chunks.Add(chunk); + if (chunk.Id == 8750) chunk.BuildKey(); + if (chunk.Id == 8788) Settings.twofiveplus = true; - if (reader.Tell() >= reader.Size()) break; - if (chunk.Id == 32639) break; //LAST chunkID + if (reader.Tell() >= reader.Size()) break; + if (chunk.Id == 32639) break; //LAST chunkID + } + } + else + { + while (true) + { + Chunk chunk = new Chunk(Chunks.Count, this); + chunk.Verbose = Verbose; + chunk.Read(reader); + chunk.Loader = LoadOld(chunk); + if (reader.Tell() >= reader.Size()) break; + if (chunk.Id == 32639) break; //LAST chunkID + } } + } public class Chunk @@ -82,6 +100,7 @@ namespace CTFAK.MMFParser.EXE exeReader.BaseStream.Position -= Size; //Saving raw data cuz why not } + if(Settings.Old) Logger.Log("Reading old chunk"+(Constants.ChunkNames)Id); switch (Flag) { @@ -92,7 +111,12 @@ namespace CTFAK.MMFParser.EXE ChunkData = Decryption.DecodeMode3(exeReader.ReadBytes(Size), Size,Id,out DecompressedSize); break; case ChunkFlags.Compressed: - ChunkData = Decompressor.Decompress(exeReader,out DecompressedSize); + if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize); + else + { + Int32 decompSize = exeReader.ReadInt32(); + ChunkData = Decompressor.decompressOld(exeReader, Size, decompSize); + } break; case ChunkFlags.NotCompressed: ChunkData = exeReader.ReadBytes(Size); @@ -165,7 +189,7 @@ namespace CTFAK.MMFParser.EXE CompressedAndEncrypted = 3 } - public ChunkLoader LoadChunk(Chunk chunk) + public ChunkLoader LoadModern(Chunk chunk) { ChunkLoader loader = null; switch (chunk.Id) @@ -272,6 +296,26 @@ namespace CTFAK.MMFParser.EXE loader?.Read(); return loader; } + + public ChunkLoader LoadOld(Chunk chunk) + { + ChunkLoader loader = null; + switch (chunk.Id) + { + case 8739: + loader = new AppHeader(chunk); + break; + } + loader?.Read(); + return loader; + + } + + + + + + public T GetChunk() where T : ChunkLoader { foreach (Chunk chunk in Chunks) diff --git a/CTFAK/MMFParser/EXE/EXE.cs b/CTFAK/MMFParser/EXE/EXE.cs index 7c6fae9..62a80be 100644 --- a/CTFAK/MMFParser/EXE/EXE.cs +++ b/CTFAK/MMFParser/EXE/EXE.cs @@ -62,7 +62,8 @@ namespace CTFAK.MMFParser.EXE exeReader.Seek(possition); var firstShort = exeReader.PeekUInt16(); Logger.Log("First Short: " + firstShort.ToString("X2"), true, ConsoleColor.Yellow); - if (firstShort != 0x7777) Settings.Old = true; + if (firstShort == 0x7777) Settings.Old = false; + else if (firstShort == 0x222c) Settings.Old = true; if (!Settings.Old) { PackData = new PackData(); @@ -74,13 +75,12 @@ namespace CTFAK.MMFParser.EXE } else { - Logger.Log("Game is too old"); + Logger.Log("Using old system"); var oldData = new ChunkList(); oldData.Read(exeReader); GameData = new GameData(); GameData.Read(exeReader); Console.ForegroundColor = ConsoleColor.DarkGreen; - Logger.Log("Failed to find PackData header!\n", true, ConsoleColor.Red); } } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 8b63c5e..680f1f0 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) { @@ -451,6 +451,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } writer.WriteInt32(Handle); + // writer.WriteInt32(Handle-1);//FNAC3 FIX writer.WriteWriter(chunk); } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs index 7d2b16d..1196da3 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs @@ -23,7 +23,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public override void Write(ByteWriter Writer) { ByteWriter newWriter = new ByteWriter(new MemoryStream()); - Logger.Log($"{ObjectType}-{Num}-{ObjectInfo}-{ObjectInfoList}-{Flags}-{OtherFlags}-{Items.Count}-{DefType}-{Identifier}"); + // Logger.Log($"{ObjectType}-{Num}-{ObjectInfo}-{ObjectInfoList}-{Flags}-{OtherFlags}-{Items.Count}-{DefType}-{Identifier}"); newWriter.WriteInt16((short) ObjectType); if (Num == -42) Num = -27; newWriter.WriteInt16((short) Num); @@ -68,7 +68,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events item.Read(); Items.Add(item); } - Logger.Log(this); + // Logger.Log(this); Reader.Seek(currentPosition + size); @@ -137,7 +137,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events item.Read(); Items.Add(item); } - Logger.Log(this); + // Logger.Log(this); } public override string ToString() diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs index 317af8b..bd9b628 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs @@ -27,6 +27,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions if (ObjectType == Constants.ObjectType.System && (Num == 0 || Num == 3 || Num == 23 || Num == 24 || Num == 50)) { + if(Loader==null) throw new NotImplementedException("Broken expression: "+Num); Loader.Write(newWriter); } else if ((int) ObjectType >= 2 || (int) ObjectType == -7) @@ -34,15 +35,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions newWriter.WriteInt16((short) ObjectInfo); newWriter.WriteInt16((short) ObjectInfoList); if(Num==16||Num==19)Loader.Write(newWriter); - } - newWriter.WriteInt32(0); newWriter.WriteUInt16(0); + Writer.WriteInt16((short) ((newWriter.Size()))); Writer.WriteWriter(newWriter); - } public override void Print() @@ -64,8 +63,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions { if(Num==0) Loader=new LongExp(Reader); else if(Num==3) Loader= new StringExp(Reader); - else if (Num == 23) Loader = null; - else if (Num == 24) Loader = null; + else if (Num == 23) Loader = new DoubleExp(Reader); + else if (Num == 24) Loader = new GlobalCommon(Reader); else if (Num == 50) Loader = null; else if((int)ObjectType>=2|| (int)ObjectType==-7) { @@ -196,4 +195,50 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions Writer.WriteInt16((short) Value); } } + public class DoubleExp:ExpressionLoader + { + public float FloatValue; + + public DoubleExp(ByteReader reader) : base(reader) + { + } + + public DoubleExp(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Value = Reader.ReadDouble(); + FloatValue = Reader.ReadSingle(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteDouble((double) Value); + Writer.WriteSingle(FloatValue); + } + } + public class GlobalCommon:ExpressionLoader + { + public GlobalCommon(ByteReader reader) : base(reader) + { + } + + public GlobalCommon(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Reader.ReadInt32(); + Value = Reader.ReadInt32(); + } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt32(0); + Writer.WriteInt32((int) Value); + } + } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Every.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Every.cs index 6594a6c..5830180 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Every.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Every.cs @@ -6,8 +6,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { public int Delay; public int Compteur; - - + public Every(ByteReader reader) : base(reader) { } public override void Read() { @@ -15,6 +14,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters Compteur = Reader.ReadInt32(); } + + public override void Write(ByteWriter Writer) + { + Writer.WriteInt32(Delay); + Writer.WriteInt32(Compteur); + } + public override string ToString() { return $"Every {Delay/1000} sec"; diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs index 074da1e..4f17d9d 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs @@ -22,7 +22,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { var expression = new Expression(Reader); expression.Read(); - Logger.Log($"Found expression {expression.ObjectType}-{expression.Num}=={((ExpressionLoader)expression.Loader)?.Value}"); + // Logger.Log($"Found expression {expression.ObjectType}-{expression.Num}=={((ExpressionLoader)expression.Loader)?.Value}"); if (expression.ObjectType == 0&& expression.Num==0) { break; @@ -37,10 +37,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Write(ByteWriter Writer) { Writer.WriteInt16(Comparsion); - Logger.Log("ExpressionCount: "+Items.Count); + // Logger.Log("ExpressionCount: "+Items.Count); foreach (Expression item in Items) { - Logger.Log("Writing expression: "+item.Num); + // Logger.Log("Writing expression: "+item.Num); item.Write(Writer); } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/GroupPointer.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/GroupPointer.cs index b7dcacc..9ea80cf 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/GroupPointer.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/GroupPointer.cs @@ -13,7 +13,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Read() { - base.Read(); Pointer = Reader.ReadInt32(); Id = Reader.ReadInt16(); @@ -21,7 +20,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Write(ByteWriter Writer) { - base.Write(Writer); Writer.WriteInt32(Pointer); Writer.WriteInt32(Id); } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Zone.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Zone.cs index 6acef0d..f66120d 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Zone.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Zone.cs @@ -15,7 +15,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Read() { - base.Read(); X1 = Reader.ReadInt16(); Y1 = Reader.ReadInt16(); X2 = Reader.ReadInt16(); @@ -24,7 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Write(ByteWriter Writer) { - base.Write(Writer); Writer.WriteInt16(X1); Writer.WriteInt16(Y1); Writer.WriteInt16(X2); diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs index a795ba9..e136f85 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs @@ -87,6 +87,7 @@ namespace CTFAK.MMFParser.EXE.Loaders Flags.flag = actualLoader.Flags; UInt32 inkEffect = actualLoader.InkEffect; + InkEffectValue = (int) actualLoader.InkEffectParameter; Transparent = ByteFlag.GetFlag(inkEffect, 28); Antialias = ByteFlag.GetFlag(inkEffect, 29); } @@ -136,6 +137,7 @@ namespace CTFAK.MMFParser.EXE.Loaders } else if (ObjectType==0)//QuickBackdrop { + } @@ -189,8 +191,7 @@ namespace CTFAK.MMFParser.EXE.Loaders //TODO: Fix shit if(ObjectType==0)//QuickBackdrop { - - + Loader=new Quickbackdrop(Reader); } else if (ObjectType == 1)//Backdrop { diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs index 6cf1594..118edd1 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Animations.cs @@ -39,6 +39,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects AnimationDict.Add(i,anim); } + else + { + AnimationDict.Add(i,new Animation((ByteReader) null)); + } } @@ -89,6 +93,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects dir.Read(); DirectionDict.Add(i,dir); } + } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs index 6642541..fd92cbe 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs @@ -1,4 +1,5 @@ -using CTFAK.Utils; +using System.Drawing; +using CTFAK.Utils; namespace CTFAK.MMFParser.EXE.Loaders.Objects { @@ -50,6 +51,101 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects throw new System.NotImplementedException(); } + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } + public class Quickbackdrop:ChunkLoader + { + public int Size; + public Obstacle ObstacleType; + public Collision CollisionType; + public int Width; + public int Height; + public int Image; + public Shape Shape; + + public Quickbackdrop(ByteReader reader) : base(reader) + { + } + + public Quickbackdrop(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Size = Reader.ReadInt32(); + ObstacleType = (Obstacle) Reader.ReadInt16(); + CollisionType = (Collision) Reader.ReadInt16(); + Width = Reader.ReadInt32(); + Height = Reader.ReadInt32(); + Shape = new Shape(Reader); + Shape.Read(); + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } + public class Shape:ChunkLoader + { + public short BorderSize; + public Color BorderColor; + public short ShapeType; + public short FillType; + public short LineFlags; + public Color Color1; + public Color Color2; + public short GradFlags; + public short Image=15; + + public Shape(ByteReader reader) : base(reader) + { + } + + public Shape(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + BorderSize = Reader.ReadInt16(); + BorderColor = Reader.ReadColor(); + ShapeType = Reader.ReadInt16(); + FillType = Reader.ReadInt16(); + if (ShapeType == 1) + { + LineFlags = Reader.ReadInt16(); + } + else if (FillType == 1) + { + Color1 = Reader.ReadColor(); + } + else if (FillType == 2) + { + Color1 = Reader.ReadColor(); + Color2 = Reader.ReadColor(); + GradFlags = Reader.ReadInt16(); + } + else if(FillType==3) + { + Image = Reader.ReadInt16(); + } + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + public override string[] GetReadableData() { throw new System.NotImplementedException(); diff --git a/CTFAK/MMFParser/MFA/Loaders/Events.cs b/CTFAK/MMFParser/MFA/Loaders/Events.cs index c6bb93e..3f3f778 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Events.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Events.cs @@ -64,7 +64,6 @@ namespace CTFAK.MMFParser.MFA.Loaders { string name = Reader.ReadAscii(4); - Console.WriteLine(name); if (name == EventData) { EventDataLen = Reader.ReadUInt32(); @@ -158,7 +157,7 @@ namespace CTFAK.MMFParser.MFA.Loaders } else if (name == EditorPositionData) { - if(Reader.ReadUInt16()!=1) throw new NotImplementedException("Invalid chunkversion"); + if(Reader.ReadUInt16()!=1)throw new NotImplementedException("Invalid chunkversion"); X = Reader.ReadUInt32(); Y = Reader.ReadUInt32(); CaretType = Reader.ReadUInt32(); @@ -167,7 +166,7 @@ namespace CTFAK.MMFParser.MFA.Loaders } else if (name == EditorLineData) { - if(Reader.ReadUInt16()!=1) throw new NotImplementedException("Invalid chunkversion"); + if(Reader.ReadUInt16()!=1)throw new NotImplementedException("Invalid chunkversion"); LineY = Reader.ReadUInt32(); LineItemType = Reader.ReadUInt32(); EventLine = Reader.ReadUInt32(); @@ -176,6 +175,7 @@ namespace CTFAK.MMFParser.MFA.Loaders else if (name == EventEnd) { _cache = Reader.ReadBytes(122); + break; } else throw new NotImplementedException("Fuck Something is Broken"); @@ -209,7 +209,7 @@ namespace CTFAK.MMFParser.MFA.Loaders } - if (Objects.Count>0) + if (Objects?.Count>0) { Console.WriteLine("Writing EventObjects"); Writer.WriteAscii(ObjectData); @@ -278,9 +278,10 @@ namespace CTFAK.MMFParser.MFA.Loaders Writer.WriteAscii(EventEnd); - Writer.WriteBytes(_cache); - + Writer.WriteBytes(_cache); + + //TODO: Fix commented part // diff --git a/CTFAK/MMFParser/MFA/Loaders/Frame.cs b/CTFAK/MMFParser/MFA/Loaders/Frame.cs index a55aad8..e4c94f6 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Frame.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Frame.cs @@ -19,8 +19,6 @@ namespace CTFAK.MMFParser.MFA.Loaders public int LastViewedY; public List Folders = new List(); public List Instances = new List(); - public List UnkBlocks = new List(); - public BitDict Flags = new BitDict(new string[] { "GrabDesktop", @@ -41,11 +39,12 @@ namespace CTFAK.MMFParser.MFA.Loaders public List Palette; public int StampHandle; public int ActiveLayer; - public List Layers; + public List Layers = new List(); public Events Events; public ChunkList Chunks; public Transition FadeIn; public Transition FadeOut; + public int PaletteSize; public Frame(ByteReader reader) : base(reader) { @@ -94,12 +93,11 @@ namespace CTFAK.MMFParser.MFA.Loaders } else Writer.Skip(1); + Writer.WriteInt32(Items.Count); foreach (var item in Items) { item.Write(Writer); - var bytes = new byte[] {0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00}; - } Writer.WriteInt32(Folders.Count); @@ -113,20 +111,16 @@ namespace CTFAK.MMFParser.MFA.Loaders { item.Write(Writer); } - // Writer.WriteAscii("AI"); - - /*if (UnkBlocks != null) - { - Writer.WriteInt32(UnkBlocks.Count); - foreach (var item in UnkBlocks) - { - Writer.WriteBytes(item); - } - }*/ - Events.Write(Writer); + // for (int i=0;i(); for (int i = 0; i < 257; i++) { @@ -162,7 +156,6 @@ namespace CTFAK.MMFParser.MFA.Loaders StampHandle = Reader.ReadInt32(); ActiveLayer = Reader.ReadInt32(); int layersCount = Reader.ReadInt32(); - Layers = new List(); for (int i = 0; i < layersCount; i++) { var layer = new Layer(Reader); @@ -181,8 +174,6 @@ namespace CTFAK.MMFParser.MFA.Loaders FadeOut = new Transition(Reader); FadeOut.Read(); } - - Items = new List(); var frameItemsCount = Reader.ReadInt32(); for (int i = 0; i < frameItemsCount; i++) { @@ -191,8 +182,6 @@ namespace CTFAK.MMFParser.MFA.Loaders Items.Add(frameitem); } - - Folders = new List(); var folderCount = Reader.ReadInt32(); for (int i = 0; i < folderCount; i++) { @@ -200,8 +189,6 @@ namespace CTFAK.MMFParser.MFA.Loaders folder.Read(); Folders.Add(folder); } - - Instances = new List(); var instancesCount = Reader.ReadInt32(); for (int i = 0; i < instancesCount; i++) { @@ -210,14 +197,15 @@ namespace CTFAK.MMFParser.MFA.Loaders Instances.Add(inst); } - //var unkCount = Reader.ReadInt32(); - //for (int i = 0; i < unkCount; i++) - //{ - // UnkBlocks.Add(Reader.ReadBytes(32)); - //} + // var unkCount = Reader.ReadInt32(); + // for (int i = 0; i < unkCount; i++) + // { + // UnkBlocks.Add(Reader.ReadBytes(32)); + // } Events = new Events(Reader); Events.Read(); + Chunks = new ChunkList(Reader); 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 cc61f83..a84371d 100644 --- a/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs +++ b/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs @@ -79,11 +79,14 @@ namespace CTFAK.MMFParser.MFA.Loaders Loader = new ExtensionObject(Reader); + } + else if(ObjectType==7) + { + Loader = new Counter(Reader); } else if(ObjectType==2) { Loader = new Active(Reader); - } Loader?.Read(); diff --git a/CTFAK/MMFParser/MFA/Loaders/Layer.cs b/CTFAK/MMFParser/MFA/Loaders/Layer.cs index 284939e..def7b89 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Layer.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Layer.cs @@ -43,6 +43,7 @@ namespace CTFAK.MMFParser.MFA.Loaders Flags.flag = (uint) Reader.ReadInt32(); XCoefficient = Reader.ReadSingle(); YCoefficient = Reader.ReadSingle(); + diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Backdrop.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Backdrop.cs index 80a4337..cc3b548 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Backdrop.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Backdrop.cs @@ -1,4 +1,5 @@ -using CTFAK.MMFParser.EXE; +using System.Drawing; +using CTFAK.MMFParser.EXE; using CTFAK.Utils; namespace CTFAK.MMFParser.MFA.Loaders.mfachunks @@ -27,6 +28,59 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks Writer.WriteInt32(Handle); } } + public class QuickBackdrop:BackgroundLoader + { + public int Width; + public int Height; + public int Shape; + public int BorderSize; + public Color BorderColor; + public int FillType; + public Color Color1; + public Color Color2; + public int Flags; + public int Image; + + public QuickBackdrop(ByteReader reader) : base(reader) + { + } + + public QuickBackdrop(EXE.ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + base.Read(); + Width = Reader.ReadInt32(); + Height = Reader.ReadInt32(); + Shape = Reader.ReadInt32(); + BorderSize = Reader.ReadInt32(); + BorderColor = Reader.ReadColor(); + + FillType = Reader.ReadInt32(); + Color1 = Reader.ReadColor(); + Color2 = Reader.ReadColor(); + Flags = Reader.ReadInt32(); + Image = Reader.ReadInt32(); + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + Writer.WriteInt32(Width); + Writer.WriteInt32(Height); + Writer.WriteInt32(Shape); + Writer.WriteInt32(BorderSize); + Writer.WriteColor(BorderColor); + + Writer.WriteInt32(FillType); + Writer.WriteColor(Color1); + Writer.WriteColor(Color2); + Writer.WriteInt32(Flags); + Writer.WriteInt32(Image); + } + } public class BackgroundLoader : DataLoader { diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Lives.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Lives.cs new file mode 100644 index 0000000..f0ede64 --- /dev/null +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Lives.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.MFA.Loaders.mfachunks +{ + public class Lives:ObjectLoader + { + public uint Player; + public List Images; + public int Flags; + public int DisplayType; + public int Font; + public int Width; + public int Height; + + public Lives(ByteReader reader) : base(reader) + { + } + + public override void Read() + { + base.Read(); + Player = Reader.ReadUInt32(); + Images = new List(); + var imgCount = Reader.ReadInt32(); + for (int i = 0; i < imgCount; i++) + { + Images.Add(Reader.ReadInt32()); + } + + DisplayType = Reader.ReadInt32(); + Flags = Reader.ReadInt32(); + Font = Reader.ReadInt32(); + Width = Reader.ReadInt32(); + Height = Reader.ReadInt32(); + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + Writer.WriteInt32((int) Player); + Writer.WriteInt32(Images.Count); + foreach (int i in Images) + { + Writer.WriteInt32(i); + } + Writer.WriteInt32(DisplayType); + Writer.WriteInt32(Flags); + Writer.WriteInt32(Font); + Writer.WriteInt32(Width); + Writer.WriteInt32(Height); + + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/MFA/MFA.cs b/CTFAK/MMFParser/MFA/MFA.cs index faa57a5..f691191 100644 --- a/CTFAK/MMFParser/MFA/MFA.cs +++ b/CTFAK/MMFParser/MFA/MFA.cs @@ -395,6 +395,7 @@ namespace CTFAK.MMFParser.MFA List frameOffsets = new List(); var offCount = Reader.ReadInt32(); + Logger.Log("FRAME COUNT: "+offCount); for (int i = 0; i < offCount; i++) { frameOffsets.Add(Reader.ReadInt32()); diff --git a/CTFAK/MMFParser/OLD/Loaders/AppHeader.cs b/CTFAK/MMFParser/OLD/Loaders/AppHeader.cs new file mode 100644 index 0000000..e033c1d --- /dev/null +++ b/CTFAK/MMFParser/OLD/Loaders/AppHeader.cs @@ -0,0 +1,44 @@ +using CTFAK.MMFParser.EXE; +using CTFAK.MMFParser.EXE.Loaders; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.OLD.Loaders +{ + public class AppHeader:ChunkLoader + { + public AppHeader(ByteReader reader) : base(reader) + { + } + + public AppHeader(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + var flags = Reader.ReadUInt16(); + var newFlags = Reader.ReadUInt16(); + var mode = Reader.ReadUInt16(); + var otherFlags = Reader.ReadUInt16(); + + var windowWidth = Reader.ReadUInt16(); + var windowHeight = Reader.ReadUInt16(); + var initialScore = Reader.ReadUInt32() ^ 0xffffffff; + var initialLives = Reader.ReadUInt32() ^ 0xffffffff; + var controls = new Controls(Reader); + controls.Read(); + var borderColor = Reader.ReadColor(); + var frameCount = Reader.ReadInt32(); + } + + 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/OLD/Loaders/Controls.cs b/CTFAK/MMFParser/OLD/Loaders/Controls.cs new file mode 100644 index 0000000..cd9ebaa --- /dev/null +++ b/CTFAK/MMFParser/OLD/Loaders/Controls.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using CTFAK.MMFParser.EXE; +using CTFAK.MMFParser.EXE.Loaders; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.OLD.Loaders +{ + public class Controls:ChunkLoader + { + public List Items; + + public Controls(ByteReader reader) : base(reader) + { + } + + public Controls(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Items = new List(); + for (int i = 0; i < 4; i++) + { + var control = new PlayerControl(Reader); + control.Read(); + Items.Add(control); + } + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } + public class PlayerControl:ChunkLoader + { + public Keys Keys; + + public PlayerControl(ByteReader reader) : base(reader) + { + } + + public PlayerControl(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Keys = new Keys(Reader); + Keys.Read(); + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } + public class Keys:ChunkLoader + { + public Keys(ByteReader reader) : base(reader) + { + } + + public Keys(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + var up = Reader.ReadUInt16(); + var down = Reader.ReadUInt16(); + var left = Reader.ReadUInt16(); + var right = Reader.ReadUInt16(); + var btn1 = Reader.ReadUInt16(); + var btn2 = Reader.ReadUInt16(); + } + + 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/Translation/MFAGenerator.cs b/CTFAK/MMFParser/Translation/MFAGenerator.cs index 6498788..e0f7ff7 100644 --- a/CTFAK/MMFParser/Translation/MFAGenerator.cs +++ b/CTFAK/MMFParser/Translation/MFAGenerator.cs @@ -1,8 +1,15 @@ using System.IO; +using System.Linq; using System.Net; using System.Windows.Forms; using CTFAK.MMFParser.EXE; +using CTFAK.MMFParser.EXE.Loaders; +using CTFAK.MMFParser.EXE.Loaders.Banks; +using CTFAK.MMFParser.MFA.Loaders; using CTFAK.Utils; +using ChunkList = CTFAK.MMFParser.MFA.Loaders.ChunkList; +using Frame = CTFAK.MMFParser.MFA.Loaders.Frame; +using Layer = CTFAK.MMFParser.MFA.Loaders.Layer; namespace CTFAK.MMFParser.Translation { @@ -36,6 +43,9 @@ namespace CTFAK.MMFParser.Translation else return null; } 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); Settings.DoMFA = true; var template = new MFA.MFA(mfaReader); @@ -46,7 +56,7 @@ namespace CTFAK.MMFParser.Translation var mfaWriter = new ByteWriter( - Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Exe.Instance.GameData.Name}-decompiled.mfa" : "out.mfa", + Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Path.GetFileNameWithoutExtension(Exe.Instance.GameData.GameChunks.GetChunk().Value)}.mfa" : "out.mfa", FileMode.Create); //New writer for new MFA Pame2Mfa.Message(""); Pame2Mfa.Message("Writing MFA"); @@ -68,6 +78,37 @@ namespace CTFAK.MMFParser.Translation //Add modifications + var mfaWriter = new ByteWriter(outputPath, FileMode.Create); + template.Write(mfaWriter); + }public static void WriteTestMFA() + { + var outputPath = Path.Combine(Path.GetDirectoryName(TemplatePath), "patchNew.mfa"); + var mfaReader = new ByteReader(TemplatePath, FileMode.Open); + var template = new MFA.MFA(mfaReader); + Settings.DoMFA = true; + template.Read(); + var refer = template.Frames.FirstOrDefault(); + // template.Frames.Clear(); + + for (int i = 0; i < 25; i++) + { + var frame = refer; + frame.Handle = i; + frame.Name = "Frame " + i; + + frame.Chunks = new ChunkList(null); + frame.Events = MFA.MFA.emptyEvents; + frame.Palette = refer.Palette; + // frame.Layers.Add(new Layer(null) + // { + // Name="Layer" + // }); + template.Frames.Add(frame); + + } + //Add modifications + + var mfaWriter = new ByteWriter(outputPath, FileMode.Create); template.Write(mfaWriter); } diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index ef60fae..2178fa8 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -30,16 +30,15 @@ namespace CTFAK.MMFParser.Translation public static Dictionary FrameItems; public static event Program.DumperEvent OnMessage; + + public static void Translate(ref MFA.MFA mfa, GameData game) { Message("Running Pame2MFA"); Message("Original MFA Build: " + mfa.BuildVersion); Message(""); - // mfa.MfaBuild = 4; - // mfa.Product = (int) game.ProductVersion; - // mfa.BuildVersion = 283; mfa.Name = game.Name; - mfa.LangId = 8192; + mfa.LangId = 0;//8192; mfa.Description = ""; mfa.Path = game.EditorFilename; @@ -68,12 +67,15 @@ namespace CTFAK.MMFParser.Translation var flags = game.Header.Flags; var newFlags = game.Header.NewFlags; mfa.Extensions.Clear(); - //TODO:Flags, no setter + displaySettings["MDI"] = newFlags["MDI"]; + displaySettings["MenuBar"] = flags["MenuBar"]; + displaySettings["MenuOnBoot"] = !flags["MenuHidden"]; + graphicSettings["MultiSamples"] = flags["MultiSamples"]; + mfa.DisplayFlags = displaySettings; mfa.WindowX = game.Header.WindowWidth; mfa.WindowY = game.Header.WindowHeight; mfa.BorderColor = game.Header.BorderColor; mfa.HelpFile = ""; - mfa.VitalizePreview = new byte[] {0x0}; mfa.InitialScore = game.Header.InitialScore; mfa.InitialLifes = game.Header.InitialLives; mfa.FrameRate = game.Header.FrameRate; @@ -91,248 +93,28 @@ namespace CTFAK.MMFParser.Translation { var key = game.Frameitems.ItemDict.Keys.ToArray()[i]; var item = game.Frameitems.ItemDict[key]; - //if (item.ObjectType != 2 && item.ObjectType != 1 && item.ObjectType != 3) break; - var newItem = new FrameItem(null); - newItem.Name = item.Name; - newItem.ObjectType = item.ObjectType; - newItem.Handle = item.Handle; - newItem.Transparent = item.Transparent ? 1 : 0; - newItem.InkEffect = item.InkEffect; - newItem.InkEffectParameter = item.InkEffectValue; - newItem.AntiAliasing = item.Antialias ? 1 : 0; - newItem.Flags = (int) item.Flags.flag; //32 TODO:Fix this - newItem.IconHandle = 12; - newItem.Chunks = new ChunkList(null); - - - if (item.ObjectType == 1) - { - var backdropLoader = (EXE.Loaders.Objects.Backdrop) item.Properties.Loader; - var backdrop = new Backdrop((ByteReader) null); - backdrop.ObstacleType = (uint) backdropLoader.ObstacleType; - backdrop.CollisionType = (uint) backdropLoader.CollisionType; - backdrop.Handle = backdropLoader.Image; - //TODO:Implement QuickBackdrops - newItem.Loader = backdrop; - } - else - { - var itemLoader = (ObjectCommon) item?.Properties?.Loader; - if (itemLoader == null) continue; - Logger.Log("Translating Object: "+itemLoader.Parent.Name); - //CommonSection - var newObject = new ObjectLoader(null); - newObject.ObjectFlags = (int) (itemLoader?.Flags?.flag ?? 820); - newObject.NewObjectFlags =(int) (itemLoader?.NewFlags?.flag ?? 8); - newObject.BackgroundColor = Color.Black;//itemLoader.BackColor; - //newLoader.Qualifiers; - newObject.Strings = ConvertStrings(itemLoader.Strings); - newObject.Values = ConvertValue(itemLoader.Values); - newObject.Movements = new MFA.Loaders.mfachunks.Movements(null); - for (int j = 0; j < itemLoader.Movements.Items.Count; j++) - { - var mov = itemLoader.Movements.Items[j]; - var newMov = new Movement(null); - newMov.Name = $"Movement #{j}"; - newMov.Extension = ""; - newMov.Identifier = 0;//(uint) mov.Type; - if(newMov.Identifier!=0)throw new Exception("Unknown Movement: "+newMov.Identifier); - newMov.Player = mov.Player; - newMov.MovingAtStart = mov.MovingAtStart; - newMov.DirectionAtStart = mov.DirectionAtStart; - newObject.Movements.Items.Add(newMov); - } - - newObject.Behaviours = new Behaviours(null); - - if (item.ObjectType == 2) - { - var active = new Active(null); - //Shit Section - { - active.ObjectFlags = newObject.ObjectFlags; - active.NewObjectFlags = newObject.NewObjectFlags; - active.BackgroundColor = newObject.BackgroundColor; - active.Strings = newObject.Strings; - active.Values = newObject.Values; - active.Movements = newObject.Movements; - active.Behaviours = newObject.Behaviours; - } - - - //TODO: Transitions - if (itemLoader.Animations != null) - { - var animHeader = itemLoader.Animations; - for (int j = 0; j < animHeader.AnimationDict.Count; j++) - { - var origAnim = animHeader.AnimationDict.ToArray()[j]; - var newAnimation = new Animation(null); - var newDirections = new List(); - EXE.Loaders.Objects.Animation animation = null; - try - { - if (animHeader.AnimationDict.ContainsKey(origAnim.Key)) - { - animation = animHeader.AnimationDict[origAnim.Key]; - } - else break; - - } - catch - { - } - - if (animation != null) - { - for (int n = 0; n < animation.DirectionDict.Count; n++) - { - var direction = animation.DirectionDict.ToArray()[n].Value; - var newDirection = new AnimationDirection(null); - newDirection.MinSpeed = direction.MinSpeed; - newDirection.MaxSpeed = direction.MaxSpeed; - newDirection.Index = n; - newDirection.Repeat = direction.Repeat; - newDirection.BackTo = direction.BackTo; - newDirection.Frames = direction.Frames; - newDirections.Add(newDirection); - } - - newAnimation.Directions = newDirections; - } - - active.Items.Add(j, newAnimation); - } - } - newItem.Loader = active; - } - - if (item.ObjectType >= 32) - { - var newExt = new ExtensionObject(null); - { - newExt.ObjectFlags = newObject.ObjectFlags; - newExt.NewObjectFlags = newObject.NewObjectFlags; - newExt.BackgroundColor = newObject.BackgroundColor; - newExt.Strings = newObject.Strings; - newExt.Values = newObject.Values; - newExt.Movements = newObject.Movements; - newExt.Behaviours = newObject.Behaviours; - } - var exts = Exe.Instance.GameData.GameChunks.GetChunk(); - Extension ext = null; - foreach (var testExt in exts.Items) - { - if (testExt.Handle==item.ObjectType-32) ext = testExt; - } - newExt.ExtensionType = -1; - newExt.ExtensionName = ""; - newExt.Filename = $"{ext.Name}.mfx"; - newExt.Magic = (uint) ext.MagicNumber; - newExt.SubType = ext.SubType; - newExt.ExtensionVersion = itemLoader.ExtensionVersion; - newExt.ExtensionId = itemLoader.ExtensionId; - newExt.ExtensionPrivate = itemLoader.ExtensionPrivate; - newExt.ExtensionData = itemLoader.ExtensionData; - newItem.Loader = newExt; - var tuple = new Tuple(ext.Handle, ext.Name, "", - ext.MagicNumber, ext.SubType); - // mfa.Extensions.Add(tuple); - - } - else if (item.ObjectType == 3) - { - var text = itemLoader.Text; - var newText = new Text(null); - //Shit Section - { - newText.ObjectFlags = newObject.ObjectFlags; - newText.NewObjectFlags = newObject.NewObjectFlags; - newText.BackgroundColor = newObject.BackgroundColor; - newText.Strings = newObject.Strings; - newText.Values = newObject.Values; - newText.Movements = newObject.Movements; - newText.Behaviours = newObject.Behaviours; - } - newText.Width = (uint) text.Width; - newText.Height = (uint) text.Height; - var paragraph = text.Items[0]; - newText.Font = paragraph.FontHandle; - newText.Color = paragraph.Color; - newText.Flags = 0; - newText.Items = new List(); - foreach (EXE.Loaders.Objects.Paragraph exePar in text.Items) - { - var newPar = new Paragraph((ByteReader) null); - newPar.Value = exePar.Value; - newPar.Flags = exePar.Flags.flag; - newText.Items.Add(newPar); - } - - newItem.Loader = newText; - } - else if (item.ObjectType == 7) - { - var counter = itemLoader.Counters; - var newCount = new Counter(null); - { - newCount.ObjectFlags = newObject.ObjectFlags; - newCount.NewObjectFlags = newObject.NewObjectFlags; - newCount.BackgroundColor = newObject.BackgroundColor; - newCount.Strings = newObject.Strings; - newCount.Values = newObject.Values; - newCount.Movements = newObject.Movements; - newCount.Behaviours = newObject.Behaviours; - } - newCount.Value = itemLoader.Counter.Initial; - newCount.Maximum = itemLoader.Counter.Maximum; - newCount.Minimum = itemLoader.Counter.Minimum; - newCount.Images=new List(){0}; - if (counter == null) - { - newCount.DisplayType = 0; - newCount.CountType = 0; - newCount.Width = 0; - newCount.Height = 0; - newCount.Font = 0; - } - else - { - newCount.DisplayType = counter.DisplayType; - newCount.CountType = counter.Inverse ? 1:0; - newCount.Width = (int) counter.Width; - newCount.Height = (int) counter.Height; - newCount.Images = counter.Frames; - newCount.Font = counter.Font; - } - newCount.Color1=Color.White; - newCount.Color2=Color.White; - newCount.Flags = 0; - newCount.VerticalGradient = 0; - - newItem.Loader = newCount; - } - - } - // if(newItem.Loader==null) throw new NotImplementedException("Unsupported Object"); + var newItem = TranslateObject(item); + if(newItem.Loader==null) throw new NotImplementedException("Unsupported Object: "+newItem.ObjectType); FrameItems.Add(newItem.Handle, newItem); } - + // var reference = mfa.Frames.FirstOrDefault(); mfa.Frames.Clear(); + foreach (Frame frame in game.Frames) { - + if(frame.Palette==null|| frame.Events==null|| frame.Objects==null) continue; + var newFrame = new MFA.Loaders.Frame(null); - //FrameInfo - newFrame.Handle = game.Frames.IndexOf(frame); + newFrame.Handle = game.Frames.IndexOf(frame)+1; newFrame.Name = frame.Name; newFrame.SizeX = frame.Width; newFrame.SizeY = frame.Height; newFrame.Background = frame.Background; - newFrame.FadeIn = frame.FadeIn != null ? ConvertTransition(frame.FadeIn) : null; - newFrame.FadeOut = frame.FadeOut != null ? ConvertTransition(frame.FadeOut) : null; + newFrame.FadeIn = null; + newFrame.FadeOut = null; + // newFrame.UnkString = " "; var mfaFlags = newFrame.Flags; var originalFlags = frame.Flags; @@ -344,8 +126,7 @@ namespace CTFAK.MMFParser.Translation mfaFlags["NoDisplaySurface"] = false; mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"]; newFrame.Flags = mfaFlags; - newFrame.Flags.flag = 260; - newFrame.MaxObjects = frame.Events?.MaxObjects ?? 1000; + newFrame.MaxObjects = frame.Events?.MaxObjects ?? 10000; newFrame.Password = ""; newFrame.LastViewedX = 320; newFrame.LastViewedY = 240; @@ -353,20 +134,24 @@ namespace CTFAK.MMFParser.Translation newFrame.StampHandle = 13; newFrame.ActiveLayer = 0; //LayerInfo - newFrame.Layers = new List(); - foreach (EXE.Loaders.Layer layer in frame.Layers.Items) + var count = frame.Layers.Items.Count; + Logger.Log($"{newFrame.Name} - {count}"); + 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 == "anus") + if (frame.Events != null) { - foreach (var item in newFrame.Items) + newFrame.Events = new Events((ByteReader) null); //MFA.MFA.emptyEvents; + newFrame.Events.Items = new List(); + newFrame.Events.Objects = new List(); + newFrame.Events._cache = MFA.MFA.emptyEvents._cache; + newFrame.Events._ifMFA = true; + newFrame.Events.Version = 1028; + if (frame.Name == "jopajopaher") { - var newObject = new EventObject((ByteReader) null); - - newObject.Handle = (uint) item.Handle; - newObject.Name = item.Name ?? ""; - newObject.TypeName = ""; - newObject.ItemType = (ushort) item.ObjectType; - newObject.ObjectType = 1; - newObject.Flags = 0; - newObject.ItemHandle = (uint) item.Handle; - newObject.InstanceHandle = 0xFFFFFFFF; - newFrame.Events.Objects.Add(newObject); - } - foreach (EventGroup item in frame.Events.Items) - { - /*foreach (Action itemAction in item.Actions) + foreach (var item in newFrame.Items) { - for (int a=0;a(); + EXE.Loaders.Objects.Animation animation = null; + try + { + if (animHeader.AnimationDict.ContainsKey(origAnim.Key)) + { + animation = animHeader.AnimationDict[origAnim.Key]; + } + else break; + + } + catch + { + } + + if (animation != null) + { + if (animation.DirectionDict != null) + { + for (int n = 0; n < animation.DirectionDict.Count; n++) + { + var direction = animation.DirectionDict.ToArray()[n].Value; + var newDirection = new AnimationDirection(null); + newDirection.MinSpeed = direction.MinSpeed; + newDirection.MaxSpeed = direction.MaxSpeed; + newDirection.Index = n; + newDirection.Repeat = direction.Repeat; + newDirection.BackTo = direction.BackTo; + newDirection.Frames = direction.Frames; + newDirections.Add(newDirection); + } + } + else + { + + } + + newAnimation.Directions = newDirections; + } + + active.Items.Add(j, newAnimation); + } + } + + newItem.Loader = active; + } + + if (item.ObjectType >= 32) + { + var newExt = new ExtensionObject(null); + { + newExt.ObjectFlags = newObject.ObjectFlags; + newExt.NewObjectFlags = newObject.NewObjectFlags; + newExt.BackgroundColor = newObject.BackgroundColor; + newExt.Strings = newObject.Strings; + newExt.Values = newObject.Values; + newExt.Movements = newObject.Movements; + newExt.Behaviours = newObject.Behaviours; + } + var exts = Exe.Instance.GameData.GameChunks.GetChunk(); + Extension ext = null; + foreach (var testExt in exts.Items) + { + if (testExt.Handle == item.ObjectType - 32) ext = testExt; + } + + newExt.ExtensionType = -1; + newExt.ExtensionName = ""; + newExt.Filename = $"{ext.Name}.mfx"; + newExt.Magic = (uint) ext.MagicNumber; + newExt.SubType = ext.SubType; + newExt.ExtensionVersion = itemLoader.ExtensionVersion; + newExt.ExtensionId = itemLoader.ExtensionId; + newExt.ExtensionPrivate = itemLoader.ExtensionPrivate; + newExt.ExtensionData = itemLoader.ExtensionData; + newItem.Loader = newExt; + var tuple = new Tuple(ext.Handle, ext.Name, "", + ext.MagicNumber, ext.SubType); + // mfa.Extensions.Add(tuple); + + } + else if (item.ObjectType == 3) + { + var text = itemLoader.Text; + var newText = new Text(null); + //Shit Section + { + newText.ObjectFlags = newObject.ObjectFlags; + newText.NewObjectFlags = newObject.NewObjectFlags; + newText.BackgroundColor = newObject.BackgroundColor; + newText.Strings = newObject.Strings; + newText.Values = newObject.Values; + newText.Movements = newObject.Movements; + newText.Behaviours = newObject.Behaviours; + } + newText.Width = (uint) text.Width; + newText.Height = (uint) text.Height; + var paragraph = text.Items[0]; + newText.Font = paragraph.FontHandle; + newText.Color = paragraph.Color; + newText.Flags = 0; + newText.Items = new List(); + foreach (EXE.Loaders.Objects.Paragraph exePar in text.Items) + { + var newPar = new Paragraph((ByteReader) null); + newPar.Value = exePar.Value; + newPar.Flags = exePar.Flags.flag; + newText.Items.Add(newPar); + } + + newItem.Loader = newText; + } + else if (item.ObjectType == 6) + { + var counter = itemLoader.Counters; + var lives = new Lives(null); + { + lives.ObjectFlags = newObject.ObjectFlags; + lives.NewObjectFlags = newObject.NewObjectFlags; + lives.BackgroundColor = newObject.BackgroundColor; + lives.Strings = newObject.Strings; + lives.Values = newObject.Values; + lives.Movements = newObject.Movements; + lives.Behaviours = newObject.Behaviours; + } + lives.Player = counter?.Player ?? 0; + lives.Images = counter?.Frames ?? new List() {0}; + lives.DisplayType = counter?.DisplayType ?? 0; + lives.Flags = counter?.Flags ?? 0; + lives.Font = counter?.Font ?? 0; + lives.Width = (int) (counter?.Width ?? 0); + lives.Height = (int) (counter?.Height ?? 0); + newItem.Loader = lives; + + } + else if (item.ObjectType == 7) + { + var counter = itemLoader.Counters; + var newCount = new Counter(null); + { + newCount.ObjectFlags = newObject.ObjectFlags; + newCount.NewObjectFlags = newObject.NewObjectFlags; + newCount.BackgroundColor = newObject.BackgroundColor; + newCount.Strings = newObject.Strings; + newCount.Values = newObject.Values; + newCount.Movements = newObject.Movements; + newCount.Behaviours = newObject.Behaviours; + } + newCount.Value = itemLoader.Counter.Initial; + newCount.Maximum = itemLoader.Counter.Maximum; + newCount.Minimum = itemLoader.Counter.Minimum; + newCount.Images = new List() {0}; + if (counter == null) + { + newCount.DisplayType = 0; + newCount.CountType = 0; + newCount.Width = 0; + newCount.Height = 0; + newCount.Font = 0; + } + else + { + newCount.DisplayType = counter.DisplayType; + newCount.CountType = counter.Inverse ? 1 : 0; + newCount.Width = (int) counter.Width; + newCount.Height = (int) counter.Height; + newCount.Images = counter.Frames; + newCount.Font = counter.Font; + } + + newCount.Color1 = Color.White; + newCount.Color2 = Color.White; + newCount.Flags = 0; + newCount.VerticalGradient = 0; + + newItem.Loader = newCount; + } + + } + + return newItem; + } public static void Message(string msg) { diff --git a/CTFAK/Program.cs b/CTFAK/Program.cs index 690cbab..dbc61ba 100644 --- a/CTFAK/Program.cs +++ b/CTFAK/Program.cs @@ -32,7 +32,7 @@ namespace CTFAK } LoadableSettings.FromFile("settings.sav"); // - + // MFAGenerator.WriteTestMFA(); // MFAGenerator.ReadTestMFA(); // Environment.Exit(0); AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => diff --git a/CTFAK/Utils/ByteWriter.cs b/CTFAK/Utils/ByteWriter.cs index b63404e..c4fd914 100644 --- a/CTFAK/Utils/ByteWriter.cs +++ b/CTFAK/Utils/ByteWriter.cs @@ -71,6 +71,7 @@ namespace CTFAK.Utils public void WriteSingle(float value) => Write(value); public void WriteBytes(byte[] value) => Write(value); + public void WriteDouble(double value) => Write(value); public void WriteAscii(string value) diff --git a/CTFAK/Utils/Decompressor.cs b/CTFAK/Utils/Decompressor.cs index 7fd5301..bbf7949 100644 --- a/CTFAK/Utils/Decompressor.cs +++ b/CTFAK/Utils/Decompressor.cs @@ -1,6 +1,9 @@ using System; using System.IO; +using System.IO.Compression; using Joveler.Compression.ZLib; +using DeflateStream = System.IO.Compression.DeflateStream; +using GZipStream = Joveler.Compression.ZLib.GZipStream; namespace CTFAK.Utils { @@ -36,6 +39,19 @@ namespace CTFAK.Utils Array.Resize(ref decompressedData, decompSize); return decompressedData; } + + public static byte[] decompressOld(ByteReader reader, int size, int decompSize) + { + ZLibDecompressOptions decompOpts = new ZLibDecompressOptions(); + MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size)); + MemoryStream decompressedStream = new MemoryStream(); + + byte[] decompressedData = decompressedStream.GetBuffer(); + // Trimming array to decompSize, + // because ZlibStream always pads to 0x100 + Array.Resize(ref decompressedData, decompSize); + return decompressedData; + } public static byte[] compress_block(byte[] data) diff --git a/CTFAK/packages.config b/CTFAK/packages.config index 7c0ff7b..5cdc6a1 100644 --- a/CTFAK/packages.config +++ b/CTFAK/packages.config @@ -2,7 +2,6 @@ - @@ -12,4 +11,5 @@ + \ No newline at end of file