Fixed events hardcode, started working on advanced chunk writing

master
1987kostya 4 years ago
parent be8ede79b9
commit 473591e4ad

@ -165,6 +165,7 @@
<Compile Include="GUI\MainForm.Designer.cs"> <Compile Include="GUI\MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="MMFParser\EXE\Loaders\Common.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Click.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Click.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\ExpressionParameter.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\ExpressionParameter.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" />

@ -50,10 +50,8 @@ namespace CTFAK.GUI
{ {
//Buttons //Buttons
InitializeComponent(); InitializeComponent();
if (LoadableSettings.instance["lang"]?.ToString()?.Length > 0) Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
{
Thread.CurrentThread.CurrentUICulture=new CultureInfo(LoadableSettings.instance["lang"].ToString());
}
ColorTheme = color; ColorTheme = color;
foreach (Control item in Controls) foreach (Control item in Controls)
@ -274,7 +272,7 @@ namespace CTFAK.GUI
Logger.Log("Loading GUI"); Logger.Log("Loading GUI");
//GameData gameData = null; //GameData gameData = null;
var exe = Exe.Instance; var exe = Exe.Instance;
var gameData = exe.GameData; var gameData = exe?.GameData ?? Program.CleanData;
treeView1.Nodes.Clear(); treeView1.Nodes.Clear();

@ -258,6 +258,9 @@ namespace CTFAK.MMFParser.EXE
case 13116: case 13116:
loader = new Transition(chunk); loader = new Transition(chunk);
break; break;
case 13122:
loader = new VirtualRect(chunk);
break;
case 13121: case 13121:
loader = new Layers(chunk); loader = new Layers(chunk);
break; break;
@ -289,7 +292,7 @@ namespace CTFAK.MMFParser.EXE
loader = new GlobalStrings(chunk); loader = new GlobalStrings(chunk);
break; break;
case 13117: case 13117:
loader = new Events(chunk);//NOT WORKING // loader = new Events(chunk);
break; break;
} }

@ -70,6 +70,7 @@ namespace CTFAK.MMFParser.EXE
Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue); Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue);
PackData.Read(exeReader); PackData.Read(exeReader);
GameData = new GameData(); GameData = new GameData();
Program.CleanData = GameData;
GameData.Read(exeReader); GameData.Read(exeReader);
Console.ForegroundColor = ConsoleColor.DarkGreen; Console.ForegroundColor = ConsoleColor.DarkGreen;
} }
@ -79,6 +80,7 @@ namespace CTFAK.MMFParser.EXE
var oldData = new ChunkList(); var oldData = new ChunkList();
oldData.Read(exeReader); oldData.Read(exeReader);
GameData = new GameData(); GameData = new GameData();
Program.CleanData = GameData;
GameData.Read(exeReader); GameData.Read(exeReader);
Console.ForegroundColor = ConsoleColor.DarkGreen; Console.ForegroundColor = ConsoleColor.DarkGreen;
} }

@ -17,7 +17,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public bool SaveImages = false; public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>(); public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems; public uint NumberOfItems;
public bool PreloadOnly=true; public bool PreloadOnly=false;
public ImageBank(ByteReader reader) : base(reader) 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 if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once
var tempImages = new Dictionary<int, ImageItem>(); var tempImages = new Dictionary<int, ImageItem>();
NumberOfItems = (uint) Reader.ReadInt32();
NumberOfItems = Reader.ReadUInt32();
Logger.Log($"Found {NumberOfItems} images",true,ConsoleColor.Green); Logger.Log($"Found {NumberOfItems} images",true,ConsoleColor.Green);
@ -157,7 +156,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) 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(); Position = (int) Reader.Tell();
@ -265,7 +264,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
ActionX = imageReader.ReadInt16(); ActionX = imageReader.ReadInt16();
ActionY = imageReader.ReadInt16(); ActionY = imageReader.ReadInt16();
_transparent = imageReader.ReadColor(); _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; byte[] imageData;
if(Settings.twofiveplus) Flags["LZX"] = false; if(Settings.twofiveplus) Flags["LZX"] = false;
if (Flags["LZX"]) if (Flags["LZX"])

@ -37,10 +37,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public override void Read() public override void Read()
{ {
if (!Settings.DoMFA)Reader.Seek(0);//Reset the reader to avoid bugs when dumping more than once if (!Settings.DoMFA)Reader.Seek(0);//Reset the reader to avoid bugs when dumping more than once
Items = new List<SoundItem>(); Items = new List<SoundItem>();
NumOfItems = Reader.ReadInt32(); NumOfItems = Reader.ReadInt32();
Logger.Log("Found " + NumOfItems + " sounds",true,ConsoleColor.Green); Logger.Log("Found " + NumOfItems + " sounds",true,ConsoleColor.Green);

@ -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;
}
}

