diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index ecfba62..9b41830 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -283,7 +283,7 @@ namespace CTFAK.MMFParser.EXE loader = new ObjectProperties(chunk); return loader; case 8788: - //loader = new ObjectNames(chunk); + // loader = new ObjectNames(chunk); break; case 8754: loader = new GlobalValues(chunk); diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Int.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Int.cs index bc38e97..10e2a67 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Int.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Int.cs @@ -4,12 +4,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { class Int : Short { - + public int Value; public Int(ByteReader reader) : base(reader) { } public override void Read() { - Value = (short)Reader.ReadInt32(); + Value = Reader.ReadInt32(); } public override void Write(ByteWriter Writer) diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs index 687ee0f..847797d 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs @@ -5,12 +5,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public class Position : ParameterCommon { public int ObjectInfoParent; - public ushort Flags; + public short Flags; public int X; public int Y; public int Slope; public int Angle; - public float Direction; + public int Direction; public int TypeParent; public int ObjectInfoList; public int Layer; @@ -19,12 +19,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Read() { ObjectInfoParent = Reader.ReadInt16(); - Flags = Reader.ReadUInt16(); + Flags = Reader.ReadInt16(); X = Reader.ReadInt16(); Y = Reader.ReadInt16(); Slope = Reader.ReadInt16(); Angle = Reader.ReadInt16(); - Direction = Reader.ReadSingle(); + Direction = Reader.ReadInt32(); TypeParent = Reader.ReadInt16(); ObjectInfoList = Reader.ReadInt16(); Layer = Reader.ReadInt16(); @@ -33,12 +33,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Write(ByteWriter Writer) { Writer.WriteInt16((short) ObjectInfoParent); - Writer.WriteUInt16(Flags); + Writer.WriteInt16(Flags); Writer.WriteInt16((short) X); Writer.WriteInt16((short) Y); Writer.WriteInt16((short) Slope); Writer.WriteInt16((short) Angle); - Writer.WriteSingle(Direction); + Writer.WriteInt32(Direction); Writer.WriteInt16((short) TypeParent); Writer.WriteInt16((short) ObjectInfoList); Writer.WriteInt16((short) Layer); diff --git a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs index 2ae7e05..3d7f70a 100644 --- a/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs +++ b/CTFAK/MMFParser/EXE/Loaders/ObjectInfo.cs @@ -37,10 +37,15 @@ namespace CTFAK.MMFParser.EXE.Loaders _header = infoChunks.GetChunk(); _name = infoChunks.GetChunk(); - _properties = infoChunks.GetChunk(); - _properties.ReadNew((int) ObjectType,this); - - Logger.Log($"{Name}: {InkEffect}-{InkEffectValue}"); + _properties = infoChunks.GetChunk(); + _properties.ReadNew((int) ObjectType,this); + if (Settings.Build > 284) + { + } + else + { + // if(InkEffectValue==0) _header.InkEffectParameter = 255; + } } public int Handle => _header.Handle; @@ -50,7 +55,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public int Flags => (int) _header.Flags; public int Reserved => (int) _header.Reserved; public int InkEffect => (int) _header.InkEffect&0xffff; - public int InkEffectValue => (int) _header.InkEffectParameter; + public byte InkEffectValue => (byte) _header.InkEffectParameter; public bool Transparent => ByteFlag.GetFlag((uint) _header.InkEffect, 28); public bool Antialias => ByteFlag.GetFlag((uint) _header.InkEffect, 29); @@ -146,7 +151,7 @@ namespace CTFAK.MMFParser.EXE.Loaders public Int16 ObjectType; public UInt32 Flags; public UInt32 InkEffect; - public Int32 InkEffectParameter; + public byte InkEffectParameter; public Int16 Reserved; public ObjectHeader(ByteReader reader) : base(reader){} @@ -160,10 +165,10 @@ namespace CTFAK.MMFParser.EXE.Loaders ObjectType = Reader.ReadInt16(); Flags = Reader.ReadUInt16(); Reserved = Reader.ReadInt16(); - InkEffect = (uint) Reader.ReadInt32(); - Reader.Skip(3); - InkEffectParameter = Reader.ReadByte(); - + InkEffect = (uint) Reader.ReadUInt32(); + // Reader.Skip(3); + InkEffectParameter =(byte) Reader.ReadInt32(); + // if (InkEffect != 0) InkEffectParameter = 255; diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index f51d99f..59114c0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -135,44 +135,101 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects { var currentPosition = Reader.Tell(); var size = Reader.ReadInt32(); - if (Settings.Build >= 284) + if (Settings.Build >= 284&&true) { _animationsOffset = Reader.ReadUInt16(); _movementsOffset = Reader.ReadUInt16(); + _zeroUnk = Reader.ReadUInt16(); + var version = Reader.ReadUInt16(); + _extensionOffset = Reader.ReadUInt16(); + _counterOffset = Reader.ReadUInt16(); + Flags.flag = Reader.ReadUInt16(); + + var end = Reader.Tell() + (8+1) * 2; + Reader.Skip(2); + for (int i = 0; i < 8; i++) + { + var value = Reader.ReadInt16(); + _qualifiers[i] = value; + } + + Reader.Seek(end); + _systemObjectOffset = Reader.ReadUInt16(); + + _valuesOffset = Reader.ReadUInt16(); + _stringsOffset = Reader.ReadUInt16(); + NewFlags.flag = Reader.ReadUInt16(); + Preferences.flag = Reader.ReadUInt16(); + Identifier = Reader.ReadInt32(); + BackColor = Reader.ReadColor(); + _fadeinOffset = Reader.ReadUInt32(); + _fadeoutOffset = Reader.ReadUInt32(); + + } - else + else if (Settings.Build>=284) { + _counterOffset = Reader.ReadUInt16(); + var version = Reader.ReadUInt16(); + _zeroUnk = Reader.ReadUInt16(); _movementsOffset = Reader.ReadUInt16(); + _extensionOffset = Reader.ReadUInt16(); _animationsOffset = Reader.ReadUInt16(); - } - - _zeroUnk = Reader.ReadUInt16(); + Flags.flag = Reader.ReadUInt16(); + + var end = Reader.Tell() + (8+1) * 2; + Reader.Skip(2); + for (int i = 0; i < 8; i++) + { + var value = Reader.ReadInt16(); + _qualifiers[i] = value; + } - if (_zeroUnk != 0) throw new NotImplementedException("Unknown value is not zero"); - var version = Reader.ReadUInt16(); + Reader.Seek(end); + _systemObjectOffset = Reader.ReadUInt16(); - _extensionOffset = Reader.ReadUInt16(); - _counterOffset = Reader.ReadUInt16(); - Flags.flag = Reader.ReadUInt16(); - var end = Reader.Tell() + (8 + 1) * 2; - Reader.Skip(2); - for (int i = 0; i < 8; i++) - { - var value = Reader.ReadInt16(); - _qualifiers[i] = value; + _valuesOffset = Reader.ReadUInt16(); + _stringsOffset = Reader.ReadUInt16(); + NewFlags.flag = Reader.ReadUInt16(); + Preferences.flag = Reader.ReadUInt16(); + Identifier = Reader.ReadInt32(); + BackColor = Reader.ReadColor(); + _fadeinOffset = Reader.ReadUInt32(); + _fadeoutOffset = Reader.ReadUInt32(); + } + else + { + _movementsOffset = Reader.ReadUInt16(); + _animationsOffset = Reader.ReadUInt16(); + var version = Reader.ReadUInt16(); + _counterOffset = Reader.ReadUInt16(); + _systemObjectOffset = Reader.ReadUInt16(); + _zeroUnk = Reader.ReadUInt16(); + Flags.flag = Reader.ReadUInt16(); + + var end = Reader.Tell() + (8+1) * 2; + Reader.Skip(2); + for (int i = 0; i < 8; i++) + { + var value = Reader.ReadInt16(); + _qualifiers[i] = value; + } - Reader.Seek(end); - _systemObjectOffset = Reader.ReadUInt16(); - - _valuesOffset = Reader.ReadUInt16(); - _stringsOffset = Reader.ReadUInt16(); - NewFlags.flag = Reader.ReadUInt16(); - Preferences.flag = Reader.ReadUInt16(); - Identifier = Reader.ReadInt32(); - BackColor = Reader.ReadColor(); - _fadeinOffset = Reader.ReadUInt32(); - _fadeoutOffset = Reader.ReadUInt32(); + Reader.Seek(end); + + _extensionOffset = Reader.ReadUInt16(); + + _valuesOffset = Reader.ReadUInt16(); + _stringsOffset = Reader.ReadUInt16(); + NewFlags.flag = Reader.ReadUInt16(); + Preferences.flag = Reader.ReadUInt16(); + Identifier = Reader.ReadInt32(); + BackColor = Reader.ReadColor(); + _fadeinOffset = Reader.ReadUInt32(); + _fadeoutOffset = Reader.ReadUInt32(); + } + if (_animationsOffset > 0) { Reader.Seek(currentPosition + _animationsOffset); diff --git a/CTFAK/MMFParser/EXE/PackData.cs b/CTFAK/MMFParser/EXE/PackData.cs index 788bf7a..a0ceb18 100644 --- a/CTFAK/MMFParser/EXE/PackData.cs +++ b/CTFAK/MMFParser/EXE/PackData.cs @@ -97,8 +97,21 @@ namespace CTFAK.MMFParser.EXE public void Dump(string path = "[DEFAULT-PATH]") { Logger.Log($"Dumping {PackFilename}", true, ConsoleColor.DarkBlue); - var actualPath = path=="[DEFAULT-PATH]" ? ($"{Settings.ExtensionPath}\\{PackFilename}"):path; - File.WriteAllBytes(actualPath, Data); + if (path == "[DEFAULT-PATH]") + { + switch (Path.GetExtension(PackFilename)) + { + case ".exe": path = $"{Settings.EXEPath}\\{PackFilename}"; + break; + case ".dll": path = $"{Settings.DLLPath}\\{PackFilename}"; + break; + case ".mfx": path = $"{Settings.ExtensionPath}\\{PackFilename}"; + break; + default: path = $"{Settings.DumpPath}\\PackData\\{PackFilename}"; + break; + } + } + File.WriteAllBytes(path, Data); } } diff --git a/CTFAK/MMFParser/MFA/MFA.cs b/CTFAK/MMFParser/MFA/MFA.cs index 8deb42a..5c6c809 100644 --- a/CTFAK/MMFParser/MFA/MFA.cs +++ b/CTFAK/MMFParser/MFA/MFA.cs @@ -275,7 +275,7 @@ namespace CTFAK.MMFParser.MFA MfaBuild = Reader.ReadInt32(); Product = Reader.ReadInt32(); BuildVersion = Reader.ReadInt32(); - Settings.Build = BuildVersion; + // Settings.Build = BuildVersion; LangId = Reader.ReadInt32(); Name = Helper.AutoReadUnicode(Reader); Description = Helper.AutoReadUnicode(Reader); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index 6345f38..f4fcf0e 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE.Loaders; +using CTFAK.MMFParser.EXE.Loaders.Banks; using CTFAK.MMFParser.EXE.Loaders.Events; using CTFAK.MMFParser.EXE.Loaders.Events.Parameters; using CTFAK.MMFParser.EXE.Loaders.Objects; @@ -55,7 +56,7 @@ namespace CTFAK.MMFParser.Translation // mfa.Music = game.Music; - mfa.Images.Items = game.Images.Images; + mfa.Images.Items = game.Images?.Images ?? new Dictionary(); foreach (var key in mfa.Images.Items.Keys) { mfa.Images.Items[key].Debug = true; @@ -356,9 +357,16 @@ namespace CTFAK.MMFParser.Translation newItem.Transparent = 1; newItem.InkEffect = item.InkEffect; newItem.InkEffectParameter = item.InkEffectValue; - newItem.AntiAliasing = item.Antialias? 1 : 0;; + newItem.AntiAliasing = item.Antialias? 1 : 0; newItem.Flags = item.Flags; - newItem.Chunks.GetOrCreateChunk().Blend = (byte) item.InkEffectValue; + if (item.InkEffectValue == 0&&Settings.Build<=284) + { + newItem.Chunks.GetOrCreateChunk().Blend = 255; + } + else + { + newItem.Chunks.GetOrCreateChunk().Blend = item.InkEffectValue; + } newItem.Chunks.GetOrCreateChunk().RGBCoeff = Color.White; newItem.IconHandle = 12; @@ -408,7 +416,7 @@ namespace CTFAK.MMFParser.Translation 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++) + for (int j = 0; j < itemLoader.Movements?.Items?.Count; j++) { var mov = itemLoader.Movements.Items[j]; var newMov = new Movement(null); diff --git a/CTFAK/Program.cs b/CTFAK/Program.cs index c47ea6b..a66b7a3 100644 --- a/CTFAK/Program.cs +++ b/CTFAK/Program.cs @@ -62,6 +62,7 @@ namespace CTFAK } else { + Settings.Unicode = true; var reader = new ByteReader(new FileStream(args[0],FileMode.Open)); CleanData = new GameData(); CleanData.Read(reader); @@ -136,6 +137,8 @@ namespace CTFAK Directory.CreateDirectory($"{Settings.MusicPath}"); Directory.CreateDirectory($"{Settings.ChunkPath}"); Directory.CreateDirectory($"{Settings.ExtensionPath}"); + Directory.CreateDirectory($"{Settings.DLLPath}"); + Directory.CreateDirectory($"{Settings.EXEPath}"); Directory.CreateDirectory($"{PluginAPI.PluginAPI.PluginPath}"); } public static void InitNativeLibrary() diff --git a/CTFAK/Settings.cs b/CTFAK/Settings.cs index 5b29dc4..8704f22 100644 --- a/CTFAK/Settings.cs +++ b/CTFAK/Settings.cs @@ -18,13 +18,15 @@ namespace CTFAK public static string GamePath; public static string GameName => Path.GetFileNameWithoutExtension(GamePath); - public static string DumpPath => $"DUMP\\{GameName}"; + public static string DumpPath => $"Dumps\\{GameName}"; public static string ImagePath=>$"{DumpPath}\\Images"; public static string SoundPath=>$"{DumpPath}\\Sounds"; public static string MusicPath=>$"{DumpPath}\\Musics"; public static string ChunkPath=>$"{DumpPath}\\Chunks"; - public static string ExtensionPath=>$"{DumpPath}\\Extensions"; + public static string ExtensionPath=>$"{DumpPath}\\PackData\\Extensions"; + public static string DLLPath=>$"{DumpPath}\\PackData\\DLLs"; + public static string EXEPath=>$"{DumpPath}\\PackData\\Exes"; public static string AppName; public static string Copyright;