Fixed missing frames and broken frame handles

master
1987kostya 4 years ago
parent e4b8bf8d2c
commit 82a048f1d0

@ -176,6 +176,7 @@
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\TwoShorts.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Zone.cs" />
<Compile Include="MMFParser\EXE\Loaders\Extensions.cs" />
<Compile Include="MMFParser\EXE\Loaders\FrameHandles.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Movements.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Text.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\Backdrop.cs" />

@ -209,6 +209,9 @@ namespace CTFAK.MMFParser.EXE
case 8743:
loader = new ExtPath(chunk);
break;
case 8747:
loader=new FrameHandles(chunk);
break;
case 8750:
loader = new EditorFilename(chunk);
break;

@ -85,11 +85,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Logger.Log("Reading Images", true, ConsoleColor.Green);
for (int i = 0; i < NumberOfItems; i++)
{
if (MainForm.BreakImages)
if (MainForm.BreakImages) break;
{
break;
}
var item = new ImageItem(Reader);
@ -98,17 +96,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i, (int) NumberOfItems);
}
//if (Settings.Build >= 284)
// item.Handle -= 1;
//images[item.handle] = item;
}
Logger.Log("Images success", true, ConsoleColor.Green);
if (!MainForm.BreakImages) Images = tempImages;
MainForm.BreakImages = false;
}
}

@ -27,10 +27,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public override void Write(ByteWriter Writer)
{
Writer.WriteUInt16(0);
Writer.WriteUInt16(Flags);
Writer.WriteUInt16(Id);
Writer.WriteUnicode(Name,true);
if(true)//decrypt password
if(true)
{
Password = Checksum.MakeGroupChecksum("", Name);
}

@ -0,0 +1,43 @@
using System.Collections.Generic;
using System.Linq;
using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders
{
public class FrameHandles:ChunkLoader
{
public Dictionary<int,int> Items;
public FrameHandles(ByteReader reader) : base(reader)
{
}
public FrameHandles(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
var len = Reader.Size() / 2;
Items = new Dictionary<int,int>();
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 string[] GetReadableData()
{
throw new System.NotImplementedException();
}
}
}

@ -62,6 +62,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public ushort DisplayType;
public ushort Flags;
public ushort Player;
public Shape Shape;
public Counters(ByteReader reader) : base(reader)
{
@ -103,8 +104,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
}
else if (DisplayType == 2 || DisplayType == 3 || DisplayType == 5)
{
//TODO: Shapes
Logger.Log("Ignoring unsupported counter type");
Shape = new Shape(Reader);
Shape.Read();
}
}

@ -88,12 +88,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
case 3:
Loader=new EightDirections(Reader);
break;
case 5:
Loader=new MovementPath(Reader);
break;
case 4:
Loader=new Ball(Reader);
break;
case 5:
Loader=new MovementPath(Reader);
break;
}
if(Loader==null&&Type!=0) throw new Exception("Unsupported movement: "+Type);
@ -388,4 +389,42 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Writer.WriteInt16(ReverseEnabled);
}
}
public class PlatformMovement:MovementLoader
{
public short Speed;
public short Acceleration;
public short Deceleration;
public short Control;
public short Gravity;
public short JumpStrength;
public PlatformMovement(ByteReader reader) : base(reader)
{
}
public PlatformMovement(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Speed = Reader.ReadInt16();
Acceleration = Reader.ReadInt16();
Deceleration = Reader.ReadInt16();
Control = Reader.ReadInt16();
Gravity = Reader.ReadInt16();
JumpStrength = Reader.ReadInt16();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16(Speed);
Writer.WriteInt16(Acceleration);
Writer.WriteInt16(Deceleration);
Writer.WriteInt16(Control);
Writer.WriteInt16(Gravity);
Writer.WriteInt16(JumpStrength);
}
}
}

@ -45,7 +45,7 @@ namespace CTFAK.MMFParser.Translation
else mfaReader = new ByteReader(TemplatePath, FileMode.Open);
Logger.Log("Loading images");
Exe.Instance.GameData.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();
Settings.DoMFA = true;

