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\Events\Parameters\Click.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\GroupPointer.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" />

@ -300,8 +300,8 @@ namespace CTFAK.MMFParser.EXE
}
loader?.Read();
chunk.ChunkData = null;
chunk.RawData = null;
// chunk.ChunkData = null;
// chunk.RawData = null;
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
var tempImages = new Dictionary<int, ImageItem>();
// if (!Settings.DoMFA)return;
NumberOfItems = (uint) Reader.ReadInt32();
Logger.Log($"Found {NumberOfItems} images", true, ConsoleColor.Green);
@ -149,6 +149,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32();
if (!Debug)
{
if (Settings.Build>288) 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
Items = new List<MusicFile>();
// if (!Settings.DoMFA)return;
NumOfItems = Reader.ReadInt32();
if (!Settings.DumpMusic) return;
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
Items = new List<SoundItem>();
// if (!Settings.DoMFA)return;
NumOfItems = Reader.ReadInt32();
Logger.Log("Found " + NumOfItems + " sounds",true,ConsoleColor.Green);
//if (!Settings.DumpSounds) return;

@ -233,22 +233,44 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
foreach (Condition condition in Conditions)
{
var cond = condition;
Fixer.FixConditions(ref cond);
condition.Write(newWriter);
}
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.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());
// Logger.Log($"{ObjectType}-{Num}-{ObjectInfo}-{ObjectInfoList}-{Flags}-{OtherFlags}-{Items.Count}-{DefType}-{Identifier}");
newWriter.WriteInt16((short) ObjectType);
if (Num == -42) Num = -27;
newWriter.WriteInt16((short) Num);
newWriter.WriteUInt16((ushort) ObjectInfo);
newWriter.WriteInt16((short) ObjectInfoList);
@ -187,7 +186,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
}
else
{
throw new Exception("Loader is null");
throw new Exception("Loader is null: "+Code);
}
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.Collections.Generic;
using System.Drawing;
using System.Linq;
using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders
@ -109,9 +110,9 @@ namespace CTFAK.MMFParser.EXE.Loaders
public string Password => _password.Value;
public Color Background => _header.Background;
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 List<Layer> Layers => _layers.Items;
public List<Layer> Layers => _layers?.Items ?? null;
public Frame(ByteReader reader) : base(reader){}

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

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

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

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

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

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

@ -44,7 +44,7 @@ namespace CTFAK.MMFParser.Translation
}
else mfaReader = new ByteReader(TemplatePath, FileMode.Open);
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<SoundBank>().Read();
@ -54,11 +54,11 @@ namespace CTFAK.MMFParser.Translation
Pame2Mfa.Message("Loading Template");
template.Read(); //Loading template
Pame2Mfa.Message("Translating...");
Pame2Mfa.Translate(ref template, Exe.Instance.GameData); //Translation
Pame2Mfa.Translate(ref template, Program.CleanData); //Translation
var mfaWriter =
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
Pame2Mfa.Message("");
Pame2Mfa.Message("Writing MFA");

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

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

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

Loading…
Cancel
Save