Transition support(cctrans.dll only)

master
1987kostya 4 years ago
parent e33eb070b6
commit 702edad4ad

@ -41,7 +41,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
"SamplesWhenNotFocused",
"NoMinimizeBox",
"NoMaximizeBox",
"NoThiccFrame",
"NoThickFrame",
"DoNotCenterFrame",
"ScreensaverAutostop",
"DisableClose",

@ -18,6 +18,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems;
public bool PreloadOnly = false;
public static bool Load = true;
public ImageBank(ByteReader reader) : base(reader)
{
@ -87,15 +88,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
{
if (MainForm.BreakImages) break;
{
var item = new ImageItem(Reader);
item.Read(!PreloadOnly);
tempImages.Add(item.Handle, item);
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i, (int) NumberOfItems);
}
}
@ -146,8 +143,8 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32();
if (!Debug)
{
// if (Settings.Build>=287) Handle -= 1;
if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
if (Settings.Build>=284) Handle -= 1;
// if (Program.CleanData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
}
Position = (int) Reader.Tell();
@ -157,11 +154,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
}
public override void Read()
{
// if (Settings.Build>=284) Handle -= 1;
Handle = Reader.ReadInt32();
if (!Debug)
{
// if (Settings.Build>=287) Handle -= 1;
if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
if (Settings.Build>=284) Handle -= 1;
// if (Exe.Instance.GameData.ProductVersion != Constants.Products.MMF15&&Settings.Build>=284) Handle -= 1;
}
Position = (int) Reader.Tell();
@ -281,10 +280,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
int bytesRead = 0;
rawImg = imageData;
if(!ImageBank.Load)return;
// Reader.Seek((_width*3)*_height+(ImageHelper.GetPadding(_width,3)*3*_height));
if (Flags["RLE"] || Flags["RLEW"] || Flags["RLET"])
{
Reader.Seek(start+Size);
// Reader.Seek(start+Size);
return;
}
else

@ -141,15 +141,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
soundData = new ByteReader(Reader.ReadBytes(decompressedSize));
}
Name = soundData.ReadWideString(nameLenght);
Name = Name.Replace(" ", "");
Data = soundData.ReadBytes((int) soundData.Size());
if (Settings.DumpSounds)
{
Name = Helper.CleanInput(Name);
File.WriteAllBytes($"{Settings.SoundPath}\\{Name}.wav", Data);
}
}

@ -10,6 +10,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public ushort Id;
public string Name;
public int Password;
private short _unk;
public Group(ByteReader reader) : base(reader)
{
@ -21,8 +22,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Flags = Reader.ReadUInt16();
Id = Reader.ReadUInt16();
Name = Reader.ReadWideString();
Reader.Skip(178);
Password = Reader.ReadInt32();
Password = Checksum.MakeGroupChecksum("pass", Name);
_unk = Reader.ReadInt16();
}
public override void Write(ByteWriter Writer)
@ -30,7 +32,10 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Writer.WriteUInt16(Flags);
Writer.WriteUInt16(Id);
Writer.WriteUnicode(Name,true);
Writer.Skip(178);
Writer.WriteInt32(Password);
Writer.WriteInt16(_unk);
}
public override string ToString()

@ -20,6 +20,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
Writer.WriteInt16((short) Handle);
Writer.WriteUInt16((ushort) Flags);
Name = Name.Replace(" ", "");
Writer.WriteUnicode(Name);
Writer.Skip(120);
Writer.WriteInt16(0);

@ -119,6 +119,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
public List<ObjectInstance> Objects => _objects?.Items ?? null;
public List<Color> Palette => _palette?.Items ?? new Color[256].ToList();
public Events.Events Events => _events;
public Transition FadeIn => _fadeIn;
public Transition FadeOut => _fadeOut;
public List<Layer> Layers => _layers?.Items ?? null;

