EXE->MFA Fixes

master
1987kostya 4 years ago
parent 82a048f1d0
commit 0bc8e226d7

@ -168,6 +168,7 @@
<Compile Include="MMFParser\EXE\Loaders\Common.cs" /> <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\Extension.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\GroupPointer.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\GroupPointer.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" />

@ -300,8 +300,8 @@ namespace CTFAK.MMFParser.EXE
} }
loader?.Read(); loader?.Read();
chunk.ChunkData = null; // chunk.ChunkData = null;
chunk.RawData = null; // chunk.RawData = null;
return loader; return loader;
} }

@ -75,7 +75,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>();
// if (!Settings.DoMFA)return;
NumberOfItems = (uint) Reader.ReadInt32(); NumberOfItems = (uint) Reader.ReadInt32();
Logger.Log($"Found {NumberOfItems} images", true, ConsoleColor.Green); Logger.Log($"Found {NumberOfItems} images", true, ConsoleColor.Green);
@ -149,6 +149,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) if (!Debug)
{ {
if (Settings.Build>288) Handle -= 1;
if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
} }

@ -34,6 +34,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
Items = new List<MusicFile>(); Items = new List<MusicFile>();
// if (!Settings.DoMFA)return;
NumOfItems = Reader.ReadInt32(); NumOfItems = Reader.ReadInt32();
if (!Settings.DumpMusic) return; if (!Settings.DumpMusic) return;
Console.WriteLine(NumOfItems); Console.WriteLine(NumOfItems);

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

@ -233,22 +233,44 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
foreach (Condition condition in Conditions) foreach (Condition condition in Conditions)
{ {
var cond = condition;
Fixer.FixConditions(ref cond);
condition.Write(newWriter); condition.Write(newWriter);
} }
foreach (Action action in Actions) foreach (Action action in Actions)
{ {
action.Write(newWriter); var act = action;
Fixer.FixActions(ref act);
act.Write(newWriter);
} }
Writer.WriteInt16((short) ((newWriter.Size()+2)*-1)); Writer.WriteInt16((short) ((newWriter.Size()+2)*-1));
Writer.WriteWriter(newWriter); Writer.WriteWriter(newWriter);
}
}
public static class Fixer
{
public static void FixConditions(ref Condition cond)
{
var num = cond.Num;
if (num == -42) num = -27;
// 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;
cond.Num = num;
}
public static void FixActions(ref Action act)
{
var num = act.Num;
// if (num == 27||num == 28||num == 29||num == 30) num = 3;
act.Num = num;
} }
} }
} }

@ -25,7 +25,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
ByteWriter newWriter = new ByteWriter(new MemoryStream()); ByteWriter newWriter = new ByteWriter(new MemoryStream());
// Logger.Log($"{ObjectType}-{Num}-{ObjectInfo}-{ObjectInfoList}-{Flags}-{OtherFlags}-{Items.Count}-{DefType}-{Identifier}"); // Logger.Log($"{ObjectType}-{Num}-{ObjectInfo}-{ObjectInfoList}-{Flags}-{OtherFlags}-{Items.Count}-{DefType}-{Identifier}");
newWriter.WriteInt16((short) ObjectType); newWriter.WriteInt16((short) ObjectType);
if (Num == -42) Num = -27;
newWriter.WriteInt16((short) Num); newWriter.WriteInt16((short) Num);
newWriter.WriteUInt16((ushort) ObjectInfo); newWriter.WriteUInt16((ushort) ObjectInfo);
newWriter.WriteInt16((short) ObjectInfoList); newWriter.WriteInt16((short) ObjectInfoList);
@ -187,7 +186,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
} }
else else
{ {
throw new Exception("Loader is null"); throw new Exception("Loader is null: "+Code);
} }
Reader.Seek(currentPosition+size); Reader.Seek(currentPosition+size);

@ -0,0 +1,33 @@
using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
public class Extension:ParameterCommon
{
public short Size;
public short Type;
public short Code;
public byte[] Data;
public Extension(ByteReader reader) : base(reader)
{
}
public override void Read()
{
Size = Reader.ReadInt16();
Type = Reader.ReadInt16();
Code = Reader.ReadInt16();
Data = Reader.ReadBytes(Size-20);
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16((short) (Data.Length+6));
Writer.WriteInt16(Type);
Writer.WriteInt16(Code);
Writer.WriteBytes(Data);
}
}
}

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using CTFAK.Utils; using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders namespace CTFAK.MMFParser.EXE.Loaders
@ -109,9 +110,9 @@ namespace CTFAK.MMFParser.EXE.Loaders
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;
public List<Color> Palette => _palette.Items; public List<Color> Palette => _palette?.Items ?? new Color[256].ToList();
public Events.Events Events => _events; public Events.Events Events => _events;
public List<Layer> Layers => _layers.Items; public List<Layer> Layers => _layers?.Items ?? null;
public Frame(ByteReader reader) : base(reader){} public Frame(ByteReader reader) : base(reader){}

