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