Sound fix for MFA

master
1987kostya 4 years ago
parent 39ad8eed83
commit 64d996f791

@ -172,6 +172,7 @@
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Group.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\GroupPointer.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\GroupPointer.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Program.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Shoot.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Shoot.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\StringParam.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\StringParam.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\TwoShorts.cs" /> <Compile Include="MMFParser\EXE\Loaders\Events\Parameters\TwoShorts.cs" />

@ -29,7 +29,6 @@ namespace CTFAK.MMFParser.EXE
if (chunk.Id == 26214) if (chunk.Id == 26214)
{ {
if(!Settings.twofiveplus) chunk.Loader = LoadModern(chunk); if(!Settings.twofiveplus) chunk.Loader = LoadModern(chunk);
//LoadChunk(chunk);
} }
else else
{ {
@ -303,7 +302,7 @@ namespace CTFAK.MMFParser.EXE
} }
loader?.Read(); loader?.Read();
// chunk.ChunkData = null; // chunk.ChunkData = null; //TODO:Do something smarter
// chunk.RawData = null; // chunk.RawData = null;
return loader; return loader;
} }

@ -17,7 +17,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public bool SaveImages = false; public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>(); public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems; public uint NumberOfItems;
public bool PreloadOnly = true; public bool PreloadOnly = false;
public ImageBank(ByteReader reader) : base(reader) public ImageBank(ByteReader reader) : base(reader)
{ {
@ -132,16 +132,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public int Size; public int Size;
//tranparent,add later
Color _transparent; Color _transparent;
byte[] _colorArray; byte[] _colorArray;
public byte[] rawImg; public byte[] rawImg;
public byte[] rawAlpha; public byte[] rawAlpha;
public bool Debug = false; public bool Debug = false;
public int Debug2 = 1;
private Bitmap _bitmap; private Bitmap _bitmap;
public void Read(bool load) public void Read(bool load)
@ -149,7 +146,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) if (!Debug)
{ {
if (Settings.Build>=290) Handle -= 1; if (Settings.Build>291) 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;
} }
@ -163,6 +160,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
if (!Debug) if (!Debug)
{ {
if (Settings.Build>291) 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;
} }
@ -330,7 +328,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
} }
} }
} }
if (Settings.Build > 283) if (Settings.Build > 283) // No idea, but this is not working with old games
{ {
if (_transparent != null) if (_transparent != null)
{ {

@ -128,11 +128,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
Checksum = Reader.ReadInt32(); Checksum = Reader.ReadInt32();
References = Reader.ReadInt32(); References = Reader.ReadInt32();
var decompressedSize = Reader.ReadInt32(); var decompressedSize = Reader.ReadInt32();
Flags = (int)Reader.ReadUInt32(); //flags Flags = (int)Reader.ReadUInt32();
var reserved = Reader.ReadInt32(); var reserved = Reader.ReadInt32();
var nameLenght = Reader.ReadInt32(); var nameLenght = Reader.ReadInt32();
ByteReader soundData; ByteReader soundData;
if (IsCompressed) //compressed if (IsCompressed)
{ {
var size = Reader.ReadInt32(); var size = Reader.ReadInt32();
soundData = new ByteReader(Decompressor.decompress_block(Reader, size, decompressedSize)); soundData = new ByteReader(Decompressor.decompress_block(Reader, size, decompressedSize));
@ -141,23 +141,14 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
{ {
soundData = new ByteReader(Reader.ReadBytes(decompressedSize)); soundData = new ByteReader(Reader.ReadBytes(decompressedSize));
} }
if (IsCompressed) Name = soundData.ReadWideString(nameLenght);
{ Logger.Log(Name);
Name = soundData.ReadAscii(nameLenght);
}
else
{
Name = soundData.ReadWideString(nameLenght);
}
this.Data = soundData.ReadBytes((int) soundData.Size()); Data = soundData.ReadBytes((int) soundData.Size());
if (Settings.DumpSounds) if (Settings.DumpSounds)
{ {
Name = Helper.CleanInput(Name); Name = Helper.CleanInput(Name);
File.WriteAllBytes($"{Settings.SoundPath}\\{Name}.wav", Data); File.WriteAllBytes($"{Settings.SoundPath}\\{Name}.wav", Data);
// File.WriteAllBytes($"{Name}.wav", Data);
} }
@ -169,11 +160,14 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
writer.WriteUInt32((uint)Handle); writer.WriteUInt32((uint)Handle);
writer.WriteInt32(Checksum); writer.WriteInt32(Checksum);
writer.WriteInt32(References); writer.WriteInt32(References);
writer.WriteInt32(Data.Length+Name.Length+8); writer.WriteInt32(Data.Length+(Name.Length*2));
writer.WriteInt32(Flags); writer.WriteInt32(Flags);
writer.WriteInt32(0); writer.WriteInt32(0);
writer.WriteInt32(Name.Length); writer.WriteInt32(Name.Length);
writer.WriteUnicode(Name); writer.WriteUnicode(Name);
// writer.BaseStream.Position -= 4;
writer.WriteBytes(Data); writer.WriteBytes(Data);

@ -209,9 +209,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
newWriter.WriteUInt16(Flags); newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {
if(isMFA) if(isMFA)//For MFA
{ {
newWriter.WriteInt16((short) IsRestricted); //For MFA newWriter.WriteInt16((short) IsRestricted);
newWriter.WriteInt16((short) RestrictCpt); newWriter.WriteInt16((short) RestrictCpt);
newWriter.WriteInt16((short) Identifier); newWriter.WriteInt16((short) Identifier);
newWriter.WriteInt16((short) Undo); newWriter.WriteInt16((short) Undo);
@ -258,13 +258,19 @@ 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 (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 (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;
}
cond.Num = num; cond.Num = num;
} }
public static void FixActions(ref Action act) public static void FixActions(ref Action act)
{ {
var num = act.Num; var num = act.Num;
// if (num == 27||num == 28||num == 29||num == 30) num = 3; if (Settings.Build >= 290)
{
if (num == 27||num == 28||num == 29||num == 30) num = 3;
}
act.Num = num; act.Num = num;
} }

@ -179,15 +179,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
var actualLoader = Helper.LoadParameter(Code,Reader); var actualLoader = Helper.LoadParameter(Code,Reader);
this.Loader = actualLoader; this.Loader = actualLoader;
if (Loader!=null) if (Loader!=null) Loader.Read();
{ else throw new Exception("Loader is null: "+Code);
Loader.Read();
}
else
{
throw new Exception("Loader is null: "+Code);
}
Reader.Seek(currentPosition+size); Reader.Seek(currentPosition+size);
} }

@ -18,7 +18,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Size = Reader.ReadInt16(); Size = Reader.ReadInt16();
Type = Reader.ReadInt16(); Type = Reader.ReadInt16();
Code = Reader.ReadInt16(); Code = Reader.ReadInt16();
Data = Reader.ReadBytes(Size-20); Data = Reader.ReadBytes((Size-20>0?Size-20:0));
} }

@ -22,7 +22,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Id = Reader.ReadUInt16(); Id = Reader.ReadUInt16();
Name = Reader.ReadWideString(); Name = Reader.ReadWideString();
Password = Reader.ReadInt32(); Password = Reader.ReadInt32();
Password = Checksum.MakeGroupChecksum("", Name); Password = Checksum.MakeGroupChecksum("pass", Name);
Logger.Log("Password: "+Password); Logger.Log("Password: "+Password);
} }

@ -0,0 +1,29 @@
using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
public class Program:ParameterCommon
{
public short Flags;
public string Filename;
public string Command;
public Program(ByteReader reader) : base(reader)
{
}
public override void Read()
{
Flags = Reader.ReadInt16();
Filename = Reader.ReadAscii(260);
Command = Reader.ReadAscii();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16(Flags);
Writer.WriteAscii(Filename);
Writer.WriteAscii(Command);
}
}
}

@ -95,6 +95,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
case 5: case 5:
Loader=new MovementPath(Reader); Loader=new MovementPath(Reader);
break; break;
case 9:
Loader = new PlatformMovement(Reader);
break;
case 14: case 14:
Loader = new ExtensionsMovement(Reader); Loader = new ExtensionsMovement(Reader);
break; break;
@ -324,7 +327,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public short Speed; public short Speed;
public short Acceleration; public short Acceleration;
public short Deceleration; public short Deceleration;
public short Directions; public int Directions;
public short BounceFactor; public short BounceFactor;
public EightDirections(ByteReader reader) : base(reader) public EightDirections(ByteReader reader) : base(reader)
@ -341,7 +344,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Acceleration = Reader.ReadInt16(); Acceleration = Reader.ReadInt16();
Deceleration = Reader.ReadInt16(); Deceleration = Reader.ReadInt16();
BounceFactor = Reader.ReadInt16(); BounceFactor = Reader.ReadInt16();
Directions = Reader.ReadInt16(); Directions = Reader.ReadInt32();
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
@ -350,7 +353,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Writer.WriteInt16(Acceleration); Writer.WriteInt16(Acceleration);
Writer.WriteInt16(Deceleration); Writer.WriteInt16(Deceleration);
Writer.WriteInt16(BounceFactor); Writer.WriteInt16(BounceFactor);
Writer.WriteInt16(Directions); Writer.WriteInt32(Directions);
} }
} }
public class RaceMovement:MovementLoader public class RaceMovement:MovementLoader