@ -24,20 +24,13 @@ namespace CTFAK.MMFParser.EXE.Loaders
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
var handle = Reader.ReadInt16(); var handle = Reader.ReadInt16();
Logger.Log("Frame Handle: "+handle);
Items.Add(i,handle); Items.Add(i,handle);
} }
} }
public override void Print(bool ext) public override void Print(bool ext){}
{ public override string[] GetReadableData() => null;
throw new System.NotImplementedException();
}
public override string[] GetReadableData()
{
throw new System.NotImplementedException();
}
} }
} }

@ -38,7 +38,6 @@ namespace CTFAK.MMFParser.EXE.Loaders
_name = infoChunks.GetChunk<ObjectName>(); _name = infoChunks.GetChunk<ObjectName>();
_properties = infoChunks.GetChunk<ObjectProperties>(); _properties = infoChunks.GetChunk<ObjectProperties>();
_properties.ReadNew((int) ObjectType,this); _properties.ReadNew((int) ObjectType,this);
} }
public int Handle => _header.Handle; public int Handle => _header.Handle;

@ -190,6 +190,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
{ {
ExtensionData = Reader.ReadBytes(dataSize); ExtensionData = Reader.ReadBytes(dataSize);
} }
else ExtensionData=new byte[0];
Logger.Log($"{Parent.Name} - {ExtensionId}"); Logger.Log($"{Parent.Name} - {ExtensionId}");
} }

@ -37,7 +37,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteInt32(IconHandle); Writer.WriteInt32(IconHandle);
Chunks.Write(Writer); Chunks.Write(Writer);
Loader.Write(Writer); Loader?.Write(Writer);

@ -52,6 +52,8 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
Writer.WriteUInt32(Magic); Writer.WriteUInt32(Magic);
Writer.AutoWriteUnicode(SubType); Writer.AutoWriteUnicode(SubType);
} }
// if (ExtensionData == null) ExtensionData = new byte[0];
Writer.WriteInt32(ExtensionData.Length+20); Writer.WriteInt32(ExtensionData.Length+20);
Writer.WriteInt32(ExtensionData.Length+20); Writer.WriteInt32(ExtensionData.Length+20);
Writer.WriteInt32(-1); Writer.WriteInt32(-1);

@ -98,7 +98,7 @@ namespace CTFAK.MMFParser.MFA
public int InitialLifes; public int InitialLifes;
public int FrameRate; public int FrameRate;
public int BuildType; public int BuildType;
public string BuildPath; public string BuildPath=" ";
public string CommandLine; public string CommandLine;
public string Aboutbox; public string Aboutbox;
public uint MenuSize; public uint MenuSize;
@ -179,7 +179,7 @@ namespace CTFAK.MMFParser.MFA
Writer.WriteUInt32((uint) InitialLifes); Writer.WriteUInt32((uint) InitialLifes);
Writer.WriteInt32(FrameRate); Writer.WriteInt32(FrameRate);
Writer.WriteInt32(BuildType); Writer.WriteInt32(BuildType);
Writer.AutoWriteUnicode(BuildPath); Writer.AutoWriteUnicode(BuildPath ?? "");
Writer.AutoWriteUnicode(unknown_string_2); Writer.AutoWriteUnicode(unknown_string_2);
Writer.AutoWriteUnicode(CommandLine); Writer.AutoWriteUnicode(CommandLine);
Writer.AutoWriteUnicode(Aboutbox); Writer.AutoWriteUnicode(Aboutbox);

