Decryption, started working on some new chunks

master
1987kostya 5 years ago
parent a9da6760c5
commit f18c39974d

@ -8,13 +8,19 @@ EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|Any CPU.ActiveCfg = Debug|x64
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|Any CPU.Build.0 = Debug|Any CPU {86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|Any CPU.Build.0 = Debug|x64
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|x64.ActiveCfg = Debug|x64
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Debug|x64.Build.0 = Debug|x64
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|Any CPU.ActiveCfg = Release|Any CPU {86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|Any CPU.Build.0 = Release|Any CPU {86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|Any CPU.Build.0 = Release|Any CPU
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|x64.ActiveCfg = Release|x64
{86D99F9E-98FB-4E50-AB68-F5C115850C33}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

@ -48,6 +48,29 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Ionic.Zlib"> <Reference Include="Ionic.Zlib">
<HintPath>E:\ClickTFReader-master\DUMP\fnaf-world\CHUNKS\Ionic.Zlib.dll</HintPath> <HintPath>E:\ClickTFReader-master\DUMP\fnaf-world\CHUNKS\Ionic.Zlib.dll</HintPath>
@ -67,6 +90,8 @@
<ItemGroup> <ItemGroup>
<Compile Include="mmfparser\chunkloaders\AppMenu.cs" /> <Compile Include="mmfparser\chunkloaders\AppMenu.cs" />
<Compile Include="mmfparser\chunkloaders\banks\DebugImageBank.cs" /> <Compile Include="mmfparser\chunkloaders\banks\DebugImageBank.cs" />
<Compile Include="mmfparser\chunkloaders\ObjectInfo.cs" />
<Compile Include="mmfparser\chunkloaders\FrameItems.cs" />
<Compile Include="mmfparser\DataLoader.cs" /> <Compile Include="mmfparser\DataLoader.cs" />
<Compile Include="mmfparser\mfaloaders\ChunkList.cs" /> <Compile Include="mmfparser\mfaloaders\ChunkList.cs" />
<Compile Include="mmfparser\mfaloaders\Frame.cs" /> <Compile Include="mmfparser\mfaloaders\Frame.cs" />

@ -5,6 +5,8 @@ using System;
using System.IO; using System.IO;
using System.Collections; using System.Collections;
using NetMFAPatcher.mfa; using NetMFAPatcher.mfa;
using NetMFAPatcher.utils;
using System.Runtime.InteropServices;
namespace NetMFAPatcher namespace NetMFAPatcher
{ {
@ -33,13 +35,15 @@ namespace NetMFAPatcher
bool DumpImages=true; bool DumpImages=true;
bool DumpSounds=true; bool DumpSounds=true;
bool CreateFolders=true; bool CreateFolders=true;
if (args.Length == 0) if (args.Length == 0)
{ {
if (true) if (true)
{ {
ByteIO mfaReader = new ByteIO(@"E:\SUPERDECOMPILER\Tests\mmftest.mfa", FileMode.Open); ByteIO mfaReader = new ByteIO(@"E:\DotNetCTF\Tests\mmftest.mfa", FileMode.Open);
var mfa = new MFA(mfaReader); var mfa = new MFA(mfaReader);
mfa.Read(); mfa.Read();

@ -100,6 +100,7 @@ namespace NetMFAPatcher.Utils
} }
public string ReadWideString(int length = -1) public string ReadWideString(int length = -1)
{ {
String str = ""; String str = "";

@ -31,6 +31,11 @@ namespace NetMFAPatcher.Utils
{ {
return new ByteIO(decompress_block(image_data, v, decompressed_size)); return new ByteIO(decompress_block(image_data, v, decompressed_size));
} }
internal static byte[] decompress_block(ByteIO data, uint compressed_size, uint decompressedSize)
{
throw new NotImplementedException();
}
} }

@ -1,6 +1,8 @@
using System; using NetMFAPatcher.Utils;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -8,5 +10,74 @@ namespace NetMFAPatcher.utils
{ {
class Decryption class Decryption
{ {
public static byte[] key;
public static void MakeKey(string STitle, string SCopyright,string SProject, byte MagicChar)
{
byte[] nameBytes = Encoding.ASCII.GetBytes(STitle);
var name = Marshal.AllocHGlobal(STitle.Length);
Marshal.Copy(nameBytes, 0, name, STitle.Length);
byte[] copyrightBytes = Encoding.ASCII.GetBytes(SCopyright);
var copyright = Marshal.AllocHGlobal(SCopyright.Length);
Marshal.Copy(copyrightBytes, 0, copyright, SCopyright.Length);
byte[] filenameBytes = Encoding.ASCII.GetBytes(SProject);
var pathfilename = Marshal.AllocHGlobal(SProject.Length);
Marshal.Copy(filenameBytes, 0, pathfilename, SProject.Length);
var ptr = Decryption.make_key(name, copyright, pathfilename, MagicChar);
byte[] Key = new byte[257];
Marshal.Copy(ptr, Key, 0, 257);
Marshal.FreeHGlobal(name);
Marshal.FreeHGlobal(copyright);
Marshal.FreeHGlobal(pathfilename);
key = Key;
//some hardcoded checks for SL
if (Console.ReadKey().Key==ConsoleKey.N)
{
if(key[73] == 0xB2)
{
return;
}
MakeKey("Sister Location", "Scott Cawthon", @"C:\Users\Scott\Desktop\FNAF 5\FNaF 5-157.mfa", 54);
}
}
public static byte[] DecodeMode3(byte[] ChunkData, int ChunkSize,int ChunkID, byte MagicChar)
{
var reader = new ByteIO(ChunkData);
var DecompressedSize = reader.ReadUInt32();
var chunkData = reader.ReadBytes((int)reader.Size());
chunkData[0] ^= (byte)(((byte)ChunkID & 0xFF) ^ ((byte)ChunkID >> 0x8));
var data = new ByteIO(DecodeChunk(chunkData,ChunkSize,MagicChar));
var compressed_size = data.ReadUInt32();
return Decompressor.decompress_block(data, (int)compressed_size, (int)DecompressedSize);
}
public static byte[] DecodeChunk(byte[] ChunkData, int ChunkSize,byte MagicChar)
{
//Console.WriteLine("Decoding: "+ChunkData.Log(false,"X2"));
IntPtr InputChunkPtr = Marshal.AllocHGlobal(ChunkSize);
Marshal.Copy(ChunkData, 0, InputChunkPtr, ChunkSize-4);
var OutputChunkPtr = decode_chunk(InputChunkPtr, ChunkSize, MagicChar);
byte[] DecodedChunk = new byte[ChunkSize];
Marshal.Copy(OutputChunkPtr, DecodedChunk,0,ChunkSize);
//Console.WriteLine("Result: " + DecodedChunk.Log(false, "X2"));
return DecodedChunk;
}
[DllImport("Decrypter-x64.dll", EntryPoint = "decode_chunk", CharSet = CharSet.Auto)]
public static extern IntPtr decode_chunk(IntPtr chunk_data,int chunk_size, byte magic_char);
[DllImport("Decrypter-x64.dll", EntryPoint = "make_key", CharSet = CharSet.Auto)]
public static extern IntPtr make_key(IntPtr c_title, IntPtr c_copyright, IntPtr c_project, byte magic_char);
} }
} }

@ -1,4 +1,5 @@
using NetMFAPatcher.chunkloaders; using NetMFAPatcher.chunkloaders;
using NetMFAPatcher.utils;
using NetMFAPatcher.Utils; using NetMFAPatcher.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -9,7 +10,7 @@ namespace NetMFAPatcher.mmfparser
{ {
public class ChunkList public class ChunkList
{ {
List<Chunk> chunks = new List<Chunk>(); public List<Chunk> chunks = new List<Chunk>();
public bool verbose = true; public bool verbose = true;
public void Read(ByteIO exeReader) public void Read(ByteIO exeReader)
@ -30,6 +31,14 @@ namespace NetMFAPatcher.mmfparser
} }
chunks.Add(chunk); chunks.Add(chunk);
if (chunk.id == 8750)
{
chunk.BuildKey();
}
if (chunk.id == 13108)
{
}
if (chunk.id == 32639) break; //LAST chunkID if (chunk.id == 32639) break; //LAST chunkID
} }
@ -73,10 +82,12 @@ namespace NetMFAPatcher.mmfparser
switch (flag) switch (flag)
{ {
case ChunkFlags.Encrypted: case ChunkFlags.Encrypted:
chunk_data = exeReader.ReadBytes(size);
chunk_data = Decryption.DecodeChunk(exeReader.ReadBytes(size),size,54);
break; break;
case ChunkFlags.CompressedAndEncrypyed: case ChunkFlags.CompressedAndEncrypyed:
chunk_data = exeReader.ReadBytes(size); //exeReader.ReadBytes(size);
chunk_data = Decryption.DecodeMode3(exeReader.ReadBytes(size), size,id, 54);
break; break;
case ChunkFlags.Compressed: case ChunkFlags.Compressed:
chunk_data = Decompressor.Decompress(exeReader); chunk_data = Decompressor.Decompress(exeReader);
@ -94,9 +105,10 @@ namespace NetMFAPatcher.mmfparser
} }
if(verbose) if(verbose)
{ {
Print(false); //Print(false);
} }
} }
public void Print(bool extented) public void Print(bool extented)
@ -106,8 +118,7 @@ namespace NetMFAPatcher.mmfparser
Logger.Log($"Chunk: {name} ({uid})", true, ConsoleColor.DarkCyan); Logger.Log($"Chunk: {name} ({uid})", true, ConsoleColor.DarkCyan);
Logger.Log($" ID: {id} - 0x{id.ToString("X")}", true, ConsoleColor.DarkCyan); Logger.Log($" ID: {id} - 0x{id.ToString("X")}", true, ConsoleColor.DarkCyan);
Logger.Log($" Flags: {flag}", true, ConsoleColor.DarkCyan); Logger.Log($" Flags: {flag}", true, ConsoleColor.DarkCyan);
Logger.Log($" Loader: {(loader != null ? loader.GetType().Name : "Empty Loader")}", true, Logger.Log($" Loader: {(loader != null ? loader.GetType().Name : "Empty Loader")}", true,ConsoleColor.DarkCyan);
ConsoleColor.DarkCyan);
Logger.Log($" Size: {size} B", true, ConsoleColor.DarkCyan); Logger.Log($" Size: {size} B", true, ConsoleColor.DarkCyan);
Logger.Log($" Decompressed Size: {decompressed_size} B", true, ConsoleColor.DarkCyan); Logger.Log($" Decompressed Size: {decompressed_size} B", true, ConsoleColor.DarkCyan);
Logger.Log("---------------------------------------------", true, ConsoleColor.DarkCyan); Logger.Log("---------------------------------------------", true, ConsoleColor.DarkCyan);
@ -122,6 +133,20 @@ namespace NetMFAPatcher.mmfparser
Logger.Log("---------------------------------------------", true, ConsoleColor.DarkCyan); Logger.Log("---------------------------------------------", true, ConsoleColor.DarkCyan);
} }
}
public void BuildKey()
{
string title = "";
string copyright = "";
string project = "";
title = "Sister Location";//chunk_list.get_chunk<AppName>().value;
copyright = "Scott Cawthon";//chunk_list.get_chunk<Copyright>().value;
project = @"C:\Users\Scott\Desktop\FNAF 5\FNaF 5-157.mfa";//chunk_list.get_chunk<EditorFilename>().value;
Decryption.MakeKey(title,copyright,project,54);
Logger.Log("New Key!");
} }
} }
@ -177,6 +202,9 @@ namespace NetMFAPatcher.mmfparser
case 13107: case 13107:
loader = new Frame(chunk); loader = new Frame(chunk);
break; break;
case 13108:
loader = new FrameHeader(chunk);
break;
case 26214: case 26214:
loader = new ImageBank(chunk); loader = new ImageBank(chunk);
break; break;