@ -54,6 +54,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
private Events.Events _events; private Events.Events _events;
private Transition _fadeIn; private Transition _fadeIn;
private Transition _fadeOut; private Transition _fadeOut;
private VirtualRect _virtualSize;
public override void Print(bool ext) public override void Print(bool ext)
@ -69,9 +70,9 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
return new string[] return new string[]
{ {
$"Name: {_name}", $"Name: {Name}",
$"Size: {Width}x{Height}", $"Size: {Width}x{Height}",
$"Objects: {_objects.CountOfObjects}" $"Objects: {Objects.Count}"
}; };
} }
@ -82,9 +83,9 @@ namespace CTFAK.MMFParser.EXE.Loaders
Chunks = new ChunkList(); Chunks = new ChunkList();
Chunks.Read(frameReader); Chunks.Read(frameReader);
Logger.Log(Properties.GlobalStrings.readingFrame+" "+_name,true,ConsoleColor.Green);
_header = Chunks.GetChunk<FrameHeader>(); _header = Chunks.GetChunk<FrameHeader>();
_virtualSize = Chunks.GetChunk<VirtualRect>();
_name = Chunks.GetChunk<FrameName>(); _name = Chunks.GetChunk<FrameName>();
_password = Chunks.GetChunk<FramePassword>(); _password = Chunks.GetChunk<FramePassword>();
_palette = Chunks.GetChunk<FramePalette>(); _palette = Chunks.GetChunk<FramePalette>();
@ -96,11 +97,15 @@ namespace CTFAK.MMFParser.EXE.Loaders
_fadeOut = Chunks.PopChunk<Transition>(); _fadeOut = Chunks.PopChunk<Transition>();
Flags.flag = _header.Flags.flag; Flags.flag = _header.Flags.flag;
Logger.Log(Properties.GlobalStrings.readingFrame+$" {Name}",true,ConsoleColor.Green);
} }
public int Width => _header.Width; public int Width => _header.Width;
public int Height => _header.Height; 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 string Password => _password.Value;
public Color Background => _header.Background; public Color Background => _header.Background;
public List<ObjectInstance> Objects => _objects?.Items ?? null; public List<ObjectInstance> Objects => _objects?.Items ?? null;
@ -249,8 +254,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
get get
{ {
if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null; if (Program.CleanData.GameChunks.GetChunk<FrameItems>() == null) return null;
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo); return Program.CleanData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
} }
} }
@ -384,16 +389,12 @@ namespace CTFAK.MMFParser.EXE.Loaders
} }
} }
public override void Print(bool ext) public override void Print(bool ext){}
{ public override string[] GetReadableData() => null;
throw new NotImplementedException();
} }
public class VirtualRect:Rect
public override string[] GetReadableData()
{ {
throw new NotImplementedException(); public VirtualRect(ByteReader reader) : base(reader){}
} public VirtualRect(ChunkList.Chunk chunk) : base(chunk){}
} }
} }

@ -158,7 +158,6 @@ namespace CTFAK.MMFParser.EXE.Loaders
Flags = Reader.ReadUInt16(); Flags = Reader.ReadUInt16();
InkEffect = Reader.ReadByte(); InkEffect = Reader.ReadByte();
InkEffectParameter = Reader.ReadByte(); InkEffectParameter = Reader.ReadByte();
Logger.Log("InkParam: "+InkEffectParameter);
} }
} }
} }

@ -82,6 +82,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
case 1: case 1:
Loader = new Mouse(Reader); Loader = new Mouse(Reader);
break; break;
case 2:
Loader = new RaceMovement(Reader);
break;
case 3: case 3:
Loader=new EightDirections(Reader); Loader=new EightDirections(Reader);
break; break;
@ -345,4 +348,44 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Writer.WriteInt16(Directions); 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);
}
}
} }

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Windows.Forms.VisualStyles;
using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE;
using CTFAK.Utils; using CTFAK.Utils;
@ -7,22 +9,22 @@ namespace CTFAK.MMFParser.MFA.Loaders
{ {
public class ChunkList : DataLoader//This is used for MFA reading/writing public class ChunkList : DataLoader//This is used for MFA reading/writing
{ {
List<DataLoader> _items = new List<DataLoader>();
public byte[] Saved; public byte[] Saved;
public bool Log; public List<MFAChunk> Items = new List<MFAChunk>();
public bool Log=false;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
if (Saved != null) foreach (MFAChunk chunk in Items)
{ {
Writer.WriteBytes(Saved); chunk.Write(Writer);
} }
else
{
Writer.WriteInt8(0); Writer.WriteInt8(0);
} return;
} }
public override void Print() public override void Print()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -33,10 +35,13 @@ namespace CTFAK.MMFParser.MFA.Loaders
var start = Reader.Tell(); var start = Reader.Tell();
while(true) while(true)
{ {
var id = Reader.ReadByte(); var newChunk = new MFAChunk(Reader);
if(Log)Logger.Log("ChunkID: "+id); newChunk.Read();
if(id==0) break; if(Log)Logger.Log("ChunkID: "+newChunk.Id);
var data = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32())); if(newChunk.Id==0) break;
else Items.Add(newChunk);
} }
@ -48,4 +53,99 @@ namespace CTFAK.MMFParser.MFA.Loaders
} }
public ChunkList(ByteReader reader) : base(reader) { } 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);
}
} }

