Imagebank hotfix

master
1987kostya 4 years ago
parent 6796997420
commit 228dc1083e

@ -609,7 +609,7 @@ namespace CTFAK.GUI
public void InitImages() public void InitImages()
{ {
if (Settings.twofiveplus) return; if (Settings.GameType == GameType.TwoFivePlus) return;
var bank = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>(); var bank = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>();
var items = bank.Images.ToList(); var items = bank.Images.ToList();
var filtered = items.OrderBy(x => x.Value.Handle); var filtered = items.OrderBy(x => x.Value.Handle);

@ -19,7 +19,7 @@ namespace CTFAK.MMFParser.EXE
public void Read(ByteReader reader) public void Read(ByteReader reader)
{ {
Chunks.Clear(); Chunks.Clear();
if (!Settings.Old) if (Settings.GameType == GameType.Normal)
{ {
while (true) while (true)
{ {
@ -28,7 +28,7 @@ namespace CTFAK.MMFParser.EXE
chunk.Read(reader); chunk.Read(reader);
if (chunk.Id == 26214) if (chunk.Id == 26214)
{ {
if(!Settings.twofiveplus) chunk.Loader = LoadModern(chunk); if(Settings.GameType != GameType.TwoFivePlus) chunk.Loader = LoadModern(chunk);
} }
else else
{ {
@ -37,14 +37,14 @@ namespace CTFAK.MMFParser.EXE
Chunks.Add(chunk); Chunks.Add(chunk);
if (chunk.Id == 8750) chunk.BuildKey(); if (chunk.Id == 8750) chunk.BuildKey();
if (chunk.Id == 8788) Settings.twofiveplus = true; if (chunk.Id == 8788) Settings.GameType = GameType.TwoFivePlus;
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
} }
} }
else else if(Settings.GameType == GameType.OnePointFive)
{ {
while (true) while (true)
{ {
@ -106,15 +106,14 @@ namespace CTFAK.MMFParser.EXE
ChunkData = Decryption.DecodeMode3(exeReader.ReadBytes(Size), Size,Id,out DecompressedSize); ChunkData = Decryption.DecodeMode3(exeReader.ReadBytes(Size), Size,Id,out DecompressedSize);
break; break;
case ChunkFlags.Compressed: case ChunkFlags.Compressed:
if (!Settings.Old) ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize); if (Settings.GameType == GameType.OnePointFive)
else
{ {
var start = exeReader.Tell(); var start = exeReader.Tell();
var decompSize = exeReader.ReadInt32(); ChunkData = Decompressor.DecompressOld(exeReader);
var buff = exeReader.ReadBytes(Size);
ChunkData = Decompressor.decompressOld(buff, Size, decompSize);
exeReader.Seek(start+Size); exeReader.Seek(start+Size);
} }
else ChunkData = Decompressor.Decompress(exeReader, out DecompressedSize);
break; break;
case ChunkFlags.NotCompressed: case ChunkFlags.NotCompressed:
ChunkData = exeReader.ReadBytes(Size); ChunkData = exeReader.ReadBytes(Size);

@ -62,13 +62,16 @@ namespace CTFAK.MMFParser.EXE
exeReader.Seek(possition); exeReader.Seek(possition);
var firstShort = exeReader.PeekUInt16(); var firstShort = exeReader.PeekUInt16();
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)
else if (firstShort == 0x222c) Settings.Old = true; {
else Settings.GameType = GameType.Normal;
}
else if (firstShort == 0x222c)
{ {
Logger.Log(firstShort.ToString("x8")); Settings.GameType = GameType.OnePointFive;
} }
if (!Settings.Old)
if (Settings.GameType == GameType.Normal)
{ {
PackData = new PackData(); PackData = new PackData();
Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue); Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue);

@ -61,7 +61,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
{ {
if (!Settings.Old) Size = Reader.ReadInt32(); if (Settings.GameType != GameType.OnePointFive) Size = Reader.ReadInt32();
Flags.flag=(uint) Reader.ReadInt16(); Flags.flag=(uint) Reader.ReadInt16();
NewFlags.flag = (uint) Reader.ReadInt16(); NewFlags.flag = (uint) Reader.ReadInt16();

@ -146,8 +146,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) if (!Debug)
{ {
if (Settings.Build>291) Handle -= 1; if (Settings.Build>=289) 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;
} }
Position = (int) Reader.Tell(); Position = (int) Reader.Tell();
@ -160,8 +160,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) if (!Debug)
{ {
if (Settings.Build>291) Handle -= 1; if (Settings.Build>=289) Handle -= 1;
if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1; // if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
} }
Position = (int) Reader.Tell(); Position = (int) Reader.Tell();
@ -182,12 +182,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
_bitmap = null; _bitmap = null;
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
if (!Settings.twofiveplus) if (Settings.GameType != GameType.TwoFivePlus)
{ {
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
var decompSize = Reader.ReadInt32(); var decompSize = Reader.ReadInt32();
imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); imageReader =new ByteReader(Decompressor.DecompressOldBlock(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize));
} }
else else
{ {
@ -199,8 +199,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
//return; //return;
if (Settings.twofiveplus) imageReader.Skip(4); if (Settings.GameType == GameType.TwoFivePlus) imageReader.Skip(4);
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
_checksum = imageReader.ReadInt16(); _checksum = imageReader.ReadInt16();
} }
@ -220,12 +220,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
_bitmap = null; _bitmap = null;
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
if (!Settings.twofiveplus) if (Settings.GameType != GameType.TwoFivePlus)
{ {
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
var decompSize = Reader.ReadInt32(); var decompSize = Reader.ReadInt32();
imageReader =new ByteReader(Decompressor.decompressOld(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize)); imageReader =new ByteReader(Decompressor.DecompressOldBlock(Reader.ReadBytes((int) Reader.Size()), (int) Reader.Size(), decompSize));
} }
else else
{ {
@ -237,8 +237,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
//return; //return;
if (Settings.twofiveplus) imageReader.Skip(4); if (Settings.GameType == GameType.TwoFivePlus) imageReader.Skip(4);
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
_checksum = imageReader.ReadInt16(); _checksum = imageReader.ReadInt16();
} }
@ -257,20 +257,20 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Flags.flag = imageReader.ReadByte(); Flags.flag = imageReader.ReadByte();
if(!Settings.Old)imageReader.Skip(2); if(Settings.GameType != GameType.OnePointFive)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();
if(!Settings.Old)_transparent = imageReader.ReadColor(); if(Settings.GameType != GameType.OnePointFive)_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.GameType == GameType.TwoFivePlus) Flags["LZX"] = false;
if (Flags["LZX"]) if (Flags["LZX"])
{ {
uint decompressedSize = imageReader.ReadUInt32(); uint decompressedSize = imageReader.ReadUInt32();
imageData = Decompressor.decompress_block(imageReader, (int) (imageReader.Size() - imageReader.Tell()), imageData = Decompressor.DecompressBlock(imageReader, (int) (imageReader.Size() - imageReader.Tell()),
(int) decompressedSize); (int) decompressedSize);
} }
else else
@ -336,7 +336,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
} }
} }
} }
if (!Settings.Old) if (Settings.GameType != GameType.OnePointFive)
{ {
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
{ {
@ -363,7 +363,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
try try
{ {
if(Settings.twofiveplus) Logger.Log("Trying to save image"); if(Settings.GameType == GameType.TwoFivePlus) Logger.Log("Trying to save image");
Bitmap.Save(filename); Bitmap.Save(filename);
} }
catch catch

@ -134,14 +134,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
if (IsCompressed) if (IsCompressed)
{ {
var size = Reader.ReadInt32(); var size = Reader.ReadInt32();
soundData = new ByteReader(Decompressor.decompress_block(Reader, size, decompressedSize)); soundData = new ByteReader(Decompressor.DecompressBlock(Reader, size, decompressedSize));
} }
else else
{ {
soundData = new ByteReader(Reader.ReadBytes(decompressedSize)); soundData = new ByteReader(Reader.ReadBytes(decompressedSize));
} }
Name = soundData.ReadWideString(nameLenght); Name = soundData.ReadWideString(nameLenght);
Logger.Log(Name);
Data = soundData.ReadBytes((int) soundData.Size()); Data = soundData.ReadBytes((int) soundData.Size());
if (Settings.DumpSounds) if (Settings.DumpSounds)

@ -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;
} }

@ -23,7 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Name = Reader.ReadWideString(); Name = Reader.ReadWideString();
Password = Reader.ReadInt32(); Password = Reader.ReadInt32();
Password = Checksum.MakeGroupChecksum("pass", Name); Password = Checksum.MakeGroupChecksum("pass", Name);
Logger.Log("Password: "+Password);
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)

@ -171,7 +171,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
public override void Read() public override void Read()
{ {
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
Width = Reader.ReadInt16(); Width = Reader.ReadInt16();
Height = Reader.ReadInt16(); Height = Reader.ReadInt16();
@ -255,7 +255,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
Handle = (ushort) Reader.ReadInt16(); Handle = (ushort) Reader.ReadInt16();
ObjectInfo = (ushort) Reader.ReadInt16(); ObjectInfo = (ushort) Reader.ReadInt16();
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
X = Reader.ReadInt16(); X = Reader.ReadInt16();
Y = Reader.ReadUInt16(); Y = Reader.ReadUInt16();

@ -38,7 +38,6 @@ 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);
} }
@ -47,6 +46,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
public ObjectProperties Properties => _properties; public ObjectProperties Properties => _properties;
public Constants.ObjectType ObjectType => (Constants.ObjectType) _header.ObjectType; public Constants.ObjectType ObjectType => (Constants.ObjectType) _header.ObjectType;
public int Flags => (int) _header.Flags; public int Flags => (int) _header.Flags;
public int Reserved => (int) _header.Reserved;
public int InkEffect => (int) _header.InkEffect; public int InkEffect => (int) _header.InkEffect;
public int InkEffectValue => (int) _header.InkEffectParameter; public int InkEffectValue => (int) _header.InkEffectParameter;
public bool Transparent => ByteFlag.GetFlag((uint) InkEffect, 28); public bool Transparent => ByteFlag.GetFlag((uint) InkEffect, 28);
@ -145,6 +145,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
public UInt32 Flags; public UInt32 Flags;
public UInt32 InkEffect; public UInt32 InkEffect;
public UInt32 InkEffectParameter; public UInt32 InkEffectParameter;
public short Reserved;
public ObjectHeader(ByteReader reader) : base(reader){} public ObjectHeader(ByteReader reader) : base(reader){}
public ObjectHeader(Chunk chunk) : base(chunk){} public ObjectHeader(Chunk chunk) : base(chunk){}
@ -156,7 +157,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
Handle = Reader.ReadInt16(); Handle = Reader.ReadInt16();
ObjectType = Reader.ReadInt16(); ObjectType = Reader.ReadInt16();
Flags = Reader.ReadUInt16(); Flags = Reader.ReadUInt16();
Int16 reserved = Reader.ReadInt16(); Reserved = Reader.ReadInt16();
InkEffect = Reader.ReadByte(); InkEffect = Reader.ReadByte();
InkEffectParameter = Reader.ReadByte(); InkEffectParameter = Reader.ReadByte();
} }

