MMF1.5 Partial Support

master
1987kostya 4 years ago
parent 64d996f791
commit 6796997420

@ -304,6 +304,10 @@ namespace CTFAK.GUI
var frameItem = items.ItemDict[key]; var frameItem = items.ItemDict[key];
var objNode = new ChunkNode($"{(Constants.ObjectType) frameItem.ObjectType} - {frameItem.Name}", var objNode = new ChunkNode($"{(Constants.ObjectType) frameItem.ObjectType} - {frameItem.Name}",
frameItem); frameItem);
foreach (ChunkList.Chunk chunk in frameItem.Chunks)
{
objNode.Nodes.Add(new ChunkNode(chunk.Name, chunk));
}
newNode.Nodes.Add(objNode); newNode.Nodes.Add(objNode);
} }
} }
@ -314,12 +318,6 @@ namespace CTFAK.GUI
musicsButton.Visible = true; musicsButton.Visible = true;
GameInfo.Visible = true; GameInfo.Visible = true;
loadingLabel.Visible = false; loadingLabel.Visible = false;
InitPackDataTab();
InitImages();
InitSounds();
InitKeyTab();
InitPlugins();
var toLog = ""; var toLog = "";
toLog += $"{Properties.Locale.ChunkNames.title}: {Exe.Instance.GameData.Name}\n"; toLog += $"{Properties.Locale.ChunkNames.title}: {Exe.Instance.GameData.Name}\n";
toLog += $"{Properties.Locale.ChunkNames.copyright}: {Exe.Instance.GameData.Copyright}\n"; toLog += $"{Properties.Locale.ChunkNames.copyright}: {Exe.Instance.GameData.Copyright}\n";
@ -333,6 +331,13 @@ namespace CTFAK.GUI
toLog += $"{Properties.GlobalStrings.frameitemCount}: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n"; toLog += $"{Properties.GlobalStrings.frameitemCount}: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n";
toLog += $"{Properties.GlobalStrings.frameCount}: {Exe.Instance.GameData.Frames.Count}\n"; toLog += $"{Properties.GlobalStrings.frameCount}: {Exe.Instance.GameData.Frames.Count}\n";
toLog += $"Chunks Count: {Exe.Instance.GameData.GameChunks.Chunks.Count}\n"; toLog += $"Chunks Count: {Exe.Instance.GameData.GameChunks.Chunks.Count}\n";
GameInfo.Text = toLog;
InitPackDataTab();
InitImages();
InitSounds();
InitKeyTab();
InitPlugins();
if (Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>() != null) if (Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>() != null)
Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().OnImageSaved += UpdateImageBar; Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().OnImageSaved += UpdateImageBar;
if (Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>() != null) if (Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>() != null)
@ -341,7 +346,7 @@ namespace CTFAK.GUI
Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>().OnMusicSaved += UpdateMusicBar; Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>().OnMusicSaved += UpdateMusicBar;
GameInfo.Text = toLog;
Loaded = true; Loaded = true;
} }

@ -52,6 +52,7 @@ namespace CTFAK.MMFParser.EXE
chunk.Verbose = Verbose; chunk.Verbose = Verbose;
chunk.Read(reader); chunk.Read(reader);
chunk.Loader = LoadOld(chunk); chunk.Loader = LoadOld(chunk);
Chunks.Add(chunk);
if (reader.Tell() >= reader.Size()) break; if (reader.Tell() >= reader.Size()) break;
if (chunk.Id == 32639) break; //LAST chunkID if (chunk.Id == 32639) break; //LAST chunkID
} }
@ -93,13 +94,8 @@ namespace CTFAK.MMFParser.EXE
Flag = (ChunkFlags) exeReader.ReadInt16(); Flag = (ChunkFlags) exeReader.ReadInt16();
Size = exeReader.ReadInt32(); Size = exeReader.ReadInt32();
if((Id!=26214&&Id!=26216)) //To prevent RAM from commiting suicide
{ // if(Settings.Old) Logger.Log("Reading old chunk"+(Constants.ChunkNames)Id);
RawData = exeReader.ReadBytes(Size);
exeReader.BaseStream.Position -= Size;
//Saving raw data cuz why not
}
if(Settings.Old) Logger.Log("Reading old chunk"+(Constants.ChunkNames)Id);
switch (Flag) switch (Flag)
{ {
@ -113,8 +109,11 @@ namespace CTFAK.MMFParser.EXE
if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize); if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize);
else else
{ {
Int32 decompSize = exeReader.ReadInt32(); var start = exeReader.Tell();
ChunkData = Decompressor.decompressOld(exeReader, Size, decompSize); var decompSize = exeReader.ReadInt32();
var buff = exeReader.ReadBytes(Size);
ChunkData = Decompressor.decompressOld(buff, Size, decompSize);
exeReader.Seek(start+Size);
} }
break; break;
case ChunkFlags.NotCompressed: case ChunkFlags.NotCompressed:
@ -312,9 +311,50 @@ namespace CTFAK.MMFParser.EXE
ChunkLoader loader = null; ChunkLoader loader = null;
switch (chunk.Id) switch (chunk.Id)
{ {
case 8739: case 8740:
loader = new AppHeader(chunk); loader = new AppName(chunk);
break;
case 8741:
loader = new AppAuthor(chunk);
break;
case 8745:
loader = new FrameItems(chunk);
break;
case 17477:
loader = new ObjectName(chunk);
break;
case 17476:
loader = new ObjectHeader(chunk);
break; break;
case 17478:
loader = new ObjectProperties(chunk);
return loader;
case 13107:
loader = new Frame(chunk);
break;
case 8750:
loader = new EditorFilename(chunk);
break;
case 8751:
loader = new TargetFilename(chunk);
break;
case 13109:
loader = new FrameName(chunk);
break;
case 13108:
loader = new FrameHeader(chunk);
break;
case 13112:
loader = new ObjectInstances(chunk);
break;
case 26214:
// loader = new ImageBank(chunk);
break;
case 26216:
// loader = new SoundBank(chunk);
break;
} }
loader?.Read(); loader?.Read();
return loader; return loader;