@ -174,7 +174,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
} }
else if (name == EventEnd) else if (name == EventEnd)
{ {
_cache = Reader.ReadBytes(122); // _cache = Reader.ReadBytes(122);
break; break;
} }
@ -279,7 +279,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteAscii(EventEnd); Writer.WriteAscii(EventEnd);
Writer.WriteBytes(_cache); // Writer.WriteBytes(_cache);

@ -215,6 +215,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
} }
Chunks = new ChunkList(Reader); Chunks = new ChunkList(Reader);
Chunks.Log = true;
Chunks.Read(); Chunks.Read();
if(Events.Items.Count==0)MFA.emptyEvents = Events; if(Events.Items.Count==0)MFA.emptyEvents = Events;

@ -73,7 +73,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
throw new NotImplementedException("invalid icon"); throw new NotImplementedException("invalid icon");
} }
Chunks = new ChunkList(Reader); Chunks = new ChunkList(Reader);
Chunks.Log = true; // Chunks.Log = true;
Chunks.Read(); Chunks.Read();
if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks; if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks;

@ -23,13 +23,8 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
Writer.WriteColor(BackgroundColor); Writer.WriteColor(BackgroundColor);
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++)
{
if(_qualifiers.Count<i) Writer.WriteInt16(_qualifiers[i]);
else
{ {
Writer.WriteInt16(-1); Writer.WriteInt16(-1);
break;
}
} }
Values.Write(Writer); Values.Write(Writer);
@ -90,7 +85,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
Behaviours = new Behaviours(Reader); Behaviours = new Behaviours(Reader);
Behaviours.Read(); Behaviours.Read();
Reader.Skip(2);//Transitions Reader.Skip(2);//Transitions
Print(); // Print();

@ -295,7 +295,7 @@ namespace CTFAK.MMFParser.MFA
Music = new MusicBank(Reader); Music = new MusicBank(Reader);
Music.Read(); Music.Read();
if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Icon Bank"); if (Reader.ReadAscii(4)!= "AGMI") throw new Exception("Invalid Icon Bank: ");
Icons = new AGMIBank(Reader); Icons = new AGMIBank(Reader);
Icons.Read(); Icons.Read();

@ -18,6 +18,8 @@ namespace CTFAK
public class Program public class Program
{ {
public static MainForm MyForm; public static MainForm MyForm;
public static GameData CleanData;
public delegate void DumperEvent(object obj); public delegate void DumperEvent(object obj);
@ -30,11 +32,11 @@ namespace CTFAK
{ {
File.Create("settings.sav"); File.Create("settings.sav");
} }
LoadableSettings.FromFile("settings.sav"); // LoadableSettings.FromFile("settings.sav");
// //
// MFAGenerator.WriteTestMFA(); // MFAGenerator.WriteTestMFA();
MFAGenerator.ReadTestMFA(); // MFAGenerator.ReadTestMFA();
Environment.Exit(0); // Environment.Exit(0);
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{ {
@ -51,20 +53,27 @@ namespace CTFAK
MyForm = new MainForm(Color.FromName(args[0])); MyForm = new MainForm(Color.FromName(args[0]));
} }
if (args.Length > 1) if (args.Length > 1)
{
if (args[1].EndsWith(".exe"))
{ {
ReadFile(args[1],true,false,true); ReadFile(args[1],true,false,true);
MFAGenerator.BuildMFA(); MFAGenerator.BuildMFA();
Environment.Exit(0); 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) else if(args.Length==0)
{ {
if (LoadableSettings.instance["mainColor"] == null)
MyForm = new MainForm(Color.FromArgb(223, 114, 38)); MyForm = new MainForm(Color.FromArgb(223, 114, 38));
else
MyForm = new MainForm(
LoadableSettings.instance.ToActual<Color>(LoadableSettings.instance["mainColor"]));
}
Application.Run(MyForm); Application.Run(MyForm);
}
@ -98,6 +107,8 @@ namespace CTFAK
Settings.DumpImages = dumpImages; Settings.DumpImages = dumpImages;
Settings.DumpSounds = dumpSounds; Settings.DumpSounds = dumpSounds;
Settings.Verbose = verbose; Settings.Verbose = verbose;
if (path.EndsWith(".exe"))
{
var exeReader = new ByteReader(path, FileMode.Open); var exeReader = new ByteReader(path, FileMode.Open);
var currentExe = new Exe(); var currentExe = new Exe();
@ -108,6 +119,14 @@ namespace CTFAK
stopWatch.Stop(); stopWatch.Stop();
Logger.Log("Finished in "+stopWatch.Elapsed.ToString("g"), true, ConsoleColor.Yellow); 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);
}
} }
public static void PrepareFolders() public static void PrepareFolders()

Loading…
Cancel
Save