@ -46,10 +46,10 @@ 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();
// 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;
@ -122,7 +122,8 @@ namespace CTFAK.MMFParser.Translation
var newFrame = new MFA.Loaders.Frame(null); var newFrame = new MFA.Loaders.Frame(null);
newFrame.Chunks = new ChunkList(null);//MFA.MFA.emptyFrameChunks; newFrame.Chunks = new ChunkList(null);//MFA.MFA.emptyFrameChunks;
newFrame.Handle = indexHandles[a]; newFrame.Handle = a;
indexHandles.TryGetValue(a,out newFrame.Handle);
Message($"Translating frame: {frame.Name} - {newFrame.Handle}" ); Message($"Translating frame: {frame.Name} - {newFrame.Handle}" );
newFrame.Name = frame.Name; newFrame.Name = frame.Name;
newFrame.SizeX = frame.Width; newFrame.SizeX = frame.Width;
@ -213,13 +214,14 @@ namespace CTFAK.MMFParser.Translation
newFolder.Items = new List<uint>() {(uint) newFrameItem.Handle}; newFolder.Items = new List<uint>() {(uint) newFrameItem.Handle};
newFrame.Folders.Add(newFolder); newFrame.Folders.Add(newFolder);
} }
{ {
newFrame.Events = new Events((ByteReader) null); newFrame.Events = new Events((ByteReader) null);
newFrame.Events.Items = new List<EventGroup>(); newFrame.Events.Items = new List<EventGroup>();
newFrame.Events.Objects = new List<EventObject>(); newFrame.Events.Objects = new List<EventObject>();
newFrame.Events._ifMFA = true; newFrame.Events._ifMFA = true;
newFrame.Events.Version = 1028; newFrame.Events.Version = 1028;
// if (false)
if(frame.Events != null) if(frame.Events != null)
{ {
foreach (var item in newFrame.Items) foreach (var item in newFrame.Items)

@ -164,6 +164,11 @@ namespace CTFAK.Utils
item = new Click(reader); item = new Click(reader);
} }
if (code == 33)
{
item = new MMFParser.EXE.Loaders.Events.Parameters.Program(reader);
}
if (code == 55) if (code == 55)
{ {
item = new Extension(reader); item = new Extension(reader);

Loading…
Cancel
Save