@ -64,6 +64,10 @@ namespace CTFAK.MMFParser.EXE
Logger.Log("First Short: " + firstShort.ToString("X2"), true, ConsoleColor.Yellow); Logger.Log("First Short: " + firstShort.ToString("X2"), true, ConsoleColor.Yellow);
if (firstShort == 0x7777) Settings.Old = false; if (firstShort == 0x7777) Settings.Old = false;
else if (firstShort == 0x222c) Settings.Old = true; else if (firstShort == 0x222c) Settings.Old = true;
else
{
Logger.Log(firstShort.ToString("x8"));
}
if (!Settings.Old) if (!Settings.Old)
{ {
PackData = new PackData(); PackData = new PackData();

@ -51,7 +51,7 @@ namespace CTFAK.MMFParser.EXE
public void Read(ByteReader exeReader) public void Read(ByteReader exeReader)
{ {
string magic = exeReader.ReadAscii(4); //Reading header string magic = exeReader.ReadAscii(4); //Reading header
Logger.Log("MAGIC HEADER: "+magic);
//Checking for header //Checking for header
if (magic == Constants.UnicodeGameHeader) Constants.IsUnicode = true;//PAMU if (magic == Constants.UnicodeGameHeader) Constants.IsUnicode = true;//PAMU
else if (magic == Constants.GameHeader) Constants.IsUnicode = false;//PAME else if (magic == Constants.GameHeader) Constants.IsUnicode = false;//PAME

@ -59,30 +59,30 @@ namespace CTFAK.MMFParser.EXE.Loaders
public override void Read() public override void Read()
{ {
Size = Reader.ReadInt32();
{
if (!Settings.Old) Size = Reader.ReadInt32();
Flags.flag=(uint) Reader.ReadInt16(); Flags.flag=(uint) Reader.ReadInt16();
NewFlags.flag = (uint) Reader.ReadInt16(); NewFlags.flag = (uint) Reader.ReadInt16();
var graphicsMode = Reader.ReadInt16(); var graphicsMode = Reader.ReadInt16();
var otherflags = Reader.ReadInt16(); var otherflags = Reader.ReadInt16();
//TODO: Add OtherFlags
WindowWidth = Reader.ReadInt16(); WindowWidth = Reader.ReadInt16();
WindowHeight = Reader.ReadInt16(); WindowHeight = Reader.ReadInt16();
InitialScore = (int) (Reader.ReadUInt32() ^ 0xffffffff); InitialScore = (int) (Reader.ReadUInt32() ^ 0xffffffff);
InitialLives = (int) (Reader.ReadUInt32() ^ 0xffffffff); InitialLives = (int) (Reader.ReadUInt32() ^ 0xffffffff);
// var controls = new Controls(Reader);
var controls = new Controls(Reader); // controls.Read();
controls.Read();
BorderColor = Reader.ReadColor(); BorderColor = Reader.ReadColor();
NumberOfFrames = Reader.ReadInt32(); NumberOfFrames = Reader.ReadInt32();
FrameRate = Reader.ReadInt32(); FrameRate = Reader.ReadInt32();
var windowsMenuIndex = Reader.ReadSByte(); var windowsMenuIndex = Reader.ReadSByte();
} }
}
public override void Print(bool ext) public override void Print(bool ext)
{ {
Logger.Log($"ScreenRes: {WindowWidth}x{WindowHeight}", true, ConsoleColor.DarkMagenta); Logger.Log($"ScreenRes: {WindowWidth}x{WindowHeight}", true, ConsoleColor.DarkMagenta);

@ -183,39 +183,31 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
if (!Settings.twofiveplus) if (!Settings.twofiveplus)
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
else imageReader = Reader;
long start = imageReader.Tell();
if (Settings.twofiveplus)
{ {
var unk = imageReader.ReadBytes(4); if (Settings.Old)
if (unk.GetHex(4) != "FF FF FF FF ")
{ {
Logger.Log(Reader.Tell().ToString()); var decompSize = Reader.ReadInt32();
Size = (int) BitConverter.ToUInt32(unk,0); imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize));
_references = imageReader.ReadInt32();
_checksum = (int) imageReader.ReadUInt32();
} }
else else
{ {
Size = (int) imageReader.ReadInt32(); imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
_references = imageReader.ReadInt32(); }
_checksum = (int) imageReader.ReadUInt32();
} }
else imageReader = Reader;
long start = imageReader.Tell();
Logger.Log("Size: "+Size);
Logger.Log("References: "+_references);
Logger.Log("Checksum: "+_checksum);
} //return;
else if (Settings.twofiveplus) imageReader.Skip(4);
if (Settings.Old)
{ {
_checksum = imageReader.ReadInt32(); _checksum = imageReader.ReadInt16();
}
else _checksum = imageReader.ReadInt32();
_references = imageReader.ReadInt32(); _references = imageReader.ReadInt32();
Size = (int) imageReader.ReadUInt32(); Size = (int) imageReader.ReadUInt32();
}
imageReader.Seek(start+ _checksum);//to prevent bugs imageReader.Seek(start+ _checksum);//to prevent bugs
@ -229,14 +221,29 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
if (!Settings.twofiveplus) if (!Settings.twofiveplus)
{
if (Settings.Old)
{
var decompSize = Reader.ReadInt32();
imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize));
}
else
{
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a); imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
}
}
else imageReader = Reader; else imageReader = Reader;
long start = imageReader.Tell(); long start = imageReader.Tell();
//return; //return;
if (Settings.twofiveplus) imageReader.Skip(4); if (Settings.twofiveplus) imageReader.Skip(4);
_checksum = imageReader.ReadInt32(); if (Settings.Old)
{
_checksum = imageReader.ReadInt16();
}
else _checksum = imageReader.ReadInt32();
_references = imageReader.ReadInt32(); _references = imageReader.ReadInt32();
Size = (int) imageReader.ReadUInt32(); Size = (int) imageReader.ReadUInt32();
if (Debug) if (Debug)
@ -250,12 +257,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Flags.flag = imageReader.ReadByte(); Flags.flag = imageReader.ReadByte();
imageReader.Skip(2); if(!Settings.Old)imageReader.Skip(2);
XHotspot = imageReader.ReadInt16(); XHotspot = imageReader.ReadInt16();
YHotspot = imageReader.ReadInt16(); YHotspot = imageReader.ReadInt16();
ActionX = imageReader.ReadInt16(); ActionX = imageReader.ReadInt16();
ActionY = imageReader.ReadInt16(); ActionY = imageReader.ReadInt16();
_transparent = imageReader.ReadColor(); if(!Settings.Old)_transparent = imageReader.ReadColor();
// 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;
@ -277,7 +284,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
if (Flags["RLE"] || Flags["RLEW"] || Flags["RLET"]) if (Flags["RLE"] || Flags["RLEW"] || Flags["RLET"])
{ {
Reader.Seek(start+Size);
return;
} }
else else
{ {
@ -307,7 +315,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
} }
default: default:
{ {
Logger.Log("Unknown Color Mode"); Logger.Log("Unknown Color Mode: " + _graphicMode);
break; break;
} }
@ -328,6 +336,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
} }
} }
} }
if (!Settings.Old)
{
if (Settings.Build > 283) // No idea, but this is not working with old games if (Settings.Build > 283) // No idea, but this is not working with old games
{ {
if (_transparent != null) if (_transparent != null)
@ -342,7 +352,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
} }
} }
} }
}
// Logger.Log("ImageSize: "+_colorArray.Length);
// Save($@"DUMP\\{Handle}-test.png");
return; return;
} }