@ -6,10 +6,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
{ {
class ObjectNames : ChunkLoader//2.5+ trash class ObjectNames : ChunkLoader//2.5+ trash
{ {
public override void Print(bool ext) public override void Print(bool ext){}
{
}
public override string[] GetReadableData() public override string[] GetReadableData()
{ {

@ -37,7 +37,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public override void Read() public override void Read()
{ {
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
Size = Reader.ReadInt32(); Size = Reader.ReadInt32();
ObstacleType = (Obstacle) Reader.ReadInt16(); ObstacleType = (Obstacle) Reader.ReadInt16();
@ -150,7 +150,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
// else if(FillType==3) // else if(FillType==3)
// { // {
Image = Reader.ReadInt16(); Image = Reader.ReadInt16();
Logger.Log("QuickbackdropIMG: "+Image);
// } // }
} }

@ -170,7 +170,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Logger.Log("Writing mouse mov");
Writer.WriteInt16(X1); Writer.WriteInt16(X1);
Writer.WriteInt16(X2); Writer.WriteInt16(X2);
Writer.WriteInt16(Y1); Writer.WriteInt16(Y1);

@ -88,6 +88,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
private ushort _zeroUnk; private ushort _zeroUnk;
public Text Text; public Text Text;
public Counter Counter; public Counter Counter;
public short[] _qualifiers=new short[8];
public ObjectCommon(ByteReader reader) : base(reader) public ObjectCommon(ByteReader reader) : base(reader)
@ -104,7 +105,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public override void Read() public override void Read()
{ {
if (Settings.Old) if (Settings.GameType == GameType.OnePointFive)
{ {
var currentPosition = Reader.Tell(); var currentPosition = Reader.Tell();
var size = Reader.ReadInt16(); var size = Reader.ReadInt16();
@ -152,14 +153,12 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
_extensionOffset = Reader.ReadUInt16(); _extensionOffset = Reader.ReadUInt16();
_counterOffset = Reader.ReadUInt16(); _counterOffset = Reader.ReadUInt16();
Flags.flag = Reader.ReadUInt16(); Flags.flag = Reader.ReadUInt16();
Reader.Skip(2);
var end = Reader.Tell()+(8+1)*2; var end = Reader.Tell()+(8+1)*2;
List<Int16> qualifiers = new List<Int16>(); for (int i = 0; i < 8; i++)
while(true)
{ {
// break;
var value = Reader.ReadInt16(); var value = Reader.ReadInt16();
if(value!=-1) qualifiers.Add(value); _qualifiers[i]=value;
else break;
} }
Reader.Seek(end); Reader.Seek(end);
_systemObjectOffset = Reader.ReadUInt16(); _systemObjectOffset = Reader.ReadUInt16();

@ -23,7 +23,6 @@ namespace CTFAK.MMFParser.EXE.Loaders
public override void Read() public override void Read()
{ {
Logger.Log("dumpingIcon");
Reader.ReadBytes(Reader.ReadInt32() - 4); Reader.ReadBytes(Reader.ReadInt32() - 4);
List<byte> colorIndexes = new List<byte>(); List<byte> colorIndexes = new List<byte>();
for (int i = 0; i < 16 * 16; i++) for (int i = 0; i < 16 * 16; i++)

@ -26,8 +26,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); Logger.Log("SUPERHEADER: "+uheader);
if(uheader=="PAMU")Settings.Unicode = true; if (uheader == "PAMU")
else if(uheader=="PAME")Settings.Unicode = false; {
Settings.GameType = GameType.Normal;
Settings.Unicode = true;
}
else if(uheader=="PAME")
{
Settings.GameType = GameType.MMFTwo;
Settings.Unicode = false;
}
exeReader.Seek(start + 16); exeReader.Seek(start + 16);
uint formatVersion = exeReader.ReadUInt32(); uint formatVersion = exeReader.ReadUInt32();

@ -104,7 +104,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
var size = Reader.ReadInt32(); var size = Reader.ReadInt32();
Data = Reader.ReadBytes(size); Data = Reader.ReadBytes(size);
var dataReader = new ByteReader(Data); var dataReader = new ByteReader(Data);
switch (Id) /*switch (Id)
{ {
case 33: case 33:
Loader = new FrameVirtualRect(dataReader); Loader = new FrameVirtualRect(dataReader);
@ -120,7 +120,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
// Logger.Log($"{Id} - {Data.GetHex()}"); // Logger.Log($"{Id} - {Data.GetHex()}");
break; break;
} }*/
Loader?.Read(); Loader?.Read();
@ -163,7 +163,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Value = 255;
Writer.WriteInt32(Value); Writer.WriteInt32(Value);
} }
} }

@ -17,6 +17,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
public const string TimeListData = "EvEd"; public const string TimeListData = "EvEd";
public const string EditorPositionData = "EvTs"; public const string EditorPositionData = "EvTs";
public const string EditorLineData = "EvLs"; public const string EditorLineData = "EvLs";
public const string UnknownEventData = "E2Ts";
public const string EventEnd ="!DNE"; public const string EventEnd ="!DNE";
public List<EventGroup> Items; public List<EventGroup> Items;
public ushort Version; public ushort Version;
@ -172,13 +173,17 @@ namespace CTFAK.MMFParser.MFA.Loaders
EventLine = Reader.ReadUInt32(); EventLine = Reader.ReadUInt32();
EventLineY = Reader.ReadUInt32(); EventLineY = Reader.ReadUInt32();
} }
else if (name == UnknownEventData)
{
Reader.Skip(12);
}
else if (name == EventEnd) else if (name == EventEnd)
{ {
// _cache = Reader.ReadBytes(122); // _cache = Reader.ReadBytes(122);
break; break;
} }
else throw new NotImplementedException("Fuck Something is Broken"); else Logger.Log("UnknownGroup: "+name);//throw new NotImplementedException("Fuck Something is Broken: "+name);
} }
} }
@ -269,6 +274,11 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteUInt32(EventLine); Writer.WriteUInt32(EventLine);
Writer.WriteUInt32(EventLineY); Writer.WriteUInt32(EventLineY);
} }
Writer.WriteAscii(UnknownEventData);
Writer.WriteInt8(8);
Writer.Skip(9);
Writer.WriteInt16(0);
Writer.WriteAscii(EventEditorData); Writer.WriteAscii(EventEditorData);
// Writer.Skip(4+2*2+4*3); // Writer.Skip(4+2*2+4*3);
Writer.WriteInt32(EditorDataUnk); Writer.WriteInt32(EditorDataUnk);

