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">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="MMFParser\EXE\Loaders\Common.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\Group.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();

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

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

@ -17,7 +17,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
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<int, ImageItem>();
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"])

@ -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<SoundItem>();
NumOfItems = Reader.ReadInt32();
NumOfItems = Reader.ReadInt32();
Logger.Log("Found " + NumOfItems + " sounds",true,ConsoleColor.Green);
//if (!Settings.DumpSounds) return;

@ -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 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<FrameHeader>();
_virtualSize = Chunks.GetChunk<VirtualRect>();
_name = Chunks.GetChunk<FrameName>();
_password = Chunks.GetChunk<FramePassword>();
_palette = Chunks.GetChunk<FramePalette>();
@ -96,11 +97,15 @@ namespace CTFAK.MMFParser.EXE.Loaders
_fadeOut = Chunks.PopChunk<Transition>();
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<ObjectInstance> Objects => _objects?.Items ?? null;
@ -249,8 +254,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
{
get
{
if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null;
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
if (Program.CleanData.GameChunks.GetChunk<FrameItems>() == null) return null;
return Program.CleanData.GameChunks.GetChunk<FrameItems>().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){}
}
}

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

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

@ -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<DataLoader> _items = new List<DataLoader>();
public byte[] Saved;
public bool Log;
public List<MFAChunk> Items = new List<MFAChunk>();
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);
}
}

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

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

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

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

@ -295,7 +295,7 @@ namespace CTFAK.MMFParser.MFA
Music = new MusicBank(Reader);
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.Read();

@ -18,6 +18,8 @@ namespace CTFAK
public class Program
{
public static MainForm MyForm;
public static GameData CleanData;
public delegate void DumperEvent(object obj);
@ -30,11 +32,11 @@ namespace CTFAK
{
File.Create("settings.sav");
}
LoadableSettings.FromFile("settings.sav");
// LoadableSettings.FromFile("settings.sav");
//
// MFAGenerator.WriteTestMFA();
MFAGenerator.ReadTestMFA();
Environment.Exit(0);
// MFAGenerator.ReadTestMFA();
// Environment.Exit(0);
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
@ -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<Color>(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);
}
}

Loading…
Cancel
Save