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 objNode = new ChunkNode($"{(Constants.ObjectType) frameItem.ObjectType} - {frameItem.Name}",
frameItem);
foreach (ChunkList.Chunk chunk in frameItem.Chunks)
{
objNode.Nodes.Add(new ChunkNode(chunk.Name, chunk));
}
newNode.Nodes.Add(objNode);
}
}
@ -314,12 +318,6 @@ namespace CTFAK.GUI
musicsButton.Visible = true;
GameInfo.Visible = true;
loadingLabel.Visible = false;
InitPackDataTab();
InitImages();
InitSounds();
InitKeyTab();
InitPlugins();
var toLog = "";
toLog += $"{Properties.Locale.ChunkNames.title}: {Exe.Instance.GameData.Name}\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.frameCount}: {Exe.Instance.GameData.Frames.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)
Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().OnImageSaved += UpdateImageBar;
if (Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>() != null)
@ -341,7 +346,7 @@ namespace CTFAK.GUI
Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>().OnMusicSaved += UpdateMusicBar;
GameInfo.Text = toLog;
Loaded = true;
}

@ -52,6 +52,7 @@ namespace CTFAK.MMFParser.EXE
chunk.Verbose = Verbose;
chunk.Read(reader);
chunk.Loader = LoadOld(chunk);
Chunks.Add(chunk);
if (reader.Tell() >= reader.Size()) break;
if (chunk.Id == 32639) break; //LAST chunkID
}
@ -93,13 +94,8 @@ namespace CTFAK.MMFParser.EXE
Flag = (ChunkFlags) exeReader.ReadInt16();
Size = exeReader.ReadInt32();
if((Id!=26214&&Id!=26216)) //To prevent RAM from commiting suicide
{
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);
// if(Settings.Old) Logger.Log("Reading old chunk"+(Constants.ChunkNames)Id);
switch (Flag)
{
@ -113,8 +109,11 @@ namespace CTFAK.MMFParser.EXE
if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize);
else
{
Int32 decompSize = exeReader.ReadInt32();
ChunkData = Decompressor.decompressOld(exeReader, Size, decompSize);
var start = exeReader.Tell();
var decompSize = exeReader.ReadInt32();
var buff = exeReader.ReadBytes(Size);
ChunkData = Decompressor.decompressOld(buff, Size, decompSize);
exeReader.Seek(start+Size);
}
break;
case ChunkFlags.NotCompressed:
@ -312,9 +311,50 @@ namespace CTFAK.MMFParser.EXE
ChunkLoader loader = null;
switch (chunk.Id)
{
case 8739:
loader = new AppHeader(chunk);
case 8740:
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;
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();
return loader;

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

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

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

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

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

@ -258,7 +258,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{
var num = cond.Num;
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;
}

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

@ -33,7 +33,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
var item = new ObjectInfo(Reader);
item.Read();
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);
}
GameData.TestItems = this;

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

@ -36,6 +36,15 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
}
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();
ObstacleType = (Obstacle) Reader.ReadInt16();
@ -46,6 +55,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
}
}
public override void Print(bool ext)
{
throw new System.NotImplementedException();

@ -21,7 +21,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public Animations Animations;
private BitDict preferences = new BitDict(new string[]
public BitDict Preferences = new BitDict(new string[]
{
"Backsave",
"ScrollingIndependant",
@ -103,6 +103,34 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
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 size = Reader.ReadInt32();
@ -139,7 +167,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
_valuesOffset = Reader.ReadUInt16();
_stringsOffset = Reader.ReadUInt16();
NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16();
Preferences.flag = Reader.ReadUInt16();
Identifier = Reader.ReadInt32();
BackColor = Reader.ReadColor();
_fadeinOffset = Reader.ReadUInt32();
@ -201,6 +229,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Counter.Read();
}
}
// Logger.Log("anims: "+_animationsOffset);
// Logger.Log("fadeIn: "+_fadeinOffset);
// Logger.Log("fadeOut: "+_fadeoutOffset);

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

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

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using CTFAK.MMFParser.EXE;
using CTFAK.Utils;
@ -108,8 +109,15 @@ namespace CTFAK.MMFParser.MFA.Loaders
case 33:
Loader = new FrameVirtualRect(dataReader);
break;
case 56:
Loader=new GlobalObject(dataReader);
break;
case 72:
Loader = new Opacity(dataReader);
break;
default:
Loader = null;
// Logger.Log($"{Id} - {Data.GetHex()}");
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 int Left;
@ -147,9 +175,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
public int Right;
public int Bottom;
public FrameVirtualRect(ByteReader reader) : base(reader){}
public override void Read()
{
Left = Reader.ReadInt32();
@ -165,7 +190,28 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteInt32(Top);
Writer.WriteInt32(Right);
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.Log = true;
// 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;

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

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

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

@ -46,10 +46,14 @@ namespace CTFAK.MMFParser.Translation
//mfa.Stamp = wtf;
//if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds.Items.Clear();
if (game.Sounds != null)
{
foreach (var item in game.Sounds.Items)
{
mfa.Sounds.Items.Add(item);
}
}
// mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images;
@ -320,7 +324,9 @@ namespace CTFAK.MMFParser.Translation
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
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.Chunks = new ChunkList(null);
@ -360,6 +366,7 @@ namespace CTFAK.MMFParser.Translation
var newObject = new ObjectLoader(null);
newObject.ObjectFlags = (int) (itemLoader.Flags.flag);
newObject.NewObjectFlags = (int) (itemLoader.NewFlags.flag);
newObject.BackgroundColor = itemLoader.BackColor;
//newLoader.Qualifiers;
newObject.Strings = ConvertStrings(itemLoader.Strings);
@ -523,7 +530,7 @@ namespace CTFAK.MMFParser.Translation
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 lives = new Lives(null);

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

@ -46,7 +46,8 @@ namespace CTFAK.Utils
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()

@ -1,7 +1,10 @@
using System;
using System.Drawing;
using System.IO;
using System.IO.Compression;
using System.Runtime.InteropServices;
using Joveler.Compression.ZLib;
using zlib;
using DeflateStream = System.IO.Compression.DeflateStream;
using GZipStream = Joveler.Compression.ZLib.GZipStream;
@ -9,6 +12,8 @@ namespace CTFAK.Utils
{
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)
{
Int32 decompSize = exeReader.ReadInt32();
@ -40,17 +45,18 @@ namespace CTFAK.Utils
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();
MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size));
MemoryStream decompressedStream = new MemoryStream();
var originalBuff = Marshal.AllocHGlobal(size);
Marshal.Copy(buff,0,originalBuff,buff.Length);
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;
}
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)
{
int pad = bytes - ((width * pointSize) % bytes);

Loading…
Cancel
Save