@ -19,6 +19,26 @@ namespace NetMFAPatcher.mfa
{ {
class MFA : DataLoader class MFA : DataLoader
{ {
public int mfaBuild;
public int product;
public int buildVersion;
public string name;
public string description;
public string path;
public string author;
public string copyright;
public string company;
public string version;
public byte[] stamp;
public int windowX;
public int windowY;
public ValueList globalValues;
public ValueList globalStrings;
public override void Print() public override void Print()
{ {
@ -31,56 +51,55 @@ namespace NetMFAPatcher.mfa
public override void Read() public override void Read()
{ {
Logger.Log($"MFA HEADER:{reader.ReadAscii(4)}"); Logger.Log($"MFA HEADER:{reader.ReadAscii(4)}");
var mfaBuild = reader.ReadInt32(); mfaBuild = reader.ReadInt32();
var product = reader.ReadInt32(); product = reader.ReadInt32();
var buildVersion = reader.ReadInt32(); buildVersion = reader.ReadInt32();
var name = reader.ReadAscii(reader.ReadInt32()); name = reader.ReadAscii(reader.ReadInt32());
var description = reader.ReadAscii(reader.ReadInt32()); description = reader.ReadAscii(reader.ReadInt32());
var path = reader.ReadAscii(reader.ReadInt32()); path = reader.ReadAscii(reader.ReadInt32());
var stamp = reader.ReadBytes(reader.ReadInt32()); stamp = reader.ReadBytes(reader.ReadInt32());
Logger.Log(reader.ReadAscii(4)); if(reader.ReadAscii(4)!="ATNF")
{
throw new Exception("Invalid Font Bank");
}
var fonts = new FontBank(reader); var fonts = new FontBank(reader);
fonts.Read(); fonts.Read();
Logger.Log("FontsDone\n");
Logger.Log(reader.ReadAscii(4)); if (reader.ReadAscii(4) != "APMS")
{
throw new Exception("Invalid Sound Bank");
}
var sounds = new SoundBank(reader); var sounds = new SoundBank(reader);
sounds.isCompressed = false; sounds.isCompressed = false;
sounds.Read(); sounds.Read();
Logger.Log("SoundsDone\n");
Logger.Log(reader.ReadAscii(4)); if (reader.ReadAscii(4) != "ASUM")
{
throw new Exception("Invalid Music Bank");
}
var music = new MusicBank(reader); var music = new MusicBank(reader);
music.Read(); music.Read();
//Images&Icons are not implemented
Logger.Log("MusicDone\n"); reader.Seek(1191182);//hardcoded offset
//Logger.Log(reader.ReadAscii(4));
//var icons = new AGMIBank(reader);
//icons.Read();
//Logger.Log("IconDone\n");
//Logger.Log(reader.ReadAscii(4));
reader.ReadInt32();//checkDefault
author = reader.ReadAscii(reader.ReadInt32());
reader.ReadInt32();//checkDefault
copyright = reader.ReadAscii(reader.ReadInt32());
reader.ReadInt32();//checkDefault
reader.Seek(1191186); company = reader.ReadAscii(reader.ReadInt32());
version = reader.ReadAscii(reader.ReadInt32());
var author = reader.ReadAscii(reader.ReadInt32()); windowX = reader.ReadInt32();
reader.ReadInt32(); windowY = reader.ReadInt32();
var copyright = reader.ReadAscii(reader.ReadInt32());
reader.ReadInt32();
var company = reader.ReadAscii(reader.ReadInt32());
var version = reader.ReadAscii(reader.ReadInt32());
var windowX = reader.ReadInt32();
var windowY = reader.ReadInt32();
var borderColor = reader.ReadBytes(4); var borderColor = reader.ReadBytes(4);
var displayFlags = reader.ReadInt32(); var displayFlags = reader.ReadInt32();
var graphicFlags = reader.ReadInt32(); var graphicFlags = reader.ReadInt32();
@ -122,9 +141,9 @@ namespace NetMFAPatcher.mfa
var globalValues = new ValueList(reader); globalValues = new ValueList(reader);
globalValues.Read(); globalValues.Read();
var globalStrings = new ValueList(reader); globalStrings = new ValueList(reader);
globalStrings.Read(); globalStrings.Read();
var globalEvents = reader.ReadBytes(reader.ReadInt32()); var globalEvents = reader.ReadBytes(reader.ReadInt32());
var graphicMode = reader.ReadInt32(); var graphicMode = reader.ReadInt32();
@ -144,7 +163,7 @@ namespace NetMFAPatcher.mfa
var handleQ = reader.ReadInt32(); var handleQ = reader.ReadInt32();
} }
var extCount = reader.ReadInt32(); var extCount = reader.ReadInt32();
for (int i = 0; i < extCount; i++) for (int i = 0; i < extCount; i++)//extensions
{ {
var handleE = reader.ReadInt32(); var handleE = reader.ReadInt32();
var filenameE = reader.ReadAscii(reader.ReadInt32()); var filenameE = reader.ReadAscii(reader.ReadInt32());
@ -166,7 +185,7 @@ namespace NetMFAPatcher.mfa
reader.Seek(item); reader.Seek(item);
var testframe = new Frame(reader); var testframe = new Frame(reader);
testframe.Read(); testframe.Read();
Console.WriteLine($"Done reading frame '{testframe.name}'");
} }

@ -2,6 +2,7 @@
using NetMFAPatcher.Utils; using NetMFAPatcher.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -36,11 +37,9 @@ namespace NetMFAPatcher.chunkloaders
public string name; public string name;
public string password; public string password;
public int width; public int width;
public int height; public int height;
public byte[] background;
//background, idk what type is it public int flags;
//flags
int top; int top;
int bottom; int bottom;
int left; int left;
@ -49,6 +48,10 @@ namespace NetMFAPatcher.chunkloaders
public override void Print() public override void Print()
{ {
Logger.Log($"Frame: {name}", true, ConsoleColor.Green);
Logger.Log($" Password: {(password!=null ? password : "None")}", true, ConsoleColor.Green);
Logger.Log($" Size: {width}x{height}", true, ConsoleColor.Green);
Logger.Log($"-------------------------", true, ConsoleColor.Green);
} }
public override void Read() public override void Read()
@ -57,9 +60,40 @@ namespace NetMFAPatcher.chunkloaders
var chunks = new ChunkList(); var chunks = new ChunkList();
chunks.verbose = false; chunks.verbose = false;
//chunks.Read(FrameReader); chunks.Read(FrameReader);
var name = chunks.get_chunk<FrameName>();
if (name != null)
{
this.name = name.value;
}
var password = chunks.get_chunk<FramePassword>();
if (password != null)
{
this.password = password.value;
}
var header = chunks.get_chunk<FrameHeader>();
width = header.width;
height = header.height;
background = header.background;
flags = header.flags;
foreach (var item in chunks.chunks)
{
Directory.CreateDirectory($"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}");
string path = $"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}\\{chunk.name}.chunk";
File.WriteAllBytes(path, item.chunk_data);
}
//var name = chunks.get_chunk<FrameName>();
} }
public Frame(ByteIO reader) : base(reader) public Frame(ByteIO reader) : base(reader)
@ -70,4 +104,62 @@ namespace NetMFAPatcher.chunkloaders
{ {
} }
} }
class FrameHeader : ChunkLoader
{
public int width;
public int height;
public int flags;
public byte[] background;
public FrameHeader(ByteIO reader) : base(reader)
{
}
public FrameHeader(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Print()
{
}
public override void Read()
{
width = reader.ReadInt32();
height = reader.ReadInt32();
background = reader.ReadBytes(4);
flags = (int)reader.ReadUInt32();
}
}
class ObjectInstances : ChunkLoader
{
public int width;
public int height;
public ObjectInstances(ByteIO reader) : base(reader)
{
}
public ObjectInstances(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Print()
{
}
public override void Read()
{
}
}
} }

@ -0,0 +1,25 @@
using NetMFAPatcher.chunkloaders;
using NetMFAPatcher.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NetMFAPatcher.mmfparser.chunkloaders
{
class FrameItems : ChunkLoader
{
public FrameItems(ChunkList.Chunk chunk) : base(chunk) { }
public FrameItems(ByteIO reader) : base(reader) { }
public override void Print()
{
}
public override void Read()
{
}
}
}

@ -0,0 +1,25 @@
using NetMFAPatcher.chunkloaders;
using NetMFAPatcher.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NetMFAPatcher.mmfparser.chunkloaders
{
class ObjectInfo : ChunkLoader
{
public ObjectInfo(ChunkList.Chunk chunk) : base(chunk) { }
public ObjectInfo(ByteIO reader) : base(reader) { }
public override void Print()
{
}
public override void Read()
{
}
}
}

@ -21,7 +21,7 @@ namespace NetMFAPatcher.chunkloaders
public override void Print() public override void Print()
{ {
Logger.Log($"{chunk.name} contains: {value}\n",true,ConsoleColor.DarkCyan); //Logger.Log($"{chunk.name} contains: {value}\n",true,ConsoleColor.DarkCyan);
} }

@ -12,6 +12,10 @@ namespace NetMFAPatcher.mmfparser.mfaloaders
class Frame : DataLoader class Frame : DataLoader
{ {
public string name = "ERROR"; public string name = "ERROR";
public int sizeX;
public int sizeY;
public Color background;
public int maxObjects;
public Frame(ByteIO reader) : base(reader) public Frame(ByteIO reader) : base(reader)
{ {
@ -27,11 +31,11 @@ namespace NetMFAPatcher.mmfparser.mfaloaders
{ {
var handle = reader.ReadInt32(); var handle = reader.ReadInt32();
name = reader.ReadAscii(reader.ReadInt32()); name = reader.ReadAscii(reader.ReadInt32());
var sizeX = reader.ReadInt32(); sizeX = reader.ReadInt32();
var sizeY = reader.ReadInt32(); sizeY = reader.ReadInt32();
var background = reader.ReadColor(); var background = reader.ReadColor();
var flags = reader.ReadInt32(); var flags = reader.ReadInt32();
var maxObjects = reader.ReadInt32(); maxObjects = reader.ReadInt32();
var password = reader.ReadAscii(reader.ReadInt32()); var password = reader.ReadAscii(reader.ReadInt32());
reader.Skip(4); reader.Skip(4);
var lastViewedX = reader.ReadInt32(); var lastViewedX = reader.ReadInt32();

Loading…
Cancel
Save