@ -39,18 +39,20 @@ namespace CTFAK.MMFParser.EXE.Loaders
_name = infoChunks.GetChunk<ObjectName>();
_properties = infoChunks.GetChunk<ObjectProperties>();
_properties.ReadNew((int) ObjectType,this);
Logger.Log($"{Name}: {InkEffect}-{InkEffectValue}");
}
public int Handle => _header.Handle;
public string Name => _name.Value;
public string Name => _name?.Value ?? "Unnamed Object - "+Handle;
public ObjectProperties Properties => _properties;
public Constants.ObjectType ObjectType => (Constants.ObjectType) _header.ObjectType;
public int Flags => (int) _header.Flags;
public int Reserved => (int) _header.Reserved;
public int InkEffect => (int) _header.InkEffect;
public int InkEffect => (int) _header.InkEffect&0xffff;
public int InkEffectValue => (int) _header.InkEffectParameter;
public bool Transparent => ByteFlag.GetFlag((uint) InkEffect, 28);
public bool Antialias => ByteFlag.GetFlag((uint) InkEffect, 29);
public bool Transparent => ByteFlag.GetFlag((uint) _header.InkEffect, 28);
public bool Antialias => ByteFlag.GetFlag((uint) _header.InkEffect, 29);
public ImageItem GetPreview()
@ -144,8 +146,8 @@ namespace CTFAK.MMFParser.EXE.Loaders
public Int16 ObjectType;
public UInt32 Flags;
public UInt32 InkEffect;
public UInt32 InkEffectParameter;
public short Reserved;
public Int32 InkEffectParameter;
public Int16 Reserved;
public ObjectHeader(ByteReader reader) : base(reader){}
public ObjectHeader(Chunk chunk) : base(chunk){}
@ -158,8 +160,14 @@ namespace CTFAK.MMFParser.EXE.Loaders
ObjectType = Reader.ReadInt16();
Flags = Reader.ReadUInt16();
Reserved = Reader.ReadInt16();
InkEffect = Reader.ReadByte();
InkEffect = (uint) Reader.ReadInt32();
Reader.Skip(3);
InkEffectParameter = Reader.ReadByte();
// if (InkEffect != 0) InkEffectParameter = 255;
}
}
}

@ -145,6 +145,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
_movementsOffset = Reader.ReadUInt16();
_animationsOffset = Reader.ReadUInt16();
}
_zeroUnk = Reader.ReadUInt16();
if (_zeroUnk != 0) throw new NotImplementedException("Unknown value is not zero");
@ -219,6 +220,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
ExtensionData = Reader.ReadBytes(dataSize);
}
else ExtensionData = new byte[0];
Logger.Log($"{Parent.Name} - {ExtensionId}");
}