@ -1,5 +1,7 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE;
using CTFAK.Utils; using CTFAK.Utils;
@ -10,7 +12,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public int ObjectFlags; public int ObjectFlags;
public int NewObjectFlags; public int NewObjectFlags;
public Color BackgroundColor; public Color BackgroundColor;
List<short> _qualifiers = new List<short>(); public short[] Qualifiers = new short[8];
public ValueList Values; public ValueList Values;
public ValueList Strings; public ValueList Strings;
public Movements Movements; public Movements Movements;
@ -18,15 +20,16 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
// if(Qualifiers==null) throw new NullReferenceException("QUALIFIERS NULL");
Writer.WriteInt32((int) ObjectFlags); Writer.WriteInt32((int) ObjectFlags);
Writer.WriteInt32(NewObjectFlags); Writer.WriteInt32(NewObjectFlags);
Writer.WriteColor(BackgroundColor); Writer.WriteColor(BackgroundColor);
for (int i = 0; i < 9; i++) for (int i = 0; i < 8; i++)
{ {
Writer.WriteInt16(-1); Writer.WriteInt16(Qualifiers[i]);
} }
Writer.WriteInt16(-1);
Values.Write(Writer); Values.Write(Writer);
Strings.Write(Writer); Strings.Write(Writer);
Movements.Write(Writer); Movements.Write(Writer);
@ -72,7 +75,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
{ {
break; break;
} }
_qualifiers.Add(value); Qualifiers[i]=value;
} }
Reader.Seek(end); Reader.Seek(end);