@ -57,6 +57,8 @@ namespace CTFAK.MMFParser.Translation
mfa.Images.Items[key].Debug = true;
}
// game.Images.Images.Clear();
mfa.Author = game.Author ?? "";
mfa.Copyright = game.Copyright ?? "";
mfa.Company = "";
@ -102,30 +104,35 @@ namespace CTFAK.MMFParser.Translation
// var reference = mfa.Frames.FirstOrDefault();
mfa.Frames.Clear();
foreach (Frame frame in game.Frames)
Dictionary<int,int> indexHandles = new Dictionary<int, int>();
foreach (var pair in Program.CleanData.GameChunks.GetChunk<FrameHandles>().Items)
{
if(frame.Palette==null|| frame.Events==null|| frame.Objects==null) continue;
Message("Translating frame: " + frame.Name);
var key = pair.Key;
var handle = pair.Value;
if (!indexHandles.ContainsKey(handle)) indexHandles.Add(handle, key);
else indexHandles[handle] = key;
}
for (int a=0;a<game.Frames.Count;a++)
{
var frame = game.Frames[a];
// if(frame.Palette==null|| frame.Events==null|| frame.Objects==null) continue;
var newFrame = new MFA.Loaders.Frame(null);
newFrame.Chunks = new ChunkList(null);//MFA.MFA.emptyFrameChunks;
newFrame.Handle = game.Frames.IndexOf(frame);
newFrame.Handle = indexHandles[a];
Message($"Translating frame: {frame.Name} - {newFrame.Handle}" );
newFrame.Name = frame.Name;
newFrame.SizeX = frame.Width;
newFrame.SizeY = frame.Height;
// var newRectLoader = newFrame.Chunks.GetChunk<FrameVirtualRect>();
// newRectLoader.Right = frame.Width;
// newRectLoader.Bottom = frame.Height;
newFrame.Background = frame.Background;
newFrame.FadeIn = null;
newFrame.FadeOut = null;
var mfaFlags = newFrame.Flags;
var originalFlags = frame.Flags;
mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"];
mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"];
mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"];
@ -147,21 +154,17 @@ namespace CTFAK.MMFParser.Translation
for (int i=0;i<count;i++)
{
var layer = frame.Layers[i];
var newLayer = new MFA.Loaders.Layer(null);
var newLayer = new Layer(null);
newLayer.Name = layer.Name;
newLayer.Flags["HideAtStart"] = layer.Flags["ToHide"];
newLayer.Flags["Visible"] = true;
newLayer.Flags["NoBackground"] = layer.Flags["DoNotSaveBackground"];
newLayer.Flags["WrapHorizontally"] = layer.Flags["WrapHorizontally"];
newLayer.Flags["WrapVertically"] = layer.Flags["WrapVertically"];
// newLayer.Flags.flag = 0;
newLayer.XCoefficient = layer.XCoeff;
newLayer.YCoefficient = layer.YCoeff;
newLayer.RGBCoeff = Color.FromArgb(255,0,0,255);
newFrame.Layers.Add(newLayer);
// break;
//
}
@ -191,8 +194,6 @@ namespace CTFAK.MMFParser.Translation
newInstance.ParentHandle = (uint) instance.ParentHandle;
newInstance.Layer = (uint) (instance.Layer);
newInstances.Add(newInstance);
// Logger.Log($"{instance.FrameItem.Name} - {i}");
}
}
}
@ -211,15 +212,13 @@ namespace CTFAK.MMFParser.Translation
}
// if (frame.Events != null)
if (frame.Events != null)
{
newFrame.Events = new Events((ByteReader) null); //MFA.MFA.emptyEvents;
newFrame.Events = new Events((ByteReader) null);
newFrame.Events.Items = new List<EventGroup>();
newFrame.Events.Objects = new List<EventObject>();
newFrame.Events._cache = MFA.MFA.emptyEvents._cache;
newFrame.Events._ifMFA = true;
newFrame.Events.Version = 1028;
// if (frame.Name == "jopajopaher")
{
foreach (var item in newFrame.Items)
{
@ -235,43 +234,7 @@ namespace CTFAK.MMFParser.Translation
newObject.InstanceHandle = 0xFFFFFFFF;
newFrame.Events.Objects.Add(newObject);
}
foreach (EventGroup item in frame.Events.Items)
{
/*foreach (Action itemAction in item.Actions)
{
for (int a=0;a<itemAction.Items.Count;a++)
{
if (itemAction.Items[a].Loader is ExpressionParameter exp)
{
// itemAction.Items.Remove(itemAction.Items[a]);
}
else if (itemAction.Items[a].Loader is Sample)
{
itemAction.Items.Remove(itemAction.Items[a]);
}
}
}
foreach (Condition itemAction in item.Conditions)
{
for (int a=0;a<itemAction.Items.Count;a++)
{
if (itemAction.Items[a].Loader is ExpressionParameter exp)
{
// itemAction.Items.Remove(itemAction.Items[a]);
}
else if (itemAction.Items[a].Loader is Sample)
{
itemAction.Items.Remove(itemAction.Items[a]);
}
}
}*/
newFrame.Events.Items.Add(item);
}
newFrame.Events.Items = frame.Events.Items;
}
}
mfa.Frames.Add(newFrame);
@ -586,6 +549,17 @@ namespace CTFAK.MMFParser.Translation
newCount.Maximum = itemLoader.Counter.Maximum;
newCount.Minimum = itemLoader.Counter.Minimum;
newCount.Images = new List<int>() {0};
var shape = counter?.Shape;
if (counter != null)
{
if(counter.DisplayType==2||counter.DisplayType==3)
{
counter = null;
shape = null;
}
}
if (counter == null)
{
newCount.DisplayType = 0;
@ -596,6 +570,7 @@ namespace CTFAK.MMFParser.Translation
}
else
{
newCount.DisplayType = counter.DisplayType;
newCount.CountType = counter.Inverse ? 1 : 0;
newCount.Width = (int) counter.Width;
@ -604,10 +579,21 @@ namespace CTFAK.MMFParser.Translation
newCount.Font = counter.Font;
}
newCount.Color1 = Color.White;
newCount.Color2 = Color.White;
newCount.Flags = 0;
if (shape == null)
{
newCount.Color1=Color.Black;
newCount.Color2=Color.Black;
newCount.VerticalGradient = 0;
newCount.Flags = 0;
}
else
{
newCount.Color1 = Color.Green;
newCount.Color2 = Color.Red;
newCount.VerticalGradient = (uint) shape.GradFlags;
newCount.Flags = (uint) shape.FillType;
}
newItem.Loader = newCount;
}

@ -38,7 +38,7 @@ namespace CTFAK
public static string DumperVersion = true ? "CTFAK 0.3.5 Alpha" : "CTFAK 0.2.1-a Debug";
public static string DumperVersion = true ? "CTFAK 0.5 BETA" : "CTFAK 0.2.1-a Debug";
}
public class LoadableSettings

@ -24,7 +24,7 @@ namespace CTFAK.Utils
}
var v5 = 0;
foreach (char c in groupWords)
foreach (char c in pass)
{
v4 += WrapSingleChar(groupWords[v5] + (c & 0xC3)) ^ 0xF3;
v5++;

Loading…
Cancel
Save