@ -38,6 +38,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
ParameterData = Reader.ReadBytes(parameterSize);
}
public override void Print(bool ext)

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Web.UI.WebControls;
using CTFAK.Utils;
using static CTFAK.MMFParser.EXE.ChunkList;
@ -10,7 +11,7 @@ namespace CTFAK.MMFParser.EXE.Loaders
{
public class AppIcon : ChunkLoader
{
List<byte> _points;
byte[] _points;
public AppIcon(ByteReader reader) : base(reader)
@ -23,51 +24,52 @@ namespace CTFAK.MMFParser.EXE.Loaders
public override void Read()
{
return;
Reader.ReadBytes(Reader.ReadInt32() - 4);
List<byte> colorIndexes = new List<byte>();
for (int i = 0; i < 16 * 16; i++)
{
var r = Reader.ReadSByte();
var g = Reader.ReadSByte();
var b = Reader.ReadSByte();
var g = Reader.ReadSByte();
var r = Reader.ReadSByte();
Reader.ReadByte();
colorIndexes.Add((byte) r);
colorIndexes.Add((byte) g);
colorIndexes.Add((byte) b);
}
_points = new List<byte>();
var bitmap = new Bitmap(16, 16);
for (int y = 0; y < 16; y++)
{
var xList = new List<byte>();
for (int x = 0; x < 16; x++)
{
xList.Add(colorIndexes[Reader.ReadByte()]);
var value = Reader.ReadByte();
bitmap.SetPixel(x, (16 - 1) - y,Color.Brown);
}
xList.AddRange(_points);
_points = xList;
}
bitmap.Save("penis.png");
List<byte> alpha = new List<byte>();
for (int i = 0; i < 16*16/8; i++)
{
List<bool> newAlphas = new List<bool>();
var val = Reader.ReadByte();
for (int j = 0; j < 8; j++)
{
newAlphas.Add(ByteFlag.GetFlag(val,i));
}
using (var bmp = new Bitmap(16, 16, PixelFormat.Format32bppArgb))
foreach (bool b in newAlphas)
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
bmp.Width,
bmp.Height),
ImageLockMode.WriteOnly,
bmp.PixelFormat);
if (b) _points[i + 3] = 0;
else _points[i + 3] = 255;
}
}
IntPtr pNative = bmpData.Scan0;
Marshal.Copy(_points.ToArray(), 0, pNative, _points.Count);
bmp.UnlockBits(bmpData);
bmp.Save("icon.png");
}
}

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
@ -14,7 +15,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
public List<MFAChunk> Items = new List<MFAChunk>();
public bool Log=false;
public T GetChunk<T>() where T : MFAChunkLoader
public T GetOrCreateChunk<T>() where T : MFAChunkLoader, new()
{
foreach (MFAChunk chunk in Items)
{
@ -23,7 +24,11 @@ namespace CTFAK.MMFParser.MFA.Loaders
return (T) chunk.Loader;
}
}
return null;
var newChunk = new MFAChunk(null);
newChunk.Id=45;
newChunk.Loader = new T();
Items.Add(newChunk);
return (T) newChunk.Loader;
}
public bool ContainsChunk<T>() where T : MFAChunkLoader
@ -104,15 +109,13 @@ namespace CTFAK.MMFParser.MFA.Loaders
var size = Reader.ReadInt32();
Data = Reader.ReadBytes(size);
var dataReader = new ByteReader(Data);
/*switch (Id)
switch (Id)
{
case 33:
Loader = new FrameVirtualRect(dataReader);
break;
case 56:
Loader=new GlobalObject(dataReader);
break;
case 72:
case 45:
Loader = new Opacity(dataReader);
break;
default:
@ -120,7 +123,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
// Logger.Log($"{Id} - {Data.GetHex()}");
break;
}*/
}
Loader?.Read();
@ -151,19 +154,35 @@ namespace CTFAK.MMFParser.MFA.Loaders
public class Opacity : MFAChunkLoader
{
public int Value;
public Color RGBCoeff;
public byte Blend;
public Opacity(ByteReader dataReader) : base(dataReader){}
public Opacity() : base()
{
}
public override void Read()
{
Value = Reader.ReadInt32();
var b = Reader.ReadByte();
var g = Reader.ReadByte();
var r = Reader.ReadByte();
Blend = Reader.ReadByte();
RGBCoeff = Color.FromArgb(Blend,r,g,b);
var unk = Reader.ReadInt32();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt32(Value);
Writer.WriteInt8(RGBCoeff.B);
Writer.WriteInt8(RGBCoeff.G);
Writer.WriteInt8(RGBCoeff.R);
Writer.WriteInt8(Blend);
Writer.WriteInt32(0);
}
}
@ -191,30 +210,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
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);
}
}
public abstract class MFAChunkLoader
{
public ByteReader Reader;
@ -222,6 +217,10 @@ namespace CTFAK.MMFParser.MFA.Loaders
{
Reader = reader;
}
protected MFAChunkLoader(){}
public abstract void Read();
public abstract void Write(ByteWriter Writer);
}