@ -44,7 +44,7 @@ namespace CTFAK.MMFParser.Translation
} }
else mfaReader = new ByteReader(TemplatePath, FileMode.Open); else mfaReader = new ByteReader(TemplatePath, FileMode.Open);
Logger.Log("Loading images"); Logger.Log("Loading images");
Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().PreloadOnly = false; if(Program.CleanData.GameChunks.GetChunk<ImageBank>()!=null)Program.CleanData.GameChunks.GetChunk<ImageBank>().PreloadOnly = false;
// Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(true,false); // Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(true,false);
// Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>().Read(); // Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>().Read();
@ -54,11 +54,11 @@ namespace CTFAK.MMFParser.Translation
Pame2Mfa.Message("Loading Template"); Pame2Mfa.Message("Loading Template");
template.Read(); //Loading template template.Read(); //Loading template
Pame2Mfa.Message("Translating..."); Pame2Mfa.Message("Translating...");
Pame2Mfa.Translate(ref template, Exe.Instance.GameData); //Translation Pame2Mfa.Translate(ref template, Program.CleanData); //Translation
var mfaWriter = var mfaWriter =
new ByteWriter( new ByteWriter(
Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Path.GetFileNameWithoutExtension(Exe.Instance.GameData.GameChunks.GetChunk<EditorFilename>().Value)}.mfa" : "out.mfa", Program.CleanData.GameChunks.GetChunk<AppName>().Value.Length > 0 ? $"{Settings.DumpPath}\\{Path.GetFileNameWithoutExtension(Program.CleanData.GameChunks.GetChunk<EditorFilename>().Value)}.mfa" : "out.mfa",
FileMode.Create); //New writer for new MFA FileMode.Create); //New writer for new MFA
Pame2Mfa.Message(""); Pame2Mfa.Message("");
Pame2Mfa.Message("Writing MFA"); Pame2Mfa.Message("Writing MFA");