@ -89,6 +89,7 @@ namespace CTFAK.MMFParser.Translation
mfa.BuildType = 0; mfa.BuildType = 0;
mfa.BuildPath = game.TargetFilename; mfa.BuildPath = game.TargetFilename;
mfa.CommandLine = ""; mfa.CommandLine = "";
mfa.FrameRate = 60;
mfa.Aboutbox = game.AboutText?.Length > 0 mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText ? game?.AboutText
: ""; : "";
@ -325,10 +326,9 @@ namespace CTFAK.MMFParser.Translation
newItem.InkEffectParameter = item.InkEffectValue; newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0; newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = 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 = MFA.MFA.defaultObjChunks;
if (item.ObjectType == 0) if (item.ObjectType == 0)
{ {
@ -361,14 +361,16 @@ namespace CTFAK.MMFParser.Translation
{ {
var itemLoader = (ObjectCommon) item?.Properties?.Loader; var itemLoader = (ObjectCommon) item?.Properties?.Loader;
if (itemLoader == null) throw new NotImplementedException("Null loader"); if (itemLoader == null) throw new NotImplementedException("Null loader");
Logger.Log("Translating Object: " + itemLoader.Parent.Name); Logger.Log(("Translating Object: " + itemLoader.Parent.Name),false,ConsoleColor.Blue,false);
//CommonSection //CommonSection
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;
newObject.Qualifiers = itemLoader._qualifiers;
newObject.Strings = ConvertStrings(itemLoader.Strings); newObject.Strings = ConvertStrings(itemLoader.Strings);
newObject.Values = ConvertValue(itemLoader.Values); newObject.Values = ConvertValue(itemLoader.Values);
newObject.Movements = new MFA.Loaders.mfachunks.Movements(null); newObject.Movements = new MFA.Loaders.mfachunks.Movements(null);
@ -401,6 +403,7 @@ namespace CTFAK.MMFParser.Translation
active.Values = newObject.Values; active.Values = newObject.Values;
active.Movements = newObject.Movements; active.Movements = newObject.Movements;
active.Behaviours = newObject.Behaviours; active.Behaviours = newObject.Behaviours;
active.Qualifiers = newObject.Qualifiers;
} }
@ -463,6 +466,8 @@ namespace CTFAK.MMFParser.Translation
newExt.Values = newObject.Values; newExt.Values = newObject.Values;
newExt.Movements = newObject.Movements; newExt.Movements = newObject.Movements;
newExt.Behaviours = newObject.Behaviours; newExt.Behaviours = newObject.Behaviours;
newExt.Qualifiers = newObject.Qualifiers;
} }
var exts = Program.CleanData.GameChunks.GetChunk<Extensions>(); var exts = Program.CleanData.GameChunks.GetChunk<Extensions>();
Extension ext = null; Extension ext = null;
@ -499,6 +504,8 @@ namespace CTFAK.MMFParser.Translation
newText.Values = newObject.Values; newText.Values = newObject.Values;
newText.Movements = newObject.Movements; newText.Movements = newObject.Movements;
newText.Behaviours = newObject.Behaviours; newText.Behaviours = newObject.Behaviours;
newText.Qualifiers = newObject.Qualifiers;
} }
if (text == null) if (text == null)
{ {
@ -542,6 +549,8 @@ namespace CTFAK.MMFParser.Translation
lives.Values = newObject.Values; lives.Values = newObject.Values;
lives.Movements = newObject.Movements; lives.Movements = newObject.Movements;
lives.Behaviours = newObject.Behaviours; lives.Behaviours = newObject.Behaviours;
lives.Qualifiers = newObject.Qualifiers;
} }
lives.Player = counter?.Player ?? 0; lives.Player = counter?.Player ?? 0;
lives.Images = counter?.Frames ?? new List<int>() {0}; lives.Images = counter?.Frames ?? new List<int>() {0};
@ -565,6 +574,8 @@ namespace CTFAK.MMFParser.Translation
newCount.Values = newObject.Values; newCount.Values = newObject.Values;
newCount.Movements = newObject.Movements; newCount.Movements = newObject.Movements;
newCount.Behaviours = newObject.Behaviours; newCount.Behaviours = newObject.Behaviours;
newCount.Qualifiers = newObject.Qualifiers;
} }
if (itemLoader.Counter == null) if (itemLoader.Counter == null)
{ {

@ -100,7 +100,6 @@ namespace CTFAK
public static void ReadFile(string path, bool verbose = false, bool dumpImages = false, bool dumpSounds = true) public static void ReadFile(string path, bool verbose = false, bool dumpImages = false, bool dumpSounds = true)
{ {
Settings.GamePath = path; Settings.GamePath = path;
Logger.Log("DecryptionLibExist: "+File.Exists("x64\\Decrypter-x64.dll"));
PrepareFolders(); PrepareFolders();
Settings.DumpImages = dumpImages; Settings.DumpImages = dumpImages;

@ -14,8 +14,7 @@ namespace CTFAK
public static bool DumpMusic; public static bool DumpMusic;
public static bool SaveChunks; public static bool SaveChunks;
public static bool Verbose; public static bool Verbose;
public static bool Old; public static GameType GameType;
public static bool twofiveplus = false;
public static string GamePath; public static string GamePath;
public static string GameName => Path.GetFileNameWithoutExtension(GamePath); public static string GameName => Path.GetFileNameWithoutExtension(GamePath);
@ -135,4 +134,13 @@ namespace CTFAK
} }
public enum GameType
{
Normal,
TwoFivePlus,
OnePointFive,
MMFTwo,
Android
}
} }

