2.5+ fixes, should not crash anymore

master
1987kostya 4 years ago
parent 411770e590
commit aec50d9a2b

@ -640,6 +640,7 @@ namespace DotNetCTFDumper.GUI
public void InitImages() public void InitImages()
{ {
if (Settings.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);
@ -851,6 +852,7 @@ namespace DotNetCTFDumper.GUI
public void InitSounds() public void InitSounds()
{ {
var bank = Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>(); var bank = Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>();
if (bank == null) return;
foreach (SoundItem soundItem in bank.Items) foreach (SoundItem soundItem in bank.Items)
{ {
soundList.Nodes.Add(new ChunkNode(soundItem.Name,soundItem)); soundList.Nodes.Add(new ChunkNode(soundItem.Name,soundItem));

@ -25,6 +25,8 @@ namespace DotNetCTFDumper.MMFParser.EXE
chunk.Loader = LoadChunk(chunk); chunk.Loader = LoadChunk(chunk);
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 (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
} }

@ -14,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{ {
public class ImageBank : ChunkLoader public class ImageBank : ChunkLoader
{ {
public bool SaveImages = true; 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=false; public bool PreloadOnly=false;
@ -155,9 +155,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{ {
Handle = Reader.ReadInt32() - 1; Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell(); Position = (int) Reader.Tell();
Logger.Log("ImageFound: "+Handle);
if (load) Load(); if (load) Load();
else Preload(); else Preload();
} }
@ -182,23 +180,14 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
_bitmap = null; _bitmap = null;
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
Console.WriteLine("Preloading Image"); if (!Settings.twofiveplus)
if (Settings.twofiveplus)
{
//Do 2.5+ decryption
}
// imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a); imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
else imageReader = Reader;
//Directory.CreateDirectory("DUMP\\DEBUG");
//File.WriteAllBytes($"DUMP\\DEBUG\\Img-{Handle}.imgb",imageReader.ReadBytes((int) imageReader.Size()));
long start = imageReader.Tell(); long start = imageReader.Tell();
//return;
if(Settings.twofiveplus) imageReader.Skip(4);
_checksum = imageReader.ReadInt32(); _checksum = imageReader.ReadInt32();
_references = imageReader.ReadInt32(); _references = imageReader.ReadInt32();
Size = (int) imageReader.ReadUInt32(); Size = (int) imageReader.ReadUInt32();
@ -230,7 +219,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
_width = imageReader.ReadInt16(); _width = imageReader.ReadInt16();
_height = imageReader.ReadInt16(); _height = imageReader.ReadInt16();
_graphicMode = imageReader.ReadByte(); //Graphic mode is always 4 for SL _graphicMode = imageReader.ReadByte();
Flags.flag = imageReader.ReadByte(); Flags.flag = imageReader.ReadByte();
@ -283,6 +272,13 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
(_colorArray, bytesRead) = ImageHelper.ReadSixteen(imageData, _width, _height); (_colorArray, bytesRead) = ImageHelper.ReadSixteen(imageData, _width, _height);
break; break;
} }
case 8:
{
//imageReader.Seek(start+Size);
return;
(_colorArray, bytesRead) = ImageHelper.Read32(imageData, _width, _height);
break;
}
default: default:
{ {
break; break;

@ -30,11 +30,11 @@ namespace DotNetCTFDumper
var verbose = false; var verbose = false;
var dumpImages = true; var dumpImages = true;
var dumpSounds = true; var dumpSounds = true;
/*AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{ {
Logger.Log("ERROR: "); Logger.Log("ERROR: ");
Logger.Log(eventArgs.Exception.ToString()); Logger.Log(eventArgs.Exception.ToString());
};*/ };
Settings.UseGUI = true; Settings.UseGUI = true;
@ -44,7 +44,7 @@ namespace DotNetCTFDumper
} }
if (args.Length > 1) if (args.Length > 1)
{ {
ReadFile(args[1],true,true,true); ReadFile(args[1],true,false,false);
} }
else if(args.Length==0) else if(args.Length==0)
{ {

@ -10,7 +10,7 @@ namespace DotNetCTFDumper
public static bool SaveChunks; public static bool SaveChunks;
public static bool Verbose; public static bool Verbose;
public static bool Old; public static bool Old;
public static bool twofiveplus=true; 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);

@ -1,4 +1,5 @@
using System; using System;
using System.IO;
namespace DotNetCTFDumper.Utils namespace DotNetCTFDumper.Utils
{ {
@ -56,6 +57,34 @@ namespace DotNetCTFDumper.Utils
} }
return (colorArray, position); return (colorArray, position);
}
public static (byte[], int) Read32(byte[] data, int width, int height)
{
byte[] colorArray = new byte[width * height * 4];
int stride = width * 4;
int pad = GetPadding(width, 3);
int position = 0;
try
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
position += 3;
}
position += pad * 3;
}
}
catch
{
return (Array.Empty<byte>(), position);
}
return (Array.Empty<byte>(), position);
} }
public static (byte[], int) ReadFifteen(byte[] data, int width, int height) public static (byte[], int) ReadFifteen(byte[] data, int width, int height)

Loading…
Cancel
Save