@ -112,11 +112,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public class SoundItem : SoundBase public class SoundItem : SoundBase
{ {
public bool Compressed;
public int Checksum; public int Checksum;
public int References; public int References;
public int Flags; public int Flags;
public bool IsCompressed = true; public bool IsCompressed = false;
public override void Read() public override void Read()

@ -258,7 +258,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{ {
var num = cond.Num; var num = cond.Num;
if (num == -42) num = -27; if (num == -42) num = -27;
if (Settings.Build >= 290) // if (Settings.Build >= 290)
{ {
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; 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;
} }

@ -61,7 +61,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
public override void Print(bool ext) public override void Print(bool ext)
{ {
Logger.Log($"Frame: {_name}", true, ConsoleColor.Green); Logger.Log($"Frame: {Name}", true, ConsoleColor.Green);
Logger.Log($" Password: {Password}", true, ConsoleColor.Green); Logger.Log($" Password: {Password}", true, ConsoleColor.Green);
Logger.Log($" Size: {Width}x{Height}", true, ConsoleColor.Green); Logger.Log($" Size: {Width}x{Height}", true, ConsoleColor.Green);
Logger.Log($" Objects: {_objects.CountOfObjects}", true, ConsoleColor.Green); Logger.Log($" Objects: {_objects.CountOfObjects}", true, ConsoleColor.Green);
@ -95,10 +95,11 @@ namespace CTFAK.MMFParser.EXE.Loaders
_password = Chunks.GetChunk<FramePassword>(); _password = Chunks.GetChunk<FramePassword>();
_palette = Chunks.GetChunk<FramePalette>(); _palette = Chunks.GetChunk<FramePalette>();
_layers = Chunks.GetChunk<Layers>(); _layers = Chunks.GetChunk<Layers>();
//layerEffects
_objects = Chunks.GetChunk<ObjectInstances>(); _objects = Chunks.GetChunk<ObjectInstances>();
_events = Chunks.GetChunk<Events.Events>(); _events = Chunks.GetChunk<Events.Events>();
_movementTimer = Chunks.GetChunk<MovementTimerBase>(); _movementTimer = Chunks.GetChunk<MovementTimerBase>();
//frameEffects
_fadeIn = Chunks.PopChunk<Transition>(); _fadeIn = Chunks.PopChunk<Transition>();
_fadeOut = Chunks.PopChunk<Transition>(); _fadeOut = Chunks.PopChunk<Transition>();
@ -113,7 +114,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
public int VirtHeight => _virtualSize.Bottom; public int VirtHeight => _virtualSize.Bottom;
public int MovementTimer => _movementTimer.Value; public int MovementTimer => _movementTimer.Value;
public string Name => _name?.Value ?? "UNK"; 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;
public List<Color> Palette => _palette?.Items ?? new Color[256].ToList(); public List<Color> Palette => _palette?.Items ?? new Color[256].ToList();
@ -169,11 +170,22 @@ namespace CTFAK.MMFParser.EXE.Loaders
} }
public override void Read() public override void Read()
{
if (Settings.Old)
{
Width = Reader.ReadInt16();
Height = Reader.ReadInt16();
Background = Reader.ReadColor();
Flags.flag = (uint) Reader.ReadInt16();
}
else
{ {
Width = Reader.ReadInt32(); Width = Reader.ReadInt32();
Height = Reader.ReadInt32(); Height = Reader.ReadInt32();
Background = Reader.ReadColor(); Background = Reader.ReadColor();
Flags.flag = Reader.ReadUInt32(); Flags.flag = Reader.ReadUInt32();
}
@ -229,7 +241,6 @@ namespace CTFAK.MMFParser.EXE.Loaders
public int Y; public int Y;
public short ParentType; public short ParentType;
public short Layer; public short Layer;
public string Name;
public short ParentHandle; public short ParentHandle;
public ObjectInstance(ByteReader reader) : base(reader) public ObjectInstance(ByteReader reader) : base(reader)
@ -244,16 +255,25 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
Handle = (ushort) Reader.ReadInt16(); Handle = (ushort) Reader.ReadInt16();
ObjectInfo = (ushort) Reader.ReadInt16(); ObjectInfo = (ushort) Reader.ReadInt16();
if (Settings.Old)
{
X = Reader.ReadInt16();
Y = Reader.ReadUInt16();
ParentType = Reader.ReadInt16();
ParentHandle = Reader.ReadInt16();
}
else
{
X = Reader.ReadInt32(); X = Reader.ReadInt32();
Y = Reader.ReadInt32(); Y = Reader.ReadInt32();
ParentType = Reader.ReadInt16(); ParentType = Reader.ReadInt16();
ParentHandle = Reader.ReadInt16(); ParentHandle = Reader.ReadInt16();
Layer = Reader.ReadInt16(); Layer = Reader.ReadInt16();
var reserved = Reader.ReadInt16(); var reserved = Reader.ReadInt16();
}
//------------------------- //-------------------------
if (FrameItem != null) Name = FrameItem.Name;
else Name = $"UNKNOWN-{Handle}";
} }
@ -266,6 +286,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
} }
} }
public string Name => FrameItem.Name;
public override void Print(bool ext) public override void Print(bool ext)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