@ -30,7 +30,6 @@ namespace CTFAK.Utils
v5+=1; v5+=1;
if (v5 > groupWords.Length) v5 = 0; if (v5 > groupWords.Length) v5 = 0;
} }
Logger.Log("GroupPass:"+v4);
return v4; return v4;
} }

@ -13,13 +13,13 @@ namespace CTFAK.Utils
public static class Decompressor public static class Decompressor
{ {
[DllImport("TinflateDecompress.dll")] [DllImport("TinflateDecompress.dll")]
public static extern int decompress(IntPtr source, int source_size, IntPtr output, int output_size); public static extern int decompressOld(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();
Int32 compSize = exeReader.ReadInt32(); Int32 compSize = exeReader.ReadInt32();
decompressed = decompSize; decompressed = decompSize;
return decompress_block(exeReader, compSize, decompSize); return DecompressBlock(exeReader, compSize, decompSize);
} }
public static ByteReader DecompressAsReader(ByteReader exeReader, out int decompressed) public static ByteReader DecompressAsReader(ByteReader exeReader, out int decompressed)
@ -28,7 +28,7 @@ namespace CTFAK.Utils
return new ByteReader(Decompress(exeReader, out decompressed)); return new ByteReader(Decompress(exeReader, out decompressed));
} }
public static byte[] decompress_block(ByteReader reader, int size, int decompSize) public static byte[] DecompressBlock(ByteReader reader, int size, int decompSize)
{ {
ZLibDecompressOptions decompOpts = new ZLibDecompressOptions(); ZLibDecompressOptions decompOpts = new ZLibDecompressOptions();
MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size)); MemoryStream compressedStream = new MemoryStream(reader.ReadBytes(size));
@ -45,12 +45,22 @@ namespace CTFAK.Utils
return decompressedData; return decompressedData;
} }
public static byte[] decompressOld(byte[] buff,int size,int decompSize) public static byte[] DecompressOld(ByteReader reader)
{
var start = reader.Tell();
var decompressedSize = reader.ReadInt32();
var compressedSize = reader.Size();
var buffer = reader.ReadBytes((int) compressedSize);
return DecompressOldBlock(buffer, (int) compressedSize, decompressedSize);
}
public static byte[] DecompressOldBlock(byte[] buff,int size,int decompSize)
{ {
var originalBuff = Marshal.AllocHGlobal(size); var originalBuff = Marshal.AllocHGlobal(size);
Marshal.Copy(buff,0,originalBuff,buff.Length); Marshal.Copy(buff,0,originalBuff,buff.Length);
var outputBuff = Marshal.AllocHGlobal(decompSize); var outputBuff = Marshal.AllocHGlobal(decompSize);
decompress(originalBuff, size, outputBuff, decompSize); decompressOld(originalBuff, size, outputBuff, decompSize);
Marshal.FreeHGlobal(originalBuff); Marshal.FreeHGlobal(originalBuff);
byte[] data = new byte[decompSize]; byte[] data = new byte[decompSize];
Marshal.Copy(outputBuff,data,0,decompSize); Marshal.Copy(outputBuff,data,0,decompSize);

@ -62,7 +62,7 @@ namespace CTFAK.Utils
{ {
uint compressedSize = data.ReadUInt32(); uint compressedSize = data.ReadUInt32();
decompressed = (int) decompressedSize; decompressed = (int) decompressedSize;
return Decompressor.decompress_block(data, (int) compressedSize, (int) decompressedSize); return Decompressor.DecompressBlock(data, (int) compressedSize, (int) decompressedSize);
} }
} }

Loading…
Cancel
Save