diff --git a/CTFAK/GUI/MainForm.cs b/CTFAK/GUI/MainForm.cs index 3e6dbbe..d791e21 100644 --- a/CTFAK/GUI/MainForm.cs +++ b/CTFAK/GUI/MainForm.cs @@ -609,7 +609,7 @@ namespace CTFAK.GUI public void InitImages() { - if (Settings.twofiveplus) return; + if (Settings.GameType == GameType.TwoFivePlus) return; var bank = Exe.Instance.GameData.GameChunks.GetChunk(); var items = bank.Images.ToList(); var filtered = items.OrderBy(x => x.Value.Handle); diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index b4cb6f4..ecfba62 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -19,7 +19,7 @@ namespace CTFAK.MMFParser.EXE public void Read(ByteReader reader) { Chunks.Clear(); - if (!Settings.Old) + if (Settings.GameType == GameType.Normal) { while (true) { @@ -28,7 +28,7 @@ namespace CTFAK.MMFParser.EXE chunk.Read(reader); if (chunk.Id == 26214) { - if(!Settings.twofiveplus) chunk.Loader = LoadModern(chunk); + if(Settings.GameType != GameType.TwoFivePlus) chunk.Loader = LoadModern(chunk); } else { @@ -37,14 +37,14 @@ namespace CTFAK.MMFParser.EXE Chunks.Add(chunk); if (chunk.Id == 8750) chunk.BuildKey(); - if (chunk.Id == 8788) Settings.twofiveplus = true; + if (chunk.Id == 8788) Settings.GameType = GameType.TwoFivePlus; if (reader.Tell() >= reader.Size()) break; if (chunk.Id == 32639) break; //LAST chunkID } } - else + else if(Settings.GameType == GameType.OnePointFive) { while (true) { @@ -106,15 +106,14 @@ namespace CTFAK.MMFParser.EXE ChunkData = Decryption.DecodeMode3(exeReader.ReadBytes(Size), Size,Id,out DecompressedSize); break; case ChunkFlags.Compressed: - if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize); - else + if (Settings.GameType == GameType.OnePointFive) { var start = exeReader.Tell(); - var decompSize = exeReader.ReadInt32(); - var buff = exeReader.ReadBytes(Size); - ChunkData = Decompressor.decompressOld(buff, Size, decompSize); + ChunkData = Decompressor.DecompressOld(exeReader); exeReader.Seek(start+Size); } + else ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize); + break; case ChunkFlags.NotCompressed: ChunkData = exeReader.ReadBytes(Size); diff --git a/CTFAK/MMFParser/EXE/EXE.cs b/CTFAK/MMFParser/EXE/EXE.cs index 4d8c8e7..89018ff 100644 --- a/CTFAK/MMFParser/EXE/EXE.cs +++ b/CTFAK/MMFParser/EXE/EXE.cs @@ -62,13 +62,16 @@ 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 = false; - else if (firstShort == 0x222c) Settings.Old = true; - else + if (firstShort == 0x7777) + { + Settings.GameType = GameType.Normal; + } + else if (firstShort == 0x222c) { - Logger.Log(firstShort.ToString("x8")); + Settings.GameType = GameType.OnePointFive; } - if (!Settings.Old) + + if (Settings.GameType == GameType.Normal) { PackData = new PackData(); Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue); diff --git a/CTFAK/MMFParser/EXE/Loaders/AppHeader.cs b/CTFAK/MMFParser/EXE/Loaders/AppHeader.cs index 2191c67..2339086 100644 --- a/CTFAK/MMFParser/EXE/Loaders/AppHeader.cs +++ b/CTFAK/MMFParser/EXE/Loaders/AppHeader.cs @@ -61,7 +61,7 @@ namespace CTFAK.MMFParser.EXE.Loaders { { - if (!Settings.Old) Size = Reader.ReadInt32(); + if (Settings.GameType != GameType.OnePointFive) Size = Reader.ReadInt32(); Flags.flag=(uint) Reader.ReadInt16(); NewFlags.flag = (uint) Reader.ReadInt16(); diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 2d5d0be..45ef9cc 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -146,8 +146,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Handle = Reader.ReadInt32(); if (!Debug) { - if (Settings.Build>291) Handle -= 1; - if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; + if (Settings.Build>=289) Handle -= 1; + // if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; } Position = (int) Reader.Tell(); @@ -160,8 +160,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Handle = Reader.ReadInt32(); if (!Debug) { - if (Settings.Build>291) Handle -= 1; - if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; + if (Settings.Build>=289) Handle -= 1; + // if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; } Position = (int) Reader.Tell(); @@ -182,12 +182,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks _bitmap = null; Reader.Seek(Position); ByteReader imageReader; - if (!Settings.twofiveplus) + if (Settings.GameType != GameType.TwoFivePlus) { - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { var decompSize = Reader.ReadInt32(); - imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); + imageReader =new ByteReader(Decompressor.DecompressOldBlock(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); } else { @@ -199,8 +199,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks //return; - if (Settings.twofiveplus) imageReader.Skip(4); - if (Settings.Old) + if (Settings.GameType == GameType.TwoFivePlus) imageReader.Skip(4); + if (Settings.GameType == GameType.OnePointFive) { _checksum = imageReader.ReadInt16(); } @@ -220,12 +220,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks _bitmap = null; Reader.Seek(Position); ByteReader imageReader; - if (!Settings.twofiveplus) + if (Settings.GameType != GameType.TwoFivePlus) { - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { var decompSize = Reader.ReadInt32(); - imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); + imageReader =new ByteReader(Decompressor.DecompressOldBlock(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); } else { @@ -237,8 +237,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks //return; - if (Settings.twofiveplus) imageReader.Skip(4); - if (Settings.Old) + if (Settings.GameType == GameType.TwoFivePlus) imageReader.Skip(4); + if (Settings.GameType == GameType.OnePointFive) { _checksum = imageReader.ReadInt16(); } @@ -257,20 +257,20 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks Flags.flag = imageReader.ReadByte(); - if(!Settings.Old)imageReader.Skip(2); + if(Settings.GameType != GameType.OnePointFive)imageReader.Skip(2); XHotspot = imageReader.ReadInt16(); YHotspot = imageReader.ReadInt16(); ActionX = imageReader.ReadInt16(); ActionY = imageReader.ReadInt16(); - if(!Settings.Old)_transparent = imageReader.ReadColor(); + if(Settings.GameType != GameType.OnePointFive)_transparent = imageReader.ReadColor(); // Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}"); byte[] imageData; - if (Settings.twofiveplus) Flags["LZX"] = false; + if (Settings.GameType == GameType.TwoFivePlus) Flags["LZX"] = false; if (Flags["LZX"]) { uint decompressedSize = imageReader.ReadUInt32(); - imageData = Decompressor.decompress_block(imageReader, (int) (imageReader.Size() - imageReader.Tell()), + imageData = Decompressor.DecompressBlock(imageReader, (int) (imageReader.Size() - imageReader.Tell()), (int) decompressedSize); } else @@ -336,7 +336,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks } } } - if (!Settings.Old) + if (Settings.GameType != GameType.OnePointFive) { if (Settings.Build > 283) // No idea, but this is not working with old games { @@ -363,7 +363,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks try { - if(Settings.twofiveplus) Logger.Log("Trying to save image"); + if(Settings.GameType == GameType.TwoFivePlus) Logger.Log("Trying to save image"); Bitmap.Save(filename); } catch diff --git a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs index 781f5c8..5dfd86e 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Banks/SoundBank.cs @@ -134,14 +134,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks if (IsCompressed) { var size = Reader.ReadInt32(); - soundData = new ByteReader(Decompressor.decompress_block(Reader, size, decompressedSize)); + soundData = new ByteReader(Decompressor.DecompressBlock(Reader, size, decompressedSize)); } else { soundData = new ByteReader(Reader.ReadBytes(decompressedSize)); } Name = soundData.ReadWideString(nameLenght); - Logger.Log(Name); Data = soundData.ReadBytes((int) soundData.Size()); if (Settings.DumpSounds) diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs index ded0742..afe94ba 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs @@ -258,7 +258,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events { var num = cond.Num; if (num == -42) num = -27; - // if (Settings.Build >= 290) + if (Settings.Build >= 290) { if (num == -28||num == -29||num == -30||num == -31||num == -32||num == -33||num == -34||num == -35||num == -36||num == -37||num == -38||num == -39) num = -8; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs index e27ebf9..c733932 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Group.cs @@ -23,7 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters Name = Reader.ReadWideString(); Password = Reader.ReadInt32(); Password = Checksum.MakeGroupChecksum("pass", Name); - Logger.Log("Password: "+Password); } public override void Write(ByteWriter Writer) diff --git a/CTFAK/MMFParser/EXE/Loaders/Frame.cs b/CTFAK/MMFParser/EXE/Loaders/Frame.cs index 7813bc1..a1367f2 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Frame.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Frame.cs @@ -171,7 +171,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public override void Read() { - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { Width = Reader.ReadInt16(); Height = Reader.ReadInt16(); @@ -255,7 +255,7 @@ namespace CTFAK.MMFParser.EXE.Loaders { Handle = (ushort) Reader.ReadInt16(); ObjectInfo = (ushort) Reader.ReadInt16(); - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { X = Reader.ReadInt16(); Y = Reader.ReadUInt16(); diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs index 275d883..27de02c 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs @@ -38,7 +38,6 @@ namespace CTFAK.MMFParser.EXE.Loaders _header = infoChunks.GetChunk(); _name = infoChunks.GetChunk(); _properties = infoChunks.GetChunk(); - _properties.ReadNew((int) ObjectType,this); } @@ -47,6 +46,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public ObjectProperties Properties => _properties; public Constants.ObjectType ObjectType => (Constants.ObjectType) _header.ObjectType; public int Flags => (int) _header.Flags; + public int Reserved => (int) _header.Reserved; public int InkEffect => (int) _header.InkEffect; public int InkEffectValue => (int) _header.InkEffectParameter; public bool Transparent => ByteFlag.GetFlag((uint) InkEffect, 28); @@ -145,6 +145,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public UInt32 Flags; public UInt32 InkEffect; public UInt32 InkEffectParameter; + public short Reserved; public ObjectHeader(ByteReader reader) : base(reader){} public ObjectHeader(Chunk chunk) : base(chunk){} @@ -156,7 +157,7 @@ namespace CTFAK.MMFParser.EXE.Loaders Handle = Reader.ReadInt16(); ObjectType = Reader.ReadInt16(); Flags = Reader.ReadUInt16(); - Int16 reserved = Reader.ReadInt16(); + Reserved = Reader.ReadInt16(); InkEffect = Reader.ReadByte(); InkEffectParameter = Reader.ReadByte(); } diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectNames.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectNames.cs index a727358..53b1256 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectNames.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectNames.cs @@ -6,10 +6,8 @@ namespace CTFAK.MMFParser.EXE.Loaders { class ObjectNames : ChunkLoader//2.5+ trash { - public override void Print(bool ext) - { - - } + public override void Print(bool ext){} + public override string[] GetReadableData() { diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs index 1e1e1c3..6224abe 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Backdrop.cs @@ -37,7 +37,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public override void Read() { - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { Size = Reader.ReadInt32(); ObstacleType = (Obstacle) Reader.ReadInt16(); @@ -150,7 +150,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects // else if(FillType==3) // { Image = Reader.ReadInt16(); - Logger.Log("QuickbackdropIMG: "+Image); // } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs index dd9dfbb..5f2d21a 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/Movements.cs @@ -170,7 +170,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public override void Write(ByteWriter Writer) { - Logger.Log("Writing mouse mov"); Writer.WriteInt16(X1); Writer.WriteInt16(X2); Writer.WriteInt16(Y1); diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index 89c5dbd..73a36d2 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -88,6 +88,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects private ushort _zeroUnk; public Text Text; public Counter Counter; + public short[] _qualifiers=new short[8]; public ObjectCommon(ByteReader reader) : base(reader) @@ -104,7 +105,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects public override void Read() { - if (Settings.Old) + if (Settings.GameType == GameType.OnePointFive) { var currentPosition = Reader.Tell(); var size = Reader.ReadInt16(); @@ -152,14 +153,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects _extensionOffset = Reader.ReadUInt16(); _counterOffset = Reader.ReadUInt16(); Flags.flag = Reader.ReadUInt16(); + Reader.Skip(2); var end = Reader.Tell()+(8+1)*2; - List qualifiers = new List(); - while(true) + for (int i = 0; i < 8; i++) { - // break; var value = Reader.ReadInt16(); - if(value!=-1) qualifiers.Add(value); - else break; + _qualifiers[i]=value; } Reader.Seek(end); _systemObjectOffset = Reader.ReadUInt16(); diff --git a/CTFAK/MMFParser/EXE/Loaders/yves.cs b/CTFAK/MMFParser/EXE/Loaders/yves.cs index 70c7544..5bc66e0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/yves.cs +++ b/CTFAK/MMFParser/EXE/Loaders/yves.cs @@ -23,7 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders public override void Read() { - Logger.Log("dumpingIcon"); Reader.ReadBytes(Reader.ReadInt32() - 4); List colorIndexes = new List(); for (int i = 0; i < 16 * 16; i++) diff --git a/CTFAK/MMFParser/EXE/PackData.cs b/CTFAK/MMFParser/EXE/PackData.cs index f5705c4..788bf7a 100644 --- a/CTFAK/MMFParser/EXE/PackData.cs +++ b/CTFAK/MMFParser/EXE/PackData.cs @@ -26,8 +26,16 @@ namespace CTFAK.MMFParser.EXE exeReader.Seek((int)(start + dataSize - 32)); var uheader = exeReader.ReadAscii(4); Logger.Log("SUPERHEADER: "+uheader); - if(uheader=="PAMU")Settings.Unicode = true; - else if(uheader=="PAME")Settings.Unicode = false; + if (uheader == "PAMU") + { + Settings.GameType = GameType.Normal; + Settings.Unicode = true; + } + else if(uheader=="PAME") + { + Settings.GameType = GameType.MMFTwo; + Settings.Unicode = false; + } exeReader.Seek(start + 16); uint formatVersion = exeReader.ReadUInt32(); diff --git a/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs b/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs index c965d87..5f7f42c 100644 --- a/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs +++ b/CTFAK/MMFParser/MFA/Loaders/ChunkList.cs @@ -104,7 +104,7 @@ namespace CTFAK.MMFParser.MFA.Loaders var size = Reader.ReadInt32(); Data = Reader.ReadBytes(size); var dataReader = new ByteReader(Data); - switch (Id) + /*switch (Id) { case 33: Loader = new FrameVirtualRect(dataReader); @@ -120,7 +120,7 @@ namespace CTFAK.MMFParser.MFA.Loaders // Logger.Log($"{Id} - {Data.GetHex()}"); break; - } + }*/ Loader?.Read(); @@ -163,7 +163,6 @@ namespace CTFAK.MMFParser.MFA.Loaders public override void Write(ByteWriter Writer) { - Value = 255; Writer.WriteInt32(Value); } } diff --git a/CTFAK/MMFParser/MFA/Loaders/Events.cs b/CTFAK/MMFParser/MFA/Loaders/Events.cs index 5ba038d..8498b0a 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Events.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Events.cs @@ -17,6 +17,7 @@ namespace CTFAK.MMFParser.MFA.Loaders public const string TimeListData = "EvEd"; public const string EditorPositionData = "EvTs"; public const string EditorLineData = "EvLs"; + public const string UnknownEventData = "E2Ts"; public const string EventEnd ="!DNE"; public List Items; public ushort Version; @@ -172,13 +173,17 @@ namespace CTFAK.MMFParser.MFA.Loaders EventLine = Reader.ReadUInt32(); EventLineY = Reader.ReadUInt32(); } + else if (name == UnknownEventData) + { + Reader.Skip(12); + } else if (name == EventEnd) { // _cache = Reader.ReadBytes(122); break; } - else throw new NotImplementedException("Fuck Something is Broken"); + else Logger.Log("UnknownGroup: "+name);//throw new NotImplementedException("Fuck Something is Broken: "+name); } } @@ -269,6 +274,11 @@ namespace CTFAK.MMFParser.MFA.Loaders Writer.WriteUInt32(EventLine); Writer.WriteUInt32(EventLineY); } + Writer.WriteAscii(UnknownEventData); + Writer.WriteInt8(8); + Writer.Skip(9); + Writer.WriteInt16(0); + Writer.WriteAscii(EventEditorData); // Writer.Skip(4+2*2+4*3); Writer.WriteInt32(EditorDataUnk); diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs index 6d7987c..67e835c 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; +using System.Linq; using CTFAK.MMFParser.EXE; using CTFAK.Utils; @@ -10,7 +12,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks public int ObjectFlags; public int NewObjectFlags; public Color BackgroundColor; - List _qualifiers = new List(); + public short[] Qualifiers = new short[8]; public ValueList Values; public ValueList Strings; public Movements Movements; @@ -18,15 +20,16 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks public override void Write(ByteWriter Writer) { + // if(Qualifiers==null) throw new NullReferenceException("QUALIFIERS NULL"); Writer.WriteInt32((int) ObjectFlags); Writer.WriteInt32(NewObjectFlags); Writer.WriteColor(BackgroundColor); - for (int i = 0; i < 9; i++) + for (int i = 0; i < 8; i++) { - Writer.WriteInt16(-1); + Writer.WriteInt16(Qualifiers[i]); } - + Writer.WriteInt16(-1); Values.Write(Writer); Strings.Write(Writer); Movements.Write(Writer); @@ -72,7 +75,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks { break; } - _qualifiers.Add(value); + Qualifiers[i]=value; } Reader.Seek(end); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index e662f4b..3be3834 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -89,6 +89,7 @@ namespace CTFAK.MMFParser.Translation mfa.BuildType = 0; mfa.BuildPath = game.TargetFilename; mfa.CommandLine = ""; + mfa.FrameRate = 60; mfa.Aboutbox = game.AboutText?.Length > 0 ? game?.AboutText : ""; @@ -325,10 +326,9 @@ namespace CTFAK.MMFParser.Translation newItem.InkEffectParameter = item.InkEffectValue; newItem.AntiAliasing = item.Antialias ? 1 : 0; newItem.Flags = item.Flags; - // if(item.Flags!=0)Logger.Log($"{item.Name}-{item.Flags}"); newItem.IconHandle = 12; - newItem.Chunks = new ChunkList(null); + newItem.Chunks = MFA.MFA.defaultObjChunks; if (item.ObjectType == 0) { @@ -361,14 +361,16 @@ namespace CTFAK.MMFParser.Translation { var itemLoader = (ObjectCommon) item?.Properties?.Loader; if (itemLoader == null) throw new NotImplementedException("Null loader"); - Logger.Log("Translating Object: " + itemLoader.Parent.Name); + Logger.Log(("Translating Object: " + itemLoader.Parent.Name),false,ConsoleColor.Blue,false); //CommonSection var newObject = new ObjectLoader(null); newObject.ObjectFlags = (int) (itemLoader.Flags.flag); newObject.NewObjectFlags = (int) (itemLoader.NewFlags.flag); newObject.BackgroundColor = itemLoader.BackColor; - //newLoader.Qualifiers; + + newObject.Qualifiers = itemLoader._qualifiers; + newObject.Strings = ConvertStrings(itemLoader.Strings); newObject.Values = ConvertValue(itemLoader.Values); newObject.Movements = new MFA.Loaders.mfachunks.Movements(null); @@ -401,6 +403,7 @@ namespace CTFAK.MMFParser.Translation active.Values = newObject.Values; active.Movements = newObject.Movements; active.Behaviours = newObject.Behaviours; + active.Qualifiers = newObject.Qualifiers; } @@ -463,6 +466,8 @@ namespace CTFAK.MMFParser.Translation newExt.Values = newObject.Values; newExt.Movements = newObject.Movements; newExt.Behaviours = newObject.Behaviours; + newExt.Qualifiers = newObject.Qualifiers; + } var exts = Program.CleanData.GameChunks.GetChunk(); Extension ext = null; @@ -499,6 +504,8 @@ namespace CTFAK.MMFParser.Translation newText.Values = newObject.Values; newText.Movements = newObject.Movements; newText.Behaviours = newObject.Behaviours; + newText.Qualifiers = newObject.Qualifiers; + } if (text == null) { @@ -542,6 +549,8 @@ namespace CTFAK.MMFParser.Translation lives.Values = newObject.Values; lives.Movements = newObject.Movements; lives.Behaviours = newObject.Behaviours; + lives.Qualifiers = newObject.Qualifiers; + } lives.Player = counter?.Player ?? 0; lives.Images = counter?.Frames ?? new List() {0}; @@ -565,6 +574,8 @@ namespace CTFAK.MMFParser.Translation newCount.Values = newObject.Values; newCount.Movements = newObject.Movements; newCount.Behaviours = newObject.Behaviours; + newCount.Qualifiers = newObject.Qualifiers; + } if (itemLoader.Counter == null) { diff --git a/CTFAK/Program.cs b/CTFAK/Program.cs index c516eff..08d58b0 100644 --- a/CTFAK/Program.cs +++ b/CTFAK/Program.cs @@ -100,7 +100,6 @@ namespace CTFAK public static void ReadFile(string path, bool verbose = false, bool dumpImages = false, bool dumpSounds = true) { Settings.GamePath = path; - Logger.Log("DecryptionLibExist: "+File.Exists("x64\\Decrypter-x64.dll")); PrepareFolders(); Settings.DumpImages = dumpImages; diff --git a/CTFAK/Settings.cs b/CTFAK/Settings.cs index 29e54f3..5b29dc4 100644 --- a/CTFAK/Settings.cs +++ b/CTFAK/Settings.cs @@ -14,8 +14,7 @@ namespace CTFAK public static bool DumpMusic; public static bool SaveChunks; public static bool Verbose; - public static bool Old; - public static bool twofiveplus = false; + public static GameType GameType; public static string GamePath; public static string GameName => Path.GetFileNameWithoutExtension(GamePath); @@ -135,4 +134,13 @@ namespace CTFAK } + + public enum GameType + { + Normal, + TwoFivePlus, + OnePointFive, + MMFTwo, + Android + } } \ No newline at end of file diff --git a/CTFAK/Utils/Checksum.cs b/CTFAK/Utils/Checksum.cs index f160423..d0863a4 100644 --- a/CTFAK/Utils/Checksum.cs +++ b/CTFAK/Utils/Checksum.cs @@ -30,7 +30,6 @@ namespace CTFAK.Utils v5+=1; if (v5 > groupWords.Length) v5 = 0; } - Logger.Log("GroupPass:"+v4); return v4; } diff --git a/CTFAK/Utils/Decompressor.cs b/CTFAK/Utils/Decompressor.cs index 8801b90..a9c2f6f 100644 --- a/CTFAK/Utils/Decompressor.cs +++ b/CTFAK/Utils/Decompressor.cs @@ -13,13 +13,13 @@ namespace CTFAK.Utils public static class Decompressor { [DllImport("TinflateDecompress.dll")] - public static extern int decompress(IntPtr source, int source_size, IntPtr output, int output_size); + public static extern int decompressOld(IntPtr source, int source_size, IntPtr output, int output_size); public static byte[] Decompress(ByteReader exeReader, out int decompressed) { Int32 decompSize = exeReader.ReadInt32(); Int32 compSize = exeReader.ReadInt32(); decompressed = decompSize; - return decompress_block(exeReader, compSize, decompSize); + return DecompressBlock(exeReader, compSize, decompSize); } public static ByteReader DecompressAsReader(ByteReader exeReader, out int decompressed) @@ -28,7 +28,7 @@ namespace CTFAK.Utils return new ByteReader(Decompress(exeReader, out decompressed)); } - public static byte[] decompress_block(ByteReader reader, int size, int decompSize) + public static byte[] DecompressBlock(ByteReader reader, int size, int decompSize) { ZLibDecompressOptions decompOpts = new ZLibDecompressOptions(); MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size)); @@ -45,12 +45,22 @@ namespace CTFAK.Utils return decompressedData; } - public static byte[] decompressOld(byte[] buff,int size,int decompSize) + public static byte[] DecompressOld(ByteReader reader) + { + var start = reader.Tell(); + var decompressedSize = reader.ReadInt32(); + var compressedSize = reader.Size(); + var buffer = reader.ReadBytes((int) compressedSize); + return DecompressOldBlock(buffer, (int) compressedSize, decompressedSize); + + } + + public static byte[] DecompressOldBlock(byte[] buff,int size,int decompSize) { var originalBuff = Marshal.AllocHGlobal(size); Marshal.Copy(buff,0,originalBuff,buff.Length); var outputBuff = Marshal.AllocHGlobal(decompSize); - decompress(originalBuff, size, outputBuff, decompSize); + decompressOld(originalBuff, size, outputBuff, decompSize); Marshal.FreeHGlobal(originalBuff); byte[] data = new byte[decompSize]; Marshal.Copy(outputBuff,data,0,decompSize); diff --git a/CTFAK/Utils/Decryption.cs b/CTFAK/Utils/Decryption.cs index 4c25d6b..41678ab 100644 --- a/CTFAK/Utils/Decryption.cs +++ b/CTFAK/Utils/Decryption.cs @@ -62,7 +62,7 @@ namespace CTFAK.Utils { uint compressedSize = data.ReadUInt32(); decompressed = (int) decompressedSize; - return Decompressor.decompress_block(data, (int) compressedSize, (int) decompressedSize); + return Decompressor.DecompressBlock(data, (int) compressedSize, (int) decompressedSize); } }