@ -33,7 +33,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
var item = new ObjectInfo(Reader); var item = new ObjectInfo(Reader);
item.Read(); item.Read();
ItemDict.Add(item.Handle, item); ItemDict.Add(item.Handle, item);
Names.Add(item.Name); // Names.Add(item.Name);
// Logger.Log($"Found FrameItem: '{item.Name}' with handle ({item.Handle})", true, ConsoleColor.Magenta); // Logger.Log($"Found FrameItem: '{item.Name}' with handle ({item.Handle})", true, ConsoleColor.Magenta);
} }
GameData.TestItems = this; GameData.TestItems = this;

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using CTFAK.MMFParser.EXE.Loaders.Banks; using CTFAK.MMFParser.EXE.Loaders.Banks;
using CTFAK.MMFParser.EXE.Loaders.Objects; using CTFAK.MMFParser.EXE.Loaders.Objects;
using CTFAK.Utils; using CTFAK.Utils;
@ -37,6 +38,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
_header = infoChunks.GetChunk<ObjectHeader>(); _header = infoChunks.GetChunk<ObjectHeader>();
_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);
} }
@ -153,8 +155,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
Handle = Reader.ReadInt16(); Handle = Reader.ReadInt16();
ObjectType = Reader.ReadInt16(); ObjectType = Reader.ReadInt16();
Int16 reserved = Reader.ReadInt16();
Flags = Reader.ReadUInt16(); Flags = Reader.ReadUInt16();
Int16 reserved = Reader.ReadInt16();
InkEffect = Reader.ReadByte(); InkEffect = Reader.ReadByte();
InkEffectParameter = Reader.ReadByte(); InkEffectParameter = Reader.ReadByte();
} }