@ -17,6 +17,7 @@ using Backdrop = CTFAK.MMFParser.MFA.Loaders.mfachunks.Backdrop;
using ChunkList = CTFAK.MMFParser.MFA.Loaders.ChunkList; using ChunkList = CTFAK.MMFParser.MFA.Loaders.ChunkList;
using Counter = CTFAK.MMFParser.MFA.Loaders.mfachunks.Counter; using Counter = CTFAK.MMFParser.MFA.Loaders.mfachunks.Counter;
using Events = CTFAK.MMFParser.MFA.Loaders.Events; using Events = CTFAK.MMFParser.MFA.Loaders.Events;
using Extension = CTFAK.MMFParser.EXE.Loaders.Extension;
using Frame = CTFAK.MMFParser.EXE.Loaders.Frame; using Frame = CTFAK.MMFParser.EXE.Loaders.Frame;
using Layer = CTFAK.MMFParser.MFA.Loaders.Layer; using Layer = CTFAK.MMFParser.MFA.Loaders.Layer;
using Movement = CTFAK.MMFParser.MFA.Loaders.mfachunks.Movement; using Movement = CTFAK.MMFParser.MFA.Loaders.mfachunks.Movement;
@ -145,10 +146,12 @@ namespace CTFAK.MMFParser.Translation
newFrame.Password = ""; newFrame.Password = "";
newFrame.LastViewedX = 320; newFrame.LastViewedX = 320;
newFrame.LastViewedY = 240; newFrame.LastViewedY = 240;
if (frame.Palette == null) continue;
newFrame.Palette = frame.Palette; newFrame.Palette = frame.Palette;
newFrame.StampHandle = 13; newFrame.StampHandle = 13;
newFrame.ActiveLayer = 0; newFrame.ActiveLayer = 0;
//LayerInfo //LayerInfo
if(frame.Layers==null) continue;
var count = frame.Layers.Count; var count = frame.Layers.Count;
Logger.Log($"{newFrame.Name} - {count}"); Logger.Log($"{newFrame.Name} - {count}");
for (int i=0;i<count;i++) for (int i=0;i<count;i++)
@ -210,15 +213,14 @@ namespace CTFAK.MMFParser.Translation
newFolder.Items = new List<uint>() {(uint) newFrameItem.Handle}; newFolder.Items = new List<uint>() {(uint) newFrameItem.Handle};
newFrame.Folders.Add(newFolder); newFrame.Folders.Add(newFolder);
} }
if (frame.Events != null)
{ {
newFrame.Events = new Events((ByteReader) null); newFrame.Events = new Events((ByteReader) null);
newFrame.Events.Items = new List<EventGroup>(); newFrame.Events.Items = new List<EventGroup>();
newFrame.Events.Objects = new List<EventObject>(); newFrame.Events.Objects = new List<EventObject>();
newFrame.Events._ifMFA = true; newFrame.Events._ifMFA = true;
newFrame.Events.Version = 1028; newFrame.Events.Version = 1028;
if(frame.Events != null)
{ {
foreach (var item in newFrame.Items) foreach (var item in newFrame.Items)
{ {
@ -234,9 +236,14 @@ namespace CTFAK.MMFParser.Translation
newObject.InstanceHandle = 0xFFFFFFFF; newObject.InstanceHandle = 0xFFFFFFFF;
newFrame.Events.Objects.Add(newObject); newFrame.Events.Objects.Add(newObject);
} }
newFrame.Events.Items = frame.Events.Items;
foreach (EventGroup item in frame.Events.Items)
{
newFrame.Events.Items.Add(item);
}
} }
} }
mfa.Frames.Add(newFrame); mfa.Frames.Add(newFrame);
@ -403,7 +410,7 @@ namespace CTFAK.MMFParser.Translation
{ {
if (animHeader.AnimationDict.ContainsKey(origAnim.Key)) if (animHeader.AnimationDict.ContainsKey(origAnim.Key))
{ {
animation = animHeader.AnimationDict[origAnim.Key]; animation = animHeader?.AnimationDict[origAnim.Key];
} }
else break; else break;
@ -456,7 +463,7 @@ namespace CTFAK.MMFParser.Translation
newExt.Movements = newObject.Movements; newExt.Movements = newObject.Movements;
newExt.Behaviours = newObject.Behaviours; newExt.Behaviours = newObject.Behaviours;
} }
var exts = Exe.Instance.GameData.GameChunks.GetChunk<Extensions>(); var exts = Program.CleanData.GameChunks.GetChunk<Extensions>();
Extension ext = null; Extension ext = null;
foreach (var testExt in exts.Items) foreach (var testExt in exts.Items)
{ {
@ -492,20 +499,33 @@ namespace CTFAK.MMFParser.Translation
newText.Movements = newObject.Movements; newText.Movements = newObject.Movements;
newText.Behaviours = newObject.Behaviours; newText.Behaviours = newObject.Behaviours;
} }
newText.Width = (uint) text.Width; if (text == null)
newText.Height = (uint) text.Height;
var paragraph = text.Items[0];
newText.Font = paragraph.FontHandle;
newText.Color = paragraph.Color;
newText.Flags = 0;
newText.Items = new List<Paragraph>();
foreach (EXE.Loaders.Objects.Paragraph exePar in text.Items)
{ {
var newPar = new Paragraph((ByteReader) null); newText.Width = 10;
newPar.Value = exePar.Value; newText.Height = 10;
newPar.Flags = exePar.Flags.flag; newText.Font = 0;
newText.Items.Add(newPar); newText.Color=Color.Black;
newText.Flags = 0;
newText.Items=new List<Paragraph>();
}
else
{
newText.Width = (uint) text.Width;
newText.Height = (uint) text.Height;
var paragraph = text.Items[0];
newText.Font = paragraph.FontHandle;
newText.Color = paragraph.Color;
newText.Flags = 0;
newText.Items = new List<Paragraph>();
foreach (EXE.Loaders.Objects.Paragraph exePar in text.Items)
{
var newPar = new Paragraph((ByteReader) null);
newPar.Value = exePar.Value;
newPar.Flags = exePar.Flags.flag;
newText.Items.Add(newPar);
}
} }
newItem.Loader = newText; newItem.Loader = newText;
} }
@ -545,9 +565,20 @@ namespace CTFAK.MMFParser.Translation
newCount.Movements = newObject.Movements; newCount.Movements = newObject.Movements;
newCount.Behaviours = newObject.Behaviours; newCount.Behaviours = newObject.Behaviours;
} }
newCount.Value = itemLoader.Counter.Initial; if (itemLoader.Counter == null)
newCount.Maximum = itemLoader.Counter.Maximum; {
newCount.Minimum = itemLoader.Counter.Minimum; newCount.Value = 0;
newCount.Minimum = 0;
newCount.Maximum = 0;
}
else
{
newCount.Value = itemLoader.Counter.Initial;
newCount.Maximum = itemLoader.Counter.Maximum;
newCount.Minimum = itemLoader.Counter.Minimum;
}
newCount.Images = new List<int>() {0}; newCount.Images = new List<int>() {0};
var shape = counter?.Shape; var shape = counter?.Shape;

@ -62,6 +62,7 @@ namespace CTFAK
var reader = new ByteReader(new FileStream(args[0],FileMode.Open)); var reader = new ByteReader(new FileStream(args[0],FileMode.Open));
CleanData = new GameData(); CleanData = new GameData();
CleanData.Read(reader); CleanData.Read(reader);
MFAGenerator.BuildMFA();
} }
} }

@ -164,6 +164,11 @@ namespace CTFAK.Utils
item = new Click(reader); item = new Click(reader);
} }
if (code == 55)
{
item = new Extension(reader);
}
if (code == 38) if (code == 38)
{ {
item = new CTFAK.MMFParser.EXE.Loaders.Events.Parameters.Group(reader); item = new CTFAK.MMFParser.EXE.Loaders.Events.Parameters.Group(reader);

Loading…
Cancel
Save