@ -158,7 +158,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
}
else if (name == EditorPositionData)
{
if(Reader.ReadUInt16()!=1)throw new NotImplementedException("Invalid chunkversion");
if(Reader.ReadUInt16()!=1)//throw new NotImplementedException("Invalid chunkversion");
X = Reader.ReadUInt32();
Y = Reader.ReadUInt32();
CaretType = Reader.ReadUInt32();
@ -167,7 +167,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
}
else if (name == EditorLineData)
{
if(Reader.ReadUInt16()!=1)throw new NotImplementedException("Invalid chunkversion");
if(Reader.ReadUInt16()!=1)//throw new NotImplementedException("Invalid chunkversion");
LineY = Reader.ReadUInt32();
LineItemType = Reader.ReadUInt32();
EventLine = Reader.ReadUInt32();
@ -258,7 +258,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
// if (X != 0)
{
Writer.WriteAscii(EditorPositionData);
Writer.WriteInt16(1);
Writer.WriteInt16(10);
Writer.WriteInt32((int) X);
Writer.WriteInt32((int) Y);
Writer.WriteUInt32(CaretType);
@ -268,7 +268,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
// if (LineY != 0)
{
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1);
Writer.WriteInt16(10);
Writer.WriteUInt32(LineY);
Writer.WriteUInt32(LineItemType);
Writer.WriteUInt32(EventLine);

@ -24,22 +24,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
}
);
public Color RGBCoeff=Color.White;
public uint Unk1;
public uint Unk2;
public uint Unk3;
public byte Unk4;
public byte Unk5;
public byte Unk6;
public byte Unk7;
public byte Unk8;
public byte Unk9;
public byte Unk10;
public byte Unk11;
public byte Unk12;
public override void Write(ByteWriter Writer)
{
Writer.AutoWriteUnicode(Name);

@ -23,8 +23,10 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
// if(Qualifiers==null) throw new NullReferenceException("QUALIFIERS NULL");
Writer.WriteInt32((int) ObjectFlags);
Writer.WriteInt32(NewObjectFlags);
// var col = Color.FromArgb(255,BackgroundColor.R,BackgroundColor.G,BackgroundColor.B);
Writer.WriteColor(BackgroundColor);
for (int i = 0; i < 8; i++)
{
Writer.WriteInt16(Qualifiers[i]);

@ -43,7 +43,6 @@ namespace CTFAK.MMFParser.Translation
mfa.Description = "";
mfa.Path = game.EditorFilename;
//mfa.Stamp = wtf;
//if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds.Items.Clear();
if (game.Sounds != null)
@ -74,10 +73,25 @@ namespace CTFAK.MMFParser.Translation
var flags = game.Header.Flags;
var newFlags = game.Header.NewFlags;
mfa.Extensions.Clear();
displaySettings["MDI"] = newFlags["MDI"];
displaySettings["MaximizedOnBoot"] = flags["Maximize"];
displaySettings["ResizeDisplay"] = flags["MDI"];
displaySettings["FullscreenAtStart"] = flags["FullscreenAtStart"];
displaySettings["AllowFullscreen"] = flags["FullscreenSwitch"];
displaySettings["Heading"] = !flags["NoHeading"];
displaySettings["HeadingWhenMaximized"] = true;
displaySettings["MenuBar"] = flags["MenuBar"];
displaySettings["MenuOnBoot"] = !flags["MenuHidden"];
graphicSettings["MultiSamples"] = flags["MultiSamples"];
displaySettings["NoMinimize"] = newFlags["NoMinimizeBox"];
displaySettings["NoMaximize"] = newFlags["NoMaximizeBox"];
displaySettings["NoThickFrame"] = newFlags["NoThickFrame"];
// displaySettings["NoCenter"] = flags["MDI"];
displaySettings["DisableClose"] = newFlags["DisableClose"];
displaySettings["HiddenAtStart"] = newFlags["HiddenAtStart"];
displaySettings["MDI"] = newFlags["MDI"];
mfa.GraphicFlags = graphicSettings;
mfa.DisplayFlags = displaySettings;
mfa.WindowX = game.Header.WindowWidth;
mfa.WindowY = game.Header.WindowHeight;
@ -135,8 +149,8 @@ namespace CTFAK.MMFParser.Translation
newFrame.SizeY = frame.Height;
newFrame.Background = frame.Background;
newFrame.FadeIn = null;
newFrame.FadeOut = null;
newFrame.FadeIn = frame.FadeIn!=null ? ConvertTransition(frame.FadeIn):null;
newFrame.FadeOut = frame.FadeOut!=null ? ConvertTransition(frame.FadeOut):null;
var mfaFlags = newFrame.Flags;
var originalFlags = frame.Flags;
@ -184,7 +198,6 @@ namespace CTFAK.MMFParser.Translation
for (int i = 0; i < frame.Objects.Count; i++)
{
var instance = frame.Objects[i];
FrameItem frameItem;
@ -203,6 +216,10 @@ namespace CTFAK.MMFParser.Translation
newInstance.Layer = (uint) (instance.Layer);
newInstances.Add(newInstance);
}
else
{
throw new NullReferenceException("Object");
}
}
}
@ -272,15 +289,17 @@ namespace CTFAK.MMFParser.Translation
public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans)
{
var mfaTrans = new MFA.Loaders.Transition((ByteReader) null);
mfaTrans.Module = gameTrans.ModuleFile;
mfaTrans.Name = gameTrans.Name.FirstCharToUpper();
mfaTrans.Id = gameTrans.Module;
mfaTrans.TransitionId = gameTrans.Name;
mfaTrans.Flags = gameTrans.Flags;
mfaTrans.Color = gameTrans.Color;
mfaTrans.ParameterData = gameTrans.ParameterData;
mfaTrans.Duration = gameTrans.Duration;
var mfaTrans = new MFA.Loaders.Transition((ByteReader) null)
{
Module = "cctrans.dll",//gameTrans.ModuleFile,
Name = "Transition",
Id = gameTrans.Module,
TransitionId = gameTrans.Name,
Flags = gameTrans.Flags,
Color = gameTrans.Color,
ParameterData = gameTrans.ParameterData,
Duration = gameTrans.Duration
};
return mfaTrans;
}
@ -330,17 +349,20 @@ namespace CTFAK.MMFParser.Translation
public static FrameItem TranslateObject(ObjectInfo item)
{
var newItem = new FrameItem(null);
newItem.Chunks = new ChunkList(null);
newItem.Name = item.Name;
newItem.ObjectType = (int)item.ObjectType;
newItem.Handle = item.Handle;
newItem.Transparent = 1;
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.AntiAliasing = item.Antialias? 1 : 0;;
newItem.Flags = item.Flags;
newItem.Chunks.GetOrCreateChunk<Opacity>().Blend = (byte) item.InkEffectValue;
newItem.Chunks.GetOrCreateChunk<Opacity>().RGBCoeff = Color.White;
newItem.IconHandle = 12;
newItem.Chunks = MFA.MFA.defaultObjChunks;
if (item.ObjectType == 0)
{
@ -435,6 +457,7 @@ namespace CTFAK.MMFParser.Translation
animation = animHeader?.AnimationDict[origAnim.Key];
}
else break;
if (animation != null)
{
if (animation.DirectionDict != null)

@ -9,6 +9,7 @@ using System.Web.Caching;
using System.Windows.Forms;
using CTFAK.GUI;
using CTFAK.MMFParser.EXE;
using CTFAK.MMFParser.EXE.Loaders.Banks;
using CTFAK.MMFParser.Translation;
using CTFAK.Utils;
using Joveler.Compression.ZLib;
@ -52,6 +53,7 @@ namespace CTFAK
if (args.Length > 0)
{
ImageBank.Load = false;
if (args[0].EndsWith(".exe"))
{
ReadFile(args[0],true,false,true);

Loading…
Cancel
Save