@ -36,6 +36,15 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
} }
public override void Read() public override void Read()
{
if (Settings.Old)
{
Size = Reader.ReadInt32();
ObstacleType = (Obstacle) Reader.ReadInt16();
CollisionType = (Collision) Reader.ReadInt16();
Image = Reader.ReadInt16();
}
else
{ {
Size = Reader.ReadInt32(); Size = Reader.ReadInt32();
ObstacleType = (Obstacle) Reader.ReadInt16(); ObstacleType = (Obstacle) Reader.ReadInt16();
@ -46,6 +55,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
} }
}
public override void Print(bool ext) public override void Print(bool ext)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();

@ -21,7 +21,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public Animations Animations; public Animations Animations;
private BitDict preferences = new BitDict(new string[] public BitDict Preferences = new BitDict(new string[]
{ {
"Backsave", "Backsave",
"ScrollingIndependant", "ScrollingIndependant",
@ -103,6 +103,34 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public override void Read() public override void Read()
{
if (Settings.Old)
{
var currentPosition = Reader.Tell();
var size = Reader.ReadInt16();
var checksum = Reader.ReadInt16();
_movementsOffset = (ushort) Reader.ReadInt16();
_animationsOffset = (ushort) Reader.ReadInt16();
var version = Reader.ReadInt16();
_counterOffset = (ushort) Reader.ReadInt16();
_systemObjectOffset = (ushort) Reader.ReadInt16();
var ocVariable = Reader.ReadInt32();
Flags.flag = (uint) Reader.ReadInt16();
var end = Reader.Tell() + 8 * 2;//maybe its 9*2
Reader.Seek(end);
_extensionOffset = (ushort) Reader.ReadInt16();
_valuesOffset = (ushort) Reader.ReadInt16();
NewFlags.flag = (uint) Reader.ReadInt16();
Preferences.flag = (uint) Reader.ReadInt16();
Identifier = Reader.ReadInt16();
BackColor = Reader.ReadColor();
_fadeinOffset = (uint) Reader.ReadInt32();
_fadeoutOffset = (uint) Reader.ReadInt32();
}
else
{ {
var currentPosition = Reader.Tell(); var currentPosition = Reader.Tell();
var size = Reader.ReadInt32(); var size = Reader.ReadInt32();
@ -139,7 +167,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
_valuesOffset = Reader.ReadUInt16(); _valuesOffset = Reader.ReadUInt16();
_stringsOffset = Reader.ReadUInt16(); _stringsOffset = Reader.ReadUInt16();
NewFlags.flag = Reader.ReadUInt16(); NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16(); Preferences.flag = Reader.ReadUInt16();
Identifier = Reader.ReadInt32(); Identifier = Reader.ReadInt32();
BackColor = Reader.ReadColor(); BackColor = Reader.ReadColor();
_fadeinOffset = Reader.ReadUInt32(); _fadeinOffset = Reader.ReadUInt32();
@ -201,6 +229,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Counter.Read(); Counter.Read();
} }
}
// Logger.Log("anims: "+_animationsOffset); // Logger.Log("anims: "+_animationsOffset);
// Logger.Log("fadeIn: "+_fadeinOffset); // Logger.Log("fadeIn: "+_fadeinOffset);
// Logger.Log("fadeOut: "+_fadeoutOffset); // Logger.Log("fadeOut: "+_fadeoutOffset);

@ -13,6 +13,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
Reader = new ByteReader(Chunk.ChunkData); Reader = new ByteReader(Chunk.ChunkData);
Value = Reader.ReadUniversal(); Value = Reader.ReadUniversal();
// Print(false);
} }
public override void Print(bool ext) public override void Print(bool ext)

@ -25,13 +25,16 @@ namespace CTFAK.MMFParser.EXE
exeReader.Seek((int)(start + dataSize - 32)); exeReader.Seek((int)(start + dataSize - 32));
var uheader = exeReader.ReadAscii(4); var uheader = exeReader.ReadAscii(4);
Logger.Log("SUPERHEADER: "+uheader);
if(uheader=="PAMU")Settings.Unicode = true; if(uheader=="PAMU")Settings.Unicode = true;
else if(uheader=="PAME")Settings.Unicode = false; else if(uheader=="PAME")Settings.Unicode = false;
exeReader.Seek(start + 16); exeReader.Seek(start + 16);
uint formatVersion = exeReader.ReadUInt32(); uint formatVersion = exeReader.ReadUInt32();
Debug.Assert(exeReader.ReadInt32()==0); var check = exeReader.ReadInt32();
Debug.Assert(exeReader.ReadInt32()==0); Debug.Assert(check==0);
check = exeReader.ReadInt32();
Debug.Assert(check==0);
uint count = exeReader.ReadUInt32(); uint count = exeReader.ReadUInt32();

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles; using System.Windows.Forms.VisualStyles;
using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE;
using CTFAK.Utils; using CTFAK.Utils;
@ -108,8 +109,15 @@ namespace CTFAK.MMFParser.MFA.Loaders
case 33: case 33:
Loader = new FrameVirtualRect(dataReader); Loader = new FrameVirtualRect(dataReader);
break; break;
case 56:
Loader=new GlobalObject(dataReader);
break;
case 72:
Loader = new Opacity(dataReader);
break;
default: default:
Loader = null; Loader = null;
// Logger.Log($"{Id} - {Data.GetHex()}");
break; break;
} }
@ -140,6 +148,26 @@ namespace CTFAK.MMFParser.MFA.Loaders
} }
} }
public class Opacity : MFAChunkLoader
{
public int Value;
public Opacity(ByteReader dataReader) : base(dataReader){}
public override void Read()
{
Value = Reader.ReadInt32();
}
public override void Write(ByteWriter Writer)
{
Value = 255;
Writer.WriteInt32(Value);
}
}
public class FrameVirtualRect:MFAChunkLoader public class FrameVirtualRect:MFAChunkLoader
{ {
public int Left; public int Left;
@ -147,9 +175,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
public int Right; public int Right;
public int Bottom; public int Bottom;
public FrameVirtualRect(ByteReader reader) : base(reader){} public FrameVirtualRect(ByteReader reader) : base(reader){}
public override void Read() public override void Read()
{ {
Left = Reader.ReadInt32(); Left = Reader.ReadInt32();
@ -165,7 +190,28 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteInt32(Top); Writer.WriteInt32(Top);
Writer.WriteInt32(Right); Writer.WriteInt32(Right);
Writer.WriteInt32(Bottom); Writer.WriteInt32(Bottom);
}
}
public class GlobalObject:MFAChunkLoader
{
public byte[] Value;
public GlobalObject(ByteReader reader) : base(reader)
{
}
public override void Read()
{
Value = Reader.ReadBytes(12);
for(int i=0;i<Value.Length;i++)
{
Value[i] = 0;
}
}
public override void Write(ByteWriter Writer)
{
Writer.WriteBytes(Value);
} }
} }

@ -202,7 +202,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
Chunks = new ChunkList(Reader); Chunks = new ChunkList(Reader);
Chunks.Log = true; // 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;

@ -18,7 +18,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteInt32(ObjectFlags); Writer.WriteInt32((int) ObjectFlags);
Writer.WriteInt32(NewObjectFlags); Writer.WriteInt32(NewObjectFlags);
Writer.WriteColor(BackgroundColor); Writer.WriteColor(BackgroundColor);

@ -29,6 +29,7 @@ namespace CTFAK.MMFParser.OLD.Loaders
controls.Read(); controls.Read();
var borderColor = Reader.ReadColor(); var borderColor = Reader.ReadColor();
var frameCount = Reader.ReadInt32(); var frameCount = Reader.ReadInt32();
Logger.Log(frameCount);
} }
public override void Print(bool ext) public override void Print(bool ext)

@ -51,11 +51,15 @@ namespace CTFAK.MMFParser.OLD.Loaders
} }
public override void Read() public override void Read()
{
for (int i = 0; i < 4; i++)
{ {
Keys = new Keys(Reader); Keys = new Keys(Reader);
Keys.Read(); Keys.Read();
} }
}
public override void Print(bool ext) public override void Print(bool ext)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();

@ -46,10 +46,14 @@ namespace CTFAK.MMFParser.Translation
//mfa.Stamp = wtf; //mfa.Stamp = wtf;
//if (game.Fonts != null) mfa.Fonts = game.Fonts; //if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds.Items.Clear(); mfa.Sounds.Items.Clear();
if (game.Sounds != null)
{
foreach (var item in game.Sounds.Items) foreach (var item in game.Sounds.Items)
{ {
mfa.Sounds.Items.Add(item); mfa.Sounds.Items.Add(item);
} }
}
// mfa.Music = game.Music; // mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images; mfa.Images.Items = game.Images.Images;
@ -320,7 +324,9 @@ namespace CTFAK.MMFParser.Translation
newItem.InkEffect = item.InkEffect; newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue; newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0; newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = (int) item.Flags; newItem.Flags = item.Flags;
// if(item.Flags!=0)Logger.Log($"{item.Name}-{item.Flags}");
newItem.IconHandle = 12; newItem.IconHandle = 12;
newItem.Chunks = new ChunkList(null); newItem.Chunks = new ChunkList(null);
@ -360,6 +366,7 @@ namespace CTFAK.MMFParser.Translation
var newObject = new ObjectLoader(null); var newObject = new ObjectLoader(null);
newObject.ObjectFlags = (int) (itemLoader.Flags.flag); newObject.ObjectFlags = (int) (itemLoader.Flags.flag);
newObject.NewObjectFlags = (int) (itemLoader.NewFlags.flag); newObject.NewObjectFlags = (int) (itemLoader.NewFlags.flag);
newObject.BackgroundColor = itemLoader.BackColor; newObject.BackgroundColor = itemLoader.BackColor;
//newLoader.Qualifiers; //newLoader.Qualifiers;
newObject.Strings = ConvertStrings(itemLoader.Strings); newObject.Strings = ConvertStrings(itemLoader.Strings);
@ -523,7 +530,7 @@ namespace CTFAK.MMFParser.Translation
newItem.Loader = newText; newItem.Loader = newText;
} }
else if (item.ObjectType == Constants.ObjectType.Lives) else if (item.ObjectType == Constants.ObjectType.Lives|| item.ObjectType==Constants.ObjectType.Score)
{ {
var counter = itemLoader.Counters; var counter = itemLoader.Counters;
var lives = new Lives(null); var lives = new Lives(null);

@ -37,6 +37,7 @@ namespace CTFAK
// MFAGenerator.WriteTestMFA(); // MFAGenerator.WriteTestMFA();
// MFAGenerator.ReadTestMFA(); // MFAGenerator.ReadTestMFA();
// Environment.Exit(0); // Environment.Exit(0);
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{ {
@ -105,7 +106,7 @@ namespace CTFAK
Settings.DumpImages = dumpImages; Settings.DumpImages = dumpImages;
Settings.DumpSounds = dumpSounds; Settings.DumpSounds = dumpSounds;
Settings.Verbose = verbose; Settings.Verbose = verbose;
if (path.EndsWith(".exe")) if (path.ToLower().EndsWith(".exe"))
{ {
var exeReader = new ByteReader(path, FileMode.Open); var exeReader = new ByteReader(path, FileMode.Open);

@ -46,7 +46,8 @@ namespace CTFAK.Utils
public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary) public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{ {
return string.Join(";", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray()); // return string.Join(";", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray());
return string.Join("\n", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray());
} }
public override string ToString() public override string ToString()

@ -1,7 +1,10 @@
using System; using System;
using System.Drawing;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Runtime.InteropServices;
using Joveler.Compression.ZLib; using Joveler.Compression.ZLib;
using zlib;
using DeflateStream = System.IO.Compression.DeflateStream; using DeflateStream = System.IO.Compression.DeflateStream;
using GZipStream = Joveler.Compression.ZLib.GZipStream; using GZipStream = Joveler.Compression.ZLib.GZipStream;
@ -9,6 +12,8 @@ namespace CTFAK.Utils
{ {
public static class Decompressor public static class Decompressor
{ {
[DllImport("TinflateDecompress.dll")]
public static extern int decompress(IntPtr source, int source_size, IntPtr output, int output_size);
public static byte[] Decompress(ByteReader exeReader, out int decompressed) public static byte[] Decompress(ByteReader exeReader, out int decompressed)
{ {
Int32 decompSize = exeReader.ReadInt32(); Int32 decompSize = exeReader.ReadInt32();
@ -40,17 +45,18 @@ namespace CTFAK.Utils
return decompressedData; return decompressedData;
} }
public static byte[] decompressOld(ByteReader reader, int size, int decompSize) public static byte[] decompressOld(byte[] buff,int size,int decompSize)
{ {
ZLibDecompressOptions decompOpts = new ZLibDecompressOptions(); var originalBuff = Marshal.AllocHGlobal(size);
MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size)); Marshal.Copy(buff,0,originalBuff,buff.Length);
MemoryStream decompressedStream = new MemoryStream(); var outputBuff = Marshal.AllocHGlobal(decompSize);
decompress(originalBuff, size, outputBuff, decompSize);
Marshal.FreeHGlobal(originalBuff);
byte[] data = new byte[decompSize];
Marshal.Copy(outputBuff,data,0,decompSize);
Marshal.FreeHGlobal(outputBuff);
return data;
byte[] decompressedData = decompressedStream.GetBuffer();
// Trimming array to decompSize,
// because ZlibStream always pads to 0x100
Array.Resize<byte>(ref decompressedData, decompSize);
return decompressedData;
} }

@ -134,6 +134,77 @@ namespace CTFAK.Utils
return alpha; return alpha;
} }
public static (byte[], int) ReadRLE(byte[] data, int width, int height, int pointSize)
{
var pad = GetPadding(width, pointSize);
var currentPosition = 0;
var i = 0;
var pos = 0;
var points= new byte[width * height * 4];
while (true)
{
var command = data[currentPosition];
currentPosition += 1;
if (command == 0) break;
if (command > 128)
{
command -= 128;
for (int j = 0; j < command; j++)
{
if ((pos & (width + pad)) < width)
{
{
UInt16 newShort = (ushort) (data[currentPosition] | data[currentPosition + 1] << 8);
byte r = (byte) ((newShort & 31744) >> 10);
byte g = (byte) ((newShort & 992) >> 5);
byte b = (byte) ((newShort & 31));
r = (byte) (r << 3);
g = (byte) (g << 3);
b = (byte) (b << 3);
points[i] = r;
points[i + 1] = g;
points[i + 2] = b;
points[i + 3] = 255;
}
i += 1;
}
pos += 1;
currentPosition += 2;
}
}
else
{
if((pos)%(width+pad)<width)
{
UInt16 newShort = (ushort) (data[currentPosition] | data[currentPosition + 1] << 8);
byte r = (byte) ((newShort & 31744) >> 10);
byte g = (byte) ((newShort & 992) >> 5);
byte b = (byte) ((newShort & 31));
r = (byte) (r << 3);
g = (byte) (g << 3);
b = (byte) (b << 3);
points[i] = r;
points[i + 1] = g;
points[i + 2] = b;
points[i + 3] = 255;
i += 1;
}
pos += 1;
}
currentPosition += 2;
}
return (points, currentPosition);
}
public static int GetPadding(int width, int pointSize, int bytes = 2) public static int GetPadding(int width, int pointSize, int bytes = 2)
{ {
int pad = bytes - ((width * pointSize) % bytes); int pad = bytes - ((width * pointSize) % bytes);

Loading…
Cancel
Save